/velocity/plugins/com.liferay.ide.velocity/src/com/liferay/ide/velocity/vaulttec/ui/editor/parser/NodeVisitor.java

https://gitlab.com/4615833/liferay-ide · Java · 547 lines · 339 code · 51 blank · 157 comment · 21 complexity · 44ec78430fce47d46bbd69afb87b346f MD5 · raw file

  1. package com.liferay.ide.velocity.vaulttec.ui.editor.parser;
  2. import com.liferay.ide.velocity.vaulttec.ui.editor.VelocityEditorEnvironment;
  3. import com.liferay.ide.velocity.vaulttec.ui.model.Directive;
  4. import com.liferay.ide.velocity.vaulttec.ui.model.IBlock;
  5. import com.liferay.ide.velocity.vaulttec.ui.model.ITreeNode;
  6. import com.liferay.ide.velocity.vaulttec.ui.model.Template;
  7. import java.util.Stack;
  8. import org.apache.velocity.runtime.parser.node.ASTAddNode;
  9. import org.apache.velocity.runtime.parser.node.ASTAndNode;
  10. import org.apache.velocity.runtime.parser.node.ASTAssignment;
  11. import org.apache.velocity.runtime.parser.node.ASTBlock;
  12. import org.apache.velocity.runtime.parser.node.ASTComment;
  13. import org.apache.velocity.runtime.parser.node.ASTDirective;
  14. import org.apache.velocity.runtime.parser.node.ASTDivNode;
  15. import org.apache.velocity.runtime.parser.node.ASTEQNode;
  16. import org.apache.velocity.runtime.parser.node.ASTElseIfStatement;
  17. import org.apache.velocity.runtime.parser.node.ASTElseStatement;
  18. import org.apache.velocity.runtime.parser.node.ASTEscape;
  19. import org.apache.velocity.runtime.parser.node.ASTEscapedDirective;
  20. import org.apache.velocity.runtime.parser.node.ASTExpression;
  21. import org.apache.velocity.runtime.parser.node.ASTFalse;
  22. import org.apache.velocity.runtime.parser.node.ASTFloatingPointLiteral;
  23. import org.apache.velocity.runtime.parser.node.ASTGENode;
  24. import org.apache.velocity.runtime.parser.node.ASTGTNode;
  25. import org.apache.velocity.runtime.parser.node.ASTIdentifier;
  26. import org.apache.velocity.runtime.parser.node.ASTIfStatement;
  27. import org.apache.velocity.runtime.parser.node.ASTIntegerLiteral;
  28. import org.apache.velocity.runtime.parser.node.ASTIntegerRange;
  29. import org.apache.velocity.runtime.parser.node.ASTLENode;
  30. import org.apache.velocity.runtime.parser.node.ASTLTNode;
  31. import org.apache.velocity.runtime.parser.node.ASTMap;
  32. import org.apache.velocity.runtime.parser.node.ASTMethod;
  33. import org.apache.velocity.runtime.parser.node.ASTModNode;
  34. import org.apache.velocity.runtime.parser.node.ASTMulNode;
  35. import org.apache.velocity.runtime.parser.node.ASTNENode;
  36. import org.apache.velocity.runtime.parser.node.ASTNotNode;
  37. import org.apache.velocity.runtime.parser.node.ASTObjectArray;
  38. import org.apache.velocity.runtime.parser.node.ASTOrNode;
  39. import org.apache.velocity.runtime.parser.node.ASTReference;
  40. import org.apache.velocity.runtime.parser.node.ASTSetDirective;
  41. import org.apache.velocity.runtime.parser.node.ASTStringLiteral;
  42. import org.apache.velocity.runtime.parser.node.ASTSubtractNode;
  43. import org.apache.velocity.runtime.parser.node.ASTText;
  44. import org.apache.velocity.runtime.parser.node.ASTTrue;
  45. import org.apache.velocity.runtime.parser.node.ASTWord;
  46. import org.apache.velocity.runtime.parser.node.ASTprocess;
  47. import org.apache.velocity.runtime.parser.node.Node;
  48. import org.apache.velocity.runtime.parser.node.ParserVisitor;
  49. import org.apache.velocity.runtime.parser.node.SimpleNode;
  50. /**
  51. * DOCUMENT ME!
  52. *
  53. * @version $Revision: 26 $
  54. * @author <a href="mailto:akmal.sarhan@gmail.com">Akmal Sarhan </a>
  55. */
  56. public class NodeVisitor implements ParserVisitor
  57. {
  58. private String fName;
  59. private Template fTemplate;
  60. private Stack fBlocks = new Stack();
  61. private IBlock fCurrentBlock;
  62. public NodeVisitor(String aName)
  63. {
  64. fName = aName;
  65. }
  66. /**
  67. * DOCUMENT ME!
  68. *
  69. * @return DOCUMENT ME!
  70. */
  71. public Template getTemplate()
  72. {
  73. return fTemplate;
  74. }
  75. /**
  76. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.SimpleNode,
  77. * java.lang.Object)
  78. */
  79. public Object visit(SimpleNode aNode, Object aData)
  80. {
  81. return aNode.childrenAccept(this, aData);
  82. }
  83. /**
  84. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTprocess,
  85. * java.lang.Object)
  86. */
  87. public Object visit(ASTprocess aNode, Object aData)
  88. {
  89. fTemplate = new Template(fName);
  90. fCurrentBlock = fTemplate;
  91. return aNode.childrenAccept(this, aData);
  92. }
  93. /**
  94. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTComment,
  95. * java.lang.Object)
  96. */
  97. public Object visit(ASTComment aNode, Object aData)
  98. {
  99. return null;
  100. }
  101. /**
  102. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTStringLiteral,
  103. * java.lang.Object)
  104. */
  105. public Object visit(ASTStringLiteral aNode, Object aData)
  106. {
  107. return null;
  108. }
  109. /**
  110. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIdentifier,
  111. * java.lang.Object)
  112. */
  113. public Object visit(ASTIdentifier aNode, Object aData)
  114. {
  115. return null;
  116. }
  117. /**
  118. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTWord,
  119. * java.lang.Object)
  120. */
  121. public Object visit(ASTWord aNode, Object aData)
  122. {
  123. return null;
  124. }
  125. /**
  126. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTDirective,
  127. * java.lang.Object)
  128. */
  129. public Object visit(ASTDirective aNode, Object aData)
  130. {
  131. String name = aNode.getDirectiveName();
  132. int type = Directive.getType('#' + name);
  133. Directive directive;
  134. String id = null;
  135. switch (type)
  136. {
  137. case Directive.TYPE_MACRO:
  138. if ((aNode.jjtGetNumChildren() > 0) && aNode.jjtGetChild(0) instanceof ASTWord)
  139. {
  140. name = aNode.jjtGetChild(0).literal();
  141. } else
  142. {
  143. name = "";
  144. }
  145. id = name;
  146. break;
  147. case Directive.TYPE_FOREACH:
  148. if (aNode.jjtGetNumChildren() > 2)
  149. {
  150. name = aNode.jjtGetChild(2).literal();
  151. } else
  152. {
  153. name = "";
  154. }
  155. if ((aNode.jjtGetNumChildren() > 0) && aNode.jjtGetChild(0) instanceof ASTReference)
  156. {
  157. id = aNode.jjtGetChild(0).literal();
  158. } else
  159. {
  160. id = "";
  161. }
  162. break;
  163. case Directive.TYPE_INCLUDE:
  164. case Directive.TYPE_PARSE:
  165. if (aNode.jjtGetNumChildren() > 0)
  166. {
  167. name = aNode.jjtGetChild(0).literal();
  168. } else
  169. {
  170. name = "";
  171. }
  172. id = "";
  173. break;
  174. case Directive.TYPE_MACRO_CALL:
  175. // Check if an already defined macro is referenced
  176. if (VelocityEditorEnvironment.getParser().isVelocimacro(name, fTemplate.getName()))
  177. {
  178. id = "";
  179. } else
  180. {
  181. id = null;
  182. }
  183. break;
  184. case Directive.TYPE_USER_DIRECTIVE:
  185. id = "";
  186. break;
  187. }
  188. // If valid directive then visit embedded nodes too
  189. if (id != null)
  190. {
  191. directive = new Directive(type, name, id, (ITreeNode) fCurrentBlock, aNode.getFirstToken().beginLine, aNode.getLastToken().endLine);
  192. aData = visitBlockDirective(aNode, aData, directive, false);
  193. // Add parameters of macro definition
  194. if ((type == Directive.TYPE_MACRO) && (aNode.jjtGetNumChildren() > 1))
  195. {
  196. for (int i = 1; i < aNode.jjtGetNumChildren(); i++)
  197. {
  198. Node node = aNode.jjtGetChild(i);
  199. if (node instanceof ASTReference)
  200. {
  201. directive.addParameter(node.literal());
  202. } else
  203. {
  204. break;
  205. }
  206. }
  207. }
  208. }
  209. return aData;
  210. }
  211. /**
  212. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTBlock,
  213. * java.lang.Object)
  214. */
  215. public Object visit(ASTBlock aNode, Object aData)
  216. {
  217. return aNode.childrenAccept(this, aData);
  218. }
  219. /**
  220. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTObjectArray,
  221. * java.lang.Object)
  222. */
  223. public Object visit(ASTObjectArray aNode, Object aData)
  224. {
  225. return null;
  226. }
  227. /**
  228. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTMethod,
  229. * java.lang.Object)
  230. */
  231. public Object visit(ASTMethod aNode, Object aData)
  232. {
  233. return null;
  234. }
  235. /**
  236. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTReference,
  237. * java.lang.Object)
  238. */
  239. public Object visit(ASTReference aNode, Object aData)
  240. {
  241. return null;
  242. }
  243. /**
  244. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTTrue,
  245. * java.lang.Object)
  246. */
  247. public Object visit(ASTTrue aNode, Object aData)
  248. {
  249. return null;
  250. }
  251. /**
  252. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTFalse,
  253. * java.lang.Object)
  254. */
  255. public Object visit(ASTFalse aNode, Object aData)
  256. {
  257. return null;
  258. }
  259. /**
  260. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTText,
  261. * java.lang.Object)
  262. */
  263. public Object visit(ASTText aNode, Object aData)
  264. {
  265. return null;
  266. }
  267. /**
  268. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTIfStatement,
  269. * java.lang.Object)
  270. */
  271. public Object visit(ASTIfStatement aNode, Object aData)
  272. {
  273. // Check for first embedded #ELSE or #ELSEIF directive to get end line
  274. int endLine = aNode.getLastToken().endLine;
  275. int numChildren = aNode.jjtGetNumChildren();
  276. for (int i = 1; i < numChildren; i++)
  277. {
  278. Node node = aNode.jjtGetChild(i);
  279. if (node instanceof ASTElseStatement || node instanceof ASTElseIfStatement)
  280. {
  281. endLine = node.getFirstToken().beginLine - 1;
  282. break;
  283. }
  284. }
  285. Directive directive = new Directive(Directive.TYPE_IF, aNode.jjtGetChild(0).literal(), "", (ITreeNode) fCurrentBlock, aNode.getFirstToken().beginLine, endLine);
  286. return visitBlockDirective(aNode, aData, directive, false);
  287. }
  288. /**
  289. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTElseStatement,
  290. * java.lang.Object)
  291. */
  292. public Object visit(ASTElseStatement aNode, Object aData)
  293. {
  294. Directive directive = new Directive(Directive.TYPE_ELSE, null, "", (ITreeNode) fCurrentBlock, aNode.getFirstToken().beginLine, aNode.getLastToken().next.endLine);
  295. return visitBlockDirective(aNode, aData, directive, true);
  296. }
  297. /**
  298. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTElseIfStatement,
  299. * java.lang.Object)
  300. */
  301. public Object visit(ASTElseIfStatement aNode, Object aData)
  302. {
  303. Directive directive = new Directive(Directive.TYPE_ELSEIF, aNode.jjtGetChild(0).literal(), "", (ITreeNode) fCurrentBlock, aNode.getFirstToken().beginLine, aNode.getLastToken().endLine);
  304. return visitBlockDirective(aNode, aData, directive, true);
  305. }
  306. /**
  307. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTSetDirective,
  308. * java.lang.Object)
  309. */
  310. public Object visit(ASTSetDirective aNode, Object aData)
  311. {
  312. String expr = aNode.jjtGetChild(0).literal();
  313. int pos = expr.indexOf('=');
  314. if (pos >= 0)
  315. {
  316. expr = expr.substring(0, pos).trim();
  317. }
  318. Directive directive = new Directive(Directive.TYPE_SET, expr, expr, (ITreeNode) fCurrentBlock, aNode.getFirstToken().beginLine, aNode.getLastToken().endLine);
  319. fCurrentBlock.addDirective(directive);
  320. return null;
  321. }
  322. /**
  323. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTExpression,
  324. * java.lang.Object)
  325. */
  326. public Object visit(ASTExpression aNode, Object aData)
  327. {
  328. return null;
  329. }
  330. /**
  331. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTAssignment,
  332. * java.lang.Object)
  333. */
  334. public Object visit(ASTAssignment aNode, Object aData)
  335. {
  336. return null;
  337. }
  338. /**
  339. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTOrNode,
  340. * java.lang.Object)
  341. */
  342. public Object visit(ASTOrNode aNode, Object aData)
  343. {
  344. return null;
  345. }
  346. /**
  347. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTAndNode,
  348. * java.lang.Object)
  349. */
  350. public Object visit(ASTAndNode aNode, Object aData)
  351. {
  352. return null;
  353. }
  354. /**
  355. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTEQNode,
  356. * java.lang.Object)
  357. */
  358. public Object visit(ASTEQNode aNode, Object aData)
  359. {
  360. return null;
  361. }
  362. /**
  363. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTNENode,
  364. * java.lang.Object)
  365. */
  366. public Object visit(ASTNENode aNode, Object aData)
  367. {
  368. return null;
  369. }
  370. /**
  371. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTLTNode,
  372. * java.lang.Object)
  373. */
  374. public Object visit(ASTLTNode aNode, Object aData)
  375. {
  376. return null;
  377. }
  378. /**
  379. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTGTNode,
  380. * java.lang.Object)
  381. */
  382. public Object visit(ASTGTNode aNode, Object aData)
  383. {
  384. return null;
  385. }
  386. /**
  387. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTLENode,
  388. * java.lang.Object)
  389. */
  390. public Object visit(ASTLENode aNode, Object aData)
  391. {
  392. return null;
  393. }
  394. /**
  395. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTGENode,
  396. * java.lang.Object)
  397. */
  398. public Object visit(ASTGENode aNode, Object aData)
  399. {
  400. return null;
  401. }
  402. /**
  403. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTAddNode,
  404. * java.lang.Object)
  405. */
  406. public Object visit(ASTAddNode aNode, Object aData)
  407. {
  408. return null;
  409. }
  410. /**
  411. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTSubtractNode,
  412. * java.lang.Object)
  413. */
  414. public Object visit(ASTSubtractNode aNode, Object aData)
  415. {
  416. return null;
  417. }
  418. /**
  419. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTMulNode,
  420. * java.lang.Object)
  421. */
  422. public Object visit(ASTMulNode aNode, Object aData)
  423. {
  424. return null;
  425. }
  426. /**
  427. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTDivNode,
  428. * java.lang.Object)
  429. */
  430. public Object visit(ASTDivNode aNode, Object aData)
  431. {
  432. return null;
  433. }
  434. /**
  435. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTModNode,
  436. * java.lang.Object)
  437. */
  438. public Object visit(ASTModNode aNode, Object aData)
  439. {
  440. return null;
  441. }
  442. /**
  443. * @see org.apache.velocity.runtime.parser.node.ParserVisitor#visit(org.apache.velocity.runtime.parser.node.ASTNotNode,
  444. * java.lang.Object)
  445. */
  446. public Object visit(ASTNotNode aNode, Object aData)
  447. {
  448. return null;
  449. }
  450. private Object visitBlockDirective(Node aNode, Object aData, Directive aDirective, boolean anAddToParentBlock)
  451. {
  452. if (anAddToParentBlock && fCurrentBlock instanceof Directive)
  453. {
  454. IBlock parent = (IBlock) ((Directive) fCurrentBlock).getParent();
  455. parent.addDirective(aDirective);
  456. } else
  457. {
  458. fCurrentBlock.addDirective(aDirective);
  459. }
  460. fBlocks.push(fCurrentBlock);
  461. fCurrentBlock = aDirective;
  462. aData = aNode.childrenAccept(this, aData);
  463. fCurrentBlock = (IBlock) fBlocks.pop();
  464. return aData;
  465. }
  466. public Object visit(ASTEscapedDirective arg0, Object arg1)
  467. {
  468. // TODO Auto-generated method stub
  469. return null;
  470. }
  471. public Object visit(ASTEscape arg0, Object arg1)
  472. {
  473. // TODO Auto-generated method stub
  474. return null;
  475. }
  476. public Object visit(ASTFloatingPointLiteral arg0, Object arg1)
  477. {
  478. // TODO Auto-generated method stub
  479. return null;
  480. }
  481. public Object visit(ASTIntegerLiteral arg0, Object arg1)
  482. {
  483. // TODO Auto-generated method stub
  484. return null;
  485. }
  486. public Object visit(ASTMap arg0, Object arg1)
  487. {
  488. // TODO Auto-generated method stub
  489. return null;
  490. }
  491. public Object visit(ASTIntegerRange arg0, Object arg1)
  492. {
  493. // TODO Auto-generated method stub
  494. return null;
  495. }
  496. }