1 /*** 2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html 3 */ 4 package net.sourceforge.pmd.rules; 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.ASTCompilationUnit; 10 import net.sourceforge.pmd.ast.ASTImportDeclaration; 11 import net.sourceforge.pmd.ast.ASTName; 12 import net.sourceforge.pmd.ast.SimpleNode; 13 14 import java.text.MessageFormat; 15 import java.util.HashSet; 16 import java.util.Iterator; 17 import java.util.Set; 18 19 public class UnusedImportsRule extends AbstractRule { 20 21 private Set imports = new HashSet(); 22 23 public Object visit(ASTCompilationUnit node, Object data) { 24 imports.clear(); 25 26 super.visit(node, data); 27 28 RuleContext ctx = (RuleContext) data; 29 for (Iterator i = imports.iterator(); i.hasNext();) { 30 ImportWrapper wrapper = (ImportWrapper) i.next(); 31 String msg = MessageFormat.format(getMessage(), new Object[]{wrapper.getFullName()}); 32 ctx.getReport().addRuleViolation(createRuleViolation(ctx, wrapper.getPositionProvider(), msg)); 33 } 34 return data; 35 } 36 37 public Object visit(ASTImportDeclaration node, Object data) { 38 if (!node.isImportOnDemand()) { 39 ASTName importedType = (ASTName) node.jjtGetChild(0); 40 String className; 41 if (importedType.getImage().indexOf('.') != -1) { 42 int lastDot = importedType.getImage().lastIndexOf('.') + 1; 43 className = importedType.getImage().substring(lastDot); 44 } else { 45 className = importedType.getImage(); 46 } 47 ImportWrapper wrapper = new ImportWrapper(importedType.getImage(), className, node); 48 imports.add(wrapper); 49 } 50 51 return data; 52 } 53 54 public Object visit(ASTClassOrInterfaceType node, Object data) { 55 check(node); 56 return super.visit(node, data); 57 } 58 59 public Object visit(ASTName node, Object data) { 60 check(node); 61 return data; 62 } 63 64 private void check(SimpleNode node) { 65 String name; 66 if (node.getImage().indexOf('.') == -1) { 67 name = node.getImage(); 68 } else { 69 name = node.getImage().substring(0, node.getImage().indexOf('.')); 70 } 71 ImportWrapper candidate = new ImportWrapper(node.getImage(), name, new SimpleNode(-1)); 72 if (imports.contains(candidate)) { 73 imports.remove(candidate); 74 } 75 } 76 }