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.api;
21
22 import java.io.File;
23 import java.util.Arrays;
24 import java.util.SortedSet;
25 import java.util.TreeSet;
26
27 import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
28
29
30
31
32
33
34 public abstract class AbstractFileSetCheck
35 extends AbstractViolationReporter
36 implements FileSetCheck {
37
38
39
40
41
42 private final ThreadLocal<FileContext> context = ThreadLocal.withInitial(FileContext::new);
43
44
45 private MessageDispatcher messageDispatcher;
46
47
48 private String[] fileExtensions = CommonUtil.EMPTY_STRING_ARRAY;
49
50
51 private int tabWidth = CommonUtil.DEFAULT_TAB_WIDTH;
52
53
54
55
56
57
58
59 protected abstract void processFiltered(File file, FileText fileText)
60 throws CheckstyleException;
61
62 @Override
63 public void init() {
64
65 }
66
67 @Override
68 public void destroy() {
69
70 }
71
72 @Override
73 public void beginProcessing(String charset) {
74
75 }
76
77 @Override
78 public final SortedSet<LocalizedMessage> process(File file, FileText fileText)
79 throws CheckstyleException {
80 final SortedSet<LocalizedMessage> messages = context.get().messages;
81 context.get().fileContents = new FileContents(fileText);
82 messages.clear();
83
84 if (CommonUtil.matchesFileExtension(file, fileExtensions)) {
85 processFiltered(file, fileText);
86 }
87 final SortedSet<LocalizedMessage> result = new TreeSet<>(messages);
88 messages.clear();
89 return result;
90 }
91
92 @Override
93 public void finishProcessing() {
94
95 }
96
97 @Override
98 public final void setMessageDispatcher(MessageDispatcher messageDispatcher) {
99 this.messageDispatcher = messageDispatcher;
100 }
101
102
103
104
105
106
107
108 protected final MessageDispatcher getMessageDispatcher() {
109 return messageDispatcher;
110 }
111
112
113
114
115
116 public SortedSet<LocalizedMessage> getMessages() {
117 return new TreeSet<>(context.get().messages);
118 }
119
120
121
122
123
124 public final void setFileContents(FileContents contents) {
125 context.get().fileContents = contents;
126 }
127
128
129
130
131
132 protected final FileContents getFileContents() {
133 return context.get().fileContents;
134 }
135
136
137
138
139
140
141 public String[] getFileExtensions() {
142 return Arrays.copyOf(fileExtensions, fileExtensions.length);
143 }
144
145
146
147
148
149
150
151
152 public final void setFileExtensions(String... extensions) {
153 if (extensions == null) {
154 throw new IllegalArgumentException("Extensions array can not be null");
155 }
156
157 fileExtensions = new String[extensions.length];
158 for (int i = 0; i < extensions.length; i++) {
159 final String extension = extensions[i];
160 if (CommonUtil.startsWithChar(extension, '.')) {
161 fileExtensions[i] = extension;
162 }
163 else {
164 fileExtensions[i] = "." + extension;
165 }
166 }
167 }
168
169
170
171
172
173 protected final int getTabWidth() {
174 return tabWidth;
175 }
176
177
178
179
180
181 public final void setTabWidth(int tabWidth) {
182 this.tabWidth = tabWidth;
183 }
184
185
186
187
188
189 protected void addMessages(SortedSet<LocalizedMessage> messages) {
190 context.get().messages.addAll(messages);
191 }
192
193 @Override
194 public final void log(int line, String key, Object... args) {
195 context.get().messages.add(
196 new LocalizedMessage(line,
197 getMessageBundle(),
198 key,
199 args,
200 getSeverityLevel(),
201 getId(),
202 getClass(),
203 getCustomMessages().get(key)));
204 }
205
206 @Override
207 public final void log(int lineNo, int colNo, String key,
208 Object... args) {
209 final int col = 1 + CommonUtil.lengthExpandedTabs(
210 context.get().fileContents.getLine(lineNo - 1), colNo, tabWidth);
211 context.get().messages.add(
212 new LocalizedMessage(lineNo,
213 col,
214 getMessageBundle(),
215 key,
216 args,
217 getSeverityLevel(),
218 getId(),
219 getClass(),
220 getCustomMessages().get(key)));
221 }
222
223
224
225
226
227
228
229 protected final void fireErrors(String fileName) {
230 final SortedSet<LocalizedMessage> errors = new TreeSet<>(context.get().messages);
231 context.get().messages.clear();
232 messageDispatcher.fireErrors(fileName, errors);
233 }
234
235
236
237
238 private static class FileContext {
239
240
241 private final SortedSet<LocalizedMessage> messages = new TreeSet<>();
242
243
244 private FileContents fileContents;
245
246 }
247
248 }