X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatabroker%2FAbstractDOMBroker.java;h=4ab1c15782229abb7cb9cb73f1f802a00b2e6a55;hp=45b82ddec5f660a33d28e623076096c7a63aa664;hb=0b283e62a5872be1960635d5d6c4d301b1f87df2;hpb=925cb4a228d0fda99c7bfeb432eb25285a223887 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/AbstractDOMBroker.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/AbstractDOMBroker.java index 45b82ddec5..4ab1c15782 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/AbstractDOMBroker.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/AbstractDOMBroker.java @@ -5,69 +5,78 @@ * 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.cluster.databroker; import static com.google.common.base.Preconditions.checkState; -import com.google.common.collect.ImmutableMap; -import java.util.Collections; +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.ImmutableClassToInstanceMap; +import com.google.common.collect.ImmutableClassToInstanceMap.Builder; import java.util.EnumMap; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension; -import org.opendaylight.controller.md.sal.dom.api.DOMDataChangeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.controller.sal.core.spi.data.DOMStore; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreTreeChangePublisher; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension; +import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; +import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohort; +import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistration; +import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry; +import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; +import org.opendaylight.mdsal.dom.api.DOMTransactionChain; +import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; +import org.opendaylight.mdsal.dom.spi.PingPongMergingDOMDataBroker; +import org.opendaylight.mdsal.dom.spi.store.DOMStore; +import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain; +import org.opendaylight.mdsal.dom.spi.store.DOMStoreTreeChangePublisher; import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -abstract class AbstractDOMBroker extends AbstractDOMTransactionFactory - implements DOMDataBroker, AutoCloseable { +public abstract class AbstractDOMBroker extends AbstractDOMTransactionFactory + implements PingPongMergingDOMDataBroker { private static final Logger LOG = LoggerFactory.getLogger(AbstractDOMBroker.class); private final AtomicLong txNum = new AtomicLong(); private final AtomicLong chainNum = new AtomicLong(); - private final Map, DOMDataBrokerExtension> extensions; + private final ClassToInstanceMap extensions; + private volatile AutoCloseable closeable; protected AbstractDOMBroker(final Map datastores) { super(datastores); - boolean treeChange = true; - for (DOMStore ds : datastores.values()) { - if (!(ds instanceof DOMStoreTreeChangePublisher)) { - treeChange = false; - break; - } - } - - if (treeChange) { - extensions = ImmutableMap.of(DOMDataTreeChangeService.class, new DOMDataTreeChangeService() { + Builder extBuilder = ImmutableClassToInstanceMap.builder(); + if (isSupported(datastores, DOMStoreTreeChangePublisher.class)) { + extBuilder.put(DOMDataTreeChangeService.class, new DOMDataTreeChangeService() { @Override public ListenerRegistration registerDataTreeChangeListener( final DOMDataTreeIdentifier treeId, final L listener) { - DOMStore publisher = getTxFactories().get(treeId.getDatastoreType()); - checkState(publisher != null, "Requested logical data store is not available."); - - return ((DOMStoreTreeChangePublisher) publisher).registerTreeChangeListener( + DOMStore store = getDOMStore(treeId.getDatastoreType()); + return ((DOMStoreTreeChangePublisher) store).registerTreeChangeListener( treeId.getRootIdentifier(), listener); } }); - } else { - extensions = Collections.emptyMap(); } + + if (isSupported(datastores, DOMDataTreeCommitCohortRegistry.class)) { + extBuilder.put(DOMDataTreeCommitCohortRegistry.class, new DOMDataTreeCommitCohortRegistry() { + @Override + public DOMDataTreeCommitCohortRegistration registerCommitCohort( + final DOMDataTreeIdentifier path, final T cohort) { + DOMStore store = getDOMStore(path.getDatastoreType()); + return ((DOMDataTreeCommitCohortRegistry) store).registerCommitCohort(path, cohort); + } + }); + } + + extensions = extBuilder.build(); + } + + private static boolean isSupported(final Map datastores, + final Class expDOMStoreInterface) { + return datastores.values().stream().allMatch(expDOMStoreInterface::isInstance); } public void setCloseable(final AutoCloseable closeable) { @@ -94,21 +103,12 @@ abstract class AbstractDOMBroker extends AbstractDOMTransactionFactory } @Override - public ListenerRegistration registerDataChangeListener(final LogicalDatastoreType store, - final YangInstanceIdentifier path, final DOMDataChangeListener listener, - final DataChangeScope triggeringScope) { - DOMStore potentialStore = getTxFactories().get(store); - checkState(potentialStore != null, "Requested logical data store is not available."); - return potentialStore.registerChangeListener(path, listener, triggeringScope); - } - - @Override - public Map, DOMDataBrokerExtension> getSupportedExtensions() { + public ClassToInstanceMap getExtensions() { return extensions; } @Override - public DOMTransactionChain createTransactionChain(final TransactionChainListener listener) { + public DOMTransactionChain createTransactionChain(final DOMTransactionChainListener listener) { checkNotClosed(); final Map backingChains = @@ -122,4 +122,10 @@ abstract class AbstractDOMBroker extends AbstractDOMTransactionFactory backingChains); return new DOMBrokerTransactionChain(chainId, backingChains, this, listener); } + + private DOMStore getDOMStore(final LogicalDatastoreType type) { + DOMStore store = getTxFactories().get(type); + checkState(store != null, "Requested logical data store is not available."); + return store; + } }