Eliminate AbstractStream.setCloseVars() 46/108846/2
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 3 Nov 2023 21:17:08 +0000 (22:17 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 3 Nov 2023 21:22:49 +0000 (22:22 +0100)
We are only setting the DatabindProvider, which is something we have
when we create the stream. Update class design to get the provider in
constructor.

JIRA: NETCONF-1102
Change-Id: Ic46ef9ffe3200e254601d9c65f5a35e3fc39ef4e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
13 files changed:
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfInvokeOperationsServiceImpl.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/AbstractNotificationListenerAdaptor.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/AbstractStream.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/DeviceNotificationListenerAdaptor.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/EventFormatterFactory.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/JSONDataTreeCandidateFormatter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/JsonDataTreeCandidateSerializer.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/ListenerAdapter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/ListenersBroker.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/streams/NotificationListenerAdapter.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/ListenerAdapterTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/ListenersBrokerTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketFactoryTest.java

index b83f10f900b47734db3d050fbd7b1d5e8268f9c2..ba346794eeba7cd17ea6524ac0711f55f36737e4 100644 (file)
@@ -160,9 +160,10 @@ public final class RestconfInvokeOperationsServiceImpl {
         if (mountPoint == null) {
             // Hacked-up integration of streams
             if (CreateDataChangeEventSubscription.QNAME.equals(type)) {
-                return listenersBroker.createDataChangeNotifiStream(input, localDatabind.modelContext());
+                return listenersBroker.createDataChangeNotifiStream(databindProvider, input,
+                    localDatabind.modelContext());
             } else if (CreateNotificationStream.QNAME.equals(type)) {
-                return listenersBroker.createNotificationStream(input, localDatabind.modelContext());
+                return listenersBroker.createNotificationStream(databindProvider, input, localDatabind.modelContext());
             } else if (SubscribeDeviceNotification.QNAME.equals(type)) {
                 return listenersBroker.createDeviceNotificationStream(input,
                     listenersBroker.prepareUriByStreamName(uriInfo, "").toString(), mountPointService);
index 34511f1c73331398b72acb6c1170958da92a023f..18b2235ef78c2505ef9e1e386c65a5dfd6285363 100644 (file)
@@ -25,9 +25,9 @@ abstract class AbstractNotificationListenerAdaptor extends AbstractStream<DOMNot
         implements DOMNotificationListener {
     private static final Logger LOG = LoggerFactory.getLogger(AbstractNotificationListenerAdaptor.class);
 
-    AbstractNotificationListenerAdaptor(final String streamName, final NotificationOutputType outputType,
-            final ListenersBroker listenersBroker) {
-        super(streamName, outputType, getFormatterFactory(outputType), listenersBroker);
+    AbstractNotificationListenerAdaptor(final ListenersBroker listenersBroker, final String streamName,
+            final NotificationOutputType outputType) {
+        super(listenersBroker, streamName, outputType, getFormatterFactory(outputType));
     }
 
     private static NotificationFormatterFactory getFormatterFactory(final NotificationOutputType outputType) {
index 69eb568f814da9595deafa461db8019521713bea..14862eec173d23613c2a95601e69b998c9456bfe 100644 (file)
@@ -14,7 +14,6 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Set;
 import javax.xml.xpath.XPathExpressionException;
 import org.checkerframework.checker.lock.qual.GuardedBy;
@@ -22,7 +21,6 @@ import org.checkerframework.checker.lock.qual.Holding;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.nb.rfc8040.ReceiveEventsParams;
-import org.opendaylight.restconf.nb.rfc8040.databind.DatabindProvider;
 import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
@@ -49,17 +47,14 @@ abstract class AbstractStream<T> {
     // FIXME: NETCONF-1102: this should be tied to a subscriber
     private @NonNull EventFormatter<T> formatter;
 
-    // FIXME: these really should not live here
-    protected DatabindProvider databindProvider;
-
-    AbstractStream(final String streamName, final NotificationOutputType outputType,
-            final EventFormatterFactory<T> formatterFactory, final ListenersBroker listenersBroker) {
+    AbstractStream(final ListenersBroker listenersBroker, final String streamName,
+            final NotificationOutputType outputType, final EventFormatterFactory<T> formatterFactory) {
+        this.listenersBroker = requireNonNull(listenersBroker);
         this.streamName = requireNonNull(streamName);
         checkArgument(!streamName.isEmpty());
 
         this.outputType = requireNonNull(outputType);
         this.formatterFactory = requireNonNull(formatterFactory);
-        this.listenersBroker = requireNonNull(listenersBroker);
         formatter = formatterFactory.emptyFormatter();
     }
 
@@ -212,11 +207,10 @@ abstract class AbstractStream<T> {
      * @param data Data of incoming notifications.
      */
     synchronized void post(final String data) {
-        final Iterator<StreamSessionHandler> iterator = subscribers.iterator();
+        final var iterator = subscribers.iterator();
         while (iterator.hasNext()) {
-            final StreamSessionHandler subscriber = iterator.next();
-            final boolean isConnected = subscriber.isConnected();
-            if (isConnected) {
+            final var subscriber = iterator.next();
+            if (subscriber.isConnected()) {
                 subscriber.sendDataMessage(data);
                 LOG.debug("Data was sent to subscriber {} on connection {}:", this, subscriber);
             } else {
@@ -228,17 +222,6 @@ abstract class AbstractStream<T> {
         }
     }
 
-    /**
-     * Data broker for delete data in DS on close().
-     *
-     * @param databindProvider for formatting notifications
-     */
-    @SuppressWarnings("checkstyle:hiddenField")
-    // FIXME: this is pure lifecycle nightmare just because ...
-    public synchronized void setCloseVars(final DatabindProvider databindProvider) {
-        this.databindProvider = databindProvider;
-    }
-
     @Override
     public final String toString() {
         return addToStringAttributes(MoreObjects.toStringHelper(this)).toString();
index 6d5ae374e2348244671a46b12488a49886356178..fea91a73901f13d6c86aafed8b9e4468aa2b2acc 100644 (file)
@@ -31,10 +31,10 @@ public final class DeviceNotificationListenerAdaptor extends AbstractNotificatio
 
     private ListenerRegistration<DOMMountPointListener> reg;
 
-    DeviceNotificationListenerAdaptor(final String streamName, final NotificationOutputType outputType,
-            final ListenersBroker listenersBroker, final EffectiveModelContext effectiveModel,
+    DeviceNotificationListenerAdaptor(final ListenersBroker listenersBroker, final String streamName,
+            final NotificationOutputType outputType, final EffectiveModelContext effectiveModel,
             final DOMMountPointService mountPointService, final YangInstanceIdentifier instanceIdentifier) {
-        super(streamName, outputType, listenersBroker);
+        super(listenersBroker, streamName, outputType);
         this.effectiveModel = requireNonNull(effectiveModel);
         this.mountPointService = requireNonNull(mountPointService);
         this.instanceIdentifier = requireNonNull(instanceIdentifier);
index 3216533e1b197abcb5f9f5772e42ed3cf3c86d64..594aac782df4dd08cdd9d958ed46b4c930a5261b 100644 (file)
@@ -31,6 +31,4 @@ abstract class EventFormatterFactory<T> {
         throws XPathExpressionException;
 
     abstract @NonNull EventFormatter<T> newFormatter(@NonNull TextParameters textParamaters);
-
-
 }
index 8af360c0b1061e04e74d3444605388c69da45795..2129d52045f010dc10c43b852e4ed9fd4ccce819 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.restconf.nb.rfc8040.streams;
 
-import static java.util.Objects.requireNonNull;
-
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
 import java.io.StringWriter;
@@ -19,7 +17,6 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.$YangModuleInfoImpl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.DataChangedNotification;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.data.changed.notification.DataChangeEvent;
-import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
@@ -27,36 +24,29 @@ public final class JSONDataTreeCandidateFormatter extends DataTreeCandidateForma
     private static final @NonNull String DATA_CHANGED_EVENT_NAME = DataChangeEvent.QNAME.getLocalName();
     private static final @NonNull String DATA_CHANGED_NOTIFICATION_NAME =
         $YangModuleInfoImpl.getInstance().getName().getLocalName() + ":" + DataChangedNotification.QNAME.getLocalName();
+    private static final JSONDataTreeCandidateFormatter EMPTY =
+        new JSONDataTreeCandidateFormatter(TextParameters.EMPTY);
 
-    private final JSONCodecFactorySupplier codecSupplier;
+    static final DataTreeCandidateFormatterFactory FACTORY = new DataTreeCandidateFormatterFactory(EMPTY) {
+        @Override
+        DataTreeCandidateFormatter newFormatter(final TextParameters textParams) {
+            return new JSONDataTreeCandidateFormatter(textParams);
+        }
 
-    private JSONDataTreeCandidateFormatter(final TextParameters textParams,
-            final JSONCodecFactorySupplier codecSupplier) {
+        @Override
+        DataTreeCandidateFormatter getFormatter(final TextParameters textParams, final String xpathFilter)
+                throws XPathExpressionException {
+            return new JSONDataTreeCandidateFormatter(textParams, xpathFilter);
+        }
+    };
+
+    private JSONDataTreeCandidateFormatter(final TextParameters textParams) {
         super(textParams);
-        this.codecSupplier = requireNonNull(codecSupplier);
     }
 
-    private JSONDataTreeCandidateFormatter(final TextParameters textParams, final String xpathFilter,
-            final JSONCodecFactorySupplier codecSupplier) throws XPathExpressionException {
+    private JSONDataTreeCandidateFormatter(final TextParameters textParams, final String xpathFilter)
+            throws XPathExpressionException {
         super(textParams, xpathFilter);
-        this.codecSupplier = requireNonNull(codecSupplier);
-    }
-
-    public static DataTreeCandidateFormatterFactory createFactory(
-            final JSONCodecFactorySupplier codecSupplier) {
-        final var empty = new JSONDataTreeCandidateFormatter(TextParameters.EMPTY, codecSupplier);
-        return new DataTreeCandidateFormatterFactory(empty) {
-            @Override
-            DataTreeCandidateFormatter newFormatter(final TextParameters textParams) {
-                return new JSONDataTreeCandidateFormatter(textParams, codecSupplier);
-            }
-
-            @Override
-            DataTreeCandidateFormatter getFormatter(final TextParameters textParams, final String xpathFilter)
-                    throws XPathExpressionException {
-                return new JSONDataTreeCandidateFormatter(textParams, xpathFilter, codecSupplier);
-            }
-        };
     }
 
     @Override
@@ -71,7 +61,7 @@ public final class JSONDataTreeCandidateFormatter extends DataTreeCandidateForma
                         .name(DATA_CHANGED_NOTIFICATION_NAME).beginObject()
                             .name(DATA_CHANGED_EVENT_NAME).beginArray();
 
-                final var serializer = new JsonDataTreeCandidateSerializer(schemaContext, codecSupplier, jsonWriter);
+                final var serializer = new JsonDataTreeCandidateSerializer(schemaContext, jsonWriter);
                 for (var candidate : input) {
                     nonEmpty |= serializer.serialize(candidate, params);
                 }
index 00df6a3dcff1996d41ab1a30b9f8fed236cf0f79..412836a3f8175b971d0b5fd37652f791779f7b28 100644 (file)
@@ -30,13 +30,10 @@ final class JsonDataTreeCandidateSerializer extends AbstractWebsocketSerializer<
     private static final XMLNamespace SAL_REMOTE_NS = DataChangedNotification.QNAME.getNamespace();
     private static final Absolute DATA_CHANGE_EVENT = Absolute.of(DataChangedNotification.QNAME, DataChangeEvent.QNAME);
 
-    private final JSONCodecFactorySupplier codecSupplier;
     private final JsonWriter jsonWriter;
 
-    JsonDataTreeCandidateSerializer(final EffectiveModelContext context,
-            final JSONCodecFactorySupplier codecSupplier, final JsonWriter jsonWriter) {
+    JsonDataTreeCandidateSerializer(final EffectiveModelContext context, final JsonWriter jsonWriter) {
         super(context);
-        this.codecSupplier = requireNonNull(codecSupplier);
         this.jsonWriter = requireNonNull(jsonWriter);
     }
 
@@ -47,7 +44,7 @@ final class JsonDataTreeCandidateSerializer extends AbstractWebsocketSerializer<
 
         final var modificationType = candidate.modificationType();
         if (modificationType != ModificationType.UNMODIFIED) {
-            final var codecs = codecSupplier.getShared(parent.getEffectiveModelContext());
+            final var codecs = JSONCodecFactorySupplier.RFC7951.getShared(parent.getEffectiveModelContext());
             try (var writer = createNestedWriter(codecs, DATA_CHANGE_EVENT, SAL_REMOTE_NS, jsonWriter)) {
                 writer.startLeafNode(PATH_NID);
                 writer.scalarValue(YangInstanceIdentifier.of(dataPath));
index dd971234ba56e51e7e65c3cc920f620ac4ce6531..3bf2f2d7e48eedd050b9d1b5ee6c657a92e594fb 100644 (file)
@@ -20,9 +20,9 @@ import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindProvider;
 import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,9 +33,8 @@ import org.slf4j.LoggerFactory;
 public class ListenerAdapter extends AbstractStream<Collection<DataTreeCandidate>>
         implements ClusteredDOMDataTreeChangeListener {
     private static final Logger LOG = LoggerFactory.getLogger(ListenerAdapter.class);
-    private static final DataTreeCandidateFormatterFactory JSON_FORMATTER_FACTORY =
-            JSONDataTreeCandidateFormatter.createFactory(JSONCodecFactorySupplier.RFC7951);
 
+    private final DatabindProvider databindProvider;
     private final @NonNull LogicalDatastoreType datastore;
     private final @NonNull YangInstanceIdentifier path;
 
@@ -46,17 +45,18 @@ public class ListenerAdapter extends AbstractStream<Collection<DataTreeCandidate
      * @param streamName The name of the stream.
      * @param outputType Type of output on notification (JSON, XML).
      */
-    ListenerAdapter(final String streamName, final NotificationOutputType outputType,
-            final ListenersBroker listenersBroker, final LogicalDatastoreType datastore,
-            final YangInstanceIdentifier path) {
-        super(streamName, outputType, getFormatterFactory(outputType), listenersBroker);
+    ListenerAdapter(final ListenersBroker listenersBroker, final String streamName,
+            final NotificationOutputType outputType, final DatabindProvider databindProvider,
+            final LogicalDatastoreType datastore, final YangInstanceIdentifier path) {
+        super(listenersBroker, streamName, outputType, getFormatterFactory(outputType));
+        this.databindProvider = requireNonNull(databindProvider);
         this.datastore = requireNonNull(datastore);
         this.path = requireNonNull(path);
     }
 
     private static DataTreeCandidateFormatterFactory getFormatterFactory(final NotificationOutputType outputType) {
         return switch (outputType) {
-            case JSON -> JSON_FORMATTER_FACTORY;
+            case JSON -> JSONDataTreeCandidateFormatter.FACTORY;
             case XML -> XMLDataTreeCandidateFormatter.FACTORY;
         };
     }
index 6cb40860c0369517d40a7e11a3948f0cc86f7961..f61b35163d04aa8cf2a975b572818f1424d70f4c 100644 (file)
@@ -363,14 +363,16 @@ public abstract sealed class ListenersBroker {
      *     </pre>
      */
     // FIXME: this really should be a normal RPC implementation
-    public final RestconfFuture<Optional<ContainerNode>> createDataChangeNotifiStream(final ContainerNode input,
+    public final RestconfFuture<Optional<ContainerNode>> createDataChangeNotifiStream(
+            final DatabindProvider databindProvider, final ContainerNode input,
             final EffectiveModelContext modelContext) {
         final var datastoreName = extractStringLeaf(input, DATASTORE_NODEID);
         final var datastore = datastoreName != null ? LogicalDatastoreType.valueOf(datastoreName)
             : LogicalDatastoreType.CONFIGURATION;
         final var path = preparePath(input);
         final var outputType = prepareOutputType(input);
-        final var adapter = createStream(name -> new ListenerAdapter(name, outputType, this, datastore, path));
+        final var adapter = createStream(name -> new ListenerAdapter(this, name, outputType, databindProvider,
+            datastore, path));
 
         // building of output
         return RestconfFuture.of(Optional.of(Builders.containerBuilder()
@@ -418,7 +420,8 @@ public abstract sealed class ListenersBroker {
 //    }
 
     // FIXME: this really should be a normal RPC implementation
-    public final RestconfFuture<Optional<ContainerNode>> createNotificationStream(final ContainerNode input,
+    public final RestconfFuture<Optional<ContainerNode>> createNotificationStream(
+            final DatabindProvider databindProvider, final ContainerNode input,
             final EffectiveModelContext modelContext) {
         final var qnames = ((LeafSetNode<String>) input.getChildByArg(NOTIFICATIONS)).body().stream()
             .map(LeafSetEntryNode::body)
@@ -454,7 +457,8 @@ public abstract sealed class ListenersBroker {
 
         // registration of the listener
         final var outputType = prepareOutputType(input);
-        final var adapter = createStream(name -> new NotificationListenerAdapter(name, outputType, this, qnames));
+        final var adapter = createStream(name -> new NotificationListenerAdapter(this, name, outputType,
+            databindProvider, qnames));
 
         return RestconfFuture.of(Optional.of(Builders.containerBuilder()
             .withNodeIdentifier(SAL_REMOTE_OUTPUT_NODEID)
@@ -553,7 +557,7 @@ public abstract sealed class ListenersBroker {
 
         final var outputType = prepareOutputType(input);
         final var notificationListenerAdapter = createStream(
-            streamName -> new DeviceNotificationListenerAdaptor(streamName, outputType, this, mountModelContext,
+            streamName -> new DeviceNotificationListenerAdaptor(this, streamName, outputType, mountModelContext,
                 mountPointService, mountPoint.getIdentifier()));
         notificationListenerAdapter.listen(mountNotifService, notificationPaths);
 
index b27ab756689aec56e8148d429a2fdc9c3aa56bb7..7df4ba589229283f2f111fac26bb4b2f0ffcb656 100644 (file)
@@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableSet;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindProvider;
 import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
@@ -21,6 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absol
  * {@link NotificationListenerAdapter} is responsible to track events on notifications.
  */
 public final class NotificationListenerAdapter extends AbstractNotificationListenerAdaptor {
+    private final DatabindProvider databindProvider;
     private final ImmutableSet<QName> paths;
 
     /**
@@ -31,9 +33,11 @@ public final class NotificationListenerAdapter extends AbstractNotificationListe
      * @param outputType Type of output on notification (JSON or XML).
      * @param listenersBroker Associated {@link ListenersBroker}
      */
-    NotificationListenerAdapter(final String streamName, final NotificationOutputType outputType,
-            final ListenersBroker listenersBroker, final ImmutableSet<QName> paths) {
-        super(streamName, outputType, listenersBroker);
+    NotificationListenerAdapter(final ListenersBroker listenersBroker, final String streamName,
+            final NotificationOutputType outputType, final DatabindProvider databindProvider,
+            final ImmutableSet<QName> paths) {
+        super(listenersBroker, streamName, outputType);
+        this.databindProvider = requireNonNull(databindProvider);
         this.paths = requireNonNull(paths);
     }
 
index 55fd2b54631ced20366e572ea15beb006375a08a..33a85977529480dd42464186a0721603ab0f0908 100644 (file)
@@ -26,7 +26,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
@@ -180,7 +179,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
                 final NotificationOutputType outputType, final boolean leafNodesOnly,
                 final boolean skipNotificationData, final boolean changedLeafNodesOnly, final boolean childNodesOnly,
                 final ListenersBroker listenersBroker) {
-            super(streamName, outputType, listenersBroker, LogicalDatastoreType.CONFIGURATION, path);
+            super(listenersBroker, streamName, outputType, databindProvider, LogicalDatastoreType.CONFIGURATION, path);
             setQueryParams(new ReceiveEventsParams(null, null, null,
                 leafNodesOnly ? LeafNodesOnlyParam.of(true) : null,
                 skipNotificationData ? SkipNotificationDataParam.of(true) : null,
@@ -238,7 +237,6 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testJsonNotifsLeaves() throws Exception {
         var adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey", NotificationOutputType.JSON,
             true, false, false, false, listenersBroker);
-        adapter.setCloseVars(databindProvider);
 
         final var changeService = domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
         final var root = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, PATCH_CONT_YIID);
@@ -277,7 +275,6 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testJsonNotifsChangedLeaves() throws Exception {
         var adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey", NotificationOutputType.JSON,
                 false, false, true, false, listenersBroker);
-        adapter.setCloseVars(databindProvider);
 
         final var changeService = domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
         final var root = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, PATCH_CONT_YIID);
@@ -324,14 +321,13 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testJsonChildNodesOnly() throws Exception {
         final var adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey",
             NotificationOutputType.JSON, false, false, false, true, listenersBroker);
-        adapter.setCloseVars(databindProvider);
 
         final var changeService = domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
         final var root = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, PATCH_CONT_YIID);
         changeService.registerDataTreeChangeListener(root, adapter);
 
         final var iid = InstanceIdentifier.create(PatchCont.class).child(MyList1.class, new MyList1Key("Althea"));
-        WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
+        var writeTransaction = dataBroker.newWriteOnlyTransaction();
         writeTransaction.put(LogicalDatastoreType.CONFIGURATION, iid,
             new MyList1Builder().setMyLeaf11("Jed").setName("Althea").build());
         writeTransaction.commit();
@@ -359,7 +355,6 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testXmlLeavesOnly() throws Exception {
         var adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey", NotificationOutputType.XML,
             true, false, false, false, listenersBroker);
-        adapter.setCloseVars(databindProvider);
 
         final var changeService = domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
         final var root = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, PATCH_CONT_YIID);
@@ -410,12 +405,11 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testXmlChangedLeavesOnly() throws Exception {
         var adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey", NotificationOutputType.XML,
                 false, false, true, false, listenersBroker);
-        adapter.setCloseVars(databindProvider);
 
         final var changeService = domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
         final var root = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, PATCH_CONT_YIID);
         changeService.registerDataTreeChangeListener(root, adapter);
-        WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
+        var writeTransaction = dataBroker.newWriteOnlyTransaction();
         final var iid = InstanceIdentifier.create(PatchCont.class);
         writeTransaction.put(LogicalDatastoreType.CONFIGURATION, iid, new PatchContBuilder()
             .addAugmentation(new PatchCont1Builder()
@@ -469,14 +463,13 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
     public void testXmlChildNodesOnly() throws Exception {
         final var adapter = new ListenerAdapterTester(PATCH_CONT_YIID, "Casey",
             NotificationOutputType.XML, false, false, false, true, listenersBroker);
-        adapter.setCloseVars(databindProvider);
 
         final var changeService = domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
         final var root = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, PATCH_CONT_YIID);
         changeService.registerDataTreeChangeListener(root, adapter);
 
         final var iid = InstanceIdentifier.create(PatchCont.class).child(MyList1.class, new MyList1Key("Althea"));
-        WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
+        var writeTransaction = dataBroker.newWriteOnlyTransaction();
         writeTransaction.put(LogicalDatastoreType.CONFIGURATION, iid,
             new MyList1Builder().setMyLeaf11("Jed").setName("Althea").build());
         writeTransaction.commit();
@@ -574,7 +567,6 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
             final String jsonNotifCreate, final String jsonNotifUpdate, final String jsonNotifDelete) throws Exception {
         final var adapter = new ListenerAdapterTester(pathYiid, "Casey",
                 NotificationOutputType.JSON, false, skipData, false, false, listenersBroker);
-        adapter.setCloseVars(databindProvider);
 
         final var changeService = domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
         final var root = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, pathYiid);
@@ -604,7 +596,6 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
             final String xmlNotifCreate, final String xmlNotifUpdate, final String xmlNotifDelete) throws Exception {
         final var adapter = new ListenerAdapterTester(pathYiid, "Casey", NotificationOutputType.XML,
                 false, skipData, false, false, listenersBroker);
-        adapter.setCloseVars(databindProvider);
 
         final var changeService = domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
         final var root = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, pathYiid);
index e1280d87e8c89f5f553bac4edf3dbb16060bf97b..0f818065ec6900bd8681d23854e1a34067211242 100644 (file)
@@ -22,6 +22,8 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.CreateDataChangeEventSubscriptionOutput;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
@@ -46,16 +48,18 @@ class ListenersBrokerTest {
     private DOMDataBroker dataBroker;
 
     private ListenersBroker listenersBroker;
+    private DatabindProvider databindProvider;
 
     @BeforeEach
     public void before() {
         listenersBroker = new ListenersBroker.ServerSentEvents(dataBroker);
+        databindProvider = () -> DatabindContext.ofModel(SCHEMA_CTX);
     }
 
     @Test
     void createStreamTest() {
         final var output = assertInstanceOf(ContainerNode.class, listenersBroker.createDataChangeNotifiStream(
-            prepareDomPayload("create-data-change-event-subscription", "toaster", "path"),
+            databindProvider, prepareDomPayload("create-data-change-event-subscription", "toaster", "path"),
             SCHEMA_CTX).getOrThrow().orElse(null));
 
         assertEquals(new NodeIdentifier(CreateDataChangeEventSubscriptionOutput.QNAME), output.name());
@@ -74,7 +78,7 @@ class ListenersBrokerTest {
     void createStreamWrongValueTest() {
         final var payload = prepareDomPayload("create-data-change-event-subscription", "String value", "path");
         final var errors = assertThrows(RestconfDocumentedException.class,
-            () -> listenersBroker.createDataChangeNotifiStream(payload, SCHEMA_CTX)).getErrors();
+            () -> listenersBroker.createDataChangeNotifiStream(databindProvider, payload, SCHEMA_CTX)).getErrors();
         assertEquals(1, errors.size());
         final var error = errors.get(0);
         assertEquals(ErrorType.APPLICATION, error.getErrorType());
@@ -86,7 +90,7 @@ class ListenersBrokerTest {
     void createStreamWrongInputRpcTest() {
         final var payload = prepareDomPayload("create-data-change-event-subscription2", "toaster", "path2");
         final var errors = assertThrows(RestconfDocumentedException.class,
-            () -> listenersBroker.createDataChangeNotifiStream(payload, SCHEMA_CTX)).getErrors();
+            () -> listenersBroker.createDataChangeNotifiStream(databindProvider, payload, SCHEMA_CTX)).getErrors();
         assertEquals(1, errors.size());
         final var error = errors.get(0);
         assertEquals(ErrorType.APPLICATION, error.getErrorType());
index b836839a21a1720f848aedabd2477e68205e6857..c02729ed59f13489087dcae50b875bca0986a69f 100644 (file)
@@ -23,6 +23,7 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindProvider;
 import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -37,6 +38,8 @@ class WebSocketFactoryTest extends AbstractNotificationListenerTest {
     private ServletUpgradeResponse upgradeResponse;
     @Mock
     private DOMDataBroker dataBroker;
+    @Mock
+    private DatabindProvider databindProvider;
 
     private ListenersBroker listenersBroker;
     private WebSocketFactory webSocketFactory;
@@ -47,8 +50,8 @@ class WebSocketFactoryTest extends AbstractNotificationListenerTest {
         listenersBroker = new ListenersBroker.ServerSentEvents(dataBroker);
         webSocketFactory = new WebSocketFactory(execService, listenersBroker, 5000, 2000);
 
-        streamName = listenersBroker.createStream(name -> new ListenerAdapter(name, NotificationOutputType.JSON,
-            listenersBroker, LogicalDatastoreType.CONFIGURATION,
+        streamName = listenersBroker.createStream(name -> new ListenerAdapter(listenersBroker, name,
+            NotificationOutputType.JSON, databindProvider, LogicalDatastoreType.CONFIGURATION,
             YangInstanceIdentifier.of(QName.create("http://netconfcentral.org/ns/toaster", "2009-11-20", "toaster"))))
             .getStreamName();
     }