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 * <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(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.setMessage(getMessage()); 45 addDataPoint(point); 46 } 47 48 return new Integer(numNodes); 49 } 50 }