View Javadoc

    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  }