1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.aether.util.graph.visitor;
20
21 import java.util.IdentityHashMap;
22 import java.util.Map;
23 import java.util.function.Consumer;
24
25 import org.eclipse.aether.graph.DependencyFilter;
26 import org.eclipse.aether.graph.DependencyNode;
27 import org.eclipse.aether.graph.DependencyVisitor;
28
29 import static java.util.Objects.requireNonNull;
30
31
32
33
34
35
36
37
38
39 abstract class AbstractDependencyNodeConsumerVisitor implements DependencyVisitor {
40 private static final DependencyFilter ACCEPT_ALL = (d, p) -> true;
41
42 private final Consumer<DependencyNode> nodeConsumer;
43
44 private final DependencyFilter filter;
45
46 private final Stack<DependencyNode> path;
47
48 private final Map<DependencyNode, Object> visitedNodes;
49
50 protected AbstractDependencyNodeConsumerVisitor(Consumer<DependencyNode> nodeConsumer, DependencyFilter filter) {
51 this.nodeConsumer = requireNonNull(nodeConsumer);
52 this.filter = filter == null ? ACCEPT_ALL : filter;
53 this.path = new Stack<>();
54 this.visitedNodes = new IdentityHashMap<>(512);
55 }
56
57
58
59
60
61
62
63 protected boolean setVisited(DependencyNode node) {
64 return visitedNodes.put(node, Boolean.TRUE) == null;
65 }
66
67 @Override
68 public final boolean visitEnter(DependencyNode node) {
69 path.push(node);
70 return doVisitEnter(node);
71 }
72
73 protected abstract boolean doVisitEnter(DependencyNode node);
74
75 @Override
76 public final boolean visitLeave(DependencyNode node) {
77 path.pop();
78 return doVisitLeave(node);
79 }
80
81 protected abstract boolean doVisitLeave(DependencyNode node);
82
83 protected boolean acceptNode(DependencyNode node) {
84 return filter.accept(node, path);
85 }
86
87 protected void consumeNode(DependencyNode node) {
88 nodeConsumer.accept(node);
89 }
90 }