Simplify code using Java 8 features
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / AbstractShardDataTreeTransaction.java
index 377af4d5d70c6eae9314eaad135a84374aa8b519..cde7da28f156f4a4e89dc04e28557fa2bcd80db2 100644 (file)
@@ -11,6 +11,8 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import javax.annotation.concurrent.NotThreadSafe;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
+import org.opendaylight.controller.cluster.datastore.persisted.AbortTransactionPayload;
+import org.opendaylight.yangtools.concepts.Identifiable;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
 
 /**
@@ -19,20 +21,30 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
  * @param <T> Backing transaction type.
  */
 @NotThreadSafe
-abstract class AbstractShardDataTreeTransaction<T extends DataTreeSnapshot> {
-    private final T snapshot;
+abstract class AbstractShardDataTreeTransaction<T extends DataTreeSnapshot>
+        implements Identifiable<TransactionIdentifier> {
+    private final ShardDataTreeTransactionParent parent;
     private final TransactionIdentifier id;
+    private final T snapshot;
+
     private boolean closed;
 
-    protected AbstractShardDataTreeTransaction(final TransactionIdentifier id, final T snapshot) {
+    AbstractShardDataTreeTransaction(final ShardDataTreeTransactionParent parent, final TransactionIdentifier id,
+        final T snapshot) {
+        this.parent = Preconditions.checkNotNull(parent);
         this.snapshot = Preconditions.checkNotNull(snapshot);
         this.id = Preconditions.checkNotNull(id);
     }
 
-    final TransactionIdentifier getId() {
+    @Override
+    public final TransactionIdentifier getIdentifier() {
         return id;
     }
 
+    final ShardDataTreeTransactionParent getParent() {
+        return parent;
+    }
+
     final T getSnapshot() {
         return snapshot;
     }
@@ -55,10 +67,28 @@ abstract class AbstractShardDataTreeTransaction<T extends DataTreeSnapshot> {
         return true;
     }
 
+    final void abort(final Runnable callback) {
+        Preconditions.checkState(close(), "Transaction is already closed");
+        parent.abortTransaction(this, callback);
+    }
+
+    /**
+     * This method is exposed for sake of {@link ShardTransaction}, which is an actor. We need to ensure that
+     * the parent is updated to reflect the transaction has been closed, but no journal actions may be invoked.
+     *
+     * <p>
+     * ShardTransaction is responsible for additionally sending a request to persist an {@link AbortTransactionPayload}
+     * via a message to the Shard actor.
+     */
+    final void abortFromTransactionActor() {
+        if (close()) {
+            parent.abortFromTransactionActor(this);
+        }
+    }
+
     @Override
     public final String toString() {
-        return MoreObjects.toStringHelper(this).add("id", id).add("closed", closed).add("snapshot", snapshot).toString();
+        return MoreObjects.toStringHelper(this).add("id", id).add("closed", closed).add("snapshot", snapshot)
+                .toString();
     }
-
-    abstract void abort();
 }