Add OnDemandShardState to report additional Shard state
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / DataTreeChangeListenerSupport.java
index f039ab707ba76fa4749c7895469d2c5af40b12ba..5b8e5f8abfb871f4bd2c503ce7de1853b4c5aac5 100644 (file)
@@ -10,7 +10,11 @@ package org.opendaylight.controller.cluster.datastore;
 import akka.actor.ActorRef;
 import akka.actor.ActorSelection;
 import com.google.common.base.Optional;
+import com.google.common.collect.Sets;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Map.Entry;
+import java.util.Set;
 import org.opendaylight.controller.cluster.datastore.messages.EnableNotification;
 import org.opendaylight.controller.cluster.datastore.messages.RegisterDataTreeChangeListener;
 import org.opendaylight.controller.cluster.datastore.messages.RegisterDataTreeChangeListenerReply;
@@ -21,14 +25,21 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
 final class DataTreeChangeListenerSupport extends AbstractDataListenerSupport<DOMDataTreeChangeListener,
         RegisterDataTreeChangeListener, DelayedDataTreeListenerRegistration,
         ListenerRegistration<DOMDataTreeChangeListener>> {
+
+    private final Set<ActorSelection> listenerActors = Sets.newConcurrentHashSet();
+
     DataTreeChangeListenerSupport(final Shard shard) {
         super(shard);
     }
 
+    Collection<ActorSelection> getListenerActors() {
+        return Collections.unmodifiableCollection(listenerActors);
+    }
+
     @Override
-    Entry<ListenerRegistration<DOMDataTreeChangeListener>, Optional<DataTreeCandidate>> createDelegate(
+    ListenerRegistration<DOMDataTreeChangeListener> createDelegate(
             final RegisterDataTreeChangeListener message) {
-        ActorSelection dataChangeListenerPath = selectActor(message.getDataTreeChangeListenerPath());
+        final ActorSelection dataChangeListenerPath = selectActor(message.getDataTreeChangeListenerPath());
 
         // Notify the listener if notifications should be enabled or not
         // If this shard is the leader then it will enable notifications else
@@ -51,7 +62,20 @@ final class DataTreeChangeListenerSupport extends AbstractDataListenerSupport<DO
         getShard().getDataStore().notifyOfInitialData(message.getPath(),
                 regEntry.getKey().getInstance(), regEntry.getValue());
 
-        return regEntry;
+        listenerActors.add(dataChangeListenerPath);
+        final ListenerRegistration<DOMDataTreeChangeListener> delegate = regEntry.getKey();
+        return new ListenerRegistration<DOMDataTreeChangeListener>() {
+            @Override
+            public DOMDataTreeChangeListener getInstance() {
+                return delegate.getInstance();
+            }
+
+            @Override
+            public void close() {
+                listenerActors.remove(dataChangeListenerPath);
+                delegate.close();
+            }
+        };
     }
 
     @Override