View Javadoc

1   package net.sourceforge.pmd.lang.java.xpath;
2   
3   import java.util.List;
4   
5   import net.sourceforge.pmd.lang.ast.AbstractNode;
6   import net.sourceforge.pmd.lang.ast.Node;
7   import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
8   import net.sourceforge.pmd.lang.java.ast.Comment;
9   
10  import org.jaxen.Context;
11  import org.jaxen.Function;
12  import org.jaxen.FunctionCallException;
13  import org.jaxen.SimpleFunctionContext;
14  import org.jaxen.XPathFunctionContext;
15  
16  /**
17   * The XPath query "//VariableDeclarator[contains(getCommentOn(), '//password')]" 
18   * will find all variables declared that are annotated with the password comment.
19   *  
20   * @author Andy Throgmorton
21   */
22  public class GetCommentOnFunction implements Function {
23  
24      public static void registerSelfInSimpleContext() {
25          // see http://jaxen.org/extensions.html
26          ((SimpleFunctionContext) XPathFunctionContext.getInstance()).registerFunction(null, "getCommentOn", new GetCommentOnFunction());
27      }
28  
29      public Object call(Context context, List args) throws FunctionCallException {
30          if (!args.isEmpty()) {
31              return Boolean.FALSE;
32          }
33          Node n = (Node) context.getNodeSet().get(0);
34          if (n instanceof AbstractNode) {
35              int codeBeginLine = ((AbstractNode) n).getBeginLine();
36              int codeEndLine = ((AbstractNode) n).getEndLine();
37  
38              List<Comment> commentList = ((AbstractNode)n).getFirstParentOfType(ASTCompilationUnit.class).getComments();
39              for (Comment comment : commentList) {
40                  if (comment.getBeginLine() == codeBeginLine || comment.getEndLine() == codeEndLine) {
41                      return comment.getImage();
42                  }
43              }
44          }
45          return Boolean.FALSE;
46      }
47  }