package net.sourceforge.pmd.eclipse.ui.views.ast; import java.io.StringReader; import java.util.ArrayList; import java.util.List; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.RuleSet; import net.sourceforge.pmd.RuleSets; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.LanguageVersionHandler; import net.sourceforge.pmd.lang.Parser; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.JavaLanguageModule; import net.sourceforge.pmd.lang.java.ast.ParseException; import net.sourceforge.pmd.lang.rule.XPathRule; /** * * @author Brian Remedios */ public class XPathEvaluator { public static final XPathEvaluator instance = new XPathEvaluator(); private XPathEvaluator() {} public Node getCompilationUnit(String source) { LanguageVersionHandler languageVersionHandler = getLanguageVersionHandler(); Parser parser = languageVersionHandler.getParser(languageVersionHandler.getDefaultParserOptions()); Node node = parser.parse(null, new StringReader(source)); languageVersionHandler.getSymbolFacade().start(node); languageVersionHandler.getTypeResolutionFacade(null).start(node); return node; } private LanguageVersionHandler getLanguageVersionHandler() { LanguageVersion languageVersion = getLanguageVersion(); return languageVersion.getLanguageVersionHandler(); } private LanguageVersion getLanguageVersion() { return LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getDefaultVersion(); } /** * Builds a temporary XPathRule using the query provided and executes it against * the source. Returns a list of nodes detailing any issues found with it. * * @param source * @param xpathQuery * @param xpathVersion * @return * @throws ParseException */ public List<Node> evaluate(String source, String xpathQuery, String xpathVersion) throws ParseException { Node c = getCompilationUnit(source); final List<Node> results = new ArrayList<Node>(); XPathRule xpathRule = new XPathRule() { public void addViolation(Object data, Node node, String arg) { results.add(node); } }; xpathRule.setMessage(""); xpathRule.setLanguage(getLanguageVersion().getLanguage()); xpathRule.setProperty(XPathRule.XPATH_DESCRIPTOR, xpathQuery); xpathRule.setProperty(XPathRule.VERSION_DESCRIPTOR, xpathVersion); RuleSet ruleSet = new RuleSet(); ruleSet.addRule(xpathRule); RuleSets ruleSets = new RuleSets(ruleSet); RuleContext ruleContext = new RuleContext(); ruleContext.setLanguageVersion(getLanguageVersion()); List<Node> nodes = new ArrayList<Node>(1); nodes.add(c); ruleSets.apply(nodes, ruleContext, xpathRule.getLanguage()); return results; } }