From b7b239044f2e6879d1641aa793067c6d4355d879 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 10 May 2022 08:01:21 +0200 Subject: [PATCH] Fix nested augmentations When we are entering an augmentation, we need to look at the effective instantiation. For DataNodeContainers that means using EffectiveAugmentationSchema to get the correct filter, for choices we do not have a utility, so just retain the same parent. JIRA: YANGTOOLS-1433 Change-Id: I0aa36499a5bcf6088be5b49b79d202f8985f5eca Signed-off-by: Robert Varga (cherry picked from commit d79a5579918d5110599bdcc225c927c0225a177f) --- data/yang-data-api/pom.xml | 4 + .../src/main/java/module-info.java | 1 + .../stream/YangInstanceIdentifierWriter.java | 12 ++- .../data/api/schema/stream/YT1433Test.java | 89 +++++++++++++++++++ .../src/test/resources/YT1433/bar.yang | 14 +++ .../src/test/resources/YT1433/foo.yang | 14 +++ 6 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 data/yang-data-api/src/test/java/org/opendaylight/yangtools/yang/data/api/schema/stream/YT1433Test.java create mode 100644 data/yang-data-api/src/test/resources/YT1433/bar.yang create mode 100644 data/yang-data-api/src/test/resources/YT1433/foo.yang diff --git a/data/yang-data-api/pom.xml b/data/yang-data-api/pom.xml index 8e19b31c3f..4671610568 100644 --- a/data/yang-data-api/pom.xml +++ b/data/yang-data-api/pom.xml @@ -42,6 +42,10 @@ org.opendaylight.yangtools yang-model-api + + org.opendaylight.yangtools + yang-model-util + org.immutables value diff --git a/data/yang-data-api/src/main/java/module-info.java b/data/yang-data-api/src/main/java/module-info.java index 55f01a1fa2..1c8c7cd8b5 100644 --- a/data/yang-data-api/src/main/java/module-info.java +++ b/data/yang-data-api/src/main/java/module-info.java @@ -19,6 +19,7 @@ module org.opendaylight.yangtools.yang.data.api { requires transitive org.opendaylight.yangtools.util; requires transitive org.opendaylight.yangtools.yang.common; requires transitive org.opendaylight.yangtools.yang.model.api; + requires org.opendaylight.yangtools.yang.model.util; requires org.slf4j; // Annotations diff --git a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/YangInstanceIdentifierWriter.java b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/YangInstanceIdentifierWriter.java index 03588ede79..40fad15103 100644 --- a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/YangInstanceIdentifierWriter.java +++ b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/YangInstanceIdentifierWriter.java @@ -37,6 +37,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.util.EffectiveAugmentationSchema; /** * Utility for emitting a {@link YangInstanceIdentifier} into a {@link NormalizedNodeStreamWriter} as a set of @@ -97,14 +98,21 @@ public final class YangInstanceIdentifierWriter implements AutoCloseable { final var arg = it.next(); if (arg instanceof AugmentationIdentifier) { if (!(parent instanceof AugmentationTarget)) { - throw new IOException(parent + " does not support augmentations, cannot resolve" + arg); + throw new IOException(parent + " does not support augmentations, cannot resolve " + arg); } if (reuse) { throw new IOException(parent + " is expecting a nested item, cannot resolve " + arg); } final var augId = (AugmentationIdentifier) arg; - parent = enterAugmentation((AugmentationTarget) parent, augId); + if (parent instanceof DataNodeContainer) { + parent = new EffectiveAugmentationSchema(enterAugmentation((AugmentationTarget) parent, augId), + (DataNodeContainer) parent); + } else if (parent instanceof ChoiceSchemaNode) { + throw new IOException(parent + " should not use addressing through " + arg); + } else { + throw new IOException("Unhandled parent " + parent + " while resolving " + arg); + } writer.startAugmentationNode(augId); } else if (arg instanceof NodeWithValue) { if (!(parent instanceof LeafListSchemaNode)) { diff --git a/data/yang-data-api/src/test/java/org/opendaylight/yangtools/yang/data/api/schema/stream/YT1433Test.java b/data/yang-data-api/src/test/java/org/opendaylight/yangtools/yang/data/api/schema/stream/YT1433Test.java new file mode 100644 index 0000000000..6bc5b5da6b --- /dev/null +++ b/data/yang-data-api/src/test/java/org/opendaylight/yangtools/yang/data/api/schema/stream/YT1433Test.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.data.api.schema.stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.util.Set; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; + +public class YT1433Test { + private static EffectiveModelContext CONTEXT; + + @BeforeAll + public static void beforeAll() { + CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/YT1433"); + } + + @Test + public void testContainerAugmentContainer() throws IOException { + final FormattingNormalizedNodeStreamWriter streamWriter = new FormattingNormalizedNodeStreamWriter(); + + final QName bar = QName.create("foo", "bar"); + final QName baz = QName.create("foo", "baz"); + + final YangInstanceIdentifier path = YangInstanceIdentifier.builder() + .node(QName.create("foo", "foo")) + .node(AugmentationIdentifier.create(Set.of(bar))) + .node(bar) + .node(AugmentationIdentifier.create(Set.of(baz))) + .node(baz) + .build(); + + try (var iidWriter = YangInstanceIdentifierWriter.open(streamWriter, CONTEXT, path)) { + try (var nnWriter = new NormalizedNodeWriter(streamWriter)) { + // No-op + } + } + + assertEquals("(foo)foo(container)\n" + + " AugmentationIdentifier{childNames=[(foo)bar]}(augmentation)\n" + + " (foo)bar(container)\n" + + " AugmentationIdentifier{childNames=[(foo)baz]}(augmentation)\n" + + " (foo)baz(container)\n" + + " (end)\n" + + " (end)\n" + + " (end)\n" + + " (end)\n" + + "(end)\n", streamWriter.result()); + } + + @Test + public void testChoiceAugmentCointainer() throws IOException { + final FormattingNormalizedNodeStreamWriter streamWriter = new FormattingNormalizedNodeStreamWriter(); + + final QName bar = QName.create("bar", "bar"); + final QName baz = QName.create("bar", "baz"); + + final YangInstanceIdentifier path = YangInstanceIdentifier.builder() + .node(QName.create("bar", "foo")) + .node(bar) + .node(baz) + .build(); + + try (var iidWriter = YangInstanceIdentifierWriter.open(streamWriter, CONTEXT, path)) { + try (var nnWriter = new NormalizedNodeWriter(streamWriter)) { + // No-op + } + } + + assertEquals("(bar)foo(choice)\n" + + " (bar)bar(container)\n" + + " (bar)baz(container)\n" + + " (end)\n" + + " (end)\n" + + "(end)\n", streamWriter.result()); + } +} diff --git a/data/yang-data-api/src/test/resources/YT1433/bar.yang b/data/yang-data-api/src/test/resources/YT1433/bar.yang new file mode 100644 index 0000000000..81ef6d5953 --- /dev/null +++ b/data/yang-data-api/src/test/resources/YT1433/bar.yang @@ -0,0 +1,14 @@ +module bar { + namespace bar; + prefix bar; + + choice foo; + + augment /foo { + container bar; + } + + augment /foo/bar/bar { + container baz; + } +} diff --git a/data/yang-data-api/src/test/resources/YT1433/foo.yang b/data/yang-data-api/src/test/resources/YT1433/foo.yang new file mode 100644 index 0000000000..129bc8be08 --- /dev/null +++ b/data/yang-data-api/src/test/resources/YT1433/foo.yang @@ -0,0 +1,14 @@ +module foo { + namespace foo; + prefix foo; + + container foo; + + augment /foo { + container bar; + } + + augment /foo/bar { + container baz; + } +} -- 2.36.6