View Javadoc

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          // this checks for things like:
25          // import java.io.*;
26          // import java.io.File;
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          // blahhhh... this really wants to be ASTImportDeclaration to be polymorphic...
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  }