• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.parser.Token;
23 import org.apache.velocity.runtime.parser.node.*;
24 
25 /**
26  * This class is simply a visitor implementation
27  * that traverses the AST, produced by the Velocity
28  * parsing process, and creates a visual structure
29  * of the AST. This is primarily used for
30  * debugging, but it useful for documentation
31  * as well.
32  *
33  * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
34  * @version $Id$
35  */
36 public class NodeViewMode extends BaseVisitor
37 {
38     private int indent = 0;
39     private boolean showTokens = true;
40 
41     /** Indent child nodes to help visually identify
42       *  the structure of the AST.
43       */
indentString()44     private String indentString()
45     {
46         StringBuilder sb = new StringBuilder();
47         for (int i = 0; i < indent; ++i)
48         {
49             sb.append("  ");
50         }
51         return sb.toString();
52     }
53 
54     /**
55       * Display the type of nodes and optionally the
56       * first token.
57       */
showNode(Node node, Object data)58     private Object showNode(Node node, Object data)
59     {
60         String tokens = "";
61         String special = "";
62         Token t;
63 
64         if (showTokens)
65         {
66         	// TODO: Token reference
67             t = node.getFirstToken();
68 
69             if (t.specialToken != null && ! t.specialToken.image.startsWith(node.getParser().lineComment()))
70                 special = t.specialToken.image;
71 
72             tokens = " -> " + special + t.image;
73         }
74 
75         System.out.println(indentString() + node + tokens);
76         ++indent;
77         data = node.childrenAccept(this, data);
78         --indent;
79         return data;
80     }
81 
82     /**
83      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.SimpleNode, java.lang.Object)
84      */
85     @Override
visit(SimpleNode node, Object data)86     public Object visit(SimpleNode node, Object data)
87     {
88         return showNode(node,data);
89     }
90 
91     /**
92      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTprocess, java.lang.Object)
93      */
94     @Override
visit(ASTprocess node, Object data)95     public Object visit(ASTprocess node, Object data)
96     {
97         return showNode(node,data);
98     }
99 
100     /**
101      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTExpression, java.lang.Object)
102      */
103     @Override
visit(ASTExpression node, Object data)104     public Object visit(ASTExpression node, Object data)
105     {
106         return showNode(node,data);
107     }
108 
109     /**
110      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTAssignment, java.lang.Object)
111      */
112     @Override
visit(ASTAssignment node, Object data)113     public Object visit(ASTAssignment node, Object data)
114     {
115         return showNode(node,data);
116     }
117 
118     /**
119      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTOrNode, java.lang.Object)
120      */
121     @Override
visit(ASTOrNode node, Object data)122     public Object visit(ASTOrNode node, Object data)
123     {
124         return showNode(node,data);
125     }
126 
127     /**
128      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTAndNode, java.lang.Object)
129      */
130     @Override
visit(ASTAndNode node, Object data)131     public Object visit(ASTAndNode node, Object data)
132     {
133         return showNode(node,data);
134     }
135 
136     /**
137      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTEQNode, java.lang.Object)
138      */
139     @Override
visit(ASTEQNode node, Object data)140     public Object visit(ASTEQNode 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.ASTNENode, java.lang.Object)
147      */
148     @Override
visit(ASTNENode node, Object data)149     public Object visit(ASTNENode node, Object data)
150     {
151         return showNode(node,data);
152     }
153 
154     /**
155      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTLTNode, java.lang.Object)
156      */
157     @Override
visit(ASTLTNode node, Object data)158     public Object visit(ASTLTNode node, Object data)
159     {
160         return showNode(node,data);
161     }
162 
163     /**
164      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTGTNode, java.lang.Object)
165      */
166     @Override
visit(ASTGTNode node, Object data)167     public Object visit(ASTGTNode node, Object data)
168     {
169         return showNode(node,data);
170     }
171 
172     /**
173      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTLENode, java.lang.Object)
174      */
175     @Override
visit(ASTLENode node, Object data)176     public Object visit(ASTLENode node, Object data)
177     {
178         return showNode(node,data);
179     }
180 
181     /**
182      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTGENode, java.lang.Object)
183      */
184     @Override
visit(ASTGENode node, Object data)185     public Object visit(ASTGENode node, Object data)
186     {
187         return showNode(node,data);
188     }
189 
190     /**
191      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTAddNode, java.lang.Object)
192      */
193     @Override
visit(ASTAddNode node, Object data)194     public Object visit(ASTAddNode node, Object data)
195     {
196         return showNode(node,data);
197     }
198 
199     /**
200      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTSubtractNode, java.lang.Object)
201      */
202     @Override
visit(ASTSubtractNode node, Object data)203     public Object visit(ASTSubtractNode node, Object data)
204     {
205         return showNode(node,data);
206     }
207 
208     /**
209      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTMulNode, java.lang.Object)
210      */
211     @Override
visit(ASTMulNode node, Object data)212     public Object visit(ASTMulNode 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.ASTDivNode, java.lang.Object)
219      */
220     @Override
visit(ASTDivNode node, Object data)221     public Object visit(ASTDivNode node, Object data)
222     {
223         return showNode(node,data);
224     }
225 
226     /**
227      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTModNode, java.lang.Object)
228      */
229     @Override
visit(ASTModNode node, Object data)230     public Object visit(ASTModNode node, Object data)
231     {
232         return showNode(node,data);
233     }
234 
235     /**
236      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTNotNode, java.lang.Object)
237      */
238     @Override
visit(ASTNotNode node, Object data)239     public Object visit(ASTNotNode node, Object data)
240     {
241         return showNode(node,data);
242     }
243 
244     /**
245      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTFloatingPointLiteral, java.lang.Object)
246      */
247     @Override
visit(ASTFloatingPointLiteral node, Object data)248     public Object visit(ASTFloatingPointLiteral node, Object data)
249     {
250         return showNode(node,data);
251     }
252 
253     /**
254      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIntegerLiteral, java.lang.Object)
255      * @since 1.5
256      */
257     @Override
visit(ASTIntegerLiteral node, Object data)258     public Object visit(ASTIntegerLiteral node, Object data)
259     {
260         return showNode(node,data);
261     }
262 
263     /**
264      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTStringLiteral, java.lang.Object)
265      */
266     @Override
visit(ASTStringLiteral node, Object data)267     public Object visit(ASTStringLiteral node, Object data)
268     {
269         return showNode(node,data);
270     }
271 
272     /**
273      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIdentifier, java.lang.Object)
274      */
275     @Override
visit(ASTIdentifier node, Object data)276     public Object visit(ASTIdentifier node, Object data)
277     {
278         return showNode(node,data);
279     }
280 
281     /**
282      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTMethod, java.lang.Object)
283      */
284     @Override
visit(ASTMethod node, Object data)285     public Object visit(ASTMethod 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.ASTReference, java.lang.Object)
292      */
293     @Override
visit(ASTReference node, Object data)294     public Object visit(ASTReference node, Object data)
295     {
296         return showNode(node,data);
297     }
298 
299     /**
300      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTTrue, java.lang.Object)
301      */
302     @Override
visit(ASTTrue node, Object data)303     public Object visit(ASTTrue node, Object data)
304     {
305         return showNode(node,data);
306     }
307 
308     /**
309      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTFalse, java.lang.Object)
310      */
311     @Override
visit(ASTFalse node, Object data)312     public Object visit(ASTFalse node, Object data)
313     {
314         return showNode(node,data);
315     }
316 
317     /**
318      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTBlock, java.lang.Object)
319      */
320     @Override
visit(ASTBlock node, Object data)321     public Object visit(ASTBlock node, Object data)
322     {
323         return showNode(node,data);
324     }
325 
326     /**
327      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTText, java.lang.Object)
328      */
329     @Override
visit(ASTText node, Object data)330     public Object visit(ASTText node, Object data)
331     {
332         return showNode(node,data);
333     }
334 
335     /**
336      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIfStatement, java.lang.Object)
337      */
338     @Override
visit(ASTIfStatement node, Object data)339     public Object visit(ASTIfStatement node, Object data)
340     {
341         return showNode(node,data);
342     }
343 
344     /**
345      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTElseStatement, java.lang.Object)
346      */
347     @Override
visit(ASTElseStatement node, Object data)348     public Object visit(ASTElseStatement node, Object data)
349     {
350         return showNode(node,data);
351     }
352 
353     /**
354      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTElseIfStatement, java.lang.Object)
355      */
356     @Override
visit(ASTElseIfStatement node, Object data)357     public Object visit(ASTElseIfStatement 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.ASTObjectArray, java.lang.Object)
364      */
365     @Override
visit(ASTObjectArray node, Object data)366     public Object visit(ASTObjectArray node, Object data)
367     {
368         return showNode(node,data);
369     }
370 
371     /**
372      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTDirective, java.lang.Object)
373      */
374     @Override
visit(ASTDirective node, Object data)375     public Object visit(ASTDirective node, Object data)
376     {
377         return showNode(node,data);
378     }
379 
380     /**
381      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTWord, java.lang.Object)
382      */
383     @Override
visit(ASTWord node, Object data)384     public Object visit(ASTWord node, Object data)
385     {
386         return showNode(node,data);
387     }
388 
389     /**
390      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTSetDirective, java.lang.Object)
391      */
392     @Override
visit(ASTSetDirective node, Object data)393     public Object visit(ASTSetDirective node, Object data)
394     {
395         return showNode(node,data);
396     }
397 
398     /**
399      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTEscapedDirective, java.lang.Object)
400      * @since 1.5
401      */
402     @Override
visit(ASTEscapedDirective node, Object data)403     public Object visit(ASTEscapedDirective node, Object data)
404     {
405         return showNode(node,data);
406     }
407 
408     /**
409      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTEscape, java.lang.Object)
410      * @since 1.5
411      */
412     @Override
visit(ASTEscape node, Object data)413     public Object visit(ASTEscape node, Object data)
414     {
415         return showNode(node,data);
416     }
417 
418     /**
419      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTMap, java.lang.Object)
420      * @since 1.5
421      */
422     @Override
visit(ASTMap node, Object data)423     public Object visit(ASTMap node, Object data)
424     {
425         return showNode(node,data);
426     }
427 
428     /**
429      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIntegerRange, java.lang.Object)
430      */
431     @Override
visit(ASTIntegerRange node, Object data)432     public Object visit(ASTIntegerRange node, Object data)
433     {
434         return showNode(node,data);
435     }
436 }
437