You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/03/07 23:24:08 UTC

svn commit: r1298167 - in /openejb/trunk/openejb: container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openejb/config/ container/openejb-core/src/main/java/org/apache/openejb/monitor...

Author: rmannibucau
Date: Wed Mar  7 22:24:07 2012
New Revision: 1298167

URL: http://svn.apache.org/viewvc?rev=1298167&view=rev
Log:
rewriting the way we register @MBean. Using finder in ejbmodules, additional libs and connector modules. Deploying in assembler (it deployed in config phase). Better logging.

Added:
    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java
Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java
    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java
    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java
    openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java Wed Mar  7 22:24:07 2012
@@ -18,7 +18,9 @@ package org.apache.openejb.assembler.cla
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
 import java.util.TreeSet;
 
 /**
@@ -39,5 +41,6 @@ public class AppInfo extends InfoObject 
     public final JndiEncInfo globalJndiEnc = new JndiEncInfo();
     public final JndiEncInfo appJndiEnc = new JndiEncInfo();
     public String cmpMappingsXml;
-    public Set<String> jmx = new TreeSet<String>();
+    public Map<String, String> jmx = new TreeMap<String, String>();
+    public Set<String> mbeans = new TreeSet<String>();
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Wed Mar  7 22:24:07 2012
@@ -66,7 +66,9 @@ import org.apache.openejb.core.transacti
 import org.apache.openejb.javaagent.Agent;
 import org.apache.openejb.loader.Options;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.monitoring.DynamicMBeanWrapper;
 import org.apache.openejb.monitoring.LocalMBeanServer;
+import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.persistence.JtaEntityManagerRegistry;
 import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
 import org.apache.openejb.resource.GeronimoConnectionManagerFactory;
@@ -95,6 +97,8 @@ import org.apache.xbean.recipe.ObjectRec
 import org.apache.xbean.recipe.Option;
 import org.apache.xbean.recipe.UnsetPropertiesRecipe;
 
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.management.InstanceNotFoundException;
 import javax.management.MBeanRegistrationException;
 import javax.management.MBeanServer;
@@ -871,6 +875,21 @@ public class Assembler extends Assembler
                 containerSystemContext.rebind(path, value.getValue());
             }
 
+            // deploy MBeans
+            for (String mbean : appInfo.mbeans) {
+                deployMBean(appContext.getBeanManager(), classLoader, mbean, appInfo.jmx, appInfo.appId);
+            }
+            for (EjbJarInfo ejbJarInfo : appInfo.ejbJars) {
+                for (String mbean : ejbJarInfo.mbeans) {
+                    deployMBean(appContext.getBeanManager(), classLoader, mbean, appInfo.jmx, ejbJarInfo.moduleName);
+                }
+            }
+            for (ConnectorInfo connectorInfo : appInfo.connectors) {
+                for (String mbean : connectorInfo.mbeans) {
+                    deployMBean(appContext.getBeanManager(), classLoader, mbean, appInfo.jmx, appInfo.appId + ".add-lib");
+                }
+            }
+
 
             logger.info("createApplication.success", appInfo.path);
 
@@ -890,6 +909,33 @@ public class Assembler extends Assembler
         }
     }
 
+    private static void deployMBean(final BeanManager bm, final ClassLoader cl, final String mbeanClass, final Map<String, String> appMbeans, final String id) {
+        final Class<?> clazz;
+        try {
+            clazz = cl.loadClass(mbeanClass);
+        } catch (ClassNotFoundException e) {
+            throw new OpenEJBRuntimeException(e);
+        }
+        final Set<Bean<?>> beans = bm.getBeans(clazz);
+        final Bean bean = bm.resolve(beans);
+        final Object instance = bm.getReference(bean, clazz, bm.createCreationalContext(bean));
+
+        final MBeanServer server = LocalMBeanServer.get();
+        try {
+            final ObjectName leaf =  new ObjectNameBuilder("openejb.user.mbeans")
+                .set("group", clazz.getPackage().getName())
+                .set("application", id)
+                .set("name", clazz.getSimpleName())
+                .build();
+
+            server.registerMBean(new DynamicMBeanWrapper(instance), leaf);
+            appMbeans.put(mbeanClass, leaf.getCanonicalName());
+            logger.info("MBean(" + leaf.getCanonicalName() + ")");
+        } catch (Exception e) {
+            logger.error("the mbean " + mbeanClass + " can't be registered", e);
+        }
+    }
+
     private void ensureWebBeansContext(AppContext appContext) {
         WebBeansContext webBeansContext = appContext.get(WebBeansContext.class);
         if (webBeansContext == null) webBeansContext = appContext.getWebBeansContext();
@@ -1245,7 +1291,7 @@ public class Assembler extends Assembler
 
         // mbeans
         MBeanServer server = LocalMBeanServer.get();
-        for (String objectName : appInfo.jmx) {
+        for (String objectName : appInfo.jmx.values()) {
             try {
               ObjectName on = new ObjectName(objectName);
               if (server.isRegistered(on)) {

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java Wed Mar  7 22:24:07 2012
@@ -36,4 +36,5 @@ public class ConnectorInfo extends Commo
     public List<ResourceInfo> outbound = new ArrayList<ResourceInfo>();
     public List<MdbContainerInfo> inbound = new ArrayList<MdbContainerInfo>();
     public List<ResourceInfo> adminObject = new ArrayList<ResourceInfo>();
+    public Set<String> mbeans = new TreeSet<String>();
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java Wed Mar  7 22:24:07 2012
@@ -56,4 +56,5 @@ public class EjbJarInfo extends CommonIn
 
     public BeansInfo beans;
     public Set<String> repositories = new TreeSet<String>();
+    public Set<String> mbeans = new TreeSet<String>();
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Wed Mar  7 22:24:07 2012
@@ -1015,8 +1015,8 @@ public class AnnotationDeployer implemen
             }
 
            /*
-                    * REST
-                    */
+            * REST
+            */
             // get by annotations
             webModule.getRestClasses().addAll(findRestClasses(webModule, finder));
             // Applications with a default constructor

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java Wed Mar  7 22:24:07 2012
@@ -102,7 +102,7 @@ class AppInfoBuilder {
         appInfo.path = appModule.getJarLocation();
         appInfo.standaloneModule = appModule.isStandaloneModule();
         appInfo.watchedResources.addAll(appModule.getWatchedResources());
-        appInfo.jmx = appModule.getMBeans();
+        appInfo.mbeans = appModule.getAdditionalLibMbeans();
 
         if (appInfo.appId == null) throw new IllegalArgumentException("AppInfo.appId cannot be null");
         if (appInfo.path == null) appInfo.path = appInfo.appId;
@@ -134,6 +134,7 @@ class AppInfoBuilder {
         for (EjbModule ejbModule : appModule.getEjbModules()) {
             try {
                 EjbJarInfo ejbJarInfo = ejbJarInfoBuilder.buildInfo(ejbModule);
+                ejbJarInfo.mbeans = ejbModule.getMbeans();
 
                 Map<String, EjbDeployment> deploymentsByEjbName = ejbModule.getOpenejbJar().getDeploymentsByEjbName();
 
@@ -356,6 +357,7 @@ class AppInfoBuilder {
             connectorInfo.watchedResources.addAll(connectorModule.getWatchedResources());
             connectorInfo.validationInfo = ValidatorBuilder.getInfo(connectorModule.getValidationConfig());
             connectorInfo.uniqueId = connectorModule.getUniqueId();
+            connectorInfo.mbeans = connectorModule.getMbeans();
 
             List<URL> libraries = connectorModule.getLibraries();
             for (URL url : libraries) {

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java Wed Mar  7 22:24:07 2012
@@ -16,8 +16,6 @@
  */
 package org.apache.openejb.config;
 
-import java.util.HashSet;
-
 import org.apache.openejb.config.sys.Resource;
 import org.apache.openejb.jee.Application;
 import org.apache.openejb.jee.jpa.EntityMappings;
@@ -28,6 +26,7 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -55,7 +54,7 @@ public class AppModule implements Deploy
     private final Map<String,Object> altDDs = new HashMap<String,Object>();
     private final Set<String> watchedResources = new TreeSet<String>();
     private final boolean standaloneModule;
-    private Set<String> mBeans = new HashSet<String>();
+    private final Set<String> additionalLibMbeans = new TreeSet<String>();
 
     private ID id;
 
@@ -102,12 +101,8 @@ public class AppModule implements Deploy
         this.standaloneModule = standaloneModule;
     }
 
-    public Set<String> getMBeans() {
-        return mBeans;
-    }
-
-    public void setMBeans(Set<String> mBeans) {
-        this.mBeans = mBeans;
+    public Set<String> getAdditionalLibMbeans() {
+        return additionalLibMbeans;
     }
 
     public boolean isStandaloneModule() {

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java Wed Mar  7 22:24:07 2012
@@ -17,17 +17,14 @@
 package org.apache.openejb.config;
 
 import org.apache.openejb.jee.ApplicationClient;
-import org.apache.openejb.jee.oejb3.OpenejbJar;
 import org.apache.xbean.finder.IAnnotationFinder;
 
+import java.io.File;
 import java.net.URI;
-import java.util.Map;
-import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.HashSet;
 import java.util.concurrent.atomic.AtomicReference;
-import java.io.File;
 
 /**
  * @version $Rev$ $Date$

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java Wed Mar  7 22:24:07 2012
@@ -16,60 +16,52 @@
  */
 package org.apache.openejb.config;
 
-import org.apache.openejb.OpenEJB;
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.api.internal.Internal;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.monitoring.DynamicMBeanWrapper;
-import org.apache.openejb.monitoring.LocalMBeanServer;
-import org.apache.openejb.monitoring.ObjectNameBuilder;
-import org.apache.openejb.util.AnnotationUtil;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
-import org.apache.xbean.finder.ClassFinder;
+import org.apache.xbean.finder.Annotated;
+import org.apache.xbean.finder.AnnotationFinder;
+import org.apache.xbean.finder.IAnnotationFinder;
 
 import javax.management.MBean;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
 import java.net.URL;
-import java.net.URLClassLoader;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
 
 public class MBeanDeployer implements DynamicDeployer {
     private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP_CONFIG, MBeanDeployer.class);
-    private static final MBeanServer server = LocalMBeanServer.get();
 
-    private static final String OPENEJB_MBEAN_CLASSES_PROPERTY = "openejb.user.mbeans.list";
-    private static final String OPENEJB_MBEAN_CLASSES_SPLIT = ",";
-    private static final String OPENEJB_MBEAN_FORCE_FINDER = "*";
+    // mbeans ObjectNames are stored in the app since they are global and that's easier
+    // mbean classes themself are stored in modules since they depend only on them
 
-    @Override public AppModule deploy(AppModule appModule) throws OpenEJBException {
+    @Override
+    public AppModule deploy(AppModule appModule) throws OpenEJBException {
         logger.debug("looking for annotated MBeans in " + appModule.getModuleId());
-        Set<String> mbeans = new TreeSet<String>();
+        final List<String> done = new ArrayList<String>();
+
+        // there is an ejbmodule by webapp so we should't need to go through the webapp
 
-        deploy(mbeans, appModule.getClassLoader(), appModule.getModuleId());
-        List<String> done = new ArrayList<String>();
-        for (WebModule webModule : appModule.getWebModules()) {
-            deploy(mbeans, webModule.getClassLoader(), webModule.getModuleId());
-            done.add(webModule.getJarLocation());
-        }
         for (EjbModule ejbModule : appModule.getEjbModules()) {
-            if (!done.contains(ejbModule.getJarLocation())) {
-                deploy(mbeans, ejbModule.getClassLoader(), ejbModule.getModuleId());
-                done.add(ejbModule.getJarLocation());
+            for (Annotated<Class<?>> clazz : ejbModule.getFinder().findMetaAnnotatedClasses(MBean.class)) {
+                final Class<?> realClass = clazz.get();
+                final String name = clazz.get().getName();
+                if (done.contains(name)) {
+                    continue;
+                }
+
+                ejbModule.getMbeans().add(name);
+                done.add(name);
             }
         }
         for (ClientModule clientModule : appModule.getClientModules()) {
-            if (!done.contains(clientModule.getJarLocation())) {
-                deploy(mbeans, clientModule.getClassLoader(), clientModule.getModuleId());
-                done.add(clientModule.getJarLocation());
+            for (Annotated<Class<?>> clazz : clientModule.getFinder().findMetaAnnotatedClasses(MBean.class)) {
+                final String name = clazz.get().getName();
+                if (done.contains(name)) {
+                    continue;
+                }
+
+                clientModule.getMbeans().add(name);
             }
         }
 
@@ -84,93 +76,18 @@ public class MBeanDeployer implements Dy
             }
         }
         if (libs.size() > 0) {
-            ClassLoader additionnalLibCl = new URLClassLoader(libs.toArray(new URL[libs.size()]));
-            deploy(mbeans, additionnalLibCl, appModule.getModuleId() + ".add-lib");
-        }
-
-        appModule.setMBeans(mbeans);
-        logger.debug("registered " + mbeans.size() + " annotated MBeans in " + appModule.getModuleId());
-        return appModule;
-    }
-
-    private static void deploy(Set<String> mbeans, ClassLoader cl, String id) {
-        if (cl == null) {
-            return;
-        }
-
-        for (Map.Entry<Class<?>, ObjectName> mbean : getMbeanClasses(cl, id).entrySet()) {
-            ObjectName objectName = mbean.getValue();
-            try {
-                server.registerMBean(new DynamicMBeanWrapper(mbean.getKey()), objectName);
-                mbeans.add(objectName.getCanonicalName());
-                logger.info("MBean " + objectName.getCanonicalName() + " registered.");
-            } catch (Exception e) {
-                logger.error("the mbean " + mbean.getKey().getName() + " can't be registered", e);
-            }
-        }
-    }
-
-    /**
-     * if OPENEJB_MBEAN_FORCE_FINDER system property is set mbeans will be searched from the class loader
-     * otherwise the OPENEJB_MBEAN_CLASSES_PROPERTY system property will be used.
-     *
-     * @param cl the classloader used
-     * @param id application id
-     * @return the list of mbean classes
-     */
-    private static Map<Class<?>, ObjectName> getMbeanClasses(ClassLoader cl, String id) {
-        ClassLoader classLoader = cl;
-        if (classLoader == null) {
-            classLoader = Thread.currentThread().getContextClassLoader();
-            if (classLoader == null) {
-                classLoader = OpenEJB.class.getClassLoader();
-            }
-        }
-
-        Map<Class<?>, ObjectName> mbeans = new HashMap<Class<?>, ObjectName>();
-
-        String listProp = SystemInstance.get().getOptions().get(OPENEJB_MBEAN_CLASSES_PROPERTY, (String) null);
-        if (OPENEJB_MBEAN_FORCE_FINDER.equals(listProp)) { // the classfinder costs too much to be used by default
-            logger.debug("loading mbeans using an annotation finder, you should maybe adjust {0} system property",
-                                            OPENEJB_MBEAN_CLASSES_PROPERTY);
-            List<Class<?>> list = Collections.emptyList();
-            try {
-                ClassFinder mbeanFinder = new ClassFinder(classLoader, true);
-                list = mbeanFinder.findAnnotatedClasses(MBean.class);
-            } catch (Exception e) {
-                logger.error("can't find annotated MBean", e);
-            }
-
-            for (Class<?> clazz : list) {
-                if (AnnotationUtil.getAnnotation(Internal.class, clazz) == null) {
-                    mbeans.put(clazz, getObjectName(clazz, id));
-                }
-            }
-        } else if (listProp != null) {
-            for (String name : listProp.replace(" ", "").split(OPENEJB_MBEAN_CLASSES_SPLIT)) {
-                name = name.trim();
-                try {
-                    Class<?> clazz = classLoader.loadClass(name);
-                    ObjectName objectName = getObjectName(clazz, id);
-                    if (!server.isRegistered(objectName)) {
-                        mbeans.put(clazz, objectName);
-                    }
-                } catch (ClassNotFoundException ignore) { // it is maybe in another classloader
-                    logger.debug("mbean not found in classloader " + classLoader.toString()
-                        + ", we will try in the next app", ignore);
-                } catch (NoClassDefFoundError ignore) {
-                    logger.debug("mbean not found in the current app", ignore);
+            // force descriptor for additinal libs since it shouldn't occur often and can save some time
+            final IAnnotationFinder finder = new AnnotationFinder(new ConfigurableClasspathArchive(appModule.getClassLoader(), true, libs));
+            for (Annotated<Class<?>> clazz : finder.findMetaAnnotatedClasses(MBean.class)) {
+                final String name = clazz.get().getName();
+                if (done.contains(name)) {
+                    continue;
                 }
+
+                appModule.getAdditionalLibMbeans().add(name);
             }
         }
-        return mbeans;
-    }
 
-    private static ObjectName getObjectName(Class<?> mBean, String id) {
-        ObjectNameBuilder builder = new ObjectNameBuilder("openejb.user.mbeans");
-        builder.set("group", mBean.getPackage().getName());
-        builder.set("application", id);
-        builder.set("name", mBean.getSimpleName());
-        return builder.build();
+        return appModule;
     }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java Wed Mar  7 22:24:07 2012
@@ -20,7 +20,9 @@ import org.apache.openejb.config.sys.Res
 import org.apache.openejb.jee.bval.ValidationConfigType;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 public class Module {
     private static int currentId = 1; // unique id to be able to bind something for each module in the jndi tree
@@ -34,6 +36,7 @@ public class Module {
     private String uniqueId = null;
     private AppModule appModule = null;
     private Resources resources = null;
+    private final Set<String> mbeans = new HashSet<String>();
 
     public Module(boolean needId) {
         if (needId) {
@@ -103,4 +106,8 @@ public class Module {
 
         this.resources = resources;
     }
+
+    public Set<String> getMbeans() {
+        return mbeans;
+    }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java Wed Mar  7 22:24:07 2012
@@ -16,15 +16,9 @@
  */
 package org.apache.openejb.monitoring;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.ResourceBundle;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+
 import javax.management.Attribute;
 import javax.management.AttributeList;
 import javax.management.AttributeNotFoundException;
@@ -43,8 +37,14 @@ import javax.management.ManagedOperation
 import javax.management.NotificationInfo;
 import javax.management.NotificationInfos;
 import javax.management.ReflectionException;
-import org.apache.openejb.util.LogCategory;
-import org.apache.openejb.util.Logger;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
 
 public class DynamicMBeanWrapper implements DynamicMBean {
     public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_DEPLOY, DynamicMBeanWrapper.class);
@@ -152,28 +152,11 @@ public class DynamicMBeanWrapper impleme
                 notificationInfos.toArray(new MBeanNotificationInfo[notificationInfos.size()]));
     }
 
-    public DynamicMBeanWrapper(Class<?> annotatedMBean) {
-        this(instantiate(annotatedMBean));
-    }
-
-    private static Object instantiate(Class<?> annotatedMBean) {
-        try {
-            return annotatedMBean.newInstance();
-        } catch (InstantiationException ie) {
-            logger.error("can't instantiate " + annotatedMBean.getName(), ie);
-            throw new IllegalArgumentException(annotatedMBean.getName());
-        } catch (IllegalAccessException iae) {
-            logger.error("can't instantiate " + annotatedMBean.getName(), iae);
-            throw new IllegalArgumentException(annotatedMBean.getName());
-        }
-    }
-
     private MBeanNotificationInfo getNotificationInfo(NotificationInfo n) {
         String description = getDescription(n.description(), "-");
-        MBeanNotificationInfo ni = new MBeanNotificationInfo(n.types(),
+        return new MBeanNotificationInfo(n.types(),
             n.notificationClass().getName(), description,
             new ImmutableDescriptor(n.descriptorFields()));
-        return ni;
     }
 
     private String getDescription(Description d, String defaultValue) {
@@ -251,10 +234,8 @@ public class DynamicMBeanWrapper impleme
     @Override
     public AttributeList setAttributes(AttributeList attributes) {
         AttributeList list = new AttributeList();
-        Iterator<Object> it = attributes.iterator();
-
-        while (it.hasNext()) {
-            Attribute attr = (Attribute) it.next();
+        for (Object o : attributes) {
+            final Attribute attr = (Attribute) o;
             try {
                 setAttribute(attr);
                 list.add(attr);

Modified: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java Wed Mar  7 22:24:07 2012
@@ -16,218 +16,148 @@
  */
 package org.apache.openejb.config;
 
-import java.lang.management.ManagementFactory;
-import java.util.Scanner;
-import javax.management.Attribute;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
+import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.assembler.classic.ProxyFactoryInfo;
 import org.apache.openejb.assembler.classic.SecurityServiceInfo;
 import org.apache.openejb.assembler.classic.TransactionServiceInfo;
-import org.apache.openejb.config.AppModule;
-import org.apache.openejb.config.ConfigurationFactory;
-import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.jee.Beans;
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.mbeans.Empty;
+import org.apache.openejb.mbeans.Inheritance;
+import org.apache.openejb.mbeans.MBeanDescription;
+import org.apache.openejb.mbeans.Operation;
+import org.apache.openejb.mbeans.OperationDescription;
+import org.apache.openejb.mbeans.Reader;
+import org.apache.openejb.mbeans.ReaderDescription;
+import org.apache.openejb.mbeans.ReaderWriter;
+import org.apache.openejb.monitoring.LocalMBeanServer;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import javax.management.Attribute;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertTrue;
 
-/**
- * Note: each MBeans are at least deployed twice (using old and spec module name).
- *
- *         openejb.user.mbeans.list=org.apache.openejb.mbeans.Empty,
- *         org.apache.openejb.mbeans.Inheritance,
- *         org.apache.openejb.mbeans.MBeanDescription,
- *         org.apache.openejb.mbeans.MBeanNotificationlistener,
- *         org.apache.openejb.mbeans.MultipleNotifications,
- *         org.apache.openejb.mbeans.Notificater,
- *         org.apache.openejb.mbeans.Operation,
- *         org.apache.openejb.mbeans.OperationDescription,
- *         org.apache.openejb.mbeans.Reader,
- *         org.apache.openejb.mbeans.ReaderWriter,
- *         org.apache.openejb.mbeans.ReaderDescription
- */
 public class MBeanDeployerTest {
-    private static final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
-    private static final String LIST_PROPR = "openejb.user.mbeans.list";
+    private static final MBeanServer server = LocalMBeanServer.get();
+
+    private AppModule appModule;
+    private Assembler assembler;
+    private ConfigurationFactory config;
+    private AppInfo appInfo;
 
-    private static AppModule appModule;
-    private static Assembler assembler;
-    private static ConfigurationFactory config;
-
-    /**
-     * needs properties so it is not done in a @Before
-     * because SystemInstance.get().setProperty(LIST_PROPR, ...) is done in @Test methods.
-     */
-    private void startOpenEJB() throws Exception {
+    @Before
+    public void startOpenEJB() throws Exception {
         config = new ConfigurationFactory();
         assembler = new Assembler();
         assembler.createProxyFactory(config.configureService(ProxyFactoryInfo.class));
         assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
         assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
 
-        EjbJar ejbJar = new EjbJar();
-        EjbModule ejbModule = new EjbModule(ejbJar);
+        final EjbJar ejbJar = new EjbJar();
+        final EjbModule ejbModule = new EjbModule(ejbJar);
+        ejbModule.setBeans(new Beans());
+        ejbModule.setModuleId("mbeans-test");
+
+        for (Class<?> clazz : Arrays.asList(Operation.class, OperationDescription.class,
+                Reader.class, ReaderWriter.class, ReaderDescription.class,
+                Empty.class, Inheritance.class, MBeanDescription.class)) {
+            ejbModule.getBeans().addManagedClass(clazz);
+            ejbModule.getMbeans().add(clazz.getName());
+        }
 
         appModule = new AppModule(ejbModule.getClassLoader(), "mbeans");
         appModule.getEjbModules().add(ejbModule);
-        assembler.createApplication(config.configureApplication(appModule));
+        appInfo = config.configureApplication(appModule);
+        assembler.createApplication(appInfo);
     }
 
-    @After public void resetList() {
+    @After
+    public void resetList() {
         assembler.destroy();
         SystemInstance.reset();
     }
 
-    @Test public void empty() throws Exception {
-        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Empty");
-        startOpenEJB();
-
-        assertEquals(2, appModule.getMBeans().size());
-
-        ObjectName on = new ObjectName(appModule.getMBeans().iterator().next());
-        String cn = on.getCanonicalName();
-        assertTrue(cn.startsWith("openejb.user.mbeans"));
-        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
-        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
-        assertTrue(cn.contains("name=Empty"));
-        assertTrue(server.isRegistered(on));
-    }
-
-    @Test public void reader() throws Exception {
-        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Reader");
-        startOpenEJB();
-
-        assertEquals(2, appModule.getMBeans().size());
-        String cn = appModule.getMBeans().iterator().next();
-        ObjectName on = new ObjectName(cn);
-        assertTrue(cn.startsWith("openejb.user.mbeans"));
-        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
-        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
-        assertTrue(cn.contains("name=Reader"));
-        assertTrue(server.isRegistered(on));
-        assertEquals(2, server.getAttribute(on, "value"));
-    }
-
-    @Test public void writer() throws Exception {
-        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.ReaderWriter");
-        startOpenEJB();
-
-        assertEquals(2, appModule.getMBeans().size());
-        String cn = appModule.getMBeans().iterator().next();
-        ObjectName on = new ObjectName(cn);        assertTrue(cn.startsWith("openejb.user.mbeans"));
-        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
-        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
-        assertTrue(cn.contains("name=ReaderWriter"));
-        assertTrue(server.isRegistered(on));
-        assertEquals(2, server.getAttribute(on, "value"));
-        server.setAttribute(on, new Attribute("value", 5));
-        assertEquals(5, server.getAttribute(on, "value"));
-    }
-
-    @Test public void emptyAndReader() throws Exception {
-        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Empty,org.apache.openejb.mbeans.Reader");
-        startOpenEJB();
-
-        assertEquals(4, appModule.getMBeans().size());
-        for (String cn : appModule.getMBeans()) {
-            ObjectName on = new ObjectName(cn);
-            assertTrue(cn.startsWith("openejb.user.mbeans"));
-            assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
-            assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
-            assertTrue(cn.contains("name=Reader") || cn.contains("name=Empty"));
-            assertTrue(server.isRegistered(on));
+    @Test
+    public void mbeans() throws Exception {
+        final Set<String> parsed = new HashSet<String>();
+        for (String name : appInfo.jmx.values()) {
+            final ObjectName on = new ObjectName(name);
+            final String cn = on.getCanonicalName();
+            if (cn.contains("name=Empty")) {
+                assertTrue(cn.startsWith("openejb.user.mbeans"));
+                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
+                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
+                assertTrue(server.isRegistered(on));
+                parsed.add(cn);
+            } else if (cn.contains("name=Reader")) {
+                assertTrue(cn.startsWith("openejb.user.mbeans"));
+                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
+                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
+                assertTrue(server.isRegistered(on));
+                assertEquals(2, server.getAttribute(on, "value"));
+                parsed.add(cn);
+            } else if (cn.contains("name=ReaderWriter")) {
+                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
+                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
+                assertTrue(server.isRegistered(on));
+                assertEquals(2, server.getAttribute(on, "value"));
+                server.setAttribute(on, new Attribute("value", 5));
+                assertEquals(5, server.getAttribute(on, "value"));
+                parsed.add(cn);
+            } else if (cn.contains("name=Inheritance")) {
+                assertTrue(cn.startsWith("openejb.user.mbeans"));
+                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
+                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
+                assertTrue(server.isRegistered(on));
+                assertEquals(2, server.getAttribute(on, "value"));
+                server.setAttribute(on, new Attribute("value", 5));
+                assertEquals(5, server.getAttribute(on, "value"));
+                assertEquals("yes - no", server.invoke(on, "returnValue", null, null));
+                parsed.add(cn);
+            } else if (cn.contains("name=MBeanDescription")) {
+                assertTrue(cn.startsWith("openejb.user.mbeans"));
+                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
+                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
+                assertTrue(server.isRegistered(on));
+                assertEquals("descr ;)", server.getMBeanInfo(on).getDescription());
+                parsed.add(cn);
+            } else if (cn.contains("name=Operation")) {
+                assertTrue(cn.startsWith("openejb.user.mbeans"));
+                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
+                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
+                assertTrue(server.isRegistered(on));
+                assertEquals("yes - no", server.invoke(on, "returnValue", null, null));
+                parsed.add(cn);
+            } else if (cn.contains("name=ReaderDescription")) {
+                assertTrue(cn.startsWith("openejb.user.mbeans"));
+                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
+                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
+                assertTrue(cn.contains("name=ReaderDescription"));
+                assertTrue(server.isRegistered(on));
+                assertEquals(1, server.getMBeanInfo(on).getAttributes().length);
+                assertEquals("just a value", server.getMBeanInfo(on).getAttributes()[0].getDescription());
+                parsed.add(cn);
+            } else if (cn.contains("name=OperationDescription")) {
+                assertTrue(cn.startsWith("openejb.user.mbeans"));
+                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
+                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
+                assertTrue(server.isRegistered(on));
+                assertEquals(1, server.getMBeanInfo(on).getOperations().length);
+                assertEquals("just an op", server.getMBeanInfo(on).getOperations()[0].getDescription());
+                parsed.add(cn);
+            }
         }
-    }
-
-    @Test public void inheritance() throws Exception {
-        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Inheritance");
-        startOpenEJB();
-
-        assertEquals(2, appModule.getMBeans().size());
-
-        String cn = appModule.getMBeans().iterator().next();
-        ObjectName on = new ObjectName(cn);
-        assertTrue(cn.startsWith("openejb.user.mbeans"));
-        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
-        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
-        assertTrue(cn.contains("name=Inheritance"));
-        assertTrue(server.isRegistered(on));
-        assertEquals(2, server.getAttribute(on, "value"));
-        server.setAttribute(on, new Attribute("value", 5));
-        assertEquals(5, server.getAttribute(on, "value"));
-        assertEquals("yes - no", server.invoke(on, "returnValue", null, null));
-    }
-
-    @Test public void description() throws Exception {
-        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.MBeanDescription");
-        startOpenEJB();
-
-        assertEquals(2, appModule.getMBeans().size());
-
-        String cn = appModule.getMBeans().iterator().next();
-        ObjectName on = new ObjectName(cn);
-        assertTrue(cn.startsWith("openejb.user.mbeans"));
-        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
-        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
-        assertTrue(cn.contains("name=MBeanDescription"));
-        assertTrue(server.isRegistered(on));
-        assertEquals("descr ;)", server.getMBeanInfo(on).getDescription());
-    }
-
-    @Test public void operation() throws Exception {
-        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Operation");
-        startOpenEJB();
-
-        assertEquals(2, appModule.getMBeans().size());
-
-        String cn = appModule.getMBeans().iterator().next();
-        ObjectName on = new ObjectName(cn);
-        assertTrue(cn.startsWith("openejb.user.mbeans"));
-        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
-        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
-        assertTrue(cn.contains("name=Operation"));
-        assertTrue(server.isRegistered(on));
-        assertEquals("yes - no", server.invoke(on, "returnValue", null, null));
-    }
-
-    @Test public void readerDescription() throws Exception {
-        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.ReaderDescription");
-        startOpenEJB();
-
-        assertEquals(2, appModule.getMBeans().size());
-
-        String cn = appModule.getMBeans().iterator().next();
-        ObjectName on = new ObjectName(cn);
-        assertTrue(cn.startsWith("openejb.user.mbeans"));
-        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
-        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
-        assertTrue(cn.contains("name=ReaderDescription"));
-        assertTrue(server.isRegistered(on));
-        assertEquals(1, server.getMBeanInfo(on).getAttributes().length);
-        assertEquals("just a value", server.getMBeanInfo(on).getAttributes()[0].getDescription());
-    }
-
-    @Test public void operationDescription() throws Exception {
-        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.OperationDescription");
-        startOpenEJB();
-
-        assertEquals(2, appModule.getMBeans().size());
-
-        String cn = appModule.getMBeans().iterator().next();
-        ObjectName on = new ObjectName(cn);
-        assertTrue(cn.startsWith("openejb.user.mbeans"));
-        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
-        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
-        assertTrue(cn.contains("name=OperationDescription"));
-        assertTrue(server.isRegistered(on));
-        assertEquals(1, server.getMBeanInfo(on).getOperations().length);
-        assertEquals("just an op", server.getMBeanInfo(on).getOperations()[0].getDescription());
+        assertEquals(8, parsed.size());
     }
 }
 

Modified: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java Wed Mar  7 22:24:07 2012
@@ -18,10 +18,11 @@ package org.apache.openejb.mbeans;
 
 import javax.management.Description;
 import javax.management.MBean;
+import javax.management.ManagedAttribute;
 import javax.management.ManagedOperation;
 
 @MBean
-public class Inheritance extends ReaderWriter {
+public class Inheritance extends Parent {
 	@ManagedOperation @Description("just an op") public String returnValue() {
 		return "yes - no";
 	}

Added: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java?rev=1298167&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java Wed Mar  7 22:24:07 2012
@@ -0,0 +1,21 @@
+package org.apache.openejb.mbeans;
+
+import javax.management.Description;
+import javax.management.ManagedAttribute;
+
+// simply a copy of ReaderWriter but abstract to avoid CDI conflict
+public abstract class Parent {
+    private int i = -1;
+
+    @ManagedAttribute
+    @Description("just a value") public int getValue() {
+        if (i < 0) {
+            return 2;
+        }
+        return i;
+    }
+
+    @ManagedAttribute public void setValue(int v) {
+        i = v;
+    }
+}

Modified: openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java?rev=1298167&r1=1298166&r2=1298167&view=diff
==============================================================================
--- openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java (original)
+++ openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java Wed Mar  7 22:24:07 2012
@@ -20,7 +20,6 @@ import org.junit.Test;
 
 import javax.ejb.embeddable.EJBContainer;
 import javax.management.Attribute;
-import javax.management.MBeanInfo;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 import java.lang.management.ManagementFactory;
@@ -34,12 +33,10 @@ public class GuessHowManyMBeanTest {
     @Test
     public void play() throws Exception {
         Properties properties = new Properties();
-        properties.setProperty("openejb.user.mbeans.list", GuessHowManyMBean.class.getName());
         EJBContainer container = EJBContainer.createEJBContainer(properties);
 
         MBeanServer server = ManagementFactory.getPlatformMBeanServer();
         ObjectName objectName = new ObjectName(OBJECT_NAME);
-        MBeanInfo infos = server.getMBeanInfo(objectName);
         assertEquals(0, server.getAttribute(objectName, "value"));
         server.setAttribute(objectName, new Attribute("value", 3));
         assertEquals(3, server.getAttribute(objectName, "value"));



Re: svn commit: r1298167 - in /openejb/trunk/openejb: container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openejb/config/ container/openejb-core/src/main/java/org/apache/openejb/monitor...

Posted by David Blevins <da...@gmail.com>.
At a high level, what was the goal?  Some description of what motivated the rewrite would be good.


-David

On Mar 7, 2012, at 4:24 PM, rmannibucau@apache.org wrote:

> Author: rmannibucau
> Date: Wed Mar  7 22:24:07 2012
> New Revision: 1298167
> 
> URL: http://svn.apache.org/viewvc?rev=1298167&view=rev
> Log:
> rewriting the way we register @MBean. Using finder in ejbmodules, additional libs and connector modules. Deploying in assembler (it deployed in config phase). Better logging.
> 
> Added:
>    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java
> Modified:
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
>    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java
>    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java
>    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java
>    openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java Wed Mar  7 22:24:07 2012
> @@ -18,7 +18,9 @@ package org.apache.openejb.assembler.cla
> 
> import java.util.ArrayList;
> import java.util.List;
> +import java.util.Map;
> import java.util.Set;
> +import java.util.TreeMap;
> import java.util.TreeSet;
> 
> /**
> @@ -39,5 +41,6 @@ public class AppInfo extends InfoObject 
>     public final JndiEncInfo globalJndiEnc = new JndiEncInfo();
>     public final JndiEncInfo appJndiEnc = new JndiEncInfo();
>     public String cmpMappingsXml;
> -    public Set<String> jmx = new TreeSet<String>();
> +    public Map<String, String> jmx = new TreeMap<String, String>();
> +    public Set<String> mbeans = new TreeSet<String>();
> }
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Wed Mar  7 22:24:07 2012
> @@ -66,7 +66,9 @@ import org.apache.openejb.core.transacti
> import org.apache.openejb.javaagent.Agent;
> import org.apache.openejb.loader.Options;
> import org.apache.openejb.loader.SystemInstance;
> +import org.apache.openejb.monitoring.DynamicMBeanWrapper;
> import org.apache.openejb.monitoring.LocalMBeanServer;
> +import org.apache.openejb.monitoring.ObjectNameBuilder;
> import org.apache.openejb.persistence.JtaEntityManagerRegistry;
> import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
> import org.apache.openejb.resource.GeronimoConnectionManagerFactory;
> @@ -95,6 +97,8 @@ import org.apache.xbean.recipe.ObjectRec
> import org.apache.xbean.recipe.Option;
> import org.apache.xbean.recipe.UnsetPropertiesRecipe;
> 
> +import javax.enterprise.inject.spi.Bean;
> +import javax.enterprise.inject.spi.BeanManager;
> import javax.management.InstanceNotFoundException;
> import javax.management.MBeanRegistrationException;
> import javax.management.MBeanServer;
> @@ -871,6 +875,21 @@ public class Assembler extends Assembler
>                 containerSystemContext.rebind(path, value.getValue());
>             }
> 
> +            // deploy MBeans
> +            for (String mbean : appInfo.mbeans) {
> +                deployMBean(appContext.getBeanManager(), classLoader, mbean, appInfo.jmx, appInfo.appId);
> +            }
> +            for (EjbJarInfo ejbJarInfo : appInfo.ejbJars) {
> +                for (String mbean : ejbJarInfo.mbeans) {
> +                    deployMBean(appContext.getBeanManager(), classLoader, mbean, appInfo.jmx, ejbJarInfo.moduleName);
> +                }
> +            }
> +            for (ConnectorInfo connectorInfo : appInfo.connectors) {
> +                for (String mbean : connectorInfo.mbeans) {
> +                    deployMBean(appContext.getBeanManager(), classLoader, mbean, appInfo.jmx, appInfo.appId + ".add-lib");
> +                }
> +            }
> +
> 
>             logger.info("createApplication.success", appInfo.path);
> 
> @@ -890,6 +909,33 @@ public class Assembler extends Assembler
>         }
>     }
> 
> +    private static void deployMBean(final BeanManager bm, final ClassLoader cl, final String mbeanClass, final Map<String, String> appMbeans, final String id) {
> +        final Class<?> clazz;
> +        try {
> +            clazz = cl.loadClass(mbeanClass);
> +        } catch (ClassNotFoundException e) {
> +            throw new OpenEJBRuntimeException(e);
> +        }
> +        final Set<Bean<?>> beans = bm.getBeans(clazz);
> +        final Bean bean = bm.resolve(beans);
> +        final Object instance = bm.getReference(bean, clazz, bm.createCreationalContext(bean));
> +
> +        final MBeanServer server = LocalMBeanServer.get();
> +        try {
> +            final ObjectName leaf =  new ObjectNameBuilder("openejb.user.mbeans")
> +                .set("group", clazz.getPackage().getName())
> +                .set("application", id)
> +                .set("name", clazz.getSimpleName())
> +                .build();
> +
> +            server.registerMBean(new DynamicMBeanWrapper(instance), leaf);
> +            appMbeans.put(mbeanClass, leaf.getCanonicalName());
> +            logger.info("MBean(" + leaf.getCanonicalName() + ")");
> +        } catch (Exception e) {
> +            logger.error("the mbean " + mbeanClass + " can't be registered", e);
> +        }
> +    }
> +
>     private void ensureWebBeansContext(AppContext appContext) {
>         WebBeansContext webBeansContext = appContext.get(WebBeansContext.class);
>         if (webBeansContext == null) webBeansContext = appContext.getWebBeansContext();
> @@ -1245,7 +1291,7 @@ public class Assembler extends Assembler
> 
>         // mbeans
>         MBeanServer server = LocalMBeanServer.get();
> -        for (String objectName : appInfo.jmx) {
> +        for (String objectName : appInfo.jmx.values()) {
>             try {
>               ObjectName on = new ObjectName(objectName);
>               if (server.isRegistered(on)) {
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java Wed Mar  7 22:24:07 2012
> @@ -36,4 +36,5 @@ public class ConnectorInfo extends Commo
>     public List<ResourceInfo> outbound = new ArrayList<ResourceInfo>();
>     public List<MdbContainerInfo> inbound = new ArrayList<MdbContainerInfo>();
>     public List<ResourceInfo> adminObject = new ArrayList<ResourceInfo>();
> +    public Set<String> mbeans = new TreeSet<String>();
> }
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java Wed Mar  7 22:24:07 2012
> @@ -56,4 +56,5 @@ public class EjbJarInfo extends CommonIn
> 
>     public BeansInfo beans;
>     public Set<String> repositories = new TreeSet<String>();
> +    public Set<String> mbeans = new TreeSet<String>();
> }
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Wed Mar  7 22:24:07 2012
> @@ -1015,8 +1015,8 @@ public class AnnotationDeployer implemen
>             }
> 
>            /*
> -                    * REST
> -                    */
> +            * REST
> +            */
>             // get by annotations
>             webModule.getRestClasses().addAll(findRestClasses(webModule, finder));
>             // Applications with a default constructor
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java Wed Mar  7 22:24:07 2012
> @@ -102,7 +102,7 @@ class AppInfoBuilder {
>         appInfo.path = appModule.getJarLocation();
>         appInfo.standaloneModule = appModule.isStandaloneModule();
>         appInfo.watchedResources.addAll(appModule.getWatchedResources());
> -        appInfo.jmx = appModule.getMBeans();
> +        appInfo.mbeans = appModule.getAdditionalLibMbeans();
> 
>         if (appInfo.appId == null) throw new IllegalArgumentException("AppInfo.appId cannot be null");
>         if (appInfo.path == null) appInfo.path = appInfo.appId;
> @@ -134,6 +134,7 @@ class AppInfoBuilder {
>         for (EjbModule ejbModule : appModule.getEjbModules()) {
>             try {
>                 EjbJarInfo ejbJarInfo = ejbJarInfoBuilder.buildInfo(ejbModule);
> +                ejbJarInfo.mbeans = ejbModule.getMbeans();
> 
>                 Map<String, EjbDeployment> deploymentsByEjbName = ejbModule.getOpenejbJar().getDeploymentsByEjbName();
> 
> @@ -356,6 +357,7 @@ class AppInfoBuilder {
>             connectorInfo.watchedResources.addAll(connectorModule.getWatchedResources());
>             connectorInfo.validationInfo = ValidatorBuilder.getInfo(connectorModule.getValidationConfig());
>             connectorInfo.uniqueId = connectorModule.getUniqueId();
> +            connectorInfo.mbeans = connectorModule.getMbeans();
> 
>             List<URL> libraries = connectorModule.getLibraries();
>             for (URL url : libraries) {
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java Wed Mar  7 22:24:07 2012
> @@ -16,8 +16,6 @@
>  */
> package org.apache.openejb.config;
> 
> -import java.util.HashSet;
> -
> import org.apache.openejb.config.sys.Resource;
> import org.apache.openejb.jee.Application;
> import org.apache.openejb.jee.jpa.EntityMappings;
> @@ -28,6 +26,7 @@ import java.net.URL;
> import java.util.ArrayList;
> import java.util.Collection;
> import java.util.HashMap;
> +import java.util.HashSet;
> import java.util.List;
> import java.util.Map;
> import java.util.Properties;
> @@ -55,7 +54,7 @@ public class AppModule implements Deploy
>     private final Map<String,Object> altDDs = new HashMap<String,Object>();
>     private final Set<String> watchedResources = new TreeSet<String>();
>     private final boolean standaloneModule;
> -    private Set<String> mBeans = new HashSet<String>();
> +    private final Set<String> additionalLibMbeans = new TreeSet<String>();
> 
>     private ID id;
> 
> @@ -102,12 +101,8 @@ public class AppModule implements Deploy
>         this.standaloneModule = standaloneModule;
>     }
> 
> -    public Set<String> getMBeans() {
> -        return mBeans;
> -    }
> -
> -    public void setMBeans(Set<String> mBeans) {
> -        this.mBeans = mBeans;
> +    public Set<String> getAdditionalLibMbeans() {
> +        return additionalLibMbeans;
>     }
> 
>     public boolean isStandaloneModule() {
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ClientModule.java Wed Mar  7 22:24:07 2012
> @@ -17,17 +17,14 @@
> package org.apache.openejb.config;
> 
> import org.apache.openejb.jee.ApplicationClient;
> -import org.apache.openejb.jee.oejb3.OpenejbJar;
> import org.apache.xbean.finder.IAnnotationFinder;
> 
> +import java.io.File;
> import java.net.URI;
> -import java.util.Map;
> -import java.util.HashMap;
> +import java.util.HashSet;
> import java.util.Set;
> import java.util.TreeSet;
> -import java.util.HashSet;
> import java.util.concurrent.atomic.AtomicReference;
> -import java.io.File;
> 
> /**
>  * @version $Rev$ $Date$
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java Wed Mar  7 22:24:07 2012
> @@ -16,60 +16,52 @@
>  */
> package org.apache.openejb.config;
> 
> -import org.apache.openejb.OpenEJB;
> import org.apache.openejb.OpenEJBException;
> -import org.apache.openejb.api.internal.Internal;
> -import org.apache.openejb.loader.SystemInstance;
> -import org.apache.openejb.monitoring.DynamicMBeanWrapper;
> -import org.apache.openejb.monitoring.LocalMBeanServer;
> -import org.apache.openejb.monitoring.ObjectNameBuilder;
> -import org.apache.openejb.util.AnnotationUtil;
> import org.apache.openejb.util.LogCategory;
> import org.apache.openejb.util.Logger;
> -import org.apache.xbean.finder.ClassFinder;
> +import org.apache.xbean.finder.Annotated;
> +import org.apache.xbean.finder.AnnotationFinder;
> +import org.apache.xbean.finder.IAnnotationFinder;
> 
> import javax.management.MBean;
> -import javax.management.MBeanServer;
> -import javax.management.ObjectName;
> import java.net.URL;
> -import java.net.URLClassLoader;
> import java.util.ArrayList;
> -import java.util.Collections;
> -import java.util.HashMap;
> import java.util.Iterator;
> import java.util.List;
> -import java.util.Map;
> -import java.util.Set;
> -import java.util.TreeSet;
> 
> public class MBeanDeployer implements DynamicDeployer {
>     private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP_CONFIG, MBeanDeployer.class);
> -    private static final MBeanServer server = LocalMBeanServer.get();
> 
> -    private static final String OPENEJB_MBEAN_CLASSES_PROPERTY = "openejb.user.mbeans.list";
> -    private static final String OPENEJB_MBEAN_CLASSES_SPLIT = ",";
> -    private static final String OPENEJB_MBEAN_FORCE_FINDER = "*";
> +    // mbeans ObjectNames are stored in the app since they are global and that's easier
> +    // mbean classes themself are stored in modules since they depend only on them
> 
> -    @Override public AppModule deploy(AppModule appModule) throws OpenEJBException {
> +    @Override
> +    public AppModule deploy(AppModule appModule) throws OpenEJBException {
>         logger.debug("looking for annotated MBeans in " + appModule.getModuleId());
> -        Set<String> mbeans = new TreeSet<String>();
> +        final List<String> done = new ArrayList<String>();
> +
> +        // there is an ejbmodule by webapp so we should't need to go through the webapp
> 
> -        deploy(mbeans, appModule.getClassLoader(), appModule.getModuleId());
> -        List<String> done = new ArrayList<String>();
> -        for (WebModule webModule : appModule.getWebModules()) {
> -            deploy(mbeans, webModule.getClassLoader(), webModule.getModuleId());
> -            done.add(webModule.getJarLocation());
> -        }
>         for (EjbModule ejbModule : appModule.getEjbModules()) {
> -            if (!done.contains(ejbModule.getJarLocation())) {
> -                deploy(mbeans, ejbModule.getClassLoader(), ejbModule.getModuleId());
> -                done.add(ejbModule.getJarLocation());
> +            for (Annotated<Class<?>> clazz : ejbModule.getFinder().findMetaAnnotatedClasses(MBean.class)) {
> +                final Class<?> realClass = clazz.get();
> +                final String name = clazz.get().getName();
> +                if (done.contains(name)) {
> +                    continue;
> +                }
> +
> +                ejbModule.getMbeans().add(name);
> +                done.add(name);
>             }
>         }
>         for (ClientModule clientModule : appModule.getClientModules()) {
> -            if (!done.contains(clientModule.getJarLocation())) {
> -                deploy(mbeans, clientModule.getClassLoader(), clientModule.getModuleId());
> -                done.add(clientModule.getJarLocation());
> +            for (Annotated<Class<?>> clazz : clientModule.getFinder().findMetaAnnotatedClasses(MBean.class)) {
> +                final String name = clazz.get().getName();
> +                if (done.contains(name)) {
> +                    continue;
> +                }
> +
> +                clientModule.getMbeans().add(name);
>             }
>         }
> 
> @@ -84,93 +76,18 @@ public class MBeanDeployer implements Dy
>             }
>         }
>         if (libs.size() > 0) {
> -            ClassLoader additionnalLibCl = new URLClassLoader(libs.toArray(new URL[libs.size()]));
> -            deploy(mbeans, additionnalLibCl, appModule.getModuleId() + ".add-lib");
> -        }
> -
> -        appModule.setMBeans(mbeans);
> -        logger.debug("registered " + mbeans.size() + " annotated MBeans in " + appModule.getModuleId());
> -        return appModule;
> -    }
> -
> -    private static void deploy(Set<String> mbeans, ClassLoader cl, String id) {
> -        if (cl == null) {
> -            return;
> -        }
> -
> -        for (Map.Entry<Class<?>, ObjectName> mbean : getMbeanClasses(cl, id).entrySet()) {
> -            ObjectName objectName = mbean.getValue();
> -            try {
> -                server.registerMBean(new DynamicMBeanWrapper(mbean.getKey()), objectName);
> -                mbeans.add(objectName.getCanonicalName());
> -                logger.info("MBean " + objectName.getCanonicalName() + " registered.");
> -            } catch (Exception e) {
> -                logger.error("the mbean " + mbean.getKey().getName() + " can't be registered", e);
> -            }
> -        }
> -    }
> -
> -    /**
> -     * if OPENEJB_MBEAN_FORCE_FINDER system property is set mbeans will be searched from the class loader
> -     * otherwise the OPENEJB_MBEAN_CLASSES_PROPERTY system property will be used.
> -     *
> -     * @param cl the classloader used
> -     * @param id application id
> -     * @return the list of mbean classes
> -     */
> -    private static Map<Class<?>, ObjectName> getMbeanClasses(ClassLoader cl, String id) {
> -        ClassLoader classLoader = cl;
> -        if (classLoader == null) {
> -            classLoader = Thread.currentThread().getContextClassLoader();
> -            if (classLoader == null) {
> -                classLoader = OpenEJB.class.getClassLoader();
> -            }
> -        }
> -
> -        Map<Class<?>, ObjectName> mbeans = new HashMap<Class<?>, ObjectName>();
> -
> -        String listProp = SystemInstance.get().getOptions().get(OPENEJB_MBEAN_CLASSES_PROPERTY, (String) null);
> -        if (OPENEJB_MBEAN_FORCE_FINDER.equals(listProp)) { // the classfinder costs too much to be used by default
> -            logger.debug("loading mbeans using an annotation finder, you should maybe adjust {0} system property",
> -                                            OPENEJB_MBEAN_CLASSES_PROPERTY);
> -            List<Class<?>> list = Collections.emptyList();
> -            try {
> -                ClassFinder mbeanFinder = new ClassFinder(classLoader, true);
> -                list = mbeanFinder.findAnnotatedClasses(MBean.class);
> -            } catch (Exception e) {
> -                logger.error("can't find annotated MBean", e);
> -            }
> -
> -            for (Class<?> clazz : list) {
> -                if (AnnotationUtil.getAnnotation(Internal.class, clazz) == null) {
> -                    mbeans.put(clazz, getObjectName(clazz, id));
> -                }
> -            }
> -        } else if (listProp != null) {
> -            for (String name : listProp.replace(" ", "").split(OPENEJB_MBEAN_CLASSES_SPLIT)) {
> -                name = name.trim();
> -                try {
> -                    Class<?> clazz = classLoader.loadClass(name);
> -                    ObjectName objectName = getObjectName(clazz, id);
> -                    if (!server.isRegistered(objectName)) {
> -                        mbeans.put(clazz, objectName);
> -                    }
> -                } catch (ClassNotFoundException ignore) { // it is maybe in another classloader
> -                    logger.debug("mbean not found in classloader " + classLoader.toString()
> -                        + ", we will try in the next app", ignore);
> -                } catch (NoClassDefFoundError ignore) {
> -                    logger.debug("mbean not found in the current app", ignore);
> +            // force descriptor for additinal libs since it shouldn't occur often and can save some time
> +            final IAnnotationFinder finder = new AnnotationFinder(new ConfigurableClasspathArchive(appModule.getClassLoader(), true, libs));
> +            for (Annotated<Class<?>> clazz : finder.findMetaAnnotatedClasses(MBean.class)) {
> +                final String name = clazz.get().getName();
> +                if (done.contains(name)) {
> +                    continue;
>                 }
> +
> +                appModule.getAdditionalLibMbeans().add(name);
>             }
>         }
> -        return mbeans;
> -    }
> 
> -    private static ObjectName getObjectName(Class<?> mBean, String id) {
> -        ObjectNameBuilder builder = new ObjectNameBuilder("openejb.user.mbeans");
> -        builder.set("group", mBean.getPackage().getName());
> -        builder.set("application", id);
> -        builder.set("name", mBean.getSimpleName());
> -        return builder.build();
> +        return appModule;
>     }
> }
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java Wed Mar  7 22:24:07 2012
> @@ -20,7 +20,9 @@ import org.apache.openejb.config.sys.Res
> import org.apache.openejb.jee.bval.ValidationConfigType;
> 
> import java.util.HashMap;
> +import java.util.HashSet;
> import java.util.Map;
> +import java.util.Set;
> 
> public class Module {
>     private static int currentId = 1; // unique id to be able to bind something for each module in the jndi tree
> @@ -34,6 +36,7 @@ public class Module {
>     private String uniqueId = null;
>     private AppModule appModule = null;
>     private Resources resources = null;
> +    private final Set<String> mbeans = new HashSet<String>();
> 
>     public Module(boolean needId) {
>         if (needId) {
> @@ -103,4 +106,8 @@ public class Module {
> 
>         this.resources = resources;
>     }
> +
> +    public Set<String> getMbeans() {
> +        return mbeans;
> +    }
> }
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java Wed Mar  7 22:24:07 2012
> @@ -16,15 +16,9 @@
>  */
> package org.apache.openejb.monitoring;
> 
> -import java.lang.reflect.InvocationTargetException;
> -import java.lang.reflect.Method;
> -import java.lang.reflect.Modifier;
> -import java.util.ArrayList;
> -import java.util.HashMap;
> -import java.util.Iterator;
> -import java.util.List;
> -import java.util.Map;
> -import java.util.ResourceBundle;
> +import org.apache.openejb.util.LogCategory;
> +import org.apache.openejb.util.Logger;
> +
> import javax.management.Attribute;
> import javax.management.AttributeList;
> import javax.management.AttributeNotFoundException;
> @@ -43,8 +37,14 @@ import javax.management.ManagedOperation
> import javax.management.NotificationInfo;
> import javax.management.NotificationInfos;
> import javax.management.ReflectionException;
> -import org.apache.openejb.util.LogCategory;
> -import org.apache.openejb.util.Logger;
> +import java.lang.reflect.InvocationTargetException;
> +import java.lang.reflect.Method;
> +import java.lang.reflect.Modifier;
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> +import java.util.ResourceBundle;
> 
> public class DynamicMBeanWrapper implements DynamicMBean {
>     public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_DEPLOY, DynamicMBeanWrapper.class);
> @@ -152,28 +152,11 @@ public class DynamicMBeanWrapper impleme
>                 notificationInfos.toArray(new MBeanNotificationInfo[notificationInfos.size()]));
>     }
> 
> -    public DynamicMBeanWrapper(Class<?> annotatedMBean) {
> -        this(instantiate(annotatedMBean));
> -    }
> -
> -    private static Object instantiate(Class<?> annotatedMBean) {
> -        try {
> -            return annotatedMBean.newInstance();
> -        } catch (InstantiationException ie) {
> -            logger.error("can't instantiate " + annotatedMBean.getName(), ie);
> -            throw new IllegalArgumentException(annotatedMBean.getName());
> -        } catch (IllegalAccessException iae) {
> -            logger.error("can't instantiate " + annotatedMBean.getName(), iae);
> -            throw new IllegalArgumentException(annotatedMBean.getName());
> -        }
> -    }
> -
>     private MBeanNotificationInfo getNotificationInfo(NotificationInfo n) {
>         String description = getDescription(n.description(), "-");
> -        MBeanNotificationInfo ni = new MBeanNotificationInfo(n.types(),
> +        return new MBeanNotificationInfo(n.types(),
>             n.notificationClass().getName(), description,
>             new ImmutableDescriptor(n.descriptorFields()));
> -        return ni;
>     }
> 
>     private String getDescription(Description d, String defaultValue) {
> @@ -251,10 +234,8 @@ public class DynamicMBeanWrapper impleme
>     @Override
>     public AttributeList setAttributes(AttributeList attributes) {
>         AttributeList list = new AttributeList();
> -        Iterator<Object> it = attributes.iterator();
> -
> -        while (it.hasNext()) {
> -            Attribute attr = (Attribute) it.next();
> +        for (Object o : attributes) {
> +            final Attribute attr = (Attribute) o;
>             try {
>                 setAttribute(attr);
>                 list.add(attr);
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/MBeanDeployerTest.java Wed Mar  7 22:24:07 2012
> @@ -16,218 +16,148 @@
>  */
> package org.apache.openejb.config;
> 
> -import java.lang.management.ManagementFactory;
> -import java.util.Scanner;
> -import javax.management.Attribute;
> -import javax.management.MBeanServer;
> -import javax.management.ObjectName;
> +import org.apache.openejb.assembler.classic.AppInfo;
> import org.apache.openejb.assembler.classic.Assembler;
> import org.apache.openejb.assembler.classic.ProxyFactoryInfo;
> import org.apache.openejb.assembler.classic.SecurityServiceInfo;
> import org.apache.openejb.assembler.classic.TransactionServiceInfo;
> -import org.apache.openejb.config.AppModule;
> -import org.apache.openejb.config.ConfigurationFactory;
> -import org.apache.openejb.config.EjbModule;
> +import org.apache.openejb.jee.Beans;
> import org.apache.openejb.jee.EjbJar;
> import org.apache.openejb.loader.SystemInstance;
> +import org.apache.openejb.mbeans.Empty;
> +import org.apache.openejb.mbeans.Inheritance;
> +import org.apache.openejb.mbeans.MBeanDescription;
> +import org.apache.openejb.mbeans.Operation;
> +import org.apache.openejb.mbeans.OperationDescription;
> +import org.apache.openejb.mbeans.Reader;
> +import org.apache.openejb.mbeans.ReaderDescription;
> +import org.apache.openejb.mbeans.ReaderWriter;
> +import org.apache.openejb.monitoring.LocalMBeanServer;
> import org.junit.After;
> import org.junit.Before;
> import org.junit.Test;
> 
> +import javax.management.Attribute;
> +import javax.management.MBeanServer;
> +import javax.management.ObjectName;
> +import java.util.Arrays;
> +import java.util.HashSet;
> +import java.util.Set;
> +
> import static junit.framework.Assert.assertEquals;
> import static junit.framework.Assert.assertTrue;
> 
> -/**
> - * Note: each MBeans are at least deployed twice (using old and spec module name).
> - *
> - *         openejb.user.mbeans.list=org.apache.openejb.mbeans.Empty,
> - *         org.apache.openejb.mbeans.Inheritance,
> - *         org.apache.openejb.mbeans.MBeanDescription,
> - *         org.apache.openejb.mbeans.MBeanNotificationlistener,
> - *         org.apache.openejb.mbeans.MultipleNotifications,
> - *         org.apache.openejb.mbeans.Notificater,
> - *         org.apache.openejb.mbeans.Operation,
> - *         org.apache.openejb.mbeans.OperationDescription,
> - *         org.apache.openejb.mbeans.Reader,
> - *         org.apache.openejb.mbeans.ReaderWriter,
> - *         org.apache.openejb.mbeans.ReaderDescription
> - */
> public class MBeanDeployerTest {
> -    private static final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
> -    private static final String LIST_PROPR = "openejb.user.mbeans.list";
> +    private static final MBeanServer server = LocalMBeanServer.get();
> +
> +    private AppModule appModule;
> +    private Assembler assembler;
> +    private ConfigurationFactory config;
> +    private AppInfo appInfo;
> 
> -    private static AppModule appModule;
> -    private static Assembler assembler;
> -    private static ConfigurationFactory config;
> -
> -    /**
> -     * needs properties so it is not done in a @Before
> -     * because SystemInstance.get().setProperty(LIST_PROPR, ...) is done in @Test methods.
> -     */
> -    private void startOpenEJB() throws Exception {
> +    @Before
> +    public void startOpenEJB() throws Exception {
>         config = new ConfigurationFactory();
>         assembler = new Assembler();
>         assembler.createProxyFactory(config.configureService(ProxyFactoryInfo.class));
>         assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
>         assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
> 
> -        EjbJar ejbJar = new EjbJar();
> -        EjbModule ejbModule = new EjbModule(ejbJar);
> +        final EjbJar ejbJar = new EjbJar();
> +        final EjbModule ejbModule = new EjbModule(ejbJar);
> +        ejbModule.setBeans(new Beans());
> +        ejbModule.setModuleId("mbeans-test");
> +
> +        for (Class<?> clazz : Arrays.asList(Operation.class, OperationDescription.class,
> +                Reader.class, ReaderWriter.class, ReaderDescription.class,
> +                Empty.class, Inheritance.class, MBeanDescription.class)) {
> +            ejbModule.getBeans().addManagedClass(clazz);
> +            ejbModule.getMbeans().add(clazz.getName());
> +        }
> 
>         appModule = new AppModule(ejbModule.getClassLoader(), "mbeans");
>         appModule.getEjbModules().add(ejbModule);
> -        assembler.createApplication(config.configureApplication(appModule));
> +        appInfo = config.configureApplication(appModule);
> +        assembler.createApplication(appInfo);
>     }
> 
> -    @After public void resetList() {
> +    @After
> +    public void resetList() {
>         assembler.destroy();
>         SystemInstance.reset();
>     }
> 
> -    @Test public void empty() throws Exception {
> -        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Empty");
> -        startOpenEJB();
> -
> -        assertEquals(2, appModule.getMBeans().size());
> -
> -        ObjectName on = new ObjectName(appModule.getMBeans().iterator().next());
> -        String cn = on.getCanonicalName();
> -        assertTrue(cn.startsWith("openejb.user.mbeans"));
> -        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> -        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> -        assertTrue(cn.contains("name=Empty"));
> -        assertTrue(server.isRegistered(on));
> -    }
> -
> -    @Test public void reader() throws Exception {
> -        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Reader");
> -        startOpenEJB();
> -
> -        assertEquals(2, appModule.getMBeans().size());
> -        String cn = appModule.getMBeans().iterator().next();
> -        ObjectName on = new ObjectName(cn);
> -        assertTrue(cn.startsWith("openejb.user.mbeans"));
> -        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> -        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> -        assertTrue(cn.contains("name=Reader"));
> -        assertTrue(server.isRegistered(on));
> -        assertEquals(2, server.getAttribute(on, "value"));
> -    }
> -
> -    @Test public void writer() throws Exception {
> -        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.ReaderWriter");
> -        startOpenEJB();
> -
> -        assertEquals(2, appModule.getMBeans().size());
> -        String cn = appModule.getMBeans().iterator().next();
> -        ObjectName on = new ObjectName(cn);        assertTrue(cn.startsWith("openejb.user.mbeans"));
> -        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> -        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> -        assertTrue(cn.contains("name=ReaderWriter"));
> -        assertTrue(server.isRegistered(on));
> -        assertEquals(2, server.getAttribute(on, "value"));
> -        server.setAttribute(on, new Attribute("value", 5));
> -        assertEquals(5, server.getAttribute(on, "value"));
> -    }
> -
> -    @Test public void emptyAndReader() throws Exception {
> -        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Empty,org.apache.openejb.mbeans.Reader");
> -        startOpenEJB();
> -
> -        assertEquals(4, appModule.getMBeans().size());
> -        for (String cn : appModule.getMBeans()) {
> -            ObjectName on = new ObjectName(cn);
> -            assertTrue(cn.startsWith("openejb.user.mbeans"));
> -            assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> -            assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> -            assertTrue(cn.contains("name=Reader") || cn.contains("name=Empty"));
> -            assertTrue(server.isRegistered(on));
> +    @Test
> +    public void mbeans() throws Exception {
> +        final Set<String> parsed = new HashSet<String>();
> +        for (String name : appInfo.jmx.values()) {
> +            final ObjectName on = new ObjectName(name);
> +            final String cn = on.getCanonicalName();
> +            if (cn.contains("name=Empty")) {
> +                assertTrue(cn.startsWith("openejb.user.mbeans"));
> +                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> +                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> +                assertTrue(server.isRegistered(on));
> +                parsed.add(cn);
> +            } else if (cn.contains("name=Reader")) {
> +                assertTrue(cn.startsWith("openejb.user.mbeans"));
> +                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> +                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> +                assertTrue(server.isRegistered(on));
> +                assertEquals(2, server.getAttribute(on, "value"));
> +                parsed.add(cn);
> +            } else if (cn.contains("name=ReaderWriter")) {
> +                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> +                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> +                assertTrue(server.isRegistered(on));
> +                assertEquals(2, server.getAttribute(on, "value"));
> +                server.setAttribute(on, new Attribute("value", 5));
> +                assertEquals(5, server.getAttribute(on, "value"));
> +                parsed.add(cn);
> +            } else if (cn.contains("name=Inheritance")) {
> +                assertTrue(cn.startsWith("openejb.user.mbeans"));
> +                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> +                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> +                assertTrue(server.isRegistered(on));
> +                assertEquals(2, server.getAttribute(on, "value"));
> +                server.setAttribute(on, new Attribute("value", 5));
> +                assertEquals(5, server.getAttribute(on, "value"));
> +                assertEquals("yes - no", server.invoke(on, "returnValue", null, null));
> +                parsed.add(cn);
> +            } else if (cn.contains("name=MBeanDescription")) {
> +                assertTrue(cn.startsWith("openejb.user.mbeans"));
> +                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> +                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> +                assertTrue(server.isRegistered(on));
> +                assertEquals("descr ;)", server.getMBeanInfo(on).getDescription());
> +                parsed.add(cn);
> +            } else if (cn.contains("name=Operation")) {
> +                assertTrue(cn.startsWith("openejb.user.mbeans"));
> +                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> +                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> +                assertTrue(server.isRegistered(on));
> +                assertEquals("yes - no", server.invoke(on, "returnValue", null, null));
> +                parsed.add(cn);
> +            } else if (cn.contains("name=ReaderDescription")) {
> +                assertTrue(cn.startsWith("openejb.user.mbeans"));
> +                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> +                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> +                assertTrue(cn.contains("name=ReaderDescription"));
> +                assertTrue(server.isRegistered(on));
> +                assertEquals(1, server.getMBeanInfo(on).getAttributes().length);
> +                assertEquals("just a value", server.getMBeanInfo(on).getAttributes()[0].getDescription());
> +                parsed.add(cn);
> +            } else if (cn.contains("name=OperationDescription")) {
> +                assertTrue(cn.startsWith("openejb.user.mbeans"));
> +                assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> +                assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> +                assertTrue(server.isRegistered(on));
> +                assertEquals(1, server.getMBeanInfo(on).getOperations().length);
> +                assertEquals("just an op", server.getMBeanInfo(on).getOperations()[0].getDescription());
> +                parsed.add(cn);
> +            }
>         }
> -    }
> -
> -    @Test public void inheritance() throws Exception {
> -        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Inheritance");
> -        startOpenEJB();
> -
> -        assertEquals(2, appModule.getMBeans().size());
> -
> -        String cn = appModule.getMBeans().iterator().next();
> -        ObjectName on = new ObjectName(cn);
> -        assertTrue(cn.startsWith("openejb.user.mbeans"));
> -        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> -        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> -        assertTrue(cn.contains("name=Inheritance"));
> -        assertTrue(server.isRegistered(on));
> -        assertEquals(2, server.getAttribute(on, "value"));
> -        server.setAttribute(on, new Attribute("value", 5));
> -        assertEquals(5, server.getAttribute(on, "value"));
> -        assertEquals("yes - no", server.invoke(on, "returnValue", null, null));
> -    }
> -
> -    @Test public void description() throws Exception {
> -        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.MBeanDescription");
> -        startOpenEJB();
> -
> -        assertEquals(2, appModule.getMBeans().size());
> -
> -        String cn = appModule.getMBeans().iterator().next();
> -        ObjectName on = new ObjectName(cn);
> -        assertTrue(cn.startsWith("openejb.user.mbeans"));
> -        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> -        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> -        assertTrue(cn.contains("name=MBeanDescription"));
> -        assertTrue(server.isRegistered(on));
> -        assertEquals("descr ;)", server.getMBeanInfo(on).getDescription());
> -    }
> -
> -    @Test public void operation() throws Exception {
> -        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.Operation");
> -        startOpenEJB();
> -
> -        assertEquals(2, appModule.getMBeans().size());
> -
> -        String cn = appModule.getMBeans().iterator().next();
> -        ObjectName on = new ObjectName(cn);
> -        assertTrue(cn.startsWith("openejb.user.mbeans"));
> -        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> -        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> -        assertTrue(cn.contains("name=Operation"));
> -        assertTrue(server.isRegistered(on));
> -        assertEquals("yes - no", server.invoke(on, "returnValue", null, null));
> -    }
> -
> -    @Test public void readerDescription() throws Exception {
> -        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.ReaderDescription");
> -        startOpenEJB();
> -
> -        assertEquals(2, appModule.getMBeans().size());
> -
> -        String cn = appModule.getMBeans().iterator().next();
> -        ObjectName on = new ObjectName(cn);
> -        assertTrue(cn.startsWith("openejb.user.mbeans"));
> -        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> -        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> -        assertTrue(cn.contains("name=ReaderDescription"));
> -        assertTrue(server.isRegistered(on));
> -        assertEquals(1, server.getMBeanInfo(on).getAttributes().length);
> -        assertEquals("just a value", server.getMBeanInfo(on).getAttributes()[0].getDescription());
> -    }
> -
> -    @Test public void operationDescription() throws Exception {
> -        SystemInstance.get().setProperty(LIST_PROPR, "org.apache.openejb.mbeans.OperationDescription");
> -        startOpenEJB();
> -
> -        assertEquals(2, appModule.getMBeans().size());
> -
> -        String cn = appModule.getMBeans().iterator().next();
> -        ObjectName on = new ObjectName(cn);
> -        assertTrue(cn.startsWith("openejb.user.mbeans"));
> -        assertTrue(cn.contains("group=org.apache.openejb.mbeans"));
> -        assertTrue(cn.contains("application=mbeans") || cn.contains("application=EjbModule"));
> -        assertTrue(cn.contains("name=OperationDescription"));
> -        assertTrue(server.isRegistered(on));
> -        assertEquals(1, server.getMBeanInfo(on).getOperations().length);
> -        assertEquals("just an op", server.getMBeanInfo(on).getOperations()[0].getDescription());
> +        assertEquals(8, parsed.size());
>     }
> }
> 
> 
> Modified: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java (original)
> +++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Inheritance.java Wed Mar  7 22:24:07 2012
> @@ -18,10 +18,11 @@ package org.apache.openejb.mbeans;
> 
> import javax.management.Description;
> import javax.management.MBean;
> +import javax.management.ManagedAttribute;
> import javax.management.ManagedOperation;
> 
> @MBean
> -public class Inheritance extends ReaderWriter {
> +public class Inheritance extends Parent {
> 	@ManagedOperation @Description("just an op") public String returnValue() {
> 		return "yes - no";
> 	}
> 
> Added: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java?rev=1298167&view=auto
> ==============================================================================
> --- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java (added)
> +++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/mbeans/Parent.java Wed Mar  7 22:24:07 2012
> @@ -0,0 +1,21 @@
> +package org.apache.openejb.mbeans;
> +
> +import javax.management.Description;
> +import javax.management.ManagedAttribute;
> +
> +// simply a copy of ReaderWriter but abstract to avoid CDI conflict
> +public abstract class Parent {
> +    private int i = -1;
> +
> +    @ManagedAttribute
> +    @Description("just a value") public int getValue() {
> +        if (i < 0) {
> +            return 2;
> +        }
> +        return i;
> +    }
> +
> +    @ManagedAttribute public void setValue(int v) {
> +        i = v;
> +    }
> +}
> 
> Modified: openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java?rev=1298167&r1=1298166&r2=1298167&view=diff
> ==============================================================================
> --- openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java (original)
> +++ openejb/trunk/openejb/examples/mbean-auto-registration/src/test/java/org/superbiz/mbean/GuessHowManyMBeanTest.java Wed Mar  7 22:24:07 2012
> @@ -20,7 +20,6 @@ import org.junit.Test;
> 
> import javax.ejb.embeddable.EJBContainer;
> import javax.management.Attribute;
> -import javax.management.MBeanInfo;
> import javax.management.MBeanServer;
> import javax.management.ObjectName;
> import java.lang.management.ManagementFactory;
> @@ -34,12 +33,10 @@ public class GuessHowManyMBeanTest {
>     @Test
>     public void play() throws Exception {
>         Properties properties = new Properties();
> -        properties.setProperty("openejb.user.mbeans.list", GuessHowManyMBean.class.getName());
>         EJBContainer container = EJBContainer.createEJBContainer(properties);
> 
>         MBeanServer server = ManagementFactory.getPlatformMBeanServer();
>         ObjectName objectName = new ObjectName(OBJECT_NAME);
> -        MBeanInfo infos = server.getMBeanInfo(objectName);
>         assertEquals(0, server.getAttribute(objectName, "value"));
>         server.setAttribute(objectName, new Attribute("value", 3));
>         assertEquals(3, server.getAttribute(objectName, "value"));
> 
> 
>