Do not use InstanceIdentifierContext in NormalizedNodePayload 58/107858/5
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 13 Sep 2023 19:02:45 +0000 (21:02 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 14 Sep 2023 08:59:30 +0000 (10:59 +0200)
All writers have been proven to just need the Inference, ditch the
useless indirection through InstanceIdentifierContext.

JIRA: NETCONF-1157
Change-Id: I0f020b9a73198037dba51364b78ec3af7086b8d7
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/AbstractNormalizedNodeBodyWriter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/legacy/NormalizedNodePayload.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfImpl.java
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/rests/services/impl/RestconfStreamsSubscriptionServiceImpl.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/XmlNormalizedNodeBodyWriterTest.java

index a69a1296a85951f61902accb8d2b456870dcbcf5..56da396d34aeca6079b770fa2761a5f1f7cfcbd5 100644 (file)
@@ -47,8 +47,7 @@ abstract class AbstractNormalizedNodeBodyWriter implements MessageBodyWriter<Nor
         }
 
         final var output = requireNonNull(entityStream);
-        final var iidContext = context.getInstanceIdentifierContext();
-        final var stack = iidContext.inference().toSchemaInferenceStack();
+        final var stack = context.inference().toSchemaInferenceStack();
         // FIXME: this dispatch is here to handle codec transition to 'output', but that should be completely okay with
         //        the instantiation path we are using (based in Inference).
         if (!stack.isEmpty()) {
index f86111dcabffceebe85e04100fcce56b1c341a97..43a048e855cad603cd9ef905b828600e05ccc086 100644 (file)
@@ -16,52 +16,53 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 
 /**
  * A RFC8040 overlay from our marriage to NormalizedNodeContext. This represents a NormalizedNode along with further
  * messy details needed to deal with the payload.
  */
 public final class NormalizedNodePayload {
-    private final InstanceIdentifierContext context;
     private final @NonNull ImmutableMap<String, Object> headers;
     private final @NonNull QueryParameters writerParameters;
+    private final @NonNull Inference inference;
     private final NormalizedNode data;
 
-    private NormalizedNodePayload(final InstanceIdentifierContext context, final NormalizedNode data,
+    private NormalizedNodePayload(final Inference inference, final NormalizedNode data,
             final QueryParameters writerParameters, final ImmutableMap<String, Object> headers) {
-        this.context = context;
+        this.inference = requireNonNull(inference);
         this.data = data;
         this.writerParameters = requireNonNull(writerParameters);
         this.headers = requireNonNull(headers);
     }
 
-    public static @NonNull NormalizedNodePayload empty(final InstanceIdentifierContext path) {
-        return new NormalizedNodePayload(requireNonNull(path), null, QueryParameters.empty(), ImmutableMap.of());
+    public static @NonNull NormalizedNodePayload empty(final Inference inference) {
+        return new NormalizedNodePayload(inference, null, QueryParameters.empty(), ImmutableMap.of());
     }
 
-    public static @NonNull NormalizedNodePayload of(final InstanceIdentifierContext path, final NormalizedNode data) {
-        return new NormalizedNodePayload(requireNonNull(path), requireNonNull(data), QueryParameters.empty(),
-            ImmutableMap.of());
+    public static @NonNull NormalizedNodePayload of(final Inference inference, final NormalizedNode data) {
+        return new NormalizedNodePayload(inference, requireNonNull(data), QueryParameters.empty(), ImmutableMap.of());
     }
 
-    public static @NonNull NormalizedNodePayload ofNullable(final InstanceIdentifierContext path,
-            final NormalizedNode data) {
-        return data == null ? empty(path) : of(path, data);
+    public static @NonNull NormalizedNodePayload ofNullable(final Inference inference, final NormalizedNode data) {
+        return data == null ? empty(inference) : of(inference, data);
     }
 
-    public static @NonNull NormalizedNodePayload ofLocation(final InstanceIdentifierContext path,
-            final NodeIdentifier leafId, final URI location) {
-        return new NormalizedNodePayload(requireNonNull(path), ImmutableNodes.leafNode(leafId, location.toString()),
+    // FIXME: can we get rid of this, please? Whoever is using this should be setting a Response instead
+    @Deprecated
+    public static @NonNull NormalizedNodePayload ofLocation(final Inference inference, final NodeIdentifier leafId,
+            final URI location) {
+        return new NormalizedNodePayload(inference, ImmutableNodes.leafNode(leafId, location.toString()),
             QueryParameters.empty(), ImmutableMap.of("Location", location));
     }
 
-    public static Object ofReadData(final InstanceIdentifierContext path, final NormalizedNode data,
+    public static Object ofReadData(final Inference inference, final NormalizedNode data,
             final QueryParameters parameters) {
-        return new NormalizedNodePayload(requireNonNull(path), requireNonNull(data), parameters, ImmutableMap.of());
+        return new NormalizedNodePayload(inference, requireNonNull(data), parameters, ImmutableMap.of());
     }
 
-    public InstanceIdentifierContext getInstanceIdentifierContext() {
-        return context;
+    public @NonNull Inference inference() {
+        return inference;
     }
 
     public @Nullable NormalizedNode getData() {
index ed43f30f2af5e9c5ac8483760ab5aab6a1e8a871..d48e55d9fec21bcd97c965093bd72a4e4342fc7d 100644 (file)
@@ -221,14 +221,14 @@ public final class RestconfDataServiceImpl {
             case ALL, CONFIG -> {
                 final QName type = node.name().getNodeType();
                 yield Response.status(Status.OK)
-                    .entity(NormalizedNodePayload.ofReadData(instanceIdentifier, node, queryParams))
+                    .entity(NormalizedNodePayload.ofReadData(instanceIdentifier.inference(), node, queryParams))
                     .header("ETag", '"' + type.getModule().getRevision().map(Revision::toString).orElse(null) + "-"
                         + type.getLocalName() + '"')
                     .header("Last-Modified", FORMATTER.format(LocalDateTime.now(Clock.systemUTC())))
                     .build();
             }
             case NONCONFIG -> Response.status(Status.OK)
-                .entity(NormalizedNodePayload.ofReadData(instanceIdentifier, node, queryParams))
+                .entity(NormalizedNodePayload.ofReadData(instanceIdentifier.inference(), node, queryParams))
                 .build();
         };
     }
@@ -811,7 +811,8 @@ public final class RestconfDataServiceImpl {
         }
 
         final var mountPoint = context.getMountPoint();
-        final var schemaPath = context.inference().toSchemaInferenceStack().toSchemaNodeIdentifier();
+        final var inference = context.inference();
+        final var schemaPath = inference.toSchemaInferenceStack().toSchemaNodeIdentifier();
         final var response = mountPoint != null ? invokeAction(input, schemaPath, yangIIdContext, mountPoint)
             : invokeAction(input, schemaPath, yangIIdContext, actionService);
         final var result = checkActionResponse(response);
@@ -820,7 +821,7 @@ public final class RestconfDataServiceImpl {
         if (resultData != null && resultData.isEmpty()) {
             return Response.status(Status.NO_CONTENT).build();
         }
-        return Response.status(Status.OK).entity(NormalizedNodePayload.ofNullable(context, resultData)).build();
+        return Response.status(Status.OK).entity(NormalizedNodePayload.ofNullable(inference, resultData)).build();
     }
 
     /**
index 3fa1fcc4290bb49b0799681a2a19f32121aca2cd..cc12a915ff20e7599a3bc39c0182dea96bf41a36 100644 (file)
@@ -15,7 +15,6 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import org.opendaylight.restconf.nb.rfc8040.MediaTypes;
 import org.opendaylight.restconf.nb.rfc8040.databind.DatabindProvider;
-import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
 import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.Restconf;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibrary;
@@ -61,7 +60,7 @@ public final class RestconfImpl {
         stack.enterDataTree(Restconf.QNAME);
         stack.enterDataTree(YANG_LIBRARY_VERSION);
 
-        return NormalizedNodePayload.of(InstanceIdentifierContext.ofStack(stack),
+        return NormalizedNodePayload.of(stack.toInference(),
             ImmutableNodes.leafNode(YANG_LIBRARY_VERSION, YANG_LIBRARY_REVISION));
     }
 }
index 91a3286350d066b653bffcf8cd60aa8b3769ea77..5e94ad25e9a6de4cba45e71cca97baeb0cf57b21 100644 (file)
@@ -188,7 +188,7 @@ public final class RestconfInvokeOperationsServiceImpl {
                 if (resultData == null || resultData.isEmpty()) {
                     ar.resume(new WebApplicationException(Status.NO_CONTENT));
                 } else {
-                    ar.resume(NormalizedNodePayload.of(context, resultData));
+                    ar.resume(NormalizedNodePayload.of(context.inference(), resultData));
                 }
             }
 
index a5cc4274ad2655821b908607289563930585f7e4..75ff3437d6f5bc1f3dca2a155f2f88fb6721ad35 100644 (file)
@@ -16,7 +16,6 @@ import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.nb.rfc8040.NotificationQueryParams;
 import org.opendaylight.restconf.nb.rfc8040.databind.DatabindProvider;
 import org.opendaylight.restconf.nb.rfc8040.databind.jaxrs.QueryParams;
-import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
 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;
@@ -24,8 +23,7 @@ import org.opendaylight.restconf.nb.rfc8040.streams.StreamsConfiguration;
 import org.opendaylight.yang.gen.v1.subscribe.to.notification.rev161028.Notifi;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,21 +72,11 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu
 
         // prepare node with value of location
         return NormalizedNodePayload.ofLocation(
-            prepareIIDSubsStreamOutput(handlersHolder.getDatabindProvider().currentContext().modelContext()),
+            Inference.ofDataTreePath(handlersHolder.getDatabindProvider().currentContext().modelContext(),
+                Notifi.QNAME, LOCATION_QNAME),
             LOCATION_NODEID, response);
     }
 
-    /**
-     * Prepare InstanceIdentifierContext for Location leaf.
-     *
-     * @param schemaHandler Schema context handler.
-     * @return InstanceIdentifier of Location leaf.
-     */
-    private static InstanceIdentifierContext prepareIIDSubsStreamOutput(final EffectiveModelContext modelContext) {
-        return InstanceIdentifierContext.ofStack(
-            SchemaInferenceStack.ofDataTreePath(modelContext, Notifi.QNAME, LOCATION_QNAME));
-    }
-
     /**
      * Holder of all handlers for notifications.
      */
index 7656fd2028caaed6a26e7fcbccfbd5943667e468..c987d9351902d301184ee7315d7bb3b4a18621ce 100644 (file)
@@ -18,13 +18,13 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.restconf.nb.rfc8040.AbstractInstanceIdentifierTest;
-import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
 import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class XmlNormalizedNodeBodyWriterTest extends AbstractInstanceIdentifierTest {
@@ -32,14 +32,14 @@ public class XmlNormalizedNodeBodyWriterTest extends AbstractInstanceIdentifierT
     public void testWriteEmptyRootContainer() throws IOException {
         final EffectiveModelContext schemaContext = mock(EffectiveModelContext.class);
 
-        final NormalizedNodePayload nodePayload = NormalizedNodePayload.of(
-            InstanceIdentifierContext.ofLocalRoot(schemaContext),
+        final NormalizedNodePayload nodePayload = NormalizedNodePayload.of(Inference.ofDataTreePath(schemaContext),
             Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(SchemaContext.NAME)).build());
 
         final ByteArrayOutputStream output = new ByteArrayOutputStream();
         final XmlNormalizedNodeBodyWriter xmlWriter = new XmlNormalizedNodeBodyWriter();
         xmlWriter.writeTo(nodePayload, null, null, null, MediaType.APPLICATION_XML_TYPE, null, output);
 
+        // FIXME: NETCONF-855: this is wrong, the namespace should be 'urn:ietf:params:xml:ns:yang:ietf-restconf'
         assertEquals("<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"></data>",
             output.toString(StandardCharsets.UTF_8));
     }
@@ -47,7 +47,7 @@ public class XmlNormalizedNodeBodyWriterTest extends AbstractInstanceIdentifierT
     @Test
     public void testRootContainerWrite() throws IOException {
         final NormalizedNodePayload nodePayload = NormalizedNodePayload.of(
-            InstanceIdentifierContext.ofLocalRoot(IID_SCHEMA),
+            Inference.ofDataTreePath(IID_SCHEMA),
             Builders.containerBuilder()
                 .withNodeIdentifier(new NodeIdentifier(SchemaContext.NAME))
                 .withChild(Builders.containerBuilder()