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=a9ab664fd6d44cd19a4b38c02248a96d938b41b9;hb=021f28e11f877e0b5fec58cc9407f604d119ecac;hp=17fb7cc1dfd174ab10b88fd1c727971107af5306;hpb=101159d6c201d67b670151f3ba8e31985a4923b7;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 17fb7cc1df..a9ab664fd6 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 @@ -29,9 +29,18 @@ import org.slf4j.LoggerFactory; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; -import javax.management.*; -import java.util.*; +import javax.management.DynamicMBean; +import javax.management.InstanceAlreadyExistsException; +import javax.management.InstanceNotFoundException; +import javax.management.MBeanServer; +import javax.management.ObjectName; +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; @@ -56,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 @@ -74,7 +83,7 @@ class ConfigTransactionControllerImpl implements public ConfigTransactionControllerImpl(String transactionName, TransactionJMXRegistrator transactionRegistrator, long parentVersion, long currentVersion, - List currentlyRegisteredFactories, + Map> currentlyRegisteredFactories, MBeanServer transactionsMBeanServer, MBeanServer configMBeanServer, BundleContext bundleContext) { this.transactionIdentifier = new TransactionIdentifier(transactionName); @@ -112,11 +121,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); } @@ -128,10 +137,13 @@ 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); + putConfigBeanToJMXAndInternalMaps(module.getIdentifier(), module, moduleFactory, null, dependencyResolver); } catch (InstanceAlreadyExistsException e) { throw new IllegalStateException(e); } @@ -163,15 +175,16 @@ 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); + putConfigBeanToJMXAndInternalMaps(moduleIdentifier, module, moduleFactory, oldConfigBeanInfo, dependencyResolver); } @Override @@ -186,21 +199,27 @@ 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())); return putConfigBeanToJMXAndInternalMaps(moduleIdentifier, module, - moduleFactory, null); + moduleFactory, null, dependencyResolver); } private synchronized ObjectName putConfigBeanToJMXAndInternalMaps( ModuleIdentifier moduleIdentifier, Module module, ModuleFactory moduleFactory, - @Nullable ModuleInternalInfo maybeOldConfigBeanInfo) + @Nullable ModuleInternalInfo maybeOldConfigBeanInfo, DependencyResolver dependencyResolver) throws InstanceAlreadyExistsException { + logger.debug("Adding module {} to transaction {}", moduleIdentifier, this); if (moduleIdentifier.equals(module.getIdentifier())==false) { throw new IllegalStateException("Incorrect name reported by module. Expected " + moduleIdentifier + ", got " + module.getIdentifier()); } + if (dependencyResolver.getIdentifier().equals(moduleIdentifier) == false ) { + throw new IllegalStateException("Incorrect name reported by dependency resolver. Expected " + + moduleIdentifier + ", got " + dependencyResolver.getIdentifier()); + } DynamicMBean writableDynamicWrapper = new DynamicWritableWrapper( module, moduleIdentifier, transactionIdentifier, readOnlyAtomicBoolean, transactionsMBeanServer, @@ -337,7 +356,7 @@ class ConfigTransactionControllerImpl implements ModuleIdentifier name = entry.getKey(); try { logger.debug("About to commit {} in transaction {}", - transactionIdentifier, name); + name, transactionIdentifier); module.getInstance(); } catch (Exception e) { logger.error("Commit failed on {} in transaction {}", name, @@ -451,11 +470,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(); + } }