From: Robert Varga Date: Sun, 4 Nov 2018 20:24:28 +0000 (+0100) Subject: Tolerate empty instance identifier in ImmutableNodes.fromInstanceId() X-Git-Tag: v2.0.6.5~2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=5f061adec828ca39f7b0878141cf2f9eb58af322;p=yangtools.git Tolerate empty instance identifier in ImmutableNodes.fromInstanceId() If the user specifies an empty InstanceIdentifier, we fail with an undocumented NoSuchElementException. Make sure we properly handle this case by returning a container which matches SchemaContext.NAME. JIRA: YANGTOOLS-914 Change-Id: I0b503d3bed99d73d88e037d35979c503215f3b52 Signed-off-by: Robert Varga --- diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNodes.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNodes.java index 3a559b277c..754a87047b 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNodes.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNodes.java @@ -39,6 +39,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; public final class ImmutableNodes { + private static final NodeIdentifier SCHEMACONTEXT_NAME = NodeIdentifier.create(SchemaContext.NAME); private ImmutableNodes() { throw new UnsupportedOperationException("Utilities class should not be instantiated"); @@ -195,13 +196,20 @@ public final class ImmutableNodes { */ public static NormalizedNode fromInstanceId(final SchemaContext ctx, final YangInstanceIdentifier id, final Optional> deepestElement, final Optional> operation) { + final PathArgument topLevelElement; + final InstanceIdToNodes instanceIdToNodes; final Iterator it = id.getPathArguments().iterator(); - final PathArgument topLevelElement = it.next(); - final DataSchemaNode dataChildByName = ctx.getDataChildByName(topLevelElement.getNodeType()); - checkNotNull(dataChildByName, - "Cannot find %s node in schema context. Instance identifier has to start from root", topLevelElement); - final InstanceIdToNodes instanceIdToNodes = InstanceIdToNodes.fromSchemaAndQNameChecked(ctx, - topLevelElement.getNodeType()); + if (it.hasNext()) { + topLevelElement = it.next(); + final DataSchemaNode dataChildByName = ctx.getDataChildByName(topLevelElement.getNodeType()); + checkNotNull(dataChildByName, + "Cannot find %s node in schema context. Instance identifier has to start from root", topLevelElement); + instanceIdToNodes = InstanceIdToNodes.fromSchemaAndQNameChecked(ctx, topLevelElement.getNodeType()); + } else { + topLevelElement = SCHEMACONTEXT_NAME; + instanceIdToNodes = InstanceIdToNodes.fromDataSchemaNode(ctx); + } + return instanceIdToNodes.create(topLevelElement, it, deepestElement, operation); } } diff --git a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodesTest.java b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodesTest.java index 778a0945d1..ca75650f94 100644 --- a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodesTest.java +++ b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodesTest.java @@ -200,4 +200,10 @@ public class InstanceIdToNodesTest { YangInstanceIdentifier.create(rootContainer, leafList, leafListWithValue)); assertEquals(expectedFilter, filter); } + + @Test + public void testEmptyInstanceIdentifier() { + assertEquals(ImmutableNodes.containerNode(SchemaContext.NAME), + ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.EMPTY)); + } }