From d21d2fe3c6e1784e6ec407b86c6eac75ba3bba66 Mon Sep 17 00:00:00 2001 From: OleksandrZharov Date: Tue, 15 Feb 2022 12:19:27 +0100 Subject: [PATCH] Remove SchemaNode#getPath from XML writer in rfc8040 Removed deprecated SchemaNode#getPath from XmlNormalizedNodeBodyWriter class by using getQName and Absolute#of path. JIRA: NETCONF-818 Change-Id: Ibb88ccce1a987bf4e6ea979edd74ca0d2179cd9c Signed-off-by: OleksandrZharov --- .../XmlNormalizedNodeBodyWriter.java | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/XmlNormalizedNodeBodyWriter.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/XmlNormalizedNodeBodyWriter.java index 81a1c17b26..b2dbc1f811 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/XmlNormalizedNodeBodyWriter.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/XmlNormalizedNodeBodyWriter.java @@ -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> 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 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 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); } -- 2.36.6