View Javadoc

    1   /**
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.lang.java.rule.design;
    5
    6   import net.sourceforge.pmd.lang.java.ast.JavaNode;
    7   import net.sourceforge.pmd.lang.java.rule.AbstractStatisticalJavaRule;
    8   import net.sourceforge.pmd.stat.DataPoint;
    9
    10  /**
    11   * This is a common super class for things which
    12   * shouldn't have excessive nodes underneath.
    13   * <p/>
    14   * It expects all "visit" calls to return an
    15   * Integer.  It will sum all the values it gets,
    16   * and use that as its score.
    17   * <p/>
    18   * To use it, override the "visit" for the nodes that
    19   * need to be counted.  On those return "new Integer(1)"
    20   * <p/>
    21   * All others will return 0 (or the sum of counted nodes
    22   * underneath.)
    23   */
    24
    25  public class ExcessiveNodeCountRule extends AbstractStatisticalJavaRule {
    26      private Class<?> nodeClass;
    27
    28      public ExcessiveNodeCountRule(Class<?> nodeClass) {
    29  	this.nodeClass = nodeClass;
    30      }
    31
    32      @Override
    33      public Object visit(JavaNode node, Object data) {
    34  	int numNodes = 0;
    35
    36  	for (int i = 0; i < node.jjtGetNumChildren(); i++) {
    37  	    Integer treeSize = (Integer) ((JavaNode) node.jjtGetChild(i)).jjtAccept(this, data);
    38  	    numNodes += treeSize;
    39  	}
    40
    41  	if (nodeClass.isInstance(node)) {
    42  	    DataPoint point = new DataPoint();
    43  	    point.setNode(node);
    44  	    point.setScore(1.0 * numNodes);
    45  	    point.setMessage(getMessage());
    46  	    addDataPoint(point);
    47  	}
    48
    49  	return Integer.valueOf(numNodes);
    50      }
    51  }