[ARIES-1304] InstanceNotFoundException when unregistering mbeans

git-svn-id: https://svn.apache.org/repos/asf/aries/trunk/jmx/jmx-core@1663868 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java b/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
index 933edfa..3293105 100644
--- a/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
+++ b/src/main/java/org/apache/aries/jmx/agent/JMXAgentImpl.java
@@ -18,8 +18,10 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.InstanceNotFoundException;
@@ -62,7 +64,7 @@
     /**
      * {@link MBeanHandler} store.
      */
-    private List<MBeanServer> mbeanServers;
+    private Map<MBeanServer, Boolean> mbeanServers;
     private Map<MBeanHandler, Boolean> mbeansHandlers;
     private BundleContext context;
     private Logger logger;
@@ -75,8 +77,8 @@
     public JMXAgentImpl(BundleContext context, Logger logger) {
         this.context = context;
         this.logger = logger;
-        this.mbeanServers = new ArrayList<MBeanServer>();
-        this.mbeansHandlers = new HashMap<MBeanHandler, Boolean>();
+        this.mbeanServers = new IdentityHashMap<MBeanServer, Boolean>();
+        this.mbeansHandlers = new IdentityHashMap<MBeanHandler, Boolean>();
     }
 
     /**
@@ -146,7 +148,7 @@
                 }
             }
         }
-        mbeanServers.add(server);
+        mbeanServers.put(server, Boolean.TRUE);
     }
 
     /**
@@ -155,25 +157,24 @@
     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));
-                   }
+                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);
+                    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);
+                    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);
+                    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);
+                    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);
+                    logger.log(LogService.LOG_ERROR, "Cannot unregister MBean: " + mBeanHandler, e);
                 }
             }
         }
@@ -184,7 +185,7 @@
      * @see org.apache.aries.jmx.agent.JMXAgent#registerMBean(org.apache.aries.jmx.MBeanHandler)
      */
     public synchronized void registerMBean(final MBeanHandler mBeanHandler) {
-        for (MBeanServer server : mbeanServers) {
+        for (MBeanServer server : mbeanServers.keySet()) {
             String name = mBeanHandler.getName();
             StandardMBean mbean = mBeanHandler.getMbean();
             try {
@@ -214,7 +215,7 @@
      * @see org.apache.aries.jmx.agent.JMXAgent#unregisterMBean(org.apache.aries.jmx.MBeanHandler)
      */
     public synchronized void unregisterMBean(final MBeanHandler mBeanHandler) {
-        for (MBeanServer server : mbeanServers) {
+        for (MBeanServer server : mbeanServers.keySet()) {
             String name = mBeanHandler.getName();
             try {
                 logger.log(LogService.LOG_INFO, "Unregistering mbean " + " to MBeanServer " + server + " with name "