/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.java;
import java.io.Writer;
import net.sourceforge.pmd.lang.AbstractLanguageVersionHandler;
import net.sourceforge.pmd.lang.DataFlowHandler;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.VisitorStarter;
import net.sourceforge.pmd.lang.XPathHandler;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.ast.xpath.AbstractASTXPathHandler;
import net.sourceforge.pmd.lang.dfa.DFAGraphRule;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
import net.sourceforge.pmd.lang.java.ast.DumpFacade;
import net.sourceforge.pmd.lang.java.ast.JavaNode;
import net.sourceforge.pmd.lang.java.dfa.DataFlowFacade;
import net.sourceforge.pmd.lang.java.dfa.JavaDFAGraphRule;
import net.sourceforge.pmd.lang.java.rule.JavaRuleViolationFactory;
import net.sourceforge.pmd.lang.java.symboltable.SymbolFacade;
import net.sourceforge.pmd.lang.java.typeresolution.TypeResolutionFacade;
import net.sourceforge.pmd.lang.java.xpath.GetCommentOnFunction;
import net.sourceforge.pmd.lang.java.xpath.JavaFunctions;
import net.sourceforge.pmd.lang.java.xpath.TypeOfFunction;
import net.sourceforge.pmd.lang.rule.RuleViolationFactory;
import net.sf.saxon.sxpath.IndependentContext;
/**
* Implementation of LanguageVersionHandler for the Java AST. It uses anonymous
* classes as adapters of the visitors to the VisitorStarter interface.
*
* @author pieter_van_raemdonck - Application Engineers NV/SA - www.ae.be
*/
public abstract class AbstractJavaHandler extends AbstractLanguageVersionHandler {
@Override
public DataFlowHandler getDataFlowHandler() {
return new JavaDataFlowHandler();
}
@Override
public XPathHandler getXPathHandler() {
return new AbstractASTXPathHandler() {
public void initialize() {
TypeOfFunction.registerSelfInSimpleContext();
GetCommentOnFunction.registerSelfInSimpleContext();
}
public void initialize(IndependentContext context) {
super.initialize(context, LanguageRegistry.getLanguage(JavaLanguageModule.NAME), JavaFunctions.class);
}
};
}
public RuleViolationFactory getRuleViolationFactory() {
return JavaRuleViolationFactory.INSTANCE;
}
@Override
public VisitorStarter getDataFlowFacade() {
return new VisitorStarter() {
public void start(Node rootNode) {
new DataFlowFacade().initializeWith(getDataFlowHandler(), (ASTCompilationUnit) rootNode);
}
};
}
@Override
public VisitorStarter getSymbolFacade() {
return new VisitorStarter() {
public void start(Node rootNode) {
new SymbolFacade().initializeWith(null, (ASTCompilationUnit) rootNode);
}
};
}
@Override
public VisitorStarter getSymbolFacade(final ClassLoader classLoader) {
return new VisitorStarter() {
public void start(Node rootNode) {
new SymbolFacade().initializeWith(classLoader, (ASTCompilationUnit) rootNode);
}
};
}
@Override
public VisitorStarter getTypeResolutionFacade(final ClassLoader classLoader) {
return new VisitorStarter() {
public void start(Node rootNode) {
new TypeResolutionFacade().initializeWith(classLoader, (ASTCompilationUnit) rootNode);
}
};
}
@Override
public VisitorStarter getDumpFacade(final Writer writer, final String prefix, final boolean recurse) {
return new VisitorStarter() {
public void start(Node rootNode) {
new DumpFacade().initializeWith(writer, prefix, recurse, (JavaNode) rootNode);
}
};
}
@Override
public DFAGraphRule getDFAGraphRule() {
return new JavaDFAGraphRule();
}
}