/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.java.xpath; import java.util.List; import org.jaxen.Context; import org.jaxen.Function; import org.jaxen.FunctionCallException; import org.jaxen.SimpleFunctionContext; import org.jaxen.XPathFunctionContext; import net.sourceforge.pmd.lang.ast.AbstractNode; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; import net.sourceforge.pmd.lang.java.ast.Comment; /** * The XPath query "//VariableDeclarator[contains(getCommentOn(), * '//password')]" will find all variables declared that are annotated with the * password comment. * * @author Andy Throgmorton */ public class GetCommentOnFunction implements Function { public static void registerSelfInSimpleContext() { // see http://jaxen.org/extensions.html ((SimpleFunctionContext) XPathFunctionContext.getInstance()).registerFunction(null, "getCommentOn", new GetCommentOnFunction()); } public Object call(Context context, List args) throws FunctionCallException { if (!args.isEmpty()) { return Boolean.FALSE; } Node n = (Node) context.getNodeSet().get(0); if (n instanceof AbstractNode) { int codeBeginLine = ((AbstractNode) n).getBeginLine(); int codeEndLine = ((AbstractNode) n).getEndLine(); List<Comment> commentList = ((AbstractNode) n).getFirstParentOfType(ASTCompilationUnit.class).getComments(); for (Comment comment : commentList) { if (comment.getBeginLine() == codeBeginLine || comment.getEndLine() == codeEndLine) { return comment.getImage(); } } } return Boolean.FALSE; } }