1 package net.sourceforge.pmd.rules; 2 3 import java.util.Stack ; 4 5 import net.sourceforge.pmd.AbstractRule; 6 import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration; 7 import net.sourceforge.pmd.ast.ASTClassOrInterfaceType; 8 import net.sourceforge.pmd.ast.ASTEnumDeclaration; 9 import net.sourceforge.pmd.ast.ASTReferenceType; 10 import net.sourceforge.pmd.ast.ASTType; 11 import net.sourceforge.pmd.ast.ASTVariableDeclarator; 12 import net.sourceforge.pmd.ast.SimpleJavaNode; 13 import net.sourceforge.pmd.ast.SimpleNode; 14 15 public class MoreThanOneLogger extends AbstractRule { 16 17 private Stack stack = new Stack (); 18 19 private Integer count; 20 21 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { 22 return init (node, data); 23 } 24 25 public Object visit(ASTEnumDeclaration node, Object data) { 26 return init (node, data); 27 } 28 29 private Object init(SimpleJavaNode node, Object data) { 30 stack.push(count); 31 count = new Integer (0); 32 33 node.childrenAccept(this, data); 34 35 if (count.intValue() > 1) { 36 addViolation(data, node); 37 } 38 count = (Integer ) stack.pop(); 39 40 return data; 41 } 42 43 public Object visit(ASTVariableDeclarator node, Object data) { 44 if (count.intValue() > 1) { 45 return super.visit(node, data); 46 } 47 SimpleNode type = (SimpleNode) ((SimpleNode) node.jjtGetParent()).getFirstChildOfType(ASTType.class); 48 if (type != null) { 49 SimpleNode reftypeNode = (SimpleNode) type.jjtGetChild(0); 50 if (reftypeNode instanceof ASTReferenceType) { 51 SimpleNode classOrIntType = (SimpleNode) reftypeNode.jjtGetChild(0); 52 if (classOrIntType instanceof ASTClassOrInterfaceType && "Logger".equals(classOrIntType.getImage())) { 53 count = new Integer (count.intValue()+1); 54 } 55 } 56 } 57 58 return super.visit(node, data); 59 } 60 61 } 62 | Popular Tags |