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