X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2Ftree%2FMandatoryLeafEnforcer.java;h=90ae47c9865183f29534d5ffa733894c9e5616ee;hb=35fed4fb3caf6a7462f680de806389701d78bd6c;hp=d2d6a893d692689b7174c82939562f34e8ca563a;hpb=a6ea70c09b13489918c387d54cde8f1095721acc;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MandatoryLeafEnforcer.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MandatoryLeafEnforcer.java index d2d6a893d6..90ae47c986 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MandatoryLeafEnforcer.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MandatoryLeafEnforcer.java @@ -7,11 +7,12 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema.tree; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableCollection.Builder; +import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Objects.requireNonNull; + import com.google.common.collect.ImmutableList; -import java.util.Collection; +import com.google.common.collect.ImmutableList.Builder; +import java.util.Optional; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; @@ -20,46 +21,48 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration; 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.ConstraintDefinition; 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.ElementCountConstraintAware; +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?) -abstract class MandatoryLeafEnforcer implements Immutable { - private static final class Strict extends MandatoryLeafEnforcer { - private final Collection mandatoryNodes; +final class MandatoryLeafEnforcer implements Immutable { + private static final Logger LOG = LoggerFactory.getLogger(MandatoryLeafEnforcer.class); - Strict(final Collection mandatoryNodes) { - this.mandatoryNodes = Preconditions.checkNotNull(mandatoryNodes); - } + private final ImmutableList mandatoryNodes; - @Override - void enforceOnData(final NormalizedNode data) { - for (final YangInstanceIdentifier id : mandatoryNodes) { - final Optional> descandant = NormalizedNodes.findNode(data, id); - Preconditions.checkArgument(descandant.isPresent(), "Node %s is missing mandatory descendant %s", - data.getIdentifier(), id); - } + private MandatoryLeafEnforcer(final ImmutableList mandatoryNodes) { + this.mandatoryNodes = requireNonNull(mandatoryNodes); + } + + + static Optional forContainer(final DataNodeContainer schema, + final DataTreeConfiguration treeConfig) { + if (!treeConfig.isMandatoryNodesValidationEnabled()) { + return Optional.empty(); } + + final Builder builder = ImmutableList.builder(); + findMandatoryNodes(builder, YangInstanceIdentifier.empty(), schema, treeConfig.getTreeType()); + final ImmutableList mandatoryNodes = builder.build(); + return mandatoryNodes.isEmpty() ? Optional.empty() : Optional.of(new MandatoryLeafEnforcer(mandatoryNodes)); } - private static final Logger LOG = LoggerFactory.getLogger(MandatoryLeafEnforcer.class); - private static final MandatoryLeafEnforcer NOOP_ENFORCER = new MandatoryLeafEnforcer() { - @Override - void enforceOnData(final NormalizedNode normalizedNode) { - // Intentional no-op + void enforceOnData(final NormalizedNode data) { + for (final YangInstanceIdentifier id : mandatoryNodes) { + checkArgument(NormalizedNodes.findNode(data, id).isPresent(), + "Node %s is missing mandatory descendant %s", data.getIdentifier(), id); } - }; + } - final void enforceOnTreeNode(final TreeNode tree) { + void enforceOnTreeNode(final TreeNode tree) { enforceOnData(tree.getData()); } - abstract void enforceOnData(NormalizedNode normalizedNode); - private static void findMandatoryNodes(final Builder builder, final YangInstanceIdentifier id, final DataNodeContainer schema, final TreeType type) { for (final DataSchemaNode child : schema.getChildNodes()) { @@ -70,9 +73,15 @@ abstract class MandatoryLeafEnforcer implements Immutable { findMandatoryNodes(builder, id.node(NodeIdentifier.create(child.getQName())), container, type); } } else { - final ConstraintDefinition constraints = child.getConstraints(); - final Integer minElements = constraints.getMinElements(); - if (constraints.isMandatory() || minElements != null && minElements.intValue() > 0) { + boolean needEnforce = child instanceof MandatoryAware && ((MandatoryAware) child).isMandatory(); + if (!needEnforce && child instanceof ElementCountConstraintAware) { + needEnforce = ((ElementCountConstraintAware) child) + .getElementCountConstraint().map(constraint -> { + final Integer min = constraint.getMinElements(); + return min != null && min > 0; + }).orElse(Boolean.FALSE).booleanValue(); + } + if (needEnforce) { final YangInstanceIdentifier childId = id.node(NodeIdentifier.create(child.getQName())); LOG.debug("Adding mandatory child {}", childId); builder.add(childId.toOptimized()); @@ -81,15 +90,4 @@ abstract class MandatoryLeafEnforcer implements Immutable { } } } - - static MandatoryLeafEnforcer forContainer(final DataNodeContainer schema, final DataTreeConfiguration treeConfig) { - if (!treeConfig.isMandatoryNodesValidationEnabled()) { - return NOOP_ENFORCER; - } - - final Builder builder = ImmutableList.builder(); - findMandatoryNodes(builder, YangInstanceIdentifier.EMPTY, schema, treeConfig.getTreeType()); - final Collection mandatoryNodes = builder.build(); - return mandatoryNodes.isEmpty() ? NOOP_ENFORCER : new Strict(mandatoryNodes); - } }