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 net.sourceforge.pmd.AbstractRule; 7 import net.sourceforge.pmd.ast.ASTClassOrInterfaceType; 8 import net.sourceforge.pmd.ast.ASTFieldDeclaration; 9 import net.sourceforge.pmd.ast.ASTFormalParameter; 10 import net.sourceforge.pmd.ast.ASTResultType; 11 import net.sourceforge.pmd.ast.Node; 12 13 import java.util.HashSet; 14 import java.util.Set; 15 16 public class LooseCoupling extends AbstractRule { 17 18 private Set implClassNames = new HashSet(); 19 20 public LooseCoupling() { 21 super(); 22 implClassNames.add("HashSet"); 23 implClassNames.add("HashMap"); 24 implClassNames.add("LinkedHashMap"); 25 implClassNames.add("LinkedHashSet"); 26 implClassNames.add("TreeSet"); 27 implClassNames.add("TreeMap"); 28 implClassNames.add("Vector"); 29 implClassNames.add("java.util.HashSet"); 30 implClassNames.add("java.util.HashMap"); 31 implClassNames.add("java.util.LinkedHashMap"); 32 implClassNames.add("java.util.LinkedHashSet"); 33 implClassNames.add("java.util.TreeSet"); 34 implClassNames.add("java.util.TreeMap"); 35 implClassNames.add("java.util.Vector"); 36 } 37 38 public Object visit(ASTClassOrInterfaceType node, Object data) { 39 Node parent = node.jjtGetParent().jjtGetParent().jjtGetParent(); 40 if (implClassNames.contains(node.getImage()) && (parent instanceof ASTFieldDeclaration || parent instanceof ASTFormalParameter || parent instanceof ASTResultType)) { 41 addViolation(data, node, node.getImage()); 42 } 43 return data; 44 } 45 }