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 | 0 | public class HelpMojo |
19 | |
extends AbstractMojo |
20 | |
{ |
21 | |
|
22 | |
|
23 | |
|
24 | |
|
25 | |
|
26 | |
private boolean detail; |
27 | |
|
28 | |
|
29 | |
|
30 | |
|
31 | |
|
32 | |
|
33 | |
private java.lang.String goal; |
34 | |
|
35 | |
|
36 | |
|
37 | |
|
38 | |
|
39 | |
|
40 | |
private int lineLength; |
41 | |
|
42 | |
|
43 | |
|
44 | |
|
45 | |
|
46 | |
|
47 | |
private int indentSize; |
48 | |
|
49 | |
|
50 | |
|
51 | |
public void execute() |
52 | |
throws MojoExecutionException |
53 | |
{ |
54 | 0 | if ( lineLength <= 0 ) |
55 | |
{ |
56 | 0 | getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." ); |
57 | 0 | lineLength = 80; |
58 | |
} |
59 | 0 | if ( indentSize <= 0 ) |
60 | |
{ |
61 | 0 | getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." ); |
62 | 0 | indentSize = 2; |
63 | |
} |
64 | |
|
65 | 0 | StringBuffer sb = new StringBuffer(); |
66 | |
|
67 | 0 | append( sb, "org.apache.maven.plugins:maven-clean-plugin:2.4", 0 ); |
68 | 0 | append( sb, "", 0 ); |
69 | |
|
70 | 0 | append( sb, "Maven Clean Plugin", 0 ); |
71 | 0 | append( sb, "The Maven Clean Plugin is a plugin that removes files generated at build-time in a project\'s directory.", 1 ); |
72 | 0 | append( sb, "", 0 ); |
73 | |
|
74 | 0 | if ( goal == null || goal.length() <= 0 ) |
75 | |
{ |
76 | 0 | append( sb, "This plugin has 2 goals:", 0 ); |
77 | 0 | append( sb, "", 0 ); |
78 | |
} |
79 | |
|
80 | 0 | if ( goal == null || goal.length() <= 0 || "clean".equals( goal ) ) |
81 | |
{ |
82 | 0 | append( sb, "clean:clean", 0 ); |
83 | 0 | 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 ); |
84 | 0 | append( sb, "", 0 ); |
85 | 0 | if ( detail ) |
86 | |
{ |
87 | 0 | append( sb, "Available parameters:", 1 ); |
88 | 0 | append( sb, "", 0 ); |
89 | |
|
90 | 0 | append( sb, "excludeDefaultDirectories (Default: false)", 2 ); |
91 | 0 | 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 ); |
92 | 0 | append( sb, "", 0 ); |
93 | |
|
94 | 0 | append( sb, "failOnError (Default: true)", 2 ); |
95 | 0 | append( sb, "Indicates whether the build will continue even if there are clean errors.", 3 ); |
96 | 0 | append( sb, "", 0 ); |
97 | |
|
98 | 0 | append( sb, "filesets", 2 ); |
99 | 0 | append( sb, "The list of file sets to delete, in addition to the default directories.", 3 ); |
100 | 0 | append( sb, "", 0 ); |
101 | |
|
102 | 0 | append( sb, "followSymLinks (Default: false)", 2 ); |
103 | 0 | 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 ); |
104 | 0 | append( sb, "", 0 ); |
105 | |
|
106 | 0 | append( sb, "skip (Default: false)", 2 ); |
107 | 0 | append( sb, "Disables the plugin execution.", 3 ); |
108 | 0 | append( sb, "", 0 ); |
109 | |
|
110 | 0 | append( sb, "verbose", 2 ); |
111 | 0 | 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 ); |
112 | 0 | append( sb, "", 0 ); |
113 | |
} |
114 | |
} |
115 | |
|
116 | 0 | if ( goal == null || goal.length() <= 0 || "help".equals( goal ) ) |
117 | |
{ |
118 | 0 | append( sb, "clean:help", 0 ); |
119 | 0 | 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 ); |
120 | 0 | append( sb, "", 0 ); |
121 | 0 | if ( detail ) |
122 | |
{ |
123 | 0 | append( sb, "Available parameters:", 1 ); |
124 | 0 | append( sb, "", 0 ); |
125 | |
|
126 | 0 | append( sb, "detail (Default: false)", 2 ); |
127 | 0 | append( sb, "If true, display all settable properties for each goal.", 3 ); |
128 | 0 | append( sb, "", 0 ); |
129 | |
|
130 | 0 | append( sb, "goal", 2 ); |
131 | 0 | append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 ); |
132 | 0 | append( sb, "", 0 ); |
133 | |
|
134 | 0 | append( sb, "indentSize (Default: 2)", 2 ); |
135 | 0 | append( sb, "The number of spaces per indentation level, should be positive.", 3 ); |
136 | 0 | append( sb, "", 0 ); |
137 | |
|
138 | 0 | append( sb, "lineLength (Default: 80)", 2 ); |
139 | 0 | append( sb, "The maximum length of a display line, should be positive.", 3 ); |
140 | 0 | append( sb, "", 0 ); |
141 | |
} |
142 | |
} |
143 | |
|
144 | 0 | if ( getLog().isInfoEnabled() ) |
145 | |
{ |
146 | 0 | getLog().info( sb.toString() ); |
147 | |
} |
148 | 0 | } |
149 | |
|
150 | |
|
151 | |
|
152 | |
|
153 | |
|
154 | |
|
155 | |
|
156 | |
|
157 | |
|
158 | |
|
159 | |
private static String repeat( String str, int repeat ) |
160 | |
{ |
161 | 0 | StringBuffer buffer = new StringBuffer( repeat * str.length() ); |
162 | |
|
163 | 0 | for ( int i = 0; i < repeat; i++ ) |
164 | |
{ |
165 | 0 | buffer.append( str ); |
166 | |
} |
167 | |
|
168 | 0 | return buffer.toString(); |
169 | |
} |
170 | |
|
171 | |
|
172 | |
|
173 | |
|
174 | |
|
175 | |
|
176 | |
|
177 | |
|
178 | |
|
179 | |
private void append( StringBuffer sb, String description, int indent ) |
180 | |
{ |
181 | 0 | for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); ) |
182 | |
{ |
183 | 0 | sb.append( it.next().toString() ).append( '\n' ); |
184 | |
} |
185 | 0 | } |
186 | |
|
187 | |
|
188 | |
|
189 | |
|
190 | |
|
191 | |
|
192 | |
|
193 | |
|
194 | |
|
195 | |
|
196 | |
|
197 | |
private static List toLines( String text, int indent, int indentSize, int lineLength ) |
198 | |
{ |
199 | 0 | List lines = new ArrayList(); |
200 | |
|
201 | 0 | String ind = repeat( "\t", indent ); |
202 | 0 | String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" ); |
203 | 0 | for ( int i = 0; i < plainLines.length; i++ ) |
204 | |
{ |
205 | 0 | toLines( lines, ind + plainLines[i], indentSize, lineLength ); |
206 | |
} |
207 | |
|
208 | 0 | return lines; |
209 | |
} |
210 | |
|
211 | |
|
212 | |
|
213 | |
|
214 | |
|
215 | |
|
216 | |
|
217 | |
|
218 | |
|
219 | |
private static void toLines( List lines, String line, int indentSize, int lineLength ) |
220 | |
{ |
221 | 0 | int lineIndent = getIndentLevel( line ); |
222 | 0 | StringBuffer buf = new StringBuffer( 256 ); |
223 | 0 | String[] tokens = line.split( " +" ); |
224 | 0 | for ( int i = 0; i < tokens.length; i++ ) |
225 | |
{ |
226 | 0 | String token = tokens[i]; |
227 | 0 | if ( i > 0 ) |
228 | |
{ |
229 | 0 | if ( buf.length() + token.length() >= lineLength ) |
230 | |
{ |
231 | 0 | lines.add( buf.toString() ); |
232 | 0 | buf.setLength( 0 ); |
233 | 0 | buf.append( repeat( " ", lineIndent * indentSize ) ); |
234 | |
} |
235 | |
else |
236 | |
{ |
237 | 0 | buf.append( ' ' ); |
238 | |
} |
239 | |
} |
240 | 0 | for ( int j = 0; j < token.length(); j++ ) |
241 | |
{ |
242 | 0 | char c = token.charAt( j ); |
243 | 0 | if ( c == '\t' ) |
244 | |
{ |
245 | 0 | buf.append( repeat( " ", indentSize - buf.length() % indentSize ) ); |
246 | |
} |
247 | 0 | else if ( c == '\u00A0' ) |
248 | |
{ |
249 | 0 | buf.append( ' ' ); |
250 | |
} |
251 | |
else |
252 | |
{ |
253 | 0 | buf.append( c ); |
254 | |
} |
255 | |
} |
256 | |
} |
257 | 0 | lines.add( buf.toString() ); |
258 | 0 | } |
259 | |
|
260 | |
|
261 | |
|
262 | |
|
263 | |
|
264 | |
|
265 | |
|
266 | |
private static int getIndentLevel( String line ) |
267 | |
{ |
268 | 0 | int level = 0; |
269 | 0 | for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ ) |
270 | |
{ |
271 | 0 | level++; |
272 | |
} |
273 | 0 | for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ ) |
274 | |
{ |
275 | 0 | if ( line.charAt( i ) == '\t' ) |
276 | |
{ |
277 | 0 | level++; |
278 | 0 | break; |
279 | |
} |
280 | |
} |
281 | 0 | return level; |
282 | |
} |
283 | |
} |