Remove SchemaNode#getPath from NormalizedNodeJsonBodyWriter 73/99673/12
authorOleksandrZharov <Oleksandr.Zharov@pantheon.tech>
Wed, 9 Feb 2022 16:42:32 +0000 (17:42 +0100)
committerTomas Cere <tomas.cere@pantheon.tech>
Tue, 8 Mar 2022 16:52:16 +0000 (16:52 +0000)
Removed deprecated SchemaNode#getPath from NormalizedNodeJsonBodyWriter
class by using getQName and Absolute#of path.

Now we rely on YangInstanceIdentifier of target resource thus we need
to create QNames for Modules and Streams in RestconfImpl.

JIRA: NETCONF-818
Change-Id: I2d4f95540fc6ddc66233029dcdb1000ccbcd3524
Signed-off-by: OleksandrZharov <Oleksandr.Zharov@pantheon.tech>
Signed-off-by: Ivan Hrasko <ivan.hrasko@pantheon.tech>
restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/api/Draft02.java
restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeJsonBodyWriter.java
restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/RestconfImpl.java

index d36cad9ab9aff471986010cd06297a5fb8315f08..f5eba017cc605cdb02894610fba9d0c5219b3ef5 100644 (file)
@@ -56,6 +56,14 @@ public class Draft02 {
         QName IETF_RESTCONF_QNAME = QName.create(Draft02.RestConfModule.NAMESPACE, Draft02.RestConfModule.REVISION,
                 Draft02.RestConfModule.NAME);
 
+        QName MODULES_CONTAINER_QNAME = QName.create(IETF_RESTCONF_QNAME, MODULES_CONTAINER_SCHEMA_NODE);
+
+        QName MODULE_LIST_QNAME = QName.create(IETF_RESTCONF_QNAME, MODULE_LIST_SCHEMA_NODE);
+
+        QName STREAMS_CONTAINER_QNAME = QName.create(IETF_RESTCONF_QNAME, STREAMS_CONTAINER_SCHEMA_NODE);
+
+        QName STREAM_LIST_QNAME = QName.create(IETF_RESTCONF_QNAME, STREAM_LIST_SCHEMA_NODE);
+
         QName ERRORS_CONTAINER_QNAME = QName.create(IETF_RESTCONF_QNAME, ERRORS_CONTAINER_SCHEMA_NODE);
 
         QName ERROR_LIST_QNAME = QName.create(IETF_RESTCONF_QNAME, ERROR_LIST_SCHEMA_NODE);
index f70768d11ddae798da93bde4e2489deb873e3c9c..2db0b65df306936e11ee30a1254fb9ae7893be2f 100644 (file)
@@ -15,7 +15,9 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
+import java.util.List;
 import java.util.Map.Entry;
+import java.util.stream.Collectors;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
@@ -29,7 +31,10 @@ import org.opendaylight.netconf.sal.rest.api.RestconfNormalizedNodeWriter;
 import org.opendaylight.netconf.sal.rest.api.RestconfService;
 import org.opendaylight.netconf.util.NetconfUtil;
 import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
+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.DOMSourceAnyxmlNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
@@ -46,6 +51,7 @@ import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 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.xml.sax.SAXException;
 
 /**
@@ -106,21 +112,20 @@ public class NormalizedNodeJsonBodyWriter implements MessageBodyWriter<Normalize
     private static void writeNormalizedNode(final JsonWriter jsonWriter,
             final InstanceIdentifierContext<SchemaNode> context, NormalizedNode data,
             final @Nullable Integer depth) throws IOException {
-        SchemaPath path = context.getSchemaNode().getPath();
         final RestconfNormalizedNodeWriter nnWriter;
-        if (SchemaPath.ROOT.equals(path)) {
+        if (context.getSchemaNode() instanceof SchemaContext) {
             /*
              *  Creates writer without initialNs and we write children of root data container
              *  which is not visible in restconf
              */
-            nnWriter = createNormalizedNodeWriter(context, path, jsonWriter, depth);
+            nnWriter = createNormalizedNodeWriter(context, SchemaPath.ROOT, jsonWriter, depth);
             if (data instanceof ContainerNode) {
-                writeChildren(nnWriter,(ContainerNode) data);
+                writeChildren(nnWriter, (ContainerNode) data);
             } else if (data instanceof DOMSourceAnyxmlNode) {
                 try {
                     writeChildren(nnWriter,
                             (ContainerNode) NetconfUtil.transformDOMSourceToNormalizedNode(
-                                    context.getSchemaContext(), ((DOMSourceAnyxmlNode)data).body()).getResult());
+                                    context.getSchemaContext(), ((DOMSourceAnyxmlNode) data).body()).getResult());
                 } catch (XMLStreamException | URISyntaxException | SAXException e) {
                     throw new IOException("Cannot write anyxml.", e);
                 }
