2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.datastore;
10 import java.util.List;
11 import java.util.Optional;
12 import java.util.function.Consumer;
13 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
14 import org.opendaylight.mdsal.dom.spi.AbstractDOMDataTreeChangeListenerRegistration;
15 import org.opendaylight.mdsal.dom.spi.store.AbstractDOMStoreTreeChangePublisher;
16 import org.opendaylight.yangtools.concepts.ListenerRegistration;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
18 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
23 * Default implementation of ShardDataTreeChangeListenerPublisher that directly generates and publishes
24 * notifications for DataTreeChangeListeners. This class is NOT thread-safe.
26 * @author Thomas Pantelis
28 final class DefaultShardDataTreeChangeListenerPublisher extends AbstractDOMStoreTreeChangePublisher
29 implements ShardDataTreeChangeListenerPublisher {
30 private static final Logger LOG = LoggerFactory.getLogger(DefaultShardDataTreeChangeListenerPublisher.class);
31 private String logContext;
33 DefaultShardDataTreeChangeListenerPublisher(final String logContext) {
34 this.logContext = logContext;
38 public void publishChanges(final DataTreeCandidate candidate) {
39 if (LOG.isTraceEnabled()) {
40 LOG.trace("{}: publishChanges: {}", logContext, candidate);
42 LOG.debug("{}: publishChanges: rootPath: {}", logContext, candidate.getRootPath());
45 processCandidateTree(candidate);
49 protected void notifyListener(final AbstractDOMDataTreeChangeListenerRegistration<?> registration,
50 final List<DataTreeCandidate> changes) {
51 LOG.debug("{}: notifyListener: listener: {}", logContext, registration.getInstance());
52 registration.getInstance().onDataTreeChanged(changes);
56 protected void registrationRemoved(final AbstractDOMDataTreeChangeListenerRegistration<?> registration) {
57 LOG.debug("Registration {} removed", registration);
61 public void registerTreeChangeListener(final YangInstanceIdentifier treeId,
62 final DOMDataTreeChangeListener listener, final Optional<DataTreeCandidate> initialState,
63 final Consumer<ListenerRegistration<DOMDataTreeChangeListener>> onRegistration) {
64 registerTreeChangeListener(treeId, listener, onRegistration);
66 if (initialState.isPresent()) {
67 notifySingleListener(treeId, listener, initialState.get(), logContext);
69 listener.onInitialData();
73 void registerTreeChangeListener(final YangInstanceIdentifier treeId, final DOMDataTreeChangeListener listener,
74 final Consumer<ListenerRegistration<DOMDataTreeChangeListener>> onRegistration) {
75 LOG.debug("{}: registerTreeChangeListener: path: {}, listener: {}", logContext, treeId, listener);
77 AbstractDOMDataTreeChangeListenerRegistration<DOMDataTreeChangeListener> registration =
78 super.registerTreeChangeListener(treeId, listener);
80 onRegistration.accept(registration);
83 static void notifySingleListener(final YangInstanceIdentifier treeId, final DOMDataTreeChangeListener listener,
84 final DataTreeCandidate state, final String logContext) {
85 LOG.debug("{}: notifySingleListener: path: {}, listener: {}", logContext, treeId, listener);
86 DefaultShardDataTreeChangeListenerPublisher publisher =
87 new DefaultShardDataTreeChangeListenerPublisher(logContext);
88 publisher.logContext = logContext;
89 publisher.registerTreeChangeListener(treeId, listener);
91 if (!publisher.processCandidateTree(state)) {
92 listener.onInitialData();