-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
AbstractFileSetCheck.java
executable file
·206 lines (184 loc) · 6.34 KB
/
AbstractFileSetCheck.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2013 Oliver Burn
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
////////////////////////////////////////////////////////////////////////////////
package com.puppycrawl.tools.checkstyle.api;
import java.io.File;
import java.util.List;
import java.util.TreeSet;
/**
* Provides common functionality for many FileSetChecks.
*
* @author lkuehne
* @author oliver
*/
public abstract class AbstractFileSetCheck
extends AbstractViolationReporter
implements FileSetCheck
{
/** The dispatcher errors are fired to. */
private MessageDispatcher mDispatcher;
/** the file extensions that are accepted by this filter */
private String[] mFileExtensions = {};
/** collects the error messages */
private final LocalizedMessages mMessages = new LocalizedMessages();
/**
* Called to process a file that matches the specified file extensions.
* @param aFile the file to be processed
* @param aLines an immutable list of the contents of the file.
*/
protected abstract void processFiltered(File aFile, List<String> aLines);
/** {@inheritDoc} */
public void init()
{
}
/** {@inheritDoc} */
public void destroy()
{
}
/** {@inheritDoc} */
public void beginProcessing(String aCharset)
{
}
/** {@inheritDoc} */
public final TreeSet<LocalizedMessage> process(File aFile,
List<String> aLines)
{
getMessageCollector().reset();
// Process only what interested in
if (fileExtensionMatches(aFile)) {
processFiltered(aFile, aLines);
}
return getMessageCollector().getMessages();
}
/** {@inheritDoc} */
public void finishProcessing()
{
}
/** {@inheritDoc} */
public final void setMessageDispatcher(MessageDispatcher aDispatcher)
{
mDispatcher = aDispatcher;
}
/**
* A message dispatcher is used to fire violation messages to
* interested audit listeners.
*
* @return the current MessageDispatcher.
*/
protected final MessageDispatcher getMessageDispatcher()
{
return mDispatcher;
}
/**
* Sets the file extensions that identify the files that pass the
* filter of this FileSetCheck.
* @param aExtensions the set of file extensions. A missing
* initial '.' character of an extension is automatically added.
*/
public final void setFileExtensions(String[] aExtensions)
{
if (aExtensions == null) {
mFileExtensions = null;
return;
}
mFileExtensions = new String[aExtensions.length];
for (int i = 0; i < aExtensions.length; i++) {
final String extension = aExtensions[i];
if (extension.startsWith(".")) {
mFileExtensions[i] = extension;
}
else {
mFileExtensions[i] = "." + extension;
}
}
}
/**
* Returns the collector for violation messages.
* Subclasses can use the collector to find out the violation
* messages to fire via the message dispatcher.
*
* @return the collector for localized messages.
*/
protected final LocalizedMessages getMessageCollector()
{
return mMessages;
}
@Override
public final void log(int aLine, String aKey, Object... aArgs)
{
log(aLine, 0, aKey, aArgs);
}
@Override
public final void log(int aLineNo, int aColNo, String aKey,
Object... aArgs)
{
getMessageCollector().add(
new LocalizedMessage(aLineNo,
aColNo,
getMessageBundle(),
aKey,
aArgs,
getSeverityLevel(),
getId(),
this.getClass(),
this.getCustomMessages().get(aKey)));
}
/**
* Notify all listeners about the errors in a file.
* Calls <code>MessageDispatcher.fireErrors()</code> with
* all logged errors and than clears errors' list.
* @param aFileName the audited file
*/
protected final void fireErrors(String aFileName)
{
final TreeSet<LocalizedMessage> errors = getMessageCollector()
.getMessages();
getMessageCollector().reset();
getMessageDispatcher().fireErrors(aFileName, errors);
}
/**
* Returns whether the file extension matches what we are meant to
* process.
* @param aFile the file to be checked.
* @return whether there is a match.
*/
private boolean fileExtensionMatches(File aFile)
{
if ((null == mFileExtensions) || (mFileExtensions.length == 0)) {
return true;
}
// normalize extensions so all of them have a leading dot
final String[] withDotExtensions = new String[mFileExtensions.length];
for (int i = 0; i < mFileExtensions.length; i++) {
final String extension = mFileExtensions[i];
if (extension.startsWith(".")) {
withDotExtensions[i] = extension;
}
else {
withDotExtensions[i] = "." + extension;
}
}
final String fileName = aFile.getName();
for (final String fileExtension : withDotExtensions) {
if (fileName.endsWith(fileExtension)) {
return true;
}
}
return false;
}
}