X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=restconf%2Frestconf-nb-rfc8040%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Frestconf%2Fnb%2Frfc8040%2Frests%2Fservices%2Fimpl%2FRestconfStreamsSubscriptionServiceImpl.java;h=9e31cfba3c9e088224dc7ed9ac80227d0f4b7cd8;hb=6aa01b1c2105b8e54e667e8b85e06775889527d6;hp=2afc1b91763f969d47f2ae24c824a2cc6b67e2a7;hpb=4f8fe6ca68115fecdb9ce43573af5a2e26c50b50;p=netconf.git diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImpl.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImpl.java index 2afc1b9176..9e31cfba3c 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImpl.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImpl.java @@ -7,7 +7,8 @@ */ package org.opendaylight.restconf.nb.rfc8040.rests.services.impl; -import com.google.common.base.Preconditions; +import static com.google.common.base.Preconditions.checkState; + import java.net.URI; import java.time.Instant; import java.time.format.DateTimeFormatter; @@ -15,10 +16,7 @@ import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import javax.ws.rs.Path; @@ -26,22 +24,17 @@ import javax.ws.rs.core.UriInfo; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMNotificationService; -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.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler; -import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler; +import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload; import org.opendaylight.restconf.nb.rfc8040.rests.services.api.RestconfStreamsSubscriptionService; import org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants; import org.opendaylight.restconf.nb.rfc8040.streams.Configuration; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; -import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; @@ -56,6 +49,12 @@ import org.slf4j.LoggerFactory; @Path("/") public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSubscriptionService { private static final Logger LOG = LoggerFactory.getLogger(RestconfStreamsSubscriptionServiceImpl.class); + private static final QName LOCATION_QNAME = + QName.create("subscribe:to:notification", "2016-10-28", "location").intern(); + private static final NodeIdentifier LOCATION_NODEID = NodeIdentifier.create(LOCATION_QNAME); + private static final QName NOTIFI_QNAME = QName.create(LOCATION_QNAME, "notifi").intern(); + private static final YangInstanceIdentifier LOCATION_PATH = + YangInstanceIdentifier.create(NodeIdentifier.create(NOTIFI_QNAME), LOCATION_NODEID); private final SubscribeToStreamUtil streamUtils; private final HandlersHolder handlersHolder; @@ -67,31 +66,26 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu * @param notificationService {@link DOMNotificationService} * @param schemaHandler * handler of {@link SchemaContext} - * @param transactionChainHandler - * handler of {@link DOMTransactionChain} * @param configuration * configuration for restconf {@link Configuration}} */ public RestconfStreamsSubscriptionServiceImpl(final DOMDataBroker dataBroker, final DOMNotificationService notificationService, final SchemaContextHandler schemaHandler, - final TransactionChainHandler transactionChainHandler, final Configuration configuration) { - this.handlersHolder = new HandlersHolder(dataBroker, notificationService, - transactionChainHandler, schemaHandler); + final Configuration configuration) { + handlersHolder = new HandlersHolder(dataBroker, notificationService, schemaHandler); streamUtils = configuration.isUseSSE() ? SubscribeToStreamUtil.serverSentEvents() : SubscribeToStreamUtil.webSockets(); } @Override - public NormalizedNodeContext subscribeToStream(final String identifier, final UriInfo uriInfo) { + public NormalizedNodePayload subscribeToStream(final String identifier, final UriInfo uriInfo) { final NotificationQueryParams notificationQueryParams = NotificationQueryParams.fromUriInfo(uriInfo); final URI response; if (identifier.contains(RestconfStreamsConstants.DATA_SUBSCRIPTION)) { - response = streamUtils.subscribeToDataStream(identifier, uriInfo, notificationQueryParams, - this.handlersHolder); + response = streamUtils.subscribeToDataStream(identifier, uriInfo, notificationQueryParams, handlersHolder); } else if (identifier.contains(RestconfStreamsConstants.NOTIFICATION_STREAM)) { - response = streamUtils.subscribeToYangStream(identifier, uriInfo, notificationQueryParams, - this.handlersHolder); + response = streamUtils.subscribeToYangStream(identifier, uriInfo, notificationQueryParams, handlersHolder); } else { final String msg = "Bad type of notification of sal-remote"; LOG.warn(msg); @@ -99,16 +93,8 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu } // prepare node with value of location - final InstanceIdentifierContext iid = prepareIIDSubsStreamOutput(this.handlersHolder.getSchemaHandler()); - final NormalizedNodeBuilder> builder = - ImmutableLeafNodeBuilder.create().withValue(response.toString()); - builder.withNodeIdentifier(NodeIdentifier.create(RestconfStreamsConstants.LOCATION_QNAME)); - - // prepare new header with location - final Map headers = new HashMap<>(); - headers.put("Location", response); - - return new NormalizedNodeContext(iid, builder.build(), headers); + return NormalizedNodePayload.ofLocation(prepareIIDSubsStreamOutput(handlersHolder.getSchemaHandler()), + LOCATION_NODEID, response); } /** @@ -118,21 +104,14 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu * @return InstanceIdentifier of Location leaf. */ private static InstanceIdentifierContext prepareIIDSubsStreamOutput(final SchemaContextHandler schemaHandler) { - final Optional module = schemaHandler.get() - .findModule(RestconfStreamsConstants.NOTIFI_QNAME.getModule()); - Preconditions.checkState(module.isPresent()); - final Optional notify = module.get() - .findDataChildByName(RestconfStreamsConstants.NOTIFI_QNAME); - Preconditions.checkState(notify.isPresent()); - final Optional location = ((ContainerSchemaNode) notify.get()) - .findDataChildByName(RestconfStreamsConstants.LOCATION_QNAME); - Preconditions.checkState(location.isPresent()); + final Optional module = schemaHandler.get().findModule(NOTIFI_QNAME.getModule()); + checkState(module.isPresent()); + final DataSchemaNode notify = module.get().dataChildByName(NOTIFI_QNAME); + checkState(notify instanceof ContainerSchemaNode, "Unexpected non-container %s", notify); + final DataSchemaNode location = ((ContainerSchemaNode) notify).dataChildByName(LOCATION_QNAME); + checkState(location != null, "Missing location"); - final List path = new ArrayList<>(); - path.add(NodeIdentifier.create(RestconfStreamsConstants.NOTIFI_QNAME)); - path.add(NodeIdentifier.create(RestconfStreamsConstants.LOCATION_QNAME)); - return new InstanceIdentifierContext(YangInstanceIdentifier.create(path), location.get(), - null, schemaHandler.get()); + return new InstanceIdentifierContext(LOCATION_PATH, location, null, schemaHandler.get()); } /** @@ -142,14 +121,12 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu public static final class HandlersHolder { private final DOMDataBroker dataBroker; private final DOMNotificationService notificationService; - private final TransactionChainHandler transactionChainHandler; private final SchemaContextHandler schemaHandler; private HandlersHolder(final DOMDataBroker dataBroker, final DOMNotificationService notificationService, - final TransactionChainHandler transactionChainHandler, final SchemaContextHandler schemaHandler) { + final SchemaContextHandler schemaHandler) { this.dataBroker = dataBroker; this.notificationService = notificationService; - this.transactionChainHandler = transactionChainHandler; this.schemaHandler = schemaHandler; } @@ -159,7 +136,7 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu * @return the dataBroker */ public DOMDataBroker getDataBroker() { - return this.dataBroker; + return dataBroker; } /** @@ -168,16 +145,7 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu * @return the notificationService */ public DOMNotificationService getNotificationServiceHandler() { - return this.notificationService; - } - - /** - * Get {@link TransactionChainHandler}. - * - * @return the transactionChainHandler - */ - public TransactionChainHandler getTransactionChainHandler() { - return this.transactionChainHandler; + return notificationService; } /** @@ -186,7 +154,7 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu * @return the schemaHandler */ public SchemaContextHandler getSchemaHandler() { - return this.schemaHandler; + return schemaHandler; } }