You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by eg...@apache.org on 2009/10/07 12:52:24 UTC

svn commit: r822656 - in /servicemix/smx4/nmr/trunk/nmr/management/src: main/java/org/apache/servicemix/nmr/management/ main/resources/OSGI-INF/blueprint/ test/java/org/apache/servicemix/nmr/management/

Author: eglynn
Date: Wed Oct  7 10:52:23 2009
New Revision: 822656

URL: http://svn.apache.org/viewvc?rev=822656&view=rev
Log:
Paul Taylor's fix for [SMX4NMR-160] Management agent cannot be easily extended 

Modified:
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java
    servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/OSGI-INF/blueprint/servicemix-nmr-management.xml
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/ManagementStrategyTest.java

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java?rev=822656&r1=822655&r2=822656&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java Wed Oct  7 10:52:23 2009
@@ -33,6 +33,8 @@
 import javax.management.modelmbean.RequiredModelMBean;
 import javax.management.modelmbean.InvalidTargetObjectTypeException;
 
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
 import org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler;
 import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource;
 import org.springframework.beans.factory.DisposableBean;
@@ -50,10 +52,13 @@
 
     private static final transient Log LOG = LogFactory.getLog(ManagementAgent.class);
 
+    private boolean enabled;
     private MBeanServer mbeanServer;
     private MetadataMBeanInfoAssembler assembler;
     private Set<ObjectName> mbeans = new HashSet<ObjectName>();
     private NamingStrategy namingStrategy;
+    private BundleContext bundleContext;
+    private ServiceRegistration serviceRegistration;
 
     public ManagementAgent() {
         assembler = new MetadataMBeanInfoAssembler();
@@ -148,7 +153,23 @@
             LOG.trace(event.toString());
         }
     }
- 
+
+    public void setBundleContext(BundleContext ctx) {
+        bundleContext = ctx;
+    }
+    
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+    
+    public void setEnabled(boolean b) {
+        enabled = b;
+    }    
+    
+    public boolean isEnabled() {
+        return enabled;
+    }
+    
     public MBeanServer getMbeanServer() {
         return mbeanServer;
     }
@@ -164,25 +185,36 @@
     public void setNamingStrategy(NamingStrategy namingStrategy) {
         this.namingStrategy = namingStrategy;
     }
+    
+    public void init() throws Exception {
+        if (isEnabled()) {
+            registerService();
+        }        
+    }
+           
 
     public void destroy() throws Exception {
         // Using the array to hold the busMBeans to avoid the
         // CurrentModificationException
-        Object[] mBeans = mbeans.toArray();
-        int caught = 0;
-        for (Object name : mBeans) {
-            mbeans.remove((ObjectName)name);
-            try {
-                unregister((ObjectName)name);
-            } catch (JMException jmex) {
-                LOG.info("Exception unregistering MBean", jmex);
-                caught++;
+        try {
+            Object[] mBeans = mbeans.toArray();
+            int caught = 0;
+            for (Object name : mBeans) {
+                mbeans.remove((ObjectName)name);
+                try {
+                    unregister((ObjectName)name);
+                } catch (JMException jmex) {
+                    LOG.info("Exception unregistering MBean", jmex);
+                    caught++;
+                }
             }
-        }
-        if (caught > 0) {
-            LOG.warn("A number of " + caught
-                     + " exceptions caught while unregistering MBeans during stop operation.  "
-                     + "See INFO log for details.");
+            if (caught > 0) {
+                LOG.warn("A number of " + caught
+                        + " exceptions caught while unregistering MBeans during stop operation.  "
+                        + "See INFO log for details.");
+            }
+        } finally {
+            unregisterService();
         }
     }
 
@@ -230,6 +262,17 @@
         }
     }
     
