Split out input/output schema nodes 95/92895/9
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 4 Oct 2020 20:41:52 +0000 (22:41 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 5 Oct 2020 10:18:14 +0000 (12:18 +0200)
The need to specialize to statements is forcing our hand a little,
we need to have specialized SchemaNodes to cover input/output case.

This creates a ContainerLike schema node interface, which acts as
the common super-interface.

JIRA: YANGTOOLS-1119
Change-Id: I4c8480f34cdc42dccf8335a965ac4018b7453504
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
40 files changed:
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/Builders.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToCompositeNodes.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/InstanceIdToNodes.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeSchemaAwareBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ContainerModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeFactory.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StructuralContainerModificationStrategy.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/CompositeNodeDataWithSchema.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerContextNode.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerNodeDataWithSchema.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextNode.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/OperationAsContainer.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ContainerLike.java [new file with mode: 0644]
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ContainerSchemaNode.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/InputSchemaNode.java [new file with mode: 0644]
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/OperationDefinition.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/OutputSchemaNode.java [new file with mode: 0644]
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/SchemaContext.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaNodeUtils.java
yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/SchemaNodeUtilsTest.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/container/ContainerEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/input/DeclaredInputEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/input/UndeclaredInputEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/output/DeclaredOutputEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/output/UndeclaredOutputEffectiveStatement.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/Bug6871Test.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/Bug9241Test.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentTest.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/DeviationResolutionTest.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/EffectiveSchemaContextTest.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/RpcStmtTest.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/yin/YinFileRpcStmtTest.java

index 7ce4f597eedabd3e23410e45586483168beb6e7f..2863b81491ee9ccd74521755175a132aa58ad5a5 100644 (file)
@@ -26,7 +26,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgum
 import org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker;
 import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
@@ -89,7 +89,7 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter
             if (parent == schema) {
                 endElement();
             }
-        } else if (schema instanceof ContainerSchemaNode || schema instanceof LeafSchemaNode
+        } else if (schema instanceof ContainerLike || schema instanceof LeafSchemaNode
                 || schema instanceof AnydataSchemaNode || schema instanceof AnyxmlSchemaNode) {
             endElement();
         }
