View Javadoc

1   /***
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.rules.imports;
5   
6   import net.sourceforge.pmd.AbstractRule;
7   import net.sourceforge.pmd.ast.ASTCompilationUnit;
8   import net.sourceforge.pmd.ast.ASTImportDeclaration;
9   import net.sourceforge.pmd.rules.ImportWrapper;
10  
11  import java.util.HashSet;
12  import java.util.Iterator;
13  import java.util.Set;
14  
15  public class DuplicateImportsRule extends AbstractRule {
16  
17      private Set singleTypeImports;
18      private Set importOnDemandImports;
19  
20      public Object visit(ASTCompilationUnit node, Object data) {
21          singleTypeImports = new HashSet();
22          importOnDemandImports = new HashSet();
23          super.visit(node, data);
24  
25          // this checks for things like:
26          // import java.io.*;
27          // import java.io.File;
28          for (Iterator i = importOnDemandImports.iterator(); i.hasNext();) {
29              ImportWrapper thisImportOnDemand = (ImportWrapper) i.next();
30              for (Iterator j = singleTypeImports.iterator(); j.hasNext();) {
31                  ImportWrapper thisSingleTypeImport = (ImportWrapper) j.next();
32                  String singleTypePkg = thisSingleTypeImport.getName().substring(0, thisSingleTypeImport.getName().lastIndexOf("."));
33                  if (thisImportOnDemand.getName().equals(singleTypePkg)) {
34                      addViolation(data, thisSingleTypeImport.getNode(), thisSingleTypeImport.getName());
35                  }
36              }
37          }
38          singleTypeImports.clear();
39          importOnDemandImports.clear();
40          return data;
41      }
42  
43      public Object visit(ASTImportDeclaration node, Object data) {
44          ImportWrapper wrapper = new ImportWrapper(node.getImportedName(), node.getImportedName(), node.getImportedNameNode());
45  
46          // blahhhh... this really wants to be ASTImportDeclaration to be polymorphic...
47          if (node.isImportOnDemand()) {
48              if (importOnDemandImports.contains(wrapper)) {
49                  addViolation(data, node.getImportedNameNode(), node.getImportedNameNode().getImage());
50              } else {
51                  importOnDemandImports.add(wrapper);
52              }
53          } else {
54              if (singleTypeImports.contains(wrapper)) {
55                  addViolation(data, node.getImportedNameNode(), node.getImportedNameNode().getImage());
56              } else {
57                  singleTypeImports.add(wrapper);
58              }
59          }
60          return data;
61      }
62  
63  }