/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.rules; import net.sourceforge.pmd.AbstractRule; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.ast.ASTCompilationUnit; import net.sourceforge.pmd.ast.ASTImportDeclaration; import net.sourceforge.pmd.ast.ASTName; import java.text.MessageFormat; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class UnusedImportsRule extends AbstractRule { private Set imports = new HashSet(); public Object visit(ASTCompilationUnit node, Object data) { imports.clear(); super.visit(node, data); RuleContext ctx = (RuleContext) data; for (Iterator i = imports.iterator(); i.hasNext();) { ImportWrapper wrapper = (ImportWrapper) i.next(); String msg = MessageFormat.format(getMessage(), new Object[]{wrapper.getName()}); ctx.getReport().addRuleViolation(createRuleViolation(ctx, wrapper.getLine(), msg)); } return data; } public Object visit(ASTImportDeclaration node, Object data) { if (!node.isImportOnDemand()) { ASTName importedType = (ASTName) node.jjtGetChild(0); String className; if (importedType.getImage().indexOf('.') != -1) { int lastDot = importedType.getImage().lastIndexOf('.') + 1; className = importedType.getImage().substring(lastDot); } else { className = importedType.getImage(); } ImportWrapper wrapper = new ImportWrapper(className, node.getBeginLine()); imports.add(wrapper); } return data; } public Object visit(ASTName node, Object data) { String name; if (node.getImage().indexOf('.') == -1) { name = node.getImage(); } else { name = node.getImage().substring(0, node.getImage().indexOf('.')); } ImportWrapper candidate = new ImportWrapper(name, -1); if (imports.contains(candidate)) { imports.remove(candidate); } return data; } }