* 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;
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;
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,
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 "
}
}
- 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:
// - 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();