Remove SchemaNode#getPath from XML writer in rfc8040 56/99756/7
authorOleksandrZharov <Oleksandr.Zharov@pantheon.tech>
Tue, 15 Feb 2022 11:19:27 +0000 (12:19 +0100)
committerTomas Cere <tomas.cere@pantheon.tech>
Mon, 21 Feb 2022 11:40:52 +0000 (11:40 +0000)
Removed deprecated SchemaNode#getPath from XmlNormalizedNodeBodyWriter
class by using getQName and Absolute#of path.

JIRA: NETCONF-818
Change-Id: Ibb88ccce1a987bf4e6ea979edd74ca0d2179cd9c
Signed-off-by: OleksandrZharov <Oleksandr.Zharov@pantheon.tech>
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/XmlNormalizedNodeBodyWriter.java

index 81a1c17b26bce444568d25e7bb7aee6fe8a4727d..b2dbc1f8112091707410f7972afa21f9823b1fd9 100644 (file)
@@ -15,6 +15,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javanet.staxutils.IndentingXMLStreamWriter;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
@@ -32,6 +33,8 @@ import org.opendaylight.restconf.nb.rfc8040.MediaTypes;
 import org.opendaylight.restconf.nb.rfc8040.jersey.providers.api.RestconfNormalizedNodeWriter;
 import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
 import org.opendaylight.yangtools.yang.common.QName;
+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.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -41,6 +44,7 @@ import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 @Provider
 @Produces({ MediaTypes.APPLICATION_YANG_DATA_XML, MediaType.APPLICATION_XML, MediaType.TEXT_XML })
@@ -82,13 +86,12 @@ public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrite
             throw new IllegalStateException(e);
         }
         final NormalizedNode data = context.getData();
-        final SchemaPath schemaPath = pathContext.getSchemaNode().getPath();
 
-        writeNormalizedNode(xmlWriter, schemaPath, pathContext, data, context.getWriterParameters().depth(),
+        writeNormalizedNode(xmlWriter, pathContext, data, context.getWriterParameters().depth(),
                 context.getWriterParameters().fields());
     }
 
-    private static void writeNormalizedNode(final XMLStreamWriter xmlWriter, final SchemaPath path,
+    private static void writeNormalizedNode(final XMLStreamWriter xmlWriter,
             final InstanceIdentifierContext<?> pathContext, final NormalizedNode data, final DepthParam depth,
             final List<Set<QName>> fields) throws IOException {
         final RestconfNormalizedNodeWriter nnWriter;
@@ -99,26 +102,37 @@ public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrite
              *  RpcDefinition is not supported as initial codec in XMLStreamWriter,
              *  so we need to emit initial output declaration..
              */
-            nnWriter = createNormalizedNodeWriter(
-                    xmlWriter,
-                    schemaCtx,
-                    ((RpcDefinition) pathContext.getSchemaNode()).getOutput().getPath(),
-                    depth,
-                    fields);
+            final RpcDefinition rpc = (RpcDefinition) pathContext.getSchemaNode();
+            final SchemaPath rpcPath = SchemaPath.of(Absolute.of(rpc.getQName(), rpc.getOutput().getQName()));
+            nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, rpcPath, depth, fields);
             writeElements(xmlWriter, nnWriter, (ContainerNode) data);
         } else if (pathContext.getSchemaNode() instanceof ActionDefinition) {
             /*
              *  ActionDefinition is not supported as initial codec in XMLStreamWriter,
              *  so we need to emit initial output declaration..
              */
-            nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx,
-                ((ActionDefinition) pathContext.getSchemaNode()).getOutput().getPath(), depth, fields);
+            final ActionDefinition actDef = (ActionDefinition) pathContext.getSchemaNode();
+            final List<QName> qNames = pathContext.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(xmlWriter, schemaCtx, actPath, depth, fields);
             writeElements(xmlWriter, nnWriter, (ContainerNode) data);
         } else {
-            final boolean isRoot = SchemaPath.ROOT.equals(path);
+            final boolean isRoot = pathContext.getInstanceIdentifier().isEmpty();
             if (isRoot) {
-                nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path, depth, fields);
+                nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, SchemaPath.ROOT, depth, fields);
             } else {
+                final List<QName> qNames = pathContext.getInstanceIdentifier().getPathArguments().stream()
+                        .filter(arg -> !(arg instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates))
+                        .filter(arg -> !(arg instanceof YangInstanceIdentifier.AugmentationIdentifier))
+                        .map(PathArgument::getNodeType)
+                        .collect(Collectors.toList());
+                final SchemaPath path = SchemaPath.of(Absolute.of(qNames));
                 nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path.getParent(), depth, fields);
             }