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
12
13
14
15
16
17
18
19 @SuppressWarnings( "all" )
20 public class HelpMojo
21 extends AbstractMojo
22 {
23
24
25
26
27
28 private boolean detail;
29
30
31
32
33
34
35 private java.lang.String goal;
36
37
38
39
40
41
42 private int lineLength;
43
44
45
46
47
48
49 private int indentSize;
50
51
52
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
168
169
170
171
172
173
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
189
190
191
192
193
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
205
206
207
208
209
210
211
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
229
230
231
232
233
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
278
279
280
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 }