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.ASTCompilationUnit;
9 import net.sourceforge.pmd.ast.ASTImportDeclaration;
10 import net.sourceforge.pmd.ast.SimpleNode;
11
12 import java.text.MessageFormat;
13 import java.util.HashSet;
14 import java.util.Iterator;
15 import java.util.Set;
16
17 public class DuplicateImportsRule extends AbstractRule {
18
19 private Set singleTypeImports;
20 private Set importOnDemandImports;
21
22 public Object visit(ASTCompilationUnit node, Object data) {
23 RuleContext ctx = (RuleContext) data;
24 singleTypeImports = new HashSet();
25 importOnDemandImports = new HashSet();
26 super.visit(node, data);
27
28
29
30
31 for (Iterator i = importOnDemandImports.iterator(); i.hasNext();) {
32 ImportWrapper thisImportOnDemand = (ImportWrapper) i.next();
33 for (Iterator j = singleTypeImports.iterator(); j.hasNext();) {
34 ImportWrapper thisSingleTypeImport = (ImportWrapper) j.next();
35 String singleTypePkg = thisSingleTypeImport.getName().substring(0, thisSingleTypeImport.getName().lastIndexOf("."));
36 if (thisImportOnDemand.getName().equals(singleTypePkg)) {
37 String msg = MessageFormat.format(getMessage(), new Object[]{thisSingleTypeImport.getName()});
38 ctx.getReport().addRuleViolation(createRuleViolation(ctx, thisSingleTypeImport.getPositionProvider(), msg));
39 }
40 }
41 }
42 singleTypeImports.clear();
43 importOnDemandImports.clear();
44 return data;
45 }
46
47 public Object visit(ASTImportDeclaration node, Object data) {
48 ImportWrapper wrapper = new ImportWrapper(node.getImportedNameNode().getImage(), node.getImportedNameNode().getImage(), node.getImportedNameNode());
49
50
51 if (node.isImportOnDemand()) {
52 if (importOnDemandImports.contains(wrapper)) {
53 createRV((RuleContext) data, node.getImportedNameNode());
54 } else {
55 importOnDemandImports.add(wrapper);
56 }
57 } else {
58 if (singleTypeImports.contains(wrapper)) {
59 createRV((RuleContext) data, node.getImportedNameNode());
60 } else {
61 singleTypeImports.add(wrapper);
62 }
63 }
64 return data;
65 }
66
67 private void createRV(RuleContext ctx, SimpleNode importNameNode) {
68 String msg = MessageFormat.format(getMessage(), new Object[]{importNameNode.getImage()});
69 ctx.getReport().addRuleViolation(createRuleViolation(ctx, importNameNode, msg));
70 }
71 }