View Javadoc

    1   /**
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.rules.design;
    5
    6   import net.sourceforge.pmd.ast.SimpleJavaNode;
    7   import net.sourceforge.pmd.stat.DataPoint;
    8   import net.sourceforge.pmd.stat.StatisticalRule;
    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 StatisticalRule {
    26      private Class nodeClass;
    27
    28      public ExcessiveNodeCountRule(Class nodeClass) {
    29          this.nodeClass = nodeClass;
    30      }
    31
    32      public Object visit(SimpleJavaNode node, Object data) {
    33          int numNodes = 0;
    34
    35          for (int i = 0; i < node.jjtGetNumChildren(); i++) {
    36              Integer treeSize = (Integer) ((SimpleJavaNode) node.jjtGetChild(i)).jjtAccept(this, data);
    37              numNodes += treeSize;
    38          }
    39
    40          if (nodeClass.isInstance(node)) {
    41              DataPoint point = new DataPoint();
    42              point.setNode(node);
    43              point.setScore(1.0 * numNodes);
    44              point.setMessage(getMessage());
    45              addDataPoint(point);
    46          }
    47
    48          return Integer.valueOf(numNodes);
    49      }
    50  }