View Javadoc

1   package org.apache.maven.plugin.checkstyle;
2   
3   import java.util.ArrayList;
4   import java.util.Iterator;
5   import java.util.List;
6   
7   import org.apache.maven.plugin.AbstractMojo;
8   import org.apache.maven.plugin.MojoExecutionException;
9   
10  /**
11   * Display help information on maven-checkstyle-plugin.<br/> Call <pre>  mvn checkstyle:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</pre> to display parameter details.
12   *
13   * @version generated on Wed Feb 22 14:42:38 CET 2012
14   * @author org.apache.maven.tools.plugin.generator.PluginHelpGenerator (version 2.8)
15   * @goal help
16   * @requiresProject false
17   * @threadSafe
18   */
19  @SuppressWarnings( "all" )
20  public class HelpMojo
21      extends AbstractMojo
22  {
23      /**
24       * If <code>true</code>, display all settable properties for each goal.
25       * 
26       * @parameter expression="${detail}" default-value="false"
27       */
28      private boolean detail;
29  
30      /**
31       * The name of the goal for which to show help. If unspecified, all goals will be displayed.
32       * 
33       * @parameter expression="${goal}"
34       */
35      private java.lang.String goal;
36  
37      /**
38       * The maximum length of a display line, should be positive.
39       * 
40       * @parameter expression="${lineLength}" default-value="80"
41       */
42      private int lineLength;
43  
44      /**
45       * The number of spaces per indentation level, should be positive.
46       * 
47       * @parameter expression="${indentSize}" default-value="2"
48       */
49      private int indentSize;
50  
51  
52      /** {@inheritDoc} */
53      public void execute()
54          throws MojoExecutionException
55      {
56          if ( lineLength <= 0 )
57          {
58              getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." );
59              lineLength = 80;
60          }
61          if ( indentSize <= 0 )
62          {
63              getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." );
64              indentSize = 2;
65          }
66  
67          StringBuffer sb = new StringBuffer();
68  
69          append( sb, "org.apache.maven.plugins:maven-checkstyle-plugin:2.9.1", 0 );
70          append( sb, "", 0 );
71  
72          append( sb, "Maven Checkstyle Plugin", 0 );
73          append( sb, "Generates a report on violations of code style and optionally fails the build if violations are detected.", 1 );
74          append( sb, "", 0 );
75  
76          if ( goal == null || goal.length() <= 0 )
77          {
78              append( sb, "This plugin has 4 goals:", 0 );
79              append( sb, "", 0 );
80          }
81  
82          if ( goal == null || goal.length() <= 0 || "check".equals( goal ) )
83          {
84              append( sb, "checkstyle:check", 0 );
85              append( sb, "Perform a violation check against the last Checkstyle run to see if there are any violations. It reads the Checkstyle output file, counts the number of violations found and displays it on the console.", 1 );
86              append( sb, "", 0 );
87              if ( detail )
88              {
89                  append( sb, "Available parameters:", 1 );
90                  append( sb, "", 0 );
91  
92                  append( sb, "cacheFile (Default: ${project.build.directory}/checkstyle-cachefile)", 2 );
93                  append( sb, "Specifies the cache file used to speed up Checkstyle on successive runs.", 3 );
94                  append( sb, "", 0 );
95  
96                  append( sb, "configLocation (Default: config/sun_checks.xml)", 2 );
97                  append( sb, "Specifies the location of the XML configuration to use.\n\nPotential values are a filesystem path, a URL, or a classpath resource. This parameter expects that the contents of the location conform to the xml format (Checkstyle Checker module) configuration of rulesets.\n\nThis parameter is resolved as resource, URL, then file. If successfully resolved, the contents of the configuration is copied into the ${project.build.directory}/checkstyle-configuration.xml file before being passed to Checkstyle as a configuration.\n\nThere are 4 predefined rulesets.\n\n-\tconfig/sun_checks.xml: Sun Checks.\n-\tconfig/turbine_checks.xml: Turbine Checks.\n-\tconfig/avalon_checks.xml: Avalon Checks.\n-\tconfig/maven_checks.xml: Maven Source Checks.\n", 3 );
98                  append( sb, "Expression: ${checkstyle.config.location}", 3 );
99                  append( sb, "", 0 );
100 
101                 append( sb, "consoleOutput (Default: false)", 2 );
102                 append( sb, "Output errors to console.", 3 );
103                 append( sb, "", 0 );
104 
105                 append( sb, "encoding (Default: ${project.build.sourceEncoding})", 2 );
106                 append( sb, "The file encoding to use when reading the source files. If the property project.build.sourceEncoding is not set, the platform default encoding is used. Note: This parameter always overrides the property charset from Checkstyle\'s TreeWalker module.", 3 );
107                 append( sb, "Expression: ${encoding}", 3 );
108                 append( sb, "", 0 );
109 
110                 append( sb, "excludes", 2 );
111                 append( sb, "Specifies the names filter of the source files to be excluded for Checkstyle.", 3 );
112                 append( sb, "Expression: ${checkstyle.excludes}", 3 );
113                 append( sb, "", 0 );
114 
115                 append( sb, "failOnViolation (Default: true)", 2 );
116                 append( sb, "Do we fail the build on a violation?", 3 );
117                 append( sb, "Expression: ${checkstyle.failOnViolation}", 3 );
118                 append( sb, "", 0 );
119 
120                 append( sb, "failsOnError (Default: false)", 2 );
121                 append( sb, "Specifies if the build should fail upon a violation.", 3 );
122                 append( sb, "", 0 );
123 
124                 append( sb, "headerLocation (Default: LICENSE.txt)", 2 );
125                 append( sb, "Specifies the location of the License file (a.k.a. the header file) that can be used by Checkstyle to verify that source code has the correct license header.\n\nYou need to use ${checkstyle.header.file} in your Checkstyle xml configuration to reference the name of this header file.\n\nFor instance:\n\n<module name=\'RegexpHeader\'> <property name=\'headerFile\' value=\'${checkstyle.header.file}\'/> </module>\n", 3 );
126                 append( sb, "Expression: ${checkstyle.header.file}", 3 );
127                 append( sb, "", 0 );
128 
129                 append( sb, "includes (Default: **/*.java)", 2 );
130                 append( sb, "Specifies the names filter of the source files to be used for Checkstyle.", 3 );
131                 append( sb, "Required: Yes", 3 );
132                 append( sb, "Expression: ${checkstyle.includes}", 3 );
133                 append( sb, "", 0 );
134 
135                 append( sb, "includeTestSourceDirectory (Default: ${false})", 2 );
136                 append( sb, "Include or not the test source directory to be used for Checkstyle.", 3 );
137                 append( sb, "", 0 );
138 
139                 append( sb, "logViolationsToConsole (Default: false)", 2 );
140                 append( sb, "Output the detected violations to the console.", 3 );
141                 append( sb, "Expression: ${checkstyle.console}", 3 );
142                 append( sb, "", 0 );
143 
144                 append( sb, "maxAllowedViolations (Default: 0)", 2 );
145                 append( sb, "The maximum number of allowed violations. The execution fails only if the number of violations is above this limit.", 3 );
146                 append( sb, "Expression: ${checkstyle.maxAllowedViolations}", 3 );
147                 append( sb, "", 0 );
148 
149                 append( sb, "outputFile (Default: ${project.build.directory}/checkstyle-result.xml)", 2 );
150                 append( sb, "Specifies the path and filename to save the Checkstyle output. The format of the output file is determined by the outputFileFormat parameter.", 3 );
151                 append( sb, "Expression: ${checkstyle.output.file}", 3 );
152                 append( sb, "", 0 );
153 
154                 append( sb, "outputFileFormat (Default: xml)", 2 );
155                 append( sb, "Specifies the format of the output to be used when writing to the output file. Valid values are \'plain\' and \'xml\'.", 3 );
156                 append( sb, "Expression: ${checkstyle.output.format}", 3 );
157                 append( sb, "", 0 );
158 
159                 append( sb, "propertiesLocation", 2 );
160                 append( sb, "Specifies the location of the properties file.\n\nThis parameter is resolved as URL, File then resource. If successfully resolved, the contents of the properties location is copied into the ${project.build.directory}/checkstyle-checker.properties file before being passed to Checkstyle for loading.\n\nThe contents of the propertiesLocation will be made available to Checkstyle for specifying values for parameters within the xml configuration (specified in the configLocation parameter).\n", 3 );
161                 append( sb, "Expression: ${checkstyle.properties.location}", 3 );
162                 append( sb, "", 0 );
163 
164                 append( sb, "propertyExpansion", 2 );
165                 append( sb, "Allows for specifying raw property expansion information.", 3 );
166                 append( sb, "", 0 );
167 
168                 append( sb, "skip (Default: false)", 2 );
169                 append( sb, "Skip entire check.", 3 );
170                 append( sb, "Expression: ${checkstyle.skip}", 3 );
171                 append( sb, "", 0 );
172 
173                 append( sb, "skipExec (Default: false)", 2 );
174                 append( sb, "Skip checktyle execution will only scan the outputFile.", 3 );
175                 append( sb, "Expression: ${checkstyle.skipExec}", 3 );
176                 append( sb, "", 0 );
177 
178                 append( sb, "sourceDirectory (Default: ${project.build.sourceDirectory})", 2 );
179                 append( sb, "Specifies the location of the source directory to be used for Checkstyle.", 3 );
180                 append( sb, "Required: Yes", 3 );
181                 append( sb, "", 0 );
182 
183                 append( sb, "suppressionsFileExpression (Default: checkstyle.suppressions.file)", 2 );
184                 append( sb, "The key to be used in the properties for the suppressions file.", 3 );
185                 append( sb, "Expression: ${checkstyle.suppression.expression}", 3 );
186                 append( sb, "", 0 );
187 
188                 append( sb, "suppressionsLocation", 2 );
189                 append( sb, "Specifies the location of the suppressions XML file to use.\n\nThis parameter is resolved as resource, URL, then file. If successfully resolved, the contents of the suppressions XML is copied into the ${project.build.directory}/checkstyle-supressions.xml file before being passed to Checkstyle for loading.\n\nSee suppressionsFileExpression for the property that will be made available to your checkstyle configuration.\n", 3 );
190                 append( sb, "Expression: ${checkstyle.suppressions.location}", 3 );
191                 append( sb, "", 0 );
192 
193                 append( sb, "testSourceDirectory (Default: ${project.build.testSourceDirectory})", 2 );
194                 append( sb, "Specifies the location of the test source directory to be used for Checkstyle.", 3 );
195                 append( sb, "", 0 );
196 
197                 append( sb, "useFile", 2 );
198                 append( sb, "If null, the Checkstyle plugin will display violations on stdout. Otherwise, a text file will be created with the violations.", 3 );
199                 append( sb, "", 0 );
200 
201                 append( sb, "violationSeverity (Default: error)", 2 );
202                 append( sb, "The lowest severity level that is considered a violation. Valid values are \'error\', \'warning\' and \'info\'.", 3 );
203                 append( sb, "Expression: ${checkstyle.violationSeverity}", 3 );
204                 append( sb, "", 0 );
205             }
206         }
207 
208         if ( goal == null || goal.length() <= 0 || "checkstyle".equals( goal ) )
209         {
210             append( sb, "checkstyle:checkstyle", 0 );
211             append( sb, "Perform a Checkstyle analysis, and generate a report on violations.", 1 );
212             append( sb, "", 0 );
213             if ( detail )
214             {
215                 append( sb, "Available parameters:", 1 );
216                 append( sb, "", 0 );
217 
218                 append( sb, "cacheFile (Default: ${project.build.directory}/checkstyle-cachefile)", 2 );
219                 append( sb, "Specifies the cache file used to speed up Checkstyle on successive runs.", 3 );
220                 append( sb, "", 0 );
221 
222                 append( sb, "configLocation (Default: config/sun_checks.xml)", 2 );
223                 append( sb, "Specifies the location of the XML configuration to use.\n\nPotential values are a filesystem path, a URL, or a classpath resource. This parameter expects that the contents of the location conform to the xml format (Checkstyle Checker module) configuration of rulesets.\n\nThis parameter is resolved as resource, URL, then file. If successfully resolved, the contents of the configuration is copied into the ${project.build.directory}/checkstyle-configuration.xml file before being passed to Checkstyle as a configuration.\n\nThere are 4 predefined rulesets.\n\n-\tconfig/sun_checks.xml: Sun Checks.\n-\tconfig/turbine_checks.xml: Turbine Checks.\n-\tconfig/avalon_checks.xml: Avalon Checks.\n-\tconfig/maven_checks.xml: Maven Source Checks.\n", 3 );
224                 append( sb, "Expression: ${checkstyle.config.location}", 3 );
225                 append( sb, "", 0 );
226 
227                 append( sb, "consoleOutput (Default: false)", 2 );
228                 append( sb, "Output errors to console.", 3 );
229                 append( sb, "", 0 );
230 
231                 append( sb, "enableFilesSummary (Default: true)", 2 );
232                 append( sb, "Specifies if the Files summary should be enabled or not.", 3 );
233                 append( sb, "Expression: ${checkstyle.enable.files.summary}", 3 );
234                 append( sb, "", 0 );
235 
236                 append( sb, "enableRSS (Default: true)", 2 );
237                 append( sb, "Specifies if the RSS should be enabled or not.", 3 );
238                 append( sb, "Expression: ${checkstyle.enable.rss}", 3 );
239                 append( sb, "", 0 );
240 
241                 append( sb, "enableRulesSummary (Default: true)", 2 );
242                 append( sb, "Specifies if the Rules summary should be enabled or not.", 3 );
243                 append( sb, "Expression: ${checkstyle.enable.rules.summary}", 3 );
244                 append( sb, "", 0 );
245 
246                 append( sb, "enableSeveritySummary (Default: true)", 2 );
247                 append( sb, "Specifies if the Severity summary should be enabled or not.", 3 );
248                 append( sb, "Expression: ${checkstyle.enable.severity.summary}", 3 );
249                 append( sb, "", 0 );
250 
251                 append( sb, "encoding (Default: ${project.build.sourceEncoding})", 2 );
252                 append( sb, "The file encoding to use when reading the source files. If the property project.build.sourceEncoding is not set, the platform default encoding is used. Note: This parameter always overrides the property charset from Checkstyle\'s TreeWalker module.", 3 );
253                 append( sb, "Expression: ${encoding}", 3 );
254                 append( sb, "", 0 );
255 
256                 append( sb, "excludes", 2 );
257                 append( sb, "Specifies the names filter of the source files to be excluded for Checkstyle.", 3 );
258                 append( sb, "Expression: ${checkstyle.excludes}", 3 );
259                 append( sb, "", 0 );
260 
261                 append( sb, "failsOnError (Default: false)", 2 );
262                 append( sb, "Specifies if the build should fail upon a violation.", 3 );
263                 append( sb, "", 0 );
264 
265                 append( sb, "format (Default: sun)", 2 );
266                 append( sb, "Deprecated. Use configLocation instead.", 3 );
267                 append( sb, "", 0 );
268                 append( sb, "Specifies what predefined check set to use. Available sets are \'sun\' (for the Sun coding conventions), \'turbine\', and \'avalon\'.", 3 );
269                 append( sb, "", 0 );
270 
271                 append( sb, "headerFile", 2 );
272                 append( sb, "Deprecated. Use headerLocation instead.", 3 );
273                 append( sb, "", 0 );
274                 append( sb, "Specifies the location of the License file (a.k.a. the header file) that is used by Checkstyle to verify that source code has the correct license header.", 3 );
275                 append( sb, "Expression: ${basedir}/LICENSE.txt", 3 );
276                 append( sb, "", 0 );
277 
278                 append( sb, "headerLocation (Default: LICENSE.txt)", 2 );
279                 append( sb, "Specifies the location of the License file (a.k.a. the header file) that can be used by Checkstyle to verify that source code has the correct license header.\n\nYou need to use ${checkstyle.header.file} in your Checkstyle xml configuration to reference the name of this header file.\n\nFor instance:\n\n<module name=\'RegexpHeader\'> <property name=\'headerFile\' value=\'${checkstyle.header.file}\'/> </module>\n", 3 );
280                 append( sb, "Expression: ${checkstyle.header.file}", 3 );
281                 append( sb, "", 0 );
282 
283                 append( sb, "includes (Default: **/*.java)", 2 );
284                 append( sb, "Specifies the names filter of the source files to be used for Checkstyle.", 3 );
285                 append( sb, "Required: Yes", 3 );
286                 append( sb, "Expression: ${checkstyle.includes}", 3 );
287                 append( sb, "", 0 );
288 
289                 append( sb, "includeTestSourceDirectory (Default: ${false})", 2 );
290                 append( sb, "Include or not the test source directory to be used for Checkstyle.", 3 );
291                 append( sb, "", 0 );
292 
293                 append( sb, "linkXRef (Default: true)", 2 );
294                 append( sb, "Link the violation line numbers to the source xref. Will link automatically if Maven JXR plugin is being used.", 3 );
295                 append( sb, "Expression: ${linkXRef}", 3 );
296                 append( sb, "", 0 );
297 
298                 append( sb, "outputDirectory (Default: ${project.reporting.outputDirectory})", 2 );
299                 append( sb, "The output directory for the report. Note that this parameter is only evaluated if the goal is run directly from the command line. If the goal is run indirectly as part of a site generation, the output directory configured in Maven Site Plugin is used instead.", 3 );
300                 append( sb, "Required: Yes", 3 );
301                 append( sb, "", 0 );
302 
303                 append( sb, "outputFile (Default: ${project.build.directory}/checkstyle-result.xml)", 2 );
304                 append( sb, "Specifies the path and filename to save the checkstyle output. The format of the output file is determined by the outputFileFormat parameter.", 3 );
305                 append( sb, "Expression: ${checkstyle.output.file}", 3 );
306                 append( sb, "", 0 );
307 
308                 append( sb, "outputFileFormat (Default: xml)", 2 );
309                 append( sb, "Specifies the format of the output to be used when writing to the output file. Valid values are \'plain\' and \'xml\'.", 3 );
310                 append( sb, "Expression: ${checkstyle.output.format}", 3 );
311                 append( sb, "", 0 );
312 
313                 append( sb, "packageNamesFile", 2 );
314                 append( sb, "Deprecated. Use packageNamesLocation instead.", 3 );
315                 append( sb, "", 0 );
316                 append( sb, "Specifies the location of the package names XML to be used to configure Checkstyle.", 3 );
317                 append( sb, "", 0 );
318 
319                 append( sb, "packageNamesLocation", 2 );
320                 append( sb, "Specifies the location of the package names XML to be used to configure the Checkstyle Packages.\n\nThis parameter is resolved as resource, URL, then file. If resolved to a resource, or a URL, the contents of the package names XML is copied into the ${project.build.directory}/checkstyle-packagenames.xml file before being passed to Checkstyle for loading.\n", 3 );
321                 append( sb, "", 0 );
322 
323                 append( sb, "propertiesFile", 2 );
324                 append( sb, "Deprecated. Use propertiesLocation instead.", 3 );
325                 append( sb, "", 0 );
326                 append( sb, "Specifies the location of the Checkstyle properties file that will be used to check the source.", 3 );
327                 append( sb, "", 0 );
328 
329                 append( sb, "propertiesLocation", 2 );
330                 append( sb, "Specifies the location of the properties file.\n\nThis parameter is resolved as URL, File then resource. If successfully resolved, the contents of the properties location is copied into the ${project.build.directory}/checkstyle-checker.properties file before being passed to Checkstyle for loading.\n\nThe contents of the propertiesLocation will be made available to Checkstyle for specifying values for parameters within the xml configuration (specified in the configLocation parameter).\n", 3 );
331                 append( sb, "Expression: ${checkstyle.properties.location}", 3 );
332                 append( sb, "", 0 );
333 
334                 append( sb, "propertiesURL", 2 );
335                 append( sb, "Deprecated. Use propertiesLocation instead.", 3 );
336                 append( sb, "", 0 );
337                 append( sb, "Specifies the URL of the Checkstyle properties that will be used to check the source.", 3 );
338                 append( sb, "", 0 );
339 
340                 append( sb, "propertyExpansion", 2 );
341                 append( sb, "Allows for specifying raw property expansion information.", 3 );
342                 append( sb, "", 0 );
343 
344                 append( sb, "skip (Default: false)", 2 );
345                 append( sb, "Skip entire check.", 3 );
346                 append( sb, "Expression: ${checkstyle.skip}", 3 );
347                 append( sb, "", 0 );
348 
349                 append( sb, "sourceDirectory (Default: ${project.build.sourceDirectory})", 2 );
350                 append( sb, "Specifies the location of the source directory to be used for Checkstyle.", 3 );
351                 append( sb, "Required: Yes", 3 );
352                 append( sb, "", 0 );
353 
354                 append( sb, "suppressionsFile", 2 );
355                 append( sb, "Deprecated. Use suppressionsLocation instead.", 3 );
356                 append( sb, "", 0 );
357                 append( sb, "Specifies the location of the suppressions XML file to use. The plugin defines a Checkstyle property named checkstyle.suppressions.file with the value of this property. This allows using the Checkstyle property in your own custom checkstyle configuration file when specifying a suppressions file.", 3 );
358                 append( sb, "", 0 );
359 
360                 append( sb, "suppressionsFileExpression (Default: checkstyle.suppressions.file)", 2 );
361                 append( sb, "The key to be used in the properties for the suppressions file.", 3 );
362                 append( sb, "Expression: ${checkstyle.suppression.expression}", 3 );
363                 append( sb, "", 0 );
364 
365                 append( sb, "suppressionsLocation", 2 );
366                 append( sb, "Specifies the location of the suppressions XML file to use.\n\nThis parameter is resolved as resource, URL, then file. If successfully resolved, the contents of the suppressions XML is copied into the ${project.build.directory}/checkstyle-supressions.xml file before being passed to Checkstyle for loading.\n\nSee suppressionsFileExpression for the property that will be made available to your checkstyle configuration.\n", 3 );
367                 append( sb, "Expression: ${checkstyle.suppressions.location}", 3 );
368                 append( sb, "", 0 );
369 
370                 append( sb, "testSourceDirectory (Default: ${project.build.testSourceDirectory})", 2 );
371                 append( sb, "Specifies the location of the test source directory to be used for Checkstyle.", 3 );
372                 append( sb, "", 0 );
373 
374                 append( sb, "useFile", 2 );
375                 append( sb, "If null, the Checkstyle plugin will display violations on stdout. Otherwise, a text file will be created with the violations.", 3 );
376                 append( sb, "", 0 );
377 
378                 append( sb, "xrefLocation (Default: ${project.reporting.outputDirectory}/xref)", 2 );
379                 append( sb, "Location of the Xrefs to link to.", 3 );
380                 append( sb, "", 0 );
381             }
382         }
383 
384         if ( goal == null || goal.length() <= 0 || "checkstyle-aggregate".equals( goal ) )
385         {
386             append( sb, "checkstyle:checkstyle-aggregate", 0 );
387             append( sb, "Perform a Checkstyle analysis, and generate a report on violations, aggregating the result in the project which started this mojo.", 1 );
388             append( sb, "", 0 );
389             if ( detail )
390             {
391                 append( sb, "Available parameters:", 1 );
392                 append( sb, "", 0 );
393 
394                 append( sb, "cacheFile (Default: ${project.build.directory}/checkstyle-cachefile)", 2 );
395                 append( sb, "Specifies the cache file used to speed up Checkstyle on successive runs.", 3 );
396                 append( sb, "", 0 );
397 
398                 append( sb, "configLocation (Default: config/sun_checks.xml)", 2 );
399                 append( sb, "Specifies the location of the XML configuration to use.\n\nPotential values are a filesystem path, a URL, or a classpath resource. This parameter expects that the contents of the location conform to the xml format (Checkstyle Checker module) configuration of rulesets.\n\nThis parameter is resolved as resource, URL, then file. If successfully resolved, the contents of the configuration is copied into the ${project.build.directory}/checkstyle-configuration.xml file before being passed to Checkstyle as a configuration.\n\nThere are 4 predefined rulesets.\n\n-\tconfig/sun_checks.xml: Sun Checks.\n-\tconfig/turbine_checks.xml: Turbine Checks.\n-\tconfig/avalon_checks.xml: Avalon Checks.\n-\tconfig/maven_checks.xml: Maven Source Checks.\n", 3 );
400                 append( sb, "Expression: ${checkstyle.config.location}", 3 );
401                 append( sb, "", 0 );
402 
403                 append( sb, "consoleOutput (Default: false)", 2 );
404                 append( sb, "Output errors to console.", 3 );
405                 append( sb, "", 0 );
406 
407                 append( sb, "enableFilesSummary (Default: true)", 2 );
408                 append( sb, "Specifies if the Files summary should be enabled or not.", 3 );
409                 append( sb, "Expression: ${checkstyle.enable.files.summary}", 3 );
410                 append( sb, "", 0 );
411 
412                 append( sb, "enableRSS (Default: true)", 2 );
413                 append( sb, "Specifies if the RSS should be enabled or not.", 3 );
414                 append( sb, "Expression: ${checkstyle.enable.rss}", 3 );
415                 append( sb, "", 0 );
416 
417                 append( sb, "enableRulesSummary (Default: true)", 2 );
418                 append( sb, "Specifies if the Rules summary should be enabled or not.", 3 );
419                 append( sb, "Expression: ${checkstyle.enable.rules.summary}", 3 );
420                 append( sb, "", 0 );
421 
422                 append( sb, "enableSeveritySummary (Default: true)", 2 );
423                 append( sb, "Specifies if the Severity summary should be enabled or not.", 3 );
424                 append( sb, "Expression: ${checkstyle.enable.severity.summary}", 3 );
425                 append( sb, "", 0 );
426 
427                 append( sb, "encoding (Default: ${project.build.sourceEncoding})", 2 );
428                 append( sb, "The file encoding to use when reading the source files. If the property project.build.sourceEncoding is not set, the platform default encoding is used. Note: This parameter always overrides the property charset from Checkstyle\'s TreeWalker module.", 3 );
429                 append( sb, "Expression: ${encoding}", 3 );
430                 append( sb, "", 0 );
431 
432                 append( sb, "excludes", 2 );
433                 append( sb, "Specifies the names filter of the source files to be excluded for Checkstyle.", 3 );
434                 append( sb, "Expression: ${checkstyle.excludes}", 3 );
435                 append( sb, "", 0 );
436 
437                 append( sb, "failsOnError (Default: false)", 2 );
438                 append( sb, "Specifies if the build should fail upon a violation.", 3 );
439                 append( sb, "", 0 );
440 
441                 append( sb, "headerLocation (Default: LICENSE.txt)", 2 );
442                 append( sb, "Specifies the location of the License file (a.k.a. the header file) that can be used by Checkstyle to verify that source code has the correct license header.\n\nYou need to use ${checkstyle.header.file} in your Checkstyle xml configuration to reference the name of this header file.\n\nFor instance:\n\n<module name=\'RegexpHeader\'> <property name=\'headerFile\' value=\'${checkstyle.header.file}\'/> </module>\n", 3 );
443                 append( sb, "Expression: ${checkstyle.header.file}", 3 );
444                 append( sb, "", 0 );
445 
446                 append( sb, "includes (Default: **/*.java)", 2 );
447                 append( sb, "Specifies the names filter of the source files to be used for Checkstyle.", 3 );
448                 append( sb, "Required: Yes", 3 );
449                 append( sb, "Expression: ${checkstyle.includes}", 3 );
450                 append( sb, "", 0 );
451 
452                 append( sb, "includeTestSourceDirectory (Default: ${false})", 2 );
453                 append( sb, "Include or not the test source directory to be used for Checkstyle.", 3 );
454                 append( sb, "", 0 );
455 
456                 append( sb, "linkXRef (Default: true)", 2 );
457                 append( sb, "Link the violation line numbers to the source xref. Will link automatically if Maven JXR plugin is being used.", 3 );
458                 append( sb, "Expression: ${linkXRef}", 3 );
459                 append( sb, "", 0 );
460 
461                 append( sb, "outputDirectory (Default: ${project.reporting.outputDirectory})", 2 );
462                 append( sb, "The output directory for the report. Note that this parameter is only evaluated if the goal is run directly from the command line. If the goal is run indirectly as part of a site generation, the output directory configured in Maven Site Plugin is used instead.", 3 );
463                 append( sb, "Required: Yes", 3 );
464                 append( sb, "", 0 );
465 
466                 append( sb, "outputFile (Default: ${project.build.directory}/checkstyle-result.xml)", 2 );
467                 append( sb, "Specifies the path and filename to save the checkstyle output. The format of the output file is determined by the outputFileFormat parameter.", 3 );
468                 append( sb, "Expression: ${checkstyle.output.file}", 3 );
469                 append( sb, "", 0 );
470 
471                 append( sb, "outputFileFormat (Default: xml)", 2 );
472                 append( sb, "Specifies the format of the output to be used when writing to the output file. Valid values are \'plain\' and \'xml\'.", 3 );
473                 append( sb, "Expression: ${checkstyle.output.format}", 3 );
474                 append( sb, "", 0 );
475 
476                 append( sb, "propertiesLocation", 2 );
477                 append( sb, "Specifies the location of the properties file.\n\nThis parameter is resolved as URL, File then resource. If successfully resolved, the contents of the properties location is copied into the ${project.build.directory}/checkstyle-checker.properties file before being passed to Checkstyle for loading.\n\nThe contents of the propertiesLocation will be made available to Checkstyle for specifying values for parameters within the xml configuration (specified in the configLocation parameter).\n", 3 );
478                 append( sb, "Expression: ${checkstyle.properties.location}", 3 );
479                 append( sb, "", 0 );
480 
481                 append( sb, "propertyExpansion", 2 );
482                 append( sb, "Allows for specifying raw property expansion information.", 3 );
483                 append( sb, "", 0 );
484 
485                 append( sb, "skip (Default: false)", 2 );
486                 append( sb, "Skip entire check.", 3 );
487                 append( sb, "Expression: ${checkstyle.skip}", 3 );
488                 append( sb, "", 0 );
489 
490                 append( sb, "sourceDirectory (Default: ${project.build.sourceDirectory})", 2 );
491                 append( sb, "Specifies the location of the source directory to be used for Checkstyle.", 3 );
492                 append( sb, "Required: Yes", 3 );
493                 append( sb, "", 0 );
494 
495                 append( sb, "suppressionsFileExpression (Default: checkstyle.suppressions.file)", 2 );
496                 append( sb, "The key to be used in the properties for the suppressions file.", 3 );
497                 append( sb, "Expression: ${checkstyle.suppression.expression}", 3 );
498                 append( sb, "", 0 );
499 
500                 append( sb, "suppressionsLocation", 2 );
501                 append( sb, "Specifies the location of the suppressions XML file to use.\n\nThis parameter is resolved as resource, URL, then file. If successfully resolved, the contents of the suppressions XML is copied into the ${project.build.directory}/checkstyle-supressions.xml file before being passed to Checkstyle for loading.\n\nSee suppressionsFileExpression for the property that will be made available to your checkstyle configuration.\n", 3 );
502                 append( sb, "Expression: ${checkstyle.suppressions.location}", 3 );
503                 append( sb, "", 0 );
504 
505                 append( sb, "testSourceDirectory (Default: ${project.build.testSourceDirectory})", 2 );
506                 append( sb, "Specifies the location of the test source directory to be used for Checkstyle.", 3 );
507                 append( sb, "", 0 );
508 
509                 append( sb, "useFile", 2 );
510                 append( sb, "If null, the Checkstyle plugin will display violations on stdout. Otherwise, a text file will be created with the violations.", 3 );
511                 append( sb, "", 0 );
512 
513                 append( sb, "xrefLocation (Default: ${project.reporting.outputDirectory}/xref)", 2 );
514                 append( sb, "Location of the Xrefs to link to.", 3 );
515                 append( sb, "", 0 );
516             }
517         }
518 
519         if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
520         {
521             append( sb, "checkstyle:help", 0 );
522             append( sb, "Display help information on maven-checkstyle-plugin.\nCall\n\u00a0\u00a0mvn\u00a0checkstyle:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
523             append( sb, "", 0 );
524             if ( detail )
525             {
526                 append( sb, "Available parameters:", 1 );
527                 append( sb, "", 0 );
528 
529                 append( sb, "detail (Default: false)", 2 );
530                 append( sb, "If true, display all settable properties for each goal.", 3 );
531                 append( sb, "Expression: ${detail}", 3 );
532                 append( sb, "", 0 );
533 
534                 append( sb, "goal", 2 );
535                 append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
536                 append( sb, "Expression: ${goal}", 3 );
537                 append( sb, "", 0 );
538 
539                 append( sb, "indentSize (Default: 2)", 2 );
540                 append( sb, "The number of spaces per indentation level, should be positive.", 3 );
541                 append( sb, "Expression: ${indentSize}", 3 );
542                 append( sb, "", 0 );
543 
544                 append( sb, "lineLength (Default: 80)", 2 );
545                 append( sb, "The maximum length of a display line, should be positive.", 3 );
546                 append( sb, "Expression: ${lineLength}", 3 );
547                 append( sb, "", 0 );
548             }
549         }
550 
551         if ( getLog().isInfoEnabled() )
552         {
553             getLog().info( sb.toString() );
554         }
555     }
556 
557     /**
558      * <p>Repeat a String <code>n</code> times to form a new string.</p>
559      *
560      * @param str String to repeat
561      * @param repeat number of times to repeat str
562      * @return String with repeated String
563      * @throws NegativeArraySizeException if <code>repeat < 0</code>
564      * @throws NullPointerException if str is <code>null</code>
565      */
566     private static String repeat( String str, int repeat )
567     {
568         StringBuffer buffer = new StringBuffer( repeat * str.length() );
569 
570         for ( int i = 0; i < repeat; i++ )
571         {
572             buffer.append( str );
573         }
574 
575         return buffer.toString();
576     }
577 
578     /** 
579      * Append a description to the buffer by respecting the indentSize and lineLength parameters.
580      * <b>Note</b>: The last character is always a new line.
581      * 
582      * @param sb The buffer to append the description, not <code>null</code>.
583      * @param description The description, not <code>null</code>.
584      * @param indent The base indentation level of each line, must not be negative.
585      */
586     private void append( StringBuffer sb, String description, int indent )
587     {
588         for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
589         {
590             sb.append( it.next().toString() ).append( '\n' );
591         }
592     }
593 
594     /** 
595      * Splits the specified text into lines of convenient display length.
596      * 
597      * @param text The text to split into lines, must not be <code>null</code>.
598      * @param indent The base indentation level of each line, must not be negative.
599      * @param indentSize The size of each indentation, must not be negative.
600      * @param lineLength The length of the line, must not be negative.
601      * @return The sequence of display lines, never <code>null</code>.
602      * @throws NegativeArraySizeException if <code>indent < 0</code>
603      */
604     private static List toLines( String text, int indent, int indentSize, int lineLength )
605     {
606         List<String> lines = new ArrayList<String>();
607 
608         String ind = repeat( "\t", indent );
609         String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
610         for ( int i = 0; i < plainLines.length; i++ )
611         {
612             toLines( lines, ind + plainLines[i], indentSize, lineLength );
613         }
614 
615         return lines;
616     }
617 
618     /** 
619      * Adds the specified line to the output sequence, performing line wrapping if necessary.
620      * 
621      * @param lines The sequence of display lines, must not be <code>null</code>.
622      * @param line The line to add, must not be <code>null</code>.
623      * @param indentSize The size of each indentation, must not be negative.
624      * @param lineLength The length of the line, must not be negative.
625      */
626     private static void toLines( List<String> lines, String line, int indentSize, int lineLength )
627     {
628         int lineIndent = getIndentLevel( line );
629         StringBuffer buf = new StringBuffer( 256 );
630         String[] tokens = line.split( " +" );
631         for ( int i = 0; i < tokens.length; i++ )
632         {
633             String token = tokens[i];
634             if ( i > 0 )
635             {
636                 if ( buf.length() + token.length() >= lineLength )
637                 {
638                     lines.add( buf.toString() );
639                     buf.setLength( 0 );
640                     buf.append( repeat( " ", lineIndent * indentSize ) );
641                 }
642                 else
643                 {
644                     buf.append( ' ' );
645                 }
646             }
647             for ( int j = 0; j < token.length(); j++ )
648             {
649                 char c = token.charAt( j );
650                 if ( c == '\t' )
651                 {
652                     buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
653                 }
654                 else if ( c == '\u00A0' )
655                 {
656                     buf.append( ' ' );
657                 }
658                 else
659                 {
660                     buf.append( c );
661                 }
662             }
663         }
664         lines.add( buf.toString() );
665     }
666 
667     /** 
668      * Gets the indentation level of the specified line.
669      * 
670      * @param line The line whose indentation level should be retrieved, must not be <code>null</code>.
671      * @return The indentation level of the line.
672      */
673     private static int getIndentLevel( String line )
674     {
675         int level = 0;
676         for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
677         {
678             level++;
679         }
680         for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
681         {
682             if ( line.charAt( i ) == '\t' )
683             {
684                 level++;
685                 break;
686             }
687         }
688         return level;
689     }
690 }