Break out more FRM components
[openflowplugin.git] / applications / forwardingrules-manager / src / main / java / org / opendaylight / openflowplugin / applications / frm / ReconciliationJMXAgent.java
index 2cb492cace665216a27d144e4a8b0f8aa168c3c6..1b86ef9c9e33601c3b5c5c47d8f5e5bf2014c897 100644 (file)
@@ -9,43 +9,68 @@
 package org.opendaylight.openflowplugin.applications.frm;
 
 import java.lang.management.ManagementFactory;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
+import javax.inject.Singleton;
 import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
 import javax.management.MBeanRegistrationException;
 import javax.management.MBeanServer;
 import javax.management.MalformedObjectNameException;
 import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectInstance;
 import javax.management.ObjectName;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public final class ReconciliationJMXAgent {
+@Singleton
+@Component(service = { })
+public final class ReconciliationJMXAgent implements AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(ReconciliationJMXAgent.class);
-    private static final String OF_RECONC_BEANNAME
-            = "org.opendaylight.openflowplugin.frm:type=ReconciliationState";
-    private MBeanServer mbs = null;
-    private ObjectName objectName = null;
+    private static final ObjectName OF_RECONF_OBJNAME;
 
-    @Inject
-    public ReconciliationJMXAgent(final ReconciliationJMXService reconciliationJMXService) {
-        mbs = ManagementFactory.getPlatformMBeanServer();
+    static {
         try {
-            objectName = new ObjectName(OF_RECONC_BEANNAME);
-            registerReconciliationMbean(reconciliationJMXService);
+            OF_RECONF_OBJNAME = new ObjectName("org.opendaylight.openflowplugin.frm:type=ReconciliationState");
         } catch (MalformedObjectNameException e) {
-            LOG.error("ObjectName instance creation failed for Mbean {} : ", OF_RECONC_BEANNAME, e);
+            throw new ExceptionInInitializerError(e);
         }
     }
 
-    public void registerReconciliationMbean(ReconciliationJMXService reconciliationJMXService) {
-        try {
-            // Uniquely identify the MBeans and register them with the platform MBeanServer
-            if (!mbs.isRegistered(objectName)) {
-                mbs.registerMBean(reconciliationJMXService, objectName);
-                LOG.debug("Registered Mbean {} successfully", OF_RECONC_BEANNAME);
+    private final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+    private ObjectInstance objInstance;
+
+    @Inject
+    @Activate
+    public ReconciliationJMXAgent(@Reference final ReconciliationJMXServiceMBean reconciliationJMXService) {
+        // Uniquely identify the MBeans and register them with the platform MBeanServer
+        ObjectInstance inst = null;
+        if (!mbs.isRegistered(OF_RECONF_OBJNAME)) {
+            try {
+                inst = mbs.registerMBean(reconciliationJMXService, OF_RECONF_OBJNAME);
+                LOG.debug("Registered Mbean {} successfully", OF_RECONF_OBJNAME);
+            } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {
+                LOG.warn("Registeration failed for Mbean {} : ", OF_RECONF_OBJNAME , e);
+            }
+        }
+        objInstance = inst;
+    }
+
+    @PreDestroy
+    @Deactivate
+    @Override
+    public void close() {
+        if (objInstance != null) {
+            objInstance = null;
+            try {
+                mbs.unregisterMBean(OF_RECONF_OBJNAME);
+            } catch (MBeanRegistrationException | InstanceNotFoundException e) {
+                LOG.warn("Unregistration failed for Mbean {} : ", OF_RECONF_OBJNAME , e);
             }
-        } catch (MBeanRegistrationException | InstanceAlreadyExistsException | NotCompliantMBeanException e) {
-            LOG.error("Registeration failed for Mbean {} : ", OF_RECONC_BEANNAME , e);
         }
     }
 }