X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FDefaultShardDataTreeChangeListenerPublisher.java;h=720aadb175dccf29aea8895d6ec2ab60b08ba964;hb=546cd1fd100dbaa36908b22c2f422320dbd8c4b2;hp=a63859e9e695516488129a496319d1070e9b3804;hpb=d7b6de077e39224b40e396ed0fd2479e3079fba5;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DefaultShardDataTreeChangeListenerPublisher.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DefaultShardDataTreeChangeListenerPublisher.java index a63859e9e6..720aadb175 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DefaultShardDataTreeChangeListenerPublisher.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DefaultShardDataTreeChangeListenerPublisher.java @@ -8,7 +8,8 @@ package org.opendaylight.controller.cluster.datastore; import java.util.Collection; -import javax.annotation.concurrent.NotThreadSafe; +import java.util.Optional; +import java.util.function.Consumer; import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.spi.AbstractDOMDataTreeChangeListenerRegistration; import org.opendaylight.mdsal.dom.spi.store.AbstractDOMStoreTreeChangePublisher; @@ -20,28 +21,34 @@ import org.slf4j.LoggerFactory; /** * Default implementation of ShardDataTreeChangeListenerPublisher that directly generates and publishes - * notifications for DataTreeChangeListeners. + * notifications for DataTreeChangeListeners. This class is NOT thread-safe. * * @author Thomas Pantelis */ -@NotThreadSafe final class DefaultShardDataTreeChangeListenerPublisher extends AbstractDOMStoreTreeChangePublisher implements ShardDataTreeChangeListenerPublisher { private static final Logger LOG = LoggerFactory.getLogger(DefaultShardDataTreeChangeListenerPublisher.class); + private String logContext; - @Override - public void publishChanges(final DataTreeCandidate candidate, String logContext) { - processCandidateTree(candidate); + DefaultShardDataTreeChangeListenerPublisher(final String logContext) { + this.logContext = logContext; } @Override - public ShardDataTreeChangeListenerPublisher newInstance() { - return new DefaultShardDataTreeChangeListenerPublisher(); + public void publishChanges(final DataTreeCandidate candidate) { + if (LOG.isTraceEnabled()) { + LOG.trace("{}: publishChanges: {}", logContext, candidate); + } else { + LOG.debug("{}: publishChanges: rootPath: {}", logContext, candidate.getRootPath()); + } + + processCandidateTree(candidate); } @Override - protected void notifyListener(AbstractDOMDataTreeChangeListenerRegistration registration, - Collection changes) { + protected void notifyListener(final AbstractDOMDataTreeChangeListenerRegistration registration, + final Collection changes) { + LOG.debug("{}: notifyListener: listener: {}", logContext, registration.getInstance()); registration.getInstance().onDataTreeChanged(changes); } @@ -51,18 +58,38 @@ final class DefaultShardDataTreeChangeListenerPublisher extends AbstractDOMStore } @Override - public ListenerRegistration - registerTreeChangeListener(final YangInstanceIdentifier treeId, final L listener) { - final AbstractDOMDataTreeChangeListenerRegistration registration = - super.registerTreeChangeListener(treeId, (org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener) - changes -> listener.onDataTreeChanged(changes)); + public void registerTreeChangeListener(final YangInstanceIdentifier treeId, + final DOMDataTreeChangeListener listener, final Optional initialState, + final Consumer> onRegistration) { + registerTreeChangeListener(treeId, listener, onRegistration); + + if (initialState.isPresent()) { + notifySingleListener(treeId, listener, initialState.get(), logContext); + } else { + listener.onInitialData(); + } + } + + void registerTreeChangeListener(final YangInstanceIdentifier treeId, final DOMDataTreeChangeListener listener, + final Consumer> onRegistration) { + LOG.debug("{}: registerTreeChangeListener: path: {}, listener: {}", logContext, treeId, listener); + + AbstractDOMDataTreeChangeListenerRegistration registration = + super.registerTreeChangeListener(treeId, listener); + + onRegistration.accept(registration); + } + + static void notifySingleListener(final YangInstanceIdentifier treeId, final DOMDataTreeChangeListener listener, + final DataTreeCandidate state, final String logContext) { + LOG.debug("{}: notifySingleListener: path: {}, listener: {}", logContext, treeId, listener); + DefaultShardDataTreeChangeListenerPublisher publisher = + new DefaultShardDataTreeChangeListenerPublisher(logContext); + publisher.logContext = logContext; + publisher.registerTreeChangeListener(treeId, listener); - return new org.opendaylight.controller.md.sal.dom.spi.AbstractDOMDataTreeChangeListenerRegistration( - listener) { - @Override - protected void removeRegistration() { - registration.close(); - } - }; + if (!publisher.processCandidateTree(state)) { + listener.onInitialData(); + } } }