View Javadoc

1   package org.apache.maven.plugin.clean;
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-clean-plugin.<br/> Call <pre>  mvn clean:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</pre> to display parameter details.
12   *
13   * @version generated on Sat May 26 18:48:42 CEST 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-clean-plugin:2.5", 0 );
70          append( sb, "", 0 );
71  
72          append( sb, "Maven Clean Plugin", 0 );
73          append( sb, "The Maven Clean Plugin is a plugin that removes files generated at build-time in a project\'s directory.", 1 );
74          append( sb, "", 0 );
75  
76          if ( goal == null || goal.length() <= 0 )
77          {
78              append( sb, "This plugin has 2 goals:", 0 );
79              append( sb, "", 0 );
80          }
81  
82          if ( goal == null || goal.length() <= 0 || "clean".equals( goal ) )
83          {
84              append( sb, "clean:clean", 0 );
85              append( sb, "Goal which cleans the build.\nThis attempts to clean a project\'s working directory of the files that were generated at build-time. By default, it discovers and deletes the directories configured in project.build.directory, project.build.outputDirectory, project.build.testOutputDirectory, and project.reporting.outputDirectory.\n\nFiles outside the default may also be included in the deletion by configuring the filesets tag.\n", 1 );
86              append( sb, "", 0 );
87              if ( detail )
88              {
89                  append( sb, "Available parameters:", 1 );
90                  append( sb, "", 0 );
91  
92                  append( sb, "excludeDefaultDirectories (Default: false)", 2 );
93                  append( sb, "Disables the deletion of the default output directories configured for a project. If set to true, only the files/directories selected via the parameter filesets will be deleted.", 3 );
94                  append( sb, "Expression: ${clean.excludeDefaultDirectories}", 3 );
95                  append( sb, "", 0 );
96  
97                  append( sb, "failOnError (Default: true)", 2 );
98                  append( sb, "Indicates whether the build will continue even if there are clean errors.", 3 );
99                  append( sb, "Expression: ${maven.clean.failOnError}", 3 );
100                 append( sb, "", 0 );
101 
102                 append( sb, "filesets", 2 );
103                 append( sb, "The list of file sets to delete, in addition to the default directories. For example:\n<filesets>\n\u00a0\u00a0<fileset>\n\u00a0\u00a0\u00a0\u00a0<directory>src/main/generated</directory>\n\u00a0\u00a0\u00a0\u00a0<followSymlinks>false</followSymlinks>\n\u00a0\u00a0\u00a0\u00a0<useDefaultExcludes>true</useDefaultExcludes>\n\u00a0\u00a0\u00a0\u00a0<includes>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<include>*.java</include>\n\u00a0\u00a0\u00a0\u00a0</includes>\n\u00a0\u00a0\u00a0\u00a0<excludes>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<exclude>Template*</exclude>\n\u00a0\u00a0\u00a0\u00a0</excludes>\n\u00a0\u00a0</fileset>\n</filesets>\n", 3 );
104                 append( sb, "", 0 );
105 
106                 append( sb, "followSymLinks (Default: false)", 2 );
107                 append( sb, "Sets whether the plugin should follow symbolic links while deleting files from the default output directories of the project. Not following symlinks requires more IO operations and heap memory, regardless whether symlinks are actually present. So projects with a huge output directory that knowingly does not contain symlinks can improve performance by setting this parameter to true.", 3 );
108                 append( sb, "Expression: ${clean.followSymLinks}", 3 );
109                 append( sb, "", 0 );
110 
111                 append( sb, "retryOnError (Default: true)", 2 );
112                 append( sb, "Indicates whether the plugin should undertake additional attempts (after a short delay) to delete a file if the first attempt failed. This is meant to help deleting files that are temporarily locked by third-party tools like virus scanners or search indexing.", 3 );
113                 append( sb, "Expression: ${maven.clean.retryOnError}", 3 );
114                 append( sb, "", 0 );
115 
116                 append( sb, "skip (Default: false)", 2 );
117                 append( sb, "Disables the plugin execution.", 3 );
118                 append( sb, "Expression: ${clean.skip}", 3 );
119                 append( sb, "", 0 );
120 
121                 append( sb, "verbose", 2 );
122                 append( sb, "Sets whether the plugin runs in verbose mode. As of plugin version 2.3, the default value is derived from Maven\'s global debug flag (compare command line switch -X).", 3 );
123                 append( sb, "Expression: ${clean.verbose}", 3 );
124                 append( sb, "", 0 );
125             }
126         }
127 
128         if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
129         {
130             append( sb, "clean:help", 0 );
131             append( sb, "Display help information on maven-clean-plugin.\nCall\n\u00a0\u00a0mvn\u00a0clean:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
132             append( sb, "", 0 );
133             if ( detail )
134             {
135                 append( sb, "Available parameters:", 1 );
136                 append( sb, "", 0 );
137 
138                 append( sb, "detail (Default: false)", 2 );
139                 append( sb, "If true, display all settable properties for each goal.", 3 );
140                 append( sb, "Expression: ${detail}", 3 );
141                 append( sb, "", 0 );
142 
143                 append( sb, "goal", 2 );
144                 append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
145                 append( sb, "Expression: ${goal}", 3 );
146                 append( sb, "", 0 );
147 
148                 append( sb, "indentSize (Default: 2)", 2 );
149                 append( sb, "The number of spaces per indentation level, should be positive.", 3 );
150                 append( sb, "Expression: ${indentSize}", 3 );
151                 append( sb, "", 0 );
152 
153                 append( sb, "lineLength (Default: 80)", 2 );
154                 append( sb, "The maximum length of a display line, should be positive.", 3 );
155                 append( sb, "Expression: ${lineLength}", 3 );
156                 append( sb, "", 0 );
157             }
158         }
159 
160         if ( getLog().isInfoEnabled() )
161         {
162             getLog().info( sb.toString() );
163         }
164     }
165 
166     /**
167      * <p>Repeat a String <code>n</code> times to form a new string.</p>
168      *
169      * @param str String to repeat
170      * @param repeat number of times to repeat str
171      * @return String with repeated String
172      * @throws NegativeArraySizeException if <code>repeat < 0</code>
173      * @throws NullPointerException if str is <code>null</code>
174      */
175     private static String repeat( String str, int repeat )
176     {
177         StringBuffer buffer = new StringBuffer( repeat * str.length() );
178 
179         for ( int i = 0; i < repeat; i++ )
180         {
181             buffer.append( str );
182         }
183 
184         return buffer.toString();
185     }
186 
187     /** 
188      * Append a description to the buffer by respecting the indentSize and lineLength parameters.
189      * <b>Note</b>: The last character is always a new line.
190      * 
191      * @param sb The buffer to append the description, not <code>null</code>.
192      * @param description The description, not <code>null</code>.
193      * @param indent The base indentation level of each line, must not be negative.
194      */
195     private void append( StringBuffer sb, String description, int indent )
196     {
197         for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
198         {
199             sb.append( it.next().toString() ).append( '\n' );
200         }
201     }
202 
203     /** 
204      * Splits the specified text into lines of convenient display length.
205      * 
206      * @param text The text to split into lines, must not be <code>null</code>.
207      * @param indent The base indentation level of each line, must not be negative.
208      * @param indentSize The size of each indentation, must not be negative.
209      * @param lineLength The length of the line, must not be negative.
210      * @return The sequence of display lines, never <code>null</code>.
211      * @throws NegativeArraySizeException if <code>indent < 0</code>
212      */
213     private static List toLines( String text, int indent, int indentSize, int lineLength )
214     {
215         List<String> lines = new ArrayList<String>();
216 
217         String ind = repeat( "\t", indent );
218         String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
219         for ( int i = 0; i < plainLines.length; i++ )
220         {
221             toLines( lines, ind + plainLines[i], indentSize, lineLength );
222         }
223 
224         return lines;
225     }
226 
227     /** 
228      * Adds the specified line to the output sequence, performing line wrapping if necessary.
229      * 
230      * @param lines The sequence of display lines, must not be <code>null</code>.
231      * @param line The line to add, must not be <code>null</code>.
232      * @param indentSize The size of each indentation, must not be negative.
233      * @param lineLength The length of the line, must not be negative.
234      */
235     private static void toLines( List<String> lines, String line, int indentSize, int lineLength )
236     {
237         int lineIndent = getIndentLevel( line );
238         StringBuffer buf = new StringBuffer( 256 );
239         String[] tokens = line.split( " +" );
240         for ( int i = 0; i < tokens.length; i++ )
241         {
242             String token = tokens[i];
243             if ( i > 0 )
244             {
245                 if ( buf.length() + token.length() >= lineLength )
246                 {
247                     lines.add( buf.toString() );
248                     buf.setLength( 0 );
249                     buf.append( repeat( " ", lineIndent * indentSize ) );
250                 }
251                 else
252                 {
253                     buf.append( ' ' );
254                 }
255             }
256             for ( int j = 0; j < token.length(); j++ )
257             {
258                 char c = token.charAt( j );
259                 if ( c == '\t' )
260                 {
261                     buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
262                 }
263                 else if ( c == '\u00A0' )
264                 {
265                     buf.append( ' ' );
266                 }
267                 else
268                 {
269                     buf.append( c );
270                 }
271             }
272         }
273         lines.add( buf.toString() );
274     }
275 
276     /** 
277      * Gets the indentation level of the specified line.
278      * 
279      * @param line The line whose indentation level should be retrieved, must not be <code>null</code>.
280      * @return The indentation level of the line.
281      */
282     private static int getIndentLevel( String line )
283     {
284         int level = 0;
285         for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
286         {
287             level++;
288         }
289         for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
290         {
291             if ( line.charAt( i ) == '\t' )
292             {
293                 level++;
294                 break;
295             }
296         }
297         return level;
298     }
299 }