TOMEE-1668 @MBean(objectName) support
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/3b161695 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/3b161695 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/3b161695 Branch: refs/heads/tomee-7.0.0-M1 Commit: 3b161695d046f49ba243cf672274deb721fbacef Parents: 3ff6ff6 Author: Romain Manni-Bucau <rmann...@gmail.com> Authored: Thu Nov 26 17:50:45 2015 +0100 Committer: Romain Manni-Bucau <rmann...@gmail.com> Committed: Thu Nov 26 17:50:45 2015 +0100 ---------------------------------------------------------------------- .../java/org/apache/openejb/api/jmx/MBean.java | 1 + .../openejb/assembler/classic/Assembler.java | 6 +- .../openejb/testing/ApplicationComposers.java | 13 +++- .../config/CustomObjectNameMBeanTest.java | 74 ++++++++++++++++++++ 4 files changed, 90 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/3b161695/container/openejb-api/src/main/java/org/apache/openejb/api/jmx/MBean.java ---------------------------------------------------------------------- diff --git a/container/openejb-api/src/main/java/org/apache/openejb/api/jmx/MBean.java b/container/openejb-api/src/main/java/org/apache/openejb/api/jmx/MBean.java index 0d89e42..c6e4f81 100644 --- a/container/openejb-api/src/main/java/org/apache/openejb/api/jmx/MBean.java +++ b/container/openejb-api/src/main/java/org/apache/openejb/api/jmx/MBean.java @@ -26,5 +26,6 @@ import java.lang.annotation.Target; @Target(value = ElementType.TYPE) @Inherited public @interface MBean { + String objectName() default ""; } http://git-wip-us.apache.org/repos/asf/tomee/blob/3b161695/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java index 7064052..4b5ed1f 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java @@ -39,6 +39,7 @@ import org.apache.openejb.NoSuchApplicationException; import org.apache.openejb.OpenEJBException; import org.apache.openejb.OpenEJBRuntimeException; import org.apache.openejb.UndeployException; +import org.apache.openejb.api.jmx.MBean; import org.apache.openejb.api.resource.DestroyableResource; import org.apache.openejb.assembler.classic.event.AssemblerAfterApplicationCreated; import org.apache.openejb.assembler.classic.event.AssemblerBeforeApplicationDestroyed; @@ -1613,11 +1614,12 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A final MBeanServer server = LocalMBeanServer.get(); try { - final ObjectName leaf = new ObjectNameBuilder("openejb.user.mbeans") + final MBean annotation = clazz.getAnnotation(MBean.class); + final ObjectName leaf = annotation == null || annotation.objectName().isEmpty() ? new ObjectNameBuilder("openejb.user.mbeans") .set("application", id) .set("group", clazz.getPackage().getName()) .set("name", clazz.getSimpleName()) - .build(); + .build() : new ObjectName(annotation.objectName()); server.registerMBean(new DynamicMBeanWrapper(wc, instance), leaf); appMbeans.put(mbeanClass, leaf.getCanonicalName()); http://git-wip-us.apache.org/repos/asf/tomee/blob/3b161695/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java index 1a85edd..d7c42f2 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java @@ -1039,15 +1039,24 @@ public class ApplicationComposers { SystemInstance.get().setComponent((Class<Object>) key, value); } - public void evaluate(final Object testInstance, final Callable<Void> next) throws Exception { + public <T> T evaluate(final Object testInstance, final Callable<T> next) throws Exception { before(testInstance); try { - next.call(); + return next.call(); } finally { ThreadContext.exit(previous); after(); } + } + public void evaluate(final Object testInstance, final Runnable next) throws Exception { + evaluate(testInstance, new Callable<Void>() { + @Override + public Void call() throws Exception { + next.run(); + return null; + } + }); } public void after() throws Exception { http://git-wip-us.apache.org/repos/asf/tomee/blob/3b161695/container/openejb-core/src/test/java/org/apache/openejb/config/CustomObjectNameMBeanTest.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/test/java/org/apache/openejb/config/CustomObjectNameMBeanTest.java b/container/openejb-core/src/test/java/org/apache/openejb/config/CustomObjectNameMBeanTest.java new file mode 100644 index 0000000..da98276 --- /dev/null +++ b/container/openejb-core/src/test/java/org/apache/openejb/config/CustomObjectNameMBeanTest.java @@ -0,0 +1,74 @@ +/** + * 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.config; + +import org.apache.openejb.api.jmx.MBean; +import org.apache.openejb.api.jmx.ManagedAttribute; +import org.apache.openejb.testing.ApplicationComposers; +import org.apache.openejb.testing.Classes; +import org.junit.Test; + +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; +import java.lang.management.ManagementFactory; + +import static org.junit.Assert.assertEquals; + +@Classes(innerClassesAsBean = true) +public class CustomObjectNameMBeanTest { + @Test + public void run() throws Exception { + final MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + mbeanState(server, false); + new ApplicationComposers(this).evaluate(this, new Runnable() { + @Override + public void run() { + try { + mbeanState(server, true); + assertEquals(1, server.getAttribute(new ObjectName("openejb.user.mbeans:application=openejb,group=org.apache.openejb.config,name=DefaultName"), "value")); + assertEquals(2, server.getAttribute(new ObjectName("foo:type=bar,custom=yes"), "value")); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } + }); + mbeanState(server, false); + } + + private void mbeanState(final MBeanServer server, final boolean registered) throws MalformedObjectNameException { + assertEquals(registered, server.isRegistered(new ObjectName("openejb.user.mbeans:application=openejb,group=org.apache.openejb.config,name=DefaultName"))); + assertEquals(registered, server.isRegistered(new ObjectName("foo:type=bar,custom=yes"))); + } + + @MBean + public static class DefaultName { + @ManagedAttribute + public int getValue() { + return 1; + } + } + + @MBean(objectName = "foo:type=bar,custom=yes") + public static class CustomName { + @ManagedAttribute + public int getValue() { + return 2; + } + } +} +