From b0d6e58ab4c750fc9637b6d0ce646ecc469a00cd Mon Sep 17 00:00:00 2001 From: Filip Gregor Date: Fri, 10 Jun 2016 13:26:00 +0200 Subject: [PATCH] Bug 5884: Augmenting a choice without a case results in no getter binding generator can not generate correctly getters for augmented case shortHand. added new namespace, added short hand case for augments shortHand is created when augmenting choice with case shortHand Change-Id: I8543834bf3e3cf5e222d60617f116aca3639bc82 Signed-off-by: Filip Gregor --- .../spi/source/AugmentToChoiceNamespace.java | 19 +++++ .../stmt/reactor/SubstatementContext.java | 5 +- .../stmt/rfc6020/AugmentStatementImpl.java | 8 ++ .../stmt/rfc6020/YangInferencePipeline.java | 2 + ...tEffectiveDocumentedDataNodeContainer.java | 22 +++++- .../yangtools/yang/stmt/AugmentTest.java | 2 +- .../yangtools/yang/stmt/Bug5884Test.java | 66 ++++++++++++++++ .../src/test/resources/bugs/bug5884/foo.yang | 78 +++++++++++++++++++ 8 files changed, 198 insertions(+), 4 deletions(-) create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/AugmentToChoiceNamespace.java create mode 100644 yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5884Test.java create mode 100644 yang/yang-parser-impl/src/test/resources/bugs/bug5884/foo.yang diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/AugmentToChoiceNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/AugmentToChoiceNamespace.java new file mode 100644 index 0000000000..964063f480 --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/AugmentToChoiceNamespace.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.parser.spi.source; + +import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; + +/** + * namespace key class for storing augment nodes which are going to be augmented as + * shortHand case nodes into choice node + */ +public interface AugmentToChoiceNamespace extends IdentifierNamespace, Boolean> { + +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java index 5f47b015ad..a6553fc893 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java @@ -11,6 +11,7 @@ import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.base.Verify; import java.util.Collection; +import java.util.Objects; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.SchemaPath; @@ -29,6 +30,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Regist import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.spi.source.AugmentToChoiceNamespace; import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace; import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace.ValidationBundleType; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.GroupingUtils; @@ -173,7 +175,8 @@ final class SubstatementContext, E extends Eff } final SchemaPath path; - if (StmtContextUtils.producesDeclared(getParentContext(), ChoiceStatement.class) + if ((StmtContextUtils.producesDeclared(getParentContext(), ChoiceStatement.class) + || Boolean.TRUE.equals(parent.getFromNamespace(AugmentToChoiceNamespace.class, parent))) && isSupportedAsShorthandCase()) { path = parentPath.createChild(qname); } else { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java index 97edbf247d..d6adbe039a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; + import com.google.common.base.Preconditions; import java.util.Collection; import java.util.regex.Pattern; @@ -27,6 +28,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.spi.source.AugmentToChoiceNamespace; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.spi.source.StmtOrderingNamespace; import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; @@ -116,6 +118,12 @@ public class AugmentStatementImpl extends AbstractDeclaredStatement> extends AbstractEffectiveDocumentedNode implements @@ -51,8 +57,20 @@ abstract class AbstractEffectiveDocumentedDataNodeContainer augmentations = foo.getAugmentations(); + final Set availableAugmentations = dataChildByName.getAvailableAugmentations(); + final Iterator iterator = augmentations.iterator(); + final Iterator availableIterator = availableAugmentations.iterator(); + + testIterator(iterator); + testIterator(availableIterator); + } + + private void testIterator(final Iterator iterator) { + AugmentationSchema allAugments; + while (iterator.hasNext()) { + allAugments = iterator.next(); + final DataSchemaNode currentChoice = allAugments.getChildNodes().iterator().next(); + assertTrue(currentChoice instanceof ChoiceCaseNode); + } + } +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/test/resources/bugs/bug5884/foo.yang b/yang/yang-parser-impl/src/test/resources/bugs/bug5884/foo.yang new file mode 100644 index 0000000000..5ae1bd625c --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/bugs/bug5884/foo.yang @@ -0,0 +1,78 @@ +module foo { + namespace "urn:yang.foo"; + prefix "foo"; + + revision "2016-01-01"; + + container main-container { + uses test-grouping { + augment "test/test-choice" { + leaf short-aug-uses-inside { + type string; + } + } + + augment "test/test-choice" { + case normal-aug-uses-inside { + leaf normal-aug-uses-inside { + type string; + } + } + } + } + } + + grouping test-grouping { + container test { + choice test-choice { + leaf short { + type string; + } + case normal { + leaf normal { + type string; + } + } + } + } + } + + choice test-choice { + leaf short { + type string; + } + case normal { + leaf normal { + type string; + } + } + } + + augment "/test-choice" { + leaf short-aug-uses { + type string; + } + } + + augment "/test-choice" { + case normal-aug-uses { + leaf normal-aug-uses { + type string; + } + } + } + + augment "/main-container/test/test-choice" { + leaf short-aug-uses-outside { + type string; + } + } + + augment "/main-container/test/test-choice" { + case normal-aug-uses-outside { + leaf normal-aug-uses-outside { + type string; + } + } + } +} \ No newline at end of file -- 2.36.6