/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.plsql.rule.codesize; import java.util.logging.Level; import java.util.logging.Logger; import net.sourceforge.pmd.lang.plsql.ast.ASTFieldDeclaration; import net.sourceforge.pmd.lang.plsql.ast.ASTGlobal; import net.sourceforge.pmd.lang.plsql.ast.ASTProgramUnit; import net.sourceforge.pmd.lang.plsql.ast.OracleObject; import net.sourceforge.pmd.lang.plsql.ast.PLSQLNode; import net.sourceforge.pmd.stat.DataPoint; import net.sourceforge.pmd.util.NumericConstants; /** * Non-commented source statement counter for Oracle Object declarations. * * @author Stuart Turton */ public class NcssObjectCountRule extends AbstractNcssCountRule { private static final String CLASS_NAME = NcssObjectCountRule.class.getName(); private static final Logger LOGGER = Logger.getLogger(NcssObjectCountRule.class.getName()); /** * Count type declarations. This includes Oracle Objects. */ public NcssObjectCountRule() { super(OracleObject.class); setProperty(MINIMUM_DESCRIPTOR, 1500d); } // @Override public Object visit(OracleObject node, Object data) { LOGGER.entering(CLASS_NAME, "visit(NcssObjectCountRule)"); // Treat Schema-level ProgramUnits as Oracle Objects, otherwise as // subprograms if (node.jjtGetParent() instanceof ASTGlobal) { LOGGER.fine("Schema-level"); return super.visit(node, data); } LOGGER.fine("not Schema-level"); return countNodeChildren(node, data); } /** * Override super.visit(PLSQLNode, Object) for ASTProgramUnit nodes, only * adding DataPoints for Schema-level Functions and Procedures */ @Override public Object visit(ASTProgramUnit node, Object data) { int numNodes = 0; for (int i = 0; i < node.jjtGetNumChildren(); i++) { PLSQLNode n = (PLSQLNode) node.jjtGetChild(i); Integer treeSize = (Integer) n.jjtAccept(this, data); numNodes += treeSize.intValue(); } // This override is necessary because only Schema-level OracleObject // instances should result in DataPoints if (node instanceof OracleObject && node.jjtGetParent() instanceof ASTGlobal) { // Add 1 to account for base node numNodes++; DataPoint point = new DataPoint(); point.setNode(node); point.setScore(1.0 * numNodes); point.setMessage(getMessage()); addDataPoint(point); if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Running score is " + point.getScore()); } } return Integer.valueOf(numNodes); } @Override public Object visit(ASTFieldDeclaration node, Object data) { LOGGER.entering(CLASS_NAME, "visit(ASTFieldDeclaration)"); return NumericConstants.ONE; } @Override public Object[] getViolationParameters(DataPoint point) { LOGGER.entering(CLASS_NAME, "visit(getViolationParameters)"); if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Node Count ==" + point.getScore()); } return new String[] { String.valueOf((int) point.getScore()) }; } }