1 package org.andromda.beautifier.plugin;
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-beautifier-plugin:3.5-SNAPSHOT", 0 );
69 append( sb, "", 0 );
70
71 append( sb, "AndroMDA Beautifier Plugin", 0 );
72 append( sb, "The AndroMDA Maven plugins", 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 || "beautify-imports".equals( goal ) )
82 {
83 append( sb, "andromda-beautifier:beautify-imports", 0 );
84 append( sb, "Runs andromda beautifier", 1 );
85 append( sb, "", 0 );
86 if ( detail )
87 {
88 append( sb, "Available parameters:", 1 );
89 append( sb, "", 0 );
90
91 append( sb, "inputDirectory", 2 );
92 append( sb, "Location of the directory to be recursively beautified. Defaults to all source directories for parent project (..)", 3 );
93 append( sb, "Expression: ${basedir}", 3 );
94 append( sb, "", 0 );
95
96 append( sb, "outputDirectory", 2 );
97 append( sb, "Location of the output directory for beautified source. Defaults to the source directory", 3 );
98 append( sb, "Expression: ${basedir}", 3 );
99 append( sb, "", 0 );
100
101 append( sb, "skipProcessing", 2 );
102 append( sb, "Whether or not processing should be skipped (this is if you just want to force Beautifier not to run on your code, i.e. if generating site from already formatted source code).", 3 );
103 append( sb, "Expression: ${beautifier.run.skip}", 3 );
104 append( sb, "", 0 );
105 }
106 }
107
108 if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
109 {
110 append( sb, "andromda-beautifier:help", 0 );
111 append( sb, "Display help information on andromda-beautifier-plugin.\nCall\n\u00a0\u00a0mvn\u00a0andromda-beautifier:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
112 append( sb, "", 0 );
113 if ( detail )
114 {
115 append( sb, "Available parameters:", 1 );
116 append( sb, "", 0 );
117
118 append( sb, "detail (Default: false)", 2 );
119 append( sb, "If true, display all settable properties for each goal.", 3 );
120 append( sb, "Expression: ${detail}", 3 );
121 append( sb, "", 0 );
122
123 append( sb, "goal", 2 );
124 append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
125 append( sb, "Expression: ${goal}", 3 );
126 append( sb, "", 0 );
127
128 append( sb, "indentSize (Default: 2)", 2 );
129 append( sb, "The number of spaces per indentation level, should be positive.", 3 );
130 append( sb, "Expression: ${indentSize}", 3 );
131 append( sb, "", 0 );
132
133 append( sb, "lineLength (Default: 80)", 2 );
134 append( sb, "The maximum length of a display line, should be positive.", 3 );
135 append( sb, "Expression: ${lineLength}", 3 );
136 append( sb, "", 0 );
137 }
138 }
139
140 if ( getLog().isInfoEnabled() )
141 {
142 getLog().info( sb.toString() );
143 }
144 }
145
146
147
148
149
150
151
152
153
154
155 private static String repeat( String str, int repeat )
156 {
157 StringBuffer buffer = new StringBuffer( repeat * str.length() );
158
159 for ( int i = 0; i < repeat; i++ )
160 {
161 buffer.append( str );
162 }
163
164 return buffer.toString();
165 }
166
167
168
169
170
171
172
173
174
175 private void append( StringBuffer sb, String description, int indent )
176 {
177 for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
178 {
179 sb.append( it.next().toString() ).append( '\n' );
180 }
181 }
182
183
184
185
186
187
188
189
190
191
192
193 private static List toLines( String text, int indent, int indentSize, int lineLength )
194 {
195 List lines = new ArrayList();
196
197 String ind = repeat( "\t", indent );
198 String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
199 for ( int i = 0; i < plainLines.length; i++ )
200 {
201 toLines( lines, ind + plainLines[i], indentSize, lineLength );
202 }
203
204 return lines;
205 }
206
207
208
209
210
211
212
213
214
215 private static void toLines( List lines, String line, int indentSize, int lineLength )
216 {
217 int lineIndent = getIndentLevel( line );
218 StringBuffer buf = new StringBuffer( 256 );
219 String[] tokens = line.split( " +" );
220 for ( int i = 0; i < tokens.length; i++ )
221 {
222 String token = tokens[i];
223 if ( i > 0 )
224 {
225 if ( buf.length() + token.length() >= lineLength )
226 {
227 lines.add( buf.toString() );
228 buf.setLength( 0 );
229 buf.append( repeat( " ", lineIndent * indentSize ) );
230 }
231 else
232 {
233 buf.append( ' ' );
234 }
235 }
236 for ( int j = 0; j < token.length(); j++ )
237 {
238 char c = token.charAt( j );
239 if ( c == '\t' )
240 {
241 buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
242 }
243 else if ( c == '\u00A0' )
244 {
245 buf.append( ' ' );
246 }
247 else
248 {
249 buf.append( c );
250 }
251 }
252 }
253 lines.add( buf.toString() );
254 }
255
256
257
258
259
260
261
262 private static int getIndentLevel( String line )
263 {
264 int level = 0;
265 for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
266 {
267 level++;
268 }
269 for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
270 {
271 if ( line.charAt( i ) == '\t' )
272 {
273 level++;
274 break;
275 }
276 }
277 return level;
278 }
279 }