Remove SchemaNode#getPath from JSON writer in rfc8040 53/99753/5
authorOleksandrZharov <Oleksandr.Zharov@pantheon.tech>
Tue, 15 Feb 2022 10:40:18 +0000 (11:40 +0100)
committerTomas Cere <tomas.cere@pantheon.tech>
Fri, 4 Mar 2022 10:15:35 +0000 (10:15 +0000)
Removed deprecated SchemaNode#getPath from JsonNormalizedNodeBodyWriter
class by replacing it with path created from QNames via Absolute#of
method.

JIRA: NETCONF-818
Change-Id: I93a2f6121d8635f5046b18c02624fb1f386e75eb
Signed-off-by: OleksandrZharov <Oleksandr.Zharov@pantheon.tech>
Signed-off-by: Ivan Hrasko <ivan.hrasko@pantheon.tech>
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/JsonNormalizedNodeBodyWriter.java

index 15c4a829a13240b4565e9676062b06f6a5dffaf5..c54a63023d70bc2cce79d9996fa8ed69612afbac 100644 (file)
@@ -17,6 +17,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
@@ -29,6 +30,8 @@ import org.opendaylight.restconf.nb.rfc8040.jersey.providers.api.RestconfNormali
 import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.XMLNamespace;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
@@ -44,6 +47,8 @@ import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
 @Provider
 @Produces({ MediaTypes.APPLICATION_YANG_DATA_JSON, MediaType.APPLICATION_JSON })
@@ -66,7 +71,12 @@ public class JsonNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrit
         @SuppressWarnings("unchecked")
         final InstanceIdentifierContext<SchemaNode> identifierCtx =
                 (InstanceIdentifierContext<SchemaNode>) context.getInstanceIdentifierContext();
-        final SchemaPath path = identifierCtx.getSchemaNode().getPath();
+        final SchemaInferenceStack stack = SchemaInferenceStack.of(identifierCtx.getSchemaContext());
+        identifierCtx.getInstanceIdentifier().getPathArguments().stream()
+                .filter(arg -> !(arg instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates))
+                .filter(arg -> !(arg instanceof YangInstanceIdentifier.AugmentationIdentifier))
+                .forEach(p -> stack.enterSchemaTree(p.getNodeType()));
+        final SchemaPath path = stack.toSchemaPath();
         final var pretty = context.getWriterParameters().prettyPrint();
 
         try (JsonWriter jsonWriter = createJsonWriter(entityStream, pretty == null ? false : pretty.value())) {
@@ -94,12 +104,9 @@ public class JsonNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrit
              *  RpcDefinition is not supported as initial codec in JSONStreamWriter,
              *  so we need to emit initial output declaration..
              */
-            nnWriter = createNormalizedNodeWriter(
-                    context,
-                    ((RpcDefinition) context.getSchemaNode()).getOutput().getPath(),
-                    jsonWriter,
-                    depth,
-                    fields);
+            final RpcDefinition rpc = (RpcDefinition) context.getSchemaNode();
+            final SchemaPath rpcPath = SchemaPath.of(Absolute.of(rpc.getQName(), rpc.getOutput().getQName()));
+            nnWriter = createNormalizedNodeWriter(context, rpcPath, jsonWriter, depth, fields);
             final Module module = context.getSchemaContext().findModule(data.getIdentifier().getNodeType().getModule())
                 .get();
             jsonWriter.name(module.getName() + ":output");
@@ -111,8 +118,16 @@ public class JsonNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrit
              *  ActionDefinition is not supported as initial codec in JSONStreamWriter,
              *  so we need to emit initial output declaration..
              */
-            nnWriter = createNormalizedNodeWriter(context,
-                ((ActionDefinition) context.getSchemaNode()).getOutput().getPath(), jsonWriter, depth, fields);
+            final ActionDefinition actDef = (ActionDefinition) context.getSchemaNode();
+            final List<QName> qNames = context.getInstanceIdentifier().getPathArguments().stream()
+                    .filter(arg -> !(arg instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates))
+                    .filter(arg -> !(arg instanceof YangInstanceIdentifier.AugmentationIdentifier))
+                    .map(PathArgument::getNodeType)
+                    .collect(Collectors.toList());
+            qNames.add(actDef.getQName());
+            qNames.add(actDef.getOutput().getQName());
+            final SchemaPath actPath = SchemaPath.of(Absolute.of(qNames));
+            nnWriter = createNormalizedNodeWriter(context, actPath, jsonWriter, depth, fields);
             final Module module = context.getSchemaContext().findModule(data.getIdentifier().getNodeType().getModule())
                 .get();
             jsonWriter.name(module.getName() + ":output");