*/
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;
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;
@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);
}
@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);
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);
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) {
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;
+ }
}