Do not use anonymous classes in PingPongTransactionChain 52/97952/4
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 17 Oct 2021 10:23:38 +0000 (12:23 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 17 Oct 2021 13:28:11 +0000 (15:28 +0200)
PingPongTransactionChain is quite complicated and it is not helpful
to have just anonymous subclasses, which may end up capturing more
than we want. Split them out to make Sonar happier.

Change-Id: I9995682091daf6b31c196fee5b89d8cfd19f016c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/PingPongTransactionChain.java

index ce1c090a53e0d97d50b797f943c5945e84ac6c5e..1cda6b08f57de65feb225dff19ed5b622963ab86 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) {
@@ -401,68 +401,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();
+        }
     }
 }