X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=data%2Fyang-data-spi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fspi%2Fnode%2FMandatoryLeafEnforcer.java;fp=data%2Fyang-data-tree-ri%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Ftree%2Fimpl%2FMandatoryLeafEnforcer.java;h=e102fc4f5f4ba63796843dea8c7f8b074850107f;hb=da443e62dc61e6ae01ae93f226fab4c92664d157;hp=421291f718e4108a9a831128ef6f0900dd5bbc5e;hpb=76826832f88746db23040783839e5920e4b31f58;p=yangtools.git diff --git a/data/yang-data-tree-ri/src/main/java/org/opendaylight/yangtools/yang/data/tree/impl/MandatoryLeafEnforcer.java b/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 421291f718..e102fc4f5f 100644 --- a/data/yang-data-tree-ri/src/main/java/org/opendaylight/yangtools/yang/data/tree/impl/MandatoryLeafEnforcer.java +++ b/data/yang-data-spi/src/main/java/org/opendaylight/yangtools/yang/data/spi/node/MandatoryLeafEnforcer.java @@ -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.>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> 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();