From 2b68d50bc232318eb39fc033cab46878073f399f Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 8 Jul 2020 14:53:33 +0200 Subject: [PATCH] Move SubscribeToStreamUtil to rests.services.impl Overall structure of RestconfDataServiceImpl relying on a random mix if 'util' classes is quite wrong, as demonstrated by ReadDataTransactionUtil.readData(), which actually is very much stream-specific and ends up *writing* data. Start with SubscribeToStreamUtil, which pulls a chunk of utility methods into rests/services/impl. This cleans up other utilities and makes the package dependency graph a bit simpler. Change-Id: Ia327182edde23364570f6f5d46044d3efe319fe2 Signed-off-by: Robert Varga --- .../impl/RestconfDataServiceImpl.java | 69 ++++++++++++++++++- ...estconfStreamsSubscriptionServiceImpl.java | 1 - .../impl}/SubscribeToStreamUtil.java | 16 ++--- .../rests/utils/ReadDataTransactionUtil.java | 67 ------------------ 4 files changed, 76 insertions(+), 77 deletions(-) rename restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/{utils => services/impl}/SubscribeToStreamUtil.java (96%) diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java index 4801912438..819cde9f62 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java @@ -11,10 +11,13 @@ import static java.util.Objects.requireNonNull; import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfDataServiceConstant.PostPutQueryParameters.INSERT; import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfDataServiceConstant.PostPutQueryParameters.POINT; import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.NOTIFICATION_STREAM; +import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.STREAMS_PATH; import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.STREAM_ACCESS_PATH_PART; import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.STREAM_LOCATION_PATH_PART; import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.STREAM_PATH; +import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.STREAM_PATH_PART; +import java.net.URI; import java.time.Clock; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -29,6 +32,7 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.dom.api.DOMActionResult; import org.opendaylight.mdsal.dom.api.DOMDataBroker; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMMountPoint; import org.opendaylight.restconf.common.context.InstanceIdentifierContext; import org.opendaylight.restconf.common.context.NormalizedNodeContext; @@ -46,6 +50,7 @@ import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler; import org.opendaylight.restconf.nb.rfc8040.rests.services.api.RestconfDataService; import org.opendaylight.restconf.nb.rfc8040.rests.services.api.RestconfStreamsSubscriptionService; import org.opendaylight.restconf.nb.rfc8040.rests.transactions.TransactionVarsWrapper; +import org.opendaylight.restconf.nb.rfc8040.rests.utils.CreateStreamUtil; import org.opendaylight.restconf.nb.rfc8040.rests.utils.DeleteDataTransactionUtil; import org.opendaylight.restconf.nb.rfc8040.rests.utils.PatchDataTransactionUtil; import org.opendaylight.restconf.nb.rfc8040.rests.utils.PlainPatchDataTransactionUtil; @@ -54,8 +59,11 @@ import org.opendaylight.restconf.nb.rfc8040.rests.utils.PutDataTransactionUtil; import org.opendaylight.restconf.nb.rfc8040.rests.utils.ReadDataTransactionUtil; import org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfDataServiceConstant; import org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfInvokeOperationsUtil; +import org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationListenerAdapter; import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants; +import org.opendaylight.restconf.nb.rfc8040.utils.mapping.RestconfMappingNodeUtil; import org.opendaylight.restconf.nb.rfc8040.utils.parser.ParserIdentifier; +import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Revision; @@ -64,6 +72,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.model.api.ActionDefinition; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.slf4j.Logger; @@ -137,7 +146,7 @@ public class RestconfDataServiceImpl implements RestconfDataService { final DOMMountPoint mountPoint = instanceIdentifier.getMountPoint(); final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper( instanceIdentifier, mountPoint, getTransactionChainHandler(mountPoint)); - final NormalizedNode node = ReadDataTransactionUtil.readData(identifier, parameters.getContent(), + final NormalizedNode node = readData(identifier, parameters.getContent(), transactionNode, parameters.getWithDefault(), schemaContextRef, uriInfo); if (identifier != null && identifier.contains(STREAM_PATH) && identifier.contains(STREAM_ACCESS_PATH_PART) && identifier.contains(STREAM_LOCATION_PATH_PART)) { @@ -167,6 +176,64 @@ public class RestconfDataServiceImpl implements RestconfDataService { return Response.status(200).entity(new NormalizedNodeContext(instanceIdentifier, node, parameters)).build(); } + + /** + * Read specific type of data from data store via transaction and if identifier read data from + * streams then put streams from actual schema context to datastore. + * + * @param identifier + * identifier of data to read + * @param content + * type of data to read (config, state, all) + * @param transactionNode + * {@link TransactionVarsWrapper} - wrapper for variables + * @param withDefa + * vaule of with-defaults parameter + * @param schemaContext + * schema context + * @param uriInfo + * uri info + * @return {@link NormalizedNode} + */ + private static NormalizedNode readData(final String identifier, final String content, + final TransactionVarsWrapper transactionNode, final String withDefa, + final EffectiveModelContext schemaContext, final UriInfo uriInfo) { + if (identifier != null && identifier.contains(STREAMS_PATH) && !identifier.contains(STREAM_PATH_PART)) { + createAllYangNotificationStreams(transactionNode, schemaContext, uriInfo); + } + return ReadDataTransactionUtil.readData(content, transactionNode, withDefa, schemaContext); + } + + private static void createAllYangNotificationStreams(final TransactionVarsWrapper transactionNode, + final EffectiveModelContext schemaContext, final UriInfo uriInfo) { + final DOMDataTreeReadWriteTransaction wTx = transactionNode.getTransactionChain().newReadWriteTransaction(); + final boolean exist = SubscribeToStreamUtil.checkExist(schemaContext, wTx); + + for (final NotificationDefinition notificationDefinition : schemaContext.getNotifications()) { + final NotificationListenerAdapter notifiStreamXML = + CreateStreamUtil.createYangNotifiStream(notificationDefinition, schemaContext, + NotificationOutputType.XML); + final NotificationListenerAdapter notifiStreamJSON = + CreateStreamUtil.createYangNotifiStream(notificationDefinition, schemaContext, + NotificationOutputType.JSON); + writeNotificationStreamToDatastore(schemaContext, uriInfo, wTx, exist, notifiStreamXML); + writeNotificationStreamToDatastore(schemaContext, uriInfo, wTx, exist, notifiStreamJSON); + } + SubscribeToStreamUtil.submitData(wTx); + } + + private static void writeNotificationStreamToDatastore(final EffectiveModelContext schemaContext, + final UriInfo uriInfo, final DOMDataTreeReadWriteTransaction readWriteTransaction, final boolean exist, + final NotificationListenerAdapter listener) { + final URI uri = SubscribeToStreamUtil.prepareUriByStreamName(uriInfo, listener.getStreamName()); + final NormalizedNode mapToStreams = + RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring( + listener.getSchemaPath().getLastComponent(), schemaContext.getNotifications(), null, + listener.getOutputType(), uri, SubscribeToStreamUtil.getMonitoringModule(schemaContext), exist); + SubscribeToStreamUtil.writeDataToDS(schemaContext, + listener.getSchemaPath().getLastComponent().getLocalName(), readWriteTransaction, exist, mapToStreams); + } + @Override public Response putData(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) { requireNonNull(payload); 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 d9a3b6773f..5f8f1003a0 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 @@ -29,7 +29,6 @@ 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.utils.RestconfStreamsConstants; -import org.opendaylight.restconf.nb.rfc8040.rests.utils.SubscribeToStreamUtil; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeBuilder; diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/SubscribeToStreamUtil.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/SubscribeToStreamUtil.java similarity index 96% rename from restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/SubscribeToStreamUtil.java rename to restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/SubscribeToStreamUtil.java index 3de6c2a2ee..f52eab5b73 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/SubscribeToStreamUtil.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/SubscribeToStreamUtil.java @@ -5,7 +5,7 @@ * 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.rests.utils; +package org.opendaylight.restconf.nb.rfc8040.rests.services.impl; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -43,6 +43,8 @@ import org.opendaylight.restconf.nb.rfc8040.handlers.NotificationServiceHandler; 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.ResolveEnumUtil; +import org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants; import org.opendaylight.restconf.nb.rfc8040.streams.listeners.ListenerAdapter; import org.opendaylight.restconf.nb.rfc8040.streams.listeners.ListenersBroker; import org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationListenerAdapter; @@ -68,8 +70,7 @@ import org.slf4j.LoggerFactory; /** * Subscribe to stream util class. */ -public final class SubscribeToStreamUtil { - +final class SubscribeToStreamUtil { private static final Logger LOG = LoggerFactory.getLogger(SubscribeToStreamUtil.class); private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder() .appendValue(ChronoField.YEAR, 4).appendLiteral('-') @@ -95,7 +96,7 @@ public final class SubscribeToStreamUtil { * @param handlersHolder Holder of handlers for notifications. * @return Stream location for listening. */ - public static URI subscribeToYangStream(final String identifier, final UriInfo uriInfo, + static URI subscribeToYangStream(final String identifier, final UriInfo uriInfo, final NotificationQueryParams notificationQueryParams, final HandlersHolder handlersHolder) { final String streamName = ListenersBroker.createStreamNameFromUri(identifier); if (Strings.isNullOrEmpty(streamName)) { @@ -145,7 +146,7 @@ public final class SubscribeToStreamUtil { * @param schemaHandler Schema context handler. * @return InstanceIdentifier of Location leaf. */ - public static InstanceIdentifierContext prepareIIDSubsStreamOutput(final SchemaContextHandler schemaHandler) { + static InstanceIdentifierContext prepareIIDSubsStreamOutput(final SchemaContextHandler schemaHandler) { final Optional module = schemaHandler.get() .findModule(RestconfStreamsConstants.NOTIFI_QNAME.getModule()); Preconditions.checkState(module.isPresent()); @@ -173,7 +174,7 @@ public final class SubscribeToStreamUtil { * @param handlersHolder Holder of handlers for notifications. * @return Location for listening. */ - public static URI subscribeToDataStream(final String identifier, final UriInfo uriInfo, + static URI subscribeToDataStream(final String identifier, final UriInfo uriInfo, final NotificationQueryParams notificationQueryParams, final HandlersHolder handlersHolder) { final Map mapOfValues = mapValuesFromUri(identifier); final LogicalDatastoreType datastoreType = parseURIEnum( @@ -234,7 +235,7 @@ public final class SubscribeToStreamUtil { * @param entry Start-time or stop-time as string in {@link DateAndTime} format. * @return Parsed {@link Instant} by entry. */ - public static Instant parseDateFromQueryParam(final Entry> entry) { + static Instant parseDateFromQueryParam(final Entry> entry) { final DateAndTime event = new DateAndTime(entry.getValue().iterator().next()); final String value = event.getValue(); final TemporalAccessor accessor; @@ -362,5 +363,4 @@ public final class SubscribeToStreamUtil { } return ResolveEnumUtil.resolveEnum(clazz, value); } - } diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/ReadDataTransactionUtil.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/ReadDataTransactionUtil.java index 273483f484..8ba6802833 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/ReadDataTransactionUtil.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/ReadDataTransactionUtil.java @@ -7,12 +7,8 @@ */ package org.opendaylight.restconf.nb.rfc8040.rests.utils; -import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.STREAMS_PATH; -import static org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants.STREAM_PATH_PART; - import com.google.common.primitives.Ints; import com.google.common.util.concurrent.FluentFuture; -import java.net.URI; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -25,7 +21,6 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; -import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; import org.opendaylight.restconf.common.context.InstanceIdentifierContext; import org.opendaylight.restconf.common.context.WriterParameters; @@ -33,10 +28,7 @@ import org.opendaylight.restconf.common.context.WriterParameters.WriterParameter import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfError; import org.opendaylight.restconf.nb.rfc8040.rests.transactions.TransactionVarsWrapper; -import org.opendaylight.restconf.nb.rfc8040.streams.listeners.NotificationListenerAdapter; -import org.opendaylight.restconf.nb.rfc8040.utils.mapping.RestconfMappingNodeUtil; import org.opendaylight.restconf.nb.rfc8040.utils.parser.ParserFieldsParameter; -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.common.QNameModule; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -68,10 +60,8 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNo import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -244,63 +234,6 @@ public final class ReadDataTransactionUtil { } } - /** - * Read specific type of data from data store via transaction and if identifier read data from - * streams then put streams from actual schema context to datastore. - * - * @param identifier - * identifier of data to read - * @param content - * type of data to read (config, state, all) - * @param transactionNode - * {@link TransactionVarsWrapper} - wrapper for variables - * @param withDefa - * vaule of with-defaults parameter - * @param schemaContext - * schema context - * @param uriInfo - * uri info - * @return {@link NormalizedNode} - */ - public static NormalizedNode readData(final String identifier, final String content, - final TransactionVarsWrapper transactionNode, final String withDefa, - final EffectiveModelContext schemaContext, final UriInfo uriInfo) { - if (identifier != null && identifier.contains(STREAMS_PATH) && !identifier.contains(STREAM_PATH_PART)) { - createAllYangNotificationStreams(transactionNode, schemaContext, uriInfo); - } - return readData(content, transactionNode, withDefa, schemaContext); - } - - private static void createAllYangNotificationStreams(final TransactionVarsWrapper transactionNode, - final EffectiveModelContext schemaContext, final UriInfo uriInfo) { - final DOMDataTreeReadWriteTransaction wTx = transactionNode.getTransactionChain().newReadWriteTransaction(); - final boolean exist = SubscribeToStreamUtil.checkExist(schemaContext, wTx); - - for (final NotificationDefinition notificationDefinition : schemaContext.getNotifications()) { - final NotificationListenerAdapter notifiStreamXML = - CreateStreamUtil.createYangNotifiStream(notificationDefinition, schemaContext, - NotificationOutputType.XML); - final NotificationListenerAdapter notifiStreamJSON = - CreateStreamUtil.createYangNotifiStream(notificationDefinition, schemaContext, - NotificationOutputType.JSON); - writeNotificationStreamToDatastore(schemaContext, uriInfo, wTx, exist, notifiStreamXML); - writeNotificationStreamToDatastore(schemaContext, uriInfo, wTx, exist, notifiStreamJSON); - } - SubscribeToStreamUtil.submitData(wTx); - } - - private static void writeNotificationStreamToDatastore(final EffectiveModelContext schemaContext, - final UriInfo uriInfo, final DOMDataTreeReadWriteTransaction readWriteTransaction, final boolean exist, - final NotificationListenerAdapter listener) { - final URI uri = SubscribeToStreamUtil.prepareUriByStreamName(uriInfo, listener.getStreamName()); - final NormalizedNode mapToStreams = - RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring( - listener.getSchemaPath().getLastComponent(), schemaContext.getNotifications(), null, - listener.getOutputType(), uri, SubscribeToStreamUtil.getMonitoringModule(schemaContext), exist); - SubscribeToStreamUtil.writeDataToDS(schemaContext, - listener.getSchemaPath().getLastComponent().getLocalName(), readWriteTransaction, exist, mapToStreams); - } - private static NormalizedNode prepareDataByParamWithDef(final NormalizedNode result, final YangInstanceIdentifier path, final String withDefa, final SchemaContext ctx) { boolean trim; -- 2.36.6