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