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.SimpleNode;
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   *
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   *
18   * To use it, override the "visit" for the nodes that
19   * need to be counted.  On those return "new Integer(1)"
20   *
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(SimpleNode node, Object data) {
33          int numNodes = 0;
34  
35          for (int i = 0; i < node.jjtGetNumChildren(); i++) {
36              Integer treeSize = (Integer) (node.jjtGetChild(i)).jjtAccept(this, data);
37              numNodes += treeSize.intValue();
38          }
39  
40          if (nodeClass.isInstance(node)) {
41              DataPoint point = new DataPoint();
42              point.setLineNumber(node.getBeginLine());
43              point.setScore(1.0 * numNodes);
44              point.setRule(this);
45              point.setMessage(getMessage());
46              addDataPoint(point);
47          }
48  
49          return new Integer(numNodes);
50      }
51  }