Bug 6883: [Yang 1.1] Add support for a new data definition statement "anydata" 02/49102/9
authorPeter Kajsa <pkajsa@cisco.com>
Wed, 7 Dec 2016 18:27:18 +0000 (19:27 +0100)
committerRobert Varga <nite@hq.sk>
Sat, 17 Dec 2016 12:41:06 +0000 (12:41 +0000)
The "anydata" statement is used to represent an unknown set of nodes
that can be modeled with YANG, except anyxml, but for which the data
model is not known at module design time.

Change-Id: I0a7470dbd571087fcc3b8fd8cb2b21668d99d6f1
Signed-off-by: Peter Kajsa <pkajsa@cisco.com>
20 files changed:
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SubmoduleStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangInferencePipeline.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangValidationBundles.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ChoiceEffectiveStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/AnydataStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/AugmentStatementRfc7950Support.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/CaseStatementRfc7950Support.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/ChoiceStatementRfc7950Support.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/ContainerStatementRfc7950Support.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/GroupingStatementRfc7950Support.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/InputStatementRfc7950Support.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/ListStatementRfc7950Support.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/ModuleStatementRfc7950Support.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/NotificationStatementRfc7950Support.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/OutputStatementRfc7950Support.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/SubmoduleStatementRfc7950Support.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/effective/AnyDataEffectiveStatementImpl.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/Bug6883Test.java [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/rfc7950/bug6883/foo.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/rfc7950/bug6883/sub-foo.yang [new file with mode: 0644]

index 41df22693da324c4f3b709a87dc514a78e2541ec..37177c29d783efc7188a14b15c8e6e81b5de84cf 100644 (file)
@@ -96,19 +96,19 @@ public class SubmoduleStatementImpl extends AbstractRootStatement<SubmoduleState
             final Date maybeDate = Utils.getLatestRevision(stmt.declaredSubstatements());
             final Optional<Date> revisionDate = maybeDate != null ? Optional.of(maybeDate) : DEFAULT_REVISION;
 
-            ModuleIdentifier submoduleIdentifier = ModuleIdentifierImpl.create(stmt.getStatementArgument(),
+            final ModuleIdentifier submoduleIdentifier = ModuleIdentifierImpl.create(stmt.getStatementArgument(),
                 Optional.empty(), revisionDate);
 
             stmt.addContext(SubmoduleNamespace.class, submoduleIdentifier, stmt);
 
-            String belongsToModuleName = firstAttributeOf(
+            final String belongsToModuleName = firstAttributeOf(
                     stmt.declaredSubstatements(), BelongsToStatement.class);
-            StmtContext<?, ?, ?> prefixSubStmtCtx = findFirstDeclaredSubstatement(
+            final StmtContext<?, ?, ?> prefixSubStmtCtx = findFirstDeclaredSubstatement(
                     stmt, 0, BelongsToStatement.class, PrefixStatement.class);
             SourceException.throwIfNull(prefixSubStmtCtx, stmt.getStatementSourceReference(),
                 "Prefix of belongsTo statement is missing in submodule [%s]", stmt.getStatementArgument());
 
-            String prefix = (String) prefixSubStmtCtx.getStatementArgument();
+            final String prefix = (String) prefixSubStmtCtx.getStatementArgument();
 
             stmt.addToNs(BelongsToPrefixToModuleName.class, prefix, belongsToModuleName);
         }
index a0dc878fc5286644bbd399ea30420014bbbdbe8a..62c2eee053b6c34cc5f1031ff0d4952c2be7175a 100644 (file)
@@ -62,13 +62,18 @@ import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNa
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.AnydataStatementImpl;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.AugmentStatementRfc7950Support;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.CaseStatementRfc7950Support;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.ChoiceStatementRfc7950Support;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.ContainerStatementRfc7950Support;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.GroupingStatementRfc7950Support;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.ImportStatementRfc7950Support;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.IncludeStatementRfc7950Support;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.InputStatementRfc7950Support;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.ListStatementRfc7950Support;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.ModuleStatementRfc7950Support;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.NotificationStatementRfc7950Support;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.OutputStatementRfc7950Support;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.SubmoduleStatementRfc7950Support;
 
 public final class YangInferencePipeline {
     public static final Set<YangVersion> SUPPORTED_VERSIONS = Sets.immutableEnumSet(VERSION_1, VERSION_1_1);
@@ -82,7 +87,8 @@ public final class YangInferencePipeline {
             .derivedFrom(INIT_BUNDLE)
             .addVersionSpecificSupport(VERSION_1, new ModuleStatementSupport())
             .addVersionSpecificSupport(VERSION_1_1, new ModuleStatementRfc7950Support())
-            .addSupport(new SubmoduleStatementImpl.Definition())
+            .addVersionSpecificSupport(VERSION_1, new SubmoduleStatementImpl.Definition())
+            .addVersionSpecificSupport(VERSION_1_1, new SubmoduleStatementRfc7950Support())
             .addSupport(new NamespaceStatementImpl.Definition())
             .addVersionSpecificSupport(VERSION_1, new ImportStatementDefinition())
             .addVersionSpecificSupport(VERSION_1_1, new ImportStatementRfc7950Support())
@@ -161,8 +167,10 @@ public final class YangInferencePipeline {
             .addVersionSpecificSupport(VERSION_1_1, new ListStatementRfc7950Support())
             .addSupport(new UniqueStatementImpl.Definition())
             .addSupport(new RpcStatementImpl.Definition())
-            .addSupport(new InputStatementImpl.Definition())
-            .addSupport(new OutputStatementImpl.Definition())
+            .addVersionSpecificSupport(VERSION_1, new InputStatementImpl.Definition())
+            .addVersionSpecificSupport(VERSION_1_1, new InputStatementRfc7950Support())
+            .addVersionSpecificSupport(VERSION_1, new OutputStatementImpl.Definition())
+            .addVersionSpecificSupport(VERSION_1_1, new OutputStatementRfc7950Support())
             .addVersionSpecificSupport(VERSION_1, new NotificationStatementImpl.Definition())
             .addVersionSpecificSupport(VERSION_1_1, new NotificationStatementRfc7950Support())
             .addSupport(new FractionDigitsStatementImpl.Definition())
@@ -177,8 +185,10 @@ public final class YangInferencePipeline {
             .addSupport(new ConfigStatementImpl.Definition())
             .addSupport(new DeviationStatementImpl.Definition())
             .addSupport(new DeviateStatementImpl.Definition())
-            .addSupport(new ChoiceStatementImpl.Definition())
-            .addSupport(new CaseStatementImpl.Definition())
+            .addVersionSpecificSupport(VERSION_1, new ChoiceStatementImpl.Definition())
+            .addVersionSpecificSupport(VERSION_1_1, new ChoiceStatementRfc7950Support())
+            .addVersionSpecificSupport(VERSION_1, new CaseStatementImpl.Definition())
+            .addVersionSpecificSupport(VERSION_1_1, new CaseStatementRfc7950Support())
             .addSupport(new MustStatementImpl.Definition())
             .addSupport(new MandatoryStatementImpl.Definition())
             .addSupport(new AnyxmlStatementImpl.Definition())
index 3731e561f61de92f29326969524a96688b860c64..d69b8b75c8a1adc3cef1afb6a36b5ab6a89ae5dd 100644 (file)
@@ -30,11 +30,11 @@ public final class YangValidationBundles {
         final Builder<StatementDefinition, Set<StatementDefinition>> b = ImmutableMap.builder();
         b.put(YangStmtMapping.DEFAULT, ImmutableSet.of(YangStmtMapping.LEAF, YangStmtMapping.CHOICE));
         b.put(YangStmtMapping.MANDATORY, ImmutableSet.of(
-                YangStmtMapping.LEAF, YangStmtMapping.CHOICE, YangStmtMapping.ANYXML));
+                YangStmtMapping.LEAF, YangStmtMapping.CHOICE, YangStmtMapping.ANYXML, YangStmtMapping.ANYDATA));
         b.put(YangStmtMapping.PRESENCE, ImmutableSet.of(YangStmtMapping.CONTAINER));
         b.put(YangStmtMapping.MUST, ImmutableSet.of(
                 YangStmtMapping.CONTAINER, YangStmtMapping.LIST, YangStmtMapping.LEAF,
-                YangStmtMapping.LEAF_LIST, YangStmtMapping.ANYXML));
+                YangStmtMapping.LEAF_LIST, YangStmtMapping.ANYXML, YangStmtMapping.ANYDATA));
         b.put(YangStmtMapping.MIN_ELEMENTS, ImmutableSet.of(
                 YangStmtMapping.LIST, YangStmtMapping.LEAF_LIST));
         b.put(YangStmtMapping.MAX_ELEMENTS, ImmutableSet.of(
@@ -49,9 +49,9 @@ public final class YangValidationBundles {
 
     public static final Set<StatementDefinition> SUPPORTED_CASE_SHORTHANDS = ImmutableSet.of(
         YangStmtMapping.CONTAINER, YangStmtMapping.LIST, YangStmtMapping.LEAF, YangStmtMapping.LEAF_LIST,
-        YangStmtMapping.ANYXML);
+        YangStmtMapping.ANYXML, YangStmtMapping.ANYDATA);
 
     public static final Set<StatementDefinition> SUPPORTED_DATA_NODES = ImmutableSet.of(
         YangStmtMapping.CONTAINER, YangStmtMapping.LIST, YangStmtMapping.LEAF, YangStmtMapping.LEAF_LIST,
-        YangStmtMapping.ANYXML);
+        YangStmtMapping.ANYXML, YangStmtMapping.ANYDATA);
 }
index d4a8219627b4f641889ee641493528dec9b5523f..52cb61c15e38e131e4a34bb9db5185d9e76533e8 100644 (file)
@@ -18,20 +18,16 @@ import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
 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.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
-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.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangValidationBundles;
 
 public final class ChoiceEffectiveStatementImpl extends AbstractEffectiveDataSchemaNode<ChoiceStatement> implements
         ChoiceSchemaNode, DerivableSchemaNode {
@@ -52,31 +48,27 @@ public final class ChoiceEffectiveStatementImpl extends AbstractEffectiveDataSch
         super(ctx);
         this.original = ctx.getOriginalCtx() == null ? null : (ChoiceSchemaNode) ctx.getOriginalCtx().buildEffective();
 
-        DefaultEffectiveStatementImpl defaultStmt = firstEffective(DefaultEffectiveStatementImpl.class);
+        final DefaultEffectiveStatementImpl defaultStmt = firstEffective(DefaultEffectiveStatementImpl.class);
         this.defaultCase = (defaultStmt == null) ? null : defaultStmt.argument();
 
         // initSubstatementCollectionsAndFields
-        Collection<? extends EffectiveStatement<?, ?>> effectiveSubstatements = effectiveSubstatements();
-        Set<AugmentationSchema> augmentationsInit = new LinkedHashSet<>();
-        SortedSet<ChoiceCaseNode> casesInit = new TreeSet<>(SCHEMA_NODE_COMP);
+        final Collection<? extends EffectiveStatement<?, ?>> effectiveSubstatements = effectiveSubstatements();
+        final Set<AugmentationSchema> augmentationsInit = new LinkedHashSet<>();
+        final SortedSet<ChoiceCaseNode> casesInit = new TreeSet<>(SCHEMA_NODE_COMP);
 
-        for (EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements) {
+        for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements) {
             if (effectiveStatement instanceof AugmentationSchema) {
-                AugmentationSchema augmentationSchema = (AugmentationSchema) effectiveStatement;
+                final AugmentationSchema augmentationSchema = (AugmentationSchema) effectiveStatement;
                 augmentationsInit.add(augmentationSchema);
             }
             if (effectiveStatement instanceof ChoiceCaseNode) {
-                ChoiceCaseNode choiceCaseNode = (ChoiceCaseNode) effectiveStatement;
+                final ChoiceCaseNode choiceCaseNode = (ChoiceCaseNode) effectiveStatement;
                 casesInit.add(choiceCaseNode);
             }
-            if (effectiveStatement instanceof AnyXmlSchemaNode || effectiveStatement instanceof ContainerSchemaNode
-                    || effectiveStatement instanceof ListSchemaNode || effectiveStatement instanceof LeafListSchemaNode
-                    || effectiveStatement instanceof LeafSchemaNode) {
-
-                DataSchemaNode dataSchemaNode = (DataSchemaNode) effectiveStatement;
-                ChoiceCaseNode shorthandCase = new CaseShorthandImpl(dataSchemaNode);
+            if (YangValidationBundles.SUPPORTED_CASE_SHORTHANDS.contains(effectiveStatement.statementDefinition())) {
+                final DataSchemaNode dataSchemaNode = (DataSchemaNode) effectiveStatement;
+                final ChoiceCaseNode shorthandCase = new CaseShorthandImpl(dataSchemaNode);
                 casesInit.add(shorthandCase);
-
                 if (dataSchemaNode.isAugmenting() && !this.augmenting) {
                     resetAugmenting(dataSchemaNode);
                 }
@@ -89,19 +81,19 @@ public final class ChoiceEffectiveStatementImpl extends AbstractEffectiveDataSch
 
     private static void resetAugmenting(final DataSchemaNode dataSchemaNode) {
         if (dataSchemaNode instanceof LeafEffectiveStatementImpl) {
-            LeafEffectiveStatementImpl leaf = (LeafEffectiveStatementImpl) dataSchemaNode;
+            final LeafEffectiveStatementImpl leaf = (LeafEffectiveStatementImpl) dataSchemaNode;
             leaf.augmenting = false;
         } else if (dataSchemaNode instanceof ContainerEffectiveStatementImpl) {
-            ContainerEffectiveStatementImpl container = (ContainerEffectiveStatementImpl) dataSchemaNode;
+            final ContainerEffectiveStatementImpl container = (ContainerEffectiveStatementImpl) dataSchemaNode;
             container.augmenting = false;
         } else if (dataSchemaNode instanceof LeafListEffectiveStatementImpl) {
-            LeafListEffectiveStatementImpl leafList = (LeafListEffectiveStatementImpl) dataSchemaNode;
+            final LeafListEffectiveStatementImpl leafList = (LeafListEffectiveStatementImpl) dataSchemaNode;
             leafList.augmenting = false;
         } else if (dataSchemaNode instanceof ListEffectiveStatementImpl) {
-            ListEffectiveStatementImpl list = (ListEffectiveStatementImpl) dataSchemaNode;
+            final ListEffectiveStatementImpl list = (ListEffectiveStatementImpl) dataSchemaNode;
             list.augmenting = false;
         } else if (dataSchemaNode instanceof AnyXmlEffectiveStatementImpl) {
-            AnyXmlEffectiveStatementImpl anyXml = (AnyXmlEffectiveStatementImpl) dataSchemaNode;
+            final AnyXmlEffectiveStatementImpl anyXml = (AnyXmlEffectiveStatementImpl) dataSchemaNode;
             anyXml.augmenting = false;
         }
     }
@@ -170,7 +162,7 @@ public final class ChoiceEffectiveStatementImpl extends AbstractEffectiveDataSch
         if (getClass() != obj.getClass()) {
             return false;
         }
-        ChoiceEffectiveStatementImpl other = (ChoiceEffectiveStatementImpl) obj;
+        final ChoiceEffectiveStatementImpl other = (ChoiceEffectiveStatementImpl) obj;
         return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
     }
 
index b91731990dbd547e10edb54619f07a2604b194bf..e4174d7290992f0a387149cae5d0b9a06444ded3 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -30,8 +30,11 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.ChildSchemaNodes;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc7950.effective.AnyDataEffectiveStatementImpl;
 
+/**
+ * YANG 1.1 AnyData declared statement implementation.
+ */
 @Beta
-public class AnydataStatementImpl extends AbstractDeclaredStatement<QName> implements AnydataStatement {
+public final class AnydataStatementImpl extends AbstractDeclaredStatement<QName> implements AnydataStatement {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
             .ANYDATA)
             .addOptional(YangStmtMapping.CONFIG)
index f8c5c453ae4595ed6dfe16ca604e4fd68c81f7f8..4af21966ba437c8ee63e491598a226fa7882936c 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.AugmentStatementImpl;
 public final class AugmentStatementRfc7950Support extends AugmentStatementImpl.Definition {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator
             .builder(YangStmtMapping.AUGMENT)
+            .addAny(YangStmtMapping.ANYDATA)
             .addAny(YangStmtMapping.ANYXML)
             .addAny(YangStmtMapping.CASE)
             .addAny(YangStmtMapping.CHOICE)
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/CaseStatementRfc7950Support.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/CaseStatementRfc7950Support.java
new file mode 100644 (file)
index 0000000..aa6e35f
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * 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.stmt.rfc7950;
+
+import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.CaseStatementImpl;
+
+/**
+ * Class providing necessary support for processing YANG 1.1 Case statement.
+ */
+@Beta
+public final class CaseStatementRfc7950Support extends CaseStatementImpl.Definition {
+    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
+            .CASE)
+            .addAny(YangStmtMapping.ANYDATA)
+            .addAny(YangStmtMapping.ANYXML)
+            .addAny(YangStmtMapping.CHOICE)
+            .addAny(YangStmtMapping.CONTAINER)
+            .addOptional(YangStmtMapping.DESCRIPTION)
+            .addAny(YangStmtMapping.IF_FEATURE)
+            .addAny(YangStmtMapping.LEAF)
+            .addAny(YangStmtMapping.LEAF_LIST)
+            .addAny(YangStmtMapping.LIST)
+            .addOptional(YangStmtMapping.REFERENCE)
+            .addOptional(YangStmtMapping.STATUS)
+            .addAny(YangStmtMapping.USES)
+            .addOptional(YangStmtMapping.WHEN)
+            .build();
+
+    @Override
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
+    }
+}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/ChoiceStatementRfc7950Support.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/ChoiceStatementRfc7950Support.java
new file mode 100644 (file)
index 0000000..23f830e
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * 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.stmt.rfc7950;
+
+import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.ChoiceStatementImpl;
+
+/**
+ * Class providing necessary support for processing YANG 1.1 Choice statement.
+ */
+@Beta
+public final class ChoiceStatementRfc7950Support extends ChoiceStatementImpl.Definition {
+    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
+            .CHOICE)
+            .addAny(YangStmtMapping.ANYDATA)
+            .addAny(YangStmtMapping.ANYXML)
+            .addAny(YangStmtMapping.CASE)
+            .addOptional(YangStmtMapping.CONFIG)
+            .addAny(YangStmtMapping.CONTAINER)
+            .addOptional(YangStmtMapping.DEFAULT)
+            .addOptional(YangStmtMapping.DESCRIPTION)
+            .addAny(YangStmtMapping.IF_FEATURE)
+            .addAny(YangStmtMapping.LEAF)
+            .addAny(YangStmtMapping.LEAF_LIST)
+            .addAny(YangStmtMapping.LIST)
+            .addOptional(YangStmtMapping.MANDATORY)
+            .addOptional(YangStmtMapping.REFERENCE)
+            .addOptional(YangStmtMapping.STATUS)
+            .addOptional(YangStmtMapping.WHEN)
+            .build();
+
+    @Override
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
+    }
+}
index 9cd14d1cf967cedd2e9656d9534e342339083ff2..8a650aa1485dc41fc5744e36f818b6e97773e6d4 100644 (file)
@@ -20,6 +20,7 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.ContainerStatementImp
 public final class ContainerStatementRfc7950Support extends ContainerStatementImpl.Definition {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
             .CONTAINER)
+            .addAny(YangStmtMapping.ANYDATA)
             .addAny(YangStmtMapping.ANYXML)
             .addAny(YangStmtMapping.CHOICE)
             .addOptional(YangStmtMapping.CONFIG)
index 6a1401561b4f08e61c8478c9b281be849248676a..f5e4d9c742d83afa98d686ab4118a4cf50e5d2b6 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.GroupingStatementImpl
 public final class GroupingStatementRfc7950Support extends GroupingStatementImpl.Definition {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
             .GROUPING)
+            .addAny(YangStmtMapping.ANYDATA)
             .addAny(YangStmtMapping.ANYXML)
             .addAny(YangStmtMapping.CHOICE)
             .addAny(YangStmtMapping.CONTAINER)
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/InputStatementRfc7950Support.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/InputStatementRfc7950Support.java
new file mode 100644 (file)
index 0000000..6cf9642
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * 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.stmt.rfc7950;
+
+import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.InputStatementImpl;
+
+/**
+ * Class providing necessary support for processing YANG 1.1 Input statement.
+ */
+@Beta
+public final class InputStatementRfc7950Support extends InputStatementImpl.Definition {
+    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
+            .INPUT)
+            .addAny(YangStmtMapping.ANYDATA)
+            .addAny(YangStmtMapping.ANYXML)
+            .addAny(YangStmtMapping.CHOICE)
+            .addAny(YangStmtMapping.CONTAINER)
+            .addAny(YangStmtMapping.GROUPING)
+            .addAny(YangStmtMapping.LEAF)
+            .addAny(YangStmtMapping.LEAF_LIST)
+            .addAny(YangStmtMapping.LIST)
+            .addAny(YangStmtMapping.TYPEDEF)
+            .addAny(YangStmtMapping.USES)
+            .build();
+
+    @Override
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
+    }
+}
index 7ed204796a47f15ee57c1acf708512ab2f049820..23e2991cce109891c1a2122b8f08f13e2abe569c 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.ListStatementImpl;
 public final class ListStatementRfc7950Support extends ListStatementImpl.Definition {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
             .LIST)
+            .addAny(YangStmtMapping.ANYDATA)
             .addAny(YangStmtMapping.ANYXML)
             .addAny(YangStmtMapping.CHOICE)
             .addOptional(YangStmtMapping.CONFIG)
index 6dbd623fc754b2c3804f2e8a2c4582c939aa9ea6..124dfabe4a1d5cd51b29dbb53e656ec916cc2c7f 100644 (file)
@@ -17,8 +17,8 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.SupportedExtensionsMa
 public class ModuleStatementRfc7950Support extends ModuleStatementSupport {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
             .MODULE)
-            .addAny(YangStmtMapping.ANYXML)
             .addAny(YangStmtMapping.ANYDATA)
+            .addAny(YangStmtMapping.ANYXML)
             .addAny(YangStmtMapping.AUGMENT)
             .addAny(YangStmtMapping.CHOICE)
             .addOptional(YangStmtMapping.CONTACT)
index cbdd343316f05e42d723e363f7d50be222cd1b61..5464bf8018cf016696bb01485b4127c11bbec11b 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
+import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
 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.SourceException;
@@ -27,6 +28,24 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.Notificatio
  */
 @Beta
 public final class NotificationStatementRfc7950Support extends NotificationStatementImpl.Definition {
+    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
+            .NOTIFICATION)
+            .addAny(YangStmtMapping.ANYDATA)
+            .addAny(YangStmtMapping.ANYXML)
+            .addAny(YangStmtMapping.CHOICE)
+            .addAny(YangStmtMapping.CONTAINER)
+            .addOptional(YangStmtMapping.DESCRIPTION)
+            .addAny(YangStmtMapping.GROUPING)
+            .addAny(YangStmtMapping.IF_FEATURE)
+            .addAny(YangStmtMapping.LEAF)
+            .addAny(YangStmtMapping.LEAF_LIST)
+            .addAny(YangStmtMapping.LIST)
+            .addOptional(YangStmtMapping.REFERENCE)
+            .addOptional(YangStmtMapping.STATUS)
+            .addAny(YangStmtMapping.TYPEDEF)
+            .addAny(YangStmtMapping.USES)
+            .build();
+
     // :FIXME add action statement to the set of illegal parents, once bug-6896
     // will be resolved.
     private static final Set<StatementDefinition> ILLEGAL_PARENTS = ImmutableSet.of(YangStmtMapping.NOTIFICATION,
@@ -46,4 +65,9 @@ public final class NotificationStatementRfc7950Support extends NotificationState
                 "Notification %s is defined within a case statement", ctx.getStatementArgument());
         return new NotificationEffectiveStatementImpl(ctx);
     }
+
+    @Override
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
+    }
 }
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/OutputStatementRfc7950Support.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/OutputStatementRfc7950Support.java
new file mode 100644 (file)
index 0000000..92071cb
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * 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.stmt.rfc7950;
+
+import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.OutputStatementImpl;
+
+/**
+ * Class providing necessary support for processing YANG 1.1 Output statement.
+ */
+@Beta
+public final class OutputStatementRfc7950Support extends OutputStatementImpl.Definition {
+    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
+            .OUTPUT)
+            .addAny(YangStmtMapping.ANYDATA)
+            .addAny(YangStmtMapping.ANYXML)
+            .addAny(YangStmtMapping.CHOICE)
+            .addAny(YangStmtMapping.CONTAINER)
+            .addAny(YangStmtMapping.GROUPING)
+            .addAny(YangStmtMapping.LEAF)
+            .addAny(YangStmtMapping.LEAF_LIST)
+            .addAny(YangStmtMapping.LIST)
+            .addAny(YangStmtMapping.TYPEDEF)
+            .addAny(YangStmtMapping.USES)
+            .build();
+
+    @Override
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
+    }
+}
+
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/SubmoduleStatementRfc7950Support.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/SubmoduleStatementRfc7950Support.java
new file mode 100644 (file)
index 0000000..aa0c32c
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * 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.stmt.rfc7950;
+
+import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.SubmoduleStatementImpl;
+
+/**
+ * Class providing necessary support for processing YANG 1.1 Submodule statement.
+ */
+@Beta
+public final class SubmoduleStatementRfc7950Support extends SubmoduleStatementImpl.Definition {
+    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
+            .SUBMODULE)
+            .addAny(YangStmtMapping.ANYDATA)
+            .addAny(YangStmtMapping.ANYXML)
+            .addAny(YangStmtMapping.AUGMENT)
+            .addMandatory(YangStmtMapping.BELONGS_TO)
+            .addAny(YangStmtMapping.CHOICE)
+            .addOptional(YangStmtMapping.CONTACT)
+            .addAny(YangStmtMapping.CONTAINER)
+            .addOptional(YangStmtMapping.DESCRIPTION)
+            .addAny(YangStmtMapping.DEVIATION)
+            .addAny(YangStmtMapping.EXTENSION)
+            .addAny(YangStmtMapping.FEATURE)
+            .addAny(YangStmtMapping.GROUPING)
+            .addAny(YangStmtMapping.IDENTITY)
+            .addAny(YangStmtMapping.IMPORT)
+            .addAny(YangStmtMapping.INCLUDE)
+            .addAny(YangStmtMapping.LEAF)
+            .addAny(YangStmtMapping.LEAF_LIST)
+            .addAny(YangStmtMapping.LIST)
+            .addAny(YangStmtMapping.NOTIFICATION)
+            .addOptional(YangStmtMapping.ORGANIZATION)
+            .addOptional(YangStmtMapping.REFERENCE)
+            .addAny(YangStmtMapping.REVISION)
+            .addAny(YangStmtMapping.RPC)
+            .addAny(YangStmtMapping.TYPEDEF)
+            .addAny(YangStmtMapping.USES)
+            .addOptional(YangStmtMapping.YANG_VERSION)
+            .build();
+
+    @Override
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
+    }
+}
index 7b1920d3cba2884852b0a7f798cf76245010c5ea..83c23163ac8fe51c2e7608f27e65f24e572bbfbb 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.parser.stmt.rfc7950.effective;
 
