Reduce use of TransactionChainHandler 45/96845/7
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 8 Jul 2021 19:55:01 +0000 (21:55 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 9 Jul 2021 12:24:38 +0000 (14:24 +0200)
SchemaContextHandler does not need transaction chains at this point.
When it will need them, it will manage their lifecycle on its own.

JIRA: NETCONF-773
Change-Id: I89587b9777cb1ae7aa0b0fe628e3fa4ef16e83a3
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/handlers/SchemaContextHandler.java
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/SubscribeToStreamUtil.java
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/listeners/AbstractCommonSubscriber.java
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/listeners/AbstractNotificationsData.java
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/listeners/ListenersBroker.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/TestUtils.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/handlers/SchemaContextHandlerTest.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImplTest.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfInvokeOperationsServiceImplTest.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImplTest.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/listeners/ListenerAdapterTest.java

index e4ebf373248ecca3095d87f6a3ca6c3569fda760..d4d26d86b2ba0e9b7efca1b93ba57f8145ec7b62 100644 (file)
@@ -19,9 +19,9 @@ import javax.inject.Singleton;
 import org.apache.aries.blueprint.annotation.service.Reference;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.nb.rfc8040.Rfc8040.IetfYangLibrary;
 import org.opendaylight.restconf.nb.rfc8040.utils.mapping.RestconfMappingNodeUtil;
@@ -49,22 +49,17 @@ public class SchemaContextHandler implements EffectiveModelContextListener, Auto
 
     private final AtomicInteger moduleSetId = new AtomicInteger(0);
 
-    private final TransactionChainHandler transactionChainHandler;
+    private final DOMDataBroker domDataBroker;
     private final DOMSchemaService domSchemaService;
     private ListenerRegistration<?> listenerRegistration;
 
     private volatile EffectiveModelContext schemaContext;
 
-    /**
-     * Constructor.
-     *
-     * @param transactionChainHandler Transaction chain handler
-     */
     @Inject
-    public SchemaContextHandler(final TransactionChainHandler transactionChainHandler,
-            final @Reference DOMSchemaService domSchemaService) {
-        this.transactionChainHandler = transactionChainHandler;
-        this.domSchemaService = domSchemaService;
+    public SchemaContextHandler(@Reference final DOMDataBroker domDataBroker,
+            @Reference final DOMSchemaService domSchemaService) {
+        this.domDataBroker = requireNonNull(domDataBroker);
+        this.domSchemaService = requireNonNull(domSchemaService);
     }
 
     @PostConstruct
@@ -100,8 +95,7 @@ public class SchemaContextHandler implements EffectiveModelContextListener, Auto
     }
 
     private void putData(final ContainerNode normNode) {
-        final DOMTransactionChain transactionChain = this.transactionChainHandler.get();
-        final DOMDataTreeWriteTransaction wTx = transactionChain.newWriteOnlyTransaction();
+        final DOMDataTreeWriteTransaction wTx = domDataBroker.newWriteOnlyTransaction();
         wTx.put(LogicalDatastoreType.OPERATIONAL,
                 YangInstanceIdentifier.create(NodeIdentifier.create(normNode.getIdentifier().getNodeType())), normNode);
         try {
@@ -123,8 +117,6 @@ public class SchemaContextHandler implements EffectiveModelContextListener, Auto
             } else {
                 throw new RestconfDocumentedException("Problem occurred while putting data to DS.", failure);
             }
-        } finally {
-            transactionChain.close();
         }
     }
 }
index a9b729f9db734a29039a8d88f9620e983623a425..02d7c44d64953b53f14a0a94da1e99c8c52f6c0a 100644 (file)
@@ -28,6 +28,7 @@ import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag;
 import org.opendaylight.restconf.common.errors.RestconfError.ErrorType;
 import org.opendaylight.restconf.nb.rfc8040.Rfc8040;
+import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
 import org.opendaylight.restconf.nb.rfc8040.rests.services.impl.RestconfStreamsSubscriptionServiceImpl.HandlersHolder;
 import org.opendaylight.restconf.nb.rfc8040.rests.services.impl.RestconfStreamsSubscriptionServiceImpl.NotificationQueryParams;
 import org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants;