index c97b6575653709ce1b87b8d3d23d4b03659dadca..0baabbb64ca0ee2740b4cd6daa101ffc75808b7e 100644 (file)
@@ -74,6 +74,7 @@ import org.opendaylight.yangtools.yang.data.util.SimpleNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.YangModeledAnyXmlNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
@@ -251,8 +252,8 @@ public final class XmlParserStream implements Closeable, Flushable {
         if (reader.hasNext()) {
             reader.nextTag();
             final AbstractNodeDataWithSchema<?> nodeDataWithSchema;
-            if (parentNode instanceof ContainerSchemaNode) {
-                nodeDataWithSchema = new ContainerNodeDataWithSchema((ContainerSchemaNode) parentNode);
+            if (parentNode instanceof ContainerLike) {
+                nodeDataWithSchema = new ContainerNodeDataWithSchema((ContainerLike) parentNode);
             } else if (parentNode instanceof ListSchemaNode) {
                 nodeDataWithSchema = new ListNodeDataWithSchema((ListSchemaNode) parentNode);
             } else if (parentNode instanceof YangModeledAnyxmlSchemaNode) {
index 9c9488f9ab1a7931dfca881167f60ac8758310e7..e8aad15dbf0046c34a93b50a288e00b6e7698c7e 100644 (file)
@@ -32,7 +32,7 @@ import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
@@ -201,9 +201,7 @@ public final class SchemaTracker {
     public SchemaNode startContainerNode(final NodeIdentifier name) {
         LOG.debug("Enter container {}", name);
         final SchemaNode schema = getSchema(name);
-
-        boolean isAllowed = schema instanceof ContainerSchemaNode;
-        isAllowed |= schema instanceof NotificationDefinition;
+        final boolean isAllowed = schema instanceof ContainerLike | schema instanceof NotificationDefinition;
 
         checkArgument(isAllowed, "Node %s is not a container nor a notification", schema);
         schemaStack.push(schema);
index 079ef8bf91f2f1f226bdd9f02fa800c724769cd4..304f8525c158fc8031c097b43158871f320e6203 100644 (file)
@@ -60,7 +60,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableYa
 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
@@ -141,13 +141,12 @@ public final class Builders {
         return ImmutableContainerNodeBuilder.create(node);
     }
 
-    public static DataContainerNodeBuilder<NodeIdentifier, ContainerNode> containerBuilder(
-            final ContainerSchemaNode schema) {
+    public static DataContainerNodeBuilder<NodeIdentifier, ContainerNode> containerBuilder(final ContainerLike schema) {
         return ImmutableContainerNodeSchemaAwareBuilder.create(schema);
     }
 
-    public static DataContainerNodeBuilder<NodeIdentifier, ContainerNode> containerBuilder(
-            final ContainerSchemaNode schema, final ContainerNode node) {
+    public static DataContainerNodeBuilder<NodeIdentifier, ContainerNode> containerBuilder(final ContainerLike schema,
+            final ContainerNode node) {
         return ImmutableContainerNodeSchemaAwareBuilder.create(schema, node);
     }
 
index 8b1b5a12ed35c8518fa7b0a62559d0a91d671c97..1b85302faf4036ba15ea5bf5b3deebdaa5bee6d2 100644 (file)
@@ -47,7 +47,7 @@ import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
@@ -226,8 +226,8 @@ abstract class InstanceIdToCompositeNodes<T extends PathArgument> extends Instan
     }
 
     static final class ContainerTransformation
-            extends DataContainerNormalizationOperation<NodeIdentifier, ContainerSchemaNode> {
-        ContainerTransformation(final ContainerSchemaNode schema) {
+            extends DataContainerNormalizationOperation<NodeIdentifier, ContainerLike> {
+        ContainerTransformation(final ContainerLike schema) {
             super(NodeIdentifier.create(schema.getQName()), schema);
         }
 
index 473957c423def73412116a3f3a0a015f43fabe88..f867c5ab85ab16d269e9ef85b17447755ac5c551 100644 (file)
@@ -33,7 +33,7 @@ import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
@@ -202,8 +202,8 @@ abstract class InstanceIdToNodes<T extends PathArgument> extends AbstractIdentif
     }
 
     static InstanceIdToNodes<?> fromDataSchemaNode(final DataSchemaNode potential) {
-        if (potential instanceof ContainerSchemaNode) {
-            return new InstanceIdToCompositeNodes.ContainerTransformation((ContainerSchemaNode) potential);
+        if (potential instanceof ContainerLike) {
+            return new InstanceIdToCompositeNodes.ContainerTransformation((ContainerLike) potential);
         } else if (potential instanceof ListSchemaNode) {
             return fromListSchemaNode((ListSchemaNode) potential);
         } else if (potential instanceof LeafSchemaNode) {
index 9f256007baa0e22366c80648e5a96616689da702..6e4a52a07bd7f661e99bf2db8de82fb127ea110a 100644 (file)
@@ -13,30 +13,28 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataNodeContainerValidator;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 
 public final class ImmutableContainerNodeSchemaAwareBuilder extends ImmutableContainerNodeBuilder {
     private final DataNodeContainerValidator validator;
 
-    private ImmutableContainerNodeSchemaAwareBuilder(final ContainerSchemaNode schema) {
+    private ImmutableContainerNodeSchemaAwareBuilder(final ContainerLike schema) {
         this.validator = new DataNodeContainerValidator(schema);
         super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
     }
 
-    private ImmutableContainerNodeSchemaAwareBuilder(final ContainerSchemaNode schema,
-            final ImmutableContainerNode node) {
+    private ImmutableContainerNodeSchemaAwareBuilder(final ContainerLike schema, final ImmutableContainerNode node) {
         super(node);
         this.validator = new DataNodeContainerValidator(schema);
         super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
     }
 
-    public static @NonNull DataContainerNodeBuilder<NodeIdentifier, ContainerNode> create(
-            final ContainerSchemaNode schema) {
+    public static @NonNull DataContainerNodeBuilder<NodeIdentifier, ContainerNode> create(final ContainerLike schema) {
         return new ImmutableContainerNodeSchemaAwareBuilder(schema);
     }
 
-    public static @NonNull DataContainerNodeBuilder<NodeIdentifier, ContainerNode> create(
-            final ContainerSchemaNode schema, final ContainerNode node) {
+    public static @NonNull DataContainerNodeBuilder<NodeIdentifier, ContainerNode> create(final ContainerLike schema,
+            final ContainerNode node) {
         if (!(node instanceof ImmutableContainerNode)) {
             throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass()));
         }
index df66a958b7d15ff6186efc3bf5275ccc246976c2..e54814ffd6c8e7d57a7bc312656bd3123bb29608 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguratio
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 
 /**
@@ -24,7 +25,7 @@ import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
  * with mandatory nodes, as it needs to tap into {@link SchemaAwareApplyOperation}'s operations, or subclassed
  * for the purposes of {@link StructuralContainerModificationStrategy}'s automatic lifecycle.
  */
-class ContainerModificationStrategy extends DataNodeContainerModificationStrategy<ContainerSchemaNode> {
+class ContainerModificationStrategy extends DataNodeContainerModificationStrategy<ContainerLike> {
     private static final class EnforcingMandatory extends ContainerModificationStrategy {
         private final MandatoryLeafEnforcer enforcer;
 
@@ -68,7 +69,7 @@ class ContainerModificationStrategy extends DataNodeContainerModificationStrateg
             new NormalizedNodeContainerSupport<>(ContainerNode.class, ImmutableContainerNodeBuilder::create,
                     ImmutableContainerNodeBuilder::create);
 
-    ContainerModificationStrategy(final ContainerSchemaNode schemaNode, final DataTreeConfiguration treeConfig) {
+    ContainerModificationStrategy(final ContainerLike schemaNode, final DataTreeConfiguration treeConfig) {
         super(SUPPORT, schemaNode, treeConfig);
     }
 
index 1a0f74637a3911fd8b84809a38dbb6e9928aa5bd..29cd2d4de893bb52c0fb1ab7701b0948793ee7cf 100644 (file)
@@ -23,7 +23,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguratio
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
@@ -76,8 +76,8 @@ final class InMemoryDataTree extends AbstractDataTreeTip implements DataTree {
     }
 
     private ModificationApplyOperation getOperation(final DataSchemaNode rootSchemaNode) {
-        if (rootSchemaNode instanceof ContainerSchemaNode && maskMandatory) {
-            return new ContainerModificationStrategy((ContainerSchemaNode) rootSchemaNode, treeConfig);
+        if (rootSchemaNode instanceof ContainerLike && maskMandatory) {
+            return new ContainerModificationStrategy((ContainerLike) rootSchemaNode, treeConfig);
         }
         if (rootSchemaNode instanceof ListSchemaNode) {
             final PathArgument arg = treeConfig.getRootPath().getLastPathArgument();
index 6a397aa1626b6caec60ee15296b0d3d815890296..57e91b6ce70515234ce3c99cbd1356b0bf8f678d 100644 (file)
@@ -31,6 +31,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
@@ -105,7 +106,7 @@ public final class InMemoryDataTreeFactory implements DataTreeFactory {
     private static @NonNull NormalizedNode<?, ?> createRoot(final DataNodeContainer schemaNode,
             final YangInstanceIdentifier path) {
         if (path.isEmpty()) {
-            checkArgument(schemaNode instanceof ContainerSchemaNode,
+            checkArgument(schemaNode instanceof ContainerLike,
                 "Conceptual tree root has to be a container, not %s", schemaNode);
             return ROOT_CONTAINER;
         }
index f1f9ed1e5bd1060a0978668ea21ae17547014d6c..066d1b89b7af54e3fdbe97f419c84d5daabbfd9a 100644 (file)
@@ -39,6 +39,7 @@ import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 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.SchemaContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,6 +66,8 @@ abstract class SchemaAwareApplyOperation<T extends WithStatus> extends Modificat
             return new ValueNodeModificationStrategy<>(AnydataNode.class, (AnydataSchemaNode) schemaNode);
         } else if (schemaNode instanceof AnyxmlSchemaNode) {
             return new ValueNodeModificationStrategy<>(AnyxmlNode.class, (AnyxmlSchemaNode) schemaNode);
+        } else if (schemaNode instanceof SchemaContext) {
+            return new StructuralContainerModificationStrategy((SchemaContext) schemaNode, treeConfig);
         } else {
             throw new IllegalStateException("Unsupported schema " + schemaNode);
         }
index ef7dd2515e2e2b5f821eadc0a3f7d0a45093a6e3..d3a418ee9834e1f38669136f9d78f7b231bd8fb1 100644 (file)
@@ -13,7 +13,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguratio
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 
 /**
  * Structural containers are special in that they appear when implied by child nodes and disappear whenever they are
@@ -26,7 +26,7 @@ import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 final class StructuralContainerModificationStrategy extends ContainerModificationStrategy {
     private final ContainerNode emptyNode;
 
-    StructuralContainerModificationStrategy(final ContainerSchemaNode schema, final DataTreeConfiguration treeConfig) {
+    StructuralContainerModificationStrategy(final ContainerLike schema, final DataTreeConfiguration treeConfig) {
         super(schema, treeConfig);
         this.emptyNode = ImmutableNodes.containerNode(schema.getQName());
     }
index 8db7ecd89f09e12db9c4ce95bafdfdd7e615a749..9b4dd3a164ddbe50c9d0ddce4d846fb2d74ecda5 100644 (file)
@@ -28,7 +28,7 @@ import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
@@ -233,8 +233,8 @@ public class CompositeNodeDataWithSchema<T extends DataSchemaNode> extends Abstr
             newChild = new ListNodeDataWithSchema((ListSchemaNode) schema);
         } else if (schema instanceof LeafListSchemaNode) {
             newChild = new LeafListNodeDataWithSchema((LeafListSchemaNode) schema);
-        } else if (schema instanceof ContainerSchemaNode) {
-            newChild = new ContainerNodeDataWithSchema((ContainerSchemaNode) schema);
+        } else if (schema instanceof ContainerLike) {
+            newChild = new ContainerNodeDataWithSchema((ContainerLike) schema);
         } else if (schema instanceof YangModeledAnyxmlSchemaNode) {
             newChild = new YangModeledAnyXmlNodeDataWithSchema((YangModeledAnyxmlSchemaNode)schema);
         } else {
index a7a649280a4fcb2266adb5f46e6f42cf7a5bd088..4c5b0f69a9ca3efb25958ce6b8e6d0ed25aad092 100644 (file)
@@ -8,12 +8,10 @@
 package org.opendaylight.yangtools.yang.data.util;
 
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 
 final class ContainerContextNode extends DataContainerContextNode<NodeIdentifier> {
-
-    protected ContainerContextNode(final ContainerSchemaNode schema) {
+    protected ContainerContextNode(final ContainerLike schema) {
         super(NodeIdentifier.create(schema.getQName()), schema, schema);
     }
-
 }
index e70d2786c61557704f653b664307cc0a329b37a8..2557d8cda55f5af7205d40b45face23904f5140c 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.yangtools.yang.data.util;
 import java.io.IOException;
 import org.opendaylight.yangtools.rfc7952.data.api.StreamWriterMetadataExtension;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 
 /**
  * Utility class used for tracking parser state as needed by a StAX-like parser.
@@ -19,9 +19,9 @@ import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
  * <p>
  * Represents a YANG container node.
  */
-public class ContainerNodeDataWithSchema extends AbstractMountPointDataWithSchema<ContainerSchemaNode> {
+public class ContainerNodeDataWithSchema extends AbstractMountPointDataWithSchema<ContainerLike> {
 
-    public ContainerNodeDataWithSchema(final ContainerSchemaNode schema) {
+    public ContainerNodeDataWithSchema(final ContainerLike schema) {
         super(schema);
     }
 
index 52ac098b0d6cfa8b3e9d33cd058c1b0b6d1d5c42..8f512fc7d1fc6686edc5cca978f271aed24dcc81 100644 (file)
@@ -19,11 +19,13 @@ import java.util.Optional;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
@@ -44,28 +46,22 @@ public final class ContainerSchemaNodes {
     }
 
     @Beta
-    public static ContainerSchemaNode forNotification(final NotificationDefinition notification) {
+    public static ContainerLike forNotification(final NotificationDefinition notification) {
         return new NotificationContainerSchemaNode(notification);
     }
 
     @Beta
-    public static ContainerSchemaNode forRPC(final RpcDefinition rpc) {
+    public static ContainerLike forRPC(final RpcDefinition rpc) {
         return new RpcContainerSchemaNode(rpc);
     }
 
-    private abstract static class AbstractContainerSchemaNode implements ContainerSchemaNode {
-
+    private abstract static class AbstractContainerSchemaNode implements ContainerLike {
         private final SchemaNode schemaNode;
 
         private AbstractContainerSchemaNode(final SchemaNode schemaNode) {
             this.schemaNode = schemaNode;
         }
 
-        @Override
-        public boolean isPresenceContainer() {
-            return false;
-        }
-
         @Override
         public Collection<? extends UsesNode> getUses() {
             return ImmutableSet.of();
@@ -144,8 +140,8 @@ public final class ContainerSchemaNodes {
 
         @Override
         public Collection<? extends DataSchemaNode> getChildNodes() {
-            final ContainerSchemaNode input = rpcDefinition.getInput();
-            final ContainerSchemaNode output = rpcDefinition.getOutput();
+            final InputSchemaNode input = rpcDefinition.getInput();
+            final OutputSchemaNode output = rpcDefinition.getOutput();
             if (input == null && output == null) {
                 return ImmutableList.of();
             } else if (input != null && output != null) {
index 4ba7406b78119876de53f43f8541b5ae70395b98..216bf478604cd5f8837e20e93963726acf21915c 100644 (file)
@@ -26,7 +26,7 @@ import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
@@ -161,8 +161,8 @@ public abstract class DataSchemaContextNode<T extends PathArgument> extends Abst
     }
 
     public static @Nullable DataSchemaContextNode<?> fromDataSchemaNode(final DataSchemaNode potential) {
-        if (potential instanceof ContainerSchemaNode) {
-            return new ContainerContextNode((ContainerSchemaNode) potential);
+        if (potential instanceof ContainerLike) {
+            return new ContainerContextNode((ContainerLike) potential);
         } else if (potential instanceof ListSchemaNode) {
             return fromListSchemaNode((ListSchemaNode) potential);
         } else if (potential instanceof LeafSchemaNode) {
index 2bd59ce28f6b54c842d53294c730f6f98d6c41d4..9d4aa8e580994f2858c5017a0718d934914e8eeb 100644 (file)
@@ -20,12 +20,14 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
@@ -33,7 +35,7 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
 
 @Beta
-public class OperationAsContainer extends ForwardingObject implements ContainerSchemaNode, OperationDefinition {
+public class OperationAsContainer extends ForwardingObject implements ContainerLike, OperationDefinition {
     private final @NonNull OperationDefinition delegate;
 
     OperationAsContainer(final OperationDefinition parentNode) {
@@ -75,12 +77,12 @@ public class OperationAsContainer extends ForwardingObject implements ContainerS
     }
 
     @Override
-    public final ContainerSchemaNode getInput() {
+    public final InputSchemaNode getInput() {
         return delegate.getInput();
     }
 
     @Override
-    public final ContainerSchemaNode getOutput() {
+    public final OutputSchemaNode getOutput() {
         return delegate.getOutput();
     }
 
@@ -121,19 +123,14 @@ public class OperationAsContainer extends ForwardingObject implements ContainerS
         return ImmutableSet.of();
     }
 
-    @Override
-    public final boolean isPresenceContainer() {
-        return false;
-    }
-
     @Override
     public final Collection<? extends DataSchemaNode> getChildNodes() {
         final List<DataSchemaNode> ret = new ArrayList<>();
-        final ContainerSchemaNode input = getInput();
-        final ContainerSchemaNode output = getOutput();
+        final InputSchemaNode input = getInput();
         if (input != null) {
             ret.add(input);
         }
+        final OutputSchemaNode output = getOutput();
         if (output != null) {
             ret.add(output);
         }
diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ContainerLike.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/ContainerLike.java
new file mode 100644 (file)
index 0000000..8678453
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2013 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.model.api;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Common interface for common container-like constructs.
+ */
+@Beta
+public interface ContainerLike extends DataNodeContainer,
+        AugmentationTarget, DataSchemaNode, NotificationNodeContainer, ActionNodeContainer, MustConstraintAware {
+
+}
index afc7104a9b5f24d41f2ce5a37586c4ac5de77405..b32c7528581899d664f63e5d67e9266527fe4cc7 100644 (file)
@@ -7,16 +7,14 @@
  */
 package org.opendaylight.yangtools.yang.model.api;
 
+import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
+
 /**
- * The ContainerSchemaNode is used to define an interior data node in the schema
- * tree. There are two styles of containers, those that exist only for
- * organizing the hierarchy of data nodes, and those whose presence in the
+ * The ContainerSchemaNode is used to define an interior data node in the schema tree. There are two styles of
+ * containers, those that exist only for organizing the hierarchy of data nodes, and those whose presence in the
  * configuration has an explicit meaning.
  */
-// FIXME: YANGTOOLS-1119: We need to specialize this interface for Container use and have others for Input/Output and
-//                        other misuses.
-public interface ContainerSchemaNode extends DataNodeContainer,
-        AugmentationTarget, DataSchemaNode, NotificationNodeContainer, ActionNodeContainer, MustConstraintAware {
+public interface ContainerSchemaNode extends ContainerLike, EffectiveStatementEquivalent<ContainerEffectiveStatement> {
     /**
      * Returns true if this container is marked as presence.
      *
@@ -24,5 +22,4 @@ public interface ContainerSchemaNode extends DataNodeContainer,
      *         false otherwise
      */
     boolean isPresenceContainer();
-
 }
diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/InputSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/InputSchemaNode.java
new file mode 100644 (file)
index 0000000..e241f33
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2020 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.model.api;
+
+import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
+
+@Beta
+public interface InputSchemaNode extends ContainerLike, EffectiveStatementEquivalent<InputEffectiveStatement> {
+
+}
index 1eabe85d4dfbb49d4a9059d6aa8272a5a21db3f6..b06d397ceb43f03fc5d2df9b1c8206b037f3df29 100644 (file)
@@ -35,7 +35,7 @@ public interface OperationDefinition extends SchemaNode {
      * @return Definition of input parameters for this operation.
      *         The substatements of input define nodes under the operation's input node.
      */
-    ContainerSchemaNode getInput();
+    InputSchemaNode getInput();
 
     /**
      * Returns definition of output parameters for this operation.
@@ -43,5 +43,5 @@ public interface OperationDefinition extends SchemaNode {
      * @return Definition of output parameters for this operation. The
      *         substatements of output define nodes under the operation's output node.
      */
-    ContainerSchemaNode getOutput();
+    OutputSchemaNode getOutput();
 }
diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/OutputSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/OutputSchemaNode.java
new file mode 100644 (file)
index 0000000..4c45fff
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2020 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.model.api;
+
+import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
+
+@Beta
+public interface OutputSchemaNode extends ContainerLike, EffectiveStatementEquivalent<OutputEffectiveStatement> {
+
+}
index c3a1d20dd32655d89f637f65bd19a788c64b6f9a..7f01221466c3716ca3233247b89455d95cd13839 100644 (file)
@@ -31,10 +31,10 @@ import org.opendaylight.yangtools.yang.common.Revision;
  * Instances MUST be immutable and thus usage in multi threaded
  * environment is safe.
  */
-// FIXME: 6.0.0: ContainerSchemaNode is far too broad. A combination of DataNodeContainer, NotificationNodeContainer
+// FIXME: 7.0.0: ContainerLike is far too broad. A combination of DataNodeContainer, NotificationNodeContainer
 //               and possibly DataSchemaNode would reflect SchemaContext traits better.
-// FIXME: 6.0.0: consider deprecating this class in favor of EffectiveModelContext
-public interface SchemaContext extends ContainerSchemaNode, Immutable {
+// FIXME: 7.0.0: consider deprecating this class in favor of EffectiveModelContext
+public interface SchemaContext extends ContainerLike, Immutable {
     /**
      * QName of NETCONF top-level data node.
      */
@@ -280,12 +280,6 @@ public interface SchemaContext extends ContainerSchemaNode, Immutable {
         return Collections.emptySet();
     }
 
-    @Override
-    @Deprecated
-    default boolean isPresenceContainer() {
-        return false;
-    }
-
     @Override
     @Deprecated
     default Collection<? extends AugmentationSchemaNode> getAvailableAugmentations() {
index 62e59cca60c2d74030cb5429d42dd0cb318610e0..a0c53dc1fbb631bbb9e58af19871e3708b33a986 100644 (file)
@@ -36,7 +36,7 @@ import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
 import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
@@ -335,7 +335,7 @@ public final class SchemaContextUtil {
      * @return Notification schema or null, if notification is not present in schema context.
      */
     @Beta
-    public static @Nullable ContainerSchemaNode getRpcDataSchema(final @NonNull SchemaContext schema,
+    public static @Nullable ContainerLike getRpcDataSchema(final @NonNull SchemaContext schema,
             final @NonNull SchemaPath path) {
         requireNonNull(schema, "Schema context must not be null.");
         requireNonNull(path, "Schema path must not be null.");
index c975e14833c4469e2d114507f69e17e96fed5eee..91f6319152e09dc4db444f0223b0f999fa255edf 100644 (file)
@@ -19,14 +19,17 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
@@ -62,7 +65,7 @@ public final class SchemaNodeUtils {
      * @param qname input or output QName with namespace same as RPC
      * @return input or output schema. Returns null if RPC does not have input/output specified.
      */
-    public static @Nullable ContainerSchemaNode getRpcDataSchema(final @NonNull RpcDefinition rpc,
+    public static @Nullable ContainerLike getRpcDataSchema(final @NonNull RpcDefinition rpc,
             final @NonNull QName qname) {
         requireNonNull(rpc, "Rpc Schema must not be null");
         switch (requireNonNull(qname, "QName must not be null").getLocalName()) {
@@ -149,11 +152,11 @@ public final class SchemaNodeUtils {
 
         for (RpcDefinition rpcDefinition : module.getRpcs()) {
             aggregator.addTypedefs(rpcDefinition.getTypeDefinitions());
-            ContainerSchemaNode input = rpcDefinition.getInput();
+            InputSchemaNode input = rpcDefinition.getInput();
             if (input != null) {
                 traverse(aggregator, input);
             }
-            ContainerSchemaNode output = rpcDefinition.getOutput();
+            OutputSchemaNode output = rpcDefinition.getOutput();
             if (output != null) {
                 traverse(aggregator, output);
             }
index 975b0a14d4a8aeb1a2fdc50d73b65d0c5b46a833..80b0a20ef36ef146450151115d7496318314f29f 100644 (file)
@@ -34,10 +34,12 @@ import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 
@@ -100,7 +102,7 @@ public class SchemaNodeUtilsTest {
         doReturn(notifications).when(mockedModule).getNotifications();
 
         final RpcDefinition mockedRpc = mockOperationDefinition(mock(RpcDefinition.class));
-        final ContainerSchemaNode mockedContainerInRpcInput = mockDataNodeContainer(ContainerSchemaNode.class);
+        final InputSchemaNode mockedContainerInRpcInput = mockDataNodeContainer(InputSchemaNode.class);
         final ListSchemaNode mockedListInRpcInputContainer = mockCopyableNode(false,
             mockDataNodeContainer(ListSchemaNode.class));
         final Set<DataSchemaNode> rpcInputChildNodes = ImmutableSet.of(mockedListInRpcInputContainer);
@@ -138,7 +140,7 @@ public class SchemaNodeUtilsTest {
 
     private static <T extends OperationDefinition> T mockOperationDefinition(final T mock) {
         doReturn(Collections.emptySet()).when(mock).getTypeDefinitions();
-        doReturn(mockDataNodeContainer(ContainerSchemaNode.class)).when(mock).getOutput();
+        doReturn(mockDataNodeContainer(OutputSchemaNode.class)).when(mock).getOutput();
         return mock;
     }
 }
index 6a986ff0b58fa62f590a758d1b2fd17075c6c3d2..beb8cf90092c64790d8da7bdb51e30a94a15362c 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt;
 
-import static com.google.common.base.Verify.verify;
-
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Strings;
@@ -26,19 +24,21 @@ import org.opendaylight.yangtools.yang.model.api.AddedByUsesAware;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
 import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.CopyableNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.MandatoryAware;
 import org.opendaylight.yangtools.yang.model.api.MustConstraintAware;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Status;
@@ -352,7 +352,7 @@ public final class EffectiveStatementMixins {
      * @param <D> Class representing declared version of this statement.
      */
     public interface OperationContainerMixin<D extends DeclaredStatement<QName>>
-            extends ContainerSchemaNode, DocumentedNodeMixin.WithStatus<QName, D>, DataNodeContainerMixin<QName, D>,
+            extends ContainerLike, DocumentedNodeMixin.WithStatus<QName, D>, DataNodeContainerMixin<QName, D>,
                     MustConstraintMixin<QName, D>, WhenConditionMixin<QName, D>, AugmentationTargetMixin<QName, D>,
                     SchemaNodeMixin<QName, D>, CopyableMixin<QName, D> {
         @Override
@@ -385,12 +385,6 @@ public final class EffectiveStatementMixins {
             return false;
         }
 
-        @Override
-        default boolean isPresenceContainer() {
-            // FIXME: this should not really be here
-            return false;
-        }
-
         default String defaultToString() {
             return MoreObjects.toStringHelper(this).add("path", getPath()).toString();
         }
@@ -433,13 +427,13 @@ public final class EffectiveStatementMixins {
         }
 
         @Override
-        default ContainerSchemaNode getInput() {
-            return findAsContainer(this, InputEffectiveStatement.class);
+        default InputSchemaNode getInput() {
+            return findAsContainer(this, InputEffectiveStatement.class, InputSchemaNode.class);
         }
 
         @Override
-        default ContainerSchemaNode getOutput() {
-            return findAsContainer(this, OutputEffectiveStatement.class);
+        default OutputSchemaNode getOutput() {
+            return findAsContainer(this, OutputEffectiveStatement.class, OutputSchemaNode.class);
         }
     }
 
@@ -561,12 +555,9 @@ public final class EffectiveStatementMixins {
     private EffectiveStatementMixins() {
     }
 
-    static ContainerSchemaNode findAsContainer(final EffectiveStatement<?, ?> stmt,
-            final Class<? extends EffectiveStatement<QName, ?>> type) {
-        final EffectiveStatement<?, ?> statement = stmt.findFirstEffectiveSubstatement(type).get();
-        verify(statement instanceof ContainerSchemaNode, "Child statement %s is not a ContainerSchemaNode",
-            statement);
-        return (ContainerSchemaNode) statement;
+    static <T extends ContainerLike> T findAsContainer(final EffectiveStatement<?, ?> stmt,
+            final Class<? extends EffectiveStatement<QName, ?>> type, Class<T> target) {
+        return target.cast(stmt.findFirstEffectiveSubstatement(type).get());
     }
 
     static Collection<? extends TypeDefinition<?>> filterTypeDefinitions(final Mixin<?, ?> stmt) {
index 448ad6b664490793a4a4c97d0bdd7d604d67d355..df5ce9910bf8dd7c87a3cff808e161e385473e00 100644 (file)
@@ -94,6 +94,11 @@ final class ContainerEffectiveStatementImpl
         return findDataSchemaNode(name);
     }
 
+    @Override
+    public ContainerEffectiveStatement asEffectiveStatement() {
+        return this;
+    }
+
     @Override
     public String toString() {
         return "container " + getQName().getLocalName();
index 22e44987f09596db443d9af8a5658c07a8172f6a..0e87aa474eaf6abdceb8407a00b6efbcf995e8a4 100644 (file)
@@ -12,6 +12,7 @@ import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
@@ -21,7 +22,7 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMix
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
 final class DeclaredInputEffectiveStatement extends WithSubstatements<QName, InputStatement, InputEffectiveStatement>
-        implements InputEffectiveStatement, OperationContainerMixin<InputStatement> {
+        implements InputEffectiveStatement, InputSchemaNode, OperationContainerMixin<InputStatement> {
     private final @NonNull SchemaPath path;
     private final int flags;
 
@@ -49,6 +50,11 @@ final class DeclaredInputEffectiveStatement extends WithSubstatements<QName, Inp
         return findDataSchemaNode(name);
     }
 
+    @Override
+    public InputEffectiveStatement asEffectiveStatement() {
+        return this;
+    }
+
     @Override
     public String toString() {
         return defaultToString();
index 2859a508e23972c56de09dd6ed8b0f29c8e5d595..5c5afe1db23451b56129d8c674e685953071682c 100644 (file)
@@ -12,6 +12,7 @@ import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
@@ -22,7 +23,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
 final class UndeclaredInputEffectiveStatement
         extends WithSubstatements<QName, InputStatement, InputEffectiveStatement>
-        implements InputEffectiveStatement, OperationContainerMixin<InputStatement> {
+        implements InputEffectiveStatement, InputSchemaNode, OperationContainerMixin<InputStatement> {
     private final @NonNull SchemaPath path;
     private final int flags;
 
@@ -50,6 +51,11 @@ final class UndeclaredInputEffectiveStatement
         return findDataSchemaNode(name);
     }
 
+    @Override
+    public InputEffectiveStatement asEffectiveStatement() {
+        return this;
+    }
+
     @Override
     public String toString() {
         return defaultToString();
index fb3bac016feb40f410b0da2bf9f2b3fb770c4704..172ea30fcf237081d86af669fbe82a278ce5e9be 100644 (file)
@@ -12,6 +12,7 @@ import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
@@ -21,7 +22,7 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMix
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
 final class DeclaredOutputEffectiveStatement extends WithSubstatements<QName, OutputStatement, OutputEffectiveStatement>
-        implements OutputEffectiveStatement, OperationContainerMixin<OutputStatement> {
+        implements OutputEffectiveStatement, OutputSchemaNode, OperationContainerMixin<OutputStatement> {
     private final @NonNull SchemaPath path;
     private final int flags;
 
@@ -49,6 +50,11 @@ final class DeclaredOutputEffectiveStatement extends WithSubstatements<QName, Ou
         return findDataSchemaNode(name);
     }
 
+    @Override
+    public OutputEffectiveStatement asEffectiveStatement() {
+        return this;
+    }
+
     @Override
     public String toString() {
         return defaultToString();
index 436476d31fd6785a8607f72e06d5bc8d5f3f85f4..16c058be14460ef2f15a2696b9f1219439947f91 100644 (file)
@@ -12,6 +12,7 @@ import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
@@ -22,7 +23,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
 final class UndeclaredOutputEffectiveStatement
         extends WithSubstatements<QName, OutputStatement, OutputEffectiveStatement>
-        implements OutputEffectiveStatement, OperationContainerMixin<OutputStatement> {
+        implements OutputEffectiveStatement, OutputSchemaNode, OperationContainerMixin<OutputStatement> {
     private final @NonNull SchemaPath path;
     private final int flags;
 
@@ -50,6 +51,11 @@ final class UndeclaredOutputEffectiveStatement
         return findDataSchemaNode(name);
     }
 
+    @Override
+    public OutputEffectiveStatement asEffectiveStatement() {
+        return this;
+    }
+
     @Override
     public String toString() {
         return defaultToString();
index 80bc332f05a83e012134ed61bce6259208262781..3bc9772196c4149a5cd600923deac186b1b4dfc4 100644 (file)
@@ -15,10 +15,11 @@ import static org.junit.Assert.fail;
 import java.util.Collection;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.common.Revision;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
@@ -43,12 +44,12 @@ public class Bug6871Test {
         assertEquals(1, rpcs.size());
         final RpcDefinition myRpc = rpcs.iterator().next();
 
-        final ContainerSchemaNode input = myRpc.getInput();
+        final InputSchemaNode input = myRpc.getInput();
         assertNotNull(input);
         mustConstraints = input.getMustConstraints();
         assertEquals(2, mustConstraints.size());
 
-        final ContainerSchemaNode output = myRpc.getOutput();
+        final OutputSchemaNode output = myRpc.getOutput();
         assertNotNull(output);
         mustConstraints = output.getMustConstraints();
         assertEquals(2, mustConstraints.size());
index 67c27973e4293d9bf3e35fc9feb7f83cdfdf5c1d..812b5e1ce8aced913b50afe87c26a7a3cf8dbf0f 100644 (file)
@@ -5,7 +5,6 @@
  * 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;
@@ -16,7 +15,9 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
@@ -37,12 +38,12 @@ public class Bug9241Test {
 
         final ActionDefinition actionInCont = actionCont.getActions().iterator().next();
 
-        final ContainerSchemaNode input = actionInCont.getInput();
+        final InputSchemaNode input = actionInCont.getInput();
         assertNotNull(input);
         assertEquals(1, input.getChildNodes().size());
         assertEquals(StatementSource.CONTEXT, ((EffectiveStatement<?, ?>) input).getStatementSource());
 
-        final ContainerSchemaNode output = actionInCont.getOutput();
+        final OutputSchemaNode output = actionInCont.getOutput();
         assertNotNull(output);
         assertEquals(1, output.getChildNodes().size());
         assertEquals(StatementSource.CONTEXT, ((EffectiveStatement<?, ?>) output).getStatementSource());
index 50e1190ac234177580aba47128e2980ccc73ec1f..8dce34a7aa1e9e464b32fc7e0e0e342c7b290a57 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
@@ -344,7 +345,7 @@ public class AugmentTest {
 
         final QName submitQName = QName.create(NS_BAR, revision, "submit");
         assertEquals(submitQName, submit.getQName());
-        final ContainerSchemaNode input = submit.getInput();
+        final InputSchemaNode input = submit.getInput();
         final QName inputQName = QName.create(NS_BAR, revision, "input");
         assertEquals(inputQName, input.getQName());
         final ChoiceSchemaNode arguments = (ChoiceSchemaNode) input.getDataChildByName(QName.create(NS_BAR, revision,
index 6575e64cf95c291929ab4beaf3f9f46e2de243e9..c3292d8f0fd74adac369f577dccbbaa99027139e 100644 (file)
@@ -31,11 +31,13 @@ import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 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.Module;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
@@ -103,9 +105,9 @@ public class DeviationResolutionTest {
         assertEquals("c2", myChoice.getDefaultCase().get().getQName().getLocalName());
 
         final RpcDefinition myRpc = barModule.getRpcs().iterator().next();
-        final ContainerSchemaNode input = myRpc.getInput();
+        final InputSchemaNode input = myRpc.getInput();
         assertEquals(2, input.getMustConstraints().size());
-        final ContainerSchemaNode output = myRpc.getOutput();
+        final OutputSchemaNode output = myRpc.getOutput();
         assertEquals(2, output.getMustConstraints().size());
 
         final NotificationDefinition myNotification = barModule.getNotifications().iterator().next();
index f80e6dd7ffbe37797e065a7cf8053581f1bc2b91..896a37e951f2fe7f73c4d48fe312aef63675b9b1 100644 (file)
@@ -81,7 +81,6 @@ public class EffectiveSchemaContextTest {
         assertFalse(schemaContext.isAugmenting());
         assertFalse(schemaContext.isAddedByUses());
         assertFalse(schemaContext.isConfiguration());
-        assertFalse(schemaContext.isPresenceContainer());
         assertFalse(schemaContext.getWhenCondition().isPresent());
         assertEquals(0, schemaContext.getMustConstraints().size());
         assertFalse(schemaContext.getDescription().isPresent());
index 3456a3791a3dc9cd111a2e29c6f5fa1e60459213..6d308571d78f507a1c4aa7cf685b5dc4fa5032f0 100644 (file)
@@ -21,7 +21,9 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -46,7 +48,7 @@ public class RpcStmtTest {
         final RpcDefinition rpc = testModule.getRpcs().iterator().next();
         assertEquals("get-config", rpc.getQName().getLocalName());
 
-        final ContainerSchemaNode input = rpc.getInput();
+        final InputSchemaNode input = rpc.getInput();
         assertNotNull(input);
         assertEquals(2, input.getChildNodes().size());
 
@@ -57,7 +59,7 @@ public class RpcStmtTest {
             QName.create(testModule.getQNameModule(), "filter"));
         assertNotNull(anyXml);
 
-        final ContainerSchemaNode output = rpc.getOutput();
+        final OutputSchemaNode output = rpc.getOutput();
         assertNotNull(output);
         assertEquals(1, output.getChildNodes().size());
 
@@ -108,12 +110,12 @@ public class RpcStmtTest {
 
         final RpcDefinition barRpc = rpcs.iterator().next();
 
-        final ContainerSchemaNode input = barRpc.getInput();
+        final InputSchemaNode input = barRpc.getInput();
         assertNotNull(input);
         assertEquals(2, input.getChildNodes().size());
         assertEquals(StatementSource.CONTEXT, ((EffectiveStatement<?, ?>) input).getStatementSource());
 
-        final ContainerSchemaNode output = barRpc.getOutput();
+        final OutputSchemaNode output = barRpc.getOutput();
         assertNotNull(output);
         assertEquals(2, output.getChildNodes().size());
         assertEquals(StatementSource.CONTEXT, ((EffectiveStatement<?, ?>) output).getStatementSource());
index 56493db97e4a228100b77ce4468e4ef2b3d8ec77..02cbcaf53e249e1071be1a247dac3fd29a999abd 100644 (file)
@@ -13,8 +13,9 @@ import static org.junit.Assert.assertNotNull;
 import java.util.Collection;
 import java.util.Optional;
 import org.junit.Test;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.stmt.TestUtils;
 
@@ -43,11 +44,11 @@ public class YinFileRpcStmtTest extends AbstractYinModulesTest {
                 + "<error-tag> is 'operation-failed', and <error-app-tag> is\n"
                 + "'data-not-unique'."), rpc.getDescription());
 
-        ContainerSchemaNode input = rpc.getInput();
+        InputSchemaNode input = rpc.getInput();
         assertNotNull(input);
         assertEquals(3, input.getChildNodes().size());
 
-        ContainerSchemaNode output = rpc.getOutput();
+        OutputSchemaNode output = rpc.getOutput();
         assertNotNull(output);
         assertEquals(1, output.getChildNodes().size());
     }