1 package net.sourceforge.pmd.lang.java.rule.logging; 2 3 import java.util.Stack; 4 5 import net.sourceforge.pmd.lang.ast.Node; 6 import net.sourceforge.pmd.lang.java.ast.ASTAnnotationTypeDeclaration; 7 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; 8 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType; 9 import net.sourceforge.pmd.lang.java.ast.ASTEnumDeclaration; 10 import net.sourceforge.pmd.lang.java.ast.ASTReferenceType; 11 import net.sourceforge.pmd.lang.java.ast.ASTType; 12 import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator; 13 import net.sourceforge.pmd.lang.java.ast.JavaNode; 14 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; 15 import net.sourceforge.pmd.util.NumericConstants; 16 17 public class MoreThanOneLoggerRule extends AbstractJavaRule { 18 19 private static final Class<?> LOG4J_LOGGER; 20 21 private static final Class<?> JAVA_LOGGER; 22 23 static { 24 Class<?> c; 25 try { 26 c = Class.forName("org.apache.log4j.Logger"); 27 } catch (Throwable t) { 28 c = null; 29 } 30 LOG4J_LOGGER = c; 31 try { 32 c = Class.forName("java.util.logging.Logger"); 33 } catch (Throwable t) { 34 c = null; 35 } 36 JAVA_LOGGER = c; 37 } 38 39 private Stack<Integer> stack = new Stack<Integer>(); 40 41 private Integer count; 42 43 @Override 44 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { 45 return init(node, data); 46 } 47 48 @Override 49 public Object visit(ASTEnumDeclaration node, Object data) { 50 return init(node, data); 51 } 52 53 @Override 54 public Object visit(ASTAnnotationTypeDeclaration node, Object data) { 55 return init(node, data); 56 } 57 58 private Object init(JavaNode node, Object data) { 59 stack.push(count); 60 count = NumericConstants.ZERO; 61 62 node.childrenAccept(this, data); 63 64 if (count > 1) { 65 addViolation(data, node); 66 } 67 count = stack.pop(); 68 69 return data; 70 } 71 72 @Override 73 public Object visit(ASTVariableDeclarator node, Object data) { 74 if (count > 1) { 75 return super.visit(node, data); 76 } 77 Node type = node.jjtGetParent().getFirstChildOfType(ASTType.class); 78 if (type != null) { 79 Node reftypeNode = type.jjtGetChild(0); 80 if (reftypeNode instanceof ASTReferenceType) { 81 Node classOrIntType = reftypeNode.jjtGetChild(0); 82 if (classOrIntType instanceof ASTClassOrInterfaceType) { 83 Class<?> clazzType = ((ASTClassOrInterfaceType) classOrIntType).getType(); 84 if (clazzType != null && (clazzType.equals(LOG4J_LOGGER) || clazzType.equals(JAVA_LOGGER)) 85 || clazzType == null && "Logger".equals(classOrIntType.getImage())) { 86 ++count; 87 } 88 } 89 } 90 } 91 92 return super.visit(node, data); 93 } 94 95 }