@@ -130,19 +135,25 @@ public class NormalizedNodeJsonBodyWriter implements MessageBodyWriter<Normalize
              *  RpcDefinition is not supported as initial codec in JSONStreamWriter,
              *  so we need to emit initial output declaratation..
              */
-            path = ((RpcDefinition) context.getSchemaNode()).getOutput().getPath();
+            final RpcDefinition rpc = (RpcDefinition) context.getSchemaNode();
+            final SchemaPath path = SchemaPath.of(Absolute.of(rpc.getQName(), rpc.getOutput().getQName()));
             nnWriter = createNormalizedNodeWriter(context, path, jsonWriter, depth);
             jsonWriter.name("output");
             jsonWriter.beginObject();
             writeChildren(nnWriter, (ContainerNode) data);
             jsonWriter.endObject();
         } else {
-            path = path.getParent();
+            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());
+            final SchemaPath path = SchemaPath.of(Absolute.of(qnames)).getParent();
 
             if (data instanceof MapEntryNode) {
                 data = ImmutableNodes.mapNodeBuilder(data.getIdentifier().getNodeType())
-                    .withChild((MapEntryNode) data)
-                    .build();
+                        .withChild((MapEntryNode) data)
+                        .build();
             }
             nnWriter = createNormalizedNodeWriter(context, path, jsonWriter, depth);
             nnWriter.write(data);
index 7ee506bde95585a9d9e7c9c10f7991c8491068dc..e0f4dd82b4e4e7ef2e8cd379b1f07a4b0339c68b 100644 (file)
@@ -11,6 +11,9 @@ import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
+import static org.opendaylight.netconf.sal.rest.api.Draft02.RestConfModule.MODULES_CONTAINER_QNAME;
+import static org.opendaylight.netconf.sal.rest.api.Draft02.RestConfModule.MODULE_LIST_QNAME;
+import static org.opendaylight.netconf.sal.rest.api.Draft02.RestConfModule.STREAMS_CONTAINER_QNAME;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Predicates;
@@ -66,7 +69,7 @@ import org.opendaylight.mdsal.dom.api.DOMRpcResult;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
-import org.opendaylight.netconf.sal.rest.api.Draft02;
+import org.opendaylight.netconf.sal.rest.api.Draft02.RestConfModule;
 import org.opendaylight.netconf.sal.rest.api.RestconfService;
 import org.opendaylight.netconf.sal.rest.impl.NormalizedNodeContext;
 import org.opendaylight.netconf.sal.streams.listeners.ListenerAdapter;
@@ -186,6 +189,23 @@ public final class RestconfImpl implements RestconfService {
             .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)
             .appendOffset("+HH:MM", "Z").toFormatter();
 
+    private static final YangInstanceIdentifier MODULES = YangInstanceIdentifier.builder()
+            .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+            .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+            .node(MODULES_CONTAINER_QNAME)
+            .build();
+    private static final YangInstanceIdentifier MODULE = YangInstanceIdentifier.builder()
+            .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+            .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+            .node(MODULES_CONTAINER_QNAME)
+            .node(MODULE_LIST_QNAME)
+            .build();
+    private static final YangInstanceIdentifier STREAMS = YangInstanceIdentifier.builder()
+            .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+            .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+            .node(STREAMS_CONTAINER_QNAME)
+            .build();
+
     private final BrokerFacade broker;
 
     private final ControllerContext controllerContext;
@@ -215,15 +235,15 @@ public final class RestconfImpl implements RestconfService {
 
         final Module restconfModule = getRestconfModule();
         final DataSchemaNode modulesSchemaNode = controllerContext.getRestconfModuleRestConfSchemaNode(
-                restconfModule, Draft02.RestConfModule.MODULES_CONTAINER_SCHEMA_NODE);
+                restconfModule, RestConfModule.MODULES_CONTAINER_SCHEMA_NODE);
         checkState(modulesSchemaNode instanceof ContainerSchemaNode);
 
         final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> moduleContainerBuilder =
                 SchemaAwareBuilders.containerBuilder((ContainerSchemaNode) modulesSchemaNode);
         moduleContainerBuilder.withChild(allModuleMap);
 
