PageRenderTime 34ms CodeModel.GetById 21ms app.highlight 11ms RepoModel.GetById 0ms app.codeStats 0ms

/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}