InstanceIdentifierContext does not take generics
[netconf.git] / restconf / restconf-nb-bierman02 / src / main / java / org / opendaylight / netconf / sal / restconf / impl / ControllerContext.java
index 6632db8adc7b5d62775e2180ce3fb9a14553f05a..cc01ef9fe477410590be4a659429d6fdb701237e 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;
@@ -151,7 +149,7 @@ public final class ControllerContext implements EffectiveModelContextListener, C
         onModelContextUpdated(schemas);
     }
 
-    public InstanceIdentifierContext<?> toInstanceIdentifier(final String restconfInstance) {
+    public InstanceIdentifierContext toInstanceIdentifier(final String restconfInstance) {
         return toIdentifier(restconfInstance, false);
     }
 
@@ -159,17 +157,16 @@ public final class ControllerContext implements EffectiveModelContextListener, C
         return globalSchema;
     }
 
-    public InstanceIdentifierContext<?> toMountPointIdentifier(final String restconfInstance) {
+    public InstanceIdentifierContext toMountPointIdentifier(final String restconfInstance) {
         return toIdentifier(restconfInstance, true);
     }
 
-    private InstanceIdentifierContext<?> toIdentifier(final String restconfInstance,
-                                                      final boolean toMountPointIdentifier) {
+    private InstanceIdentifierContext toIdentifier(final String restconfInstance,
+                                                   final boolean toMountPointIdentifier) {
         checkPreconditions();
 
         if (restconfInstance == null) {
-            return new InstanceIdentifierContext<>(YangInstanceIdentifier.empty(), null, globalSchema, null,
-                    globalSchema);
+            return new InstanceIdentifierContext(YangInstanceIdentifier.empty(), globalSchema, null, globalSchema);
         }
 
         final List<String> pathArgs = urlPathArgsDecode(SLASH_SPLITTER.split(restconfInstance));
@@ -193,9 +190,8 @@ public final class ControllerContext implements EffectiveModelContextListener, C
                     ErrorType.PROTOCOL, ErrorTag.UNKNOWN_ELEMENT);
         }
 
-        final InstanceIdentifierContext<?> iiWithSchemaNode =
-                collectPathArguments(builder, pathArgs, new ArrayList<>(), latestModule.iterator().next(), null,
-                        toMountPointIdentifier);
+        final InstanceIdentifierContext iiWithSchemaNode =
+                collectPathArguments(builder, pathArgs, latestModule.iterator().next(), null, toMountPointIdentifier);
 
         if (iiWithSchemaNode == null) {
             throw new RestconfDocumentedException("URI has bad format", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
@@ -526,32 +522,26 @@ 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) {
+    private InstanceIdentifierContext collectPathArguments(final InstanceIdentifierBuilder builder,
+            final List<String> strings, final DataNodeContainer parentNode, final DOMMountPoint mountPoint,
+            final boolean returnJustMountPoint) {
         requireNonNull(strings);
 
         if (parentNode == null) {
             return null;
         }
 
-        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,
+                mountPoint != null ? getModelContext(mountPoint) : globalSchema);
         }
 
         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 +577,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 +596,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 +632,8 @@ 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,
+                            mountPoint != null ? getModelContext(mountPoint) : globalSchema);
                 }
             }
 
@@ -704,12 +694,7 @@ public final class ControllerContext implements EffectiveModelContextListener, C
                                 ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
                     }
 
-                    final SchemaInferenceStack stack = SchemaInferenceStack.of(modelContext);
-                    final YangInstanceIdentifier identifier = builder.build();
-                    identifier.getPathArguments().forEach(p -> stack.enterSchemaTree(p.getNodeType()));
-                    stack.enterSchemaTree(targetNode.getQName());
-                    stack.enterSchemaTree(key);
-                    addKeyValue(keyValues, listNode.getDataChildByName(key), uriKeyValue, mountPoint, stack);
+                    addKeyValue(keyValues, listNode.getDataChildByName(key), uriKeyValue, mountPoint);
                     index++;
                 }
             }
@@ -720,23 +705,21 @@ 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,
+            mountPoint != null ? getModelContext(mountPoint) : globalSchema);
     }
 
-    private static InstanceIdentifierContext<?> createContext(final YangInstanceIdentifier instance,
-            final SchemaNodeIdentifier schemaNodeIdentifier, final DataSchemaNode dataSchemaNode,
-            final DOMMountPoint mountPoint, final EffectiveModelContext schemaContext) {
+    private static InstanceIdentifierContext createContext(final YangInstanceIdentifier instance,
+            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,
@@ -786,21 +769,23 @@ public final class ControllerContext implements EffectiveModelContextListener, C
     }
 
     private void addKeyValue(final HashMap<QName, Object> map, final DataSchemaNode node, final String uriValue,
-            final DOMMountPoint mountPoint, final SchemaInferenceStack stack) {
+            final DOMMountPoint mountPoint) {
         checkArgument(node instanceof LeafSchemaNode);
 
+        final EffectiveModelContext schemaContext = mountPoint == null ? globalSchema : getModelContext(mountPoint);
         final String urlDecoded = urlPathArgDecode(requireNonNull(uriValue));
         TypeDefinition<?> typedef = ((LeafSchemaNode) node).getType();
         final TypeDefinition<?> baseType = RestUtil.resolveBaseTypeFrom(typedef);
         if (baseType instanceof LeafrefTypeDefinition) {
-            typedef = stack.resolveLeafref((LeafrefTypeDefinition) baseType);
+            typedef = SchemaInferenceStack.ofInstantiatedPath(schemaContext, node.getPath())
+                .resolveLeafref((LeafrefTypeDefinition) baseType);
         }
         final IllegalArgumentCodec<Object, Object> codec = RestCodec.from(typedef, mountPoint, this);
         Object decoded = codec.deserialize(urlDecoded);
         String additionalInfo = "";
         if (decoded == null) {
             if (typedef instanceof IdentityrefTypeDefinition) {
-                decoded = toQName(stack.getEffectiveModelContext(), urlDecoded);
+                decoded = toQName(schemaContext, urlDecoded);
                 additionalInfo =
                         "For key which is of type identityref it should be in format module_name:identity_name.";
             }