XmlRuleChainVisitor.java
01 /**
02  * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03  */
04 package net.sourceforge.pmd.lang.xml.rule;
05 
06 import java.util.Collections;
07 import java.util.List;
08 import java.util.Stack;
09 
10 import net.sourceforge.pmd.Rule;
11 import net.sourceforge.pmd.RuleContext;
12 import net.sourceforge.pmd.lang.ast.Node;
13 import net.sourceforge.pmd.lang.rule.AbstractRuleChainVisitor;
14 import net.sourceforge.pmd.lang.rule.XPathRule;
15 
16 public class XmlRuleChainVisitor extends AbstractRuleChainVisitor {
17 
18     protected void indexNodes(List<Node> nodes, RuleContext ctx) {
19   // Visit Nodes in DFS order
20   Stack<Node> stack = new Stack<Node>();
21   stack.addAll(nodes);
22   Collections.reverse(stack);
23   while (!stack.isEmpty()) {
24       Node node = stack.pop();
25       indexNode(node);
26       if (node.jjtGetNumChildren() 0) {
27     for (int i = node.jjtGetNumChildren() 1; i >= 0; i--) {
28         stack.push(node.jjtGetChild(i));
29     }
30       }
31   }
32     }
33 
34     protected void visit(Rule rule, Node node, RuleContext ctx) {
35   // Rule better be a XPathRule
36   ((XPathRulerule).evaluate(node, ctx);
37     }
38 }