Removed DataChangeListener in favour of DataTreeChangeListener
[mdsal.git] / dom / mdsal-dom-broker / src / main / java / org / opendaylight / mdsal / dom / broker / ShardedDOMDataTreeProducer.java
index 53a39774489dd84780e6f593f31977d62e2a9b1d..83a073d70149325a23bb4db67d300b55d4b5817e 100644 (file)
@@ -7,16 +7,6 @@
  */
 package org.opendaylight.mdsal.dom.broker;
 
-import org.opendaylight.mdsal.dom.spi.store.DOMStore;
-import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain;
-import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
-
-import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerBusyException;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerException;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeShard;
-import org.opendaylight.mdsal.dom.api.DOMDataWriteTransaction;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.BiMap;
 import com.google.common.collect.ImmutableBiMap;
@@ -32,6 +22,15 @@ import java.util.Map.Entry;
 import java.util.Queue;
 import java.util.Set;
 import javax.annotation.concurrent.GuardedBy;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerBusyException;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerException;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeShard;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
+import org.opendaylight.mdsal.dom.spi.store.DOMStore;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,10 +43,13 @@ final class ShardedDOMDataTreeProducer implements DOMDataTreeProducer {
     @GuardedBy("this")
     private Map<DOMDataTreeIdentifier, DOMDataTreeProducer> children = Collections.emptyMap();
     @GuardedBy("this")
-    private DOMDataWriteTransaction openTx;
+    private DOMDataTreeWriteTransaction openTx;
     @GuardedBy("this")
     private boolean closed;
 
+    @GuardedBy("this")
+    private ShardedDOMDataTreeListenerContext<?> attachedListener;
+
     ShardedDOMDataTreeProducer(final ShardedDOMDataTree dataTree, final Map<DOMDataTreeIdentifier, DOMDataTreeShard> shardMap, final Set<DOMDataTreeShard> shards) {
         this.dataTree = Preconditions.checkNotNull(dataTree);
 
@@ -93,7 +95,7 @@ final class ShardedDOMDataTreeProducer implements DOMDataTreeProducer {
     }
 
     @Override
-    public synchronized DOMDataWriteTransaction createTransaction(final boolean isolated) {
+    public synchronized DOMDataTreeWriteTransaction createTransaction(final boolean isolated) {
         Preconditions.checkState(!closed, "Producer is already closed");
         Preconditions.checkState(openTx == null, "Transaction %s is still open", openTx);
 
@@ -143,10 +145,7 @@ final class ShardedDOMDataTreeProducer implements DOMDataTreeProducer {
 
         for (final DOMDataTreeIdentifier s : subtrees) {
             // Check if the subtree was visible at any time
-            if (!haveSubtree(s)) {
-                throw new IllegalArgumentException(String.format("Subtree %s was never available in producer %s", s, this));
-            }
-
+            Preconditions.checkArgument(haveSubtree(s), "Subtree %s was never available in producer %s", s, this);
             // Check if the subtree has not been delegated to a child
             final DOMDataTreeProducer child = lookupChild(s);
             Preconditions.checkArgument(child == null, "Subtree %s is delegated to child producer %s", s, child);
@@ -170,6 +169,16 @@ final class ShardedDOMDataTreeProducer implements DOMDataTreeProducer {
         return ret;
     }
 
+    boolean isDelegatedToChild(DOMDataTreeIdentifier path) {
+        for (final DOMDataTreeIdentifier c : children.keySet()) {
+            if (c.contains(path)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
     @Override
     public synchronized void close() throws DOMDataTreeProducerException {
         if (!closed) {
@@ -208,4 +217,17 @@ final class ShardedDOMDataTreeProducer implements DOMDataTreeProducer {
         LOG.debug("Transaction {} cancelled", transaction);
         openTx = null;
     }
+
+    synchronized void transactionSubmitted(ShardedDOMDataWriteTransaction transaction) {
+        Preconditions.checkState(openTx.equals(transaction));
+        openTx = null;
+    }
+
+    synchronized void boundToListener(ShardedDOMDataTreeListenerContext<?> listener) {
+        // FIXME: Add option to dettach
+        Preconditions.checkState(this.attachedListener == null,
+                "Producer %s is already attached to other listener.",
+                listener.getListener());
+        this.attachedListener = listener;
+    }
 }