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