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=1ff166d6c7efa249a312dda5e58b3b6422b3c1f4;hb=e9e1269514ffbb04e52e0125c195ed9623da18e8;hp=5bce99c4cb2f892aa393d50c6a6626aab8b1e59d;hpb=19c31f13e5040750d30cf9f4211913b2be04b403;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 5bce99c4cb..1ff166d6c7 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,71 +7,64 @@ */ 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; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; 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 NoOp extends MandatoryLeafEnforcer { - @Override - protected void enforceOnTreeNode(final TreeNode tree) { - // Intentional no-op - } +final class MandatoryLeafEnforcer implements Immutable { + private static final Logger LOG = LoggerFactory.getLogger(MandatoryLeafEnforcer.class); - @Override - protected void enforceOnTreeNode(final NormalizedNode normalizedNode) { - // Intentional no-op - } - } + private final ImmutableList mandatoryNodes; - private static final class Strict extends MandatoryLeafEnforcer { - private final Collection mandatoryNodes; + private MandatoryLeafEnforcer(final ImmutableList mandatoryNodes) { + this.mandatoryNodes = requireNonNull(mandatoryNodes); + } - private Strict(final Collection mandatoryNodes) { - this.mandatoryNodes = Preconditions.checkNotNull(mandatoryNodes); + static Optional forContainer(final DataNodeContainer schema, + final DataTreeConfiguration treeConfig) { + if (!treeConfig.isMandatoryNodesValidationEnabled()) { + return Optional.empty(); } - @Override - protected void enforceOnTreeNode(final TreeNode tree) { - enforceOnTreeNode(tree.getData()); - } + 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)); + } - @Override - protected void enforceOnTreeNode(final NormalizedNode data) { - for (YangInstanceIdentifier id : mandatoryNodes) { - final Optional> descandant = NormalizedNodes.findNode(data, id); - Preconditions.checkArgument(descandant.isPresent(), "Node %s is missing mandatory descendant %s", - data.getIdentifier(), id); - } + 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); } } - private static final Logger LOG = LoggerFactory.getLogger(MandatoryLeafEnforcer.class); - private static final MandatoryLeafEnforcer NOOP_ENFORCER = new NoOp(); - - protected abstract void enforceOnTreeNode(final TreeNode tree); - - protected abstract void enforceOnTreeNode(final NormalizedNode normalizedNode); + void enforceOnTreeNode(final TreeNode tree) { + enforceOnData(tree.getData()); + } private static void findMandatoryNodes(final Builder builder, final YangInstanceIdentifier id, final DataNodeContainer schema, final TreeType type) { - for (DataSchemaNode child : schema.getChildNodes()) { + for (final DataSchemaNode child : schema.getChildNodes()) { if (SchemaAwareApplyOperation.belongsToTree(type, child)) { if (child instanceof ContainerSchemaNode) { final ContainerSchemaNode container = (ContainerSchemaNode) child; @@ -79,9 +72,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 > 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()); @@ -90,18 +89,4 @@ abstract class MandatoryLeafEnforcer implements Immutable { } } } - - static MandatoryLeafEnforcer forContainer(final DataNodeContainer schema, final TreeType type) { - switch (type) { - case CONFIGURATION: - final Builder builder = ImmutableList.builder(); - findMandatoryNodes(builder, YangInstanceIdentifier.EMPTY, schema, type); - final Collection mandatoryNodes = builder.build(); - return mandatoryNodes.isEmpty() ? NOOP_ENFORCER : new Strict(mandatoryNodes); - case OPERATIONAL: - return NOOP_ENFORCER; - default: - throw new UnsupportedOperationException(String.format("Not supported tree type %s", type)); - } - } }