1 package org.apache.maven.shared.dependency.graph.traversal;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.PrintWriter;
23 import java.io.Writer;
24 import java.util.List;
25
26 import org.apache.maven.shared.dependency.graph.DependencyNode;
27
28
29
30
31
32
33 public class SerializingDependencyNodeVisitor
34 implements DependencyNodeVisitor
35 {
36
37
38
39
40
41 public static class GraphTokens
42 {
43 private final String nodeIndent;
44
45 private final String lastNodeIndent;
46
47 private final String fillIndent;
48
49 private final String lastFillIndent;
50
51 public GraphTokens( String nodeIndent, String lastNodeIndent, String fillIndent, String lastFillIndent )
52 {
53 this.nodeIndent = nodeIndent;
54 this.lastNodeIndent = lastNodeIndent;
55 this.fillIndent = fillIndent;
56 this.lastFillIndent = lastFillIndent;
57 }
58
59 public String getNodeIndent( boolean last )
60 {
61 return last ? lastNodeIndent : nodeIndent;
62 }
63
64 public String getFillIndent( boolean last )
65 {
66 return last ? lastFillIndent : fillIndent;
67 }
68 }
69
70
71
72
73
74
75 public static final GraphTokens WHITESPACE_TOKENS = new GraphTokens( " ", " ", " ", " " );
76
77
78
79
80 public static final GraphTokens STANDARD_TOKENS = new GraphTokens( "+- ", "\\- ", "| ", " " );
81
82
83
84
85 public static final GraphTokens EXTENDED_TOKENS = new GraphTokens( "\u00c3\u00c4 ", "\u00c0\u00c4 ", "\u00b3 ",
86 " " );
87
88
89
90
91
92
93 private final PrintWriter writer;
94
95
96
97
98 private final GraphTokens tokens;
99
100
101
102
103 private int depth;
104
105
106
107
108
109
110
111
112 public SerializingDependencyNodeVisitor( Writer writer )
113 {
114 this( writer, WHITESPACE_TOKENS );
115 }
116
117
118
119
120
121
122
123
124 public SerializingDependencyNodeVisitor( Writer writer, GraphTokens tokens )
125 {
126 if ( writer instanceof PrintWriter )
127 {
128 this.writer = (PrintWriter) writer;
129 }
130 else
131 {
132 this.writer = new PrintWriter( writer, true );
133 }
134
135 this.tokens = tokens;
136
137 depth = 0;
138 }
139
140
141
142
143
144
145 public boolean visit( DependencyNode node )
146 {
147 indent( node );
148
149 writer.println( node.toNodeString() );
150
151 depth++;
152
153 return true;
154 }
155
156
157
158
159 public boolean endVisit( DependencyNode node )
160 {
161 depth--;
162
163 return true;
164 }
165
166
167
168
169
170
171
172
173 private void indent( DependencyNode node )
174 {
175 for ( int i = 1; i < depth; i++ )
176 {
177 writer.write( tokens.getFillIndent( isLast( node, i ) ) );
178 }
179
180 if ( depth > 0 )
181 {
182 writer.write( tokens.getNodeIndent( isLast( node ) ) );
183 }
184 }
185
186
187
188
189
190
191
192 private boolean isLast( DependencyNode node )
193 {
194
195
196 DependencyNode parent = node.getParent();
197
198 boolean last;
199
200 if ( parent == null )
201 {
202 last = true;
203 }
204 else
205 {
206 List<DependencyNode> siblings = parent.getChildren();
207
208 last = ( siblings.indexOf( node ) == siblings.size() - 1 );
209 }
210
211 return last;
212 }
213
214
215
216
217
218
219
220
221 private boolean isLast( DependencyNode node, int ancestorDepth )
222 {
223
224
225 int distance = depth - ancestorDepth;
226
227 while ( distance-- > 0 )
228 {
229 node = node.getParent();
230 }
231
232 return isLast( node );
233 }
234 }