1 package org.andromda.maven.plugin.translationlibrary;
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 public class HelpMojo
20 extends AbstractMojo
21 {
22
23
24
25
26
27 private boolean detail;
28
29
30
31
32
33
34 private java.lang.String goal;
35
36
37
38
39
40
41 private int lineLength;
42
43
44
45
46
47
48 private int indentSize;
49
50
51
52 public void execute()
53 throws MojoExecutionException
54 {
55 if ( lineLength <= 0 )
56 {
57 getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." );
58 lineLength = 80;
59 }
60 if ( indentSize <= 0 )
61 {
62 getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." );
63 indentSize = 2;
64 }
65
66 StringBuffer sb = new StringBuffer();
67
68 append( sb, "org.andromda.maven.plugins:andromda-translation-library-plugin:3.5-SNAPSHOT", 0 );
69 append( sb, "", 0 );
70
71 append( sb, "AndroMDA Translation Library Maven Plugin", 0 );
72 append( sb, "A Maven plugin for performing AndroMDA translation-library related tasks (such as running translation-library tests).", 1 );
73 append( sb, "", 0 );
74
75 if ( goal == null || goal.length() <= 0 )
76 {
77 append( sb, "This plugin has 2 goals:", 0 );
78 append( sb, "", 0 );
79 }
80
81 if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
82 {
83 append( sb, "andromda-translation-library:help", 0 );
84 append( sb, "Display help information on andromda-translation-library-plugin.\nCall\n\u00a0\u00a0mvn\u00a0andromda-translation-library:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
85 append( sb, "", 0 );
86 if ( detail )
87 {
88 append( sb, "Available parameters:", 1 );
89 append( sb, "", 0 );
90
91 append( sb, "detail (Default: false)", 2 );
92 append( sb, "If true, display all settable properties for each goal.", 3 );
93 append( sb, "Expression: ${detail}", 3 );
94 append( sb, "", 0 );
95
96 append( sb, "goal", 2 );
97 append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
98 append( sb, "Expression: ${goal}", 3 );
99 append( sb, "", 0 );
100
101 append( sb, "indentSize (Default: 2)", 2 );
102 append( sb, "The number of spaces per indentation level, should be positive.", 3 );
103 append( sb, "Expression: ${indentSize}", 3 );
104 append( sb, "", 0 );
105
106 append( sb, "lineLength (Default: 80)", 2 );
107 append( sb, "The maximum length of a display line, should be positive.", 3 );
108 append( sb, "Expression: ${lineLength}", 3 );
109 append( sb, "", 0 );
110 }
111 }
112
113 if ( goal == null || goal.length() <= 0 || "test".equals( goal ) )
114 {
115 append( sb, "andromda-translation-library:test", 0 );
116 append( sb, "Provides the ability to compare cartridge output with existing output.", 1 );
117 append( sb, "", 0 );
118 if ( detail )
119 {
120 append( sb, "Available parameters:", 1 );
121 append( sb, "", 0 );
122
123 append( sb, "configurationUri", 2 );
124 append( sb, "This is the URI to the AndroMDA configuration file.", 3 );
125 append( sb, "Required: Yes", 3 );
126 append( sb, "Expression: file:${basedir}/conf/test/andromda.xml", 3 );
127 append( sb, "", 0 );
128
129 append( sb, "propertyFiles", 2 );
130 append( sb, "(no description available)", 3 );
131 append( sb, "Expression: ${project.build.filters}", 3 );
132 append( sb, "", 0 );
133
134 append( sb, "reportDirectory", 2 );
135 append( sb, "Base directory to which the cartridge test report is written", 3 );
136 append( sb, "Expression: ${project.build.directory}/translation-library-test/reports", 3 );
137 append( sb, "", 0 );
138
139 append( sb, "skipTranslation (Default: false)", 2 );
140 append( sb, "Set this to \'true\' to bypass cartridge tests entirely. Its use is NOT RECOMMENDED, but quite convenient on occasion.", 3 );
141 append( sb, "Expression: ${andromda.translation.test.skip}", 3 );
142 append( sb, "", 0 );
143
144 append( sb, "traceExpression", 2 );
145 append( sb, "Whether or not the expression shall be \'traced\' (i.e. the TraceTranslator will run instead of the specified translator). This is helpful, in allowing us to see which expressions are being parsed in what order, etc.", 3 );
146 append( sb, "Expression: ${trace.expression}", 3 );
147 append( sb, "", 0 );
148
149 append( sb, "translationName", 2 );
150 append( sb, "When specified, only this translation will be tested (If more than one TestTranslation-* file is found).", 3 );
151 append( sb, "Expression: ${translation.name}", 3 );
152 append( sb, "", 0 );
153 }
154 }
155
156 if ( getLog().isInfoEnabled() )
157 {
158 getLog().info( sb.toString() );
159 }
160 }
161
162
163
164
165
166
167
168
169
170
171 private static String repeat( String str, int repeat )
172 {
173 StringBuffer buffer = new StringBuffer( repeat * str.length() );
174
175 for ( int i = 0; i < repeat; i++ )
176 {
177 buffer.append( str );
178 }
179
180 return buffer.toString();
181 }
182
183
184
185
186
187
188
189
190
191 private void append( StringBuffer sb, String description, int indent )
192 {
193 for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
194 {
195 sb.append( it.next().toString() ).append( '\n' );
196 }
197 }
198
199
200
201
202
203
204
205
206
207
208
209 private static List toLines( String text, int indent, int indentSize, int lineLength )
210 {
211 List lines = new ArrayList();
212
213 String ind = repeat( "\t", indent );
214 String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
215 for ( int i = 0; i < plainLines.length; i++ )
216 {
217 toLines( lines, ind + plainLines[i], indentSize, lineLength );
218 }
219
220 return lines;
221 }
222
223
224
225
226
227
228
229
230
231 private static void toLines( List lines, String line, int indentSize, int lineLength )
232 {
233 int lineIndent = getIndentLevel( line );
234 StringBuffer buf = new StringBuffer( 256 );
235 String[] tokens = line.split( " +" );
236 for ( int i = 0; i < tokens.length; i++ )
237 {
238 String token = tokens[i];
239 if ( i > 0 )
240 {
241 if ( buf.length() + token.length() >= lineLength )
242 {
243 lines.add( buf.toString() );
244 buf.setLength( 0 );
245 buf.append( repeat( " ", lineIndent * indentSize ) );
246 }
247 else
248 {
249 buf.append( ' ' );
250 }
251 }
252 for ( int j = 0; j < token.length(); j++ )
253 {
254 char c = token.charAt( j );
255 if ( c == '\t' )
256 {
257 buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
258 }
259 else if ( c == '\u00A0' )
260 {
261 buf.append( ' ' );
262 }
263 else
264 {
265 buf.append( c );
266 }
267 }
268 }
269 lines.add( buf.toString() );
270 }
271
272
273
274
275
276
277
278 private static int getIndentLevel( String line )
279 {
280 int level = 0;
281 for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
282 {
283 level++;
284 }
285 for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
286 {
287 if ( line.charAt( i ) == '\t' )
288 {
289 level++;
290 break;
291 }
292 }
293 return level;
294 }
295 }