@@ -141,14 +142,15 @@ abstract class SubscribeToStreamUtil {
                 notificationQueryParams.getStop().orElse(null),
                 notificationQueryParams.getFilter().orElse(null),
                 false, notificationQueryParams.isSkipNotificationData());
-        notificationListenerAdapter.setCloseVars(
-                handlersHolder.getTransactionChainHandler(), handlersHolder.getSchemaHandler());
+        final DOMDataBroker dataBroker = handlersHolder.getDataBroker();
+        notificationListenerAdapter.setCloseVars(dataBroker, handlersHolder.getSchemaHandler());
         final MapEntryNode mapToStreams = RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring(
                     notificationListenerAdapter.getSchemaPath().lastNodeIdentifier(),
                     schemaContext.getNotifications(), notificationQueryParams.getStart(),
                     notificationListenerAdapter.getOutputType(), uri);
 
-        final DOMDataTreeWriteTransaction writeTransaction = handlersHolder.getDataBroker().newWriteOnlyTransaction();
+        // FIXME: how does this correlate with the transaction notificationListenerAdapter.close() will do?
+        final DOMDataTreeWriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
         writeDataToDS(writeTransaction, mapToStreams);
         submitData(writeTransaction);
         return uri;
@@ -193,14 +195,16 @@ abstract class SubscribeToStreamUtil {
                 notificationQueryParams.getStop().orElse(null),
                 notificationQueryParams.getFilter().orElse(null),
                 false, notificationQueryParams.isSkipNotificationData());
-        listener.setCloseVars(handlersHolder.getTransactionChainHandler(), handlersHolder.getSchemaHandler());
 
-        final LogicalDatastoreType datastoreType = LogicalDatastoreType.valueOf(datastoreParam);
         final DOMDataBroker dataBroker = handlersHolder.getDataBroker();
+        final SchemaContextHandler schemaHandler = handlersHolder.getSchemaHandler();
+        listener.setCloseVars(dataBroker, schemaHandler);
+
+        final LogicalDatastoreType datastoreType = LogicalDatastoreType.valueOf(datastoreParam);
         registration(datastoreType, listener, dataBroker);
 
         final URI uri = prepareUriByStreamName(uriInfo, streamName);
-        final EffectiveModelContext schemaContext = handlersHolder.getSchemaHandler().get();
+        final EffectiveModelContext schemaContext = schemaHandler.get();
         final String serializedPath = IdentifierCodec.serialize(listener.getPath(), schemaContext);
 
         final MapEntryNode mapToStreams =
index 751ee83394e495879101c45743a90e17613a9787..d244c992bc8f131295da877e07376c0f08adff17 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.base.Preconditions;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import org.opendaylight.restconf.nb.rfc8040.streams.StreamSessionHandler;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.slf4j.Logger;
@@ -37,12 +38,12 @@ abstract class AbstractCommonSubscriber extends AbstractQueryParams implements B
     }
 
     @Override
