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  import net.sourceforge.pmd.ast.ASTPackageDeclaration;
12  
13  public class ImportFromSamePackageRule extends AbstractRule {
14  
15      privateong> String packageName;
16  
17      public Object visit(ASTCompilationUnit node, Object data) {
18          packageName = null;
19          return super.visit(node, data);
20      }
21  
22      public Object visit(ASTPackageDeclaration node, Object data) {
23          packageName = ((ASTName) node.jjtGetChild(0)).getImage();
24          return data;
25      }
26  
27      public Object visit(ASTImportDeclaration node, Object data) {
28          ASTName nameNode = node.getImportedNameNode();
29          RuleContext ctx = (RuleContext) data;
30          if (packageName != null && !node.isImportOnDemand() && packageName.equals(getPackageName(nameNode.getImage()))) {
31              addViolation(ctx, node);
32          }
33  
34          // special case
35          if (packageName == null && getPackageName(nameNode.getImage()).equals("")) {
36              addViolation(ctx, node);
37          }
38          return data;
39      }
40  
41      private void addViolation(RuleContext ctx, ASTImportDeclaration node) {
42          ctx.getReport().addRuleViolation(createRuleViolation(ctx, node));
43      }
44  
45      private String getPackageName(String importName) {
46          if (importName.indexOf('.') == -1) {
47              return "";
48          }
49          int lastDot = importName.lastIndexOf('.');
50          return importName.substring(0, lastDot);
51      }
52  
53  }