Revert "Do not parse YIID to put together a SchemaPath" 79/100179/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 21 Mar 2022 09:17:37 +0000 (10:17 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 21 Mar 2022 10:05:49 +0000 (11:05 +0100)
This reverts commit b792380644d076274abf500df3a0e1cb1aae1366. This is a
precondition to backing out an invalid patch.

Change-Id: Idb9a49e68d961c0e8c9c0be04286192ae2b9f75d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/context/InstanceIdentifierContext.java
restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java
restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/ControllerContext.java
restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/RestconfImpl.java

index e386d1c741b992a9c668637ac986dd23906be95f..526542ce2c5a61307880b51d9e762e4b4be92573 100644 (file)
@@ -7,33 +7,21 @@
  */
 package org.opendaylight.restconf.common.context;
 
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.dom.api.DOMMountPoint;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 
 public class InstanceIdentifierContext<T extends SchemaNode> {
 
     private final YangInstanceIdentifier instanceIdentifier;
-    private final @Nullable SchemaNodeIdentifier schemaNodeIdentifier;
     private final T schemaNode;
     private final DOMMountPoint mountPoint;
     private final EffectiveModelContext schemaContext;
 
-    public InstanceIdentifierContext(final YangInstanceIdentifier instanceIdentifier,
-                                     final T schemaNode, final DOMMountPoint mountPoint,
-                                     final EffectiveModelContext context) {
-        this(instanceIdentifier, null, schemaNode, mountPoint, context);
-    }
-
-    public InstanceIdentifierContext(final YangInstanceIdentifier instanceIdentifier,
-                                     final SchemaNodeIdentifier schemaNodeIdentifier,
-                                     final T schemaNode, final DOMMountPoint mountPoint,
-                                     final EffectiveModelContext context) {
+    public InstanceIdentifierContext(final YangInstanceIdentifier instanceIdentifier, final T schemaNode,
+            final DOMMountPoint mountPoint, final EffectiveModelContext context) {
         this.instanceIdentifier = instanceIdentifier;
-        this.schemaNodeIdentifier = schemaNodeIdentifier;
         this.schemaNode = schemaNode;
         this.mountPoint = mountPoint;
         this.schemaContext = context;
@@ -43,10 +31,6 @@ public class InstanceIdentifierContext<T extends SchemaNode> {
         return instanceIdentifier;
     }
 
-    public SchemaNodeIdentifier getSchemaNodeIdentifier() {
-        return schemaNodeIdentifier;
-    }
-
     public T getSchemaNode() {
         return schemaNode;
     }
index ca7f3b3451d55430a938b6c555d7ce56b80aeef3..1a8805c55e334ebe54b1cd68cfc331e47c0f9f03 100644 (file)
@@ -13,7 +13,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 javanet.staxutils.IndentingXMLStreamWriter;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
@@ -33,6 +35,8 @@ 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.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.MapEntryNode;
@@ -133,12 +137,12 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter<Normalized
             nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path, depth);
             writeElements(xmlWriter, nnWriter, (ContainerNode) data);
         } else {
-            final SchemaPath path;
-            if (pathContext.getSchemaNodeIdentifier() == null) {
-                path = SchemaPath.ROOT;
-            } else {
-                path = SchemaPath.of(pathContext.getSchemaNodeIdentifier()).getParent();
-            }
+            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)).getParent();
             nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path, depth);
             if (data instanceof MapEntryNode) {
                 // Restconf allows returning one list item. We need to wrap it
index 6632db8adc7b5d62775e2180ce3fb9a14553f05a..4ce6f060f5673ffb994ca9d7fbb58818f7b45279 100644 (file)
@@ -72,8 +72,6 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
@@ -168,7 +166,7 @@ public final class ControllerContext implements EffectiveModelContextListener, C
         checkPreconditions();
 
         if (restconfInstance == null) {
-            return new InstanceIdentifierContext<>(YangInstanceIdentifier.empty(), null, globalSchema, null,
+            return new InstanceIdentifierContext<>(YangInstanceIdentifier.empty(), globalSchema, null,
                     globalSchema);
         }
 
@@ -194,8 +192,7 @@ public final class ControllerContext implements EffectiveModelContextListener, C
         }
 
         final InstanceIdentifierContext<?> iiWithSchemaNode =
-                collectPathArguments(builder, pathArgs, new ArrayList<>(), latestModule.iterator().next(), null,
-                        toMountPointIdentifier);
+                collectPathArguments(builder, pathArgs, latestModule.iterator().next(), null, toMountPointIdentifier);
 
         if (iiWithSchemaNode == null) {
             throw new RestconfDocumentedException("URI has bad format", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
@@ -526,14 +523,10 @@ public final class ControllerContext implements EffectiveModelContextListener, C
         return object == null ? "" : URLEncoder.encode(codec.serialize(object).toString(), StandardCharsets.UTF_8);
     }
 
-    private SchemaNodeIdentifier schemaNodeIdentifierFromPath(final List<QName> qnames) {
-        return qnames.isEmpty() ? null : Absolute.of(qnames);
-    }
-
     @SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE", justification = "Unrecognised NullableDecl")
     private InstanceIdentifierContext<?> collectPathArguments(final InstanceIdentifierBuilder builder,
-            final List<String> strings, final List<QName> qnames, final DataNodeContainer parentNode,
-            final DOMMountPoint mountPoint, final boolean returnJustMountPoint) {
+            final List<String> strings, final DataNodeContainer parentNode, final DOMMountPoint mountPoint,
+            final boolean returnJustMountPoint) {
         requireNonNull(strings);
 
         if (parentNode == null) {
@@ -543,15 +536,14 @@ public final class ControllerContext implements EffectiveModelContextListener, C
         final EffectiveModelContext modelContext = mountPoint != null ? getModelContext(mountPoint) : globalSchema;
 
         if (strings.isEmpty()) {
-            return createContext(builder.build(), schemaNodeIdentifierFromPath(qnames), (DataSchemaNode) parentNode,
-                    mountPoint, modelContext);
+            return createContext(builder.build(), (DataSchemaNode) parentNode, mountPoint, modelContext);
         }
 
         final String head = strings.iterator().next();
 
         if (head.isEmpty()) {
             final List<String> remaining = strings.subList(1, strings.size());
-            return collectPathArguments(builder, remaining, qnames, parentNode, mountPoint, returnJustMountPoint);
+            return collectPathArguments(builder, remaining, parentNode, mountPoint, returnJustMountPoint);
         }
 
         final String nodeName = toNodeName(head);
@@ -587,8 +579,7 @@ public final class ControllerContext implements EffectiveModelContextListener, C
                 }
 
                 if (returnJustMountPoint || strings.size() == 1) {
-                    return new InstanceIdentifierContext<>(YangInstanceIdentifier.empty(), null,
-                            mountPointSchema, mount,
+                    return new InstanceIdentifierContext<>(YangInstanceIdentifier.empty(), mountPointSchema, mount,
                         mountPointSchema);
                 }
 
@@ -607,8 +598,8 @@ public final class ControllerContext implements EffectiveModelContextListener, C
                 }
 
                 final List<String> subList = strings.subList(1, strings.size());
-                return collectPathArguments(YangInstanceIdentifier.builder(), subList, new ArrayList<>(), it.next(),
-                        mount, returnJustMountPoint);
+                return collectPathArguments(YangInstanceIdentifier.builder(), subList, it.next(), mount,
+                        returnJustMountPoint);
             }
 
             Module module = null;
@@ -643,7 +634,7 @@ public final class ControllerContext implements EffectiveModelContextListener, C
                     rpc = getRpcDefinition(module, rpcName);
                 }
                 if (rpc != null) {
-                    return new InstanceIdentifierContext<>(builder.build(), null, rpc, mountPoint, modelContext);
+                    return new InstanceIdentifierContext<>(builder.build(), rpc, mountPoint, modelContext);
                 }
             }
 
