Fix a nullability warning in PingPongTransactionChain
[mdsal.git] / dom / mdsal-dom-spi / src / main / java / org / opendaylight / mdsal / dom / spi / PingPongTransactionChain.java
index b9fd8ec266c2f159be89905de1b9b64ce24679aa..ec2b5a2d5eacc3d4b7f70dc93061992217ca16df 100644 (file)
@@ -92,7 +92,7 @@ public final class PingPongTransactionChain implements DOMTransactionChain {
     public PingPongTransactionChain(final Function<DOMTransactionChainListener, DOMTransactionChain> delegateFactory,
             final DOMTransactionChainListener listener) {
         this.listener = requireNonNull(listener);
-        this.delegate = delegateFactory.apply(new DOMTransactionChainListener() {
+        delegate = delegateFactory.apply(new DOMTransactionChainListener() {
             @Override
             public void onTransactionChainFailed(final DOMTransactionChain chain,
                     final DOMDataTreeTransaction transaction, final Throwable cause) {
@@ -267,12 +267,15 @@ public final class PingPongTransactionChain implements DOMTransactionChain {
         checkState(success, "Completed transaction %s while %s was submitted", tx, inflightTx);
 
         final PingPongTransaction nextTx = READY_UPDATER.getAndSet(this, null);
-        if (nextTx != null) {
+        if (nextTx == null) {
+            final PingPongTransaction local = shutdownTx;
+            if (local != null) {
+                processTransaction(local);
+                delegate.close();
+                shutdownTx = null;
+            }
+        } else {
             processTransaction(nextTx);
-        } else if (shutdownTx != null) {
-            processTransaction(shutdownTx);
-            delegate.close();
-            shutdownTx = null;
         }
     }
 
@@ -401,68 +404,81 @@ public final class PingPongTransactionChain implements DOMTransactionChain {
 
     @Override
     public DOMDataTreeReadTransaction newReadOnlyTransaction() {
+        return new PingPongReadTransaction(allocateTransaction());
+    }
+
+    @Override
+    public DOMDataTreeReadWriteTransaction newReadWriteTransaction() {
         final PingPongTransaction tx = allocateTransaction();
+        final DOMDataTreeReadWriteTransaction ret = new PingPongReadWriteTransaction(tx);
+        tx.recordFrontendTransaction(ret);
+        return ret;
+    }
 
-        return new DOMDataTreeReadTransaction() {
-            @Override
-            public FluentFuture<Optional<NormalizedNode<?, ?>>> read(
-                    final LogicalDatastoreType store, final YangInstanceIdentifier path) {
-                return tx.getTransaction().read(store, path);
-            }
+    @Override
+    public DOMDataTreeWriteTransaction newWriteOnlyTransaction() {
+        return newReadWriteTransaction();
+    }
 
-            @Override
-            public FluentFuture<Boolean> exists(final LogicalDatastoreType store, final YangInstanceIdentifier path) {
-                return tx.getTransaction().exists(store, path);
-            }
+    private final class PingPongReadTransaction implements DOMDataTreeReadTransaction {
+        private final @NonNull PingPongTransaction tx;
 
-            @Override
-            public Object getIdentifier() {
-                return tx.getTransaction().getIdentifier();
-            }
+        PingPongReadTransaction(final PingPongTransaction tx) {
+            this.tx = requireNonNull(tx);
+        }
 
-            @Override
-            public void close() {
-                readyTransaction(tx);
-            }
-        };
+        @Override
+        public FluentFuture<Optional<NormalizedNode>> read(final LogicalDatastoreType store,
+                final YangInstanceIdentifier path) {
+            return tx.getTransaction().read(store, path);
+        }
+
+        @Override
+        public FluentFuture<Boolean> exists(final LogicalDatastoreType store, final YangInstanceIdentifier path) {
+            return tx.getTransaction().exists(store, path);
+        }
+
+        @Override
+        public Object getIdentifier() {
+            return tx.getTransaction().getIdentifier();
+        }
+
+        @Override
+        public void close() {
+            readyTransaction(tx);
+        }
     }
 
-    @Override
-    public DOMDataTreeReadWriteTransaction newReadWriteTransaction() {
-        final PingPongTransaction tx = allocateTransaction();
-        final DOMDataTreeReadWriteTransaction ret = new ForwardingDOMDataReadWriteTransaction() {
-            private boolean isOpen = true;
+    private final class PingPongReadWriteTransaction extends ForwardingDOMDataReadWriteTransaction {
+        private final @NonNull PingPongTransaction tx;
 
-            @Override
-            protected DOMDataTreeReadWriteTransaction delegate() {
-                return tx.getTransaction();
-            }
+        private boolean isOpen = true;
 
-            @Override
-            public FluentFuture<? extends CommitInfo> commit() {
-                readyTransaction(tx);
-                isOpen = false;
-                return tx.getCommitFuture().transform(ignored -> CommitInfo.empty(), MoreExecutors.directExecutor());
-            }
+        PingPongReadWriteTransaction(final PingPongTransaction tx) {
+            this.tx = requireNonNull(tx);
+        }
 
-            @Override
-            public boolean cancel() {
-                if (isOpen) {
-                    cancelTransaction(tx, this);
-                    isOpen = false;
-                    return true;
-                }
-
-                return false;
+        @Override
+        public FluentFuture<? extends CommitInfo> commit() {
+            readyTransaction(tx);
+            isOpen = false;
+            return tx.getCommitFuture().transform(ignored -> CommitInfo.empty(), MoreExecutors.directExecutor());
+        }
+
+        @Override
+        public boolean cancel() {
+            if (isOpen) {
+                cancelTransaction(tx, this);
+                isOpen = false;
+                return true;
             }
-        };
 
-        tx.recordFrontendTransaction(ret);
-        return ret;
-    }
+            return false;
+        }
 
-    @Override
-    public DOMDataTreeWriteTransaction newWriteOnlyTransaction() {
-        return newReadWriteTransaction();
+        @Override
+        protected DOMDataTreeReadWriteTransaction delegate() {
+            return tx.getTransaction();
+        }
     }
 }