BUG-4355: mandatory node presence enforcement
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / tree / CaseEnforcer.java
index 62a5f837dddd1d4bbdba7d51c987cd90c46d3b98..87a7f786f27905b84b5b2bc0f32f0401c5bf6937 100644 (file)
@@ -15,29 +15,33 @@ import java.util.Map.Entry;
 import java.util.Set;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 
 final class CaseEnforcer implements Immutable {
     private final Map<NodeIdentifier, DataSchemaNode> children;
+    private final MandatoryLeafEnforcer enforcer;
 
-    private CaseEnforcer(final Map<NodeIdentifier, DataSchemaNode> children) {
+    private CaseEnforcer(final Map<NodeIdentifier, DataSchemaNode> children, final MandatoryLeafEnforcer enforcer) {
         this.children = Preconditions.checkNotNull(children);
+        this.enforcer = Preconditions.checkNotNull(enforcer);
     }
 
-    static CaseEnforcer forTree(final ChoiceCaseNode schema, final TreeType treeType) {
+    static CaseEnforcer forTree(final ChoiceCaseNode schema, final TreeType type) {
         final Builder<NodeIdentifier, DataSchemaNode> builder = ImmutableMap.builder();
-        if (SchemaAwareApplyOperation.belongsToTree(treeType, schema)) {
+        if (SchemaAwareApplyOperation.belongsToTree(type, schema)) {
             for (DataSchemaNode child : schema.getChildNodes()) {
-                if (SchemaAwareApplyOperation.belongsToTree(treeType, child)) {
+                if (SchemaAwareApplyOperation.belongsToTree(type, child)) {
                     builder.put(NodeIdentifier.create(child.getQName()), child);
                 }
             }
         }
 
         final Map<NodeIdentifier, DataSchemaNode> children = builder.build();
-        return children.isEmpty() ? null : new CaseEnforcer(children);
+        return children.isEmpty() ? null : new CaseEnforcer(children, MandatoryLeafEnforcer.forContainer(schema, type));
     }
 
     Set<Entry<NodeIdentifier, DataSchemaNode>> getChildEntries() {
@@ -47,4 +51,12 @@ final class CaseEnforcer implements Immutable {
     Set<NodeIdentifier> getChildIdentifiers() {
         return children.keySet();
     }
+
+    void enforceOnTreeNode(final TreeNode tree) {
+        enforcer.enforceOnTreeNode(tree);
+    }
+
+    void enforceOnTreeNode(final NormalizedNode<?, ?> normalizedNode) {
+        enforcer.enforceOnTreeNode(normalizedNode);
+    }
 }