You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by no...@apache.org on 2011/07/06 11:22:40 UTC

svn commit: r1143307 - in /aries/trunk/jmx/jmx-whiteboard/src: main/java/org/apache/aries/jmx/whiteboard/ test/java/org/apache/aries/jmx/whiteboard/integration/ test/java/org/apache/aries/jmx/whiteboard/integration/helper2/

Author: not
Date: Wed Jul  6 09:22:39 2011
New Revision: 1143307

URL: http://svn.apache.org/viewvc?rev=1143307&view=rev
Log:
ARIES-702 Commit patch to use reflection to pick up the MBean type from the service registry. Patch provided by fmeschbe. The original patch did not compile on my machine, because it did new StandardMBean(Object, Class<?>) which doesn't match new StandardMBean(T, Class<T>) so I've fixed this.

Added:
    aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/helper2/
    aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/helper2/TestClass2.java   (with props)
Modified:
    aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/Activator.java
    aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/JmxWhiteboardSupport.java
    aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/MBeanHolder.java
    aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/MBeanTest.java

Modified: aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/Activator.java
URL: http://svn.apache.org/viewvc/aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/Activator.java?rev=1143307&r1=1143306&r2=1143307&view=diff
==============================================================================
--- aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/Activator.java (original)
+++ aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/Activator.java Wed Jul  6 09:22:39 2011
@@ -22,7 +22,6 @@ import javax.management.MBeanServer;
 
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.util.tracker.ServiceTracker;
@@ -84,14 +83,13 @@ public class Activator implements Bundle
     private class MBeanTracker extends ServiceTracker {
 
         /**
-         * Listens for any services registered with an interface whose name ends
-         * with "MBean". This matches all simple MBeans which have to implement
-         * an interface named after the class with a suffix of MBean. It also
-         * matches DynamicMBeans and all its extensions like open MBeans, model
-         * MBeans and StandardMBeans.
+         * Listens for any services registered with a "jmx.objectname" service
+         * property. If the property is not a non-empty String object the service
+         * is expected to implement the MBeanRegistration interface to create
+         * the name dynamically.
          */
         private static final String SIMPLE_MBEAN_FILTER = "("
-            + Constants.OBJECTCLASS + "=*MBean)";
+            + JmxWhiteboardSupport.PROP_OBJECT_NAME+ "=*)";
 
         public MBeanTracker(BundleContext context)
                 throws InvalidSyntaxException {

Modified: aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/JmxWhiteboardSupport.java
URL: http://svn.apache.org/viewvc/aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/JmxWhiteboardSupport.java?rev=1143307&r1=1143306&r2=1143307&view=diff
==============================================================================
--- aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/JmxWhiteboardSupport.java (original)
+++ aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/JmxWhiteboardSupport.java Wed Jul  6 09:22:39 2011
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
 
 class JmxWhiteboardSupport {
 
-    private static final String PROP_OBJECT_NAME = "jmx.objectname";
+    static final String PROP_OBJECT_NAME = "jmx.objectname";
 
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -79,12 +79,22 @@ class JmxWhiteboardSupport {
 
         ObjectName objectName = getObjectName(props);
         if (objectName != null || mbean instanceof MBeanRegistration) {
-            MBeanHolder holder = new MBeanHolder(mbean, objectName);
-            MBeanServer[] mbeanServers = this.mbeanServers;
-            for (MBeanServer mbeanServer : mbeanServers) {
-                holder.register(mbeanServer);
+            MBeanHolder holder = MBeanHolder.create(mbean, objectName);
+            if (holder != null) {
+                MBeanServer[] mbeanServers = this.mbeanServers;
+                for (MBeanServer mbeanServer : mbeanServers) {
+                    holder.register(mbeanServer);
+                }
+                mbeans.put(mbean, holder);
+            } else {
+                log.error(
+                    "registerMBean: Cannot register MBean service {} with MBean servers: Not an instanceof DynamicMBean or not MBean spec compliant standard MBean",
+                    mbean);
             }
-            mbeans.put(mbean, holder);
+        } else {
+            log.error(
+                "registerMBean: MBean service {} not registered with valid jmx.objectname propety and not implementing MBeanRegistration interface; not registering with MBean servers",
+                mbean);
         }
     }
 

Modified: aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/MBeanHolder.java
URL: http://svn.apache.org/viewvc/aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/MBeanHolder.java?rev=1143307&r1=1143306&r2=1143307&view=diff
==============================================================================
--- aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/MBeanHolder.java (original)
+++ aries/trunk/jmx/jmx-whiteboard/src/main/java/org/apache/aries/jmx/whiteboard/MBeanHolder.java Wed Jul  6 09:22:39 2011
@@ -22,6 +22,7 @@ import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import javax.management.DynamicMBean;
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.InstanceNotFoundException;
 import javax.management.MBeanRegistrationException;
@@ -29,6 +30,7 @@ import javax.management.MBeanServer;
 import javax.management.NotCompliantMBeanException;
 import javax.management.ObjectInstance;
 import javax.management.ObjectName;
+import javax.management.StandardMBean;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,7 +46,62 @@ final class MBeanHolder {
 
     private final Map<MBeanServer, ObjectName> registrations;
 
-    MBeanHolder(final Object mbean, final ObjectName requestedObjectName) {
+    static <T> MBeanHolder create(final T mbean,
+            final ObjectName requestedObjectName) {
+        if (mbean instanceof DynamicMBean) {
+            return new MBeanHolder(mbean, requestedObjectName);
+        } else if (mbean == null) {
+            return null;
+        }
+
+        Class<?> mbeanClass = mbean.getClass();
+        @SuppressWarnings("unchecked") // This is all in aid of getting new StandardMBean to work.
+        Class<T> mbeanInterface = (Class<T>) getMBeanInterface(mbeanClass);
+        if (mbeanInterface == null) {
+            return null;
+        }
+
+        if (mbeanInterface.getName().equals(
+            mbeanClass.getName().concat("MBean"))) {
+            return new MBeanHolder(mbean, requestedObjectName);
+        }
+
+        try {
+            StandardMBean stdMbean = new StandardMBean(mbean, mbeanInterface);
+            return new MBeanHolder(stdMbean, requestedObjectName);
+        } catch (NotCompliantMBeanException e) {
+            LoggerFactory.getLogger(MBeanHolder.class).error(
+                "create: Cannot create StandardMBean for " + mbean
+                    + " of type " + mbeanClass + " for interface "
+                    + mbeanInterface, e);
+            return null;
+        }
+    }
+
+    private static Class<?> getMBeanInterface(final Class<?> mbeanClass) {
+        if (mbeanClass == null) {
+            return null;
+        }
+
+        for (Class<?> i : mbeanClass.getInterfaces()) {
+            if (i.getName().endsWith("MBean")) {
+                return i;
+            }
+
+            Class<?> mbeanInterface = getMBeanInterface(i);
+            if (mbeanInterface != null) {
+                return mbeanInterface;
+            }
+        }
+
+        if (mbeanClass.getSuperclass() != null) {
+            return getMBeanInterface(mbeanClass.getSuperclass());
+        }
+
+        return null;
+    }
+
+    private MBeanHolder(final Object mbean, final ObjectName requestedObjectName) {
         this.mbean = mbean;
         this.requestedObjectName = requestedObjectName;
         this.registrations = new IdentityHashMap<MBeanServer, ObjectName>();

Modified: aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/MBeanTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/MBeanTest.java?rev=1143307&r1=1143306&r2=1143307&view=diff
==============================================================================
--- aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/MBeanTest.java (original)
+++ aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/MBeanTest.java Wed Jul  6 09:22:39 2011
@@ -28,6 +28,7 @@ import org.apache.aries.jmx.whiteboard.i
 import org.apache.aries.jmx.whiteboard.integration.helper.TestClass;
 import org.apache.aries.jmx.whiteboard.integration.helper.TestClassMBean;
 import org.apache.aries.jmx.whiteboard.integration.helper.TestStandardMBean;
+import org.apache.aries.jmx.whiteboard.integration.helper2.TestClass2;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
@@ -66,6 +67,32 @@ public class MBeanTest extends Integrati
     }
 
     @Test
+    public void test_simple_MBean_different_package() throws Exception {
+        final String instanceName = "simple.test.instance.2";
+        final String objectNameString = "domain:instance=" + instanceName;
+        final ObjectName objectName = new ObjectName(objectNameString);
+        final TestClass testInstance = new TestClass2(instanceName);
+
+        final MBeanServer server = getStaticMBeanServer();
+
+        // expect MBean to not be registered yet
+        assertNotRegistered(server, objectName);
+
+        // expect the MBean to be registered with the static server
+        final ServiceRegistration reg = registerService(
+            TestClassMBean.class.getName(), testInstance, objectNameString);
+        assertRegistered(server, objectName);
+
+        // expect MBean to return expected value
+        TestCase.assertEquals(instanceName,
+            server.getAttribute(objectName, "InstanceName"));
+
+        // unregister MBean, expect to not be registered any more
+        reg.unregister();
+        assertNotRegistered(server, objectName);
+    }
+
+    @Test
     public void test_StandardMBean() throws Exception {
         final String instanceName = "standard.test.instance";
         final String objectNameString = "domain:instance=" + instanceName;

Added: aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/helper2/TestClass2.java
URL: http://svn.apache.org/viewvc/aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/helper2/TestClass2.java?rev=1143307&view=auto
==============================================================================
--- aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/helper2/TestClass2.java (added)
+++ aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/helper2/TestClass2.java Wed Jul  6 09:22:39 2011
@@ -0,0 +1,38 @@
+/*
+ * 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.aries.jmx.whiteboard.integration.helper2;
+
+import org.apache.aries.jmx.whiteboard.integration.helper.TestClass;
+
+
+/**
+ * The <code>TestClass2</code> is a simple class which will be registered as a
+ * Simple MBean implementing the {@link TestClassMBean} interface.
+ */
+public class TestClass2 extends TestClass {
+
+    public TestClass2() {
+        this(null);
+    }
+
+    public TestClass2(final String name) {
+        super(name);
+    }
+
+}

Propchange: aries/trunk/jmx/jmx-whiteboard/src/test/java/org/apache/aries/jmx/whiteboard/integration/helper2/TestClass2.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain