Merge "Fix clustering versions"
[controller.git] / opendaylight / config / config-manager / src / main / java / org / opendaylight / controller / config / manager / impl / osgi / ConfigManagerActivator.java
index be602e5b2a31fb07f90f837fc81ff63d8d16ebc4..c075b09df76d5ba0fd770ec9af2e4adfb0c28b7c 100644 (file)
@@ -8,12 +8,19 @@
 package org.opendaylight.controller.config.manager.impl.osgi;
 
 import java.lang.management.ManagementFactory;
+import java.util.Collection;
 
+import javax.management.InstanceAlreadyExistsException;
 import javax.management.MBeanServer;
 
 import org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl;
 import org.opendaylight.controller.config.manager.impl.jmx.ConfigRegistryJMXRegistrator;
+import org.opendaylight.controller.config.manager.impl.osgi.mapping.ModuleInfoBundleTracker;
+import org.opendaylight.controller.config.manager.impl.osgi.mapping.RuntimeGeneratedMappingServiceActivator;
 import org.opendaylight.controller.config.spi.ModuleFactory;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
+import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
@@ -22,47 +29,64 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ConfigManagerActivator implements BundleActivator {
-    private static final Logger logger = LoggerFactory
-            .getLogger(ConfigManagerActivator.class);
+    private static final Logger logger = LoggerFactory.getLogger(ConfigManagerActivator.class);
 
-    private ExtenderBundleTracker extenderBundleTracker;
+    private final MBeanServer configMBeanServer = ManagementFactory.getPlatformMBeanServer();
+    private ExtensibleBundleTracker<Collection<ObjectRegistration<YangModuleInfo>>> bundleTracker;
     private ConfigRegistryImpl configRegistry;
     private ConfigRegistryJMXRegistrator configRegistryJMXRegistrator;
-    private ServiceRegistration configRegistryServiceRegistration;
+    private ServiceRegistration<?> configRegistryServiceRegistration;
+    private RuntimeGeneratedMappingServiceActivator mappingServiceActivator;
 
     @Override
-    public void start(BundleContext context) throws Exception {
-        BundleContextBackedModuleFactoriesResolver bundleContextBackedModuleFactoriesResolver =
-                new BundleContextBackedModuleFactoriesResolver(context);
-        MBeanServer configMBeanServer = ManagementFactory.getPlatformMBeanServer();
-        configRegistry = new ConfigRegistryImpl(
-                bundleContextBackedModuleFactoriesResolver, configMBeanServer);
+    public void start(BundleContext context) {
+
+        // track bundles containing YangModuleInfo
+        ModuleInfoBundleTracker moduleInfoBundleTracker = new ModuleInfoBundleTracker();
+        mappingServiceActivator = new RuntimeGeneratedMappingServiceActivator(moduleInfoBundleTracker);
+        CodecRegistry codecRegistry = mappingServiceActivator.startRuntimeMappingService(context).getCodecRegistry();
+
+        // start config registry
+        BundleContextBackedModuleFactoriesResolver bundleContextBackedModuleFactoriesResolver = new BundleContextBackedModuleFactoriesResolver(
+                context);
+        configRegistry = new ConfigRegistryImpl(bundleContextBackedModuleFactoriesResolver, configMBeanServer,
+                codecRegistry);
+
+        // track bundles containing factories
+        BlankTransactionServiceTracker blankTransactionServiceTracker = new BlankTransactionServiceTracker(
+                configRegistry);
+        ModuleFactoryBundleTracker moduleFactoryBundleTracker = new ModuleFactoryBundleTracker(
+                blankTransactionServiceTracker);
+
+        // start extensible tracker
+        bundleTracker = new ExtensibleBundleTracker<>(context, moduleInfoBundleTracker, moduleFactoryBundleTracker);
+        bundleTracker.open();
 
         // register config registry to OSGi
         configRegistryServiceRegistration = context.registerService(ConfigRegistryImpl.class, configRegistry, null);
 
         // register config registry to jmx
         configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(configMBeanServer);
-        configRegistryJMXRegistrator.registerToJMX(configRegistry);
-
-        // track bundles containing factories
-        BlankTransactionServiceTracker blankTransactionServiceTracker = new BlankTransactionServiceTracker(configRegistry);
-        extenderBundleTracker = new ExtenderBundleTracker(context, blankTransactionServiceTracker);
-        extenderBundleTracker.open();
+        try {
+            configRegistryJMXRegistrator.registerToJMX(configRegistry);
+        } catch (InstanceAlreadyExistsException e) {
+            throw new IllegalStateException("Config Registry was already registered to JMX", e);
+        }
 
-        ServiceTracker<?, ?> serviceTracker = new ServiceTracker(context, ModuleFactory.class, blankTransactionServiceTracker);
+        ServiceTracker<ModuleFactory, Object> serviceTracker = new ServiceTracker<>(context, ModuleFactory.class,
+                blankTransactionServiceTracker);
         serviceTracker.open();
     }
 
     @Override
-    public void stop(BundleContext context) throws Exception {
+    public void stop(BundleContext context) {
         try {
             configRegistry.close();
         } catch (Exception e) {
             logger.warn("Exception while closing config registry", e);
         }
         try {
-            extenderBundleTracker.close();
+            bundleTracker.close();
         } catch (Exception e) {
             logger.warn("Exception while closing extender", e);
         }
@@ -78,5 +102,10 @@ public class ConfigManagerActivator implements BundleActivator {
         } catch (Exception e) {
             logger.warn("Exception while unregistering config registry", e);
         }
+        try {
+            mappingServiceActivator.close();
+        } catch (Exception e) {
+            logger.warn("Exception while closing mapping service", e);
+        }
     }
 }