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