From: Robert Varga Date: Wed, 5 Sep 2018 20:12:02 +0000 (+0200) Subject: Eliminate leafRefTargetNodeDataLog() X-Git-Tag: v2.0.6.3~14 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=41612453c96d2a1acca82dec96d51a716756b128;p=yangtools.git Eliminate leafRefTargetNodeDataLog() Now that we captured invariants, we can proceed to turn leafRefTargetNodeDataLog() into a simpler lambda form. JIRA: YANGTOOLS-892 Change-Id: I4644d0f3bc31f9f9cb3643e8443159522f14ccaa Signed-off-by: Robert Varga (cherry picked from commit 86e7fb7d83ea73633b4e50bfbe95ded122b69a85) --- 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 5af7fb3b26..bf7f2a74ab 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 @@ -18,6 +18,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; @@ -313,24 +314,39 @@ public final class LeafRefValidatation { private void validateLeafRefTargetNodeData(final NormalizedNode leaf, final LeafRefContext referencedByCtx, final ModificationType modificationType) { - if (validatedLeafRefCtx.contains(referencedByCtx)) { + if (!validatedLeafRefCtx.add(referencedByCtx)) { LOG.trace("Operation [{}] validate data of leafref TARGET node: name[{}] = value[{}] -> SKIP: Already " + "validated", modificationType, referencedByCtx.getNodeName(), leaf.getValue()); return; } - final Map> leafRefsValues = new HashMap<>(); - for (final LeafRefContext leafRefContext : referencedByCtx.getAllReferencedByLeafRefCtxs().values()) { - if (leafRefContext.isReferencing()) { - leafRefsValues.put(leafRefContext, extractRootValues(leafRefContext)); - } + LOG.trace("Operation [{}] validate data of leafref TARGET node: name[{}] = value[{}]", modificationType, + referencedByCtx.getNodeName(), leaf.getValue()); + final Set leafRefs = referencedByCtx.getAllReferencedByLeafRefCtxs().values().stream() + .filter(LeafRefContext::isReferencing).collect(Collectors.toSet()); + if (leafRefs.isEmpty()) { + return; } - if (!leafRefsValues.isEmpty()) { - final Set values = extractRootValues(referencedByCtx); - leafRefTargetNodeDataLog(leaf, referencedByCtx, modificationType, leafRefsValues, values); - } - validatedLeafRefCtx.add(referencedByCtx); + final Set leafRefTargetNodeValues = extractRootValues(referencedByCtx); + leafRefs.forEach(leafRefContext -> { + extractRootValues(leafRefContext).forEach(leafRefsValue -> { + if (leafRefTargetNodeValues.contains(leafRefsValue)) { + LOG.trace("Valid leafref value [{}] {}", leafRefsValue, SUCCESS); + return; + } + + LOG.debug("Invalid leafref value [{}] allowed values {} by validation of leafref TARGET node: {} path " + + "of invalid LEAFREF node: {} leafRef target path: {} {}", leafRefsValue, + leafRefTargetNodeValues, leaf.getNodeType(), leafRefContext.getCurrentNodePath(), + leafRefContext.getAbsoluteLeafRefTargetPath(), FAILED); + errorsMessages.add(String.format("Invalid leafref value [%s] allowed values %s by validation of leafref" + + " TARGET node: %s path of invalid LEAFREF node: %s leafRef target path: %s %s", leafRefsValue, + leafRefTargetNodeValues, leaf.getNodeType(), leafRefContext.getCurrentNodePath(), + leafRefContext.getAbsoluteLeafRefTargetPath(), + FAILED)); + }); + }); } private Set extractRootValues(final LeafRefContext context) { @@ -340,39 +356,11 @@ public final class LeafRefValidatation { return values; } - private void leafRefTargetNodeDataLog(final NormalizedNode leaf, final LeafRefContext referencedByCtx, - final ModificationType modificationType, final Map> leafRefsValues, - final Set leafRefTargetNodeValues) { - - LOG.debug("Operation [{}] validate data of leafref TARGET node: name[{}] = value[{}]", modificationType, - referencedByCtx.getNodeName(), leaf.getValue()); - for (final Entry> entry : leafRefsValues.entrySet()) { - for (final Object leafRefsValue : entry.getValue()) { - if (!leafRefTargetNodeValues.contains(leafRefsValue)) { - final LeafRefContext leafRefContext = entry.getKey(); - LOG.debug("Invalid leafref value [{}] allowed values {} by validation of leafref TARGET node: " - + "{} path of invalid LEAFREF node: {} leafRef target path: {} {}", leafRefsValue, - leafRefTargetNodeValues, leaf.getNodeType(), leafRefContext.getCurrentNodePath(), - leafRefContext.getAbsoluteLeafRefTargetPath(), FAILED); - errorsMessages.add(String.format("Invalid leafref value [%s] allowed values %s by validation of " - + "leafref TARGET node: %s path of invalid LEAFREF node: %s leafRef target path: %s %s", - leafRefsValue, leafRefTargetNodeValues, leaf.getNodeType(), - leafRefContext.getCurrentNodePath(), leafRefContext.getAbsoluteLeafRefTargetPath(), - FAILED)); - } else { - LOG.trace("Valid leafref value [{}] {}", leafRefsValue, SUCCESS); - } - } - } - } - private void validateLeafRefNodeData(final NormalizedNode leaf, final LeafRefContext referencingCtx, final ModificationType modificationType, final YangInstanceIdentifier current) { final HashSet values = new HashSet<>(); - final LeafRefPath targetPath = referencingCtx.getAbsoluteLeafRefTargetPath(); - final Iterable pathFromRoot = targetPath.getPathFromRoot(); - - addValues(values, tree.getRootNode().getDataAfter(), pathFromRoot, current, QNameWithPredicate.ROOT); + addValues(values, tree.getRootNode().getDataAfter(), + referencingCtx.getAbsoluteLeafRefTargetPath().getPathFromRoot(), current, QNameWithPredicate.ROOT); if (values.contains(leaf.getValue())) { LOG.debug("Operation [{}] validate data of LEAFREF node: name[{}] = value[{}] {}", modificationType, @@ -505,16 +493,10 @@ public final class LeafRefValidatation { private Set getPathKeyExpressionValues(final LeafRefPath predicatePathKeyExpression, final YangInstanceIdentifier current) { - final Optional> parent = findParentNode(tree.getRootNode().getDataAfter(), current); - final Iterable predicatePathExpr = predicatePathKeyExpression.getPathFromRoot(); - final Iterable predicatePath = nextLevel(predicatePathExpr); - final Set values = new HashSet<>(); - // FIXME: this null check does not look right - if (parent != null) { - addValues(values, parent, predicatePath, null, QNameWithPredicate.ROOT); - } + addValues(values, parent, nextLevel(predicatePathKeyExpression.getPathFromRoot()), null, + QNameWithPredicate.ROOT); return values; }