@@ -720,23 +711,20 @@ public final class ControllerContext implements EffectiveModelContextListener, C
             builder.node(targetNode.getQName());
         }
 
-        qnames.add(targetNode.getQName());
-
         if (targetNode instanceof DataNodeContainer) {
             final List<String> remaining = strings.subList(consumed, strings.size());
-            return collectPathArguments(builder, remaining, qnames, (DataNodeContainer) targetNode, mountPoint,
+            return collectPathArguments(builder, remaining, (DataNodeContainer) targetNode, mountPoint,
                     returnJustMountPoint);
         }
 
-        return createContext(builder.build(), Absolute.of(qnames), targetNode, mountPoint, modelContext);
+        return createContext(builder.build(), targetNode, mountPoint, modelContext);
     }
 
     private static InstanceIdentifierContext<?> createContext(final YangInstanceIdentifier instance,
-            final SchemaNodeIdentifier schemaNodeIdentifier, final DataSchemaNode dataSchemaNode,
-            final DOMMountPoint mountPoint, final EffectiveModelContext schemaContext) {
+            final DataSchemaNode dataSchemaNode, final DOMMountPoint mountPoint,
+            final EffectiveModelContext schemaContext) {
         final YangInstanceIdentifier instanceIdentifier = new DataNormalizer(schemaContext).toNormalized(instance);
-        return new InstanceIdentifierContext<>(instanceIdentifier, schemaNodeIdentifier, dataSchemaNode, mountPoint,
-                schemaContext);
+        return new InstanceIdentifierContext<>(instanceIdentifier, dataSchemaNode, mountPoint, schemaContext);
     }
 
     public static DataSchemaNode findInstanceDataChildByNameAndNamespace(final DataNodeContainer container,
index 9c7f564455bd063ec1ea2fc2b9ba2c167bf8e415..1a7fd9fc5e91f33d0fef5a5a564dad736c015bc9 100644 (file)
@@ -131,7 +131,6 @@ 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;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -191,32 +190,23 @@ public final class RestconfImpl implements RestconfService {
             .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)
             .appendOffset("+HH:MM", "Z").toFormatter();
 
-    private static final @NonNull QName RESTCONF = QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf");
-
     private static final YangInstanceIdentifier MODULES = YangInstanceIdentifier.builder()
-            .node(RESTCONF)
-            .node(RESTCONF)
+            .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(RESTCONF)
-            .node(RESTCONF)
+            .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(RESTCONF)
-            .node(RESTCONF)
+            .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+            .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
             .node(STREAMS_CONTAINER_QNAME)
             .build();
 
-    private static final SchemaNodeIdentifier MODULES_SCHEMA_IDENTIFIER =
-            Absolute.of(RESTCONF, RESTCONF, MODULES_CONTAINER_QNAME);
-    private static final SchemaNodeIdentifier MODULE_SCHEMA_IDENTIFIER =
-            Absolute.of(RESTCONF, RESTCONF, MODULES_CONTAINER_QNAME, MODULE_LIST_QNAME);
-    private static final SchemaNodeIdentifier STREAMS_SCHEMA_IDENTIFIER =
-            Absolute.of(RESTCONF, RESTCONF, STREAMS_CONTAINER_QNAME);
-
     private final BrokerFacade broker;
 
     private final ControllerContext controllerContext;
@@ -253,9 +243,8 @@ public final class RestconfImpl implements RestconfService {
                 SchemaAwareBuilders.containerBuilder((ContainerSchemaNode) modulesSchemaNode);
         moduleContainerBuilder.withChild(allModuleMap);
 
-        return new NormalizedNodeContext(new InstanceIdentifierContext<>(MODULES, MODULES_SCHEMA_IDENTIFIER,
-                modulesSchemaNode, null, schemaContext), moduleContainerBuilder.build(),
-                QueryParametersParser.parseWriterParameters(uriInfo));
+        return new NormalizedNodeContext(new InstanceIdentifierContext<>(MODULES, modulesSchemaNode, null,
+                schemaContext), moduleContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
     }
 
     /**
@@ -286,7 +275,7 @@ public final class RestconfImpl implements RestconfService {
         moduleContainerBuilder.withChild(mountPointModulesMap);
 
         return new NormalizedNodeContext(
-                new InstanceIdentifierContext<>(MODULES, MODULES_SCHEMA_IDENTIFIER, modulesSchemaNode, mountPoint,
+                new InstanceIdentifierContext<>(MODULES, modulesSchemaNode, mountPoint,
                         controllerContext.getGlobalSchema()),
                 moduleContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
     }
@@ -325,8 +314,7 @@ public final class RestconfImpl implements RestconfService {
         checkState(moduleSchemaNode instanceof ListSchemaNode);
 
         return new NormalizedNodeContext(
-                new InstanceIdentifierContext<>(MODULE, MODULE_SCHEMA_IDENTIFIER, moduleSchemaNode, mountPoint,
-                        schemaContext), moduleMap,
+                new InstanceIdentifierContext<>(MODULE, moduleSchemaNode, mountPoint, schemaContext), moduleMap,
                 QueryParametersParser.parseWriterParameters(uriInfo));
     }
 
@@ -356,8 +344,7 @@ public final class RestconfImpl implements RestconfService {
         streamsContainerBuilder.withChild(listStreamsBuilder.build());
 
         return new NormalizedNodeContext(
-                new InstanceIdentifierContext<>(STREAMS, STREAMS_SCHEMA_IDENTIFIER, streamsContainerSchemaNode,
-                        null, schemaContext),
+                new InstanceIdentifierContext<>(STREAMS, streamsContainerSchemaNode, null, schemaContext),
                 streamsContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
     }