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.ASTName;
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 UnusedImportsRule extends AbstractRule {
18  
19      private Set imports = new HashSet();
20  
21      public Object visit(ASTCompilationUnit node, Object data) {
22          imports.clear();
23  
24          super.visit(node, data);
25  
26          RuleContext ctx = (RuleContext) data;
27          for (Iterator i = imports.iterator(); i.hasNext();) {
28              ImportWrapper wrapper = (ImportWrapper) i.next();
29              String msg = MessageFormat.format(getMessage(), new Object[]{wrapper.getName()});
30              ctx.getReport().addRuleViolation(createRuleViolation(ctx, wrapper.getLine(), msg));
31          }
32          return data;
33      }
34  
35      public Object visit(ASTImportDeclaration node, Object data) {
36          if (!node.isImportOnDemand()) {
37              ASTName importedType = (ASTName) node.jjtGetChild(0);
38              String className;
39              if (importedType.getImage().indexOf('.') != -1) {
40                  int lastDot = importedType.getImage().lastIndexOf('.') + 1;
41                  className = importedType.getImage().substring(lastDot);
42              } else {
43                  className = importedType.getImage();
44              }
45              ImportWrapper wrapper = new ImportWrapper(className, node.getBeginLine());
46              imports.add(wrapper);
47          }
48  
49          return data;
50      }
51  
52      public Object visit(ASTName node, Object data) {
53          String name;
54          if (node.getImage().indexOf('.') == -1) {
55              name = node.getImage();
56          } else {
57              name = node.getImage().substring(0, node.getImage().indexOf('.'));
58          }
59          ImportWrapper candidate = new ImportWrapper(name, -1);
60          if (imports.contains(candidate)) {
61              imports.remove(candidate);
62          }
63          return data;
64      }
65  
66  
67  }