1 /*
2 * Created on 15/03/2003
3 *
4 * To change this generated comment go to
5 * Window>Preferences>Java>Code Generation>Code Template
6 */
7 package net.sourceforge.pmd.rules;
8
9 import net.sourceforge.pmd.AbstractRule;
10 import net.sourceforge.pmd.RuleContext;
11 import net.sourceforge.pmd.ast.ASTCompilationUnit;
12 import net.sourceforge.pmd.ast.SimpleNode;
13 import net.sourceforge.pmd.jaxen.DocumentNavigator;
14 import org.jaxen.BaseXPath;
15 import org.jaxen.JaxenException;
16 import org.jaxen.XPath;
17
18 import java.io.PrintStream;
19 import java.io.PrintWriter;
20 import java.text.MessageFormat;
21 import java.util.Iterator;
22
23 /***
24 * @author daniels
25 *
26 * To change this generated comment go to
27 * Window>Preferences>Java>Code Generation>Code Template
28 */
29 public class XPathRule extends AbstractRule {
30
31 private XPath xpath;
32
33 public Object visit(ASTCompilationUnit node, Object data) {
34 try {
35 init();
36 for (Iterator iter = xpath.selectNodes(node).iterator(); iter.hasNext();) {
37 SimpleNode actualNode = (SimpleNode) iter.next();
38 RuleContext ctx = (RuleContext) data;
39 ctx.getReport().addRuleViolation(createRuleViolation(ctx, actualNode.getBeginLine(), getMessage()));
40 }
41 } catch (JaxenException ex) {
42 throwJaxenAsRuntime(ex);
43 }
44 return data;
45 }
46
47 private void init() throws JaxenException {
48 if(xpath == null) {
49 String path = getStringProperty("xpath");
50 String subst = getStringProperty("subst");
51 if(subst != null && subst.length() > 0) {
52 path = MessageFormat.format(path, new String[] {subst});
53 }
54 xpath = new BaseXPath(path, new DocumentNavigator());
55 }
56 }
57
58 private static void throwJaxenAsRuntime(final JaxenException ex) {
59 throw new RuntimeException() {
60 public void printStackTrace() {
61 super.printStackTrace();
62 ex.printStackTrace();
63 }
64 public void printStackTrace(PrintWriter writer) {
65 super.printStackTrace(writer);
66 ex.printStackTrace(writer);
67 }
68 public void printStackTrace(PrintStream stream) {
69 super.printStackTrace(stream);
70 ex.printStackTrace(stream);
71 }
72 public String getMessage() {
73 return super.getMessage() + ex.getMessage();
74 }
75 };
76 }
77 }
This page was automatically generated by Maven