1 package org.apache.velocity.runtime.visitor;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import org.apache.velocity.runtime.directive.Stop;
23 import org.apache.velocity.runtime.parser.Token;
24 import org.apache.velocity.runtime.parser.node.ASTAddNode;
25 import org.apache.velocity.runtime.parser.node.ASTAndNode;
26 import org.apache.velocity.runtime.parser.node.ASTAssignment;
27 import org.apache.velocity.runtime.parser.node.ASTBlock;
28 import org.apache.velocity.runtime.parser.node.ASTDirective;
29 import org.apache.velocity.runtime.parser.node.ASTDivNode;
30 import org.apache.velocity.runtime.parser.node.ASTEQNode;
31 import org.apache.velocity.runtime.parser.node.ASTElseIfStatement;
32 import org.apache.velocity.runtime.parser.node.ASTElseStatement;
33 import org.apache.velocity.runtime.parser.node.ASTEscape;
34 import org.apache.velocity.runtime.parser.node.ASTEscapedDirective;
35 import org.apache.velocity.runtime.parser.node.ASTExpression;
36 import org.apache.velocity.runtime.parser.node.ASTFalse;
37 import org.apache.velocity.runtime.parser.node.ASTFloatingPointLiteral;
38 import org.apache.velocity.runtime.parser.node.ASTGENode;
39 import org.apache.velocity.runtime.parser.node.ASTGTNode;
40 import org.apache.velocity.runtime.parser.node.ASTIdentifier;
41 import org.apache.velocity.runtime.parser.node.ASTIfStatement;
42 import org.apache.velocity.runtime.parser.node.ASTIntegerLiteral;
43 import org.apache.velocity.runtime.parser.node.ASTIntegerRange;
44 import org.apache.velocity.runtime.parser.node.ASTLENode;
45 import org.apache.velocity.runtime.parser.node.ASTLTNode;
46 import org.apache.velocity.runtime.parser.node.ASTMap;
47 import org.apache.velocity.runtime.parser.node.ASTMethod;
48 import org.apache.velocity.runtime.parser.node.ASTModNode;
49 import org.apache.velocity.runtime.parser.node.ASTMulNode;
50 import org.apache.velocity.runtime.parser.node.ASTNENode;
51 import org.apache.velocity.runtime.parser.node.ASTNotNode;
52 import org.apache.velocity.runtime.parser.node.ASTObjectArray;
53 import org.apache.velocity.runtime.parser.node.ASTOrNode;
54 import org.apache.velocity.runtime.parser.node.ASTReference;
55 import org.apache.velocity.runtime.parser.node.ASTSetDirective;
56 import org.apache.velocity.runtime.parser.node.ASTStringLiteral;
57 import org.apache.velocity.runtime.parser.node.ASTSubtractNode;
58 import org.apache.velocity.runtime.parser.node.ASTText;
59 import org.apache.velocity.runtime.parser.node.ASTTrue;
60 import org.apache.velocity.runtime.parser.node.ASTWord;
61 import org.apache.velocity.runtime.parser.node.ASTprocess;
62 import org.apache.velocity.runtime.parser.node.Node;
63 import org.apache.velocity.runtime.parser.node.SimpleNode;
64
65 /**
66 * This class is simply a visitor implementation
67 * that traverses the AST, produced by the Velocity
68 * parsing process, and creates a visual structure
69 * of the AST. This is primarily used for
70 * debugging, but it useful for documentation
71 * as well.
72 *
73 * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
74 * @version $Id: NodeViewMode.java 745315 2009-02-18 00:39:05Z byron $
75 */
76 public class NodeViewMode extends BaseVisitor
77 {
78 private int indent = 0;
79 private boolean showTokens = true;
80
81 /** Indent child nodes to help visually identify
82 * the structure of the AST.
83 */
84 private String indentString()
85 {
86 StringBuffer sb = new StringBuffer();
87 for (int i = 0; i < indent; ++i)
88 {
89 sb.append(" ");
90 }
91 return sb.toString();
92 }
93
94 /**
95 * Display the type of nodes and optionally the
96 * first token.
97 */
98 private Object showNode(Node node, Object data)
99 {
100 String tokens = "";
101 String special = "";
102 Token t;
103
104 if (showTokens)
105 {
106 t = node.getFirstToken();
107
108 if (t.specialToken != null && ! t.specialToken.image.startsWith("##"))
109 special = t.specialToken.image;
110
111 tokens = " -> " + special + t.image;
112 }
113
114 System.out.println(indentString() + node + tokens);
115 ++indent;
116 data = node.childrenAccept(this, data);
117 --indent;
118 return data;
119 }
120
121 /**
122 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.SimpleNode, java.lang.Object)
123 */
124 public Object visit(SimpleNode node, Object data)
125 {
126 return showNode(node,data);
127 }
128
129 /**
130 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTprocess, java.lang.Object)
131 */
132 public Object visit(ASTprocess node, Object data)
133 {
134 return showNode(node,data);
135 }
136
137 /**
138 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTExpression, java.lang.Object)
139 */
140 public Object visit(ASTExpression node, Object data)
141 {
142 return showNode(node,data);
143 }
144
145 /**
146 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTAssignment, java.lang.Object)
147 */
148 public Object visit(ASTAssignment node, Object data)
149 {
150 return showNode(node,data);
151 }
152
153 /**
154 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTOrNode, java.lang.Object)
155 */
156 public Object visit(ASTOrNode node, Object data)
157 {
158 return showNode(node,data);
159 }
160
161 /**
162 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTAndNode, java.lang.Object)
163 */
164 public Object visit(ASTAndNode node, Object data)
165 {
166 return showNode(node,data);
167 }
168
169 /**
170 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTEQNode, java.lang.Object)
171 */
172 public Object visit(ASTEQNode node, Object data)
173 {
174 return showNode(node,data);
175 }
176
177 /**
178 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTNENode, java.lang.Object)
179 */
180 public Object visit(ASTNENode node, Object data)
181 {
182 return showNode(node,data);
183 }
184
185 /**
186 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTLTNode, java.lang.Object)
187 */
188 public Object visit(ASTLTNode node, Object data)
189 {
190 return showNode(node,data);
191 }
192
193 /**
194 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTGTNode, java.lang.Object)
195 */
196 public Object visit(ASTGTNode node, Object data)
197 {
198 return showNode(node,data);
199 }
200
201 /**
202 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTLENode, java.lang.Object)
203 */
204 public Object visit(ASTLENode node, Object data)
205 {
206 return showNode(node,data);
207 }
208
209 /**
210 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTGENode, java.lang.Object)
211 */
212 public Object visit(ASTGENode node, Object data)
213 {
214 return showNode(node,data);
215 }
216
217 /**
218 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTAddNode, java.lang.Object)
219 */
220 public Object visit(ASTAddNode node, Object data)
221 {
222 return showNode(node,data);
223 }
224
225 /**
226 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTSubtractNode, java.lang.Object)
227 */
228 public Object visit(ASTSubtractNode node, Object data)
229 {
230 return showNode(node,data);
231 }
232
233 /**
234 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTMulNode, java.lang.Object)
235 */
236 public Object visit(ASTMulNode node, Object data)
237 {
238 return showNode(node,data);
239 }
240
241 /**
242 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTDivNode, java.lang.Object)
243 */
244 public Object visit(ASTDivNode node, Object data)
245 {
246 return showNode(node,data);
247 }
248
249 /**
250 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTModNode, java.lang.Object)
251 */
252 public Object visit(ASTModNode node, Object data)
253 {
254 return showNode(node,data);
255 }
256
257 /**
258 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTNotNode, java.lang.Object)
259 */
260 public Object visit(ASTNotNode node, Object data)
261 {
262 return showNode(node,data);
263 }
264
265 /**
266 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTFloatingPointLiteral, java.lang.Object)
267 */
268 public Object visit(ASTFloatingPointLiteral node, Object data)
269 {
270 return showNode(node,data);
271 }
272
273 /**
274 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIntegerLiteral, java.lang.Object)
275 * @since 1.5
276 */
277 public Object visit(ASTIntegerLiteral node, Object data)
278 {
279 return showNode(node,data);
280 }
281
282 /**
283 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTStringLiteral, java.lang.Object)
284 */
285 public Object visit(ASTStringLiteral node, Object data)
286 {
287 return showNode(node,data);
288 }
289
290 /**
291 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIdentifier, java.lang.Object)
292 */
293 public Object visit(ASTIdentifier node, Object data)
294 {
295 return showNode(node,data);
296 }
297
298 /**
299 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTMethod, java.lang.Object)
300 */
301 public Object visit(ASTMethod node, Object data)
302 {
303 return showNode(node,data);
304 }
305
306 /**
307 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTReference, java.lang.Object)
308 */
309 public Object visit(ASTReference node, Object data)
310 {
311 return showNode(node,data);
312 }
313
314 /**
315 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTTrue, java.lang.Object)
316 */
317 public Object visit(ASTTrue node, Object data)
318 {
319 return showNode(node,data);
320 }
321
322 /**
323 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTFalse, java.lang.Object)
324 */
325 public Object visit(ASTFalse node, Object data)
326 {
327 return showNode(node,data);
328 }
329
330 /**
331 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTBlock, java.lang.Object)
332 */
333 public Object visit(ASTBlock node, Object data)
334 {
335 return showNode(node,data);
336 }
337
338 /**
339 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTText, java.lang.Object)
340 */
341 public Object visit(ASTText node, Object data)
342 {
343 return showNode(node,data);
344 }
345
346 /**
347 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIfStatement, java.lang.Object)
348 */
349 public Object visit(ASTIfStatement node, Object data)
350 {
351 return showNode(node,data);
352 }
353
354 /**
355 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTElseStatement, java.lang.Object)
356 */
357 public Object visit(ASTElseStatement node, Object data)
358 {
359 return showNode(node,data);
360 }
361
362 /**
363 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTElseIfStatement, java.lang.Object)
364 */
365 public Object visit(ASTElseIfStatement node, Object data)
366 {
367 return showNode(node,data);
368 }
369
370 /**
371 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTObjectArray, java.lang.Object)
372 */
373 public Object visit(ASTObjectArray node, Object data)
374 {
375 return showNode(node,data);
376 }
377
378 /**
379 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTDirective, java.lang.Object)
380 */
381 public Object visit(ASTDirective node, Object data)
382 {
383 return showNode(node,data);
384 }
385
386 /**
387 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTWord, java.lang.Object)
388 */
389 public Object visit(ASTWord node, Object data)
390 {
391 return showNode(node,data);
392 }
393
394 /**
395 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTSetDirective, java.lang.Object)
396 */
397 public Object visit(ASTSetDirective node, Object data)
398 {
399 return showNode(node,data);
400 }
401
402 /**
403 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTEscapedDirective, java.lang.Object)
404 * @since 1.5
405 */
406 public Object visit(ASTEscapedDirective node, Object data)
407 {
408 return showNode(node,data);
409 }
410
411 /**
412 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTEscape, java.lang.Object)
413 * @since 1.5
414 */
415 public Object visit(ASTEscape node, Object data)
416 {
417 return showNode(node,data);
418 }
419
420 /**
421 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTMap, java.lang.Object)
422 * @since 1.5
423 */
424 public Object visit(ASTMap node, Object data)
425 {
426 return showNode(node,data);
427 }
428
429 /**
430 * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIntegerRange, java.lang.Object)
431 */
432 public Object visit(ASTIntegerRange node, Object data)
433 {
434 return showNode(node,data);
435 }
436 }