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