/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.plsql.rule; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.plsql.ast.ASTInput; import net.sourceforge.pmd.lang.plsql.ast.PLSQLNode; import net.sourceforge.pmd.lang.plsql.ast.PLSQLParserVisitor; import net.sourceforge.pmd.lang.plsql.ast.PLSQLParserVisitorAdapter; import net.sourceforge.pmd.lang.rule.AbstractRuleChainVisitor; import net.sourceforge.pmd.lang.rule.XPathRule; public class PLSQLRuleChainVisitor extends AbstractRuleChainVisitor { private static final Logger LOGGER = Logger.getLogger(PLSQLRuleChainVisitor.class.getName()); private static final String CLASS_NAME = PLSQLRuleChainVisitor.class.getName(); @Override protected void indexNodes(List<Node> nodes, RuleContext ctx) { LOGGER.entering(CLASS_NAME, "indexNodes"); PLSQLParserVisitor plsqlParserVistor = new PLSQLParserVisitorAdapter() { // Perform a visitation of the AST to index nodes which need // visiting by type @Override public Object visit(PLSQLNode node, Object data) { indexNode(node); return super.visit(node, data); } }; for (int i = 0; i < nodes.size(); i++) { plsqlParserVistor.visit((ASTInput) nodes.get(i), ctx); } LOGGER.exiting(CLASS_NAME, "indexNodes"); } @Override protected void visit(Rule rule, Node node, RuleContext ctx) { LOGGER.entering(CLASS_NAME, "visit"); // Rule better either be a PLSQLParserVisitor, or a XPathRule# if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Rule=" + rule); LOGGER.fine("Node=" + node); LOGGER.fine("RuleContext=" + ctx); LOGGER.fine("Rule Classname=" + rule.getClass().getCanonicalName()); LOGGER.fine("Rule Name=" + rule.getName()); } if (rule instanceof XPathRule) { ((XPathRule) rule).evaluate(node, ctx); } else { ((PLSQLNode) node).jjtAccept((PLSQLParserVisitor) rule, ctx); } LOGGER.exiting(CLASS_NAME, "visit"); } }