1 package org.andromda.maven.plugin.andromdanetapp;
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:andromdanetapp-maven-plugin:3.5-SNAPSHOT", 0 );
69 append( sb, "", 0 );
70
71 append( sb, "AndroMDA .NET Application Generator Maven Plugin", 0 );
72 append( sb, "A plugin for running AndroMDA\'s AndroMDANetApp application generator to generate Maven2 AndroMDA powered applications.", 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 || "generate".equals( goal ) )
82 {
83 append( sb, "andromdanetapp:generate", 0 );
84 append( sb, "The AndroMDAapp mojo (this should be extended by any Mojo that executes AndroMDApp.", 1 );
85 append( sb, "", 0 );
86 }
87
88 if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
89 {
90 append( sb, "andromdanetapp:help", 0 );
91 append( sb, "Display help information on andromdanetapp-maven-plugin.\nCall\n\u00a0\u00a0mvn\u00a0andromdanetapp:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
92 append( sb, "", 0 );
93 if ( detail )
94 {
95 append( sb, "Available parameters:", 1 );
96 append( sb, "", 0 );
97
98 append( sb, "detail (Default: false)", 2 );
99 append( sb, "If true, display all settable properties for each goal.", 3 );
100 append( sb, "Expression: ${detail}", 3 );
101 append( sb, "", 0 );
102
103 append( sb, "goal", 2 );
104 append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
105 append( sb, "Expression: ${goal}", 3 );
106 append( sb, "", 0 );
107
108 append( sb, "indentSize (Default: 2)", 2 );
109 append( sb, "The number of spaces per indentation level, should be positive.", 3 );
110 append( sb, "Expression: ${indentSize}", 3 );
111 append( sb, "", 0 );
112
113 append( sb, "lineLength (Default: 80)", 2 );
114 append( sb, "The maximum length of a display line, should be positive.", 3 );
115 append( sb, "Expression: ${lineLength}", 3 );
116 append( sb, "", 0 );
117 }
118 }
119
120 if ( getLog().isInfoEnabled() )
121 {
122 getLog().info( sb.toString() );
123 }
124 }
125
126
127
128
129
130
131
132
133
134
135 private static String repeat( String str, int repeat )
136 {
137 StringBuffer buffer = new StringBuffer( repeat * str.length() );
138
139 for ( int i = 0; i < repeat; i++ )
140 {
141 buffer.append( str );
142 }
143
144 return buffer.toString();
145 }
146
147
148
149
150
151
152
153
154
155 private void append( StringBuffer sb, String description, int indent )
156 {
157 for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
158 {
159 sb.append( it.next().toString() ).append( '\n' );
160 }
161 }
162
163
164
165
166
167
168
169
170
171
172
173 private static List toLines( String text, int indent, int indentSize, int lineLength )
174 {
175 List lines = new ArrayList();
176
177 String ind = repeat( "\t", indent );
178 String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
179 for ( int i = 0; i < plainLines.length; i++ )
180 {
181 toLines( lines, ind + plainLines[i], indentSize, lineLength );
182 }
183
184 return lines;
185 }
186
187
188
189
190
191
192
193
194
195 private static void toLines( List lines, String line, int indentSize, int lineLength )
196 {
197 int lineIndent = getIndentLevel( line );
198 StringBuffer buf = new StringBuffer( 256 );
199 String[] tokens = line.split( " +" );
200 for ( int i = 0; i < tokens.length; i++ )
201 {
202 String token = tokens[i];
203 if ( i > 0 )
204 {
205 if ( buf.length() + token.length() >= lineLength )
206 {
207 lines.add( buf.toString() );
208 buf.setLength( 0 );
209 buf.append( repeat( " ", lineIndent * indentSize ) );
210 }
211 else
212 {
213 buf.append( ' ' );
214 }
215 }
216 for ( int j = 0; j < token.length(); j++ )
217 {
218 char c = token.charAt( j );
219 if ( c == '\t' )
220 {
221 buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
222 }
223 else if ( c == '\u00A0' )
224 {
225 buf.append( ' ' );
226 }
227 else
228 {
229 buf.append( c );
230 }
231 }
232 }
233 lines.add( buf.toString() );
234 }
235
236
237
238
239
240
241
242 private static int getIndentLevel( String line )
243 {
244 int level = 0;
245 for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
246 {
247 level++;
248 }
249 for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
250 {
251 if ( line.charAt( i ) == '\t' )
252 {
253 level++;
254 break;
255 }
256 }
257 return level;
258 }
259 }