X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fblueprint%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fblueprint%2Fext%2FAbstractDependentComponentFactoryMetadata.java;h=9bd51a460aa40ad7205e53a2eeffbdea7d058747;hb=d787111c6bf6743f142cea1ac564ab16373edae0;hp=c55fa0ce913147b8d554a40693ededf97359aa10;hpb=98b63083a6709b1c69ee31471e28aef23d3ab457;p=controller.git diff --git a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/AbstractDependentComponentFactoryMetadata.java b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/AbstractDependentComponentFactoryMetadata.java index c55fa0ce91..9bd51a460a 100644 --- a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/AbstractDependentComponentFactoryMetadata.java +++ b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/AbstractDependentComponentFactoryMetadata.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import javax.annotation.Nullable; +import javax.annotation.concurrent.GuardedBy; import org.apache.aries.blueprint.di.AbstractRecipe; import org.apache.aries.blueprint.di.ExecutionContext; import org.apache.aries.blueprint.di.Recipe; @@ -31,19 +32,22 @@ import org.slf4j.LoggerFactory; * @author Thomas Pantelis */ abstract class AbstractDependentComponentFactoryMetadata implements DependentComponentFactoryMetadata { - private final Logger log = LoggerFactory.getLogger(getClass()); + final Logger log = LoggerFactory.getLogger(getClass()); private final String id; private final AtomicBoolean started = new AtomicBoolean(); private final AtomicBoolean satisfied = new AtomicBoolean(); private final AtomicBoolean restarting = new AtomicBoolean(); + @GuardedBy("serviceRecipes") private final List serviceRecipes = new ArrayList<>(); private volatile ExtendedBlueprintContainer container; private volatile SatisfactionCallback satisfactionCallback; private volatile String failureMessage; private volatile Throwable failureCause; - private volatile String dependendencyDesc; + private volatile String dependencyDesc; + @GuardedBy("serviceRecipes") + private boolean stoppedServiceRecipes; - protected AbstractDependentComponentFactoryMetadata(String id) { + protected AbstractDependentComponentFactoryMetadata(final String id) { this.id = Preconditions.checkNotNull(id); } @@ -64,7 +68,7 @@ abstract class AbstractDependentComponentFactoryMetadata implements DependentCom @Override public String getDependencyDescriptor() { - return dependendencyDesc; + return dependencyDesc; } @Override @@ -72,17 +76,17 @@ abstract class AbstractDependentComponentFactoryMetadata implements DependentCom return satisfied.get(); } - protected void setFailureMessage(String failureMessage) { + protected void setFailureMessage(final String failureMessage) { setFailure(failureMessage, null); } - protected void setFailure(String failureMessage, Throwable failureCause) { + protected void setFailure(final String failureMessage, final Throwable failureCause) { this.failureMessage = failureMessage; this.failureCause = failureCause; } - protected void setDependendencyDesc(String dependendencyDesc) { - this.dependendencyDesc = dependendencyDesc; + protected void setDependencyDesc(final String dependencyDesc) { + this.dependencyDesc = dependencyDesc; } protected final ExtendedBlueprintContainer container() { @@ -95,17 +99,25 @@ abstract class AbstractDependentComponentFactoryMetadata implements DependentCom } } - protected void retrieveService(String name, Class interfaceClass, Consumer onServiceRetrieved) { + protected void retrieveService(final String name, final Class interfaceClass, + final Consumer onServiceRetrieved) { retrieveService(name, interfaceClass.getName(), onServiceRetrieved); } - protected void retrieveService(String name, String interfaceName, Consumer onServiceRetrieved) { - StaticServiceReferenceRecipe recipe = new StaticServiceReferenceRecipe(getId() + "-" + name, - container, interfaceName); - setDependendencyDesc(recipe.getOsgiFilter()); - serviceRecipes.add(recipe); + protected void retrieveService(final String name, final String interfaceName, + final Consumer onServiceRetrieved) { + synchronized (serviceRecipes) { + if (stoppedServiceRecipes) { + return; + } + + StaticServiceReferenceRecipe recipe = new StaticServiceReferenceRecipe(getId() + "-" + name, + container, interfaceName); + setDependencyDesc(recipe.getOsgiFilter()); + serviceRecipes.add(recipe); - recipe.startTracking(onServiceRetrieved); + recipe.startTracking(onServiceRetrieved); + } } protected final String logName() { @@ -113,7 +125,7 @@ abstract class AbstractDependentComponentFactoryMetadata implements DependentCom } @Override - public void init(ExtendedBlueprintContainer newContainer) { + public void init(final ExtendedBlueprintContainer newContainer) { this.container = newContainer; log.debug("{}: In init", logName()); @@ -182,18 +194,21 @@ abstract class AbstractDependentComponentFactoryMetadata implements DependentCom } @Override - public void destroy(Object instance) { + public void destroy(final Object instance) { log.debug("{}: In destroy", logName()); stopServiceRecipes(); } private void stopServiceRecipes() { - for (StaticServiceReferenceRecipe recipe: serviceRecipes) { - recipe.stop(); - } + synchronized (serviceRecipes) { + stoppedServiceRecipes = true; + for (StaticServiceReferenceRecipe recipe: serviceRecipes) { + recipe.stop(); + } - serviceRecipes.clear(); + serviceRecipes.clear(); + } } protected void restartContainer() { @@ -208,7 +223,7 @@ abstract class AbstractDependentComponentFactoryMetadata implements DependentCom @SuppressWarnings("unchecked") @Nullable - protected T getOSGiService(Class serviceInterface) { + protected T getOSGiService(final Class serviceInterface) { try { ServiceReference serviceReference = container().getBundleContext().getServiceReference(serviceInterface);