/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.plsql.rule.design;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sourceforge.pmd.lang.plsql.ast.PLSQLNode;
import net.sourceforge.pmd.lang.plsql.rule.AbstractStatisticalPLSQLRule;
import net.sourceforge.pmd.stat.DataPoint;
/**
* This is a common super class for things which have excessive length.
*
* <p>i.e. LongMethod and LongClass rules.</p>
*
* <p>To implement an ExcessiveLength rule, you pass in the Class of node you want
* to check, and this does the rest for you.</p>
*/
public class ExcessiveLengthRule extends AbstractStatisticalPLSQLRule {
private static final Logger LOGGER = Logger.getLogger(ExcessiveLengthRule.class.getName());
private Class<?> nodeClass;
public ExcessiveLengthRule(Class<?> nodeClass) {
this.nodeClass = nodeClass;
}
@Override
public Object visit(PLSQLNode node, Object data) {
if (LOGGER.isLoggable(Level.FINEST)) {
LOGGER.finest("SimpleNode: line " + node.getBeginLine() + ", column " + node.getBeginColumn()
+ " - is node " + node.getClass().getCanonicalName() + " instanceof "
+ this.nodeClass.getClass().getCanonicalName());
}
if (nodeClass.isInstance(node)) {
if (LOGGER.isLoggable(Level.FINEST)) {
LOGGER.finest("SimpleNode: YES node " + node.getClass().getCanonicalName() + " IS instanceof "
+ this.nodeClass.getClass().getCanonicalName() + " with length == (" + node.getEndLine()
+ " - " + node.getBeginLine() + " == " + (node.getEndLine() - node.getBeginLine()));
}
DataPoint point = new DataPoint();
point.setNode(node);
point.setScore(1.0 * (node.getEndLine() - node.getBeginLine()));
point.setMessage(getMessage());
addDataPoint(point);
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("SimpleNode: Score " + point.getScore() + " for " + this.nodeClass.getCanonicalName());
}
}
return node.childrenAccept(this, data);
}
@Override
public Object[] getViolationParameters(DataPoint point) {
return new String[] { String.valueOf((int) point.getScore()) };
}
}