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);
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) {
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;
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;
// 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();
}
* @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 {
}
}
- /**
- * 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();
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);
throws XPathExpressionException;
abstract @NonNull EventFormatter<T> newFormatter(@NonNull TextParameters textParamaters);
-
-
}
*/
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;
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;
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
.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);
}
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);
}
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));
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;
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;
* @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;
};
}
* </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()
// }
// 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)
// 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)
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);
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;
* {@link NotificationListenerAdapter} is responsible to track events on notifications.
*/
public final class NotificationListenerAdapter extends AbstractNotificationListenerAdaptor {
+ private final DatabindProvider databindProvider;
private final ImmutableSet<QName> paths;
/**
* @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);
}
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;
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,
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);
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);
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();
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);
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()
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();
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);
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);
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;
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());
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());
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());
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;
private ServletUpgradeResponse upgradeResponse;
@Mock
private DOMDataBroker dataBroker;
+ @Mock
+ private DatabindProvider databindProvider;
private ListenersBroker listenersBroker;
private WebSocketFactory webSocketFactory;
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();
}