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.store.AbstractDOMStoreTreeChangePublisher;
15 import org.opendaylight.yangtools.concepts.Registration;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
17 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
22 * Default implementation of ShardDataTreeChangeListenerPublisher that directly generates and publishes
23 * notifications for DataTreeChangeListeners. This class is NOT thread-safe.
25 * @author Thomas Pantelis
27 final class DefaultShardDataTreeChangeListenerPublisher extends AbstractDOMStoreTreeChangePublisher
28 implements ShardDataTreeChangeListenerPublisher {
29 private static final Logger LOG = LoggerFactory.getLogger(DefaultShardDataTreeChangeListenerPublisher.class);
30 private String logContext;
32 DefaultShardDataTreeChangeListenerPublisher(final String logContext) {
33 this.logContext = logContext;
37 public void publishChanges(final DataTreeCandidate candidate) {
38 if (LOG.isTraceEnabled()) {
39 LOG.trace("{}: publishChanges: {}", logContext, candidate);
41 LOG.debug("{}: publishChanges: rootPath: {}", logContext, candidate.getRootPath());
44 processCandidateTree(candidate);
48 protected void notifyListener(final Reg registration, final List<DataTreeCandidate> changes) {
49 final var listener = registration.listener();
50 LOG.debug("{}: notifyListener: listener: {}", logContext, listener);
51 listener.onDataTreeChanged(changes);
55 protected void registrationRemoved(final Reg registration) {
56 LOG.debug("Registration {} removed", registration);
60 public void registerTreeChangeListener(final YangInstanceIdentifier treeId,
61 final DOMDataTreeChangeListener listener, final Optional<DataTreeCandidate> initialState,
62 final Consumer<Registration> onRegistration) {
63 registerTreeChangeListener(treeId, listener, onRegistration);
65 if (initialState.isPresent()) {
66 notifySingleListener(treeId, listener, initialState.orElseThrow(), logContext);
68 listener.onInitialData();
72 void registerTreeChangeListener(final YangInstanceIdentifier treeId, final DOMDataTreeChangeListener listener,
73 final Consumer<Registration> onRegistration) {
74 LOG.debug("{}: registerTreeChangeListener: path: {}, listener: {}", logContext, treeId, listener);
75 onRegistration.accept(super.registerTreeChangeListener(treeId, listener));
78 static void notifySingleListener(final YangInstanceIdentifier treeId, final DOMDataTreeChangeListener listener,
79 final DataTreeCandidate state, final String logContext) {
80 LOG.debug("{}: notifySingleListener: path: {}, listener: {}", logContext, treeId, listener);
81 DefaultShardDataTreeChangeListenerPublisher publisher =
82 new DefaultShardDataTreeChangeListenerPublisher(logContext);
83 publisher.logContext = logContext;
84 publisher.registerTreeChangeListener(treeId, listener);
86 if (!publisher.processCandidateTree(state)) {
87 listener.onInitialData();