Author: davidb
Date: Wed May 23 14:06:29 2012
New Revision: 1341868

URL: http://svn.apache.org/viewvc?rev=1341868&view=rev
Log:
Transfer changes from ARIES-663  and ARIES-782 to jmx-next.


Modified:
    
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java
    
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
    
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
    
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
    
aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java

Modified: 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
--- 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java
 (original)
+++ 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/AbstractCompendiumHandler.java
 Wed May 23 14:06:29 2012
@@ -77,7 +77,7 @@ public abstract class AbstractCompendium
         Long serviceId = (Long) reference.getProperty(Constants.SERVICE_ID);
         //API stipulates versions for compendium services with static 
ObjectName
         //This shouldn't happen but added as a consistency check
-        if (getTrackingCount() > 0) {
+        if (trackedId != null) {
             String serviceDescription = (String) 
((reference.getProperty(Constants.SERVICE_DESCRIPTION) != null) ?
                     reference.getProperty(Constants.SERVICE_DESCRIPTION) : 
reference.getProperty(Constants.OBJECTCLASS));
             logger.log(LogService.LOG_WARNING, "Detected secondary 
ServiceReference for [" + serviceDescription
@@ -117,7 +117,7 @@ public abstract class AbstractCompendium
             ExecutorService executor = agentContext.getRegistrationExecutor();
             executor.submit(new Runnable() {
                 public void run() {
-                    agentContext.unregisterMBean(getName());
+                    
agentContext.unregisterMBean(AbstractCompendiumHandler.this);
                 }
             });
             trackedId = null;

Modified: 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
--- 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
 (original)
+++ 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgent.java
 Wed May 23 14:06:29 2012
@@ -26,20 +26,20 @@ import org.apache.aries.jmx.MBeanHandler
  * <p>This <tt>JMXAgent</tt> class represent agent for MBeanServers registered 
in ServiceRegistry.
  * It's responsible for registration and unregistration MBeans with available 
MBeanServers.
  * </p>
- * 
+ *
  * @version $Rev$ $Date$
  */
 public interface JMXAgent {
 
     /**
      * This method starts JMX agent.
-     * Creates and starting all MBean Handlers and MBeanServiceTracker. 
+     * Creates and starting all MBean Handlers and MBeanServiceTracker.
      */
     void start();
 
     /**
      * Registers MBeans with provided MBeanServer.
-     * @param server MBeanServer with which MBeans are going to be registered 
+     * @param server MBeanServer with which MBeans are going to be registered
      */
     void registerMBeans(final MBeanServer server);
 
@@ -57,7 +57,14 @@ public interface JMXAgent {
 
     /**
      * Unregisters MBean with all available MBeanServers.
+     * @param mBeanHandler handler which contains MBean info.
+     */
+    void unregisterMBean(final MBeanHandler mBeanHandler);
+
+    /**
+     * Unregisters MBean with all available MBeanServers.
      * @param name of MBean to be unregistered.
+     * @deprecated
      */
     void unregisterMBean(final String name);
 

Modified: 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
--- 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
 (original)
+++ 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentContext.java
 Wed May 23 14:06:29 2012
@@ -28,7 +28,7 @@ import org.osgi.framework.BundleContext;
  * <p>This class <tt>JMXAgentContext</tt> represents context of JMXAgent.
  * Delegates registration and unregistration methods to {@link JMXAgent}.</p>
  * @see JMXAgent
- * 
+ *
  * @version $Rev$ $Date$
  */
 public class JMXAgentContext {
@@ -52,7 +52,7 @@ public class JMXAgentContext {
     /**
      * Delegates invocation to JMX agent.
      * @see org.apache.aries.jmx.agent.JMXAgent#registerMBeans(MBeanServer)
-     * 
+     *
      */
     public void registerMBeans(final MBeanServer server) {
         agent.registerMBeans(server);
@@ -68,7 +68,7 @@ public class JMXAgentContext {
 
     /**
      * Delegates invocation to JMX agent.
-     * @see org.apache.aries.jmx.agent.JMXAgentl#registerMBean(MBeanHandler)
+     * @see org.apache.aries.jmx.agent.JMXAgent#registerMBean(MBeanHandler)
      */
     public void registerMBean(final MBeanHandler mbeanData) {
         agent.registerMBean(mbeanData);
@@ -76,7 +76,16 @@ public class JMXAgentContext {
 
     /**
      * Delegates invocation to JMX agent.
+     * @see org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(MBeanHandler)
+     */
+    public void unregisterMBean(final MBeanHandler mBeanHandler) {
+        agent.unregisterMBean(mBeanHandler);
+    }
+
+    /**
+     * Delegates invocation to JMX agent.
      * @see org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(String)
+     * @deprecated
      */
     public void unregisterMBean(final String name) {
         agent.unregisterMBean(name);

Modified: 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
--- 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
 (original)
+++ 
aries/trunk/sandbox/jmx-next/jmx-core/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
 Wed May 23 14:06:29 2012
@@ -16,8 +16,8 @@
  */
 package org.apache.aries.jmx.agent;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -62,7 +62,7 @@ public class JMXAgentImpl implements JMX
     /**
      * {@link MBeanHandler} store.
      */
-    private Set<MBeanHandler> mbeansHandlers;
+    private Map<MBeanHandler, Boolean> mbeansHandlers;
     private JMXAgentContext agentContext;
     private Logger logger;
 
@@ -78,43 +78,43 @@ public class JMXAgentImpl implements JMX
      */
     public JMXAgentImpl(Logger logger) {
         this.logger = logger;
-        this.mbeansHandlers = new HashSet<MBeanHandler>();
+        this.mbeansHandlers = new HashMap<MBeanHandler, Boolean>();
         this.registrationExecutor = Executors.newSingleThreadExecutor(new 
JMXThreadFactory("JMX OSGi Agent"));
     }
 
     /**
      * @see org.apache.aries.jmx.agent.JMXAgent#start()
      */
-    public void start() {
+    public synchronized void start() {
         logger.log(LogService.LOG_INFO, "Starting JMX OSGi agent");
         BundleContext bc = agentContext.getBundleContext();
         MBeanHandler frameworkHandler = new FrameworkMBeanHandler(bc, logger);
+        mbeansHandlers.put(frameworkHandler, Boolean.FALSE);
         frameworkHandler.open();
-        mbeansHandlers.add(frameworkHandler);
         MBeanHandler bundleStateHandler = new BundleStateMBeanHandler(bc, 
logger);
+        mbeansHandlers.put(bundleStateHandler, Boolean.FALSE);
         bundleStateHandler.open();
-        mbeansHandlers.add(bundleStateHandler);
         MBeanHandler revisionsStateHandler = new 
BundleWiringStateMBeanHandler(bc, logger);
+        mbeansHandlers.put(revisionsStateHandler, Boolean.FALSE);
         revisionsStateHandler.open();
-        mbeansHandlers.add(revisionsStateHandler);
         MBeanHandler serviceStateHandler = new ServiceStateMBeanHandler(bc, 
logger);
+        mbeansHandlers.put(serviceStateHandler, Boolean.FALSE);
         serviceStateHandler.open();
-        mbeansHandlers.add(serviceStateHandler);
         MBeanHandler packageStateHandler = new PackageStateMBeanHandler(bc, 
logger);
+        mbeansHandlers.put(packageStateHandler, Boolean.FALSE);
         packageStateHandler.open();
-        mbeansHandlers.add(packageStateHandler);
         MBeanHandler permissionAdminHandler = new 
PermissionAdminMBeanHandler(agentContext);
+        mbeansHandlers.put(permissionAdminHandler, Boolean.FALSE);
         permissionAdminHandler.open();
-        mbeansHandlers.add(permissionAdminHandler);
         MBeanHandler userAdminHandler = new 
UserAdminMBeanHandler(agentContext);
+        mbeansHandlers.put(userAdminHandler, Boolean.FALSE);
         userAdminHandler.open();
-        mbeansHandlers.add(userAdminHandler);
         MBeanHandler configAdminHandler = new 
ConfigurationAdminMBeanHandler(agentContext);
+        mbeansHandlers.put(configAdminHandler, Boolean.FALSE);
         configAdminHandler.open();
-        mbeansHandlers.add(configAdminHandler);
         MBeanHandler provServiceHandler = new 
ProvisioningServiceMBeanHandler(agentContext);
+        mbeansHandlers.put(provServiceHandler, Boolean.FALSE);
         provServiceHandler.open();
-        mbeansHandlers.add(provServiceHandler);
         mbeanServiceTracker = new MBeanServiceTracker(agentContext);
         mbeanServiceTracker.open();
     }
@@ -122,55 +122,60 @@ public class JMXAgentImpl implements JMX
     /**
      * @see 
org.apache.aries.jmx.agent.JMXAgent#registerMBeans(javax.management.MBeanServer)
      */
-    public void registerMBeans(final MBeanServer server) {
-        for (MBeanHandler mbeanHandler : mbeansHandlers) {
-            String name = mbeanHandler.getName();
-            StandardMBean mbean = mbeanHandler.getMbean();
-            if (mbean != null) {
-                try {
-                    logger.log(LogService.LOG_INFO, "Registering " + 
mbean.getMBeanInterface().getName()
-                            + " to MBeanServer " + server + " with name " + 
name);
-                    server.registerMBean(mbean, new ObjectName(name));
-                } catch (InstanceAlreadyExistsException e) {
-                    logger.log(LogService.LOG_ERROR, "MBean is already 
registered", e);
-                } catch (MBeanRegistrationException e) {
-                    logger.log(LogService.LOG_ERROR, "Can't register MBean", 
e);
-                } catch (NotCompliantMBeanException e) {
-                    logger.log(LogService.LOG_ERROR, "MBean is not compliant 
MBean", e);
-                } catch (MalformedObjectNameException e) {
-                    logger.log(LogService.LOG_ERROR, "Try to register with no 
valid objectname", e);
-                } catch (NullPointerException e) {
-                    logger.log(LogService.LOG_ERROR, "Name of objectname can't 
be null", e);
+    public synchronized void registerMBeans(final MBeanServer server) {
+        for (MBeanHandler mbeanHandler : mbeansHandlers.keySet()) {
+            if (mbeansHandlers.get(mbeanHandler) == Boolean.FALSE) {
+                String name = mbeanHandler.getName();
+                StandardMBean mbean = mbeanHandler.getMbean();
+                if (mbean != null) {
+                    try {
+                        logger.log(LogService.LOG_INFO, "Registering " + 
mbean.getMBeanInterface().getName()
+                                + " to MBeanServer " + server + " with name " 
+ name);
+                        server.registerMBean(mbean, new ObjectName(name));
+                        mbeansHandlers.put(mbeanHandler, Boolean.TRUE);
+                    } catch (InstanceAlreadyExistsException e) {
+                        logger.log(LogService.LOG_ERROR, "MBean is already 
registered", e);
+                    } catch (MBeanRegistrationException e) {
+                        logger.log(LogService.LOG_ERROR, "Can't register 
MBean", e);
+                    } catch (NotCompliantMBeanException e) {
+                        logger.log(LogService.LOG_ERROR, "MBean is not 
compliant MBean", e);
+                    } catch (MalformedObjectNameException e) {
+                        logger.log(LogService.LOG_ERROR, "Try to register with 
no valid objectname", e);
+                    } catch (NullPointerException e) {
+                        logger.log(LogService.LOG_ERROR, "Name of objectname 
can't be null", e);
+                    }
                 }
             }
         }
-
     }
 
     /**
      * @see 
org.apache.aries.jmx.agent.JMXAgent#unregisterMBeans(javax.management.MBeanServer)
      */
-    public void unregisterMBeans(final MBeanServer server) {
-        for (MBeanHandler mBeanHandler : mbeansHandlers) {
-            try
-            {
-               String name = mBeanHandler.getName();
-               StandardMBean mbean = mBeanHandler.getMbean();
-               if (mbean != null) {
-                   logger.log(LogService.LOG_INFO, "Unregistering " + 
mbean.getMBeanInterface().getName()
-                         + " to MBeanServer " + server + " with name " + name);
-                   server.unregisterMBean(new ObjectName(name));
-               }
-            } catch (MBeanRegistrationException e) {
-               logger.log(LogService.LOG_ERROR, "Can't unregister MBean", e);
-            } catch (InstanceNotFoundException e) {
-               logger.log(LogService.LOG_ERROR, "Mbena doesn't exist in the 
repository", e);
-            } catch (MalformedObjectNameException e) {
-               logger.log(LogService.LOG_ERROR, "Try to unregister with no 
valid objectname", e);
-            } catch (NullPointerException e) {
-               logger.log(LogService.LOG_ERROR, "Name of objectname can't be 
null ", e);
-            } catch (Exception e) {
-               logger.log(LogService.LOG_ERROR, "Cannot unregister MBean: " + 
mBeanHandler, e);
+    public synchronized void unregisterMBeans(final MBeanServer server) {
+        for (MBeanHandler mBeanHandler : mbeansHandlers.keySet()) {
+            if (mbeansHandlers.get(mBeanHandler) == Boolean.TRUE) {
+                try
+                {
+                   String name = mBeanHandler.getName();
+                   StandardMBean mbean = mBeanHandler.getMbean();
+                   if (mbean != null) {
+                       logger.log(LogService.LOG_INFO, "Unregistering " + 
mbean.getMBeanInterface().getName()
+                             + " to MBeanServer " + server + " with name " + 
name);
+                       server.unregisterMBean(new ObjectName(name));
+                       mbeansHandlers.put(mBeanHandler, Boolean.FALSE);
+                   }
+                } catch (MBeanRegistrationException e) {
+                   logger.log(LogService.LOG_ERROR, "Can't unregister MBean", 
e);
+                } catch (InstanceNotFoundException e) {
+                   logger.log(LogService.LOG_ERROR, "MBean doesn't exist in 
the repository", e);
+                } catch (MalformedObjectNameException e) {
+                   logger.log(LogService.LOG_ERROR, "Try to unregister with no 
valid objectname", e);
+                } catch (NullPointerException e) {
+                   logger.log(LogService.LOG_ERROR, "Name of objectname can't 
be null ", e);
+                } catch (Exception e) {
+                   logger.log(LogService.LOG_ERROR, "Cannot unregister MBean: 
" + mBeanHandler, e);
+                }
             }
         }
     }
@@ -178,7 +183,7 @@ public class JMXAgentImpl implements JMX
     /**
      * @see 
org.apache.aries.jmx.agent.JMXAgent#registerMBean(org.apache.aries.jmx.MBeanHandler)
      */
-    public void registerMBean(final MBeanHandler mBeanHandler) {
+    public synchronized void registerMBean(final MBeanHandler mBeanHandler) {
         Object[] servers = getMBeanServers();
         if (servers == null) {
             logger.log(LogService.LOG_WARNING, "There are no MBean servers 
registred, can't register MBeans");
@@ -193,6 +198,7 @@ public class JMXAgentImpl implements JMX
                         + " to MBeanServer " + server + " with name " + name);
                 ((MBeanServer) server).registerMBean(mbean, new 
ObjectName(name));
 
+                mbeansHandlers.put(mBeanHandler, Boolean.TRUE);
             } catch (InstanceAlreadyExistsException e) {
                 logger.log(LogService.LOG_ERROR, "MBean is already 
registered", e);
             } catch (MBeanRegistrationException e) {
@@ -208,16 +214,41 @@ public class JMXAgentImpl implements JMX
                 return;
             }
         }
+    }
+
+    /**
+     * @see 
org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(org.apache.aries.jmx.MBeanHandler)
+     */
+    public synchronized void unregisterMBean(final MBeanHandler mBeanHandler) {
+        Object[] servers = getMBeanServers();
+        for (Object server : servers) {
+            String name = mBeanHandler.getName();
+            try {
+                logger.log(LogService.LOG_INFO, "Unregistering mbean " + " to 
MBeanServer " + server + " with name "
+                        + name);
+                ((MBeanServer) server).unregisterMBean(new ObjectName(name));
+                mbeansHandlers.put(mBeanHandler, Boolean.FALSE);
+            } catch (MBeanRegistrationException e) {
+                logger.log(LogService.LOG_ERROR, "Can't register MBean", e);
+            } catch (InstanceNotFoundException e) {
+                logger.log(LogService.LOG_ERROR, "MBean doesn't exist in the 
repository", e);
+            } catch (MalformedObjectNameException e) {
+                logger.log(LogService.LOG_ERROR, "Try to register with no 
valid objectname, Stopping registration", e);
+                return;
+            } catch (NullPointerException e) {
+                logger.log(LogService.LOG_ERROR, "Name of objectname can't be 
null, Stopping registration", e);
+                return;
+            }
 
+        }
     }
 
     /**
      * @see 
org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(java.lang.String)
      */
-    public void unregisterMBean(final String name) {
+    public synchronized void unregisterMBean(final String name) {
         Object[] servers = getMBeanServers();
         for (Object server : servers) {
-
             try {
                 logger.log(LogService.LOG_INFO, "Unregistering mbean " + " to 
MBeanServer " + server + " with name "
                         + name);
@@ -225,7 +256,7 @@ public class JMXAgentImpl implements JMX
             } catch (MBeanRegistrationException e) {
                 logger.log(LogService.LOG_ERROR, "Can't register MBean", e);
             } catch (InstanceNotFoundException e) {
-                logger.log(LogService.LOG_ERROR, "Mbena doesn't exist in the 
repository", e);
+                logger.log(LogService.LOG_ERROR, "MBean doesn't exist in the 
repository", e);
             } catch (MalformedObjectNameException e) {
                 logger.log(LogService.LOG_ERROR, "Try to register with no 
valid objectname, Stopping registration", e);
                 return;
@@ -233,17 +264,16 @@ public class JMXAgentImpl implements JMX
                 logger.log(LogService.LOG_ERROR, "Name of objectname can't be 
null, Stopping registration", e);
                 return;
             }
-
         }
     }
 
     /**
      * @see org.apache.aries.jmx.agent.JMXAgent#stop()
      */
-    public void stop() {
+    public synchronized void stop() {
         logger.log(LogService.LOG_INFO, "Stopping JMX OSGi agent");
         mbeanServiceTracker.close();
-        for (MBeanHandler mBeanHandler : mbeansHandlers) {
+        for (MBeanHandler mBeanHandler : mbeansHandlers.keySet()) {
             mBeanHandler.close();
         }
         if (registrationExecutor != null && 
!registrationExecutor.isShutdown()) {

Modified: 
aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java?rev=1341868&r1=1341867&r2=1341868&view=diff
==============================================================================
--- 
aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java
 (original)
+++ 
aries/trunk/sandbox/jmx-next/jmx-core/src/test/java/org/apache/aries/jmx/CompendiumHandlerTest.java
 Wed May 23 14:06:29 2012
@@ -112,7 +112,7 @@ public class CompendiumHandlerTest {
         //service unget
         verify(bundleContext).ungetService(reference);
         //unregister is invoked on context
-        verify(agentContext).unregisterMBean(name);
+        verify(agentContext).unregisterMBean(target);
 
     }
 


Reply via email to