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;
+ }
+ }
+}