* Parser and holder of query parameters from uriInfo for notifications.
*/
public final class NotificationQueryParams implements Immutable {
+ private final SkipNotificationDataParam skipNotificationData;
private final StartTimeParam startTime;
private final StopTimeParam stopTime;
private final FilterParam filter;
- private final boolean skipNotificationData;
private NotificationQueryParams(final StartTimeParam startTime, final StopTimeParam stopTime,
- final FilterParam filter, final boolean skipNotificationData) {
+ final FilterParam filter, final SkipNotificationDataParam skipNotificationData) {
this.startTime = startTime;
this.stopTime = stopTime;
this.filter = filter;
}
public static @NonNull NotificationQueryParams of(final StartTimeParam startTime, final StopTimeParam stopTime,
- final FilterParam filter, final boolean skipNotificationData) {
+ final FilterParam filter, final SkipNotificationDataParam skipNotificationData) {
checkArgument(stopTime == null || startTime != null,
"Stop-time parameter has to be used with start-time parameter.");
return new NotificationQueryParams(startTime, stopTime, filter, skipNotificationData);
}
/**
- * Check whether this query should notify changes without data.
+ * Get odl-skip-notification-data query parameter.
*
- * @return true if this query should notify about changes with data
+ * @return odl-skip-notification-data
*/
- public boolean isSkipNotificationData() {
+ public @Nullable SkipNotificationDataParam skipNotificationData() {
return skipNotificationData;
}
if (filter != null) {
helper.add("filter", filter.paramValue());
}
- return helper.add("skipNotificationData", skipNotificationData).toString();
+ if (skipNotificationData != null) {
+ helper.add("skipNotificationData", skipNotificationData.value());
+ }
+ return helper.toString();
}
}
--- /dev/null
+/*
+ * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.restconf.nb.rfc8040;
+
+import java.net.URI;
+import org.eclipse.jdt.annotation.NonNull;
+
+/**
+ * OpenDaylight extension parameter. When used as {@code odl-skip-notification-data=true}, it will instruct the listener
+ * streams to prune data from notifications.
+ */
+public final class SkipNotificationDataParam implements RestconfQueryParam<SkipNotificationDataParam> {
+ // API consistency: must not be confused with enum constants
+ @SuppressWarnings("checkstyle:ConstantName")
+ public static final String uriName = "odl-skip-notification-data";
+
+ private static final @NonNull URI CAPABILITY =
+ URI.create("urn:opendaylight:params:restconf:capability:skip-notification-data:1.0");
+ private static final @NonNull SkipNotificationDataParam FALSE = new SkipNotificationDataParam(false);
+ private static final @NonNull SkipNotificationDataParam TRUE = new SkipNotificationDataParam(true);
+
+ private final boolean value;
+
+ private SkipNotificationDataParam(final boolean value) {
+ this.value = value;
+ }
+
+ public static @NonNull SkipNotificationDataParam of(final boolean value) {
+ return value ? TRUE : FALSE;
+ }
+
+ public static @NonNull SkipNotificationDataParam forUriValue(final String uriValue) {
+ switch (uriValue) {
+ case "false":
+ return FALSE;
+ case "true":
+ return TRUE;
+ default:
+ throw new IllegalArgumentException("Value can be 'false' or 'true', not '" + uriValue + "'");
+ }
+ }
+
+ @Override
+ public Class<@NonNull SkipNotificationDataParam> javaClass() {
+ return SkipNotificationDataParam.class;
+ }
+
+ @Override
+ public String paramName() {
+ return uriName;
+ }
+
+ @Override
+ public String paramValue() {
+ return String.valueOf(value);
+ }
+
+ public boolean value() {
+ return value;
+ }
+
+ public static @NonNull URI capabilityUri() {
+ return CAPABILITY;
+ }
+}
import org.opendaylight.restconf.nb.rfc8040.NotificationQueryParams;
import org.opendaylight.restconf.nb.rfc8040.PointParam;
import org.opendaylight.restconf.nb.rfc8040.ReadDataParams;
+import org.opendaylight.restconf.nb.rfc8040.SkipNotificationDataParam;
import org.opendaylight.restconf.nb.rfc8040.StartTimeParam;
import org.opendaylight.restconf.nb.rfc8040.StopTimeParam;
import org.opendaylight.restconf.nb.rfc8040.WithDefaultsParam;
StartTimeParam startTime = null;
StopTimeParam stopTime = null;
FilterParam filter = null;
- boolean skipNotificationData = false;
+ SkipNotificationDataParam skipNotificationData = null;
for (Entry<String, List<String>> entry : uriInfo.getQueryParameters().entrySet()) {
final String paramName = entry.getKey();
case StopTimeParam.uriName:
stopTime = optionalParam(StopTimeParam::forUriValue, paramName, paramValues);
break;
- case "odl-skip-notification-data":
- // FIXME: this should be properly encapsulated in SkipNotificatioDataParameter
- skipNotificationData = Boolean.parseBoolean(optionalParam(paramName, paramValues));
+ case SkipNotificationDataParam.uriName:
+ skipNotificationData = optionalParam(SkipNotificationDataParam::forUriValue, paramName,
+ paramValues);
break;
default:
throw unhandledParam("notification", paramName);
import org.opendaylight.restconf.nb.rfc8040.FieldsParam;
import org.opendaylight.restconf.nb.rfc8040.FilterParam;
import org.opendaylight.restconf.nb.rfc8040.Rfc8040.IetfYangLibrary;
+import org.opendaylight.restconf.nb.rfc8040.SkipNotificationDataParam;
import org.opendaylight.restconf.nb.rfc8040.WithDefaultsParam;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.RestconfState;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.restconf.state.Capabilities;
.withChildValue(FilterParam.capabilityUri().toString())
.withChildValue(AbstractReplayParam.capabilityUri().toString())
.withChildValue(WithDefaultsParam.capabilityUri().toString())
+ .withChildValue(SkipNotificationDataParam.capabilityUri().toString())
.build())
.build())
.build();
notificationQueryParams.startTime(),
notificationQueryParams.stopTime(),
notificationQueryParams.filter(),
- false, notificationQueryParams.isSkipNotificationData());
+ false, notificationQueryParams.skipNotificationData());
final DOMDataBroker dataBroker = handlersHolder.getDataBroker();
notificationListenerAdapter.setCloseVars(dataBroker, handlersHolder.getSchemaHandler());
final MapEntryNode mapToStreams = RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring(
notificationQueryParams.startTime(),
notificationQueryParams.stopTime(),
notificationQueryParams.filter(),
- false, notificationQueryParams.isSkipNotificationData());
+ false, notificationQueryParams.skipNotificationData());
final DOMDataBroker dataBroker = handlersHolder.getDataBroker();
final SchemaContextHandler schemaHandler = handlersHolder.getSchemaHandler();
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
import org.opendaylight.restconf.nb.rfc8040.FilterParam;
+import org.opendaylight.restconf.nb.rfc8040.SkipNotificationDataParam;
import org.opendaylight.restconf.nb.rfc8040.StartTimeParam;
import org.opendaylight.restconf.nb.rfc8040.StopTimeParam;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
*/
@SuppressWarnings("checkstyle:hiddenField")
public final void setQueryParams(final StartTimeParam startTime, final StopTimeParam stopTime,
- final FilterParam filter, final boolean leafNodesOnly, final boolean skipNotificationData) {
+ final FilterParam filter, final boolean leafNodesOnly,
+ final SkipNotificationDataParam skipNotificationData) {
start = startTime == null ? Instant.now() : parseDateAndTime(startTime.value());
stop = stopTime == null ? null : parseDateAndTime(stopTime.value());
this.leafNodesOnly = leafNodesOnly;
- this.skipNotificationData = skipNotificationData;
+ this.skipNotificationData = skipNotificationData == null ? false : skipNotificationData.value();
if (filter != null) {
try {
equalTo("urn:ietf:params:restconf:capability:fields:1.0"),
equalTo("urn:ietf:params:restconf:capability:filter:1.0"),
equalTo("urn:ietf:params:restconf:capability:replay:1.0"),
- equalTo("urn:ietf:params:restconf:capability:with-defaults:1.0")));
+ equalTo("urn:ietf:params:restconf:capability:with-defaults:1.0"),
+ equalTo("urn:opendaylight:params:restconf:capability:skip-notification-data:1.0")));
}
}
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.SkipNotificationDataParam;
import org.opendaylight.restconf.nb.rfc8040.StartTimeParam;
import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.PatchCont;
final boolean leafNodesOnly, final boolean skipNotificationData) {
super(path, streamName, outputType);
setQueryParams(StartTimeParam.forUriValue("1970-01-01T00:00:00Z"), null, null, leafNodesOnly,
- skipNotificationData);
+ SkipNotificationDataParam.of(skipNotificationData));
}
@Override