+import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Optional;
 import java.util.Objects;
@@ -19,15 +20,24 @@ import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.AbstractEffectiveDataSchemaNode;
 
-public class AnyDataEffectiveStatementImpl extends AbstractEffectiveDataSchemaNode<AnydataStatement> implements
+/**
+ * YANG 1.1 AnyData effective statement implementation.
+ */
+@Beta
+public final class AnyDataEffectiveStatementImpl extends AbstractEffectiveDataSchemaNode<AnydataStatement> implements
         AnyDataSchemaNode, DerivableSchemaNode {
 
     private final AnyDataSchemaNode original;
+    private final ContainerSchemaNode schema;
 
     public AnyDataEffectiveStatementImpl(
             final StmtContext<QName, AnydataStatement, EffectiveStatement<QName, AnydataStatement>> ctx) {
         super(ctx);
         this.original = ctx.getOriginalCtx() == null ? null : (AnyDataSchemaNode) ctx.getOriginalCtx().buildEffective();
+        /*
+         * :TODO we need to determine a way how to set schema of AnyData
+         */
+        this.schema = null;
     }
 
     @Override
@@ -63,7 +73,6 @@ public class AnyDataEffectiveStatementImpl extends AbstractEffectiveDataSchemaNo
 
     @Override
     public ContainerSchemaNode getSchemaOfAnyData() {
-        // TODO Auto-generated method stub
-        return null;
+        return schema;
     }
 }
diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/Bug6883Test.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/Bug6883Test.java
new file mode 100644 (file)
index 0000000..1e05206
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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.stmt.rfc7950;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import java.io.FileNotFoundException;
+import java.net.URISyntaxException;
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.AnyDataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
+import org.opendaylight.yangtools.yang.stmt.StmtTestUtils;
+
+public class Bug6883Test {
+    private static final String FOO_NS = "foo";
+    private static final String FOO_REV = "1970-01-01";
+
+    @Test
+    public void test() throws ReactorException, SourceException, FileNotFoundException, URISyntaxException {
+        final SchemaContext schemaContext = StmtTestUtils.parseYangSources("/rfc7950/bug6883");
+        assertNotNull(schemaContext);
+
+        final AnyDataSchemaNode topAnyData = assertAnyData(schemaContext, ImmutableList.of("top"));
+        assertEquals(Status.DEPRECATED, topAnyData.getStatus());
+        assertEquals("top anydata", topAnyData.getDescription());
+
+        assertAnyData(schemaContext, ImmutableList.of("root", "root-anydata"));
+        assertAnyData(schemaContext, ImmutableList.of("root", "aug-anydata"));
+        assertAnyData(schemaContext, ImmutableList.of("root", "grp-anydata"));
+        assertAnyData(schemaContext, ImmutableList.of("my-list", "list-anydata"));
+        assertAnyData(schemaContext, ImmutableList.of("sub-data"));
+
+        assertAnyData(schemaContext, ImmutableList.of("my-rpc", "input", "input-anydata"));
+        assertAnyData(schemaContext, ImmutableList.of("my-rpc", "output", "output-anydata"));
+        assertAnyData(schemaContext, ImmutableList.of("my-notification", "notification-anydata"));
+
+        assertAnyData(schemaContext, ImmutableList.of("my-choice", "one", "case-anydata"));
+        assertAnyData(schemaContext, ImmutableList.of("my-choice", "case-shorthand-anydata", "case-shorthand-anydata"));
+    }
+
+    private static AnyDataSchemaNode assertAnyData(final SchemaContext context, final Iterable<String> localNamesPath) {
+        final Iterable<QName> qNames = Iterables.transform(localNamesPath,
+                localName -> QName.create(FOO_NS, FOO_REV, localName));
+        final SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context,
+                SchemaPath.create(qNames, true));
+        assertTrue(findDataSchemaNode instanceof AnyDataSchemaNode);
+        return (AnyDataSchemaNode) findDataSchemaNode;
+    }
+}
\ No newline at end of file
diff --git a/yang/yang-parser-impl/src/test/resources/rfc7950/bug6883/foo.yang b/yang/yang-parser-impl/src/test/resources/rfc7950/bug6883/foo.yang
new file mode 100644 (file)
index 0000000..5d626a5
--- /dev/null
@@ -0,0 +1,51 @@
+module foo {
+    namespace "foo";
+    prefix foo;
+    yang-version 1.1;
+
+    include sub-foo;
+
+    anydata top {
+        description "top anydata";
+        status deprecated;
+        mandatory true;
+        must "1!=0";
+    }
+
+    container root {
+        anydata root-anydata;
+    }
+
+    list my-list {
+        anydata list-anydata;
+    }
+
+    rpc my-rpc {
+        input {
+            anydata input-anydata;
+        }
+        output {
+            anydata output-anydata;
+        }
+    }
+
+    notification my-notification {
+        anydata notification-anydata;
+    }
+
+    choice my-choice {
+        case one {
+            anydata case-anydata;
+        }
+        anydata case-shorthand-anydata;
+    }
+
+    grouping grp {
+        anydata grp-anydata;
+    }
+
+    augment "/root" {
+        uses grp;
+        anydata aug-anydata;
+    }
+}
diff --git a/yang/yang-parser-impl/src/test/resources/rfc7950/bug6883/sub-foo.yang b/yang/yang-parser-impl/src/test/resources/rfc7950/bug6883/sub-foo.yang
new file mode 100644 (file)
index 0000000..00aaebc
--- /dev/null
@@ -0,0 +1,14 @@
+submodule sub-foo {
+    yang-version 1.1;
+
+    belongs-to foo {
+        prefix foo;
+    }
+
+    anydata sub-data {
+        description "submodule anydata";
+        status current;
+        mandatory true;
+        must "1!=0";
+    }
+}