Teach AbstractDOMDataBroker about commit cohorts 87/109787/4
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 15 Jan 2024 19:35:30 +0000 (20:35 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 15 Jan 2024 20:36:14 +0000 (21:36 +0100)
This is something the Controller version of this class recognizes, but
we do not. Close the gap.

JIRA: MDSAL-851
Change-Id: I248d471813054ae2b82cdeef8ea1ff58750d4baf
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMBrokerTest.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/AbstractDOMDataBroker.java

index 243b03d8c66561961e23146bc403daddd1e3ffb2..842b9bf81d9ffd67322468b67a57f6120df81b12 100644 (file)
@@ -228,22 +228,6 @@ public class DOMBrokerTest extends AbstractDatastoreTest {
         }
     }
 
-    @SuppressWarnings({"checkstyle:IllegalThrows", "checkstyle:IllegalCatch"})
-    @Test
-    public void closeTest() throws Exception {
-        final String testException = "TestException";
-
-        domBroker.setCloseable(() -> {
-            throw new Exception(testException);
-        });
-
-        try {
-            domBroker.close();
-        } catch (final Exception e) {
-            assertTrue(e.getMessage().contains(testException));
-        }
-    }
-
     static class CommitExecutorService extends ForwardingExecutorService {
 
         ExecutorService delegate;
index 00003aad6be0395a7301454ac26f2f0fa47f1c6f..a06d63febeddfe408c39892e7aec3cacbcb11c60 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.dom.spi;
 
+import com.google.common.collect.ImmutableList;
 import java.util.EnumMap;
 import java.util.List;
 import java.util.Map;
@@ -14,6 +15,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.dom.spi.store.DOMStore;
 import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain;
@@ -29,53 +31,30 @@ public abstract class AbstractDOMDataBroker extends AbstractDOMForwardedTransact
     private final AtomicLong chainNum = new AtomicLong();
     private final @NonNull List<Extension> supportedExtensions;
 
-    private volatile AutoCloseable closeable;
-
     protected AbstractDOMDataBroker(final Map<LogicalDatastoreType, DOMStore> datastores) {
         super(datastores);
 
-        boolean treeChange = true;
-        for (var ds : datastores.values()) {
-            if (!(ds instanceof DOMStoreTreeChangePublisher)) {
-                treeChange = false;
-                break;
-            }
-        }
-
-        if (treeChange) {
-            supportedExtensions = List.of((DOMDataTreeChangeService) (treeId, listener) -> {
+        final var builder = ImmutableList.<Extension>builder();
+        if (isSupported(datastores, DOMStoreTreeChangePublisher.class)) {
+            builder.add((DOMDataTreeChangeService) (treeId, listener) -> {
                 final var dsType = treeId.datastore();
                 if (getTxFactories().get(dsType) instanceof DOMStoreTreeChangePublisher publisher) {
                     return publisher.registerTreeChangeListener(treeId.path(), listener);
                 }
                 throw new IllegalStateException("Publisher for " + dsType + " data store is not available");
             });
-        } else {
-            supportedExtensions = List.of();
         }
-    }
-
-    public void setCloseable(final AutoCloseable closeable) {
-        this.closeable = closeable;
-    }
-
-    @SuppressWarnings("checkstyle:IllegalCatch")
-    @Override
-    public void close() {
-        super.close();
-
-        if (closeable != null) {
-            try {
-                closeable.close();
-            } catch (Exception e) {
-                LOG.debug("Error closing instance", e);
-            }
+        if (isSupported(datastores, DOMDataTreeCommitCohortRegistry.class)) {
+            builder.add((DOMDataTreeCommitCohortRegistry) (path, cohort) -> {
+                final var dsType = path.datastore();
+                if (getTxFactories().get(dsType) instanceof DOMDataTreeCommitCohortRegistry registry) {
+                    return registry.registerCommitCohort(path, cohort);
+                }
+                throw new IllegalStateException("Cohort registry for " + dsType + " data store is not available");
+            });
         }
-    }
 
-    @Override
-    protected Object newTransactionIdentifier() {
-        return "DOM-" + txNum.getAndIncrement();
+        supportedExtensions = builder.build();
     }
 
     @Override
@@ -83,7 +62,6 @@ public abstract class AbstractDOMDataBroker extends AbstractDOMForwardedTransact
         return supportedExtensions;
     }
 
-
     @Override
     public DOMTransactionChain createTransactionChain() {
         checkNotClosed();
@@ -97,4 +75,14 @@ public abstract class AbstractDOMDataBroker extends AbstractDOMForwardedTransact
         LOG.debug("Transactoin chain {} created, backing store chains {}", chainId, delegates);
         return new DOMDataBrokerTransactionChainImpl(chainId, delegates, this);
     }
+
+    @Override
+    protected final Object newTransactionIdentifier() {
+        return "DOM-" + txNum.getAndIncrement();
+    }
+
+    private static boolean isSupported(final Map<LogicalDatastoreType, DOMStore> datastores,
+            final Class<?> expDOMStoreInterface) {
+        return datastores.values().stream().allMatch(expDOMStoreInterface::isInstance);
+    }
 }