2 * Copyright (c) 2017 Inocybe Technologies 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 static java.util.Objects.requireNonNull;
12 import akka.actor.Props;
13 import java.util.Optional;
14 import java.util.function.Consumer;
15 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
16 import org.opendaylight.yangtools.concepts.ListenerRegistration;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
18 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
21 * Actor used to generate and publish DataTreeChange notifications.
23 * @author Thomas Pantelis
25 public final class ShardDataTreeChangePublisherActor
26 extends ShardDataTreeNotificationPublisherActor<DefaultShardDataTreeChangeListenerPublisher> {
28 private ShardDataTreeChangePublisherActor(final String name, final String logContext) {
29 super(new DefaultShardDataTreeChangeListenerPublisher(logContext), name, logContext);
33 protected void handleReceive(final Object message) {
34 if (message instanceof RegisterListener) {
35 RegisterListener reg = (RegisterListener)message;
36 LOG.debug("{}: Received {}", logContext(), reg);
37 if (reg.initialState.isPresent()) {
38 DefaultShardDataTreeChangeListenerPublisher.notifySingleListener(reg.path, reg.listener,
39 reg.initialState.get(), logContext());
41 reg.listener.onInitialData();
44 publisher().registerTreeChangeListener(reg.path, reg.listener, reg.onRegistration);
46 super.handleReceive(message);
50 static Props props(final String name, final String logContext) {
51 return Props.create(ShardDataTreeChangePublisherActor.class, name, logContext);
54 static class RegisterListener {
55 private final YangInstanceIdentifier path;
56 private final DOMDataTreeChangeListener listener;
57 private final Optional<DataTreeCandidate> initialState;
58 private final Consumer<ListenerRegistration<DOMDataTreeChangeListener>> onRegistration;
60 RegisterListener(final YangInstanceIdentifier path, final DOMDataTreeChangeListener listener,
61 final Optional<DataTreeCandidate> initialState,
62 final Consumer<ListenerRegistration<DOMDataTreeChangeListener>> onRegistration) {
63 this.path = requireNonNull(path);
64 this.listener = requireNonNull(listener);
65 this.initialState = requireNonNull(initialState);
66 this.onRegistration = requireNonNull(onRegistration);
70 public String toString() {
71 return "RegisterListener [path=" + path + ", listener=" + listener + ", initialState present="
72 + initialState.isPresent() + "]";