From 50ca4758b074b0a112c967d20fa2ba6c9c75d789 Mon Sep 17 00:00:00 2001 From: Jan Hajnar Date: Thu, 7 May 2015 17:09:37 +0200 Subject: [PATCH] Bug 3224 - Parsing data with choice in case via augmentation results in incorrect parsing * added tests for multiple choices from augmentation parsing for json, xml and bindinging aware context * modified json parsing tests * fixed choice augmentation resolution in ChoiceNodeCodecContext and CompositeNodeDataWithSchema * moved findCorrespondingAugment to SchemaUtils since it is useful for multiple Classes * replaced getNodeIdentifierForAugmentation code in SchemaUtils with the one from CompositeNodeDataWithSchema. Change-Id: Ibf57a771b92de14ecb70dcbbe250d7c559066882 Signed-off-by: Jan Hajnar (cherry picked from commit a8f512b80e661dac1ff85db6c16c72bfbf7f5891) --- .../codec/impl/ChoiceNodeCodecContext.java | 9 ++ ...ormalizedNodeSerializeDeserializeTest.java | 99 ++++++++++++++++--- .../opendaylight-yangtools-augment-test.yang | 34 +++++++ 3 files changed, 127 insertions(+), 15 deletions(-) diff --git a/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/ChoiceNodeCodecContext.java b/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/ChoiceNodeCodecContext.java index 5e015dbd9c..b9c44c8bbb 100644 --- a/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/ChoiceNodeCodecContext.java +++ b/code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/ChoiceNodeCodecContext.java @@ -26,6 +26,8 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; +import org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils; +import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -61,6 +63,13 @@ final class ChoiceNodeCodecContext extends DataContainerCo } // Updates collection of YANG instance identifier to case for (final DataSchemaNode cazeChild : cazeDef.getSchema().getChildNodes()) { + if (cazeChild.isAugmenting()) { + final AugmentationSchema augment = SchemaUtils.findCorrespondingAugment(cazeDef.getSchema(), cazeChild); + if (augment != null) { + byYangCaseChildBuilder.put(SchemaUtils.getNodeIdentifierForAugmentation(augment), cazeDef); + continue; + } + } byYangCaseChildBuilder.put(new NodeIdentifier(cazeChild.getQName()), cazeDef); } } else { diff --git a/code-generator/binding-data-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/NormalizedNodeSerializeDeserializeTest.java b/code-generator/binding-data-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/NormalizedNodeSerializeDeserializeTest.java index f223bfef28..e7af4ca9bc 100644 --- a/code-generator/binding-data-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/NormalizedNodeSerializeDeserializeTest.java +++ b/code-generator/binding-data-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/NormalizedNodeSerializeDeserializeTest.java @@ -7,12 +7,33 @@ */ package org.opendaylight.yangtools.binding.data.codec.test; +import static org.junit.Assert.assertEquals; +import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.top; +import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.topLevelList; +import static org.opendaylight.yangtools.yang.data.impl.schema.Builders.*; +import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode; +import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntry; +import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder; +import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder; +import com.google.common.collect.Sets; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import javassist.ClassPool; import org.junit.Before; import org.junit.Test; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.TopChoiceAugment1; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.TopChoiceAugment1Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.TopChoiceAugment2; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.TopChoiceAugment2Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.TreeComplexUsesAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.TreeLeafOnlyAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.TreeLeafOnlyAugmentBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.top.augment.choice1.Case1Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.top.augment.choice1.case1.augment.choice2.Case11Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.augment.rev140709.top.augment.choice1.case1.augment.choice2.case11.Case11ChoiceCaseContainerBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.binding.rev140701.ChoiceContainer; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.binding.rev140701.ChoiceContainerBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.binding.rev140701.Top; @@ -36,6 +57,9 @@ import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.impl.schema.Builders; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; @@ -44,20 +68,6 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLe import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static org.junit.Assert.assertEquals; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.top; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.topLevelList; -import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode; -import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntry; -import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder; -import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder; - public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingRuntimeTest{ public static final String TOP_LEVEL_LIST_FOO_KEY_VALUE = "foo"; @@ -168,7 +178,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingRunti .withChild(leafNode(SIMPLE_VALUE_QNAME, "simpleValue")) .build(); Map.Entry, DataObject> entry = registry.fromNormalizedNode(BI_TOP_LEVEL_LIST_FOO_PATH.node( - new YangInstanceIdentifier.AugmentationIdentifier(augmentationChildren)), augmentationNode); + new YangInstanceIdentifier.AugmentationIdentifier(augmentationChildren)), augmentationNode); assertEquals(new TreeLeafOnlyAugmentBuilder().setSimpleValue("simpleValue").build(), entry.getValue()); } @@ -274,4 +284,63 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingRunti TopLevelList topLevelList = new TopLevelListBuilder().setKey(TOP_LEVEL_LIST_FOO_KEY).setNestedList(nestedLists).build(); assertEquals(topLevelList, entry.getValue()); } + + @Test + public void augmentMultipleChoices() { + QName augmentChoice1QName = QName.create("urn:opendaylight:params:xml:ns:yang:yangtools:test:augment", + "2014-07-09", "augment-choice1"); + QName augmentChoice2QName = QName.create(augmentChoice1QName, "augment-choice2"); + final QName containerQName = QName.create(augmentChoice1QName, "case11-choice-case-container"); + final QName leafQName = QName.create(augmentChoice1QName, "case11-choice-case-leaf"); + + final YangInstanceIdentifier.AugmentationIdentifier aug1Id = + new YangInstanceIdentifier.AugmentationIdentifier(Sets.newHashSet(augmentChoice1QName)); + final YangInstanceIdentifier.AugmentationIdentifier aug2Id = + new YangInstanceIdentifier.AugmentationIdentifier(Sets.newHashSet(augmentChoice2QName)); + final YangInstanceIdentifier.NodeIdentifier augmentChoice1Id = + new YangInstanceIdentifier.NodeIdentifier(augmentChoice1QName); + final YangInstanceIdentifier.NodeIdentifier augmentChoice2Id = + new YangInstanceIdentifier.NodeIdentifier(augmentChoice2QName); + final YangInstanceIdentifier.NodeIdentifier containerId = + new YangInstanceIdentifier.NodeIdentifier(containerQName); + + TopBuilder tBuilder = new TopBuilder(); + TopChoiceAugment1Builder tca1Builder = new TopChoiceAugment1Builder(); + Case1Builder c1Builder = new Case1Builder(); + TopChoiceAugment2Builder tca2Builder = new TopChoiceAugment2Builder(); + Case11Builder c11Builder = new Case11Builder(); + Case11ChoiceCaseContainerBuilder cccc1Builder = new Case11ChoiceCaseContainerBuilder(); + cccc1Builder.setCase11ChoiceCaseLeaf("leaf-value"); + c11Builder.setCase11ChoiceCaseContainer(cccc1Builder.build()); + tca2Builder.setAugmentChoice2(c11Builder.build()); + c1Builder.addAugmentation(TopChoiceAugment2.class, tca2Builder.build()); + tca1Builder.setAugmentChoice1(c1Builder.build()); + tBuilder.addAugmentation(TopChoiceAugment1.class, tca1Builder.build()); + final Top top = tBuilder.build(); + + final Map.Entry> biResult = + registry.toNormalizedNode(InstanceIdentifier.create(Top.class), top); + + final NormalizedNode topNormalized = + containerBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TOP_QNAME)) + .withChild(augmentationBuilder().withNodeIdentifier(aug1Id) + .withChild(choiceBuilder().withNodeIdentifier(augmentChoice1Id) + .withChild(augmentationBuilder().withNodeIdentifier(aug2Id) + .withChild(choiceBuilder().withNodeIdentifier(augmentChoice2Id) + .withChild(containerBuilder().withNodeIdentifier(containerId) + .withChild(leafNode(leafQName, "leaf-value")) + .build()) + .build()) + .build()) + .build()) + .build()).build(); + + assertEquals(BI_TOP_PATH, biResult.getKey()); + assertEquals(topNormalized, biResult.getValue()); + + final Map.Entry, DataObject> baResult = registry.fromNormalizedNode(BI_TOP_PATH, topNormalized); + + assertEquals(InstanceIdentifier.create(Top.class), baResult.getKey()); + assertEquals(top, baResult.getValue()); + } } diff --git a/code-generator/binding-test-model/src/main/yang/opendaylight-yangtools-augment-test.yang b/code-generator/binding-test-model/src/main/yang/opendaylight-yangtools-augment-test.yang index c26559b071..04646fc838 100644 --- a/code-generator/binding-test-model/src/main/yang/opendaylight-yangtools-augment-test.yang +++ b/code-generator/binding-test-model/src/main/yang/opendaylight-yangtools-augment-test.yang @@ -146,4 +146,38 @@ module opendaylight-yangtools-augment-test { } } + augment "/test:top" { + ext:augment-identifier top-choice-augment1; + choice augment-choice1 { + case case1 { + container case1-container { + leaf case1-leaf { + type string; + } + } + } + + case case2 { + container case2-container { + leaf case2-leaf { + type string; + } + } + } + } + } + + augment "/test:top/augment-choice1/case1" { + ext:augment-identifier top-choice-augment2; + choice augment-choice2 { + case case11 { + container case11-choice-case-container { + leaf case11-choice-case-leaf { + type string; + } + } + } + } + } + } -- 2.36.6