<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-dom-broker-config</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-schema-service</artifactId>
+ </dependency>
<!-- message-bus -->
<dependency>
<!-- FIXME: Bug 4202: Add MD-SAL provided odl-mdsal-dom-broker -->
<bundle>mvn:org.opendaylight.controller/sal-core-api/{{VERSION}}</bundle>
<bundle>mvn:org.opendaylight.controller/sal-core-spi/{{VERSION}}</bundle>
- <bundle start-level="70">mvn:org.opendaylight.controller/sal-broker-impl/{{VERSION}}</bundle>
+ <bundle start-level="70">mvn:org.opendaylight.controller/sal-schema-service/{{VERSION}}</bundle>
+ <bundle>mvn:org.opendaylight.controller/sal-broker-impl/{{VERSION}}</bundle>
<bundle>mvn:org.opendaylight.controller/sal-binding-api/{{VERSION}}</bundle>
<bundle>mvn:org.opendaylight.controller/sal-binding-broker-impl/{{VERSION}}</bundle>
<bundle>mvn:org.opendaylight.controller/sal-binding-util/{{VERSION}}</bundle>
<artifactId>md-sal-config</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>sal-schema-service</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<!-- Test support -->
<dependency>
<module>sal-dom-api</module>
<module>sal-dom-broker</module>
<module>sal-dom-spi</module>
+ <module>sal-schema-service</module>
<!-- Binding Aware -->
<module>sal-binding-api</module>
</cm:default-properties>
</cm:property-placeholder>
- <reference id="schemaService" interface="org.opendaylight.controller.sal.core.api.model.SchemaService" />
+ <odl:static-reference id="schemaService" interface="org.opendaylight.controller.sal.core.api.model.SchemaService" />
<!-- ActorSystemProvider -->
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;
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<BrokerService> services = MutableClassToInstanceMap.create();
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);
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;
}
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;
}
@Override
- public java.lang.AutoCloseable createInstance() {
- return new GlobalSchemaServiceProxy(GlobalBundleScanningSchemaServiceImpl.getInstance());
- }
-
- private static class GlobalSchemaServiceProxy implements AutoCloseable, SchemaService, YangTextSourceProvider,
- Delegator<SchemaService> {
- 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<SchemaService> schemaServiceTracker =
+ WaitingServiceTracker.create(SchemaService.class, bundleContext);
+ final SchemaService schemaService = schemaServiceTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+
+ final WaitingServiceTracker<YangTextSourceProvider> 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<SchemaContextListener> registerSchemaContextListener(final SchemaContextListener arg0) {
+ return schemaService.registerSchemaContextListener(arg0);
+ }
+
+ @Override
+ public void removeModule(final Module arg0) {
+ schemaService.removeModule(arg0);
+ }
+
+ @Override
+ public CheckedFuture<? extends YangTextSchemaSource, SchemaSourceException> getSource(
+ SourceIdentifier sourceIdentifier) {
+ return sourceProvider.getSource(sourceIdentifier);
+ }
}
- @Override
- public SchemaContext getSessionContext() {
- return delegate.getSessionContext();
- }
-
- @Override
- public ListenerRegistration<SchemaContextListener> 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<? extends YangTextSchemaSource, SchemaSourceException> getSource(
- SourceIdentifier sourceIdentifier) {
- return delegate.getSource(sourceIdentifier);
- }
+ return new GlobalSchemaServiceProxy();
}
}
<configuration>
<instructions>
<Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
- <Bundle-Activator>org.opendaylight.controller.sal.dom.broker.osgi.SchemaServiceActivator</Bundle-Activator>
<Export-Package>
<!-- Legacy code -->
org.opendaylight.controller.sal.dom.broker,
<!-- Schema Service -->
- <bean id="schemaServiceImpl" class="org.opendaylight.controller.sal.dom.broker.GlobalBundleScanningSchemaServiceImpl"
- factory-method="getInstance" />
-
- <service ref="schemaServiceImpl">
- <interfaces>
- <value>org.opendaylight.controller.sal.core.api.model.SchemaService</value>
- <value>org.opendaylight.controller.sal.core.api.model.YangTextSourceProvider</value>
- </interfaces>
- </service>
+ <odl:static-reference id="schemaService" interface="org.opendaylight.controller.sal.core.api.model.SchemaService"/>
<!-- DOM Notification Service -->
<bean id="domRpcRouter" class="org.opendaylight.controller.md.sal.dom.broker.impl.DOMRpcRouter"
factory-method="newInstance">
- <argument ref="schemaServiceImpl"/>
+ <argument ref="schemaService"/>
</bean>
<service ref="domRpcRouter" odl:type="default">
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-parent</artifactId>
+ <version>1.4.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>sal-schema-service</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-core-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-parser-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
+ <Bundle-Activator>org.opendaylight.controller.sal.schema.service.impl.SchemaServiceActivator</Bundle-Activator>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
* 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;
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;
public class GlobalBundleScanningSchemaServiceImpl implements SchemaContextProvider, SchemaService, ServiceTrackerCustomizer<SchemaContextListener, SchemaContextListener>, YangTextSourceProvider, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(GlobalBundleScanningSchemaServiceImpl.class);
- private static AtomicReference<GlobalBundleScanningSchemaServiceImpl> globalInstance = new AtomicReference<>();
-
@GuardedBy(value = "lock")
private final ListenerRegistry<SchemaContextListener> listeners = new ListenerRegistry<>();
private final YangTextSchemaContextResolver contextResolver = YangTextSchemaContextResolver.create("global-bundle");
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;
}
* 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<SchemaService> schemaServiceReg;
+ private ServiceRegistration<YangTextSourceProvider> schemaSourceReg;
private GlobalBundleScanningSchemaServiceImpl schemaService;
@Override
public void start(final BundleContext context) {
schemaService = GlobalBundleScanningSchemaServiceImpl.createInstance(context);
schemaServiceReg = context.registerService(SchemaService.class, schemaService, new Hashtable<String,String>());
+ schemaSourceReg = context.registerService(YangTextSourceProvider.class, schemaService, new Hashtable<String,String>());
}
@Override
- public void stop(final BundleContext context) throws Exception {
+ public void stop(final BundleContext context) {
schemaServiceReg.unregister();
+ schemaSourceReg.unregister();
schemaService.close();
}
}