View Javadoc
1   package org.andromda.maven.plugin.cartridge.site;
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   * Display help information on andromda-site-cartridge-plugin.<br/> Call <pre>  mvn andromda-site-cartridge:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</pre> to display parameter details.
12   *
13   * @version generated on Thu Sep 18 16:31:49 EDT 2014
14   * @author org.apache.maven.tools.plugin.generator.PluginHelpGenerator (version 2.9)
15   * @goal help
16   * @requiresProject false
17   * @threadSafe
18   */
19  public class HelpMojo
20      extends AbstractMojo
21  {
22      /**
23       * If <code>true</code>, display all settable properties for each goal.
24       * 
25       * @parameter expression="${detail}" default-value="false"
26       */
27      private boolean detail;
28  
29      /**
30       * The name of the goal for which to show help. If unspecified, all goals will be displayed.
31       * 
32       * @parameter expression="${goal}"
33       */
34      private java.lang.String goal;
35  
36      /**
37       * The maximum length of a display line, should be positive.
38       * 
39       * @parameter expression="${lineLength}" default-value="80"
40       */
41      private int lineLength;
42  
43      /**
44       * The number of spaces per indentation level, should be positive.
45       * 
46       * @parameter expression="${indentSize}" default-value="2"
47       */
48      private int indentSize;
49  
50  
51      /** {@inheritDoc} */
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.site:andromda-site-cartridge-plugin:3.5-SNAPSHOT", 0 );
69          append( sb, "", 0 );
70  
71          append( sb, "AndroMDA Site Cartridge Plugin", 0 );
72          append( sb, "A plugin that enhances the maven site plugin and perform cartridge specific tasks required at the site creation phase. One of its tasks is to run AndroMDA over the cartridge HowTo model and unpack the HowTo pictures archive.", 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-cartridge-howto-artifacts".equals( goal ) )
82          {
83              append( sb, "andromda-site-cartridge:generate-cartridge-howto-artifacts", 0 );
84              append( sb, "Goal that runs AndroMDA over the howto model to generate the cartridge java source files which are referenced via the cartridge xhtml docs. It also unpacks the cartridge related archive files, such as the howto pictures for the cartridge site documentation, to target/site/howto locations preparing for deployment.", 1 );
85              append( sb, "", 0 );
86              if ( detail )
87              {
88                  append( sb, "Available parameters:", 1 );
89                  append( sb, "", 0 );
90  
91                  append( sb, "configurationUri", 2 );
92                  append( sb, "This is the URI to the AndroMDA configuration file.", 3 );
93                  append( sb, "Required: Yes", 3 );
94                  append( sb, "Expression: file:${basedir}/conf/howto/andromda.xml", 3 );
95                  append( sb, "", 0 );
96  
97                  append( sb, "howtoCartridgePicturesOutputDirectory", 2 );
98                  append( sb, "Path to the cartride howto pictures destination extraction directory", 3 );
99                  append( sb, "Expression: ${basedir}/target/site/howto", 3 );
100                 append( sb, "", 0 );
101 
102                 append( sb, "howtoCartridgePicturesSourcePath", 2 );
103                 append( sb, "Path to the cartridge howto pictures zip source. This file\'s path is typically cartridge/src/site/resource/howto/HowToPictures.zip.", 3 );
104                 append( sb, "Expression: ${basedir}/src/site/resources/howto/HowToPictures.zip", 3 );
105                 append( sb, "", 0 );
106 
107                 append( sb, "modelOutputHistory", 2 );
108                 append( sb, "The directory where the model generation output history is located (Modelname file containing a list of files generated by that model).", 3 );
109                 append( sb, "Expression: ${project.build.directory}/history", 3 );
110                 append( sb, "", 0 );
111 
112                 append( sb, "projectName (Default: ${project.name})", 2 );
113                 append( sb, "The name of the project injected from pom.xml. Not used.", 3 );
114                 append( sb, "", 0 );
115 
116                 append( sb, "propertyFiles", 2 );
117                 append( sb, "(no description available)", 3 );
118                 append( sb, "Expression: ${project.build.filters}", 3 );
119                 append( sb, "", 0 );
120             }
121         }
122 
123         if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
124         {
125             append( sb, "andromda-site-cartridge:help", 0 );
126             append( sb, "Display help information on andromda-site-cartridge-plugin.\nCall\n\u00a0\u00a0mvn\u00a0andromda-site-cartridge:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
127             append( sb, "", 0 );
128             if ( detail )
129             {
130                 append( sb, "Available parameters:", 1 );
131                 append( sb, "", 0 );
132 
133                 append( sb, "detail (Default: false)", 2 );
134                 append( sb, "If true, display all settable properties for each goal.", 3 );
135                 append( sb, "Expression: ${detail}", 3 );
136                 append( sb, "", 0 );
137 
138                 append( sb, "goal", 2 );
139                 append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
140                 append( sb, "Expression: ${goal}", 3 );
141                 append( sb, "", 0 );
142 
143                 append( sb, "indentSize (Default: 2)", 2 );
144                 append( sb, "The number of spaces per indentation level, should be positive.", 3 );
145                 append( sb, "Expression: ${indentSize}", 3 );
146                 append( sb, "", 0 );
147 
148                 append( sb, "lineLength (Default: 80)", 2 );
149                 append( sb, "The maximum length of a display line, should be positive.", 3 );
150                 append( sb, "Expression: ${lineLength}", 3 );
151                 append( sb, "", 0 );
152             }
153         }
154 
155         if ( getLog().isInfoEnabled() )
156         {
157             getLog().info( sb.toString() );
158         }
159     }
160 
161     /**
162      * <p>Repeat a String <code>n</code> times to form a new string.</p>
163      *
164      * @param str String to repeat
165      * @param repeat number of times to repeat str
166      * @return String with repeated String
167      * @throws NegativeArraySizeException if <code>repeat < 0</code>
168      * @throws NullPointerException if str is <code>null</code>
169      */
170     private static String repeat( String str, int repeat )
171     {
172         StringBuffer buffer = new StringBuffer( repeat * str.length() );
173 
174         for ( int i = 0; i < repeat; i++ )
175         {
176             buffer.append( str );
177         }
178 
179         return buffer.toString();
180     }
181 
182     /** 
183      * Append a description to the buffer by respecting the indentSize and lineLength parameters.
184      * <b>Note</b>: The last character is always a new line.
185      * 
186      * @param sb The buffer to append the description, not <code>null</code>.
187      * @param description The description, not <code>null</code>.
188      * @param indent The base indentation level of each line, must not be negative.
189      */
190     private void append( StringBuffer sb, String description, int indent )
191     {
192         for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
193         {
194             sb.append( it.next().toString() ).append( '\n' );
195         }
196     }
197 
198     /** 
199      * Splits the specified text into lines of convenient display length.
200      * 
201      * @param text The text to split into lines, must not be <code>null</code>.
202      * @param indent The base indentation level of each line, must not be negative.
203      * @param indentSize The size of each indentation, must not be negative.
204      * @param lineLength The length of the line, must not be negative.
205      * @return The sequence of display lines, never <code>null</code>.
206      * @throws NegativeArraySizeException if <code>indent < 0</code>
207      */
208     private static List toLines( String text, int indent, int indentSize, int lineLength )
209     {
210         List lines = new ArrayList();
211 
212         String ind = repeat( "\t", indent );
213         String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
214         for ( int i = 0; i < plainLines.length; i++ )
215         {
216             toLines( lines, ind + plainLines[i], indentSize, lineLength );
217         }
218 
219         return lines;
220     }
221 
222     /** 
223      * Adds the specified line to the output sequence, performing line wrapping if necessary.
224      * 
225      * @param lines The sequence of display lines, must not be <code>null</code>.
226      * @param line The line to add, must not be <code>null</code>.
227      * @param indentSize The size of each indentation, must not be negative.
228      * @param lineLength The length of the line, must not be negative.
229      */
230     private static void toLines( List lines, String line, int indentSize, int lineLength )
231     {
232         int lineIndent = getIndentLevel( line );
233         StringBuffer buf = new StringBuffer( 256 );
234         String[] tokens = line.split( " +" );
235         for ( int i = 0; i < tokens.length; i++ )
236         {
237             String token = tokens[i];
238             if ( i > 0 )
239             {
240                 if ( buf.length() + token.length() >= lineLength )
241                 {
242                     lines.add( buf.toString() );
243                     buf.setLength( 0 );
244                     buf.append( repeat( " ", lineIndent * indentSize ) );
245                 }
246                 else
247                 {
248                     buf.append( ' ' );
249                 }
250             }
251             for ( int j = 0; j < token.length(); j++ )
252             {
253                 char c = token.charAt( j );
254                 if ( c == '\t' )
255                 {
256                     buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
257                 }
258                 else if ( c == '\u00A0' )
259                 {
260                     buf.append( ' ' );
261                 }
262                 else
263                 {
264                     buf.append( c );
265                 }
266             }
267         }
268         lines.add( buf.toString() );
269     }
270 
271     /** 
272      * Gets the indentation level of the specified line.
273      * 
274      * @param line The line whose indentation level should be retrieved, must not be <code>null</code>.
275      * @return The indentation level of the line.
276      */
277     private static int getIndentLevel( String line )
278     {
279         int level = 0;
280         for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
281         {
282             level++;
283         }
284         for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
285         {
286             if ( line.charAt( i ) == '\t' )
287             {
288                 level++;
289                 break;
290             }
291         }
292         return level;
293     }
294 }