-        return new NormalizedNodeContext(new InstanceIdentifierContext<>(null, modulesSchemaNode, null, schemaContext),
-                moduleContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
+        return new NormalizedNodeContext(new InstanceIdentifierContext<>(MODULES, modulesSchemaNode, null,
+                schemaContext), moduleContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
     }
 
     /**
@@ -246,7 +266,7 @@ public final class RestconfImpl implements RestconfService {
 
         final Module restconfModule = getRestconfModule();
         final DataSchemaNode modulesSchemaNode = controllerContext.getRestconfModuleRestConfSchemaNode(
-                restconfModule, Draft02.RestConfModule.MODULES_CONTAINER_SCHEMA_NODE);
+                restconfModule, RestConfModule.MODULES_CONTAINER_SCHEMA_NODE);
         checkState(modulesSchemaNode instanceof ContainerSchemaNode);
 
         final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> moduleContainerBuilder =
@@ -254,7 +274,7 @@ public final class RestconfImpl implements RestconfService {
         moduleContainerBuilder.withChild(mountPointModulesMap);
 
         return new NormalizedNodeContext(
-                new InstanceIdentifierContext<>(null, modulesSchemaNode, mountPoint,
+                new InstanceIdentifierContext<>(MODULES, modulesSchemaNode, mountPoint,
                         controllerContext.getGlobalSchema()),
                 moduleContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
     }
@@ -289,11 +309,11 @@ public final class RestconfImpl implements RestconfService {
         final MapNode moduleMap = makeModuleMapNode(modules);
 
         final DataSchemaNode moduleSchemaNode = controllerContext
-                .getRestconfModuleRestConfSchemaNode(restconfModule, Draft02.RestConfModule.MODULE_LIST_SCHEMA_NODE);
+                .getRestconfModuleRestConfSchemaNode(restconfModule, RestConfModule.MODULE_LIST_SCHEMA_NODE);
         checkState(moduleSchemaNode instanceof ListSchemaNode);
 
         return new NormalizedNodeContext(
-                new InstanceIdentifierContext<>(null, moduleSchemaNode, mountPoint, schemaContext), moduleMap,
+                new InstanceIdentifierContext<>(MODULE, moduleSchemaNode, mountPoint, schemaContext), moduleMap,
                 QueryParametersParser.parseWriterParameters(uriInfo));
     }
 
@@ -304,7 +324,7 @@ public final class RestconfImpl implements RestconfService {
         final Set<String> availableStreams = Notificator.getStreamNames();
         final Module restconfModule = getRestconfModule();
         final DataSchemaNode streamSchemaNode = controllerContext
-                .getRestconfModuleRestConfSchemaNode(restconfModule, Draft02.RestConfModule.STREAM_LIST_SCHEMA_NODE);
+                .getRestconfModuleRestConfSchemaNode(restconfModule, RestConfModule.STREAM_LIST_SCHEMA_NODE);
         checkState(streamSchemaNode instanceof ListSchemaNode);
 
         final CollectionNodeBuilder<MapEntryNode, SystemMapNode> listStreamsBuilder =
@@ -315,7 +335,7 @@ public final class RestconfImpl implements RestconfService {
         }
 
         final DataSchemaNode streamsContainerSchemaNode = controllerContext.getRestconfModuleRestConfSchemaNode(
-                restconfModule, Draft02.RestConfModule.STREAMS_CONTAINER_SCHEMA_NODE);
+                restconfModule, RestConfModule.STREAMS_CONTAINER_SCHEMA_NODE);
         checkState(streamsContainerSchemaNode instanceof ContainerSchemaNode);
 
         final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> streamsContainerBuilder =
@@ -323,7 +343,7 @@ public final class RestconfImpl implements RestconfService {
         streamsContainerBuilder.withChild(listStreamsBuilder.build());
 
         return new NormalizedNodeContext(
-                new InstanceIdentifierContext<>(null, streamsContainerSchemaNode, null, schemaContext),
+                new InstanceIdentifierContext<>(STREAMS, streamsContainerSchemaNode, null, schemaContext),
                 streamsContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
     }
 
@@ -1389,7 +1409,7 @@ public final class RestconfImpl implements RestconfService {
         requireNonNull(modules);
         final Module restconfModule = getRestconfModule();
         final DataSchemaNode moduleSchemaNode = controllerContext
-                .getRestconfModuleRestConfSchemaNode(restconfModule, Draft02.RestConfModule.MODULE_LIST_SCHEMA_NODE);
+                .getRestconfModuleRestConfSchemaNode(restconfModule, RestConfModule.MODULE_LIST_SCHEMA_NODE);
         checkState(moduleSchemaNode instanceof ListSchemaNode);
 
         final CollectionNodeBuilder<MapEntryNode, SystemMapNode> listModuleBuilder =