Bug 9060: TracingBroker printOpenTransactions
[controller.git] / opendaylight / md-sal / mdsal-trace / dom-impl / src / main / java / org / opendaylight / controller / md / sal / trace / dom / impl / TracingTransactionChain.java
index 13312ea46992f5aba32363a78ecd8387971bf36c..ac6aaa8bdb3c94587413bf43931c05c4ab969a83 100644 (file)
@@ -12,35 +12,64 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.controller.md.sal.trace.closetracker.impl.AbstractCloseTracked;
+import org.opendaylight.controller.md.sal.trace.closetracker.impl.CloseTrackedRegistry;
 
-class TracingTransactionChain implements DOMTransactionChain {
+class TracingTransactionChain extends AbstractCloseTracked<TracingTransactionChain> implements DOMTransactionChain {
 
     private final DOMTransactionChain delegate;
     private final TracingBroker tracingBroker;
+    private final CloseTrackedRegistry<TracingReadOnlyTransaction> readOnlyTransactionsRegistry;
+    private final CloseTrackedRegistry<TracingWriteTransaction> writeTransactionsRegistry;
+    private final CloseTrackedRegistry<TracingReadWriteTransaction> readWriteTransactionsRegistry;
 
-    TracingTransactionChain(DOMTransactionChain delegate, TracingBroker tracingBroker) {
+    TracingTransactionChain(DOMTransactionChain delegate, TracingBroker tracingBroker,
+            CloseTrackedRegistry<TracingTransactionChain> transactionChainsRegistry) {
+        super(transactionChainsRegistry);
         this.delegate = Objects.requireNonNull(delegate);
         this.tracingBroker = Objects.requireNonNull(tracingBroker);
+
+        final boolean isDebug = transactionChainsRegistry.isDebugContextEnabled();
+        String pf = "TransactionChain_" + toString();
+        this.readOnlyTransactionsRegistry  = new CloseTrackedRegistry<>(this, pf + "newReadOnlyTransaction", isDebug);
+        this.writeTransactionsRegistry     = new CloseTrackedRegistry<>(this, pf + "newWriteOnlyTransaction", isDebug);
+        this.readWriteTransactionsRegistry = new CloseTrackedRegistry<>(this, pf + "newReadWriteTransaction", isDebug);
     }
 
     @Override
+    @SuppressWarnings("resource")
     public DOMDataReadOnlyTransaction newReadOnlyTransaction() {
-        return delegate.newReadOnlyTransaction();
+        final DOMDataReadOnlyTransaction tx = delegate.newReadOnlyTransaction();
+        return new TracingReadOnlyTransaction(tx, tracingBroker, readOnlyTransactionsRegistry);
     }
 
     @Override
     public DOMDataReadWriteTransaction newReadWriteTransaction() {
-        return new TracingReadWriteTransaction(delegate.newReadWriteTransaction(), tracingBroker);
+        return new TracingReadWriteTransaction(delegate.newReadWriteTransaction(), tracingBroker,
+                readWriteTransactionsRegistry);
     }
 
     @Override
     public DOMDataWriteTransaction newWriteOnlyTransaction() {
-        return new TracingWriteTransaction(delegate.newWriteOnlyTransaction(), tracingBroker);
+        final DOMDataWriteTransaction tx = delegate.newWriteOnlyTransaction();
+        return new TracingWriteTransaction(tx, tracingBroker, writeTransactionsRegistry);
     }
 
     @Override
     public void close() {
         delegate.close();
+        super.removeFromTrackedRegistry();
+    }
+
+    public CloseTrackedRegistry<TracingReadOnlyTransaction> getReadOnlyTransactionsRegistry() {
+        return readOnlyTransactionsRegistry;
     }
 
+    public CloseTrackedRegistry<TracingReadWriteTransaction> getReadWriteTransactionsRegistry() {
+        return readWriteTransactionsRegistry;
+    }
+
+    public CloseTrackedRegistry<TracingWriteTransaction> getWriteTransactionsRegistry() {
+        return writeTransactionsRegistry;
+    }
 }