mx4j/src/core/mx4j/server MX4JMBeanMetaData.java,NONE,1.1 ReflectionMBeanInvoker.java,1.2,1.3 MX4JMBeanServer.java,1.19,1.20 MBeanMetaData.java,1.3,1.4 MBeanIntrospector.java,1.27,1.28 BCELMBeanInvoker.java,1.11,1.12

[email protected]
Newsgroups gmane.comp.java.mx4j.cvs
Message-ID <[email protected]>
Update of /cvsroot/mx4j/mx4j/src/core/mx4j/server
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3376/core/mx4j/server

Modified Files:
	ReflectionMBeanInvoker.java MX4JMBeanServer.java 
	MBeanMetaData.java MBeanIntrospector.java 
	BCELMBeanInvoker.java 
Added Files:
	MX4JMBeanMetaData.java 
Log Message:
Changed MBeanMetaData to be an interface instead of a class, allowing its pluggability

--- NEW FILE: MX4JMBeanMetaData.java ---
/*
 * Copyright (C) MX4J.
 * All rights reserved.
 *
 * This software is distributed under the terms of the MX4J License version 1.0.
 * See the terms of the MX4J License in the documentation provided with this software.
 */

package mx4j.server;

import javax.management.MBeanInfo;
import javax.management.ObjectInstance;
import javax.management.ObjectName;

/**
 * Default implementation of the MBeanMetaData interface.
 *
 * @author <a href="mailto:[email protected]">Simone Bordet</a>
 * @version $Revision: 1.1 $
 */
class MX4JMBeanMetaData implements MBeanMetaData
{
	private Object mbean;
	private ClassLoader classloader;
	private ObjectInstance instance;
	private ObjectName name;
	private MBeanInfo info;
	private boolean dynamic;
	private boolean standard;
	private Class management;
	private MBeanInvoker invoker;

   public Object getMBean()
   {
      return mbean;
   }

   public void setMBean(Object mbean)
   {
      this.mbean = mbean;
   }

   public ClassLoader getClassLoader()
   {
      return classloader;
   }

   public void setClassLoader(ClassLoader classloader)
   {
      this.classloader = classloader;
   }

   public ObjectName getObjectName()
   {
      return name;
   }

   public void setObjectName(ObjectName name)
   {
      this.name = name;
   }

   public MBeanInfo getMBeanInfo()
   {
      return info;
   }

   public void setMBeanInfo(MBeanInfo info)
   {
      this.info = info;
   }

   public boolean isMBeanDynamic()
   {
      return dynamic;
   }

   public void setMBeanDynamic(boolean dynamic)
   {
      this.dynamic = dynamic;
   }

   public boolean isMBeanStandard()
   {
      return standard;
   }

   public void setMBeanStandard(boolean standard)
   {
      this.standard = standard;
   }

   public Class getMBeanInterface()
   {
      return management;
   }

   public void setMBeanInterface(Class management)
   {
      this.management = management;
   }

   public MBeanInvoker getMBeanInvoker()
   {
      return invoker;
   }

   public void setMBeanInvoker(MBeanInvoker invoker)
   {
      this.invoker = invoker;
   }

   public ObjectInstance getObjectInstance()
   {
      if (instance == null)
      {
         instance = new ObjectInstance(getObjectName(), getMBeanInfo().getClassName());
         return instance;
      }

      if (isMBeanDynamic())
      {
         String clsName = getMBeanInfo().getClassName();
         if (!instance.getClassName().equals(clsName)) instance = new ObjectInstance(getObjectName(), clsName);
      }

      return instance;
   }
}

Index: ReflectionMBeanInvoker.java
===================================================================
RCS file: /cvsroot/mx4j/mx4j/src/core/mx4j/server/ReflectionMBeanInvoker.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** ReflectionMBeanInvoker.java	15 Feb 2004 21:44:20 -0000	1.2
--- ReflectionMBeanInvoker.java	24 Feb 2004 15:13:23 -0000	1.3
***************
*** 150,154 ****
        try
        {
!          return m.invoke(metadata.mbean, args);
        }
        catch (IllegalAccessException x)
--- 150,154 ----
        try
        {
!          return m.invoke(metadata.getMBean(), args);
        }
        catch (IllegalAccessException x)
