Promote MandatorLeafEnforcer
[yangtools.git] / data / yang-data-spi / src / main / java / org / opendaylight / yangtools / yang / data / spi / node / MandatoryLeafEnforcer.java
similarity index 85%
rename from data/yang-data-tree-ri/src/main/java/org/opendaylight/yangtools/yang/data/tree/impl/MandatoryLeafEnforcer.java
rename to data/yang-data-spi/src/main/java/org/opendaylight/yangtools/yang/data/spi/node/MandatoryLeafEnforcer.java
index 421291f718e4108a9a831128ef6f0900dd5bbc5e..e102fc4f5f4ba63796843dea8c7f8b074850107f 100644 (file)
@@ -5,7 +5,7 @@
  * 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.data.tree.impl;
+package org.opendaylight.yangtools.yang.data.spi.node;
 
 import static java.util.Objects.requireNonNull;
 
@@ -18,9 +18,6 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes;
-import org.opendaylight.yangtools.yang.data.tree.api.DataTreeConfiguration;
-import org.opendaylight.yangtools.yang.data.tree.api.TreeType;
-import org.opendaylight.yangtools.yang.data.tree.impl.node.TreeNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.ElementCountConstraintAware;
@@ -28,8 +25,7 @@ import org.opendaylight.yangtools.yang.model.api.MandatoryAware;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-// TODO: would making this Serializable be useful (for Functions and similar?)
-final class MandatoryLeafEnforcer implements Immutable {
+public final class MandatoryLeafEnforcer implements Immutable {
     private static final Logger LOG = LoggerFactory.getLogger(MandatoryLeafEnforcer.class);
 
     // FIXME: Well, there is still room to optimize footprint and performance. This list of lists can have overlaps,
@@ -71,19 +67,16 @@ final class MandatoryLeafEnforcer implements Immutable {
         this.mandatoryNodes = requireNonNull(mandatoryNodes);
     }
 
-    static @Nullable MandatoryLeafEnforcer forContainer(final DataNodeContainer schema,
-            final DataTreeConfiguration treeConfig) {
-        if (!treeConfig.isMandatoryNodesValidationEnabled()) {
-            return null;
-        }
+    public static @Nullable MandatoryLeafEnforcer forContainer(final DataNodeContainer schema,
+            final boolean includeConfigFalse) {
 
         final var builder = ImmutableList.<ImmutableList<PathArgument>>builder();
-        findMandatoryNodes(builder, YangInstanceIdentifier.of(), schema, treeConfig.getTreeType());
+        findMandatoryNodes(builder, YangInstanceIdentifier.of(), schema, includeConfigFalse);
         final var mandatoryNodes = builder.build();
         return mandatoryNodes.isEmpty() ? null : new MandatoryLeafEnforcer(mandatoryNodes);
     }
 
-    void enforceOnData(final NormalizedNode data) {
+    public void enforceOnData(final NormalizedNode data) {
         for (var path : mandatoryNodes) {
             if (NormalizedNodes.findNode(data, path).isEmpty()) {
                 throw new IllegalArgumentException("Node " + data.name() + " is missing mandatory descendant "
@@ -92,14 +85,10 @@ final class MandatoryLeafEnforcer implements Immutable {
         }
     }
 
-    void enforceOnTreeNode(final TreeNode tree) {
-        enforceOnData(tree.getData());
-    }
-
     private static void findMandatoryNodes(final Builder<ImmutableList<PathArgument>> builder,
-            final YangInstanceIdentifier id, final DataNodeContainer schema, final TreeType type) {
+            final YangInstanceIdentifier id, final DataNodeContainer schema, final boolean includeConfigFalse) {
         for (var child : schema.getChildNodes()) {
-            if (SchemaAwareApplyOperation.belongsToTree(type, child)) {
+            if (includeConfigFalse || child.effectiveConfig().orElse(Boolean.TRUE)) {
                 if (child instanceof ContainerSchemaNode container) {
                     if (!container.isPresenceContainer()) {
                         // the container is either:
@@ -107,7 +96,7 @@ final class MandatoryLeafEnforcer implements Immutable {
                         //    - in an augmented subtree
                         // in both cases just append the NodeID to the ongoing ID and continue the search.
                         findMandatoryNodes(builder, id.node(NodeIdentifier.create(container.getQName())), container,
-                            type);
+                            includeConfigFalse);
                     }
                 } else {
                     boolean needEnforce = child instanceof MandatoryAware aware && aware.isMandatory();