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%2Fdependencyresolver%2FDependencyResolverImpl.java;fp=opendaylight%2Fconfig%2Fconfig-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fmanager%2Fimpl%2Fdependencyresolver%2FDependencyResolverImpl.java;h=e69aa8611af7f7aff96b543159a48b85b74e87c2;hp=8fa7fdfddef8b61922bf71accc0327ccc616bfe1;hb=2b78ca93f44c372fd72927db6cbd65f5d8387b49;hpb=c0e813ca83ce80d5f3fb340175ddaecd780c6aea diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/dependencyresolver/DependencyResolverImpl.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/dependencyresolver/DependencyResolverImpl.java index 8fa7fdfdde..e69aa8611a 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/dependencyresolver/DependencyResolverImpl.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/dependencyresolver/DependencyResolverImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2013, 2017 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, @@ -41,8 +41,7 @@ import org.slf4j.LoggerFactory; * by creating proxy that would throw exception if those methods are called * during validation. Tracks dependencies for ordering purposes. */ -final class DependencyResolverImpl implements DependencyResolver, - Comparable { +public final class DependencyResolverImpl implements DependencyResolver, Comparable { private static final Logger LOG = LoggerFactory.getLogger(DependencyResolverImpl.class); private final ModulesHolder modulesHolder; @@ -53,77 +52,65 @@ final class DependencyResolverImpl implements DependencyResolver, private final ServiceReferenceReadableRegistry readableRegistry; private final BindingContextProvider bindingContextProvider; private final String transactionName; - private final MBeanServer mBeanServer; + private final MBeanServer beanServer; private Integer maxDependencyDepth; - DependencyResolverImpl(final ModuleIdentifier currentModule, - final TransactionStatus transactionStatus, final ModulesHolder modulesHolder, - final ServiceReferenceReadableRegistry readableRegistry, final BindingContextProvider bindingContextProvider, - final String transactionName, final MBeanServer mBeanServer) { + public DependencyResolverImpl(final ModuleIdentifier currentModule, final TransactionStatus transactionStatus, + final ModulesHolder modulesHolder, final ServiceReferenceReadableRegistry readableRegistry, + final BindingContextProvider bindingContextProvider, final String transactionName, + final MBeanServer beanServer) { this.bindingContextProvider = bindingContextProvider; this.name = currentModule; this.transactionStatus = transactionStatus; this.modulesHolder = modulesHolder; this.readableRegistry = readableRegistry; this.transactionName = transactionName; - this.mBeanServer = mBeanServer; + this.beanServer = beanServer; } /** * {@inheritDoc} */ - //TODO: check for cycles + // TODO: check for cycles @Override - public void validateDependency( - final Class expectedServiceInterface, + public void validateDependency(final Class expectedServiceInterface, final ObjectName dependentReadOnlyON, final JmxAttribute jmxAttribute) { this.transactionStatus.checkNotCommitted(); if (expectedServiceInterface == null) { - throw new NullPointerException( - "Parameter 'expectedServiceInterface' is null"); + throw new NullPointerException("Parameter 'expectedServiceInterface' is null"); } if (jmxAttribute == null) { throw new NullPointerException("Parameter 'jmxAttribute' is null"); } JmxAttributeValidationException.checkNotNull(dependentReadOnlyON, - "is null, expected dependency implementing " - + expectedServiceInterface, jmxAttribute - ); - + "is null, expected dependency implementing " + expectedServiceInterface, jmxAttribute); // check that objectName belongs to this transaction - this should be // stripped // in DynamicWritableWrapper - final boolean hasTransaction = ObjectNameUtil - .getTransactionName(dependentReadOnlyON) != null; - JmxAttributeValidationException.checkCondition( - !hasTransaction, - String.format("ObjectName should not contain " - + "transaction name. %s set to %s. ", jmxAttribute, - dependentReadOnlyON - ), jmxAttribute - ); + final boolean hasTransaction = ObjectNameUtil.getTransactionName(dependentReadOnlyON) != null; + JmxAttributeValidationException.checkCondition(!hasTransaction, + String.format("ObjectName should not contain " + "transaction name. %s set to %s. ", jmxAttribute, + dependentReadOnlyON), + jmxAttribute); final ObjectName newDependentReadOnlyON = translateServiceRefIfPossible(dependentReadOnlyON); - final ModuleIdentifier moduleIdentifier = ObjectNameUtil.fromON(newDependentReadOnlyON, ObjectNameUtil - .TYPE_MODULE); + final ModuleIdentifier moduleIdentifier = ObjectNameUtil.fromON(newDependentReadOnlyON, + ObjectNameUtil.TYPE_MODULE); final ModuleFactory foundFactory = this.modulesHolder.findModuleFactory(moduleIdentifier, jmxAttribute); - final boolean implementsSI = foundFactory - .isModuleImplementingServiceInterface(expectedServiceInterface); + final boolean implementsSI = foundFactory.isModuleImplementingServiceInterface(expectedServiceInterface); if (!implementsSI) { final String message = String.format( "Found module factory does not expose expected service interface. " + "Module name is %s : %s, expected service interface %s, dependent module ON %s , " + "attribute %s", - foundFactory.getImplementationName(), foundFactory, - expectedServiceInterface, newDependentReadOnlyON, - jmxAttribute - ); + foundFactory.getImplementationName(), foundFactory, expectedServiceInterface, + newDependentReadOnlyON, jmxAttribute); throw new JmxAttributeValidationException(message, jmxAttribute); } synchronized (this) { @@ -137,16 +124,17 @@ final class DependencyResolverImpl implements DependencyResolver, if (ObjectNameUtil.isServiceReference(translatedDependentReadOnlyON)) { final String serviceQName = ObjectNameUtil.getServiceQName(translatedDependentReadOnlyON); final String refName = ObjectNameUtil.getReferenceName(translatedDependentReadOnlyON); - translatedDependentReadOnlyON = ObjectNameUtil.withoutTransactionName( // strip again of transaction name + // strip again of transaction name + translatedDependentReadOnlyON = ObjectNameUtil.withoutTransactionName( this.readableRegistry.lookupConfigBeanByServiceInterfaceName(serviceQName, refName)); } return translatedDependentReadOnlyON; } - //TODO: check for cycles + // TODO: check for cycles @Override public T resolveInstance(final Class expectedType, final ObjectName dependentReadOnlyON, - final JmxAttribute jmxAttribute) { + final JmxAttribute jmxAttribute) { final Module module = resolveModuleInstance(dependentReadOnlyON, jmxAttribute); synchronized (this) { @@ -155,30 +143,29 @@ final class DependencyResolverImpl implements DependencyResolver, final AutoCloseable instance = module.getInstance(); if (instance == null) { final String message = String.format( - "Error while %s resolving instance %s. getInstance() returned null. Expected type %s, attribute %s", - this.name, module.getIdentifier(), expectedType, jmxAttribute); + "Error while %s resolving instance %s. getInstance() returned null. Expected type %s, attribute %s", + this.name, module.getIdentifier(), expectedType, jmxAttribute); throw new JmxAttributeValidationException(message, jmxAttribute); } try { return expectedType.cast(instance); } catch (final ClassCastException e) { final String message = String.format( - "Instance cannot be cast to expected type. Instance class is %s, expected type %s , attribute %s", - instance.getClass(), expectedType, jmxAttribute); + "Instance cannot be cast to expected type. Instance class is %s, expected type %s , attribute %s", + instance.getClass(), expectedType, jmxAttribute); throw new JmxAttributeValidationException(message, e, jmxAttribute); } } - private Module resolveModuleInstance(final ObjectName dependentReadOnlyON, - final JmxAttribute jmxAttribute) { - Preconditions.checkArgument(dependentReadOnlyON != null ,"dependentReadOnlyON"); + private Module resolveModuleInstance(final ObjectName dependentReadOnlyON, final JmxAttribute jmxAttribute) { + Preconditions.checkArgument(dependentReadOnlyON != null, "dependentReadOnlyON"); Preconditions.checkArgument(jmxAttribute != null, "jmxAttribute"); final ObjectName translatedDependentReadOnlyON = translateServiceRefIfPossible(dependentReadOnlyON); this.transactionStatus.checkCommitStarted(); this.transactionStatus.checkNotCommitted(); - final ModuleIdentifier dependentModuleIdentifier = ObjectNameUtil.fromON( - translatedDependentReadOnlyON, ObjectNameUtil.TYPE_MODULE); + final ModuleIdentifier dependentModuleIdentifier = ObjectNameUtil.fromON(translatedDependentReadOnlyON, + ObjectNameUtil.TYPE_MODULE); return Preconditions.checkNotNull(this.modulesHolder.findModule(dependentModuleIdentifier, jmxAttribute)); } @@ -194,7 +181,8 @@ final class DependencyResolverImpl implements DependencyResolver, .findModuleInternalTransactionalInfo(identifier); if (moduleInternalTransactionalInfo.hasOldModule()) { - final Module oldModule = moduleInternalTransactionalInfo.getOldInternalInfo().getReadableModule().getModule(); + final Module oldModule = moduleInternalTransactionalInfo.getOldInternalInfo().getReadableModule() + .getModule(); return currentModule.canReuse(oldModule); } return false; @@ -204,7 +192,7 @@ final class DependencyResolverImpl implements DependencyResolver, public Class resolveIdentity(final IdentityAttributeRef identityRef, final Class expectedBaseClass) { final QName qName = QName.create(identityRef.getqNameOfIdentity()); - final Class deserialized = this.bindingContextProvider.getBindingContext().getIdentityClass(qName); + final Class deserialized = this.bindingContextProvider.getBindingContext().getIdentityClass(qName); if (deserialized == null) { throw new IllegalStateException("Unable to retrieve identity class for " + qName + ", null response from " + this.bindingContextProvider.getBindingContext()); @@ -213,25 +201,21 @@ final class DependencyResolverImpl implements DependencyResolver, return (Class) deserialized; } LOG.error("Cannot resolve class of identity {} : deserialized class {} is not a subclass of {}.", identityRef, - deserialized, expectedBaseClass); - throw new IllegalArgumentException("Deserialized identity " + deserialized + " cannot be cast to " + expectedBaseClass); + deserialized, expectedBaseClass); + throw new IllegalArgumentException( + "Deserialized identity " + deserialized + " cannot be cast to " + expectedBaseClass); } @Override public void validateIdentity(final IdentityAttributeRef identityRef, final Class expectedBaseClass, final JmxAttribute jmxAttribute) { - try { - resolveIdentity(identityRef, expectedBaseClass); - } catch (final Exception e) { - throw JmxAttributeValidationException.wrap(e, jmxAttribute); - } + resolveIdentity(identityRef, expectedBaseClass); } @Override - public int compareTo(final DependencyResolverImpl o) { + public int compareTo(final DependencyResolverImpl dependencyResolverImpl) { this.transactionStatus.checkCommitStarted(); - return Integer.compare(getMaxDependencyDepth(), - o.getMaxDependencyDepth()); + return Integer.compare(getMaxDependencyDepth(), dependencyResolverImpl.getMaxDependencyDepth()); } int getMaxDependencyDepth() { @@ -243,37 +227,35 @@ final class DependencyResolverImpl implements DependencyResolver, void countMaxDependencyDepth(final DependencyResolverManager manager) { // We can calculate the dependency after second phase commit was started - // Second phase commit starts after validation and validation adds the dependencies into the dependency resolver, which are necessary for the calculation - // FIXME generated code for abstract module declares validate method as non-final - // Overriding the validate would cause recreate every time instead of reuse + also possibly wrong close order if there is another module depending + // Second phase commit starts after validation and validation adds the + // dependencies into the dependency resolver, which are necessary for the + // calculation + // FIXME generated code for abstract module declares validate method as + // non-final + // Overriding the validate would cause recreate every time instead of reuse + + // also possibly wrong close order if there is another module depending this.transactionStatus.checkCommitStarted(); if (this.maxDependencyDepth == null) { - this.maxDependencyDepth = getMaxDepth(this, manager, - new LinkedHashSet<>()); + this.maxDependencyDepth = getMaxDepth(this, manager, new LinkedHashSet<>()); } } - private static int getMaxDepth(final DependencyResolverImpl impl, - final DependencyResolverManager manager, - final LinkedHashSet chainForDetectingCycles) { + private static int getMaxDepth(final DependencyResolverImpl impl, final DependencyResolverManager manager, + final LinkedHashSet chainForDetectingCycles) { int maxDepth = 0; - final LinkedHashSet chainForDetectingCycles2 = new LinkedHashSet<>( - chainForDetectingCycles); + final LinkedHashSet chainForDetectingCycles2 = new LinkedHashSet<>(chainForDetectingCycles); chainForDetectingCycles2.add(impl.getIdentifier()); for (final ModuleIdentifier dependencyName : impl.dependencies) { - final DependencyResolverImpl dependentDRI = manager - .getOrCreate(dependencyName); + final DependencyResolverImpl dependentDRI = manager.getOrCreate(dependencyName); if (chainForDetectingCycles2.contains(dependencyName)) { - throw new IllegalStateException(String.format( - "Cycle detected, %s contains %s", - chainForDetectingCycles2, dependencyName)); + throw new IllegalStateException( + String.format("Cycle detected, %s contains %s", chainForDetectingCycles2, dependencyName)); } int subDepth; if (dependentDRI.maxDependencyDepth != null) { subDepth = dependentDRI.maxDependencyDepth; } else { - subDepth = getMaxDepth(dependentDRI, manager, - chainForDetectingCycles2); + subDepth = getMaxDepth(dependentDRI, manager, chainForDetectingCycles2); dependentDRI.maxDependencyDepth = subDepth; } if (subDepth + 1 > maxDepth) { @@ -295,7 +277,7 @@ final class DependencyResolverImpl implements DependencyResolver, ObjectName newName = translateServiceRefIfPossible(name); // add transaction name newName = ObjectNameUtil.withTransactionName(newName, this.transactionName); - return this.mBeanServer.getAttribute(newName, attribute); + return this.beanServer.getAttribute(newName, attribute); } @Override @@ -303,6 +285,6 @@ final class DependencyResolverImpl implements DependencyResolver, ObjectName newName = translateServiceRefIfPossible(name); // add transaction name newName = ObjectNameUtil.withTransactionName(newName, this.transactionName); - return JMX.newMXBeanProxy(this.mBeanServer, newName, interfaceClass); + return JMX.newMXBeanProxy(this.beanServer, newName, interfaceClass); } }