1 package net.sourceforge.pmd.rules;
2
3 import net.sourceforge.pmd.AbstractRule;
4 import net.sourceforge.pmd.RuleContext;
5 import net.sourceforge.pmd.ast.ASTCompilationUnit;
6 import net.sourceforge.pmd.ast.ASTImportDeclaration;
7 import net.sourceforge.pmd.ast.SimpleNode;
8
9 import java.text.MessageFormat;
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 RuleContext ctx = (RuleContext) 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 String msg = MessageFormat.format(getMessage(), new Object[]{thisSingleTypeImport.getName()});
35 ctx.getReport().addRuleViolation(createRuleViolation(ctx, thisSingleTypeImport.getLine(), msg));
36 }
37 }
38 }
39 singleTypeImports.clear();
40 importOnDemandImports.clear();
41 return data;
42 }
43
44 public Object visit(ASTImportDeclaration node, Object data) {
45 ImportWrapper wrapper = new ImportWrapper(node.getImportedNameNode().getImage(), node.getImportedNameNode().getBeginLine());
46
47 // blahhhh... this really wants to be ASTImportDeclaration to be polymorphic...
48 if (node.isImportOnDemand()) {
49 if (importOnDemandImports.contains(wrapper)) {
50 createRV((RuleContext) data, node.getImportedNameNode());
51 } else {
52 importOnDemandImports.add(wrapper);
53 }
54 } else {
55 if (singleTypeImports.contains(wrapper)) {
56 createRV((RuleContext) data, node.getImportedNameNode());
57 } else {
58 singleTypeImports.add(wrapper);
59 }
60 }
61 return data;
62 }
63
64 private void createRV(RuleContext ctx, SimpleNode importNameNode) {
65 String msg = MessageFormat.format(getMessage(), new Object[]{importNameNode.getImage()});
66 ctx.getReport().addRuleViolation(createRuleViolation(ctx, importNameNode.getBeginLine(), msg));
67 }
68 }
This page was automatically generated by Maven