X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfig%2Fconfig-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fmanager%2Fimpl%2Fosgi%2FConfigManagerActivator.java;h=ec27bc724fda542578113ecdd19074791ea30c91;hp=1f538e5c6dc848bb5f9ef334d8d12df0d50807c9;hb=c49614c73007a6b20b0903dd77a61f5102f82e0b;hpb=6998123adad9e88cd20f285dd48e433f71e90071 diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java index 1f538e5c6d..ec27bc724f 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/ConfigManagerActivator.java @@ -25,25 +25,31 @@ import org.opendaylight.controller.config.manager.impl.osgi.mapping.RefreshingSC import org.opendaylight.controller.config.manager.impl.util.OsgiRegistrationUtil; import org.opendaylight.controller.config.spi.ModuleFactory; import org.opendaylight.yangtools.concepts.ObjectRegistration; -import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy; +import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy; import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleEvent; +import org.osgi.framework.SynchronousBundleListener; import org.osgi.util.tracker.BundleTracker; import org.osgi.util.tracker.ServiceTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ConfigManagerActivator implements BundleActivator { +public class ConfigManagerActivator implements BundleActivator, SynchronousBundleListener { private static final Logger LOG = LoggerFactory.getLogger(ConfigManagerActivator.class); + private static final long SYSTEM_BUNDLE_ID = 0; + private final MBeanServer configMBeanServer = ManagementFactory.getPlatformMBeanServer(); private AutoCloseable autoCloseable; + private ConfigRegistryImpl configRegistry; + @Override public void start(final BundleContext context) { try { @@ -59,7 +65,7 @@ public class ConfigManagerActivator implements BundleActivator { // start config registry BundleContextBackedModuleFactoriesResolver bundleContextBackedModuleFactoriesResolver = new BundleContextBackedModuleFactoriesResolver( context); - ConfigRegistryImpl configRegistry = new ConfigRegistryImpl(bundleContextBackedModuleFactoriesResolver, configMBeanServer, + configRegistry = new ConfigRegistryImpl(bundleContextBackedModuleFactoriesResolver, configMBeanServer, bindingContextProvider); // track bundles containing factories @@ -90,7 +96,7 @@ public class ConfigManagerActivator implements BundleActivator { new JMXNotifierConfigRegistry(configRegistry, configMBeanServer); // register config registry to OSGi - AutoCloseable clsReg = registerService(context, moduleInfoBackedContext, GeneratedClassLoadingStrategy.class); + AutoCloseable clsReg = registerService(context, moduleInfoBackedContext, ClassLoadingStrategy.class); AutoCloseable configRegReg = registerService(context, notifyingConfigRegistry, ConfigRegistry.class); // register config registry to jmx @@ -98,6 +104,7 @@ public class ConfigManagerActivator implements BundleActivator { try { configRegistryJMXRegistrator.registerToJMXNoNotifications(configRegistry); } catch (InstanceAlreadyExistsException e) { + configRegistryJMXRegistrator.close(); throw new IllegalStateException("Config Registry was already registered to JMX", e); } @@ -106,6 +113,8 @@ public class ConfigManagerActivator implements BundleActivator { try { configRegistryJMXRegistrator.registerToJMX(notifyingConfigRegistry); } catch (InstanceAlreadyExistsException e) { + configRegistryJMXRegistrator.close(); + configRegistryJMXRegistratorWithNotifications.close(); throw new IllegalStateException("Config Registry was already registered to JMX", e); } @@ -114,10 +123,12 @@ public class ConfigManagerActivator implements BundleActivator { blankTransactionServiceTracker); serviceTracker.open(); - List list = Arrays.asList(bindingContextProvider, clsReg, configRegistry, + List list = Arrays.asList(bindingContextProvider, clsReg, wrap(moduleFactoryBundleTracker), moduleInfoBundleTracker, configRegReg, configRegistryJMXRegistrator, configRegistryJMXRegistratorWithNotifications, wrap(serviceTracker), moduleInfoRegistryWrapper, notifyingConfigRegistry); autoCloseable = OsgiRegistrationUtil.aggregate(list); + + context.addBundleListener(this); } catch(Exception e) { LOG.warn("Error starting config manager", e); } catch(Error e) { @@ -130,6 +141,20 @@ public class ConfigManagerActivator implements BundleActivator { @Override public void stop(final BundleContext context) throws Exception { + context.removeBundleListener(this); autoCloseable.close(); } + + @Override + public void bundleChanged(BundleEvent event) { + if(configRegistry == null) { + return; + } + + // If the system bundle (id 0) is stopping close the ConfigRegistry so it destroys all modules. On + // shutdown the system bundle is stopped first. + if(event.getBundle().getBundleId() == SYSTEM_BUNDLE_ID && event.getType() == BundleEvent.STOPPING) { + configRegistry.close(); + } + } }