1 package org.eclipse.aether.util.graph.visitor;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.IdentityHashMap;
23 import java.util.Map;
24
25 import org.eclipse.aether.graph.DefaultDependencyNode;
26 import org.eclipse.aether.graph.DependencyNode;
27 import org.eclipse.aether.graph.DependencyVisitor;
28
29
30
31
32
33
34
35 public class CloningDependencyVisitor
36 implements DependencyVisitor
37 {
38
39 private final Map<DependencyNode, DependencyNode> clones;
40
41 private final Stack<DependencyNode> parents;
42
43 private DependencyNode root;
44
45
46
47
48 public CloningDependencyVisitor()
49 {
50 parents = new Stack<DependencyNode>();
51 clones = new IdentityHashMap<DependencyNode, DependencyNode>( 256 );
52 }
53
54
55
56
57
58
59 public final DependencyNode getRootNode()
60 {
61 return root;
62 }
63
64
65
66
67
68
69
70 protected DependencyNode clone( DependencyNode node )
71 {
72 DefaultDependencyNode clone = new DefaultDependencyNode( node );
73 return clone;
74 }
75
76 public final boolean visitEnter( DependencyNode node )
77 {
78 boolean recurse = true;
79
80 DependencyNode clone = clones.get( node );
81 if ( clone == null )
82 {
83 clone = clone( node );
84 clones.put( node, clone );
85 }
86 else
87 {
88 recurse = false;
89 }
90
91 DependencyNode parent = parents.peek();
92
93 if ( parent == null )
94 {
95 root = clone;
96 }
97 else
98 {
99 parent.getChildren().add( clone );
100 }
101
102 parents.push( clone );
103
104 return recurse;
105 }
106
107 public final boolean visitLeave( DependencyNode node )
108 {
109 parents.pop();
110
111 return true;
112 }
113
114 }