1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.puppycrawl.tools.checkstyle.checks.coding;
21
22 import java.io.File;
23
24 import com.puppycrawl.tools.checkstyle.FileStatefulCheck;
25 import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
26 import com.puppycrawl.tools.checkstyle.api.DetailAST;
27 import com.puppycrawl.tools.checkstyle.api.FullIdent;
28 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 @FileStatefulCheck
51 public final class PackageDeclarationCheck extends AbstractCheck {
52
53
54
55
56
57 public static final String MSG_KEY_MISSING = "missing.package.declaration";
58
59
60
61
62
63 public static final String MSG_KEY_MISMATCH = "mismatch.package.directory";
64
65
66 private boolean defined;
67
68
69 private boolean matchDirectoryStructure = true;
70
71
72
73
74
75
76
77 public void setMatchDirectoryStructure(boolean matchDirectoryStructure) {
78 this.matchDirectoryStructure = matchDirectoryStructure;
79 }
80
81 @Override
82 public int[] getDefaultTokens() {
83 return getRequiredTokens();
84 }
85
86 @Override
87 public int[] getRequiredTokens() {
88 return new int[] {TokenTypes.PACKAGE_DEF};
89 }
90
91 @Override
92 public int[] getAcceptableTokens() {
93 return getRequiredTokens();
94 }
95
96 @Override
97 public void beginTree(DetailAST ast) {
98 defined = false;
99 }
100
101 @Override
102 public void finishTree(DetailAST ast) {
103 if (!defined && ast != null) {
104 log(ast, MSG_KEY_MISSING);
105 }
106 }
107
108 @Override
109 public void visitToken(DetailAST ast) {
110 defined = true;
111
112 if (matchDirectoryStructure) {
113 final DetailAST packageNameAst = ast.getLastChild().getPreviousSibling();
114 final FullIdent fullIdent = FullIdent.createFullIdent(packageNameAst);
115 final String packageName = fullIdent.getText().replace('.', File.separatorChar);
116
117 final String directoryName = getDirectoryName();
118
119 if (!directoryName.endsWith(packageName)) {
120 log(ast, MSG_KEY_MISMATCH, packageName);
121 }
122 }
123 }
124
125
126
127
128
129
130 private String getDirectoryName() {
131 final String fileName = getFilePath();
132 final int lastSeparatorPos = fileName.lastIndexOf(File.separatorChar);
133 return fileName.substring(0, lastSeparatorPos);
134 }
135
136 }