From 59c1e77ad7a69781031df8b2ae1e8ebd4ab65e06 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 5 Sep 2018 23:39:18 +0200 Subject: [PATCH] Do not validate non-existent roots If we have no data there is no point to validate anything, and having the root value as an invariant makes code a lot simpler. JIRA: YANGTOOLS-892 Change-Id: Ifd68b09c03d90c8881381809047e59f3fe92682b Signed-off-by: Robert Varga (cherry picked from commit d2e80009970418f4755854f0918c5d80afb21a34) --- .../impl/leafref/LeafRefValidatation.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefValidatation.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefValidatation.java index 10265d3a3d..3f32ca7b02 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefValidatation.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefValidatation.java @@ -51,19 +51,23 @@ public final class LeafRefValidatation { private final Set validatedLeafRefCtx = new HashSet<>(); private final List errorsMessages = new ArrayList<>(); - private final DataTreeCandidate tree; + private final NormalizedNode root; - private LeafRefValidatation(final DataTreeCandidate tree) { - this.tree = tree; + private LeafRefValidatation(final NormalizedNode root) { + this.root = root; } public static void validate(final DataTreeCandidate tree, final LeafRefContext rootLeafRefCtx) throws LeafRefDataValidationFailedException { - new LeafRefValidatation(tree).validate0(rootLeafRefCtx); + final Optional> root = tree.getRootNode().getDataAfter(); + if (root.isPresent()) { + new LeafRefValidatation(root.get()).validateChildren(rootLeafRefCtx, tree.getRootNode().getChildNodes()); + } } - private void validate0(final LeafRefContext rootLeafRefCtx) throws LeafRefDataValidationFailedException { - for (final DataTreeCandidateNode dataTreeCandidateNode : tree.getRootNode().getChildNodes()) { + private void validateChildren(final LeafRefContext rootLeafRefCtx, final Collection children) + throws LeafRefDataValidationFailedException { + for (final DataTreeCandidateNode dataTreeCandidateNode : children) { if (dataTreeCandidateNode.getModificationType() != ModificationType.UNMODIFIED) { final PathArgument identifier = dataTreeCandidateNode.getIdentifier(); final QName childQName = identifier.getNodeType(); @@ -352,16 +356,13 @@ public final class LeafRefValidatation { } private Set extractRootValues(final LeafRefContext context) { - return tree.getRootNode().getDataAfter() - .map(root -> computeValues(root, context.getLeafRefNodePath().getPathFromRoot(), null)) - .orElse(ImmutableSet.of()); + return computeValues(root, context.getLeafRefNodePath().getPathFromRoot(), null); } private void validateLeafRefNodeData(final NormalizedNode leaf, final LeafRefContext referencingCtx, final ModificationType modificationType, final YangInstanceIdentifier current) { - final Set values = tree.getRootNode().getDataAfter().map( - root -> computeValues(root, referencingCtx.getAbsoluteLeafRefTargetPath().getPathFromRoot(), current)) - .orElse(ImmutableSet.of()); + final Set values = computeValues(root, referencingCtx.getAbsoluteLeafRefTargetPath().getPathFromRoot(), + current); if (values.contains(leaf.getValue())) { LOG.debug("Operation [{}] validate data of LEAFREF node: name[{}] = value[{}] {}", modificationType, referencingCtx.getNodeName(), leaf.getValue(), SUCCESS); @@ -491,7 +492,7 @@ public final class LeafRefValidatation { private Set getPathKeyExpressionValues(final LeafRefPath predicatePathKeyExpression, final YangInstanceIdentifier current) { - return findParentNode(tree.getRootNode().getDataAfter(), current) + return findParentNode(Optional.of(root), current) .map(parent -> computeValues(parent, nextLevel(predicatePathKeyExpression.getPathFromRoot()), null)) .orElse(ImmutableSet.of()); } -- 2.36.6