/apache-log4j-1.2.17/src/main/java/org/apache/log4j/jmx/AbstractDynamicMBean.java
Java | 187 lines | 115 code | 27 blank | 45 comment | 14 complexity | 23bd0cb0ddfb15498bbf5bccce381217 MD5 | raw file
Possible License(s): Apache-2.0
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package org.apache.log4j.jmx;
19
20import java.util.Enumeration;
21import java.util.Iterator;
22import java.util.Vector;
23
24import javax.management.Attribute;
25import javax.management.AttributeList;
26import javax.management.DynamicMBean;
27import javax.management.InstanceAlreadyExistsException;
28import javax.management.InstanceNotFoundException;
29import javax.management.JMException;
30import javax.management.MBeanRegistration;
31import javax.management.MBeanRegistrationException;
32import javax.management.MBeanServer;
33import javax.management.NotCompliantMBeanException;
34import javax.management.ObjectName;
35import javax.management.RuntimeOperationsException;
36
37import org.apache.log4j.Logger;
38import org.apache.log4j.Appender;
39
40public abstract class AbstractDynamicMBean implements DynamicMBean,
41 MBeanRegistration {
42
43 String dClassName;
44 MBeanServer server;
45 private final Vector mbeanList = new Vector();
46
47 /**
48 * Get MBean name.
49 * @param appender appender, may not be null.
50 * @return name.
51 * @since 1.2.16
52 */
53 static protected String getAppenderName(final Appender appender){
54 String name = appender.getName();
55 if (name == null || name.trim().length() == 0) {
56 // try to get some form of a name, because null is not allowed (exception), and empty string certainly isn't useful in JMX..
57 name = appender.toString();
58 }
59 return name;
60 }
61
62
63 /**
64 * Enables the to get the values of several attributes of the Dynamic MBean.
65 */
66 public
67 AttributeList getAttributes(String[] attributeNames) {
68
69 // Check attributeNames is not null to avoid NullPointerException later on
70 if (attributeNames == null) {
71 throw new RuntimeOperationsException(
72 new IllegalArgumentException("attributeNames[] cannot be null"),
73 "Cannot invoke a getter of " + dClassName);
74 }
75
76 AttributeList resultList = new AttributeList();
77
78 // if attributeNames is empty, return an empty result list
79 if (attributeNames.length == 0)
80 return resultList;
81
82 // build the result attribute list
83 for (int i=0 ; i<attributeNames.length ; i++){
84 try {
85 Object value = getAttribute((String) attributeNames[i]);
86 resultList.add(new Attribute(attributeNames[i],value));
87 } catch (JMException e) {
88 e.printStackTrace();
89 } catch (RuntimeException e) {
90 e.printStackTrace();
91 }
92 }
93 return(resultList);
94 }
95
96 /**
97 * Sets the values of several attributes of the Dynamic MBean, and returns the
98 * list of attributes that have been set.
99 */
100 public AttributeList setAttributes(AttributeList attributes) {
101
102 // Check attributes is not null to avoid NullPointerException later on
103 if (attributes == null) {
104 throw new RuntimeOperationsException(
105 new IllegalArgumentException("AttributeList attributes cannot be null"),
106 "Cannot invoke a setter of " + dClassName);
107 }
108 AttributeList resultList = new AttributeList();
109
110 // if attributeNames is empty, nothing more to do
111 if (attributes.isEmpty())
112 return resultList;
113
114 // for each attribute, try to set it and add to the result list if successfull
115 for (Iterator i = attributes.iterator(); i.hasNext();) {
116 Attribute attr = (Attribute) i.next();
117 try {
118 setAttribute(attr);
119 String name = attr.getName();
120 Object value = getAttribute(name);
121 resultList.add(new Attribute(name,value));
122 } catch(JMException e) {
123 e.printStackTrace();
124 } catch(RuntimeException e) {
125 e.printStackTrace();
126 }
127 }
128 return(resultList);
129 }
130
131 protected
132 abstract
133 Logger getLogger();
134
135 public
136 void postDeregister() {
137 getLogger().debug("postDeregister is called.");
138 }
139
140 public
141 void postRegister(java.lang.Boolean registrationDone) {
142 }
143
144
145
146 public
147 ObjectName preRegister(MBeanServer server, ObjectName name) {
148 getLogger().debug("preRegister called. Server="+server+ ", name="+name);
149 this.server = server;
150 return name;
151 }
152 /**
153 * Registers MBean instance in the attached server. Must <em>NOT</em>
154 * be called before registration of this instance.
155 */
156 protected
157 void registerMBean(Object mbean, ObjectName objectName)
158 throws InstanceAlreadyExistsException, MBeanRegistrationException,
159 NotCompliantMBeanException {
160 server.registerMBean(mbean, objectName);
161 mbeanList.add(objectName);
162 }
163
164 /**
165 * Performs cleanup for deregistering this MBean. Default implementation
166 * unregisters MBean instances which are registered using
167 * {@link #registerMBean(Object mbean, ObjectName objectName)}.
168 */
169 public
170 void preDeregister() {
171 getLogger().debug("preDeregister called.");
172
173 Enumeration iterator = mbeanList.elements();
174 while (iterator.hasMoreElements()) {
175 ObjectName name = (ObjectName) iterator.nextElement();
176 try {
177 server.unregisterMBean(name);
178 } catch (InstanceNotFoundException e) {
179 getLogger().warn("Missing MBean " + name.getCanonicalName());
180 } catch (MBeanRegistrationException e) {
181 getLogger().warn("Failed unregistering " + name.getCanonicalName());
182 }
183 }
184 }
185
186
187}