+    protected void registerService() {        
+        serviceRegistration = getBundleContext().registerService("org.fusesource.commons.management.ManagementStrategy",
+                                                                 this, null);                
+    }
+
+    protected void unregisterService() {
+        if (serviceRegistration != null) {
+            serviceRegistration.unregister();
+        }
+    }
+    
     private ObjectName getTypeSpecificObjectName(Object mo, String customName) throws MalformedObjectNameException {
         return mo instanceof ManagedEndpoint
                ? namingStrategy.getObjectName((ManagedEndpoint)mo)

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/OSGI-INF/blueprint/servicemix-nmr-management.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/OSGI-INF/blueprint/servicemix-nmr-management.xml?rev=822656&r1=822655&r2=822656&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/OSGI-INF/blueprint/servicemix-nmr-management.xml (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/OSGI-INF/blueprint/servicemix-nmr-management.xml Wed Oct  7 10:52:23 2009
@@ -25,12 +25,38 @@
     <reference id="mbeanServer"
                interface="javax.management.MBeanServer"
                availability="mandatory"/>
+ 
 
-    <!-- Endpoint registry -->
-    <bean id="endpointRegistry" class="org.apache.servicemix.nmr.management.ManagementEndpointRegistry">
-        <property name="managementStrategy" ref="managementStrategy" />
+    <bean id="namingStrategy" class="org.apache.servicemix.nmr.management.DefaultNamingStrategy">
+        <property name="jmxDomainName" value="org.apache.servicemix" />
     </bean>
 
+    <!-- ManagementStrategy -->
+    <bean id="managementStrategy"
+          class="org.apache.servicemix.nmr.management.ManagementAgent"
+          init-method="init"
+          destroy-method="destroy">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+        <property name="enabled" value="${enabled}"/>
+        <property name="namingStrategy" ref="namingStrategy" />
+        <property name="mbeanServer" ref="mbeanServer" />
+    </bean>
+
+    <!-- Service registration for the management strategy is done in
+         ManagementAgent.init() so that is can be made optional depending
+         on the value returned by isEnabled().  This means that we must
+         get a separate reference to the management strategy so it can 
+         be injected into the management endpoint registry. --> 
+    <reference id="managementStrategyRef"
+               interface="org.fusesource.commons.management.ManagementStrategy" 
+               availability="optional"/>
+
+    <!-- Endpoint registry -->   
+    <bean id="endpointRegistry" 
+          class="org.apache.servicemix.nmr.management.ManagementEndpointRegistry">
+        <property name="managementStrategy" ref="managementStrategyRef"/>
+    </bean>
+       
     <!-- List of endpoints -->
     <reference-list id="endpoints"
                     interface="org.apache.servicemix.nmr.api.internal.InternalEndpoint"
@@ -45,24 +71,15 @@
             <value>org.apache.servicemix.nmr.api.event.Listener</value>
         </interfaces>
     </service>
-
-    <!-- ManagementStrategy -->
-    <!-- Replace the following beans and <service> element with
-         a <reference> element if plugging in an alternative
-         ManagementStrategy implementation from another bundle -->
-    <bean id="namingStrategy" class="org.apache.servicemix.nmr.management.DefaultNamingStrategy">
-        <property name="jmxDomainName" value="org.apache.servicemix" />
-    </bean>
-
-    <bean id="managementStrategy" class="org.apache.servicemix.nmr.management.ManagementAgent">
-        <property name="namingStrategy" ref="namingStrategy" />
-        <property name="mbeanServer" ref="mbeanServer" />
-    </bean>
-
-    <service ref="managementStrategy">
-        <interfaces>
-            <value>org.fusesource.commons.management.ManagementStrategy</value>
-        </interfaces>
-    </service>
-
+    
+    <!-- Property place holder -->
+    <cm:property-placeholder persistent-id="org.apache.servicemix.nmr.management">
+        <cm:default-properties>
+            <!-- This property should be overridden to false if plugging in
+                 an alternative ManagementStrategy implementation from
+                 another bundle -->
+            <cm:property name="enabled" value="true"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+    
 </blueprint>

Modified: servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/ManagementStrategyTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/ManagementStrategyTest.java?rev=822656&r1=822655&r2=822656&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/ManagementStrategyTest.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/ManagementStrategyTest.java Wed Oct  7 10:52:23 2009
@@ -38,6 +38,8 @@
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
 
 public class ManagementStrategyTest extends Assert { //TestCase {
 
@@ -307,6 +309,35 @@
         // non-replacable static log factory awkward to mock 
         strategy.notify(new EventObject(this));
     }
+    
+    @Test
+    public void testEnableDisable() throws Exception {
+
+        ServiceRegistration sr = createMock(ServiceRegistration.class);
+        sr.unregister();
+        BundleContext ctx = createMock(BundleContext.class);
+        expect(ctx.registerService("org.fusesource.commons.management.ManagementStrategy",
+                                   strategy, null)).andReturn(sr);
+        replay(ctx, sr);
+
+        strategy.setEnabled(true);
+        assertTrue(strategy.isEnabled());
+        strategy.setBundleContext(ctx);
+        assertSame(ctx, strategy.getBundleContext());
+        strategy.init();
+        strategy.destroy();
+        verify(ctx, sr);
+
+        reset(ctx, sr);
+        replay(ctx, sr);
+        strategy = setUpStrategy();
+        strategy.setEnabled(false);
+        assertFalse(strategy.isEnabled());
+        strategy.init();
+        strategy.destroy();
+        verify(ctx, sr);
+
+    }
 
     protected ManagementAgent setUpStrategy() {
         ManagementAgent ms = new ManagementAgent();