Clover coverage report - PMD - 3.9
Coverage timestamp: Tue Dec 19 2006 09:38:44 EST
file stats: LOC: 84   Methods: 3
NCLOC: 63   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
TooManyFields.java 91.7% 96% 66.7% 92.5%
coverage coverage
 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 java.util.HashMap;
 7    import java.util.Iterator;
 8    import java.util.List;
 9    import java.util.Map;
 10   
 11    import net.sourceforge.pmd.AbstractRule;
 12    import net.sourceforge.pmd.PropertyDescriptor;
 13    import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
 14    import net.sourceforge.pmd.ast.ASTCompilationUnit;
 15    import net.sourceforge.pmd.ast.ASTFieldDeclaration;
 16    import net.sourceforge.pmd.ast.SimpleNode;
 17    import net.sourceforge.pmd.properties.IntegerProperty;
 18    import net.sourceforge.pmd.util.NumericConstants;
 19   
 20   
 21    public class TooManyFields extends AbstractRule {
 22   
 23    private static final int DEFAULT_MAXFIELDS = 15;
 24   
 25    private Map stats;
 26    private Map nodes;
 27    private int maxFields;
 28   
 29    private static final PropertyDescriptor maxFieldsDescriptor = new IntegerProperty(
 30    "maxfields",
 31    "Maximum allowable fields per class",
 32    DEFAULT_MAXFIELDS,
 33    1.0f
 34    );
 35   
 36    private static final Map propertyDescriptorsByName = asFixedMap(maxFieldsDescriptor);
 37   
 38  9 public Object visit(ASTCompilationUnit node, Object data) {
 39   
 40  9 maxFields = getIntProperty(maxFieldsDescriptor);
 41   
 42  9 stats = new HashMap(5);
 43  9 nodes = new HashMap(5);
 44   
 45  9 List l = node.findChildrenOfType(ASTFieldDeclaration.class);
 46   
 47  9 for (Iterator it = l.iterator(); it.hasNext();) {
 48  105 ASTFieldDeclaration fd = (ASTFieldDeclaration) it.next();
 49  105 if (fd.isFinal() && fd.isStatic()) {
 50  32 continue;
 51    }
 52  73 ASTClassOrInterfaceDeclaration clazz = (ASTClassOrInterfaceDeclaration) fd.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class);
 53  73 if (clazz != null && !clazz.isInterface()) {
 54  73 bumpCounterFor(clazz);
 55    }
 56    }
 57  9 for (Iterator it = stats.keySet().iterator(); it.hasNext();) {
 58  9 String k = (String) it.next();
 59  9 int val = ((Integer) stats.get(k)).intValue();
 60  9 SimpleNode n = (SimpleNode) nodes.get(k);
 61  9 if (val > maxFields) {
 62  4 addViolation(data, n);
 63    }
 64    }
 65  9 return data;
 66    }
 67   
 68  73 private void bumpCounterFor(ASTClassOrInterfaceDeclaration clazz) {
 69  73 String key = clazz.getImage();
 70  73 if (!stats.containsKey(key)) {
 71  9 stats.put(key, NumericConstants.ZERO);
 72  9 nodes.put(key, clazz);
 73    }
 74  73 Integer i = new Integer(((Integer) stats.get(key)).intValue() + 1);
 75  73 stats.put(key, i);
 76    }
 77   
 78    /**
 79    * @return Map
 80    */
 81  0 protected Map propertiesByName() {
 82  0 return propertyDescriptorsByName;
 83    }
 84    }