View Javadoc

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.ASTAddNode;
24  import org.apache.velocity.runtime.parser.node.ASTAndNode;
25  import org.apache.velocity.runtime.parser.node.ASTAssignment;
26  import org.apache.velocity.runtime.parser.node.ASTBlock;
27  import org.apache.velocity.runtime.parser.node.ASTDirective;
28  import org.apache.velocity.runtime.parser.node.ASTDivNode;
29  import org.apache.velocity.runtime.parser.node.ASTEQNode;
30  import org.apache.velocity.runtime.parser.node.ASTElseIfStatement;
31  import org.apache.velocity.runtime.parser.node.ASTElseStatement;
32  import org.apache.velocity.runtime.parser.node.ASTEscape;
33  import org.apache.velocity.runtime.parser.node.ASTEscapedDirective;
34  import org.apache.velocity.runtime.parser.node.ASTExpression;
35  import org.apache.velocity.runtime.parser.node.ASTFalse;
36  import org.apache.velocity.runtime.parser.node.ASTFloatingPointLiteral;
37  import org.apache.velocity.runtime.parser.node.ASTGENode;
38  import org.apache.velocity.runtime.parser.node.ASTGTNode;
39  import org.apache.velocity.runtime.parser.node.ASTIdentifier;
40  import org.apache.velocity.runtime.parser.node.ASTIfStatement;
41  import org.apache.velocity.runtime.parser.node.ASTIntegerLiteral;
42  import org.apache.velocity.runtime.parser.node.ASTIntegerRange;
43  import org.apache.velocity.runtime.parser.node.ASTLENode;
44  import org.apache.velocity.runtime.parser.node.ASTLTNode;
45  import org.apache.velocity.runtime.parser.node.ASTMap;
46  import org.apache.velocity.runtime.parser.node.ASTMethod;
47  import org.apache.velocity.runtime.parser.node.ASTModNode;
48  import org.apache.velocity.runtime.parser.node.ASTMulNode;
49  import org.apache.velocity.runtime.parser.node.ASTNENode;
50  import org.apache.velocity.runtime.parser.node.ASTNotNode;
51  import org.apache.velocity.runtime.parser.node.ASTObjectArray;
52  import org.apache.velocity.runtime.parser.node.ASTOrNode;
53  import org.apache.velocity.runtime.parser.node.ASTReference;
54  import org.apache.velocity.runtime.parser.node.ASTSetDirective;
55  import org.apache.velocity.runtime.parser.node.ASTStop;
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 685685 2008-08-13 21:43:27Z nbubna $
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 
437     /**
438      * @see org.apache.velocity.runtime.visitor.BaseVisitor#visit(org.apache.velocity.runtime.parser.node.ASTStop, java.lang.Object)
439      * @since 1.5
440      */
441     public Object visit(ASTStop node, Object data)
442     {
443         return showNode(node,data);
444     }
445 }