-    public final synchronized void close() throws Exception {
+    public final synchronized void close() throws InterruptedException, ExecutionException {
         if (this.registration != null) {
             this.registration.close();
             this.registration = null;
         }
-        deleteDataInDS();
+        deleteDataInDS().get();
         this.subscribers.clear();
     }
 
index 332eec555f4e5f34e9454751e907959f2e78617c..e2a72eedd9dcb58836b61a9e60de8e3d6ea23987 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.restconf.nb.rfc8040.streams.listeners;
 
+import com.google.common.util.concurrent.ListenableFuture;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
@@ -25,11 +26,10 @@ import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.restconf.nb.rfc8040.Rfc8040;
 import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
-import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
@@ -51,32 +51,32 @@ abstract class AbstractNotificationsData {
     private static final TransformerFactory TF = TransformerFactory.newInstance();
     private static final XMLOutputFactory OF = XMLOutputFactory.newInstance();
 
-    private TransactionChainHandler transactionChainHandler;
+    private DOMDataBroker dataBroker;
     protected SchemaContextHandler schemaHandler;
     private String localName;
 
     /**
-     * Transaction chain for delete data in DS on close().
+     * Data broker for delete data in DS on close().
      *
-     * @param transactionChainHandler creating new write transaction for delete data on close
+     * @param dataBroker creating new write transaction for delete data on close
      * @param schemaHandler for formatting notifications
      */
     @SuppressWarnings("checkstyle:hiddenField")
-    public void setCloseVars(final TransactionChainHandler transactionChainHandler,
-            final SchemaContextHandler schemaHandler) {
-        this.transactionChainHandler = transactionChainHandler;
+    // FIXME: this is pure lifecycle nightmare just because ...
+    public void setCloseVars(final DOMDataBroker dataBroker, final SchemaContextHandler schemaHandler) {
+        this.dataBroker = dataBroker;
         this.schemaHandler = schemaHandler;
     }
 
     /**
      * Delete data in DS.
      */
-    protected void deleteDataInDS() throws Exception {
-        final DOMTransactionChain transactionChain = this.transactionChainHandler.get();
-        final DOMDataTreeWriteTransaction wTx = transactionChain.newWriteOnlyTransaction();
-        wTx.delete(LogicalDatastoreType.OPERATIONAL, Rfc8040.restconfStateStreamPath(this.localName));
-        wTx.commit().get();
-        transactionChain.close();
+    // FIXME: here we touch datastore, which probably should be done by whoever instantiated us or created the resource,
+    //        or they should be giving us the transaction
+    protected ListenableFuture<?> deleteDataInDS() {
+        final DOMDataTreeWriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
+        wTx.delete(LogicalDatastoreType.OPERATIONAL, Rfc8040.restconfStateStreamPath(localName));
+        return wTx.commit();
     }
 
     /**
index 878af66bdb371d34f070cf859a29ee220b97ec0a..ced7a1af512d5f268cf13a840c78f349dfcbfb3e 100644 (file)
@@ -16,6 +16,7 @@ import com.google.common.collect.ImmutableSet;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.StampedLock;
 import java.util.function.Function;
 import org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants;
@@ -270,14 +271,13 @@ public final class ListenersBroker {
      *
      * @param listener Listener to be closed and removed.
      */
-    @SuppressWarnings("checkstyle:IllegalCatch")
     private void removeAndCloseDataChangeListenerTemplate(final ListenerAdapter listener) {
         try {
             requireNonNull(listener).close();
             if (dataChangeListeners.inverse().remove(listener) == null) {
                 LOG.warn("There isn't any data-change event stream that would match listener adapter {}.", listener);
             }
-        } catch (final Exception exception) {
+        } catch (final InterruptedException | ExecutionException exception) {
             LOG.error("Data-change listener {} cannot be closed.", listener, exception);
             throw new IllegalStateException(String.format(
                     "Data-change listener %s cannot be closed.",
@@ -302,14 +302,13 @@ public final class ListenersBroker {
         }
     }
 
-    @SuppressWarnings({"checkstyle:IllegalCatch"})
     private void removeAndCloseNotificationListenerTemplate(final NotificationListenerAdapter listener) {
         try {
             requireNonNull(listener).close();
             if (notificationListeners.inverse().remove(listener) == null) {
                 LOG.warn("There isn't any notification stream that would match listener adapter {}.", listener);
             }
-        } catch (final Exception exception) {
+        } catch (final InterruptedException | ExecutionException exception) {
             LOG.error("Notification listener {} cannot be closed.", listener, exception);
             throw new IllegalStateException(String.format(
                     "Notification listener %s cannot be closed.", listener),
index 6b33acabc570c3bee76ed1a9623a593865e872a8..3829ad0ac1a3a6337dbf679340974c5dbc72d447 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.restconf.nb.rfc8040;
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 import static org.junit.Assert.assertNotNull;
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
@@ -41,9 +40,7 @@ import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
-import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Revision;
@@ -269,14 +266,12 @@ public final class TestUtils {
 
     public static SchemaContextHandler newSchemaContextHandler(final EffectiveModelContext schemaContext) {
         DOMDataBroker mockDataBroker = mock(DOMDataBroker.class);
-        DOMTransactionChain mockChain = mock(DOMTransactionChain.class);
         DOMDataTreeWriteTransaction mockTx = mock(DOMDataTreeWriteTransaction.class);
         doReturn(CommitInfo.emptyFluentFuture()).when(mockTx).commit();
-        doReturn(mockTx).when(mockChain).newWriteOnlyTransaction();
+        doReturn(mockTx).when(mockDataBroker).newWriteOnlyTransaction();
 
-        doReturn(mockChain).when(mockDataBroker).createTransactionChain(any());
-        SchemaContextHandler schemaContextHandler = new SchemaContextHandler(
-                new TransactionChainHandler(mockDataBroker), mock(DOMSchemaService.class));
+        SchemaContextHandler schemaContextHandler = new SchemaContextHandler(mockDataBroker,
+            mock(DOMSchemaService.class));
         schemaContextHandler.onModelContextUpdated(schemaContext);
         return schemaContextHandler;
     }
index db794e43f743576920ce571258bd6c54ce1b553f..dfa968029f1d9e5a0a3fbdbbcaf9b224b1698c43 100644 (file)
@@ -12,7 +12,6 @@ import static org.junit.Assert.assertNotEquals;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import java.io.FileNotFoundException;
 import org.junit.AfterClass;
@@ -23,9 +22,9 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.restconf.nb.rfc8040.TestRestconfUtils;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
@@ -61,14 +60,12 @@ public class SchemaContextHandlerTest {
 
     @Before
     public void setup() throws Exception {
-        final TransactionChainHandler txHandler = mock(TransactionChainHandler.class);
-        final DOMTransactionChain domTx = mock(DOMTransactionChain.class);
-        when(txHandler.get()).thenReturn(domTx);
+        final DOMDataBroker dataBroker = mock(DOMDataBroker.class);
         final DOMDataTreeWriteTransaction wTx = mock(DOMDataTreeWriteTransaction.class);
-        when(domTx.newWriteOnlyTransaction()).thenReturn(wTx);
+        doReturn(wTx).when(dataBroker).newWriteOnlyTransaction();
         doReturn(CommitInfo.emptyFluentFuture()).when(wTx).commit();
 
-        this.schemaContextHandler = new SchemaContextHandler(txHandler, mockDOMSchemaService);
+        this.schemaContextHandler = new SchemaContextHandler(dataBroker, mockDOMSchemaService);
 
         this.schemaContextHandler.onModelContextUpdated(SchemaContextHandlerTest.SCHEMA_CONTEXT);
     }
index 2aba00cdbf27521bc6eadfb30753019791c94aa1..74bb1b71d7e7688afee11147cce7eb959661150e 100644 (file)
@@ -60,7 +60,6 @@ import org.opendaylight.restconf.common.patch.PatchEntity;
 import org.opendaylight.restconf.common.patch.PatchStatusContext;
 import org.opendaylight.restconf.nb.rfc8040.TestRestconfUtils;
 import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
-import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler;
 import org.opendaylight.restconf.nb.rfc8040.rests.services.api.RestconfStreamsSubscriptionService;
 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.MdsalRestconfStrategy;
 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.NetconfRestconfStrategy;
@@ -192,15 +191,13 @@ public class RestconfDataServiceImplTest {
         doReturn(CommitInfo.emptyFluentFuture()).when(this.write).commit();
         doReturn(CommitInfo.emptyFluentFuture()).when(this.readWrite).commit();
 
-        doReturn(this.write).when(domTransactionChain).newWriteOnlyTransaction();
-
         DOMDataBroker mockDataBroker = mock(DOMDataBroker.class);
         doReturn(this.read).when(mockDataBroker).newReadOnlyTransaction();
         doReturn(this.readWrite).when(mockDataBroker).newReadWriteTransaction();
-        doReturn(domTransactionChain).when(mockDataBroker).createTransactionChain(any());
+        doReturn(this.write).when(mockDataBroker).newWriteOnlyTransaction();
 
         final SchemaContextHandler schemaContextHandler = new SchemaContextHandler(
-                new TransactionChainHandler(mockDataBroker), mock(DOMSchemaService.class));
+                mockDataBroker, mock(DOMSchemaService.class));
 
         schemaContextHandler.onModelContextUpdated(this.contextRef);
         this.dataService = new RestconfDataServiceImpl(schemaContextHandler, mockDataBroker, mountPointService,
index fe3bdafda3f8e8cff54f2b446332564c4a5a53c7..a891423394bed2b0e2d15a2a38637fbdc3dee427 100644 (file)
@@ -25,16 +25,15 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
 import org.opendaylight.restconf.common.context.NormalizedNodeContext;
 import org.opendaylight.restconf.nb.rfc8040.TestRestconfUtils;
 import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
-import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
@@ -57,13 +56,11 @@ public class RestconfInvokeOperationsServiceImplTest {
     public void setup() throws Exception {
         final EffectiveModelContext contextRef =
                 YangParserTestUtils.parseYangFiles(TestRestconfUtils.loadFiles(PATH_FOR_NEW_SCHEMA_CONTEXT));
-        final TransactionChainHandler txHandler = mock(TransactionChainHandler.class);
-        final DOMTransactionChain domTx = mock(DOMTransactionChain.class);
-        when(txHandler.get()).thenReturn(domTx);
+        final DOMDataBroker dataBroker = mock(DOMDataBroker.class);
         final DOMDataTreeWriteTransaction wTx = mock(DOMDataTreeWriteTransaction.class);
-        when(domTx.newWriteOnlyTransaction()).thenReturn(wTx);
+        when(dataBroker.newWriteOnlyTransaction()).thenReturn(wTx);
         doReturn(CommitInfo.emptyFluentFuture()).when(wTx).commit();
-        final SchemaContextHandler schemaContextHandler = new SchemaContextHandler(txHandler,
+        final SchemaContextHandler schemaContextHandler = new SchemaContextHandler(dataBroker,
             mock(DOMSchemaService.class));
         schemaContextHandler.onModelContextUpdated(contextRef);
         this.invokeOperationsService =
index 7a3e4f0853ad4a85ef6e2cb170180b55e602d937..561900b741ddb5bf2e771bdabf31f31fa4649d36 100644 (file)
@@ -35,7 +35,6 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.restconf.common.context.NormalizedNodeContext;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.common.util.SimpleUriInfo;
@@ -73,16 +72,11 @@ public class RestconfStreamsSubscriptionServiceImplTest {
 
     @Before
     public void setUp() throws FileNotFoundException, URISyntaxException {
-        final DOMTransactionChain domTx = mock(DOMTransactionChain.class);
         final DOMDataTreeWriteTransaction wTx = mock(DOMDataTreeWriteTransaction.class);
-        doReturn(wTx).when(domTx).newWriteOnlyTransaction();
         doReturn(wTx).when(dataBroker).newWriteOnlyTransaction();
         doReturn(CommitInfo.emptyFluentFuture()).when(wTx).commit();
 
-        doReturn(domTx).when(dataBroker).createTransactionChain(any());
-
-        transactionHandler = new TransactionChainHandler(dataBroker);
-        schemaHandler = new SchemaContextHandler(transactionHandler, mock(DOMSchemaService.class));
+        schemaHandler = new SchemaContextHandler(dataBroker, mock(DOMSchemaService.class));
 
         DOMDataTreeChangeService dataTreeChangeService = mock(DOMDataTreeChangeService.class);
         doReturn(mock(ListenerRegistration.class)).when(dataTreeChangeService)
index 7381680d4cb1cb6bf81416b56a9032b9c043b9d5..6d8999c3eaf6d3211fd2f66c8a5f6120eb99f3eb 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.restconf.nb.rfc8040.streams.listeners;
 import static java.time.Instant.EPOCH;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
 
 import com.google.common.util.concurrent.Uninterruptibles;
 import java.io.IOException;
@@ -26,7 +27,6 @@ import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.mockito.Mockito;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
@@ -36,7 +36,6 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
-import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler;
 import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.PatchCont;
 import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.patch.cont.MyList1;
 import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.patch.cont.MyList1Builder;
@@ -44,6 +43,7 @@ import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.p
 import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 import org.skyscreamer.jsonassert.JSONAssert;
@@ -83,13 +83,12 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
             "/listener-adapter-test/notif-without-data-delete.xml";
 
     private static final YangInstanceIdentifier PATCH_CONT_YIID =
-            YangInstanceIdentifier.create(new YangInstanceIdentifier.NodeIdentifier(PatchCont.QNAME));
+            YangInstanceIdentifier.create(new NodeIdentifier(PatchCont.QNAME));
 
     private static EffectiveModelContext SCHEMA_CONTEXT;
 
     private DataBroker dataBroker;
     private DOMDataBroker domDataBroker;
-    private TransactionChainHandler transactionChainHandler;
     private SchemaContextHandler schemaContextHandler;
 
     @BeforeClass
@@ -108,8 +107,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
         dataBroker = getDataBroker();
         domDataBroker = getDomBroker();
 
-        transactionChainHandler = new TransactionChainHandler(domDataBroker);
-        schemaContextHandler = new SchemaContextHandler(transactionChainHandler, Mockito.mock(DOMSchemaService.class));
+        schemaContextHandler = new SchemaContextHandler(domDataBroker, mock(DOMSchemaService.class));
         schemaContextHandler.onModelContextUpdated(SCHEMA_CONTEXT);
     }
 
@@ -132,6 +130,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
         }
 
         public void assertGot(final String json) throws JSONException {
+            // FIXME: use awaitility
             if (!Uninterruptibles.awaitUninterruptibly(notificationLatch, 500, TimeUnit.SECONDS)) {
                 fail("Timed out waiting for notification for: " + json);
             }
@@ -158,6 +157,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
         }
 
         public String awaitUntillNotification(String xml) {
+            // FIXME: use awaitility
             if (!Uninterruptibles.awaitUninterruptibly(notificationLatch, 500, TimeUnit.SECONDS)) {
                 fail("Timed out waiting for notification for: " + xml);
             }
@@ -200,7 +200,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testJsonNotifsLeaves() throws Exception {
         ListenerAdapterTester adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey",
                 NotificationOutputTypeGrouping.NotificationOutputType.JSON, true, false);
-        adapter.setCloseVars(transactionChainHandler, schemaContextHandler);
+        adapter.setCloseVars(domDataBroker, schemaContextHandler);
 
         final DOMDataTreeChangeService changeService = domDataBroker.getExtensions()
                 .getInstance(DOMDataTreeChangeService.class);
@@ -232,7 +232,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testJsonNotifs() throws Exception {
         ListenerAdapterTester adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey",
                 NotificationOutputTypeGrouping.NotificationOutputType.JSON, false, false);
-        adapter.setCloseVars(transactionChainHandler, schemaContextHandler);
+        adapter.setCloseVars(domDataBroker, schemaContextHandler);
 
         final DOMDataTreeChangeService changeService = domDataBroker.getExtensions()
                 .getInstance(DOMDataTreeChangeService.class);
@@ -264,7 +264,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testJsonNotifsWithoutData() throws Exception {
         ListenerAdapterTester adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey",
                 NotificationOutputTypeGrouping.NotificationOutputType.JSON, false, true);
-        adapter.setCloseVars(transactionChainHandler, schemaContextHandler);
+        adapter.setCloseVars(domDataBroker, schemaContextHandler);
 
         DOMDataTreeChangeService changeService = domDataBroker.getExtensions()
                 .getInstance(DOMDataTreeChangeService.class);
@@ -294,7 +294,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testXmlNotifications() throws Exception {
         ListenerAdapterTester adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey",
                 NotificationOutputTypeGrouping.NotificationOutputType.XML, false, false);
-        adapter.setCloseVars(transactionChainHandler, schemaContextHandler);
+        adapter.setCloseVars(domDataBroker, schemaContextHandler);
 
         DOMDataTreeChangeService changeService = domDataBroker.getExtensions()
                 .getInstance(DOMDataTreeChangeService.class);
@@ -324,7 +324,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testXmlSkipData() throws Exception {
         ListenerAdapterTester adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey",
                 NotificationOutputTypeGrouping.NotificationOutputType.XML, false, true);
-        adapter.setCloseVars(transactionChainHandler, schemaContextHandler);
+        adapter.setCloseVars(domDataBroker, schemaContextHandler);
 
         DOMDataTreeChangeService changeService = domDataBroker.getExtensions()
                 .getInstance(DOMDataTreeChangeService.class);
@@ -354,7 +354,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testXmlLeavesOnly() throws Exception {
         ListenerAdapterTester adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey",
                 NotificationOutputTypeGrouping.NotificationOutputType.XML, true, false);
-        adapter.setCloseVars(transactionChainHandler, schemaContextHandler);
+        adapter.setCloseVars(domDataBroker, schemaContextHandler);
 
         DOMDataTreeChangeService changeService = domDataBroker.getExtensions()
                 .getInstance(DOMDataTreeChangeService.class);