Add SnapshotBackedTransaction 18/71418/2
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 26 Apr 2018 10:20:10 +0000 (12:20 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 26 Apr 2018 12:28:18 +0000 (14:28 +0200)
DOMStore implementations working on SnapshotBacked transactions can
provide additional functionality if they have access to the underlying
snapshot.

Expose a method which allows the snapshot to be acquired as long as
the transaction is open.

Change-Id: I408e31be0285fb41732f29206bccd71ce794215e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadTransaction.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadWriteTransaction.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedTransaction.java [new file with mode: 0644]
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedWriteTransaction.java

index 7fe884194f45c8645a8a2fcd64ab8923d7515663..dc1053dc6a83d97b24a60043365d44298c148081 100644 (file)
@@ -7,11 +7,10 @@
  */
 package org.opendaylight.mdsal.dom.spi.store;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.Futures;
 import org.opendaylight.mdsal.common.api.ReadFailedException;
@@ -29,7 +28,7 @@ import org.slf4j.LoggerFactory;
  */
 @Beta
 public final class SnapshotBackedReadTransaction<T> extends
-        AbstractDOMStoreTransaction<T> implements DOMStoreReadTransaction {
+        AbstractDOMStoreTransaction<T> implements DOMStoreReadTransaction, SnapshotBackedTransaction {
 
     private static final Logger LOG = LoggerFactory.getLogger(SnapshotBackedReadTransaction.class);
     private volatile DataTreeSnapshot stableSnapshot;
@@ -43,7 +42,7 @@ public final class SnapshotBackedReadTransaction<T> extends
      */
     SnapshotBackedReadTransaction(final T identifier, final boolean debug, final DataTreeSnapshot snapshot) {
         super(identifier, debug);
-        this.stableSnapshot = Preconditions.checkNotNull(snapshot);
+        this.stableSnapshot = requireNonNull(snapshot);
         LOG.debug("ReadOnly Tx: {} allocated with snapshot {}", identifier, snapshot);
     }
 
@@ -57,7 +56,7 @@ public final class SnapshotBackedReadTransaction<T> extends
     @Override
     public CheckedFuture<Optional<NormalizedNode<?,?>>, ReadFailedException> read(final YangInstanceIdentifier path) {
         LOG.debug("Tx: {} Read: {}", getIdentifier(), path);
-        checkNotNull(path, "Path must not be null.");
+        requireNonNull(path, "Path must not be null.");
 
         final DataTreeSnapshot snapshot = stableSnapshot;
         if (snapshot == null) {
@@ -75,7 +74,7 @@ public final class SnapshotBackedReadTransaction<T> extends
     @Override
     public CheckedFuture<Boolean, ReadFailedException> exists(final YangInstanceIdentifier path) {
         LOG.debug("Tx: {} Exists: {}", getIdentifier(), path);
-        checkNotNull(path, "Path must not be null.");
+        requireNonNull(path, "Path must not be null.");
 
         try {
             return Futures.immediateCheckedFuture(read(path).checkedGet().isPresent());
@@ -83,4 +82,9 @@ public final class SnapshotBackedReadTransaction<T> extends
             return Futures.immediateFailedCheckedFuture(e);
         }
     }
+
+    @Override
+    public java.util.Optional<DataTreeSnapshot> getSnapshot() {
+        return java.util.Optional.ofNullable(stableSnapshot);
+    }
 }
index 219d65abd3490e87d4c1653276b93437651560ae..7404324b31ad6523edc92b482144b5bf0870830f 100644 (file)
@@ -21,8 +21,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Implementation of Read-Write transaction which is backed by {@link DataTreeSnapshot}
- * and executed according to {@link TransactionReadyPrototype}.
+ * Implementation of Read-Write transaction which is backed by {@link DataTreeSnapshot} and executed according
+ * to {@link SnapshotBackedWriteTransaction.TransactionReadyPrototype}.
  *
  * @param <T> identifier type
  */
diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedTransaction.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedTransaction.java
new file mode 100644 (file)
index 0000000..d982343
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2018 Pantheon Technologies, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.dom.spi.store;
+
+import com.google.common.annotations.Beta;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
+
+/**
+ * Interface implemented by {@link DOMStoreTransaction}s which are backed by a {@link DataTreeSnapshot}.
+ *
+ * @author Robert Varga
+ */
+@Beta
+@NonNullByDefault
+public interface SnapshotBackedTransaction extends DOMStoreTransaction {
+    /**
+     * Returns the {@link DataTreeSnapshot} underlying this transaction. If this transaction is no longer open,
+     * {@link Optional#empty()} is returned.
+     *
+     * @return DataTreeSnapshot attached to this transaction if this transaction is still open.
+     */
+    Optional<DataTreeSnapshot> getSnapshot();
+}
index 3ac0ae78c9b323829a98c11624644e2a60e99e14..a6716fcac327e5e5017f01b48744093b8d389537 100644 (file)
@@ -24,15 +24,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Implementation of Write transaction which is backed by
- * {@link DataTreeSnapshot} and executed according to
- * {@link org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction.TransactionReadyPrototype}.
+ * Implementation of Write transaction which is backed by {@link DataTreeSnapshot} and executed according to
+ * {@link TransactionReadyPrototype}.
  *
  * @param <T> Identifier type
  */
 @Beta
 public class SnapshotBackedWriteTransaction<T> extends AbstractDOMStoreTransaction<T>
-        implements DOMStoreWriteTransaction {
+        implements DOMStoreWriteTransaction, SnapshotBackedTransaction {
 
     private static final Logger LOG = LoggerFactory.getLogger(SnapshotBackedWriteTransaction.class);
 
@@ -170,6 +169,11 @@ public class SnapshotBackedWriteTransaction<T> extends AbstractDOMStoreTransacti
         }
     }
 
+    @Override
+    public Optional<DataTreeSnapshot> getSnapshot() {
+        return readyImpl == null ? Optional.empty() : Optional.ofNullable(mutableTree);
+    }
+
     @Override
     protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
         return toStringHelper.add("ready", readyImpl == null);