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 private String packageName/package-summary.html">ong> 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
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 }