X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fconfig%2Fconfig-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fmanager%2Fimpl%2FConfigTransactionControllerImpl.java;h=3e53a7a217e1855dedb596a2b5f1dedcd707ca85;hb=6117dc1c03128e9f7eac249b4a997449e254cdd6;hp=3f569ae324ebebe51cf0550aa74b21bbcc8d58b8;hpb=b0e337733be06807c12d5bbd3b5a29a94f44fdba;p=controller.git diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java index 3f569ae324..3e53a7a217 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java @@ -34,12 +34,13 @@ import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.MBeanServer; import javax.management.ObjectName; -import java.util.ArrayList; -import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.ArrayList; +import java.util.Collection; import java.util.concurrent.atomic.AtomicBoolean; import static java.lang.String.format; @@ -64,7 +65,7 @@ class ConfigTransactionControllerImpl implements private final DependencyResolverManager dependencyResolverManager; private final TransactionStatus transactionStatus; private final MBeanServer transactionsMBeanServer; - private final List currentlyRegisteredFactories; + private final Map> currentlyRegisteredFactories; /** * Disables ability of {@link DynamicWritableWrapper} to change attributes @@ -77,13 +78,14 @@ class ConfigTransactionControllerImpl implements configBeanModificationDisabled); private final MBeanServer configMBeanServer; - private final BundleContext bundleContext; + private final boolean blankTransaction; public ConfigTransactionControllerImpl(String transactionName, TransactionJMXRegistrator transactionRegistrator, long parentVersion, long currentVersion, - List currentlyRegisteredFactories, - MBeanServer transactionsMBeanServer, MBeanServer configMBeanServer, BundleContext bundleContext) { + Map> currentlyRegisteredFactories, + MBeanServer transactionsMBeanServer, MBeanServer configMBeanServer, + boolean blankTransaction) { this.transactionIdentifier = new TransactionIdentifier(transactionName); this.controllerON = ObjectNameUtil @@ -99,7 +101,7 @@ class ConfigTransactionControllerImpl implements this.dependencyResolverManager = new DependencyResolverManager(transactionName, transactionStatus); this.transactionsMBeanServer = transactionsMBeanServer; this.configMBeanServer = configMBeanServer; - this.bundleContext = bundleContext; + this.blankTransaction = blankTransaction; } @Override @@ -120,11 +122,11 @@ class ConfigTransactionControllerImpl implements transactionStatus.checkNotAborted(); Set oldSet = new HashSet<>(lastListOfFactories); - Set newSet = new HashSet<>(currentlyRegisteredFactories); + Set newSet = new HashSet<>(factoriesHolder.getModuleFactories()); List toBeAdded = new ArrayList<>(); List toBeRemoved = new ArrayList<>(); - for(ModuleFactory moduleFactory: currentlyRegisteredFactories) { + for(ModuleFactory moduleFactory: factoriesHolder.getModuleFactories()) { if (oldSet.contains(moduleFactory) == false){ toBeAdded.add(moduleFactory); } @@ -136,12 +138,14 @@ class ConfigTransactionControllerImpl implements } // add default modules for (ModuleFactory moduleFactory : toBeAdded) { - Set defaultModules = moduleFactory.getDefaultModules(dependencyResolverManager, bundleContext); + Set defaultModules = moduleFactory.getDefaultModules(dependencyResolverManager, + getModuleFactoryBundleContext(moduleFactory.getImplementationName())); for (Module module : defaultModules) { // ensure default module to be registered to jmx even if its module factory does not use dependencyResolverFactory DependencyResolver dependencyResolver = dependencyResolverManager.getOrCreate(module.getIdentifier()); try { - putConfigBeanToJMXAndInternalMaps(module.getIdentifier(), module, moduleFactory, null, dependencyResolver); + boolean defaultBean = true; + putConfigBeanToJMXAndInternalMaps(module.getIdentifier(), module, moduleFactory, null, dependencyResolver, defaultBean); } catch (InstanceAlreadyExistsException e) { throw new IllegalStateException(e); } @@ -173,15 +177,17 @@ class ConfigTransactionControllerImpl implements DependencyResolver dependencyResolver = dependencyResolverManager .getOrCreate(moduleIdentifier); try { + BundleContext bc = getModuleFactoryBundleContext(moduleFactory.getImplementationName()); module = moduleFactory.createModule( moduleIdentifier.getInstanceName(), dependencyResolver, - oldConfigBeanInfo.getReadableModule(), bundleContext); + oldConfigBeanInfo.getReadableModule(), bc); } catch (Exception e) { throw new IllegalStateException(format( "Error while copying old configuration from %s to %s", oldConfigBeanInfo, moduleFactory), e); } - putConfigBeanToJMXAndInternalMaps(moduleIdentifier, module, moduleFactory, oldConfigBeanInfo, dependencyResolver); + putConfigBeanToJMXAndInternalMaps(moduleIdentifier, module, moduleFactory, oldConfigBeanInfo, dependencyResolver, + oldConfigBeanInfo.isDefaultBean()); } @Override @@ -196,15 +202,17 @@ class ConfigTransactionControllerImpl implements // find factory ModuleFactory moduleFactory = factoriesHolder.findByModuleName(factoryName); DependencyResolver dependencyResolver = dependencyResolverManager.getOrCreate(moduleIdentifier); - Module module = moduleFactory.createModule(instanceName, dependencyResolver, bundleContext); + Module module = moduleFactory.createModule(instanceName, dependencyResolver, + getModuleFactoryBundleContext(moduleFactory.getImplementationName())); + boolean defaultBean = false; return putConfigBeanToJMXAndInternalMaps(moduleIdentifier, module, - moduleFactory, null, dependencyResolver); + moduleFactory, null, dependencyResolver, defaultBean); } private synchronized ObjectName putConfigBeanToJMXAndInternalMaps( ModuleIdentifier moduleIdentifier, Module module, ModuleFactory moduleFactory, - @Nullable ModuleInternalInfo maybeOldConfigBeanInfo, DependencyResolver dependencyResolver) + @Nullable ModuleInternalInfo maybeOldConfigBeanInfo, DependencyResolver dependencyResolver, boolean isDefaultBean) throws InstanceAlreadyExistsException { logger.debug("Adding module {} to transaction {}", moduleIdentifier, this); @@ -228,14 +236,14 @@ class ConfigTransactionControllerImpl implements .registerMBean(writableDynamicWrapper, writableON); ModuleInternalTransactionalInfo moduleInternalTransactionalInfo = new ModuleInternalTransactionalInfo( moduleIdentifier, module, moduleFactory, - maybeOldConfigBeanInfo, transactionModuleJMXRegistration); + maybeOldConfigBeanInfo, transactionModuleJMXRegistration, isDefaultBean); dependencyResolverManager.put(moduleInternalTransactionalInfo); return writableON; } @Override - public void destroyModule(ObjectName objectName) + public synchronized void destroyModule(ObjectName objectName) throws InstanceNotFoundException { String foundTransactionName = ObjectNameUtil .getTransactionName(objectName); @@ -249,9 +257,17 @@ class ConfigTransactionControllerImpl implements destroyModule(moduleIdentifier); } - private void destroyModule(ModuleIdentifier moduleIdentifier) { + private synchronized void destroyModule(ModuleIdentifier moduleIdentifier) { logger.debug("Destroying module {} in transaction {}", moduleIdentifier, this); transactionStatus.checkNotAborted(); + + if (blankTransaction == false) { + ModuleInternalTransactionalInfo found = + dependencyResolverManager.findModuleInternalTransactionalInfo(moduleIdentifier); + if (found.isDefaultBean()) { + logger.warn("Warning: removing default bean. This will be forbidden in next version of config-subsystem"); + } + } ModuleInternalTransactionalInfo removedTInfo = dependencyResolverManager.destroyModule(moduleIdentifier); // remove from jmx removedTInfo.getTransactionModuleJMXRegistration().close(); @@ -466,11 +482,20 @@ class ConfigTransactionControllerImpl implements @Override public List getCurrentlyRegisteredFactories() { - return currentlyRegisteredFactories; + return new ArrayList<>(factoriesHolder.getModuleFactories()); } @Override public TransactionIdentifier getIdentifier() { return transactionIdentifier; } + + @Override + public BundleContext getModuleFactoryBundleContext(String factoryName) { + Map.Entry factoryBundleContextEntry = this.currentlyRegisteredFactories.get(factoryName); + if (factoryBundleContextEntry == null || factoryBundleContextEntry.getValue() == null) { + throw new NullPointerException("Bundle context of " + factoryName + " ModuleFactory not found."); + } + return factoryBundleContextEntry.getValue(); + } }