You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avalon.apache.org by do...@apache.org on 2001/04/24 07:00:53 UTC

cvs commit: jakarta-avalon-phoenix/src/java/org/apache/jmx/introspector DefaultDynamicMBean.java DefaultDynamicNotificationMBean.java DynamicMBeanFactory.java

donaldp     01/04/23 22:00:53

  Added:       src/java/org/apache/jmx MBeanServerImpl.java
               src/java/org/apache/jmx/adaptor RMIAdaptor.java
                        RMIAdaptorImpl.java
               src/java/org/apache/jmx/introspector
                        DefaultDynamicMBean.java
                        DefaultDynamicNotificationMBean.java
                        DynamicMBeanFactory.java
  Log:
  Commit leos jmx code.
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-phoenix/src/java/org/apache/jmx/MBeanServerImpl.java
  
  Index: MBeanServerImpl.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.jmx;
  
  
  import com.sun.management.jmx.*;
  import java.io.ObjectInputStream;
  import java.util.Set;
  import javax.management.*;
  import javax.management.loading.*;
  import javax.management.monitor.*;
  import javax.management.relation.*;
  import javax.management.timer.*;
  
  /**
   * Will become apache's JMX implementation. Currently pointer to sun's reference
   * implementation. Part of the javadocs are from {@link
   * javax.management.MBeanServer}.
   *
   * @author <a href="mailto:mail@leosimons.com">Leo Simons</a>
   * @version CVS $Revision: 1.1 $ $Date: 2001/04/24 05:00:51 $
   */
  public class MBeanServerImpl extends com.sun.management.jmx.MBeanServerImpl
  {
      /**
       * Creates an MBeanServer with a standard default domain name. The default
       * domain name is used as the domain part in the ObjectName of MBeans, if no
       * domain is specified by the user. <p>
       *
       * The standard default domain name is defined in {@link
       * com.sun.management.jmx.ServiceName#DOMAIN ServiceName.DOMAIN}
       */
      public MBeanServerImpl()
      {
      }
  
      /**
       * Creates an MBeanServer with the specified default domain name. The
       * default domain name is used as the domain part in the ObjectName of
       * MBeans if no domain is specified by the user.
       *
       * @param domain the domain name
       */
      public MBeanServerImpl( final String domain )
      {
          super( domain );
      }
  
      /**
       * Gets the <CODE>ObjectInstance</CODE> for a given MBean registered with
       * the MBean server.
       *
       * @param name The object name of the MBean.
       * @return The <CODE>ObjectInstance</CODE> associated to the MBean specified
       *      by <VAR>name</VAR> .
       * @exception InstanceNotFoundException The MBean specified is not
       *      registered in the MBean server.
       */
      public ObjectInstance getObjectInstance( final ObjectName name )
          throws InstanceNotFoundException
      {
          return super.getObjectInstance( name );
      }
  
      /**
       * Checks whether an MBean, identified by its object name, is already
       * registered with the MBean server.
       *
       * @param name The object name of the MBean to be checked.
       * @return True if the MBean is already registered in the MBean server,
       *      false otherwise.
       */
      public boolean isRegistered( final ObjectName name )
      {
          return super.isRegistered( name );
      }
  
  
      /**
       * Returns the number of MBeans registered in the MBean server.
       *
       * @return The MBeanCount value
       */
      public Integer getMBeanCount()
      {
          return super.getMBeanCount();
      }
  
      /**
       * Gets the value of a specific attribute of a named MBean. The MBean is
       * identified by its object name.
       *
       * @param name The object name of the MBean from which the attribute is to
       *      be retrieved.
       * @param attribute A String specifying the name of the attribute to be
       *      retrieved.
       * @return The value of the retrieved attribute.
       * @exception AttributeNotFoundException The attribute specified is not
       *      accessible in the MBean.
       * @exception MBeanException Wraps an exception thrown by the MBean's
       *      getter.
       * @exception InstanceNotFoundException The MBean specified is not
       *      registered in the MBean server.
       * @exception ReflectionException Wraps a <CODE>java.lang.Exception</CODE>
       *      thrown when trying to invoke the setter.
       */
      public Object getAttribute( final ObjectName name, final String attribute )
          throws MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException
      {
          return super.getAttribute( name, attribute );
      }
  
  
      /**
       * Enables the values of several attributes of a named MBean. The MBean is
       * identified by its object name.
       *
       * @param name The object name of the MBean from which the attributes are
       *      retrieved.
       * @param attributes A list of the attributes to be retrieved.
       * @return The list of the retrieved attributes.
       * @exception InstanceNotFoundException The MBean specified is not
       *      registered in the MBean server.
       * @exception ReflectionException An exception occurred when trying to
       *      invoke the getAttributes method of a Dynamic MBean.
       */
      public AttributeList getAttributes( final ObjectName name, final String[] attributes )
          throws InstanceNotFoundException, ReflectionException
      {
          return super.getAttributes( name, attributes );
      }
  
      /**
       * Returns the default domain used for naming the MBean. The default domain
       * name is used as the domain part in the ObjectName of MBeans if no domain
       * is specified by the user.
       *
       * @return The DefaultDomain value
       */
      public String getDefaultDomain()
      {
          return super.getDefaultDomain();
      }
  
      /**
       * This method discovers the attributes and operations that an MBean exposes
       * for management.
       *
       * @param name The name of the MBean to analyze
       * @return An instance of <CODE>MBeanInfo</CODE> allowing the retrieval of
       *      all attributes and operations of this MBean.
       * @exception IntrospectionException An exception occurs during
       *      introspection.
       * @exception InstanceNotFoundException The MBean specified is not found.
       * @exception ReflectionException An exception occurred when trying to
       *      invoke the getMBeanInfo of a Dynamic MBean.
       */
      public MBeanInfo getMBeanInfo( final ObjectName name )
          throws
              InstanceNotFoundException, IntrospectionException, ReflectionException
      {
          return super.getMBeanInfo( name );
      }
  
      /**
       * Returns true if the MBean specified is an instance of the specified
       * class, false otherwise.
       *
       * @param name The <CODE>ObjectName</CODE> of the MBean.
       * @param className The name of the class.
       * @return true if the MBean specified is an instance of the specified
       *      class, false otherwise.
       * @exception InstanceNotFoundException The MBean specified is not
       *      registered in the MBean server.
       */
      public boolean isInstanceOf( final ObjectName name, final String className )
          throws InstanceNotFoundException
      {
          return super.isInstanceOf( name, className );
      }
  
      /**
       * Instantiates an object using the list of all class loaders registered in
       * the MBean server ({@link javax.management.loading.DefaultLoaderRepository
       * Default Loader Repository}). The object's class should have a public
       * constructor. It returns a reference to the newly created object. The
       * newly created object is not registered in the MBean server.
       *
       * @param className The class name of the object to be instantiated.
       * @return The newly instantiated object.
       * @exception ReflectionException Wraps a <CODE>
       *      java.lang.ClassNotFoundException</CODE> or the <CODE>
       *      java.lang.Exception</CODE> that occurred when trying to invoke the
       *      object's constructor.
       * @exception MBeanException The constructor of the object has thrown an
       *      exception
       */
      public Object instantiate( final String className )
          throws ReflectionException, MBeanException
      {
          return super.instantiate( className );
      }
  
      /**
       * Instantiates an object using the class Loader specified by its <CODE>
       * ObjectName</CODE> . If the loader name is null, the ClassLoader that
       * loaded the MBean Server will be used. The object's class should have a
       * public constructor. It returns a reference to the newly created object.
       * The newly created object is not registered in the MBean server.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param loaderName The object name of the class loader to be used.
       * @return The newly instantiated object.
       * @exception ReflectionException Wraps a <CODE>
       *      java.lang.ClassNotFoundException</CODE> or the <CODE>
       *      java.lang.Exception</CODE> that occurred when trying to invoke the
       *      object's constructor.
       * @exception MBeanException The constructor of the object has thrown an
       *      exception.
       * @exception InstanceNotFoundException The specified class loader is not
       *      registered in the MBaenServer.
       */
      public Object instantiate( final String className, final ObjectName loaderName )
          throws ReflectionException, MBeanException, InstanceNotFoundException
      {
          return super.instantiate( className, loaderName );
      }
  
      /**
       * Instantiates an object using the list of all class loaders registered in
       * the MBean server ({@link javax.management.loading.DefaultLoaderRepository
       * Default Loader Repository}). The object's class should have a public
       * constructor. The call returns a reference to the newly created object.
       * The newly created object is not registered in the MBean server.
       *
       * @param className The class name of the object to be instantiated.
       * @param params An array containing the parameters of the constructor to be
       *      invoked.
       * @param signature An array containing the signature of the constructor to
       *      be invoked.
       * @return The newly instantiated object.
       * @exception ReflectionException Wraps a <CODE>
       *      java.lang.ClassNotFoundException</CODE> or the <CODE>
       *      java.lang.Exception</CODE> that occurred when trying to invoke the
       *      object's constructor.
       * @exception MBeanException The constructor of the object has thrown an
       *      exception
       */
      public Object instantiate( final String className, final Object[] params, final String[] signature )
          throws ReflectionException, MBeanException
      {
          return super.instantiate( className, params, signature );
      }
  
      /**
       * Instantiates an object. The class loader to be used is identified by its
       * object name. If the object name of the loader is null, the ClassLoader
       * that loaded the MBean server will be used. The object's class should have
       * a public constructor. The call returns a reference to the newly created
       * object. The newly created object is not registered in the MBean server.
       *
       * @param className The class name of the object to be instantiated.
       * @param params An array containing the parameters of the constructor to be
       *      invoked.
       * @param signature An array containing the signature of the constructor to
       *      be invoked.
       * @param loaderName The object name of the class loader to be used.
       * @return The newly instantiated object.
       * @exception ReflectionException Wraps a <CODE>
       *      java.lang.ClassNotFoundException</CODE> or the <CODE>
       *      java.lang.Exception</CODE> that occurred when trying to invoke the
       *      object's constructor.
       * @exception MBeanException The constructor of the object has thrown an
       *      exception
       * @exception InstanceNotFoundException The specified class loader is not
       *      registered in the MBean server.
       */
      public Object instantiate( final String className, 
                                 final ObjectName loaderName, 
                                 final Object[] params, 
                                 final String[] signature )
          throws ReflectionException, MBeanException, InstanceNotFoundException
      {
          return super.instantiate( className, loaderName, params, signature );
      }
  
      /**
       * Instantiates and registers an MBean in the MBean server. The MBean server
       * will use the {@link javax.management.loading.DefaultLoaderRepository
       * Default Loader Repository} to load the class of the MBean. An object name
       * is associated to the MBean. If the object name given is null, the MBean
       * can automatically provide its own name by implementing the {@link
       * javax.management.MBeanRegistration MBeanRegistration} interface. The call
       * returns an <CODE>ObjectInstance</CODE> object representing the newly
       * created MBean.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param name The object name of the MBean. May be null.
       * @return An <CODE>ObjectInstance</CODE> , containing the <CODE>ObjectName
       *      </CODE>and the Java class name of the newly instantiated MBean.
       * @exception ReflectionException Wraps a <CODE>
       *      java.lang.ClassNotFoundException</CODE> or a <CODE><CODE>
       *      java.lang.Exception</CODE></CODE> that occurred when trying to
       *      invoke the MBean's constructor.
       * @exception InstanceAlreadyExistsException The MBean is already under the
       *      control of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> (
       *      <CODE>MBeanRegistration</CODE> interface) method of the MBean has
       *      thrown an exception. The MBean will not be registered.
       * @exception MBeanException The constructor of the MBean has thrown an
       *      exception
       * @exception NotCompliantMBeanException This class is not a JMX compliant
       *      MBean
       */
      public ObjectInstance createMBean( final String className, final ObjectName name )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, 
                 MBeanException, NotCompliantMBeanException
      {
          return super.createMBean( className, name );
      }
  
      /**
       * Instantiates and registers an MBean in the MBean server. The class loader
       * to be used is identified by its object name. An object name is associated
       * to the MBean. If the object name of the loader is null, the ClassLoader
       * that loaded the MBean server will be used. If the MBean's object name
       * given is null, the MBean can automatically provide its own name by
       * implementing the {@link javax.management.MBeanRegistration
       * MBeanRegistration} interface. The call returns an <CODE>ObjectInstance
       * </CODE>object representing the newly created MBean.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param name The object name of the MBean. May be null.
       * @param loaderName The object name of the class loader to be used.
       * @return An <CODE>ObjectInstance</CODE> , containing the <CODE>ObjectName
       *      </CODE>and the Java class name of the newly instantiated MBean.
       * @exception ReflectionException Wraps a <CODE>
       *      java.lang.ClassNotFoundException</CODE> or a <CODE>
       *      java.lang.Exception</CODE> that occurred when trying to invoke the
       *      MBean's constructor.
       * @exception InstanceAlreadyExistsException The MBean is already under the
       *      control of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> (
       *      <CODE>MBeanRegistration</CODE> interface) method of the MBean has
       *      thrown an exception. The MBean will not be registered.
       * @exception MBeanException The constructor of the MBean has thrown an
       *      exception
       * @exception NotCompliantMBeanException This class is not a JMX compliant
       *      MBean
       * @exception InstanceNotFoundException The specified class loader is not
       *      registered in the MBean server.
       */
      public ObjectInstance createMBean( final String className, 
                                         final ObjectName name, 
                                         final ObjectName loaderName )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException,
                 MBeanException, NotCompliantMBeanException, InstanceNotFoundException
      {
          return super.createMBean( className, name, loaderName );
      }
  
  
      /**
       * Instantiates and registers an MBean in the MBean server. The MBean server
       * will use the {@link javax.management.loading.DefaultLoaderRepository
       * Default Loader Repository} to load the class of the MBean. An object name
       * is associated to the MBean. If the object name given is null, the MBean
       * can automatically provide its own name by implementing the {@link
       * javax.management.MBeanRegistration MBeanRegistration} interface. The call
       * returns an <CODE>ObjectInstance</CODE> object representing the newly
       * created MBean.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param name The object name of the MBean. May be null.
       * @param params An array containing the parameters of the constructor to be
       *      invoked.
       * @param signature An array containing the signature of the constructor to
       *      be invoked.
       * @return An <CODE>ObjectInstance</CODE> , containing the <CODE>ObjectName
       *      </CODE>and the Java class name of the newly instantiated MBean.
       * @exception ReflectionException Wraps a <CODE>
       *      java.lang.ClassNotFoundException</CODE> or a <CODE>
       *      java.lang.Exception</CODE> that occurred when trying to invoke the
       *      MBean's constructor.
       * @exception InstanceAlreadyExistsException The MBean is already under the
       *      control of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> (
       *      <CODE>MBeanRegistration</CODE> interface) method of the MBean has
       *      thrown an exception. The MBean will not be registered.
       * @exception MBeanException The constructor of the MBean has thrown an
       *      exception
       * @exception NotCompliantMBeanException thrown if mbean is non-compliant
       */
      public ObjectInstance createMBean( final String className,
                                         final ObjectName name,
                                         final Object[] params,
                                         final String[] signature )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException,
                 MBeanException, NotCompliantMBeanException
      {
          return super.createMBean( className, name, params, signature );
      }
  
      /**
       * Instantiates and registers an MBean in the MBean server. The class loader
       * to be used is identified by its object name. An object name is associated
       * to the MBean. If the object name of the loader is not specified, the
       * ClassLoader that loaded the MBean server will be used. If the MBean
       * object name given is null, the MBean can automatically provide its own
       * name by implementing the {@link javax.management.MBeanRegistration
       * MBeanRegistration} interface. The call returns an <CODE>ObjectInstance
       * </CODE>object representing the newly created MBean.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param name The object name of the MBean. May be null.
       * @param params An array containing the parameters of the constructor to be
       *      invoked.
       * @param signature An array containing the signature of the constructor to
       *      be invoked.
       * @param loaderName The object name of the class loader to be used.
       * @return An <CODE>ObjectInstance</CODE> , containing the <CODE>ObjectName
       *      </CODE>and the Java class name of the newly instantiated MBean.
       * @exception ReflectionException Wraps a <CODE>
       *      java.lang.ClassNotFoundException</CODE> or a <CODE>
       *      java.lang.Exception</CODE> that occurred when trying to invoke the
       *      MBean's constructor.
       * @exception InstanceAlreadyExistsException The MBean is already under the
       *      control of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> (
       *      <CODE>MBeanRegistration</CODE> interface) method of the MBean has
       *      thrown an exception. The MBean will not be registered.
       * @exception MBeanException The constructor of the MBean has thrown an
       *      exception
       * @exception InstanceNotFoundException The specified class loader is not
       *      registered in the MBean server.
       * @exception NotCompliantMBeanException 
       */
      public ObjectInstance createMBean( final String className, 
                                         final ObjectName name, 
                                         final ObjectName loaderName, 
                                         final Object[] params, 
                                         final String[] signature )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, 
                 MBeanException, NotCompliantMBeanException, InstanceNotFoundException
      {
          return super.createMBean( className, name, loaderName, params, signature );
      }
  
      /**
       * Registers a pre-existing object as an MBean with the MBean server. If the
       * object name given is null, the MBean may automatically provide its own
       * name by implementing the {@link javax.management.MBeanRegistration
       * MBeanRegistration} interface. The call returns an <CODE>ObjectInstance
       * </CODE>object representing the registered MBean.
       *
       * @param object The MBean to be registered as an MBean.
       * @param name The object name of the MBean. May be null.
       * @return The <CODE>ObjectInstance</CODE> for the MBean that has been
       *      registered.
       * @exception InstanceAlreadyExistsException The MBean is already under the
       *      control of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> (
       *      <CODE>MBeanRegistration</CODE> interface) method of the MBean has
       *      thrown an exception. The MBean will not be registered.
       * @exception NotCompliantMBeanException This object is not a JMX compliant
       *      MBean
       */
      public ObjectInstance registerMBean( final Object object, final ObjectName name )
          throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException
      {
          return super.registerMBean( object, name );
      }
  
      /**
       * De-registers an MBean from the MBean server. The MBean is identified by
       * its object name. Once the method has been invoked, the MBean may no
       * longer be accessed by its object name.
       *
       * @param name The object name of the MBean to be de-registered.
       * @exception InstanceNotFoundException The MBean specified is not
       *      registered in the MBean server.
       * @exception MBeanRegistrationException The preDeregister (( <CODE>
       *      MBeanRegistration</CODE> interface) method of the MBean has thrown
       *      an exception.
       */
      public void unregisterMBean( final ObjectName name )
          throws InstanceNotFoundException, MBeanRegistrationException
      {
          super.unregisterMBean( name );
      }
  
      /**
       * Gets MBeans controlled by the MBean server. This method allows any of the
       * following to be obtained: All MBeans, a set of MBeans specified by
       * pattern matching on the <CODE>ObjectName</CODE> and/or a Query
       * expression, a specific MBean. When the object name is null or no domain
       * and key properties are specified, all objects are to be selected (and
       * filtered if a query is specified). It returns the set of <CODE>
       * ObjectInstance</CODE> objects (containing the <CODE>ObjectName</CODE> and
       * the Java Class name) for the selected MBeans.
       *
       * @param name The object name pattern identifying the MBeans to be
       *      retrieved. If null or no domain and key properties are specified,
       *      all the MBeans registered will be retrieved.
       * @param query The query expression to be applied for selecting MBeans. If
       *      null no query expression will be applied for selecting MBeans.
       * @return A set containing the <CODE>ObjectInstance</CODE> objects for the
       *      selected MBeans. If no MBean satisfies the query an empty list is
       *      returned.
       */
      public Set queryMBeans( final ObjectName name, final QueryExp query )
      {
          return super.queryMBeans( name, query );
      }
  
      /**
       * Gets the names of MBeans controlled by the MBean server. This method
       * enables any of the following to be obtained: The names of all MBeans, the
       * names of a set of MBeans specified by pattern matching on the <CODE>
       * ObjectName</CODE> and/or a Query expression, a specific MBean name
       * (equivalent to testing whether an MBean is registered). When the object
       * name is null or no domain and key properties are specified, all objects
       * are selected (and filtered if a query is specified). It returns the set
       * of ObjectNames for the MBeans selected.
       *
       * @param name The object name pattern identifying the MBeans to be
       *      retrieved. If null or no domain and key properties are specified,
       *      all the MBeans registered will be retrieved.
       * @param query The query expression to be applied for selecting MBeans. If
       *      null no query expression will be applied for selecting MBeans.
       * @return A set containing the ObjectNames for the MBeans selected. If no
       *      MBean satisfies the query, an empty list is returned.
       */
      public Set queryNames( final ObjectName name, final QueryExp query )
      {
          return super.queryNames( name, query );
      }
  
      /**
       * Invokes an operation on an MBean.
       *
       * @param name The object name of the MBean on which the method is to be
       *      invoked.
       * @param operationName The name of the operation to be invoked.
       * @param params An array containing the parameters to be set when the
       *      operation is invoked
       * @param signature An array containing the signature of the operation. The
       *      class objects will be loaded using the same class loader as the one
       *      used for loading the MBean on which the operation was invoked.
       * @return The object returned by the operation, which represents the result
       *      ofinvoking the operation on the MBean specified.
       * @exception InstanceNotFoundException The MBean specified is not
       *      registered in the MBean server.
       * @exception MBeanException Wraps an exception thrown by the MBean's
       *      invoked method.
       * @exception ReflectionException Wraps a <CODE>java.lang.Exception</CODE>
       *      thrown while trying to invoke the method.
       */
      public Object invoke( final ObjectName name, 
                            final String operationName, 
                            final Object[] params,
                            final String[] signature )
          throws InstanceNotFoundException, MBeanException, ReflectionException
      {
          return super.invoke( name, operationName, params, signature );
      }
  
      /**
       * Enables to add a listener to a registered MBean.
       *
       * @param name The name of the MBean on which the listener should be added.
       * @param listener The listener object which will handle the notifications
       *      emitted by the registered MBean.
       * @param filter The filter object. If filter is null, no filtering will be
       *      performed before handling notifications.
       * @param handback The context to be sent to the listener when a
       *      notification is emitted.
       * @exception InstanceNotFoundException The MBean name provided does not
       *      match any of the registered MBeans.
       */
      public void addNotificationListener( final ObjectName name, 
                                           final NotificationListener listener, 
                                           final NotificationFilter filter, 
                                           final Object handback )
          throws InstanceNotFoundException
      {
          super.addNotificationListener( name, listener, filter, handback );
      }
  
      /**
       * Enables to add a listener to a registered MBean.
       *
       * @param name The name of the MBean on which the listener should be added.
       * @param listener The object name of the listener which will handle the
       *      notifications emitted by the registered MBean.
       * @param filter The filter object. If filter is null, no filtering will be
       *      performed before handling notifications.
       * @param handback The context to be sent to the listener when a
       *      notification is emitted.
       * @exception InstanceNotFoundException The MBean name of the notification
       *      listener or of the notification broadcaster does not match any of
       *      the registered MBeans.
       */
      public void addNotificationListener( final ObjectName name, 
                                           final ObjectName listener, 
                                           final NotificationFilter filter, 
                                           final Object handback )
          throws InstanceNotFoundException
      {
          super.addNotificationListener( name, listener, filter, handback );
      }
  
  
      /**
       * Enables to remove a listener from a registered MBean.
       *
       * @param name The name of the MBean on which the listener should be
       *      removed.
       * @param listener The listener object which will handle the notifications
       *      emitted by the registered MBean. This method will remove all the
       *      information related to this listener.
       * @exception InstanceNotFoundException The MBean name provided does not
       *      match any of the registered MBeans.
       * @exception ListenerNotFoundException The listener is not registered in
       *      the MBean.
       */
      public void removeNotificationListener( final ObjectName name, final NotificationListener listener )
          throws InstanceNotFoundException, ListenerNotFoundException
      {
          super.removeNotificationListener( name, listener );
      }
  
      /**
       * Enables to remove a listener from a registered MBean.
       *
       * @param name The name of the MBean on which the listener should be
       *      removed.
       * @param listener The object name of the listener which will handle the
       *      notifications emitted by the registered MBean. This method will
       *      remove all the information related to this listener.
       * @exception InstanceNotFoundException The MBean name provided does not
       *      match any of the registered MBeans.
       * @exception ListenerNotFoundException The listener is not registered in
       *      the MBean.
       */
      public void removeNotificationListener( final ObjectName name, final ObjectName listener )
          throws InstanceNotFoundException, ListenerNotFoundException
      {
          super.removeNotificationListener( name, listener );
      }
  
      /**
       * De-serializes a byte array in the context of the class loader of an
       * MBean.
       *
       * @param name The name of the MBean whose class loader should be used for
       *      the de-serialization.
       * @param data The byte array to be de-sererialized.
       * @return The de-serialized object stream.
       * @exception InstanceNotFoundException The MBean specified is not found.
       * @exception OperationsException Any of the usual Input/Output related
       *      exceptions.
       */
      public ObjectInputStream deserialize( final ObjectName name, final byte[] data )
          throws InstanceNotFoundException, OperationsException
      {
          return super.deserialize( name, data );
      }
  
      /**
       * De-serializes a byte array in the context of a given MBean class loader.
       * The class loader is the one that loaded the class with name "className".
       *
       * @param data The byte array to be de-sererialized.
       * @param className DOC: Insert Description of Parameter
       * @return The de-serialized object stream.
       * @exception OperationsException Any of the usual Input/Output related
       *      exceptions.
       * @exception ReflectionException The specified class could not be loaded by
       *      the default loader repository
       */
      public ObjectInputStream deserialize( final String className, final byte[] data )
          throws OperationsException, ReflectionException
      {
          return super.deserialize( className, data );
      }
  
      /**
       * De-serializes a byte array in the context of a given MBean class loader.
       * The class loader is the one that loaded the class with name "className".
       * The name of the class loader to be used for loading the specified class
       * is specified. If null, the MBean Server's class loader will be used.
       *
       * @param data The byte array to be de-sererialized.
       * @param loaderName The name of the class loader to be used for loading the
       *      specified class. If null, the MBean Server's class loader will be
       *      used.
       * @param className DOC: Insert Description of Parameter
       * @return The de-serialized object stream.
       * @exception InstanceNotFoundException The specified class loader MBean is
       *      not found.
       * @exception OperationsException Any of the usual Input/Output related
       *      exceptions.
       * @exception ReflectionException The specified class could not be loaded by
       *      the specified class loader.
       */
      public ObjectInputStream deserialize( final String className, 
                                            final ObjectName loaderName, 
                                            final byte[] data )
          throws InstanceNotFoundException, OperationsException, ReflectionException
      {
          return super.deserialize( className, loaderName, data );
      }
  
      /**
       * Sets the value of a specific attribute of a named MBean. The MBean is
       * identified by its object name.
       *
       * @param name The name of the MBean within which the attribute is to be
       *      set.
       * @param attribute The identification of the attribute to be set and the
       *      value it is to be set to.
       * @exception InstanceNotFoundException The MBean specified is not
       *      registered in the MBean server.
       * @exception AttributeNotFoundException The attribute specified is not
       *      accessible in the MBean.
       * @exception InvalidAttributeValueException The value specified for the
       *      attribute is not valid.
       * @exception MBeanException Wraps an exception thrown by the MBean's
       *      setter.
       * @exception ReflectionException Wraps a <CODE>java.lang.Exception</CODE>
       *      thrown when trying to invoke the setter.
       */
      public void setAttribute( final ObjectName name, final Attribute attribute )
          throws InstanceNotFoundException, AttributeNotFoundException, InvalidAttributeValueException, 
                 MBeanException, ReflectionException
      {
          super.setAttribute( name, attribute );
      }
  
      /**
       * Sets the values of several attributes of a named MBean. The MBean is
       * identified by its object name.
       *
       * @param name The object name of the MBean within which the attributes are
       *      to be set.
       * @param attributes A list of attributes: The identification of the
       *      attributes to be set and the values they are to be set to.
       * @return The list of attributes that were set, with their new values.
       * @exception InstanceNotFoundException The MBean specified is not
       *      registered in the MBean server.
       * @exception ReflectionException An exception occurred when trying to
       *      invoke the getAttributes method of a Dynamic MBean.
       */
      public AttributeList setAttributes( final ObjectName name, final AttributeList attributes )
          throws InstanceNotFoundException, ReflectionException
      {
          return super.setAttributes( name, attributes );
      }
  }
  
  
  
  1.1                  jakarta-avalon-phoenix/src/java/org/apache/jmx/adaptor/RMIAdaptor.java
  
  Index: RMIAdaptor.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.jmx.adaptor;
  
  import java.io.ObjectInputStream;
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  import java.util.Set;
  import javax.management.*;
  
  /**
   * This is the RMI connection representing an MBeanServer. It is
   * identical to the <code>MBeanServer</code> interface, except
   * it throws exceptions related to remote operations.
   *
   * @author <a href="mailto:mail@leosimons.com">Leo Simons</a>
   */
  public interface RMIAdaptor 
      extends Remote
  {
      /**
       * Instantiates an object using the list of all class loaders registered
       * in the MBean server ({@link javax.management.loading.DefaultLoaderRepository Default Loader Repository}).
       * The object's class should have a public constructor.
       * It returns a reference to the newly created object.
       * The newly created object is not registered in the MBean server.
       *
       * @param className The class name of the object to be instantiated.
       *
       * @return The newly instantiated object.
       *
       * @exception ReflectionException Wraps a <CODE>java.lang.ClassNotFoundException</CODE> or the <CODE>java.lang.Exception</CODE> that
       * occurred when trying to invoke the object's constructor.
       * @exception MBeanException The constructor of the object has thrown an exception
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: The className passed in parameter is null.
       *
       */
      Object instantiate( String className ) 
          throws ReflectionException, MBeanException, RemoteException;
  
      /**
       * Instantiates an object using the class Loader specified by its <CODE>ObjectName</CODE>.
       * If the loader name is null, the ClassLoader that loaded the MBean Server will be used.
       * The object's class should have a public constructor.
       * It returns a reference to the newly created object.
       * The newly created object is not registered in the MBean server.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param loaderName The object name of the class loader to be used.
       *
       * @return The newly instantiated object.
       *
       * @exception ReflectionException Wraps a <CODE>java.lang.ClassNotFoundException</CODE> or the <CODE>java.lang.Exception</CODE> that
       * occurred when trying to invoke the object's constructor.
       * @exception MBeanException The constructor of the object has thrown an exception.
       * @exception InstanceNotFoundException The specified class loader is not registered in the MBaenServer.
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: The className passed in parameter is null.
       *
       */
      Object instantiate( String className, ObjectName loaderName )
          throws ReflectionException, MBeanException, InstanceNotFoundException, RemoteException;
  
      /**
       * Instantiates an object using the list of all class loaders registered
       * in the MBean server ({@link javax.management.loading.DefaultLoaderRepository Default Loader Repository}).
       * The object's class should have a public constructor.
       * The call returns a reference to the newly created object.
       * The newly created object is not registered in the MBean server.
       *
       * @param className The class name of the object to be instantiated.
       * @param params An array containing the parameters of the constructor to be invoked.
       * @param signature An array containing the signature of the constructor to be invoked.
       *
       * @return The newly instantiated object.
       *
       * @exception ReflectionException Wraps a <CODE>java.lang.ClassNotFoundException</CODE> or the <CODE>java.lang.Exception</CODE> that
       * occurred when trying to invoke the object's constructor.
       * @exception MBeanException The constructor of the object has thrown an exception
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: The className passed in parameter is null.
       *
       */
      Object instantiate( String className, Object params[], String signature[] )
          throws ReflectionException, MBeanException, RemoteException;
  
      /**
       * Instantiates an object. The class loader to be used is identified by its object
       * name. If the object name of the loader is null, the ClassLoader that loaded the MBean server will be used.
       * The object's class should have a public constructor.
       * The call returns a reference to the newly created object.
       * The newly created object is not registered in the MBean server.
       *
       * @param className The class name of the object to be instantiated.
       * @param params An array containing the parameters of the constructor to be invoked.
       * @param signature An array containing the signature of the constructor to be invoked.
       * @param loaderName The object name of the class loader to be used.
       *
       * @return The newly instantiated object.
       *
       * @exception ReflectionException Wraps a <CODE>java.lang.ClassNotFoundException</CODE> or the <CODE>java.lang.Exception</CODE> that
       * occurred when trying to invoke the object's constructor.
       * @exception MBeanException The constructor of the object has thrown an exception
       * @exception InstanceNotFoundException The specified class loader is not registered in the MBean server.
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: The className passed in parameter is null.
       *
       */
      Object instantiate( String className, ObjectName loaderName, Object params[], String signature[] )
          throws ReflectionException, MBeanException, InstanceNotFoundException, RemoteException;
  
      /**
       * Instantiates and registers an MBean in the MBean server.
       * The MBean server will use the {@link javax.management.loading.DefaultLoaderRepository Default Loader Repository}
       * to load the class of the MBean.
       * An object name is associated to the MBean.
       * If the object name given is null, the MBean can automatically provide its
       * own name by implementing the {@link javax.management.MBeanRegistration MBeanRegistration} interface.
       * The call returns an <CODE>ObjectInstance</CODE> object representing the newly created MBean.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param name The object name of the MBean. May be null.
       *
       * @return  An <CODE>ObjectInstance</CODE>, containing the <CODE>ObjectName</CODE> and the Java class name
       * of the newly instantiated MBean.
       *
       * @exception ReflectionException Wraps a <CODE>java.lang.ClassNotFoundException</CODE> or a <CODE><CODE>java.lang.Exception</CODE></CODE> that occurred
       * when trying to invoke the MBean's constructor.
       * @exception InstanceAlreadyExistsException The MBean is already under the control of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> (<CODE>MBeanRegistration</CODE> interface) method of the MBean
       * has thrown an exception. The MBean will not be registered.
       * @exception MBeanException The constructor of the MBean has thrown an exception
       * @exception NotCompliantMBeanException This class is not a JMX compliant MBean
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>:
       * The className passed in parameter is null, the <CODE>ObjectName</CODE> passed in parameter contains a pattern or no <CODE>ObjectName</CODE> is specified
       * for the MBean.
       *
       */
      ObjectInstance createMBean( String className, ObjectName name )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, 
                 MBeanException, NotCompliantMBeanException, RemoteException;
  
      /**
       * Instantiates and registers an MBean in the MBean server.
       * The class loader to be used is identified by its object  name. An object name is associated to the MBean.
       * If the object name  of the loader is null, the ClassLoader that loaded the MBean server will be used.
       * If the MBean's object name given is null, the MBean can automatically provide its
       * own name by implementing the {@link javax.management.MBeanRegistration MBeanRegistration} interface.
       * The call returns an <CODE>ObjectInstance</CODE> object representing the newly created MBean.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param name The object name of the MBean. May be null.
       * @param loaderName The object name of the class loader to be used.
       *
       * @return  An <CODE>ObjectInstance</CODE>, containing the <CODE>ObjectName</CODE> and the Java class name
       * of the newly instantiated MBean.
       *
       * @exception ReflectionException  Wraps a <CODE>java.lang.ClassNotFoundException</CODE> or a <CODE>java.lang.Exception</CODE> that occurred
       * when trying to invoke the MBean's constructor.
       * @exception InstanceAlreadyExistsException The MBean is already under the control of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> (<CODE>MBeanRegistration</CODE>  interface) method of the MBean
       * has thrown an exception. The MBean will not be registered.
       * @exception MBeanException The constructor of the MBean has thrown an exception
       * @exception NotCompliantMBeanException This class is not a JMX compliant MBean
       * @exception InstanceNotFoundException The specified class loader is not registered in the MBean server.
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: The className passed in parameter is null,
       * the <CODE>ObjectName</CODE> passed in parameter contains a pattern or no <CODE>ObjectName</CODE> is specified for the MBean.
       */
      ObjectInstance createMBean( String className, ObjectName name, ObjectName loaderName )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, 
                 MBeanException, NotCompliantMBeanException, InstanceNotFoundException, RemoteException;
  
  
      /**
       * Instantiates and registers an MBean in the MBean server.
       * The MBean server will use the {@link javax.management.loading.DefaultLoaderRepository 
       * Default Loader Repository} to load the class of the MBean.
       * An object name is associated to the MBean.
       * If the object name given is null, the MBean can automatically provide its
       * own name by implementing the {@link javax.management.MBeanRegistration MBeanRegistration} interface.
       * The call returns an <CODE>ObjectInstance</CODE> object representing the newly created MBean.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param name The object name of the MBean. May be null.
       * @param params An array containing the parameters of the constructor to be invoked.
       * @param signature An array containing the signature of the constructor to be invoked.
       *
       * @return An <CODE>ObjectInstance</CODE>, containing the <CODE>ObjectName</CODE> 
       *         and the Java class name of the newly instantiated MBean.
       *
       * @exception ReflectionException Wraps a <CODE>java.lang.ClassNotFoundException</CODE> 
       * or a <CODE>java.lang.Exception</CODE> that occurred
       * when trying to invoke the MBean's constructor.
       * @exception InstanceAlreadyExistsException The MBean is already under the control of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> 
       * (<CODE>MBeanRegistration</CODE>  interface) method of the MBean
       * has thrown an exception. The MBean will not be registered.
       * @exception MBeanException The constructor of the MBean has thrown an exception
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: 
       * The className passed in parameter is null, the <CODE>ObjectName</CODE> passed in 
       * parameter contains a pattern or no <CODE>ObjectName</CODE> is specified for the MBean.
       *
       */
      ObjectInstance createMBean( String className, ObjectName name, Object params[], String signature[] )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, 
                 MBeanException, NotCompliantMBeanException, RemoteException;
  
      /**
       * Instantiates and registers an MBean in the MBean server.
       * The class loader to be used is identified by its object
       * name. An object name is associated to the MBean. If the object name
       * of the loader is not specified, the ClassLoader that loaded the MBean server will be used.
       * If  the MBean object name given is null, the MBean can automatically provide its
       * own name by implementing the {@link javax.management.MBeanRegistration MBeanRegistration} interface.
       * The call returns an <CODE>ObjectInstance</CODE> object representing the newly created MBean.
       *
       * @param className The class name of the MBean to be instantiated.
       * @param name The object name of the MBean. May be null.
       * @param params An array containing the parameters of the constructor to be invoked.
       * @param signature An array containing the signature of the constructor to be invoked.
       * @param loaderName The object name of the class loader to be used.
       *
       * @return  An <CODE>ObjectInstance</CODE>, containing the <CODE>ObjectName</CODE> and 
       * the Java class name of the newly instantiated MBean.
       *
       * @exception ReflectionException Wraps a <CODE>java.lang.ClassNotFoundException</CODE> or 
       * a <CODE>java.lang.Exception</CODE> that occurred when trying to invoke the MBean's constructor.
       * @exception InstanceAlreadyExistsException The MBean is already under the control 
       * of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> 
       * (<CODE>MBeanRegistration</CODE>  interface) method of the MBean has thrown an 
       * exception. The MBean will not be registered.
       * @exception MBeanException The constructor of the MBean has thrown an exception
       * @exception InstanceNotFoundException The specified class loader is not registered 
       * in the MBean server.
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: 
       * The className passed in parameter is null, the <CODE>ObjectName</CODE> passed in 
       * parameter contains a pattern or no <CODE>ObjectName</CODE> is specified for the MBean.
       */
      ObjectInstance createMBean( String className, 
                                  ObjectName name, 
                                  ObjectName loaderName, 
                                  Object params[], 
                                  String signature[] )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, 
                 MBeanException, NotCompliantMBeanException, InstanceNotFoundException, RemoteException;
  
      /**
       * Registers a pre-existing object as an MBean with the MBean server. If the object name given is
       * null, the MBean may automatically provide its own name by implementing the
       * {@link javax.management.MBeanRegistration MBeanRegistration}  interface.
       * The call returns an <CODE>ObjectInstance</CODE> object representing the registered MBean.
       *
       * @param object The  MBean to be registered as an MBean.
       * @param name The object name of the MBean. May be null.
       *
       * @return  The <CODE>ObjectInstance</CODE> for the MBean that has been registered.
       *
       * @exception InstanceAlreadyExistsException The MBean is already under the control of the MBean server.
       * @exception MBeanRegistrationException The <CODE>preRegister</CODE> 
       * (<CODE>MBeanRegistration</CODE>  interface) method of the MBean
       * has thrown an exception. The MBean will not be registered.
       * @exception NotCompliantMBeanException This object is not a JMX compliant MBean
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: 
       * The object passed in parameter is null or no object name is specified.
       */
      ObjectInstance registerMBean( Object object, ObjectName name )
          throws InstanceAlreadyExistsException, MBeanRegistrationException,
                 NotCompliantMBeanException, RemoteException;
  
      /**
       * De-registers an MBean from the MBean server. The MBean is identified by
       * its object name. Once the method has been invoked, the MBean may
       * no longer be accessed by its object name.
       *
       * @param name The object name of the MBean to be de-registered.
       *
       * @exception InstanceNotFoundException The MBean specified is not registered in the MBean server.
       * @exception MBeanRegistrationException The preDeregister 
       * ((<CODE>MBeanRegistration</CODE> interface) method of the MBean has thrown an exception.
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: 
       * The object name in parameter is null or the MBean you are when trying to de-register 
       * is the {@link javax.management.MBeanServerDelegate MBeanServerDelegate} MBean.
       */
      void unregisterMBean( ObjectName name )
          throws InstanceNotFoundException, MBeanRegistrationException, RemoteException;
  
      /**
       * Gets the <CODE>ObjectInstance</CODE> for a given MBean registered with the MBean server.
       *
       * @param name The object name of the MBean.
       *
       * @return The <CODE>ObjectInstance</CODE> associated to the MBean specified by <VAR>name</VAR>.
       *
       * @exception InstanceNotFoundException The MBean specified is not registered in the MBean server.
       */
      ObjectInstance getObjectInstance( ObjectName name ) 
          throws InstanceNotFoundException, RemoteException;
  
      /**
       * Gets MBeans controlled by the MBean server. This method allows any
       * of the following to be obtained: All MBeans, a set of MBeans specified
       * by pattern matching on the <CODE>ObjectName</CODE> and/or a Query expression, a
       * specific MBean. When the object name is null or no domain and key properties are specified,
       * all objects are to be selected (and filtered if a query is specified). It returns the
       * set of <CODE>ObjectInstance</CODE> objects (containing the <CODE>ObjectName</CODE> 
       * and the Java Class name) for the selected MBeans.
       *
       * @param name The object name pattern identifying the MBeans to be retrieved. If
       * null or no domain and key properties are specified, all the MBeans registered will be retrieved.
       * @param query The query expression to be applied for selecting MBeans. If null
       * no query expression will be applied for selecting MBeans.
       *
       * @return  A set containing the <CODE>ObjectInstance</CODE> objects for the selected MBeans.
       * If no MBean satisfies the query an empty list is returned.
       */
      Set queryMBeans( ObjectName name, QueryExp query ) 
          throws RemoteException;
  
      /**
       * Gets the names of MBeans controlled by the MBean server. This method
       * enables any of the following to be obtained: The names of all MBeans,
       * the names of a set of MBeans specified by pattern matching on the
       * <CODE>ObjectName</CODE> and/or a Query expression, a specific MBean name (equivalent to
       * testing whether an MBean is registered). When the object name is
       * null or no domain and key properties are specified, all objects are selected (and filtered if a
       * query is specified). It returns the set of ObjectNames for the MBeans
       * selected.
       *
       * @param name The object name pattern identifying the MBeans to be retrieved. If
       * null or no domain and key properties are specified, all the MBeans registered will be retrieved.
       * @param query The query expression to be applied for selecting MBeans. If null
       * no query expression will be applied for selecting MBeans.
       *
       * @return  A set containing the ObjectNames for the MBeans selected.
       * If no MBean satisfies the query, an empty list is returned.
       *
       */
      Set queryNames( ObjectName name, QueryExp query ) 
          throws RemoteException;
  
      /**
       * Checks whether an MBean, identified by its object name, is already registered
       * with the MBean server.
       *
       * @param name The object name of the MBean to be checked.
       *
       * @return  True if the MBean is already registered in the MBean server, false otherwise.
       *
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: 
       * The object name in parameter is null.
       */
      boolean isRegistered( ObjectName name ) 
          throws RemoteException;
  
      /**
       * Returns the number of MBeans registered in the MBean server.
       */
      Integer getMBeanCount() 
          throws RemoteException;
  
      /**
       * Gets the value of a specific attribute of a named MBean. The MBean
       * is identified by its object name.
       *
       * @param name The object name of the MBean from which the attribute is to be retrieved.
       * @param attribute A String specifying the name of the attribute to be
       * retrieved.
       *
       * @return  The value of the retrieved attribute.
       *
       * @exception AttributeNotFoundException The attribute specified is not accessible in the MBean.
       * @exception MBeanException  Wraps an exception thrown by the MBean's getter.
       * @exception InstanceNotFoundException The MBean specified is not registered in the MBean server.
       * @exception ReflectionException  Wraps a <CODE>java.lang.Exception</CODE> thrown 
       * when trying to invoke the setter.
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: 
       * The object name in parameter is null or the attribute in parameter is null.
       */
      Object getAttribute( ObjectName name, String attribute ) 
          throws MBeanException, AttributeNotFoundException, InstanceNotFoundException, 
                 ReflectionException, RemoteException;
  
      /**
       * Enables the values of several attributes of a named MBean. The MBean
       * is identified by its object name.
       *
       * @param name The object name of the MBean from which the attributes are
       * retrieved.
       * @param attributes A list of the attributes to be retrieved.
       *
       * @return The list of the retrieved attributes.
       *
       * @exception InstanceNotFoundException The MBean specified is not registered in the MBean server.
       * @exception ReflectionException An exception occurred when trying to invoke the 
       * getAttributes method of a Dynamic MBean.
       * @exception RuntimeOperationsException Wrap a <CODE>java.lang.IllegalArgumentException</CODE>: 
       * The object name in parameter is null or attributes in parameter is null.
       */
      AttributeList getAttributes( ObjectName name, String[] attributes )
          throws InstanceNotFoundException, ReflectionException;
  
      /**
       * Sets the value of a specific attribute of a named MBean. The MBean
       * is identified by its object name.
       *
       * @param name The name of the MBean within which the attribute is to be set.
       * @param attribute The identification of the attribute to be set and the value it is to be set to.
       *
       * @return  The value of the attribute that has been set.
       *
       * @exception InstanceNotFoundException The MBean specified is not registered in the MBean server.
       * @exception AttributeNotFoundException The attribute specified is not accessible in the MBean.
       * @exception InvalidAttributeValueException The value specified for the attribute is not valid.
       * @exception MBeanException Wraps an exception thrown by the MBean's setter.
       * @exception ReflectionException  Wraps a <CODE>java.lang.Exception</CODE> thrown when 
       * trying to invoke the setter.
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: 
       * The object name in parameter is null or the attribute in parameter is null.
       */
      void setAttribute( ObjectName name, Attribute attribute ) 
          throws InstanceNotFoundException, AttributeNotFoundException, InvalidAttributeValueException, 
                 MBeanException, ReflectionException, RemoteException;
  
      /**
       * Sets the values of several attributes of a named MBean. The MBean is
       * identified by its object name.
       *
       * @param name The object name of the MBean within which the attributes are to
       * be set.
       * @param attributes A list of attributes: The identification of the
       * attributes to be set and  the values they are to be set to.
       *
       * @return  The list of attributes that were set, with their new values.
       *
       * @exception InstanceNotFoundException The MBean specified is not registered in the MBean server.
       * @exception ReflectionException An exception occurred when trying to invoke the 
       * getAttributes method of a Dynamic MBean.
       * @exception RuntimeOperationsException Wraps a <CODE>java.lang.IllegalArgumentException</CODE>: 
       * The object name in parameter is null or attributes in parameter is null.
       */
      AttributeList setAttributes( ObjectName name, AttributeList attributes )
          throws InstanceNotFoundException, ReflectionException, RemoteException;
  
      /**
       * Invokes an operation on an MBean.
       *
       * @param name The object name of the MBean on which the method is to be invoked.
       * @param operationName The name of the operation to be invoked.
       * @param params An array containing the parameters to be set when the operation is
       * invoked
       * @param signature An array containing the signature of the operation. The class objects will
       * be loaded using the same class loader as the one used for loading the MBean on which the operation was invoked.
       *
       * @return  The object returned by the operation, which represents the result ofinvoking the operation on the
       * MBean specified.
       *
       * @exception InstanceNotFoundException The MBean specified is not registered in the MBean server.
       * @exception MBeanException  Wraps an exception thrown by the MBean's invoked method.
       * @exception ReflectionException  Wraps a <CODE>java.lang.Exception</CODE> thrown 
       * while trying to invoke the method.
       */
      Object invoke( ObjectName name, String operationName, Object params[], String signature[] )
          throws InstanceNotFoundException, MBeanException, ReflectionException, RemoteException;
  
      /**
       * Returns the default domain used for naming the MBean.
       * The default domain name is used as the domain part in the ObjectName
       * of MBeans if no domain is specified by the user.
       */
      String getDefaultDomain() 
          throws RemoteException;
  
      /**
       * Enables to add a listener to a registered MBean.
       *
       * @param name The name of the MBean on which the listener should be added.
       * @param listener The listener object which will handle the notifications emitted 
       * by the registered MBean.
       * @param filter The filter object. If filter is null, no filtering will be 
       * performed before handling notifications.
       * @param handback The context to be sent to the listener when a notification is emitted.
       * @exception InstanceNotFoundException The MBean name provided does not match any of 
       * the registered MBeans.
       */
      void addNotificationListener( ObjectName name, 
                                    NotificationListener listener, 
                                    NotificationFilter filter, 
                                    Object handback )
          throws InstanceNotFoundException, RemoteException;
  
      /**
       * Enables to add a listener to a registered MBean.
       *
       * @param name The name of the MBean on which the listener should be added.
       * @param listener The object name of the listener which will handle the notifications 
       * emitted by the registered MBean.
       * @param filter The filter object. If filter is null, no filtering will be performed before 
       * handling notifications.
       * @param handback The context to be sent to the listener when a notification is emitted.
       *
       * @exception InstanceNotFoundException The MBean name of the notification listener 
       * or of the notification broadcaster does not match any of the registered MBeans.
       */
      void addNotificationListener( ObjectName name, 
                                    ObjectName listener, 
                                    NotificationFilter filter, 
                                    Object handback )
          throws InstanceNotFoundException, RemoteException;
  
      /**
       * Enables to remove a listener from a registered MBean.
       *
       * @param name The name of the MBean on which the listener should be removed.
       * @param listener The listener object which will handle the notifications emitted by 
       * the registered MBean.
       * This method will remove all the information related to this listener.
       *
       * @exception InstanceNotFoundException The MBean name provided does not match any 
       * of the registered MBeans.
       * @exception ListenerNotFoundException The listener is not registered in the MBean.
       */
      void removeNotificationListener( ObjectName name, NotificationListener listener )
          throws InstanceNotFoundException, ListenerNotFoundException, RemoteException;
  
      /**
       * Enables to remove a listener from a registered MBean.
       *
       * @param name The name of the MBean on which the listener should be removed.
       * @param listener The object name of the listener which will handle the 
       * notifications emitted by the registered MBean.
       * This method will remove all the information related to this listener.
       *
       * @exception InstanceNotFoundException The MBean name provided does not match any of 
       * the registered MBeans.
       * @exception ListenerNotFoundException The listener is not registered in the MBean.
       */
      void removeNotificationListener( ObjectName name, ObjectName listener )
          throws InstanceNotFoundException, ListenerNotFoundException, RemoteException;
  
      /**
       * This method discovers the attributes and operations that an MBean exposes
       * for management.
       *
       * @param name The name of the MBean to analyze
       *
       * @return  An instance of <CODE>MBeanInfo</CODE> allowing the retrieval of 
       * all attributes and operations of this MBean.
       *
       * @exception IntrospectionException An exception occurs during introspection.
       * @exception InstanceNotFoundException The MBean specified is not found.
       * @exception ReflectionException An exception occurred when trying to invoke 
       * the getMBeanInfo of a Dynamic MBean.
       */
      MBeanInfo getMBeanInfo( ObjectName name ) 
          throws InstanceNotFoundException, IntrospectionException, ReflectionException, RemoteException;
  
      /** Returns true if the MBean specified is an instance of the specified class, false otherwise.
       *
       * @param name The <CODE>ObjectName</CODE> of the MBean.
       * @param className The name of the class.
       *
       * @return true if the MBean specified is an instance of the specified class, false otherwise.
       *
       * @exception InstanceNotFoundException The MBean specified is not registered in the MBean server.
       */
      boolean isInstanceOf( ObjectName name, String className ) 
          throws InstanceNotFoundException, RemoteException;
  
      /**
       * De-serializes a byte array in the context of the class loader
       * of an MBean.
       *
       * @param name The name of the MBean whose class loader should be used for the de-serialization.
       * @param data The byte array to be de-sererialized.
       *
       * @return  The de-serialized object stream.
       *
       * @exception InstanceNotFoundException The MBean specified is not found.
       * @exception OperationsException Any of the usual Input/Output related exceptions.
       */
      ObjectInputStream deserialize( ObjectName name, byte[] data )
          throws InstanceNotFoundException, OperationsException, RemoteException;
  
      /**
       * De-serializes a byte array in the context of a given MBean class loader.
       * The class loader is the one that loaded the class with name "className".
       *
       * @param name The name of the class whose class loader should be used for the de-serialization.
       * @param data The byte array to be de-sererialized.
       *
       * @return  The de-serialized object stream.
       *
       * @exception OperationsException Any of the usual Input/Output related exceptions.
       * @exception ReflectionException The specified class could not be loaded by the 
       * default loader repository
       */
      ObjectInputStream deserialize( String className, byte[] data )
          throws OperationsException, ReflectionException, RemoteException;
  
      /**
       * De-serializes a byte array in the context of a given MBean class loader.
       * The class loader is the one that loaded the class with name "className".
       * The name of the class loader to be used for loading the specified class is specified.
       * If null, the MBean Server's class loader will be used.
       *
       * @param name The name of the class whose class loader should be used for the de-serialization.
       * @param data The byte array to be de-sererialized.
       * @param loaderName The name of the class loader to be used for loading the specified class.
       * If null, the MBean Server's class loader will be used.
       *
       * @return  The de-serialized object stream.
       *
       * @exception InstanceNotFoundException The specified class loader MBean is not found.
       * @exception OperationsException Any of the usual Input/Output related exceptions.
       * @exception ReflectionException The specified class could not be loaded by the specified class loader.
       */
      ObjectInputStream deserialize( String className, ObjectName loaderName, byte[] data )
          throws InstanceNotFoundException, OperationsException, ReflectionException, RemoteException;
  }
  
  
  
  1.1                  jakarta-avalon-phoenix/src/java/org/apache/jmx/adaptor/RMIAdaptorImpl.java
  
  Index: RMIAdaptorImpl.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.jmx.adaptor;
  
  import java.io.ObjectInputStream;
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  import java.rmi.server.UnicastRemoteObject;
  import java.util.Set;
  import javax.management.*;
  
  /**
   * This is the RMI connection representing an MBeanServer. It is
   * identical to the <code>MBeanServer</code> interface, except
   * it throws exceptions related to remote operations.
   *
   * @author <a href="mailto:mail@leosimons.com">Leo Simons</a>
   */
  public class RMIAdaptorImpl 
      extends UnicastRemoteObject 
      implements RMIAdaptor
  {
      private MBeanServer m_server;
  
      public RMIAdaptorImpl( final MBeanServer server )
          throws RemoteException
      {
          m_server = server;
      }
  
      /////////////////////////////////
      /// RMIADAPTOR IMPLEMENTATION ///
      /////////////////////////////////
      public Object instantiate( final String className )
          throws ReflectionException, MBeanException, RemoteException
      {
          return m_server.instantiate( className );
      }
  
      public Object instantiate( final String className, final ObjectName loaderName )
          throws ReflectionException, MBeanException, InstanceNotFoundException, RemoteException
      {
          return m_server.instantiate( className, loaderName );
      }
  
      public Object instantiate( final String className, 
                                 final Object[] params, 
                                 final String[] signature )
          throws ReflectionException, MBeanException, RemoteException
      {
          return m_server.instantiate( className, params, signature );
      }
  
      public Object instantiate( final String className,
                                 final ObjectName loaderName,
                                 final Object[] params,
                                 final String[] signature )
          throws ReflectionException, MBeanException, InstanceNotFoundException, RemoteException
      {
          return m_server.instantiate( className, loaderName, params, signature );
      }
  
      public ObjectInstance createMBean( final String className, final ObjectName name )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException,
                 MBeanException, NotCompliantMBeanException, RemoteException
      {
          return m_server.createMBean( className, name );
      }
  
      public ObjectInstance createMBean( final String className, 
                                         final ObjectName name, 
                                         final ObjectName loaderName )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException,
                 MBeanException, NotCompliantMBeanException, InstanceNotFoundException, RemoteException
      {
          return m_server.createMBean( className, name, loaderName );
      }
  
      public ObjectInstance createMBean( final String className,
                                         final ObjectName name,
                                         final Object[] params,
                                         final String[] signature )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException,
                 MBeanException, NotCompliantMBeanException, RemoteException
      {
          return m_server.createMBean( className, name, params, signature );
      }
  
      public ObjectInstance createMBean( final String className,
                                         final ObjectName name,
                                         final ObjectName loaderName,
                                         final Object[] params,
                                         final String[] signature )
          throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException,
                 MBeanException, NotCompliantMBeanException, InstanceNotFoundException, RemoteException
      {
          return m_server.createMBean( className, name, loaderName, params, signature );
      }
  
      public ObjectInstance registerMBean( final Object object, final ObjectName name )
          throws InstanceAlreadyExistsException, MBeanRegistrationException,
                 NotCompliantMBeanException, RemoteException
      {
          return m_server.registerMBean( object, name );
      }
  
      public void unregisterMBean( final ObjectName name )
          throws InstanceNotFoundException, MBeanRegistrationException, RemoteException
      {
          m_server.unregisterMBean( name );
      }
  
      public ObjectInstance getObjectInstance( final ObjectName name )
          throws InstanceNotFoundException, RemoteException 
      {
          return m_server.getObjectInstance( name );
      }
  
      public Set queryMBeans( final ObjectName name, final QueryExp query )
          throws RemoteException
      {
          return m_server.queryMBeans( name, query );
      }
  
      public Set queryNames( final ObjectName name, final QueryExp query ) 
          throws RemoteException
      {
          return m_server.queryMBeans( name, query );
      }
  
      public boolean isRegistered( final ObjectName name ) 
          throws RemoteException
      {
          return m_server.isRegistered( name );
      }
  
      public Integer getMBeanCount() 
          throws RemoteException
      {
          return m_server.getMBeanCount();
      }
  
      public Object getAttribute( final ObjectName name, final String attribute )
          throws MBeanException, AttributeNotFoundException, InstanceNotFoundException,
                 ReflectionException, RemoteException 
      {
          return m_server.getAttribute( name, attribute );
      }
  
      public AttributeList getAttributes( final ObjectName name, final String[] attributes )
          throws InstanceNotFoundException, ReflectionException
      {
          return m_server.getAttributes( name, attributes );
      }
  
      public void setAttribute( final ObjectName name, final Attribute attribute )
          throws InstanceNotFoundException, AttributeNotFoundException,
                 InvalidAttributeValueException, MBeanException, ReflectionException, RemoteException
      {
          m_server.setAttribute( name, attribute );
      }
  
      public AttributeList setAttributes( final ObjectName name, final AttributeList attributes )
          throws InstanceNotFoundException, ReflectionException, RemoteException 
      {
          return m_server.setAttributes( name, attributes );
      }
  
      public Object invoke( final ObjectName name, 
                            final String operationName, 
                            final Object[] params, 
                            final String[] signature )
          throws InstanceNotFoundException, MBeanException, ReflectionException, RemoteException
      {
          return m_server.invoke( name, operationName, params, signature );
      }
  
      public String getDefaultDomain() 
          throws RemoteException
      {
          return m_server.getDefaultDomain();
      }
  
      public void addNotificationListener( final ObjectName name,
                                           final NotificationListener listener,
                                           final NotificationFilter filter,
                                           final Object handback )
          throws InstanceNotFoundException, RemoteException
      {
          m_server.addNotificationListener( name, listener, filter, handback );
      }
  
      public void addNotificationListener( final ObjectName name,
                                           final ObjectName listener,
                                           final NotificationFilter filter,
                                           final Object handback )
          throws InstanceNotFoundException, RemoteException 
      {
          m_server.addNotificationListener( name, listener, filter, handback );
      }
  
      public void removeNotificationListener( final ObjectName name, final NotificationListener listener )
          throws InstanceNotFoundException, ListenerNotFoundException, RemoteException 
      {
          m_server.removeNotificationListener( name, listener );
      }
  
      public void removeNotificationListener( final ObjectName name, final ObjectName listener )
          throws InstanceNotFoundException, ListenerNotFoundException, RemoteException 
      {
          m_server.removeNotificationListener( name, listener );
      }
  
      public MBeanInfo getMBeanInfo( final ObjectName name )
          throws InstanceNotFoundException, IntrospectionException, ReflectionException, RemoteException
      {
          return m_server.getMBeanInfo( name );
      }
      
      public boolean isInstanceOf( final ObjectName name, final String className )
          throws InstanceNotFoundException, RemoteException 
      {
          return m_server.isInstanceOf( name, className );
      }
  
      public ObjectInputStream deserialize( final ObjectName name, final byte[] data )
          throws InstanceNotFoundException, OperationsException, RemoteException 
      {
          return m_server.deserialize( name, data );
      }
  
      public ObjectInputStream deserialize( final String className, final byte[] data )
          throws OperationsException, ReflectionException, RemoteException 
      {
          return m_server.deserialize( className, data );
      }
  
      public ObjectInputStream deserialize( final String className, 
                                            final ObjectName loaderName, 
                                            final byte[] data )
          throws InstanceNotFoundException, OperationsException, ReflectionException,
                 RemoteException 
      {
          return m_server.deserialize( className, loaderName, data );
      }
  }
  
  
  
  1.1                  jakarta-avalon-phoenix/src/java/org/apache/jmx/introspector/DefaultDynamicMBean.java
  
  Index: DefaultDynamicMBean.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.jmx.introspector;
  
  import java.lang.reflect.Constructor;
  import java.lang.reflect.Method;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  import javax.management.Attribute;
  import javax.management.AttributeList;
  import javax.management.AttributeList;
  import javax.management.AttributeNotFoundException;
  import javax.management.DynamicMBean;
  import javax.management.IntrospectionException;
  import javax.management.InvalidAttributeValueException;
  import javax.management.MBeanAttributeInfo;
  import javax.management.MBeanConstructorInfo;
  import javax.management.MBeanException;
  import javax.management.MBeanInfo;
  import javax.management.MBeanNotificationInfo;
  import javax.management.MBeanOperationInfo;
  import javax.management.NotCompliantMBeanException;
  import javax.management.NotificationBroadcaster;
  import javax.management.ReflectionException;
  
  /**
   * This class is used by DynamicMBeanFactory to create DynamicMBeans. It can
   * represent any object. Notifications are not supported. You can easily create
   * custom DynamicMBeans by extending this class and replacing the createXXX()
   * methods. TODO: Or, you can replace the getDescriptionFor() methods to add
   * sensible documentation to your DynamicMBean, making it easier to create Open
   * MBeans if you wish to do so.
   *
   * @author <a href="mailto:mail@leosimons.com">Leo Simons</a>
   * @version CVS $Revision: 1.1 $ $Date: 2001/04/24 05:00:53 $
   */
  class DefaultDynamicMBean 
      implements DynamicMBean
  {
      private final static String DEFAULT_DESCRIPTION = "A manageable object.";
  
      /**
       * The object represented by this MBean
       */
      protected final Object m_object;
      /**
       * The MBeanInfo object.
       */
      protected MBeanInfo m_mBeanInfo;
  
      /**
       * The human readable description of the class.
       */
      protected String m_description;
      /**
       * Tells if this is an open MBean.
       */
      protected boolean m_isOpen;
      /**
       * The MBean attribute descriptors.
       */
      protected MBeanAttributeInfo[] m_attributes;
      /**
       * The MBean operation descriptors.
       */
      protected MBeanOperationInfo[] m_operations;
      /**
       * The MBean constructor descriptors.
       */
      protected MBeanConstructorInfo[] m_constructors;
      /**
       * The MBean notification descriptors.
       */
      protected MBeanNotificationInfo[] m_notifications;
  
      DefaultDynamicMBean( final Object object )
          throws NotCompliantMBeanException
      {
          m_object = object;
          final Class clazz = object.getClass();
  
          final Constructor[] constructors = clazz.getConstructors();
          final Method[] methods = clazz.getMethods();
  
          m_constructors = createConstructorInfo( constructors );
          m_operations = createOperationInfo( methods );
          m_attributes = createAttributeInfo( methods );
          m_notifications = new MBeanNotificationInfo[ 0 ];
          m_description = DEFAULT_DESCRIPTION;
  
          createMBeanInfo();
      }
  
      DefaultDynamicMBean( final Object object, final MBeanInfo mBeanInfo )
          throws IllegalArgumentException, NotCompliantMBeanException
      {
          this( object );
  
          m_mBeanInfo = mBeanInfo;
  
          // make sure the MBeanInfo is correct
          try
          {
              if( !( Class.forName( mBeanInfo.getClassName() ) == object.getClass() ) )
              {
                  throw new IllegalArgumentException( "The supplied mBeanInfo does not " + 
                                                      "describe the object!" );
              }
              if( mBeanInfo.getNotifications() != m_notifications )
              {
                  throw new IllegalArgumentException( "The DefaultDynamicMBean does " + 
                                                      "not support notifications!" );
              }
          }
          catch( ClassNotFoundException cnfe )
          {
              throw new IllegalArgumentException( "Unable to find the class specified by the MBeanInfo!" );
          }
  
          m_description = mBeanInfo.getDescription();
      }
  
      ///////////////////////////////
      /// DYNAMIC MBEAN INTERFACE ///
      ///////////////////////////////
  
      /**
       * Obtains the value of a specific attribute of the Dynamic MBean.
       */
      public Object getAttribute( final String attribute )
          throws AttributeNotFoundException, MBeanException, ReflectionException
      {
          final String methodName = 
              "get" + attribute.substring( 0, 1 ).toUpperCase() + attribute.substring( 1 );
          final String methodName2 = 
              "is" + attribute.substring( 0, 1 ).toUpperCase() + attribute.substring( 1 );
  
          final Class clazz = m_object.getClass();
  
          Method method;
          try
          {
              method = clazz.getMethod( methodName, new Class[0] );
          }
          catch( final Exception e )
          {
              try
              {
                  method = clazz.getMethod( methodName2, new Class[0] );
              }
              catch( final Exception ee )
              {
                  throw new AttributeNotFoundException();
              }
          }
  
          try
          {
              return method.invoke( m_object, new Object[0] );
          }
          catch( final Exception e )
          {
              throw new MBeanException( e );
          }
      }
  
      /**
       * Enables the values of several attributes of the Dynamic MBean.
       */
      public AttributeList getAttributes( final String[] atts )
      {
          AttributeList attList = new AttributeList();
          for( int i = 0; i < atts.length; i++ )
          {
              final String name = atts[i];
              final String methodName = 
                  "get" + name.substring( 0, 1 ).toUpperCase() + name.substring( 1 );
              final String methodName2 = 
                  "is" + name.substring( 0, 1 ).toUpperCase() + name.substring( 1 );
  
              final Class clazz = m_object.getClass();
  
              Object value = null;
              Method method;
              
              try
              {
                  method = clazz.getMethod( methodName, new Class[0] );
              }
              catch( final Exception e )
              {
                  try
                  {
                      method = clazz.getMethod( methodName2, new Class[0] );
                  }
                  catch( final Exception ee )
                  {
                      continue;
                  }
              }
  
              try
              {
                  value = method.invoke( m_object, new Object[0] );
              }
              catch( final Exception e )
              {
              }
  
              if( value != null )
              {
                  attList.add( new Attribute( name, value ) );
              }
          }
  
          return attList;
      }
  
      /**
       * Provides the exposed attributes and actions of the Dynamic MBean using an
       * MBeanInfo object.
       *
       * @return An instance of <CODE>MBeanInfo</CODE> allowing all attributes and
       *      actions exposed by this Dynamic MBean to be retrieved.
       */
      public MBeanInfo getMBeanInfo()
      {
          return m_mBeanInfo;
      }
  
      /**
       * Allows an action to be invoked on the Dynamic MBean.
       *
       * @param actionName The name of the action to be invoked.
       * @param params An array containing the parameters to be set when the
       *      action is invoked.
       * @param signature An array containing the signature of the action. The
       *      class objects will be loaded through the same class loader as the
       *      one used for loading the MBean on which the action is invoked.
       * @return The object returned by the action, which represents the result of
       *      invoking the action on the MBean specified.
       * @exception MBeanException Wraps a <CODE>java.lang.Exception</CODE> thrown
       *      by the MBean's invoked method.
       * @exception ReflectionException Wraps a <CODEjava.lang.Exception</CODE
       *      thrown while trying to invoke the method
       */
      public Object invoke( final String actionName, final Object[] params, final String[] signature )
          throws MBeanException, ReflectionException
      {
          Method method;
  
          try
          {
              final Class[] classes = new Class[ signature.length ];
  
              for( int i = 0; i < classes.length; i++ )
              {
                  classes[ i ] = Class.forName( signature[ i ] );
              }
  
              method = m_object.getClass().getMethod( actionName, classes );
          }
          catch( final Exception e )
          {
              throw new ReflectionException( e );
          }
  
          try
          {
              return method.invoke( m_object, params );
          }
          catch( final Exception e )
          {
              throw new MBeanException( e );
          }
      }
  
      /**
       * Sets the value of a specific attribute of the Dynamic MBean
       */
      public void setAttribute( final Attribute attribute )
          throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, 
                 ReflectionException
      {
          final String name = attribute.getName();
          final String methodName = 
              "set" + name.substring( 0, 1 ).toUpperCase() + name.substring( 1 );
  
          Method method;
          try
          {
              final Class clazz = m_object.getClass();
              method = clazz.getMethod( methodName,
                                        new Class[] { attribute.getValue().getClass() } );
          }
          catch( final Exception e )
          {
              throw new AttributeNotFoundException();
          }
  
          try
          {
              method.invoke( m_object, new Object[] { attribute.getValue() } );
          }
          catch( final Exception e )
          {
              throw new MBeanException( e );
          }
      }
  
      /**
       * Sets the values of several attributes of the Dynamic MBean.
       */
      public AttributeList setAttributes( final AttributeList atts )
      {
          final AttributeList attList = new AttributeList();
  
          for( int i = 0; i < atts.size(); i++ )
          {
              final Attribute att = (Attribute)atts.get( i );
              final String name = att.getName();
              final String methodName = "set" + name.substring( 0, 1 ).toUpperCase() + name.substring( 1 );
  
              Object value = null;
              Method m;
              try
              {
                  m = m_object.getClass().getMethod( methodName, new Class[]{att.getValue().getClass()} );
              }
              catch( Exception e )
              {
                  continue;
              }
              try
              {
                  value = m.invoke( m_object, new Object[]{att.getValue()} );
              }
              catch( Exception e )
              {
              }
              if( value != null )
              {
                  attList.add( new Attribute( name, value ) );
              }
          }
          return attList;
      }
  
      /**
       * Extract all the Methods from the supplied array that are operations.
       */
      protected Method[] getOperationFor( Method[] methods )
      {
          final ArrayList ops = new ArrayList();
          for( int i = 0; i < methods.length; i++ )
          {
              final String name = methods[i].getName();
              final String uppercaseChars = new String( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" );
              final boolean isGetter =
                  ( name.startsWith( "get" ) &&
                    ( uppercaseChars.indexOf( name.substring( 3, 4 ) ) != -1 ) );
              final boolean isSetter =
                  ( name.startsWith( "set" ) &&
                    ( uppercaseChars.indexOf( name.substring( 3, 4 ) ) != -1 ) );
              final boolean isIs =
                  ( name.startsWith( "is" ) &&
                    ( uppercaseChars.indexOf( name.substring( 2, 3 ) ) != -1 ) );
              if( !( isGetter || isSetter || isIs ) )
              {
                  ops.add( methods[i] );
              }
          }
          return (Method[])ops.toArray();
      }
  
      /**
       * Extract all Methods from the supplied array that are of the form getXxx,
       * setXxx or isXxx.
       *
       * @return A multi-dimensional array, with the first element being an array
       *      of getter methods, the second element being an array of setter
       *      methods, and the third element being an array of isser methods.
       */
      protected Method[][] getAttributeFor( Method[] methods )
      {
          final ArrayList getters = new ArrayList();
          final ArrayList setters = new ArrayList();
          final ArrayList issers = new ArrayList();
  
          Method[][] m = new Method[3][];
          for( int i = 0; i < methods.length; i++ )
          {
              final String name = methods[i].getName();
              final String uppercaseChars = new String( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" );
              final boolean isGetter =
                  ( name.startsWith( "get" ) &&
                    ( uppercaseChars.indexOf( name.substring( 3, 4 ) ) != -1 ) );
              final boolean isSetter =
                  ( name.startsWith( "set" ) &&
                    ( uppercaseChars.indexOf( name.substring( 3, 4 ) ) != -1 ) );
              final boolean isIs =
                  ( name.startsWith( "is" ) &&
                    ( uppercaseChars.indexOf( name.substring( 2, 3 ) ) != -1 ) );
              if( isGetter )
              {
                  getters.add( methods[i] );
              }
              if( isSetter )
              {
                  setters.add( methods[i] );
              }
              if( isIs )
              {
                  issers.add( methods[i] );
              }
          }
          m[0] = (Method[])getters.toArray();
          m[1] = (Method[])setters.toArray();
          m[2] = (Method[])issers.toArray();
          return m;
      }
  
      //////////////////////
      /// HELPER METHODS ///
      //////////////////////
      /**
       * Creates an MBeanConstructorInfo array with an entry for each of the
       * supplied constructors.
       */
      protected MBeanConstructorInfo[] createConstructorInfo( final Constructor[] constructors )
      {
          final MBeanConstructorInfo[] info = new MBeanConstructorInfo[ constructors.length ];
  
          for( int i = 0; i < constructors.length; i++ )
          {
              info[i] = new MBeanConstructorInfo( "Creates a new instance of this MBean.", constructors[i] );
          }
  
          return info;
      }
  
      /**
       * Creates an MBeanOperationInfo array with an entry for each supplied
       * method that is an operation. A method is an operation when it is not
       * named getXxxx, setXxxx or isXxxx.
       */
      protected MBeanOperationInfo[] createOperationInfo( final Method[] methods )
      {
          // getXXX, setXXX and isXXX are not operations, so remove those
          final Method[] ops = getOperationFor( methods );
  
          MBeanOperationInfo[] info = new MBeanOperationInfo[ops.length];
  
          for( int i = 0; i < ops.length; i++ )
          {
              info[i] = new MBeanOperationInfo(
                                               "Call a method on this MBean", ops[i] );
          }
          return info;
      }
  
      /**
       * Creates an MBeanAttributeInfo array with an entry for every attribute.
       * The exposed attributes are found by taking a look at all methods that are
       * named getXxx and isXxx. While this method finds the corresponding setXxx
       * method for these, it does not add an entry into the returned array for
       * write-only attributes. TODO:
  
       * @throws NotCompliantMBeanException when the getXxx, isXxx or setXxx don't
       *      have the right number of arguments (0, 0 and 1, respectively).
       */
      protected MBeanAttributeInfo[] createAttributeInfo( Method[] methods )
          throws NotCompliantMBeanException
      {
          // only getXXX, setXXX and isXXX expose attributes, so remove
          // all others
          final Method[][] m = getAttributeFor( methods );
  
          // all getter and isser methods mean an attribute
          final MBeanAttributeInfo[] info = new MBeanAttributeInfo[( m[0].length + m[2].length )];
          // fill info from this point
          int beginIndex = 0;
  
          // create MBeanAttributeInfo's for all getter methods
          for( int i = 0; i < m[0].length; i++ )
          {
              final Method getter = m[0][i];
              String attributeName = getter.getName().substring( 3 );
              Method setter = null;
              for( int j = 0; j < m[1].length; j++ )
              {
                  String setterName = m[1][j].getName();
                  if( setterName.equals( "set" + attributeName ) )
                  {
                      setter = m[0][j];
                      break;
                  }
              }
              attributeName = attributeName.substring( 0, 1 ).toLowerCase() + attributeName.substring( 1 );
              try
              {
                  info[beginIndex] = new MBeanAttributeInfo( attributeName, "", getter, setter );
              }
              catch( IntrospectionException ie )
              {
                  throw new NotCompliantMBeanException();
              }
              beginIndex++;
          }
  
          // create MBeanAttributeInfo's for all isser methods
          for( int i = 0; i < m[2].length; i++ )
          {
              final Method isser = m[2][i];
              final String attributeName = isser.getName().substring( 2 );
              Method setter = null;
              for( int j = 0; j < m[1].length; j++ )
              {
                  String setterName = m[1][j].getName();
                  if( setterName.equals( "set" + attributeName ) )
                  {
                      setter = m[0][j];
                      break;
                  }
              }
  
              try
              {
                  info[ beginIndex ] = new MBeanAttributeInfo( attributeName, "", isser, setter );
              }
              catch( IntrospectionException ie )
              {
                  throw new NotCompliantMBeanException();
              }
              beginIndex++;
          }
          return info;
      }
  
      protected void createMBeanInfo()
      {
          m_mBeanInfo = 
              new MBeanInfo( m_object.getClass().getName(),
                             m_description,
                             m_attributes,
                             m_constructors,
                             m_operations,
                             m_notifications );
      }
  }
  
  
  
  1.1                  jakarta-avalon-phoenix/src/java/org/apache/jmx/introspector/DefaultDynamicNotificationMBean.java
  
  Index: DefaultDynamicNotificationMBean.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.jmx.introspector;
  
  import javax.management.ListenerNotFoundException;
  import javax.management.MBeanInfo;
  import javax.management.MBeanNotificationInfo;
  import javax.management.NotCompliantMBeanException;
  import javax.management.NotificationBroadcaster;
  import javax.management.NotificationBroadcasterSupport;
  import javax.management.NotificationFilter;
  import javax.management.NotificationListener;
  
  /**
   * This class is used by DynamicMBeanFactory to create DynamicMBeans. It extends
   * DefaultDynamicMBean, adding support for notifications.
   *
   * @author <a href="mailto:mail@leosimons.com">Leo Simons</a>
   * @version CVS $Revision: 1.1 $ $Date: 2001/04/24 05:00:53 $
   */
  public class DefaultDynamicNotificationMBean
      extends DefaultDynamicMBean
      implements NotificationBroadcaster
  {
      public DefaultDynamicNotificationMBean( final NotificationBroadcaster object )
          throws NotCompliantMBeanException
      {
          super( object );
  
          m_notifications = object.getNotificationInfo();
          createMBeanInfo();
      }
  
      public DefaultDynamicNotificationMBean( final NotificationBroadcaster object,
                                              final MBeanInfo mBeanInfo )
          throws NotCompliantMBeanException
      {
          super( object, mBeanInfo );
          m_notifications = object.getNotificationInfo();
          createMBeanInfo();
      }
  
      public MBeanNotificationInfo[] getNotificationInfo()
      {
          return m_notifications;
      }
  
      /////////////////////////////////////////
      /// NOTIFICATIONBROADCASTER INTERFACE ///
      /////////////////////////////////////////
      public void addNotificationListener( final NotificationListener listener,
                                           final NotificationFilter filter,
                                           final Object handback )
          throws java.lang.IllegalArgumentException
      {
          ((NotificationBroadcaster)m_object ).addNotificationListener( listener, filter, handback );
      }
  
      public void removeNotificationListener( final NotificationListener listener )
          throws ListenerNotFoundException
      {
          ((NotificationBroadcaster)m_object).removeNotificationListener( listener );
      }
  }
  
  
  
  1.1                  jakarta-avalon-phoenix/src/java/org/apache/jmx/introspector/DynamicMBeanFactory.java
  
  Index: DynamicMBeanFactory.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.jmx.introspector;
  
  import javax.management.DynamicMBean;
  import javax.management.MBeanInfo;
  import javax.management.NotCompliantMBeanException;
  import javax.management.NotificationBroadcaster;
  
  /**
   * This class uses introspection to create DynamicMBeans for any java object. It
   * exposes all public methods. If you wish to provide human-readable information
   * about the exposed properties and methods, you can provide your own MBeanInfo
   * object.
   *
   * @author <a href="mailto:mail@leosimons.com">Leo Simons</a>
   * @version CVS $Revision: 1.1 $ $Date: 2001/04/24 05:00:53 $
   */
  
  public class DynamicMBeanFactory
  {
      /**
       * All DynamicMBeanFactory methods are static. It is unneccessary to create
       * instances.
       */
      private DynamicMBeanFactory()
      {
      }
  
      /**
       * Get a <code>DynamicMBean</code> that represents the supplied object.
       *
       * @param obj DOC: Insert Description of Parameter
       * @return DOC: Insert Description of the Returned Value
       * @exception NotCompliantMBeanException DOC: Insert Description of
       *      Exception
       */
      public static DynamicMBean create( final Object object )
          throws NotCompliantMBeanException
      {
          if( object instanceof NotificationBroadcaster )
          {
              return new DefaultDynamicNotificationMBean( (NotificationBroadcaster)object );
          }
          else
          {
              return new DefaultDynamicMBean( object );
          }
      }
  
      /**
       * Get a <code>DynamicMBean</code> that represents the supplied object,
       * using the supplied <code>MBeanInfo</code> object.
       *
       * @exception IllegalArgumentException if the supplied object does not
       *      implement the class specified by the supplied MBeanInfo's
       *      getClassName() method.
       */
      public static DynamicMBean create( final Object object, final MBeanInfo mBeanInfo )
          throws IllegalArgumentException, NotCompliantMBeanException
      {
          if( object instanceof NotificationBroadcaster )
          {
              return new DefaultDynamicNotificationMBean( (NotificationBroadcaster)object, mBeanInfo );
          }
          else
          {
              return new DefaultDynamicMBean( object, mBeanInfo );
          }
      }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: avalon-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: avalon-dev-help@jakarta.apache.org