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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 package org.apache.log4j.jmx;
20 import java.util.Enumeration;
21 import java.util.Iterator;
22 import java.util.Vector;
24 import javax.management.Attribute;
25 import javax.management.AttributeList;
26 import javax.management.DynamicMBean;
27 import javax.management.InstanceAlreadyExistsException;
28 import javax.management.InstanceNotFoundException;
29 import javax.management.JMException;
30 import javax.management.MBeanRegistration;
31 import javax.management.MBeanRegistrationException;
32 import javax.management.MBeanServer;
33 import javax.management.NotCompliantMBeanException;
34 import javax.management.ObjectName;
35 import javax.management.RuntimeOperationsException;
37 import org.apache.log4j.Logger;
38 import org.apache.log4j.Appender;
40 public abstract class AbstractDynamicMBean implements DynamicMBean,
45 private final Vector mbeanList = new Vector();
49 * @param appender appender, may not be null.
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();
64 * Enables the to get the values of several attributes of the Dynamic MBean.
67 AttributeList getAttributes(String[] attributeNames) {
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);
76 AttributeList resultList = new AttributeList();
78 // if attributeNames is empty, return an empty result list
79 if (attributeNames.length == 0) {
83 // build the result attribute list
84 for (int i=0 ; i<attributeNames.length ; i++){
86 Object value = getAttribute(attributeNames[i]);
87 resultList.add(new Attribute(attributeNames[i],value));
88 } catch (JMException e) {
90 } catch (RuntimeException e) {
98 * Sets the values of several attributes of the Dynamic MBean, and returns the
99 * list of attributes that have been set.
101 public AttributeList setAttributes(AttributeList attributes) {
103 // Check attributes is not null to avoid NullPointerException later on
104 if (attributes == null) {
105 throw new RuntimeOperationsException(
106 new IllegalArgumentException("AttributeList attributes cannot be null"),
107 "Cannot invoke a setter of " + dClassName);
109 AttributeList resultList = new AttributeList();
111 // if attributeNames is empty, nothing more to do
112 if (attributes.isEmpty()) {
116 // for each attribute, try to set it and add to the result list if successfull
117 for (Iterator i = attributes.iterator(); i.hasNext();) {
118 Attribute attr = (Attribute) i.next();
121 String name = attr.getName();
122 Object value = getAttribute(name);
123 resultList.add(new Attribute(name,value));
124 } catch(JMException e) {
126 } catch(RuntimeException e) {
138 void postDeregister() {
139 getLogger().debug("postDeregister is called.");
143 void postRegister(java.lang.Boolean registrationDone) {
149 ObjectName preRegister(MBeanServer server, ObjectName name) {
150 getLogger().debug("preRegister called. Server="+server+ ", name="+name);
151 this.server = server;
155 * Registers MBean instance in the attached server. Must <em>NOT</em>
156 * be called before registration of this instance.
159 void registerMBean(Object mbean, ObjectName objectName)
160 throws InstanceAlreadyExistsException, MBeanRegistrationException,
161 NotCompliantMBeanException {
162 server.registerMBean(mbean, objectName);
163 mbeanList.add(objectName);
167 * Performs cleanup for deregistering this MBean. Default implementation
168 * unregisters MBean instances which are registered using
169 * {@link #registerMBean(Object mbean, ObjectName objectName)}.
172 void preDeregister() {
173 getLogger().debug("preDeregister called.");
175 Enumeration iterator = mbeanList.elements();
176 while (iterator.hasMoreElements()) {
177 ObjectName name = (ObjectName) iterator.nextElement();
179 server.unregisterMBean(name);
180 } catch (InstanceNotFoundException e) {
181 getLogger().warn("Missing MBean " + name.getCanonicalName());
182 } catch (MBeanRegistrationException e) {
183 getLogger().warn("Failed unregistering " + name.getCanonicalName());