***************
*** 172,176 ****
     protected MBeanOperationInfo getStandardOperationInfo(MBeanMetaData metadata, String method, String[] signature)
     {
!       MBeanOperationInfo[] opers = metadata.info.getOperations();
        if (opers != null)
        {
--- 172,176 ----
     protected MBeanOperationInfo getStandardOperationInfo(MBeanMetaData metadata, String method, String[] signature)
     {
!       MBeanOperationInfo[] opers = metadata.getMBeanInfo().getOperations();
        if (opers != null)
        {
***************
*** 209,213 ****
     protected MBeanAttributeInfo getStandardAttributeInfo(MBeanMetaData metadata, String attribute, boolean forWrite)
     {
!       MBeanAttributeInfo[] attrs = metadata.info.getAttributes();
        if (attrs != null)
        {
--- 209,213 ----
     protected MBeanAttributeInfo getStandardAttributeInfo(MBeanMetaData metadata, String attribute, boolean forWrite)
     {
!       MBeanAttributeInfo[] attrs = metadata.getMBeanInfo().getAttributes();
        if (attrs != null)
        {
***************
*** 252,257 ****
        try
        {
!          Class[] params = Utils.loadClasses(metadata.classloader, signature);
!          Method method = metadata.management.getMethod(name, params);
           return method;
        }
--- 252,257 ----
        try
        {
!          Class[] params = Utils.loadClasses(metadata.getClassLoader(), signature);
!          Method method = metadata.getMBeanInterface().getMethod(name, params);
           return method;
        }
***************
*** 266,270 ****
     }
  
!    private class BadArgumentException extends Exception
     {
        private final IllegalArgumentException nested;
--- 266,270 ----
     }
  
!    private static class BadArgumentException extends Exception
     {
        private final IllegalArgumentException nested;

Index: MX4JMBeanServer.java
===================================================================
RCS file: /cvsroot/mx4j/mx4j/src/core/mx4j/server/MX4JMBeanServer.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** MX4JMBeanServer.java	13 Dec 2003 21:29:50 -0000	1.19
--- MX4JMBeanServer.java	24 Feb 2004 15:13:23 -0000	1.20
***************
*** 169,173 ****
           invoker.addPreInterceptor(ccl);
           invoker.addPreInterceptor(notif);
!          invoker.addPostInterceptor(sec);
           invoker.addPostInterceptor(inv);
           invoker.start();
--- 169,173 ----
           invoker.addPreInterceptor(ccl);
           invoker.addPreInterceptor(notif);
!          invoker.addPreInterceptor(sec);
           invoker.addPostInterceptor(inv);
           invoker.start();
***************
*** 243,247 ****
           {
              MBeanMetaData metadata = findMBeanMetaData(name);
!             sm.checkPermission(new MBeanPermission(metadata.info.getClassName(), "-", name, "getClassLoader"));
           }
        }
--- 243,247 ----
           {
              MBeanMetaData metadata = findMBeanMetaData(name);
!             sm.checkPermission(new MBeanPermission(metadata.getMBeanInfo().getClassName(), "-", name, "getClassLoader"));
           }
        }
***************
*** 263,270 ****
        if (sm != null)
        {
!          sm.checkPermission(new MBeanPermission(metadata.info.getClassName(), "-", name, "getClassLoaderFor"));
        }
  
!       return metadata.mbean.getClass().getClassLoader();
     }
  
--- 263,270 ----
        if (sm != null)
        {
!          sm.checkPermission(new MBeanPermission(metadata.getMBeanInfo().getClassName(), "-", name, "getClassLoaderFor"));
        }
  
!       return metadata.getMBean().getClass().getClassLoader();
     }
  
***************
*** 282,288 ****
        {
           MBeanMetaData metadata = findMBeanMetaData(name);
!          if (metadata.mbean instanceof ClassLoader)
           {
!             return (ClassLoader)metadata.mbean;
           }
           else
--- 282,288 ----
        {
           MBeanMetaData metadata = findMBeanMetaData(name);
!          if (metadata.getMBean() instanceof ClassLoader)
           {
!             return (ClassLoader)metadata.getMBean();
           }
           else
***************
*** 499,503 ****
        listener = secureObjectName(listener);
  
!       Object mbean = findMBeanMetaData(listener).mbean;
        if (!(mbean instanceof NotificationListener))
        {
--- 499,503 ----
        listener = secureObjectName(listener);
  
!       Object mbean = findMBeanMetaData(listener).getMBean();
        if (!(mbean instanceof NotificationListener))
        {
***************
*** 519,523 ****
        MBeanMetaData metadata = findMBeanMetaData(observed);
  
!       Object mbean = metadata.mbean;
  
        if (!(mbean instanceof NotificationBroadcaster))
--- 519,523 ----
        MBeanMetaData metadata = findMBeanMetaData(observed);
  
!       Object mbean = metadata.getMBean();
  
        if (!(mbean instanceof NotificationBroadcaster))
***************
*** 539,543 ****
        listener = secureObjectName(listener);
  
!       Object mbean = findMBeanMetaData(listener).mbean;
        if (!(mbean instanceof NotificationListener))
        {
--- 539,543 ----
        listener = secureObjectName(listener);
  
!       Object mbean = findMBeanMetaData(listener).getMBean();
        if (!(mbean instanceof NotificationListener))
        {
***************
*** 558,562 ****
  
        MBeanMetaData metadata = findMBeanMetaData(observed);
!       Object mbean = metadata.mbean;
  
        if (!(mbean instanceof NotificationBroadcaster))
--- 558,562 ----
  
        MBeanMetaData metadata = findMBeanMetaData(observed);
!       Object mbean = metadata.getMBean();
  
        if (!(mbean instanceof NotificationBroadcaster))
***************
*** 573,577 ****
        listener = secureObjectName(listener);
  
!       Object mbean = findMBeanMetaData(listener).mbean;
        if (!(mbean instanceof NotificationListener))
        {
--- 573,577 ----
        listener = secureObjectName(listener);
  
!       Object mbean = findMBeanMetaData(listener).getMBean();
        if (!(mbean instanceof NotificationListener))
        {
***************
*** 592,596 ****
  
        MBeanMetaData metadata = findMBeanMetaData(observed);
!       Object mbean = metadata.mbean;
  
        if (!(mbean instanceof NotificationEmitter))
--- 592,596 ----
  
        MBeanMetaData metadata = findMBeanMetaData(observed);
!       Object mbean = metadata.getMBean();
  
        if (!(mbean instanceof NotificationEmitter))
***************
*** 631,635 ****
        {
           Class cls = getModifiableClassLoaderRepository().loadClass(className);
!          return instantiateImpl(className, cls.getClassLoader(), null, parameters, args).mbean;
        }
        catch (ClassNotFoundException x)
--- 631,635 ----
        {
           Class cls = getModifiableClassLoaderRepository().loadClass(className);
!          return instantiateImpl(className, cls.getClassLoader(), null, parameters, args).getMBean();
        }
        catch (ClassNotFoundException x)
***************
*** 662,666 ****
  
        ClassLoader cl = getClassLoaderImpl(loaderName);
!       return instantiateImpl(className, cl, null, parameters, args).mbean;
     }
  
--- 662,666 ----
  
        ClassLoader cl = getClassLoaderImpl(loaderName);
!       return instantiateImpl(className, cl, null, parameters, args).getMBean();
     }
  
***************
*** 672,677 ****
  
        MBeanMetaData metadata = createMBeanMetaData();
!       metadata.classloader = classloader;
!       metadata.name = secureObjectName(name);
  
        getHeadInterceptor().instantiate(metadata, className, params, args);
--- 672,677 ----
  
        MBeanMetaData metadata = createMBeanMetaData();
!       metadata.setClassLoader(classloader);
!       metadata.setObjectName(secureObjectName(name));
  
        getHeadInterceptor().instantiate(metadata, className, params, args);
***************
*** 696,700 ****
           registerImpl(metadata, false);
  
!          return metadata.instance;
        }
        catch (ClassNotFoundException x)
--- 696,700 ----
           registerImpl(metadata, false);
  
!          return metadata.getObjectInstance();
        }
        catch (ClassNotFoundException x)
***************
*** 721,725 ****
        registerImpl(metadata, false);
  
!       return metadata.instance;
     }
  
--- 721,725 ----
        registerImpl(metadata, false);
  
!       return metadata.getObjectInstance();
     }
  
***************
*** 739,749 ****
  
        MBeanMetaData metadata = createMBeanMetaData();
!       metadata.mbean = mbean;
!       metadata.classloader = mbean.getClass().getClassLoader();
!       metadata.name = secureObjectName(objectName);
  
        registerImpl(metadata, privileged);
  
!       return metadata.instance;
     }
  
--- 739,749 ----
  
        MBeanMetaData metadata = createMBeanMetaData();
!       metadata.setMBean(mbean);
!       metadata.setClassLoader(mbean.getClass().getClassLoader());
!       metadata.setObjectName(secureObjectName(objectName));
  
        registerImpl(metadata, privileged);
  
!       return metadata.getObjectInstance();
     }
  
***************
*** 753,757 ****
     private MBeanMetaData createMBeanMetaData()
     {
!       return new MBeanMetaData();
     }
  
--- 753,757 ----
     private MBeanMetaData createMBeanMetaData()
     {
!       return MBeanMetaData.Factory.create();
     }
  
***************
*** 800,806 ****
           // With this call, the MBean implementor can replace the ObjectName with a subclass that is not secure, secure it again
           head.registration(metadata, MBeanServerInterceptor.PRE_REGISTER);
!          metadata.name = secureObjectName(metadata.name);
  
!          metadata.instance = new ObjectInstance(metadata.name, metadata.info.getClassName());
  
           register(metadata, privileged);
--- 800,806 ----
           // With this call, the MBean implementor can replace the ObjectName with a subclass that is not secure, secure it again
           head.registration(metadata, MBeanServerInterceptor.PRE_REGISTER);
!          metadata.setObjectName(secureObjectName(metadata.getObjectName()));
  
! //         metadata.instance = new ObjectInstance(metadata.name, metadata.info.getClassName());
  
           register(metadata, privileged);
***************
*** 852,858 ****
        }
  
!       if (metadata.mbean instanceof ClassLoader && !(metadata.mbean instanceof PrivateClassLoader))
        {
!          ClassLoader cl = (ClassLoader)metadata.mbean;
           getModifiableClassLoaderRepository().addClassLoader(cl);
        }
--- 852,859 ----
        }
  
!       Object mbean = metadata.getMBean();
!       if (mbean instanceof ClassLoader && !(mbean instanceof PrivateClassLoader))
        {
!          ClassLoader cl = (ClassLoader)mbean;
           getModifiableClassLoaderRepository().addClassLoader(cl);
        }
***************
*** 861,867 ****
     private void register(MBeanMetaData metadata, boolean privileged) throws InstanceAlreadyExistsException
     {
!       metadata.name = normalizeObjectName(metadata.name);
  
!       ObjectName objectName = metadata.name;
        if (objectName == null || objectName.isPattern())
        {
--- 862,868 ----
     private void register(MBeanMetaData metadata, boolean privileged) throws InstanceAlreadyExistsException
     {
!       metadata.setObjectName(normalizeObjectName(metadata.getObjectName()));
  
!       ObjectName objectName = metadata.getObjectName();
        if (objectName == null || objectName.isPattern())
        {
***************
*** 948,954 ****
           getHeadInterceptor().registration(metadata, MBeanServerInterceptor.POST_DEREGISTER);
  
!          if (metadata.mbean instanceof ClassLoader && !(metadata.mbean instanceof PrivateClassLoader))
           {
!             getModifiableClassLoaderRepository().removeClassLoader((ClassLoader)metadata.mbean);
           }
        }
--- 949,956 ----
           getHeadInterceptor().registration(metadata, MBeanServerInterceptor.POST_DEREGISTER);
  
!          Object mbean = metadata.getMBean();
!          if (mbean instanceof ClassLoader && !(mbean instanceof PrivateClassLoader))
           {
!             getModifiableClassLoaderRepository().removeClassLoader((ClassLoader)mbean);
           }
        }
***************
*** 973,977 ****
     private void unregister(MBeanMetaData metadata)
     {
!       ObjectName objectName = metadata.name;
  
        MBeanRepository repository = getMBeanRepository();
--- 975,979 ----
     private void unregister(MBeanMetaData metadata)
     {
!       ObjectName objectName = metadata.getObjectName();
  
        MBeanRepository repository = getMBeanRepository();
***************
*** 1032,1036 ****
        {
           // Must check if the user has the right to call this method, regardless of the attributes
!          sm.checkPermission(new MBeanPermission(metadata.info.getClassName(), "-", objectName, "getAttribute"));
        }
  
--- 1034,1038 ----
        {
           // Must check if the user has the right to call this method, regardless of the attributes
!          sm.checkPermission(new MBeanPermission(metadata.getMBeanInfo().getClassName(), "-", objectName, "getAttribute"));
        }
  
***************
*** 1054,1058 ****
        {
           // Must check if the user has the right to call this method, regardless of the attributes
!          sm.checkPermission(new MBeanPermission(metadata.info.getClassName(), "-", objectName, "setAttribute"));
        }
  
--- 1056,1060 ----
        {
           // Must check if the user has the right to call this method, regardless of the attributes
!          sm.checkPermission(new MBeanPermission(metadata.getMBeanInfo().getClassName(), "-", objectName, "setAttribute"));
        }
  
***************
*** 1138,1145 ****
        if (sm != null)
        {
!          sm.checkPermission(new MBeanPermission(metadata.info.getClassName(), "-", objectName, "getObjectInstance"));
        }
  
!       return metadata.instance;
     }
  
--- 1140,1147 ----
        if (sm != null)
        {
!          sm.checkPermission(new MBeanPermission(metadata.getMBeanInfo().getClassName(), "-", objectName, "getObjectInstance"));
        }
  
!       return metadata.getObjectInstance();
     }
  
***************
*** 1159,1179 ****
        if (sm != null)
        {
!          sm.checkPermission(new MBeanPermission(metadata.info.getClassName(), "-", objectName, "isInstanceOf"));
        }
  
        try
        {
!          ClassLoader loader = metadata.classloader;
           if (loader == null) loader = Thread.currentThread().getContextClassLoader();
           Class cls = loader.loadClass(className);
  
!          if (metadata.mbean instanceof StandardMBean)
           {
!             Object impl = ((StandardMBean)metadata.mbean).getImplementation();
              return cls.isInstance(impl);
           }
           else
           {
!             return cls.isInstance(metadata.mbean);
           }
        }
--- 1161,1182 ----
        if (sm != null)
        {
!          sm.checkPermission(new MBeanPermission(metadata.getMBeanInfo().getClassName(), "-", objectName, "isInstanceOf"));
        }
  
        try
        {
!          ClassLoader loader = metadata.getClassLoader();
           if (loader == null) loader = Thread.currentThread().getContextClassLoader();
           Class cls = loader.loadClass(className);
  
!          Object mbean = metadata.getMBean();
!          if (mbean instanceof StandardMBean)
           {
!             Object impl = ((StandardMBean)mbean).getImplementation();
              return cls.isInstance(impl);
           }
           else
           {
!             return cls.isInstance(mbean);
           }
        }
***************
*** 1204,1208 ****
           {
              MBeanMetaData metadata = findMBeanMetaData(name);
!             set.add(metadata.instance);
           }
           catch (InstanceNotFoundException ignored)
--- 1207,1211 ----
           {
              MBeanMetaData metadata = findMBeanMetaData(name);
!             set.add(metadata.getObjectInstance());
           }
           catch (InstanceNotFoundException ignored)
***************
*** 1284,1288 ****
        {
           MBeanMetaData metadata = (MBeanMetaData)i.next();
!          ObjectName name = metadata.name;
           Hashtable props = name.getKeyPropertyList();
  
--- 1287,1291 ----
        {
           MBeanMetaData metadata = (MBeanMetaData)i.next();
!          ObjectName name = metadata.getObjectName();
           Hashtable props = name.getKeyPropertyList();
  
***************
*** 1368,1372 ****
           {
              MBeanMetaData metadata = findMBeanMetaData(name);
!             String className = metadata.info.getClassName();
              sm.checkPermission(new MBeanPermission(className, "-", name, instances ? "queryMBeans" : "queryNames"));
              set.add(name);
--- 1371,1375 ----
           {
              MBeanMetaData metadata = findMBeanMetaData(name);
!             String className = metadata.getMBeanInfo().getClassName();
              sm.checkPermission(new MBeanPermission(className, "-", name, instances ? "queryMBeans" : "queryNames"));
              set.add(name);

Index: MBeanMetaData.java
===================================================================
RCS file: /cvsroot/mx4j/mx4j/src/core/mx4j/server/MBeanMetaData.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** MBeanMetaData.java	8 Jun 2002 12:59:25 -0000	1.3
--- MBeanMetaData.java	24 Feb 2004 15:13:23 -0000	1.4
***************
*** 9,67 ****
  package mx4j.server;
  
  import javax.management.MBeanInfo;
  import javax.management.ObjectInstance;
! import javax.management.ObjectName;
  
  /**
   * Objects of this class hold metadata information about MBeans.
!  *
   * @author <a href="mailto:[email protected]">Simone Bordet</a>
   * @version $Revision$
   */
! public class MBeanMetaData
  {
! 	/**
! 	 * The MBean instance.
! 	 */
! 	public Object mbean;
  
! 	/**
! 	 * The classloader of the MBean
! 	 */
! 	public ClassLoader classloader;
  
! 	/**
! 	 * The ObjectInstance of the MBean
! 	 */
! 	public ObjectInstance instance;
  
! 	/**
! 	 * The ObjectName of the MBean
! 	 */
! 	public ObjectName name;
  
! 	/**
! 	 * The MBeanInfo of the MBean
! 	 */
! 	public MBeanInfo info;
  
! 	/**
! 	 * True if the MBean is dynamic
! 	 */
! 	public boolean dynamic;
  
! 	/**
! 	 * True if the MBean is standard
! 	 */
! 	public boolean standard;
  
! 	/**
! 	 * The management interface of the MBean, if it is a standard MBean
! 	 */
! 	public Class management;
  
! 	/**
! 	 * The invoker for the MBean, if it is a standard MBean
! 	 */
! 	public MBeanInvoker invoker;
  }
--- 9,158 ----
  package mx4j.server;
  
+ import java.security.AccessController;
+ import java.security.PrivilegedAction;
+ 
+ import javax.management.ObjectName;
  import javax.management.MBeanInfo;
  import javax.management.ObjectInstance;
! 
! import mx4j.MX4JSystemKeys;
  
  /**
   * Objects of this class hold metadata information about MBeans.
!  * @see Factory
   * @author <a href="mailto:[email protected]">Simone Bordet</a>
   * @version $Revision$
   */
! public interface MBeanMetaData
  {
!    /**
!     * Sets the MBean instance
!     * @see #getMBean
!     */
!    public void setMBean(Object mbean);
  
!    /**
!     * Returns the MBean instance
!     * @see #setMBean
!     */
!    public Object getMBean();
  
!    /**
!     * Sets the classloader for the MBean
!     * @see #getClassLoader
!     */
!    public void setClassLoader(ClassLoader loader);
  
!    /**
!     * Returns the classloader for the MBean
!     * @see #setClassLoader
!     */
!    public ClassLoader getClassLoader();
  
!    /**
!     * Sets the ObjectName of the MBean
!     * @see #getObjectName
!     */
!    public void setObjectName(ObjectName name);
  
!    /**
!     * Returns the ObjectName of the MBean
!     * @see #setObjectName
!     */
!    public ObjectName getObjectName();
  
!    /**
!     * Sets the MBeanInfo of the MBean
!     * @see #getMBeanInfo
!     */
!    public void setMBeanInfo(MBeanInfo info);
  
!    /**
!     * Returns the MBeanInfo of the MBean
!     * @see #setMBeanInfo
!     */
!    public MBeanInfo getMBeanInfo();
  
!    /**
!     * Sets the management interface of the standard MBean
!     * @see #getMBeanInterface
!     */
!    public void setMBeanInterface(Class management);
! 
!    /**
!     * Returns the management interface of the standard MBean
!     * @see #setMBeanInterface
!     */
!    public Class getMBeanInterface();
! 
!    /**
!     * Sets whether the MBean is standard
!     * @see #isMBeanStandard
!     */
!    public void setMBeanStandard(boolean value);
! 
!    /**
!     * Returns whether the MBean is standard
!     * @see #setMBeanStandard
!     */
!    public boolean isMBeanStandard();
! 
!    /**
!     * Sets whether the MBean is dynamic
!     * @see #isMBeanDynamic
!     */
!    public void setMBeanDynamic(boolean value);
! 
!    /**
!     * Returns whether the MBean is dynamic
!     * @see #setMBeanDynamic
!     */
!    public boolean isMBeanDynamic();
! 
!    /**
!     * Sets the MBeanInvoker of the standard MBean
!     * @see #getMBeanInvoker
!     */
!    public void setMBeanInvoker(MBeanInvoker invoker);
! 
!    /**
!     * Returns the MBeanInvoker of the standard MBean
!     * @see #getMBeanInvoker
!     */
!    public MBeanInvoker getMBeanInvoker();
! 
!    /**
!     * Returns the ObjectInstance of the MBean
!     * @see #getMBeanInfo
!     * @see #getObjectName
!     */
!    public ObjectInstance getObjectInstance();
! 
!    /**
!     * Factory class that creates instance of the {@link MBeanMetaData} interface.
!     * The default implementation is {@link MX4JMBeanMetaData}, but it can be overridden
!     * by setting the system property defined by {@link MX4JSystemKeys#MX4J_MBEAN_METADATA}.
!     */
!    public static class Factory
!    {
!       public static MBeanMetaData create()
!       {
!          String className = (String)AccessController.doPrivileged(new PrivilegedAction()
!          {
!             public Object run()
!             {
!                return System.getProperty(MX4JSystemKeys.MX4J_MBEAN_METADATA);
!             }
!          });
!          if (className == null) className = "mx4j.server.MX4JMBeanMetaData";
!          try
!          {
!             return (MBeanMetaData)Thread.currentThread().getContextClassLoader().loadClass(className).newInstance();
!          }
!          catch (Exception x)
!          {
!             throw new Error(x.toString());
!          }
!       }
!    }
  }

Index: MBeanIntrospector.java
===================================================================
RCS file: /cvsroot/mx4j/mx4j/src/core/mx4j/server/MBeanIntrospector.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** MBeanIntrospector.java	21 Feb 2004 17:52:59 -0000	1.27
--- MBeanIntrospector.java	24 Feb 2004 15:13:23 -0000	1.28
***************
*** 143,149 ****
        // but the management interface must be public
        Logger logger = getLogger();
!       if (metadata.management != null)
        {
!          boolean isPublic = Modifier.isPublic(metadata.management.getModifiers());
           if (!isPublic && logger.isEnabledFor(Logger.DEBUG)) logger.debug("MBean interface is not public");
           return isPublic;
--- 143,149 ----
        // but the management interface must be public
        Logger logger = getLogger();
!       if (metadata.getMBeanInterface() != null)
        {
!          boolean isPublic = Modifier.isPublic(metadata.getMBeanInterface().getModifiers());
           if (!isPublic && logger.isEnabledFor(Logger.DEBUG)) logger.debug("MBean interface is not public");
           return isPublic;
***************
*** 156,165 ****
        Logger logger = getLogger();
  
!       if (metadata.standard && metadata.dynamic)
        {
           if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("MBean is both standard and dynamic");
           return false;
        }
!       if (!metadata.standard && !metadata.dynamic)
        {
           if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("MBean is not standard nor dynamic");
--- 156,165 ----
        Logger logger = getLogger();
  
!       if (metadata.isMBeanStandard() && metadata.isMBeanDynamic())
        {
           if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("MBean is both standard and dynamic");
           return false;
        }
!       if (!metadata.isMBeanStandard() && !metadata.isMBeanDynamic())
        {
           if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("MBean is not standard nor dynamic");
***************
*** 174,178 ****
        Logger logger = getLogger();
  
!       if (metadata.info == null)
        {
           if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("MBeanInfo is null");
--- 174,178 ----
        Logger logger = getLogger();
  
!       if (metadata.getMBeanInfo() == null)
        {
           if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("MBeanInfo is null");
***************
*** 185,189 ****
     {
        // Some information is already provided (StandardMBean)
!       if (metadata.standard)
        {
           introspectStandardMBean(metadata);
--- 185,189 ----
     {
        // Some information is already provided (StandardMBean)
!       if (metadata.isMBeanStandard())
        {
           introspectStandardMBean(metadata);
***************
*** 191,202 ****
        }
  
!       if (metadata.mbean instanceof DynamicMBean)
        {
!          metadata.dynamic = true;
           return;
        }
        else
        {
!          metadata.dynamic = false;
           // Continue and see if it's a plain standard MBean
        }
--- 191,202 ----
        }
  
!       if (metadata.getMBean() instanceof DynamicMBean)
        {
!          metadata.setMBeanDynamic(true);
           return;
        }
        else
        {
!          metadata.setMBeanDynamic(false);
           // Continue and see if it's a plain standard MBean
        }
***************
*** 208,217 ****
     private void introspectStandardMBean(MBeanMetaData metadata)
     {
!       if (metadata.management != null)
        {
           // Be sure the MBean implements the management interface
!          if (metadata.management.isInstance(metadata.mbean))
           {
!             if (metadata.invoker == null) metadata.invoker = createInvoker(metadata);
              return;
           }
--- 208,218 ----
     private void introspectStandardMBean(MBeanMetaData metadata)
     {
!       Class management = metadata.getMBeanInterface();
!       if (management != null)
        {
           // Be sure the MBean implements the management interface
!          if (management.isInstance(metadata.getMBean()))
           {
!             metadata.setMBeanInvoker(createInvoker(metadata));
              return;
           }
***************
*** 219,225 ****
           {
              // Not compliant, reset the values
!             metadata.standard = false;
!             metadata.management = null;
!             metadata.invoker = null;
              return;
           }
--- 220,226 ----
           {
              // Not compliant, reset the values
!             metadata.setMBeanStandard(false);
!             metadata.setMBeanInterface(null);
!             metadata.setMBeanInvoker(null);
              return;
           }
***************
*** 227,231 ****
        else
        {
!          Class cls = metadata.mbean.getClass();
           for (Class c = cls; c != null; c = c.getSuperclass())
           {
--- 228,232 ----
        else
        {
!          Class cls = metadata.getMBean().getClass();
           for (Class c = cls; c != null; c = c.getSuperclass())
           {
***************
*** 238,244 ****
                 {
                    // OK, found the MBean interface for this class
!                   metadata.standard = true;
!                   metadata.management = intf;
!                   metadata.invoker = createInvoker(metadata);
                    return;
                 }
--- 239,245 ----
                 {
                    // OK, found the MBean interface for this class
!                   metadata.setMBeanStandard(true);
!                   metadata.setMBeanInterface(intf);
!                   metadata.setMBeanInvoker(createInvoker(metadata));
                    return;
                 }
***************
*** 247,253 ****
  
           // Management interface not found, it's not compliant, reset the values
!          metadata.standard = false;
!          metadata.management = null;
!          metadata.invoker = null;
        }
     }
--- 248,254 ----
  
           // Management interface not found, it's not compliant, reset the values
!          metadata.setMBeanStandard(false);
!          metadata.setMBeanInterface(null);
!          metadata.setMBeanInvoker(null);
        }
     }
***************
*** 255,270 ****
     private void introspectMBeanInfo(MBeanMetaData metadata)
     {
!       if (metadata.dynamic)
        {
!          metadata.info = getDynamicMBeanInfo(metadata);
        }
!       else if (metadata.standard)
        {
!          metadata.info = createStandardMBeanInfo(metadata);
        }
        else
        {
           // Not a valid MBean, reset the MBeanInfo: this will cause an exception later
!          metadata.info = null;
        }
     }
--- 256,271 ----
     private void introspectMBeanInfo(MBeanMetaData metadata)
     {
!       if (metadata.isMBeanDynamic())
        {
!          metadata.setMBeanInfo(getDynamicMBeanInfo(metadata));
        }
!       else if (metadata.isMBeanStandard())
        {
!          metadata.setMBeanInfo(createStandardMBeanInfo(metadata));
        }
        else
        {
           // Not a valid MBean, reset the MBeanInfo: this will cause an exception later
!          metadata.setMBeanInfo(null);
        }
     }
***************
*** 278,282 ****
        try
        {
!          info = ((DynamicMBean)metadata.mbean).getMBeanInfo();
        }
        catch (Exception x)
--- 279,283 ----
        try
        {
!          info = ((DynamicMBean)metadata.getMBean()).getMBeanInfo();
        }
        catch (Exception x)
***************
*** 300,304 ****
        synchronized (mbeanInfoCache)
        {
!          MBeanInfo info = (MBeanInfo)mbeanInfoCache.get(metadata.mbean.getClass());
           if (info != null) return info;
        }
--- 301,305 ----
        synchronized (mbeanInfoCache)
        {
!          MBeanInfo info = (MBeanInfo)mbeanInfoCache.get(metadata.getMBean().getClass());
           if (info != null) return info;
        }
***************
*** 316,324 ****
        if (notifs == null) return null;
  
!       MBeanInfo info = new MBeanInfo(metadata.mbean.getClass().getName(), description.getMBeanDescription(), attrs, ctors, opers, notifs);
        synchronized (mbeanInfoCache)
        {
           // Overwrite if already present, we've been unlucky
!          mbeanInfoCache.put(metadata.mbean.getClass(), info);
        }
        return info;
--- 317,325 ----
        if (notifs == null) return null;
  
!       MBeanInfo info = new MBeanInfo(metadata.getMBean().getClass().getName(), description.getMBeanDescription(), attrs, ctors, opers, notifs);
        synchronized (mbeanInfoCache)
        {
           // Overwrite if already present, we've been unlucky
!          mbeanInfoCache.put(metadata.getMBean().getClass(), info);
        }
        return info;
***************
*** 337,346 ****
  
        // Use full qualified name only
!       String descrClassName = metadata.management.getName() + "MBeanDescription";
        // Try to load the class
        try
        {
           Class descrClass = null;
!          ClassLoader loader = metadata.classloader;
           if (loader == null) loader = Thread.currentThread().getContextClassLoader();
           // Optimize lookup of the description class in case of MLets: we lookup the description class
--- 338,347 ----
  
        // Use full qualified name only
!       String descrClassName = metadata.getMBeanInterface().getName() + "MBeanDescription";
        // Try to load the class
        try
        {
           Class descrClass = null;
!          ClassLoader loader = metadata.getClassLoader();
           if (loader == null) loader = Thread.currentThread().getContextClassLoader();
           // Optimize lookup of the description class in case of MLets: we lookup the description class
***************
*** 378,382 ****
        ArrayList operations = new ArrayList();
  
!       Method[] methods = metadata.management.getMethods();
        for (int j = 0; j < methods.length; ++j)
        {
--- 379,383 ----
        ArrayList operations = new ArrayList();
  
!       Method[] methods = metadata.getMBeanInterface().getMethods();
        for (int j = 0; j < methods.length; ++j)
        {
***************
*** 411,415 ****
        HashMap getterNames = new HashMap();
  
!       Method[] methods = metadata.management.getMethods();
        for (int j = 0; j < methods.length; ++j)
        {
--- 412,416 ----
        HashMap getterNames = new HashMap();
  
!       Method[] methods = metadata.getMBeanInterface().getMethods();
        for (int j = 0; j < methods.length; ++j)
        {
***************
*** 511,517 ****
     {
        MBeanNotificationInfo[] notifs = null;
!       if (metadata.mbean instanceof NotificationBroadcaster)
        {
!          notifs = ((NotificationBroadcaster)metadata.mbean).getNotificationInfo();
        }
        if (notifs == null || notifs.length == 0) notifs = EMPTY_NOTIFICATIONS;
--- 512,519 ----
     {
        MBeanNotificationInfo[] notifs = null;
!       Object mbean = metadata.getMBean();
!       if (mbean instanceof NotificationBroadcaster)
        {
!          notifs = ((NotificationBroadcaster)mbean).getNotificationInfo();
        }
        if (notifs == null || notifs.length == 0) notifs = EMPTY_NOTIFICATIONS;
***************
*** 521,525 ****
     private MBeanConstructorInfo[] createMBeanConstructorInfo(MBeanMetaData metadata, MBeanDescription descrs)
     {
!       Class mbeanClass = metadata.mbean.getClass();
  
        Constructor[] ctors = mbeanClass.getConstructors();
--- 523,527 ----
     private MBeanConstructorInfo[] createMBeanConstructorInfo(MBeanMetaData metadata, MBeanDescription descrs)
     {
!       Class mbeanClass = metadata.getMBean().getClass();
  
        Constructor[] ctors = mbeanClass.getConstructors();
***************
*** 584,588 ****
        synchronized (mbeanInvokerCache)
        {
!          invoker = (MBeanInvoker)mbeanInvokerCache.get(metadata.management);
           if (invoker != null) return invoker;
        }
--- 586,590 ----
        synchronized (mbeanInvokerCache)
        {
!          invoker = (MBeanInvoker)mbeanInvokerCache.get(metadata.getMBeanInterface());
           if (invoker != null) return invoker;
        }
***************
*** 609,618 ****
           {
              invoker = BCELMBeanInvoker.create(metadata);
!             if (logger.isEnabledFor(Logger.TRACE)) logger.trace("Using default BCEL MBeanInvoker for MBean " + metadata.name + ", " + invoker);
           }
           else
           {
              invoker = new CachingReflectionMBeanInvoker();
!             if (logger.isEnabledFor(Logger.TRACE)) logger.trace("Using default Reflection MBeanInvoker for MBean " + metadata.name + ", " + invoker);
           }
        }
--- 611,620 ----
           {
              invoker = BCELMBeanInvoker.create(metadata);
!             if (logger.isEnabledFor(Logger.TRACE)) logger.trace("Using default BCEL MBeanInvoker for MBean " + metadata.getObjectName() + ", " + invoker);
           }
           else
           {
              invoker = new CachingReflectionMBeanInvoker();
!             if (logger.isEnabledFor(Logger.TRACE)) logger.trace("Using default Reflection MBeanInvoker for MBean " + metadata.getObjectName() + ", " + invoker);
           }
        }
***************
*** 621,625 ****
        {
           // Overwrite if already present: we've been unlucky
!          mbeanInvokerCache.put(metadata.management, invoker);
        }
        return invoker;
--- 623,627 ----
        {
           // Overwrite if already present: we've been unlucky
!          mbeanInvokerCache.put(metadata.getMBeanInterface(), invoker);
        }
        return invoker;

Index: BCELMBeanInvoker.java
===================================================================
RCS file: /cvsroot/mx4j/mx4j/src/core/mx4j/server/BCELMBeanInvoker.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** BCELMBeanInvoker.java	2 Feb 2004 17:32:12 -0000	1.11
--- BCELMBeanInvoker.java	24 Feb 2004 15:13:23 -0000	1.12
***************
*** 145,149 ****
              public Object run() throws Exception
              {
!                Class cls = new BCELClassLoader(metadata.classloader, bytes).loadClass(name);
                 return cls.newInstance();
              }
--- 145,149 ----
              public Object run() throws Exception
              {
!                Class cls = new BCELClassLoader(metadata.getClassLoader(), bytes).loadClass(name);
                 return cls.newInstance();
              }
***************
*** 179,183 ****
        InstructionFactory factory = new InstructionFactory(classGen);
  
!       Method[] methods = metadata.management.getMethods();
        List tests = new ArrayList();
        List catches = new ArrayList();
--- 179,183 ----
        InstructionFactory factory = new InstructionFactory(classGen);
  
!       Method[] methods = metadata.getMBeanInterface().getMethods();
        List tests = new ArrayList();
        List catches = new ArrayList();
***************
*** 185,189 ****
        {
           Method method = methods[i];
!          catches.addAll(generateDirectInvokeBranch(classGen, mthd, implementation, factory, metadata.management.getName(), method, tests));
        }
  
--- 185,189 ----
        {
           Method method = methods[i];
!          catches.addAll(generateDirectInvokeBranch(classGen, mthd, implementation, factory, metadata.getMBeanInterface().getName(), method, tests));
        }
  
***************
*** 269,273 ****
        // It's also the start of the try block
        InstructionHandle tryStart = implementation.append(factory.createLoad(new ObjectType(MBeanMetaData.class.getName()), 1));
!       implementation.append(factory.createGetField(MBeanMetaData.class.getName(), "mbean", Type.OBJECT));
        // Cast the 'mbean' field to the proper type, the stack will contain the casted mbean
        implementation.append(factory.createCheckCast(new ObjectType(management)));
--- 269,273 ----
        // It's also the start of the try block
        InstructionHandle tryStart = implementation.append(factory.createLoad(new ObjectType(MBeanMetaData.class.getName()), 1));
!       implementation.append(factory.createInvoke(MBeanMetaData.class.getName(), "getMBean", Type.OBJECT, new Type[0], Constants.INVOKEVIRTUAL));
        // Cast the 'mbean' field to the proper type, the stack will contain the casted mbean
        implementation.append(factory.createCheckCast(new ObjectType(management)));



-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.