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%2Fleafref%2FLeafRefValidatation.java;h=e73a8c48e2c15da4f02811867b35c5c37aa88559;hb=ba99ac3e338845343ffee7724e453f41469d9486;hp=1a18066f59e251355a7160925895edb96f48191d;hpb=408a9568d92a6761a64cdf8aebb4ab55843a7a45;p=yangtools.git 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 1a18066f59..e73a8c48e2 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 @@ -21,7 +21,9 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; @@ -419,40 +421,41 @@ public final class LeafRefValidatation { } } } else if (node instanceof MapNode) { - final MapNode map = (MapNode) node; - if (nodePredicates.isEmpty() || current == null) { - final Iterable value = map.getValue(); - for (final MapEntryNode mapEntryNode : value) { - final Optional> child = mapEntryNode.getChild(pathArgument); - if (child.isPresent()) { - addNextValues(values, child.get(), next.getQNamePredicates(), path, current); - } else { - for (final ChoiceNode choiceNode : getChoiceNodes(mapEntryNode)) { - addValues(values, choiceNode, next.getQNamePredicates(), path, current); - } + Stream entries = ((MapNode) node).getValue().stream(); + if (!nodePredicates.isEmpty() && current != null) { + entries = entries.filter(createMapEntryPredicate(nodePredicates, current)); + } + + entries.forEach(mapEntryNode -> { + final Optional> child = mapEntryNode.getChild(pathArgument); + if (child.isPresent()) { + addNextValues(values, child.get(), next.getQNamePredicates(), path, current); + } else { + for (final ChoiceNode choiceNode : getChoiceNodes(mapEntryNode)) { + addValues(values, choiceNode, next.getQNamePredicates(), path, current); } } - } else { - final Map> keyValues = new HashMap<>(); - for (QNamePredicate predicate : nodePredicates) { - keyValues.put(predicate.getIdentifier(), - getPathKeyExpressionValues(predicate.getPathKeyExpression(), current)); - } + }); + } + } - for (final MapEntryNode mapEntryNode : map.getValue()) { - if (isMatchingPredicate(mapEntryNode, keyValues)) { - final Optional> child = mapEntryNode.getChild(pathArgument); - if (child.isPresent()) { - addNextValues(values, child.get(), next.getQNamePredicates(), path, current); - } else { - for (final ChoiceNode choiceNode : getChoiceNodes(mapEntryNode)) { - addValues(values, choiceNode, next.getQNamePredicates(), path, current); - } - } - } + private Predicate createMapEntryPredicate(final List nodePredicates, + final YangInstanceIdentifier current) { + final Map> keyValues = new HashMap<>(); + for (QNamePredicate predicate : nodePredicates) { + keyValues.put(predicate.getIdentifier(), getPathKeyExpressionValues(predicate.getPathKeyExpression(), + current)); + } + + return mapEntry -> { + for (final Entry entryKeyValue : mapEntry.getIdentifier().getKeyValues().entrySet()) { + final Set allowedValues = keyValues.get(entryKeyValue.getKey()); + if (allowedValues != null && !allowedValues.contains(entryKeyValue.getValue())) { + return false; } } - } + return true; + }; } private void addNextValues(final Set values, final NormalizedNode node, @@ -476,18 +479,6 @@ public final class LeafRefValidatation { return choiceNodes; } - private static boolean isMatchingPredicate(final MapEntryNode mapEntryNode, - final Map> allowedKeyValues) { - for (final Entry entryKeyValue : mapEntryNode.getIdentifier().getKeyValues().entrySet()) { - final Set allowedValues = allowedKeyValues.get(entryKeyValue.getKey()); - if (allowedValues != null && !allowedValues.contains(entryKeyValue.getValue())) { - return false; - } - } - - return true; - } - private Set getPathKeyExpressionValues(final LeafRefPath predicatePathKeyExpression, final YangInstanceIdentifier current) { return findParentNode(Optional.of(root), current).map(parent -> {