1 /*** 2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html 3 */ 4 package net.sourceforge.pmd.rules; 5 6 import net.sourceforge.pmd.ast.ASTCompilationUnit; 7 import net.sourceforge.pmd.ast.ASTFieldDeclaration; 8 import net.sourceforge.pmd.ast.ASTMethodDeclarator; 9 import net.sourceforge.pmd.ast.AccessNode; 10 import net.sourceforge.pmd.rules.design.ExcessiveNodeCountRule; 11 12 /*** 13 * @author aglover 14 * 15 * Class Name: ExcessivePublicCountRule 16 * 17 * Rule attempts to count all public methods and public attributes defined in a class. 18 * 19 * If a class has a high number of public operations, it might be wise to consider whether 20 * it would be appropriate to divide it into subclasses. 21 * 22 * A large proportion of public members and operations means the class has high potential to be 23 * affected by external classes. Futhermore, increased effort will be required to 24 * thoroughly test the class. 25 */ 26 public class ExcessivePublicCountRule extends ExcessiveNodeCountRule { 27 28 public ExcessivePublicCountRule() { 29 super(ASTCompilationUnit.class); 30 } 31 32 /*** 33 * Method counts ONLY public methods. 34 */ 35 public Object visit(ASTMethodDeclarator node, Object data) { 36 return this.getTallyOnAccessType((AccessNode) node.jjtGetParent()); 37 } 38 39 /*** 40 * Method counts ONLY public class attributes which are not PUBLIC and 41 * static- these usually represent constants.... 42 */ 43 public Object visit(ASTFieldDeclaration node, Object data) { 44 if (node.isFinal() && node.isStatic()) { 45 return new Integer(0); 46 } else { 47 return this.getTallyOnAccessType(node); 48 } 49 } 50 51 /*** 52 * Method counts a node if it is public 53 * @param AccessNode node 54 * @return Integer 1 if node is public 0 otherwise 55 */ 56 private Integer getTallyOnAccessType(AccessNode node) { 57 if (node.isPublic()) { 58 return new Integer(1); 59 } 60 return new Integer(0); 61 } 62 }