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