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"));
>
>
>