From 331b8a41d5e326ec0769ef8ae731c67061fda8bd Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Thu, 19 Jun 2014 16:35:47 +0200 Subject: [PATCH] Bug 629: Make SchemaService required for Data Brokers Binding Aware versions of Data Brokers did not required SchemaService when constructed. Refactored their constructor to make it obvious that Schema Service is required. Change-Id: I6c7c69df15aa0130a92015b2c52ba1a9e4cab7b1 Signed-off-by: Tony Tkacik --- ...rwardedCompatibleDataBrokerImplModule.java | 5 +- .../impl/AbstractForwardedDataBroker.java | 13 +++- ...orwardedBackwardsCompatibleDataBroker.java | 12 +--- .../impl/ForwardedBindingDataBroker.java | 5 +- .../binding/test/util/BindingTestContext.java | 44 +++++-------- .../binding/test/util/MockSchemaService.java | 62 +++++++++++++++++++ 6 files changed, 97 insertions(+), 44 deletions(-) create mode 100644 opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/MockSchemaService.java diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/ForwardedCompatibleDataBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/ForwardedCompatibleDataBrokerImplModule.java index 647ca85671..7467e544fd 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/ForwardedCompatibleDataBrokerImplModule.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/ForwardedCompatibleDataBrokerImplModule.java @@ -59,10 +59,9 @@ public final class ForwardedCompatibleDataBrokerImplModule extends Broker domBroker = getDomAsyncBrokerDependency(); ProviderSession session = domBroker.registerProvider(this, getBundleContext()); DOMDataBroker domDataBroker = session.getService(DOMDataBroker.class); + SchemaService schemaService = session.getService(SchemaService.class); ForwardedBackwardsCompatibleDataBroker dataBroker = new ForwardedBackwardsCompatibleDataBroker(domDataBroker, - mappingService, listeningExecutor); - - session.getService(SchemaService.class).registerSchemaServiceListener(dataBroker); + mappingService, schemaService,listeningExecutor); dataBroker.setConnector(BindingDomConnectorDeployer.createConnector(getBindingMappingServiceDependency())); dataBroker.setDomProviderContext(session); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java index 2a866a94b3..b09cd1c80a 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedDataBroker.java @@ -23,6 +23,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataChangeListener; import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector; import org.opendaylight.controller.sal.binding.impl.forward.DomForwardedBroker; import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; +import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; import org.opendaylight.yangtools.concepts.Delegator; import org.opendaylight.yangtools.concepts.ListenerRegistration; @@ -33,6 +34,7 @@ import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMapping import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; +import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +42,7 @@ import com.google.common.base.Objects; import com.google.common.base.Optional; public abstract class AbstractForwardedDataBroker implements Delegator, DomForwardedBroker, - SchemaContextListener { + SchemaContextListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(AbstractForwardedDataBroker.class); // The Broker to whom we do all forwarding @@ -53,12 +55,14 @@ public abstract class AbstractForwardedDataBroker implements Delegator schemaListenerRegistration; protected AbstractForwardedDataBroker(final DOMDataBroker domDataBroker, - final BindingIndependentMappingService mappingService) { + final BindingIndependentMappingService mappingService,final SchemaService schemaService) { this.domDataBroker = domDataBroker; this.mappingService = mappingService; this.codec = new BindingToNormalizedNodeCodec(mappingService); + this.schemaListenerRegistration = schemaService.registerSchemaServiceListener(this); } protected BindingToNormalizedNodeCodec getCodec() { @@ -286,4 +290,9 @@ public abstract class AbstractForwardedDataBroker implements Delegator, CommitHandlerRegistrationImpl> commitHandlers = new ConcurrentHashMap<>(); - private final ListenerRegistry fakeRegistry = ListenerRegistry.create(); private final ListeningExecutorService executorService; public ForwardedBackwardsCompatibleDataBroker(final DOMDataBroker domDataBroker, - final BindingIndependentMappingService mappingService, final ListeningExecutorService executor) { - super(domDataBroker, mappingService); + final BindingIndependentMappingService mappingService, final SchemaService schemaService,final ListeningExecutorService executor) { + super(domDataBroker, mappingService,schemaService); executorService = executor; LOG.info("ForwardedBackwardsCompatibleBroker started."); } @@ -129,12 +129,6 @@ public class ForwardedBackwardsCompatibleDataBroker extends AbstractForwardedDat throw new UnsupportedOperationException("Data reader contract is not supported."); } - @Override - public void close() throws Exception { - // TODO Auto-generated method stub - - } - public ListenableFuture> commit(final ForwardedBackwardsCompatibleTransacion tx) { final List, DataObject>> subTrans = new ArrayList<>(); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java index fb06b130ce..5ab088e20e 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java @@ -18,6 +18,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; import org.opendaylight.controller.md.sal.dom.api.DOMDataReadTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; +import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; @@ -41,8 +42,8 @@ import com.google.common.util.concurrent.ListenableFuture; */ public class ForwardedBindingDataBroker extends AbstractForwardedDataBroker implements BindingDataBroker { - public ForwardedBindingDataBroker(final DOMDataBroker domDataBroker, final BindingIndependentMappingService mappingService) { - super(domDataBroker, mappingService); + public ForwardedBindingDataBroker(final DOMDataBroker domDataBroker, final BindingIndependentMappingService mappingService, final SchemaService schemaService) { + super(domDataBroker, mappingService,schemaService); } @Override diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java index ae65c8889a..689d48e8b6 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java @@ -48,7 +48,6 @@ import org.opendaylight.controller.sal.dom.broker.impl.DataStoreStatsWrapper; import org.opendaylight.controller.sal.dom.broker.impl.HashMapDataStore; import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareDataStoreAdapter; import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareRpcBroker; -import org.opendaylight.controller.sal.dom.broker.impl.SchemaContextProvider; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.sal.binding.generator.impl.RuntimeGeneratedMappingServiceImpl; import org.opendaylight.yangtools.yang.common.QName; @@ -57,7 +56,6 @@ import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; import org.reflections.Reflections; import org.reflections.scanners.ResourcesScanner; @@ -70,7 +68,7 @@ import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.ListeningExecutorService; -public class BindingTestContext implements AutoCloseable, SchemaContextProvider { +public class BindingTestContext implements AutoCloseable { public static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier TREE_ROOT = org.opendaylight.yangtools.yang.data.api.InstanceIdentifier .builder().toInstance(); @@ -101,22 +99,19 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider private MountPointManagerImpl biMountImpl; - private SchemaContext schemaContext; + private ImmutableMap newDatastores; private BackwardsCompatibleDataBroker biCompatibleBroker; - private final List schemaListeners = new ArrayList<>(); - private DataProviderService baData; private DOMDataBroker newDOMDataBroker; - @Override - public SchemaContext getSchemaContext() { - return schemaContext; - } + private final MockSchemaService mockSchemaService = new MockSchemaService(); + + public DOMDataBroker getDomAsyncDataBroker() { return newDOMDataBroker; @@ -128,6 +123,7 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider this.startWithSchema = startWithSchema; } + @Deprecated public void startDomDataStore() { checkState(dataStore == null, "DataStore already started."); checkState(biDataImpl != null, "Dom Data Broker not present"); @@ -140,7 +136,7 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider } else { dataStore = schemaAwareDataStore; } - + mockSchemaService.registerSchemaServiceListener(schemaAwareDataStore); biDataImpl.registerConfigurationReader(TREE_ROOT, dataStore); biDataImpl.registerOperationalReader(TREE_ROOT, dataStore); biDataImpl.registerCommitHandler(TREE_ROOT, dataStore); @@ -166,9 +162,9 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider biCompatibleBroker = new BackwardsCompatibleDataBroker(newDOMDataBroker); - schemaListeners.add(configStore); - schemaListeners.add(operStore); - schemaListeners.add(biCompatibleBroker); + mockSchemaService.registerSchemaServiceListener(configStore); + mockSchemaService.registerSchemaServiceListener(operStore); + mockSchemaService.registerSchemaServiceListener(biCompatibleBroker); biDataLegacyBroker = biCompatibleBroker; } @@ -268,20 +264,11 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider public void startBindingToDomMappingService() { checkState(classPool != null, "ClassPool needs to be present"); mappingServiceImpl = new RuntimeGeneratedMappingServiceImpl(classPool); + mockSchemaService.registerSchemaServiceListener(mappingServiceImpl); } public void updateYangSchema(final String[] files) { - schemaContext = getContext(files); - - if (schemaAwareDataStore != null) { - schemaAwareDataStore.onGlobalContextUpdated(schemaContext); - } - if (mappingServiceImpl != null) { - mappingServiceImpl.onGlobalContextUpdated(schemaContext); - } - for(SchemaContextListener listener : schemaListeners) { - listener.onGlobalContextUpdated(schemaContext); - } + mockSchemaService.changeSchema(getContext(files)); } public static String[] getAllYangFilesOnClasspath() { @@ -340,8 +327,7 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider } public void startNewBindingDataBroker() { - ForwardedBackwardsCompatibleDataBroker forwarded = new ForwardedBackwardsCompatibleDataBroker(newDOMDataBroker, mappingServiceImpl, executor); - schemaListeners.add(forwarded); + ForwardedBackwardsCompatibleDataBroker forwarded = new ForwardedBackwardsCompatibleDataBroker(newDOMDataBroker, mappingServiceImpl,mockSchemaService, executor); baData = forwarded; } @@ -353,7 +339,7 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider private void startDomBroker() { checkState(executor != null); biBrokerImpl = new BrokerImpl(); - biBrokerImpl.setRouter(new SchemaAwareRpcBroker("/", this)); + biBrokerImpl.setRouter(new SchemaAwareRpcBroker("/", mockSchemaService)); } @@ -429,4 +415,6 @@ public class BindingTestContext implements AutoCloseable, SchemaContextProvider public MountProvisionService getDomMountProviderService() { return biMountImpl; } + + } diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/MockSchemaService.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/MockSchemaService.java new file mode 100644 index 0000000000..c8acbcd994 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/MockSchemaService.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2014 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, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.sal.binding.test.util; + +import org.opendaylight.controller.sal.core.api.model.SchemaService; +import org.opendaylight.controller.sal.dom.broker.impl.SchemaContextProvider; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.util.ListenerRegistry; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener; + +@SuppressWarnings("deprecation") +public final class MockSchemaService implements SchemaService, SchemaContextProvider { + + private SchemaContext schemaContext; + + ListenerRegistry listeners = ListenerRegistry.create(); + + @Override + public void addModule(final Module module) { + throw new UnsupportedOperationException(); + } + + @Override + public synchronized SchemaContext getGlobalContext() { + return schemaContext; + } + + @Override + public synchronized SchemaContext getSessionContext() { + return schemaContext; + } + + @Override + public ListenerRegistration registerSchemaServiceListener( + final SchemaServiceListener listener) { + return listeners.register(listener); + } + + @Override + public void removeModule(final Module module) { + throw new UnsupportedOperationException(); + } + + @Override + public synchronized SchemaContext getSchemaContext() { + return schemaContext; + } + + public synchronized void changeSchema(final SchemaContext newContext) { + schemaContext = newContext; + for (ListenerRegistration listener : listeners) { + listener.getInstance().onGlobalContextUpdated(schemaContext); + } + } +} \ No newline at end of file -- 2.36.6