Cache MapJoiner
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / DataTreeChangeListenerSupport.java
index fa55523db0087467d4919075cbc39abc2a46621b..9a44b47e7e9257222804ed46c1e08ccaabdbf322 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.ArrayList;
+import java.util.Collection;
 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;
@@ -19,15 +23,23 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
 
 final class DataTreeChangeListenerSupport extends AbstractDataListenerSupport<DOMDataTreeChangeListener,
-        RegisterDataTreeChangeListener, DelayedDataTreeListenerRegistration, ListenerRegistration<DOMDataTreeChangeListener>> {
+        RegisterDataTreeChangeListener, DelayedDataTreeListenerRegistration,
+        ListenerRegistration<DOMDataTreeChangeListener>> {
+
+    private final Set<ActorSelection> listenerActors = Sets.newConcurrentHashSet();
+
     DataTreeChangeListenerSupport(final Shard shard) {
         super(shard);
     }
 
+    Collection<ActorSelection> getListenerActors() {
+        return new ArrayList<>(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
@@ -36,7 +48,7 @@ final class DataTreeChangeListenerSupport extends AbstractDataListenerSupport<DO
 
         // Now store a reference to the data change listener so it can be notified
         // at a later point if notifications should be enabled or disabled
-        if(!message.isRegisterOnAllInstances()) {
+        if (!message.isRegisterOnAllInstances()) {
             addListenerActor(dataChangeListenerPath);
         }
 
@@ -50,11 +62,25 @@ 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
-    protected DelayedDataTreeListenerRegistration newDelayedListenerRegistration(RegisterDataTreeChangeListener message) {
+    protected DelayedDataTreeListenerRegistration newDelayedListenerRegistration(
+            RegisterDataTreeChangeListener message) {
         return new DelayedDataTreeListenerRegistration(message);
     }