View Javadoc

    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
    18  package org.apache.log4j.jmx;
    19
    20  import java.util.Enumeration;
    21  import java.util.Iterator;
    22  import java.util.Vector;
    23
    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;
    36
    37  import org.apache.log4j.Logger;
    38  import org.apache.log4j.Appender;
    39
    40  public 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 }