From: Tom Pantelis Date: Thu, 16 Jun 2016 01:04:02 +0000 (-0400) Subject: Move GlobalBundleScanningSchemaServiceImpl to its own bundle X-Git-Tag: release/boron~85 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=0e5d0eeeda176fe4ef0d5f65097998b32e38abf1 Move GlobalBundleScanningSchemaServiceImpl to its own bundle Moved the GlobalBundleScanningSchemaServiceImpl and the associated BundleActivator, SchemaServiceActivator, from sal-dom-broker to a new bundle sal-schema-service. A couple reasons for this. One is to break the circular service imports between sal-dom-broker and sal-distributed-datastore, where sal-distributed-datastore imports the SchemaService from sal-dom-broker and sal-dom-broker imports the DOMDataBroker from sal-distributed-datastore. The result of this was that if the sal-dom-broker blueprint container was restarted, it would also cause the sal-distributed-datastore container to restart, which isn't necessary/desirable. The other reason is that apps can register a SchemaContextListener as an OSGi service which is picked up by the GlobalBundleScanningSchemaServiceImpl. In terms of service usage this makes sal-dom-broker a dependency of the app bundle so if the app container restarts, it also restarts sal-dom-broker, sal-distributed-datastore etc which isn't desirable. So moving the GlobalBundleScanningSchemaServiceImpl to its own bundle alleviates both issues. Change-Id: I75d1009f6bfc1d80a19a61050703a1ca7e049575 Signed-off-by: Tom Pantelis --- diff --git a/features/mdsal/pom.xml b/features/mdsal/pom.xml index fa956000a4..c342dd8e28 100644 --- a/features/mdsal/pom.xml +++ b/features/mdsal/pom.xml @@ -274,6 +274,10 @@ org.opendaylight.controller sal-dom-broker-config + + org.opendaylight.controller + sal-schema-service + diff --git a/features/mdsal/src/main/features/features.xml b/features/mdsal/src/main/features/features.xml index 94df44bc13..d76c601519 100644 --- a/features/mdsal/src/main/features/features.xml +++ b/features/mdsal/src/main/features/features.xml @@ -42,7 +42,8 @@ mvn:org.opendaylight.controller/sal-core-api/{{VERSION}} mvn:org.opendaylight.controller/sal-core-spi/{{VERSION}} - mvn:org.opendaylight.controller/sal-broker-impl/{{VERSION}} + mvn:org.opendaylight.controller/sal-schema-service/{{VERSION}} + mvn:org.opendaylight.controller/sal-broker-impl/{{VERSION}} mvn:org.opendaylight.controller/sal-binding-api/{{VERSION}} mvn:org.opendaylight.controller/sal-binding-broker-impl/{{VERSION}} mvn:org.opendaylight.controller/sal-binding-util/{{VERSION}} diff --git a/opendaylight/md-sal/mdsal-artifacts/pom.xml b/opendaylight/md-sal/mdsal-artifacts/pom.xml index 5a3b1bf9b0..70a13c9aa1 100644 --- a/opendaylight/md-sal/mdsal-artifacts/pom.xml +++ b/opendaylight/md-sal/mdsal-artifacts/pom.xml @@ -93,6 +93,11 @@ md-sal-config ${project.version} + + ${project.groupId} + sal-schema-service + ${project.version} + diff --git a/opendaylight/md-sal/pom.xml b/opendaylight/md-sal/pom.xml index 489ec7bdc3..dfdbac05a7 100644 --- a/opendaylight/md-sal/pom.xml +++ b/opendaylight/md-sal/pom.xml @@ -25,6 +25,7 @@ sal-dom-api sal-dom-broker sal-dom-spi + sal-schema-service sal-binding-api diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/resources/org/opendaylight/blueprint/clustered-datastore.xml b/opendaylight/md-sal/sal-distributed-datastore/src/main/resources/org/opendaylight/blueprint/clustered-datastore.xml index 4fa0af1db8..92f6c7a794 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/resources/org/opendaylight/blueprint/clustered-datastore.xml +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/resources/org/opendaylight/blueprint/clustered-datastore.xml @@ -10,7 +10,7 @@ - + diff --git a/opendaylight/md-sal/sal-dom-broker-config/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModule.java b/opendaylight/md-sal/sal-dom-broker-config/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModule.java index e3d71fb9aa..86dcf809c4 100644 --- a/opendaylight/md-sal/sal-dom-broker-config/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModule.java +++ b/opendaylight/md-sal/sal-dom-broker-config/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModule.java @@ -22,7 +22,6 @@ import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; import org.opendaylight.controller.sal.core.api.BrokerService; import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.opendaylight.controller.sal.dom.broker.BrokerImpl; -import org.opendaylight.controller.sal.dom.broker.GlobalBundleScanningSchemaServiceImpl; import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,6 +71,9 @@ public final class DomBrokerImplModule extends org.opendaylight.controller.confi DOMMountPointService mountService = newTracker(DOMMountPointService.class, closeables). waitForService(WaitingServiceTracker.FIVE_MINUTES); + SchemaService globalSchemaService = newTracker(SchemaService.class, closeables). + waitForService(WaitingServiceTracker.FIVE_MINUTES); + final DOMDataBroker dataBroker = getAsyncDataBrokerDependency(); final ClassToInstanceMap services = MutableClassToInstanceMap.create(); @@ -79,7 +81,7 @@ public final class DomBrokerImplModule extends org.opendaylight.controller.confi services.putInstance(DOMNotificationService.class, domNotificationService); services.putInstance(DOMNotificationPublishService.class, domNotificationPublishService); - final SchemaService schemaService = getSchemaServiceImpl(); + final SchemaService schemaService = getSchemaServiceImpl(globalSchemaService); services.putInstance(SchemaService.class, schemaService); services.putInstance(DOMDataBroker.class, dataBroker); @@ -112,12 +114,12 @@ public final class DomBrokerImplModule extends org.opendaylight.controller.confi return tracker; } - private SchemaService getSchemaServiceImpl() { + private SchemaService getSchemaServiceImpl(SchemaService globalSchemaService) { final SchemaService schemaService; if(getRootSchemaService() != null) { schemaService = getRootSchemaServiceDependency(); } else { - schemaService = GlobalBundleScanningSchemaServiceImpl.getInstance(); + schemaService = globalSchemaService; } return schemaService; } diff --git a/opendaylight/md-sal/sal-dom-broker-config/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModule.java b/opendaylight/md-sal/sal-dom-broker-config/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModule.java index fb4043053b..93942957df 100644 --- a/opendaylight/md-sal/sal-dom-broker-config/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModule.java +++ b/opendaylight/md-sal/sal-dom-broker-config/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModule.java @@ -8,10 +8,9 @@ package org.opendaylight.controller.config.yang.md.sal.dom.impl; import com.google.common.util.concurrent.CheckedFuture; +import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker; import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.opendaylight.controller.sal.core.api.model.YangTextSourceProvider; -import org.opendaylight.controller.sal.dom.broker.GlobalBundleScanningSchemaServiceImpl; -import org.opendaylight.yangtools.concepts.Delegator; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -64,57 +63,54 @@ org.opendaylight.controller.config.yang.md.sal.dom.impl.AbstractSchemaServiceImp } @Override - public java.lang.AutoCloseable createInstance() { - return new GlobalSchemaServiceProxy(GlobalBundleScanningSchemaServiceImpl.getInstance()); - } - - private static class GlobalSchemaServiceProxy implements AutoCloseable, SchemaService, YangTextSourceProvider, - Delegator { - private final GlobalBundleScanningSchemaServiceImpl delegate; - - public GlobalSchemaServiceProxy(GlobalBundleScanningSchemaServiceImpl service) { - this.delegate = service; - } - - @Override - public void close() { - // Intentional noop as the life-cycle is controlled via blueprint. - } - - @Override - public void addModule(final Module arg0) { - delegate.addModule(arg0); - } - - @Override - public SchemaContext getGlobalContext() { - return delegate.getGlobalContext(); + public AutoCloseable createInstance() { + final WaitingServiceTracker schemaServiceTracker = + WaitingServiceTracker.create(SchemaService.class, bundleContext); + final SchemaService schemaService = schemaServiceTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES); + + final WaitingServiceTracker sourceProviderTracker = + WaitingServiceTracker.create(YangTextSourceProvider.class, bundleContext); + final YangTextSourceProvider sourceProvider = sourceProviderTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES); + + class GlobalSchemaServiceProxy implements AutoCloseable, SchemaService, YangTextSourceProvider { + @Override + public void close() { + schemaServiceTracker.close(); + sourceProviderTracker.close(); + } + + @Override + public void addModule(final Module arg0) { + schemaService.addModule(arg0); + } + + @Override + public SchemaContext getGlobalContext() { + return schemaService.getGlobalContext(); + } + + @Override + public SchemaContext getSessionContext() { + return schemaService.getSessionContext(); + } + + @Override + public ListenerRegistration registerSchemaContextListener(final SchemaContextListener arg0) { + return schemaService.registerSchemaContextListener(arg0); + } + + @Override + public void removeModule(final Module arg0) { + schemaService.removeModule(arg0); + } + + @Override + public CheckedFuture getSource( + SourceIdentifier sourceIdentifier) { + return sourceProvider.getSource(sourceIdentifier); + } } - @Override - public SchemaContext getSessionContext() { - return delegate.getSessionContext(); - } - - @Override - public ListenerRegistration registerSchemaContextListener(final SchemaContextListener arg0) { - return delegate.registerSchemaContextListener(arg0); - } - - @Override - public void removeModule(final Module arg0) { - delegate.removeModule(arg0); - } - - @Override - public SchemaService getDelegate() { - return delegate; - } - - @Override - public CheckedFuture getSource( - SourceIdentifier sourceIdentifier) { - return delegate.getSource(sourceIdentifier); - } + return new GlobalSchemaServiceProxy(); } } diff --git a/opendaylight/md-sal/sal-dom-broker/pom.xml b/opendaylight/md-sal/sal-dom-broker/pom.xml index f806931b12..fd17463389 100644 --- a/opendaylight/md-sal/sal-dom-broker/pom.xml +++ b/opendaylight/md-sal/sal-dom-broker/pom.xml @@ -82,7 +82,6 @@ ${project.groupId}.${project.artifactId} - org.opendaylight.controller.sal.dom.broker.osgi.SchemaServiceActivator org.opendaylight.controller.sal.dom.broker, diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/resources/org/opendaylight/blueprint/dom-broker.xml b/opendaylight/md-sal/sal-dom-broker/src/main/resources/org/opendaylight/blueprint/dom-broker.xml index b7d4d5dd22..3cefd47b6c 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/resources/org/opendaylight/blueprint/dom-broker.xml +++ b/opendaylight/md-sal/sal-dom-broker/src/main/resources/org/opendaylight/blueprint/dom-broker.xml @@ -14,15 +14,7 @@ - - - - - org.opendaylight.controller.sal.core.api.model.SchemaService - org.opendaylight.controller.sal.core.api.model.YangTextSourceProvider - - + @@ -46,7 +38,7 @@ - + diff --git a/opendaylight/md-sal/sal-schema-service/pom.xml b/opendaylight/md-sal/sal-schema-service/pom.xml new file mode 100644 index 0000000000..18fe2a79d6 --- /dev/null +++ b/opendaylight/md-sal/sal-schema-service/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + org.opendaylight.controller + sal-parent + 1.4.0-SNAPSHOT + + sal-schema-service + bundle + + + + com.google.guava + guava + + + org.opendaylight.controller + sal-core-api + + + org.opendaylight.yangtools + yang-parser-impl + + + org.slf4j + slf4j-api + + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.groupId}.${project.artifactId} + org.opendaylight.controller.sal.schema.service.impl.SchemaServiceActivator + + + + + + diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/GlobalBundleScanningSchemaServiceImpl.java b/opendaylight/md-sal/sal-schema-service/src/main/java/org/opendaylight/controller/sal/schema/service/impl/GlobalBundleScanningSchemaServiceImpl.java similarity index 92% rename from opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/GlobalBundleScanningSchemaServiceImpl.java rename to opendaylight/md-sal/sal-schema-service/src/main/java/org/opendaylight/controller/sal/schema/service/impl/GlobalBundleScanningSchemaServiceImpl.java index 4ba62e4fc4..c54b2e3885 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/GlobalBundleScanningSchemaServiceImpl.java +++ b/opendaylight/md-sal/sal-schema-service/src/main/java/org/opendaylight/controller/sal/schema/service/impl/GlobalBundleScanningSchemaServiceImpl.java @@ -5,10 +5,9 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.controller.sal.dom.broker; +package org.opendaylight.controller.sal.schema.service.impl; import static com.google.common.base.Preconditions.checkState; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -19,7 +18,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; import javax.annotation.concurrent.GuardedBy; import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.opendaylight.controller.sal.core.api.model.YangTextSourceProvider; @@ -48,8 +46,6 @@ import org.slf4j.LoggerFactory; public class GlobalBundleScanningSchemaServiceImpl implements SchemaContextProvider, SchemaService, ServiceTrackerCustomizer, YangTextSourceProvider, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(GlobalBundleScanningSchemaServiceImpl.class); - private static AtomicReference globalInstance = new AtomicReference<>(); - @GuardedBy(value = "lock") private final ListenerRegistry listeners = new ListenerRegistry<>(); private final YangTextSchemaContextResolver contextResolver = YangTextSchemaContextResolver.create("global-bundle"); @@ -68,25 +64,10 @@ public class GlobalBundleScanningSchemaServiceImpl implements SchemaContextProvi public static GlobalBundleScanningSchemaServiceImpl createInstance(final BundleContext ctx) { GlobalBundleScanningSchemaServiceImpl instance = new GlobalBundleScanningSchemaServiceImpl(ctx); - Preconditions.checkState(globalInstance.compareAndSet(null, instance)); instance.start(); return instance; } - public static GlobalBundleScanningSchemaServiceImpl getInstance() { - GlobalBundleScanningSchemaServiceImpl instance = globalInstance.get(); - Preconditions.checkState(instance != null, "Global Instance was not instantiated"); - return instance; - } - - @VisibleForTesting - public static void destroyInstance() { - GlobalBundleScanningSchemaServiceImpl instance = globalInstance.getAndSet(null); - if(instance != null) { - instance.close(); - } - } - public BundleContext getContext() { return context; } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/SchemaServiceActivator.java b/opendaylight/md-sal/sal-schema-service/src/main/java/org/opendaylight/controller/sal/schema/service/impl/SchemaServiceActivator.java similarity index 72% rename from opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/SchemaServiceActivator.java rename to opendaylight/md-sal/sal-schema-service/src/main/java/org/opendaylight/controller/sal/schema/service/impl/SchemaServiceActivator.java index 37093c7d13..a13a872e9c 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/SchemaServiceActivator.java +++ b/opendaylight/md-sal/sal-schema-service/src/main/java/org/opendaylight/controller/sal/schema/service/impl/SchemaServiceActivator.java @@ -5,30 +5,31 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.controller.sal.dom.broker.osgi; +package org.opendaylight.controller.sal.schema.service.impl; import java.util.Hashtable; import org.opendaylight.controller.sal.core.api.model.SchemaService; -import org.opendaylight.controller.sal.dom.broker.GlobalBundleScanningSchemaServiceImpl; +import org.opendaylight.controller.sal.core.api.model.YangTextSourceProvider; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; public class SchemaServiceActivator implements BundleActivator { - - private ServiceRegistration schemaServiceReg; + private ServiceRegistration schemaSourceReg; private GlobalBundleScanningSchemaServiceImpl schemaService; @Override public void start(final BundleContext context) { schemaService = GlobalBundleScanningSchemaServiceImpl.createInstance(context); schemaServiceReg = context.registerService(SchemaService.class, schemaService, new Hashtable()); + schemaSourceReg = context.registerService(YangTextSourceProvider.class, schemaService, new Hashtable()); } @Override - public void stop(final BundleContext context) throws Exception { + public void stop(final BundleContext context) { schemaServiceReg.unregister(); + schemaSourceReg.unregister(); schemaService.close(); } }