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.getLine(), 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().getBeginLine()); 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.getBeginLine(), msg)); 70 } 71 }

This page was automatically generated by Maven