/**
* 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.SimpleNode;
import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class DuplicateImportsRule extends AbstractRule {
private Set singleTypeImports;
private Set importOnDemandImports;
public Object visit(ASTCompilationUnit node, Object data) {
RuleContext ctx = (RuleContext) data;
singleTypeImports = new HashSet();
importOnDemandImports = new HashSet();
super.visit(node, data);
// this checks for things like:
// import java.io.*;
// import java.io.File;
for (Iterator i = importOnDemandImports.iterator(); i.hasNext();) {
ImportWrapper thisImportOnDemand = (ImportWrapper) i.next();
for (Iterator j = singleTypeImports.iterator(); j.hasNext();) {
ImportWrapper thisSingleTypeImport = (ImportWrapper) j.next();
String singleTypePkg = thisSingleTypeImport.getName().substring(0, thisSingleTypeImport.getName().lastIndexOf("."));
if (thisImportOnDemand.getName().equals(singleTypePkg)) {
String msg = MessageFormat.format(getMessage(), new Object[]{thisSingleTypeImport.getName()});
ctx.getReport().addRuleViolation(createRuleViolation(ctx, thisSingleTypeImport.getLine(), msg));
}
}
}
singleTypeImports.clear();
importOnDemandImports.clear();
return data;
}
public Object visit(ASTImportDeclaration node, Object data) {
ImportWrapper wrapper = new ImportWrapper(node.getImportedNameNode().getImage(), node.getImportedNameNode().getBeginLine());
// blahhhh... this really wants to be ASTImportDeclaration to be polymorphic...
if (node.isImportOnDemand()) {
if (importOnDemandImports.contains(wrapper)) {
createRV((RuleContext) data, node.getImportedNameNode());
} else {
importOnDemandImports.add(wrapper);
}
} else {
if (singleTypeImports.contains(wrapper)) {
createRV((RuleContext) data, node.getImportedNameNode());
} else {
singleTypeImports.add(wrapper);
}
}
return data;
}
private void createRV(RuleContext ctx, SimpleNode importNameNode) {
String msg = MessageFormat.format(getMessage(), new Object[]{importNameNode.getImage()});
ctx.getReport().addRuleViolation(createRuleViolation(ctx, importNameNode.getBeginLine(), msg));
}
}