Merge "Fix modules Restconf call for mounted devices"
[controller.git] / opendaylight / md-sal / sal-inmemory-datastore / src / main / java / org / opendaylight / controller / md / sal / dom / store / impl / tree / ListenerTree.java
index dcff6439d6608b67aea81cab5882b1d72846d2c8..c0ad313291892b8873ee903b7de80def2f310bb5 100644 (file)
@@ -7,18 +7,13 @@
  */
 package org.opendaylight.controller.md.sal.dom.store.impl.tree;
 
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener;
+import org.opendaylight.controller.md.sal.dom.spi.AbstractRegistrationTree;
+import org.opendaylight.controller.md.sal.dom.spi.RegistrationTreeNode;
 import org.opendaylight.controller.md.sal.dom.store.impl.DataChangeListenerRegistration;
-import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * A set of listeners organized as a tree by node to which they listen. This class
@@ -26,11 +21,7 @@ import org.slf4j.LoggerFactory;
  *
  * @author Robert Varga
  */
-public final class ListenerTree  {
-    private static final Logger LOG = LoggerFactory.getLogger(ListenerTree.class);
-    private final ReadWriteLock rwLock = new ReentrantReadWriteLock(true);
-    private final ListenerNode rootNode = new ListenerNode(null, null);
-
+public final class ListenerTree extends AbstractRegistrationTree<DataChangeListenerRegistration<?>> {
     private ListenerTree() {
         // Private to disallow direct instantiation
     }
@@ -56,15 +47,9 @@ public final class ListenerTree  {
             final L listener, final DataChangeScope scope) {
 
         // Take the write lock
-        rwLock.writeLock().lock();
-
+        takeLock();
         try {
-            ListenerNode walkNode = rootNode;
-            for (final PathArgument arg : path.getPathArguments()) {
-                walkNode = walkNode.ensureChild(arg);
-            }
-
-            final ListenerNode node = walkNode;
+            final RegistrationTreeNode<DataChangeListenerRegistration<?>> node = findNodeFor(path.getPathArguments());
             DataChangeListenerRegistration<L> reg = new DataChangeListenerRegistrationImpl<L>(listener) {
                 @Override
                 public DataChangeScope getScope() {
@@ -88,23 +73,15 @@ public final class ListenerTree  {
                      *       While this does not directly violate the ListenerRegistration
                      *       contract, it is probably not going to be liked by the users.
                      */
-
-                    // Take the write lock
-                    ListenerTree.this.rwLock.writeLock().lock();
-                    try {
-                        node.removeListener(this);
-                    } finally {
-                        // Always release the lock
-                        ListenerTree.this.rwLock.writeLock().unlock();
-                    }
+                    ListenerTree.this.removeRegistration(node, this);
                 }
             };
 
-            node.addListener(reg);
+            addRegistration(node, reg);
             return reg;
         } finally {
             // Always release the lock
-            rwLock.writeLock().unlock();
+            releaseLock();
         }
     }
 
@@ -115,7 +92,10 @@ public final class ListenerTree  {
      * the listener tree.
      *
      * @return A walker instance.
+     *
+     * @deprecated Use {@link #takeSnapshot()} instead.
      */
+    @Deprecated
     public ListenerWalker getWalker() {
         /*
          * TODO: The only current user of this method is local to the datastore.
@@ -125,15 +105,6 @@ public final class ListenerTree  {
          *       external user exist, make the Walker a phantom reference, which
          *       will cleanup the lock if not told to do so.
          */
-        final ListenerWalker ret = new ListenerWalker(rwLock.readLock(), rootNode);
-        rwLock.readLock().lock();
-        return ret;
-    }
-
-    abstract static class DataChangeListenerRegistrationImpl<T extends AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>>> extends AbstractListenerRegistration<T> //
-    implements DataChangeListenerRegistration<T> {
-        public DataChangeListenerRegistrationImpl(final T listener) {
-            super(listener);
-        }
+        return new ListenerWalker(takeSnapshot());
     }
 }