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 ((XPathRule) rule).evaluate(node, ctx);
37 }
38 }
|