Promote MandatorLeafEnforcer
[yangtools.git] / data / yang-data-tree-ri / src / main / java / org / opendaylight / yangtools / yang / data / tree / impl / SchemaAwareApplyOperation.java
index 741d6fd3a61374203c31a602d6cd7ae3a557ef40..709569a3380493d6a01d9e508fed91d246a52480 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode;
 import org.opendaylight.yangtools.yang.data.api.schema.AnyxmlNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.spi.node.MandatoryLeafEnforcer;
 import org.opendaylight.yangtools.yang.data.tree.api.ConflictingModificationAppliedException;
 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeConfiguration;
 import org.opendaylight.yangtools.yang.data.tree.api.DataValidationFailedException;
@@ -30,6 +31,7 @@ import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
 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.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
@@ -293,4 +295,15 @@ abstract sealed class SchemaAwareApplyOperation<T extends DataSchemaNode> extend
     static final boolean belongsToTree(final TreeType treeType, final DataSchemaNode node) {
         return treeType == TreeType.OPERATIONAL || node.effectiveConfig().orElse(Boolean.TRUE);
     }
+
+    static final @Nullable MandatoryLeafEnforcer enforcerFor(final DataSchemaNode schema,
+            final DataTreeConfiguration treeConfig) {
+        if (treeConfig.isMandatoryNodesValidationEnabled() && schema instanceof DataNodeContainer container) {
+            final var includeConfigFalse = treeConfig.getTreeType() == TreeType.OPERATIONAL;
+            if (includeConfigFalse || schema.effectiveConfig().orElse(Boolean.TRUE)) {
+                return MandatoryLeafEnforcer.forContainer(container, includeConfigFalse);
+            }
+        }
+        return null;
+    }
 }