You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2014/04/17 16:45:08 UTC

svn commit: r1588271 - in /tomee/tomee/trunk/container/openejb-core/src: main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java test/java/org/apache/openejb/monitoring/TestDynamicMBeanWrapper.java

Author: jlmonteiro
Date: Thu Apr 17 14:45:07 2014
New Revision: 1588271

URL: http://svn.apache.org/r1588271
Log:
TOMEE-1181 support MBeanRegistration API with our @MBean feature

Added:
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/monitoring/TestDynamicMBeanWrapper.java
Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java?rev=1588271&r1=1588270&r2=1588271&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java Thu Apr 17 14:45:07 2014
@@ -16,16 +16,17 @@
  */
 package org.apache.openejb.monitoring;
 
-import org.apache.openejb.api.internal.Internal;
-import org.apache.openejb.api.jmx.Description;
-import org.apache.openejb.api.jmx.MBean;
-import org.apache.openejb.api.jmx.ManagedAttribute;
-import org.apache.openejb.api.jmx.ManagedOperation;
-import org.apache.openejb.api.jmx.NotificationInfo;
-import org.apache.openejb.api.jmx.NotificationInfos;
-import org.apache.openejb.util.LogCategory;
-import org.apache.openejb.util.Logger;
-import org.apache.webbeans.config.WebBeansContext;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
 
 import javax.management.Attribute;
 import javax.management.AttributeList;
@@ -41,20 +42,23 @@ import javax.management.MBeanInfo;
 import javax.management.MBeanNotificationInfo;
 import javax.management.MBeanOperationInfo;
 import javax.management.MBeanParameterInfo;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
 import javax.management.ReflectionException;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Proxy;
-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 {
+import org.apache.openejb.api.internal.Internal;
+import org.apache.openejb.api.jmx.Description;
+import org.apache.openejb.api.jmx.MBean;
+import org.apache.openejb.api.jmx.ManagedAttribute;
+import org.apache.openejb.api.jmx.ManagedOperation;
+import org.apache.openejb.api.jmx.NotificationInfo;
+import org.apache.openejb.api.jmx.NotificationInfos;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+import org.apache.webbeans.config.WebBeansContext;
+
+public class DynamicMBeanWrapper implements DynamicMBean, MBeanRegistration {
     public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_DEPLOY, DynamicMBeanWrapper.class);
 
     private static final Map<Class<?>, CacheInfo> CACHE = new HashMap<Class<?>, CacheInfo>();
@@ -426,6 +430,63 @@ public class DynamicMBeanWrapper impleme
         throw new MBeanException(new IllegalArgumentException(), actionName + " doesn't exist");
     }
 
+    @Override
+    public ObjectName preRegister(final MBeanServer server, final ObjectName name) throws Exception {
+        final Thread thread = Thread.currentThread();
+        final ClassLoader oldCl = thread.getContextClassLoader();
+        thread.setContextClassLoader(classloader);
+        try {
+            if (MBeanRegistration.class.isInstance(instance)) {
+                return MBeanRegistration.class.cast(instance).preRegister(server, name);
+            }
+            return name;
+        } finally {
+            thread.setContextClassLoader(oldCl);
+        }
+    }
+
+    @Override
+    public void postRegister(final Boolean registrationDone) {
+        final Thread thread = Thread.currentThread();
+        final ClassLoader oldCl = thread.getContextClassLoader();
+        thread.setContextClassLoader(classloader);
+        try {
+            if (MBeanRegistration.class.isInstance(instance)) {
+                MBeanRegistration.class.cast(instance).postRegister(registrationDone);
+            }
+        } finally {
+            thread.setContextClassLoader(oldCl);
+        }
+    }
+
+    @Override
+    public void preDeregister() throws Exception {
+        final Thread thread = Thread.currentThread();
+        final ClassLoader oldCl = thread.getContextClassLoader();
+        thread.setContextClassLoader(classloader);
+        try {
+            if (MBeanRegistration.class.isInstance(instance)) {
+                MBeanRegistration.class.cast(instance).preDeregister();
+            }
+        } finally {
+            thread.setContextClassLoader(oldCl);
+        }
+    }
+
+    @Override
+    public void postDeregister() {
+        final Thread thread = Thread.currentThread();
+        final ClassLoader oldCl = thread.getContextClassLoader();
+        thread.setContextClassLoader(classloader);
+        try {
+            if (MBeanRegistration.class.isInstance(instance)) {
+                MBeanRegistration.class.cast(instance).postDeregister();
+            }
+        } finally {
+            thread.setContextClassLoader(oldCl);
+        }
+    }
+
     private static class AnnotationHandler implements InvocationHandler {
         private final Object delegate;
 

Added: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/monitoring/TestDynamicMBeanWrapper.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/monitoring/TestDynamicMBeanWrapper.java?rev=1588271&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/monitoring/TestDynamicMBeanWrapper.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/monitoring/TestDynamicMBeanWrapper.java Thu Apr 17 14:45:07 2014
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.monitoring;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.openejb.api.jmx.ManagedOperation;
+import org.junit.Test;
+
+public class TestDynamicMBeanWrapper {
+    @Test // just to ensure MBeanRegistrationSupport doesn't break anything
+    public void normalMBeanCanStillBeRegistered() throws Exception {
+        final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        final DynamicMBeanWrapper wrapper = new DynamicMBeanWrapper(new MyNotLifecycleAwareMBean());
+        final ObjectName on = new ObjectName("org.superbiz.foo:type=dummy2");
+        try {
+            server.registerMBean(wrapper, on);
+            assertTrue(server.isRegistered(on));
+            assertEquals("ok", server.invoke(on, "value", new Object[0], null));
+        } finally {
+            server.unregisterMBean(on);
+        }
+    }
+
+    @Test
+    public void mbeanRegistrationSupport() throws Exception {
+        final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        final DynamicMBeanWrapper wrapper = new DynamicMBeanWrapper(new MyMBean());
+        assertFalse(MyMBean.postDeregister);
+        assertFalse(MyMBean.preDeregister);
+        assertFalse(MyMBean.preRegister);
+        assertFalse(MyMBean.postRegister);
+        final ObjectName on = new ObjectName("org.superbiz.foo:type=dummy");
+        try {
+            server.registerMBean(wrapper, on);
+            assertTrue(server.isRegistered(on));
+        } finally {
+            server.unregisterMBean(on);
+        }
+        assertTrue(MyMBean.postDeregister);
+        assertTrue(MyMBean.preDeregister);
+        assertTrue(MyMBean.preRegister);
+        assertTrue(MyMBean.postRegister);
+    }
+
+    public static class MyNotLifecycleAwareMBean {
+        @ManagedOperation
+        public String value() {
+            return "ok";
+        }
+    }
+    public static class MyMBean implements MBeanRegistration {
+        private static boolean preRegister = false;
+        private static boolean postRegister = false;
+        private static boolean preDeregister = false;
+        private static boolean postDeregister = false;
+
+        @Override
+        public ObjectName preRegister(final MBeanServer server, final ObjectName name) throws Exception {
+            preRegister = true;
+            return name;
+        }
+
+        @Override
+        public void postRegister(final Boolean registrationDone) {
+            postRegister = true;
+        }
+
+        @Override
+        public void preDeregister() throws Exception {
+            preDeregister = true;
+        }
+
+        @Override
+        public void postDeregister() {
+            postDeregister = true;
+        }
+    }
+}