From d8990ef41881d91b816e9a7ed430a3e18bf250e0 Mon Sep 17 00:00:00 2001 From: Ivan Hrasko Date: Wed, 9 Mar 2022 16:39:00 +0100 Subject: [PATCH] Eliminate use of SchemaNode.getPath() in YII deserializer Replace SchemaNode#getPath usage with Absolute path. JIRA: NETCONF-818 Change-Id: I5d1dab0013c81aa14bf6f4a5f07c53914af60436 Signed-off-by: Ivan Hrasko --- .../YangInstanceIdentifierDeserializer.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java index 743945ad7b..de0755e827 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java @@ -45,6 +45,7 @@ import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.IdentityEffectiveStatement; +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; @@ -113,9 +114,10 @@ public final class YangInstanceIdentifierDeserializer { if (step instanceof ListInstance) { final var values = ((ListInstance) step).keyValues(); final var schema = childNode.getDataSchemaNode(); + final var absolute = Absolute.of(parentNode.getIdentifier().getNodeType(), qname); pathArg = schema instanceof ListSchemaNode - ? prepareNodeWithPredicates(qname, (ListSchemaNode) schema, values) - : prepareNodeWithValue(qname, schema, values); + ? prepareNodeWithPredicates(qname, (ListSchemaNode) schema, absolute, values) + : prepareNodeWithValue(qname, schema, absolute, values); } else if (childNode != null) { RestconfDocumentedException.throwIf(childNode.isKeyedEntry(), ErrorType.PROTOCOL, ErrorTag.MISSING_ATTRIBUTE, @@ -135,7 +137,7 @@ public final class YangInstanceIdentifierDeserializer { } private NodeIdentifierWithPredicates prepareNodeWithPredicates(final QName qname, - final @NonNull ListSchemaNode schema, final List<@NonNull String> keyValues) { + final @NonNull ListSchemaNode schema, final Absolute absolute, final List<@NonNull String> keyValues) { final var keyDef = schema.getKeyDefinition(); final var keySize = keyDef.size(); final var varSize = keyValues.size(); @@ -148,14 +150,17 @@ public final class YangInstanceIdentifierDeserializer { final var values = ImmutableMap.builderWithExpectedSize(keySize); for (int i = 0; i < keySize; ++i) { final QName keyName = keyDef.get(i); - values.put(keyName, prepareValueByType(schema.getDataChildByName(keyName), keyValues.get(i))); + final List qNames = new ArrayList<>(absolute.getNodeIdentifiers()); + qNames.add(keyName); + final Absolute path = Absolute.of(qNames); + values.put(keyName, prepareValueByType(schema.getDataChildByName(keyName), path, keyValues.get(i))); } return NodeIdentifierWithPredicates.of(qname, values.build()); } - private Object prepareValueByType(final DataSchemaNode schemaNode, final @NonNull String value) { - + private Object prepareValueByType(final DataSchemaNode schemaNode, final Absolute absolute, + final @NonNull String value) { TypeDefinition> typedef; if (schemaNode instanceof LeafListSchemaNode) { typedef = ((LeafListSchemaNode) schemaNode).getType(); @@ -164,8 +169,7 @@ public final class YangInstanceIdentifierDeserializer { } final TypeDefinition baseType = RestUtil.resolveBaseTypeFrom(typedef); if (baseType instanceof LeafrefTypeDefinition) { - typedef = SchemaInferenceStack.ofInstantiatedPath(schemaContext, schemaNode.getPath()) - .resolveLeafref((LeafrefTypeDefinition) baseType); + typedef = SchemaInferenceStack.of(schemaContext, absolute).resolveLeafref((LeafrefTypeDefinition) baseType); } if (typedef instanceof IdentityrefTypeDefinition) { @@ -180,9 +184,9 @@ public final class YangInstanceIdentifierDeserializer { } private NodeWithValue prepareNodeWithValue(final QName qname, final DataSchemaNode schema, - final List keyValues) { + final Absolute absolute, final List keyValues) { // TODO: qname should be always equal to schema.getQName(), right? - return new NodeWithValue<>(qname, prepareValueByType(schema, + return new NodeWithValue<>(qname, prepareValueByType(schema, absolute, // FIXME: ahem: we probably want to do something differently here keyValues.get(0))); } -- 2.36.6