Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
CheckstyleReport |
|
| 3.0;3 |
1 | package org.apache.maven.plugin.checkstyle; | |
2 | ||
3 | /* | |
4 | * Licensed to the Apache Software Foundation (ASF) under one | |
5 | * or more contributor license agreements. See the NOTICE file | |
6 | * distributed with this work for additional information | |
7 | * regarding copyright ownership. The ASF licenses this file | |
8 | * to you under the Apache License, Version 2.0 (the | |
9 | * "License"); you may not use this file except in compliance | |
10 | * with the License. You may obtain a copy of the License at | |
11 | * | |
12 | * http://www.apache.org/licenses/LICENSE-2.0 | |
13 | * | |
14 | * Unless required by applicable law or agreed to in writing, | |
15 | * software distributed under the License is distributed on an | |
16 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
17 | * KIND, either express or implied. See the License for the | |
18 | * specific language governing permissions and limitations | |
19 | * under the License. | |
20 | */ | |
21 | ||
22 | import java.io.File; | |
23 | import java.net.URL; | |
24 | import java.util.Collections; | |
25 | import java.util.HashMap; | |
26 | import java.util.Locale; | |
27 | import java.util.Map; | |
28 | ||
29 | import org.apache.maven.project.MavenProject; | |
30 | import org.apache.maven.reporting.MavenReportException; | |
31 | import org.codehaus.plexus.util.StringUtils; | |
32 | ||
33 | /** | |
34 | * Perform a Checkstyle analysis, and generate a report on violations. | |
35 | * | |
36 | * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a> | |
37 | * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a> | |
38 | * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a> | |
39 | * @version $Id$ | |
40 | * @goal checkstyle | |
41 | * @requiresDependencyResolution compile | |
42 | * @threadSafe | |
43 | */ | |
44 | 10 | public class CheckstyleReport |
45 | extends AbstractCheckstyleReport | |
46 | { | |
47 | /** | |
48 | * @deprecated Remove with format parameter. | |
49 | */ | |
50 | private static final Map<String, String> FORMAT_TO_CONFIG_LOCATION; | |
51 | ||
52 | static | |
53 | { | |
54 | 1 | Map<String, String> fmt2Cfg = new HashMap<String, String>(); |
55 | ||
56 | 1 | fmt2Cfg.put( "sun", "config/sun_checks.xml" ); |
57 | 1 | fmt2Cfg.put( "turbine", "config/turbine_checks.xml" ); |
58 | 1 | fmt2Cfg.put( "avalon", "config/avalon_checks.xml" ); |
59 | 1 | fmt2Cfg.put( "maven", "config/maven_checks.xml" ); |
60 | ||
61 | 1 | FORMAT_TO_CONFIG_LOCATION = Collections.unmodifiableMap( fmt2Cfg ); |
62 | 1 | } |
63 | ||
64 | /** | |
65 | * Specifies the names filter of the source files to be used for Checkstyle. | |
66 | * | |
67 | * @parameter expression="${checkstyle.includes}" default-value="**\/*.java" | |
68 | * @required | |
69 | */ | |
70 | private String includes; | |
71 | ||
72 | /** | |
73 | * Specifies the names filter of the source files to be excluded for | |
74 | * Checkstyle. | |
75 | * | |
76 | * @parameter expression="${checkstyle.excludes}" | |
77 | */ | |
78 | private String excludes; | |
79 | ||
80 | /** | |
81 | * <p> | |
82 | * Specifies the location of the XML configuration to use. | |
83 | * </p> | |
84 | * | |
85 | * <p> | |
86 | * Potential values are a filesystem path, a URL, or a classpath resource. | |
87 | * This parameter expects that the contents of the location conform to the | |
88 | * xml format (Checkstyle <a | |
89 | * href="http://checkstyle.sourceforge.net/config.html#Modules">Checker | |
90 | * module</a>) configuration of rulesets. | |
91 | * </p> | |
92 | * | |
93 | * <p> | |
94 | * This parameter is resolved as resource, URL, then file. If successfully | |
95 | * resolved, the contents of the configuration is copied into the | |
96 | * <code>${project.build.directory}/checkstyle-configuration.xml</code> | |
97 | * file before being passed to Checkstyle as a configuration. | |
98 | * </p> | |
99 | * | |
100 | * <p> | |
101 | * There are 4 predefined rulesets. | |
102 | * </p> | |
103 | * | |
104 | * <ul> | |
105 | * <li><code>config/sun_checks.xml</code>: Sun Checks.</li> | |
106 | * <li><code>config/turbine_checks.xml</code>: Turbine Checks.</li> | |
107 | * <li><code>config/avalon_checks.xml</code>: Avalon Checks.</li> | |
108 | * <li><code>config/maven_checks.xml</code>: Maven Source Checks.</li> | |
109 | * </ul> | |
110 | * | |
111 | * @parameter expression="${checkstyle.config.location}" | |
112 | * default-value="config/sun_checks.xml" | |
113 | */ | |
114 | private String configLocation; | |
115 | ||
116 | /** | |
117 | * Specifies what predefined check set to use. Available sets are "sun" (for | |
118 | * the Sun coding conventions), "turbine", and "avalon". | |
119 | * | |
120 | * @parameter default-value="sun" | |
121 | * @deprecated Use configLocation instead. | |
122 | */ | |
123 | private String format; | |
124 | ||
125 | /** | |
126 | * <p> | |
127 | * Specifies the location of the properties file. | |
128 | * </p> | |
129 | * | |
130 | * <p> | |
131 | * This parameter is resolved as URL, File then resource. If successfully | |
132 | * resolved, the contents of the properties location is copied into the | |
133 | * <code>${project.build.directory}/checkstyle-checker.properties</code> | |
134 | * file before being passed to Checkstyle for loading. | |
135 | * </p> | |
136 | * | |
137 | * <p> | |
138 | * The contents of the <code>propertiesLocation</code> will be made | |
139 | * available to Checkstyle for specifying values for parameters within the | |
140 | * xml configuration (specified in the <code>configLocation</code> | |
141 | * parameter). | |
142 | * </p> | |
143 | * | |
144 | * @parameter expression="${checkstyle.properties.location}" | |
145 | * @since 2.0-beta-2 | |
146 | */ | |
147 | private String propertiesLocation; | |
148 | ||
149 | /** | |
150 | * Specifies the location of the Checkstyle properties file that will be used to | |
151 | * check the source. | |
152 | * | |
153 | * @parameter | |
154 | * @deprecated Use propertiesLocation instead. | |
155 | */ | |
156 | private File propertiesFile; | |
157 | ||
158 | /** | |
159 | * Specifies the URL of the Checkstyle properties that will be used to check | |
160 | * the source. | |
161 | * | |
162 | * @parameter | |
163 | * @deprecated Use propertiesLocation instead. | |
164 | */ | |
165 | private URL propertiesURL; | |
166 | ||
167 | /** | |
168 | * Allows for specifying raw property expansion information. | |
169 | * | |
170 | * @parameter | |
171 | */ | |
172 | private String propertyExpansion; | |
173 | ||
174 | /** | |
175 | * <p> | |
176 | * Specifies the location of the License file (a.k.a. the header file) that | |
177 | * can be used by Checkstyle to verify that source code has the correct | |
178 | * license header. | |
179 | * </p> | |
180 | * <p> | |
181 | * You need to use ${checkstyle.header.file} in your Checkstyle xml | |
182 | * configuration to reference the name of this header file. | |
183 | * </p> | |
184 | * <p> | |
185 | * For instance: | |
186 | * </p> | |
187 | * <p> | |
188 | * <code> | |
189 | * <module name="RegexpHeader"> | |
190 | * <property name="headerFile" value="${checkstyle.header.file}"/> | |
191 | * </module> | |
192 | * </code> | |
193 | * </p> | |
194 | * | |
195 | * @parameter expression="${checkstyle.header.file}" default-value="LICENSE.txt" | |
196 | * @since 2.0-beta-2 | |
197 | */ | |
198 | private String headerLocation; | |
199 | ||
200 | /** | |
201 | * Specifies the location of the License file (a.k.a. the header file) that | |
202 | * is used by Checkstyle to verify that source code has the correct | |
203 | * license header. | |
204 | * | |
205 | * @parameter expression="${basedir}/LICENSE.txt" | |
206 | * @deprecated Use headerLocation instead. | |
207 | */ | |
208 | private File headerFile; | |
209 | ||
210 | /** | |
211 | * Specifies the cache file used to speed up Checkstyle on successive runs. | |
212 | * | |
213 | * @parameter default-value="${project.build.directory}/checkstyle-cachefile" | |
214 | */ | |
215 | private String cacheFile; | |
216 | ||
217 | /** | |
218 | * <p> | |
219 | * Specifies the location of the suppressions XML file to use. | |
220 | * </p> | |
221 | * | |
222 | * <p> | |
223 | * This parameter is resolved as resource, URL, then file. If successfully | |
224 | * resolved, the contents of the suppressions XML is copied into the | |
225 | * <code>${project.build.directory}/checkstyle-supressions.xml</code> file | |
226 | * before being passed to Checkstyle for loading. | |
227 | * </p> | |
228 | * | |
229 | * <p> | |
230 | * See <code>suppressionsFileExpression</code> for the property that will | |
231 | * be made available to your checkstyle configuration. | |
232 | * </p> | |
233 | * | |
234 | * @parameter expression="${checkstyle.suppressions.location}" | |
235 | * @since 2.0-beta-2 | |
236 | */ | |
237 | private String suppressionsLocation; | |
238 | ||
239 | /** | |
240 | * The key to be used in the properties for the suppressions file. | |
241 | * | |
242 | * @parameter expression="${checkstyle.suppression.expression}" | |
243 | * default-value="checkstyle.suppressions.file" | |
244 | * @since 2.1 | |
245 | */ | |
246 | private String suppressionsFileExpression; | |
247 | ||
248 | /** | |
249 | * Specifies the location of the suppressions XML file to use. The plugin | |
250 | * defines a Checkstyle property named | |
251 | * <code>checkstyle.suppressions.file</code> with the value of this | |
252 | * property. This allows using the Checkstyle property in your own custom | |
253 | * checkstyle configuration file when specifying a suppressions file. | |
254 | * | |
255 | * @parameter | |
256 | * @deprecated Use suppressionsLocation instead. | |
257 | */ | |
258 | private String suppressionsFile; | |
259 | ||
260 | /** | |
261 | * <p> | |
262 | * Specifies the location of the package names XML to be used to configure | |
263 | * the Checkstyle <a | |
264 | * href="http://checkstyle.sourceforge.net/config.html#Packages">Packages</a>. | |
265 | * </p> | |
266 | * | |
267 | * <p> | |
268 | * This parameter is resolved as resource, URL, then file. If resolved to a | |
269 | * resource, or a URL, the contents of the package names XML is copied into | |
270 | * the <code>${project.build.directory}/checkstyle-packagenames.xml</code> | |
271 | * file before being passed to Checkstyle for loading. | |
272 | * </p> | |
273 | * | |
274 | * @parameter | |
275 | * @since 2.0-beta-2 | |
276 | */ | |
277 | private String packageNamesLocation; | |
278 | ||
279 | /** | |
280 | * Specifies the location of the package names XML to be used to configure | |
281 | * Checkstyle. | |
282 | * | |
283 | * @parameter | |
284 | * @deprecated Use packageNamesLocation instead. | |
285 | */ | |
286 | private String packageNamesFile; | |
287 | ||
288 | /** | |
289 | * Specifies if the build should fail upon a violation. | |
290 | * | |
291 | * @parameter default-value="false" | |
292 | */ | |
293 | private boolean failsOnError; | |
294 | ||
295 | /** | |
296 | * Specifies the location of the source directory to be used for Checkstyle. | |
297 | * | |
298 | * @parameter default-value="${project.build.sourceDirectory}" | |
299 | * @required | |
300 | */ | |
301 | private File sourceDirectory; | |
302 | ||
303 | /** | |
304 | * Specifies the location of the test source directory to be used for | |
305 | * Checkstyle. | |
306 | * | |
307 | * @parameter default-value="${project.build.testSourceDirectory}" | |
308 | * @since 2.2 | |
309 | */ | |
310 | private File testSourceDirectory; | |
311 | ||
312 | /** | |
313 | * Include or not the test source directory to be used for Checkstyle. | |
314 | * | |
315 | * @parameter default-value="${false}" | |
316 | * @since 2.2 | |
317 | */ | |
318 | private boolean includeTestSourceDirectory; | |
319 | ||
320 | /** | |
321 | * Output errors to console. | |
322 | * | |
323 | * @parameter default-value="false" | |
324 | */ | |
325 | private boolean consoleOutput; | |
326 | ||
327 | /** | |
328 | * The file encoding to use when reading the source files. If the property <code>project.build.sourceEncoding</code> | |
329 | * is not set, the platform default encoding is used. <strong>Note:</strong> This parameter always overrides the | |
330 | * property <code>charset</code> from Checkstyle's <code>TreeWalker</code> module. | |
331 | * | |
332 | * @parameter expression="${encoding}" default-value="${project.build.sourceEncoding}" | |
333 | * @since 2.2 | |
334 | */ | |
335 | private String encoding; | |
336 | ||
337 | /** {@inheritDoc} */ | |
338 | protected MavenProject getProject() | |
339 | { | |
340 | 12 | return project; |
341 | } | |
342 | ||
343 | /** {@inheritDoc} */ | |
344 | public void executeReport( Locale locale ) | |
345 | throws MavenReportException | |
346 | { | |
347 | 16 | mergeDeprecatedInfo(); |
348 | 16 | super.executeReport( locale ); |
349 | 14 | } |
350 | ||
351 | /** | |
352 | * {@inheritDoc} | |
353 | */ | |
354 | protected CheckstyleExecutorRequest createRequest() | |
355 | throws MavenReportException | |
356 | { | |
357 | 16 | CheckstyleExecutorRequest request = new CheckstyleExecutorRequest(); |
358 | 16 | request.setConsoleListener( getConsoleListener() ).setConsoleOutput( consoleOutput ) |
359 | .setExcludes( excludes ).setFailsOnError( failsOnError ).setIncludes( includes ) | |
360 | .setIncludeTestSourceDirectory( includeTestSourceDirectory ).setListener( getListener() ) | |
361 | .setLog( getLog() ).setProject( project ).setSourceDirectory( sourceDirectory ) | |
362 | .setStringOutputStream( stringOutputStream ).setSuppressionsLocation( suppressionsLocation ) | |
363 | .setTestSourceDirectory( testSourceDirectory ).setConfigLocation( configLocation ) | |
364 | .setPropertyExpansion( propertyExpansion ).setHeaderLocation( headerLocation ) | |
365 | .setCacheFile( cacheFile ).setSuppressionsFileExpression( suppressionsFileExpression ) | |
366 | .setEncoding( encoding ).setPropertiesLocation( propertiesLocation ); | |
367 | 16 | return request; |
368 | } | |
369 | ||
370 | /** {@inheritDoc} */ | |
371 | public String getOutputName() | |
372 | { | |
373 | 23 | return "checkstyle"; |
374 | } | |
375 | ||
376 | /** {@inheritDoc} */ | |
377 | public boolean canGenerateReport() | |
378 | { | |
379 | // TODO: would be good to scan the files here | |
380 | 34 | return !skip && ( sourceDirectory.exists() || ( includeTestSourceDirectory && testSourceDirectory.exists() ) ); |
381 | } | |
382 | ||
383 | /** | |
384 | * Merge in the deprecated parameters to the new ones, unless the new | |
385 | * parameters have values. | |
386 | * | |
387 | * @deprecated Remove when deprecated params are removed. | |
388 | */ | |
389 | private void mergeDeprecatedInfo() | |
390 | { | |
391 | 16 | if ( "config/sun_checks.xml".equals( configLocation ) && !"sun".equals( format ) ) |
392 | { | |
393 | 1 | configLocation = (String) FORMAT_TO_CONFIG_LOCATION.get( format ); |
394 | } | |
395 | ||
396 | 16 | if ( StringUtils.isEmpty( propertiesLocation ) ) |
397 | { | |
398 | 16 | if ( propertiesFile != null ) |
399 | { | |
400 | 0 | propertiesLocation = propertiesFile.getPath(); |
401 | } | |
402 | 16 | else if ( propertiesURL != null ) |
403 | { | |
404 | 0 | propertiesLocation = propertiesURL.toExternalForm(); |
405 | } | |
406 | } | |
407 | ||
408 | 16 | if ( "LICENSE.txt".equals( headerLocation ) ) |
409 | { | |
410 | 1 | File defaultHeaderFile = new File( project.getBasedir(), "LICENSE.txt" ); |
411 | 1 | if ( !defaultHeaderFile.equals( headerFile ) ) |
412 | { | |
413 | 1 | headerLocation = headerFile.getPath(); |
414 | } | |
415 | } | |
416 | ||
417 | 16 | if ( StringUtils.isEmpty( suppressionsLocation ) ) |
418 | { | |
419 | 16 | suppressionsLocation = suppressionsFile; |
420 | } | |
421 | ||
422 | 16 | if ( StringUtils.isEmpty( packageNamesLocation ) ) |
423 | { | |
424 | 16 | packageNamesLocation = packageNamesFile; |
425 | } | |
426 | 16 | } |
427 | ||
428 | } |