Eliminate LeafRefValidation.forEachChoice() 39/75939/1
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 10 Sep 2018 15:19:51 +0000 (17:19 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 10 Sep 2018 15:40:40 +0000 (15:40 +0000)
As it turns out the two call sites can share more code. Introduce
processChildNode(), inlining forEachChoice() and its surrounding
lookup logic.

JIRA: YANGTOOLS-892
Change-Id: I2091abcd579ce1d48a628c3bdea9b4514b050e29
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefValidation.java

index 3462f6e222b2a090e9a08f5810d366cea9246857..5de4f032ba03ab0ea1c9439d51fe1d45232f2297 100644 (file)
@@ -21,7 +21,6 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
-import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -371,32 +370,33 @@ public final class LeafRefValidation {
             return;
         }
 
-        final QName qname = next.getQName();
-        final PathArgument pathArgument = new NodeIdentifier(qname);
+        final PathArgument pathArgument = new NodeIdentifier(next.getQName());
         if (node instanceof DataContainerNode) {
-            final DataContainerNode<?> dataContainerNode = (DataContainerNode<?>) node;
-            final Optional<DataContainerChild<?, ?>> child = dataContainerNode.getChild(pathArgument);
-            if (child.isPresent()) {
-                addNextValues(values, child.get(), next.getQNamePredicates(), path, current);
-            } else {
-                forEachChoice(dataContainerNode,
-                    choice -> addValues(values, choice, next.getQNamePredicates(), path, current));
-            }
+            processChildNode(values, (DataContainerNode<?>) node, pathArgument, next.getQNamePredicates(), path,
+                current);
         } else if (node instanceof MapNode) {
             Stream<MapEntryNode> entries = ((MapNode) node).getValue().stream();
             if (!nodePredicates.isEmpty() && current != null) {
                 entries = entries.filter(createMapEntryPredicate(nodePredicates, current));
             }
 
-            entries.forEach(mapEntryNode -> {
-                final Optional<DataContainerChild<?, ?>> child = mapEntryNode.getChild(pathArgument);
-                if (child.isPresent()) {
-                    addNextValues(values, child.get(), next.getQNamePredicates(), path, current);
-                } else {
-                    forEachChoice(mapEntryNode,
-                        choice -> addValues(values, choice, next.getQNamePredicates(), path, current));
+            entries.forEach(entry -> processChildNode(values, entry, pathArgument, next.getQNamePredicates(), path,
+                current));
+        }
+    }
+
+    private void processChildNode(final Set<Object> values, final DataContainerNode<?> parent,
+            final PathArgument arg, final List<QNamePredicate> nodePredicates, final Deque<QNameWithPredicate> path,
+            final YangInstanceIdentifier current) {
+        final Optional<DataContainerChild<?, ?>> child = parent.getChild(arg);
+        if (!child.isPresent()) {
+            for (final DataContainerChild<?, ?> choice : parent.getValue()) {
+                if (choice instanceof ChoiceNode) {
+                    addValues(values, choice, nodePredicates, path, current);
                 }
-            });
+            }
+        } else {
+            addNextValues(values, child.get(), nodePredicates, path, current);
         }
     }
 
@@ -430,14 +430,6 @@ public final class LeafRefValidation {
         }
     }
 
-    private static void forEachChoice(final DataContainerNode<?> node, final Consumer<ChoiceNode> consumer) {
-        for (final DataContainerChild<?, ?> child : node.getValue()) {
-            if (child instanceof ChoiceNode) {
-                consumer.accept((ChoiceNode) child);
-            }
-        }
-    }
-
     private Set<?> getPathKeyExpressionValues(final LeafRefPath predicatePathKeyExpression,
             final YangInstanceIdentifier current) {
         return findParentNode(Optional.of(root), current).map(parent -> {