View Javadoc
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   * Display help information on andromdanetapp-maven-plugin.<br/> Call <pre>  mvn andromdanetapp:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</pre> to display parameter details.
12   *
13   * @version generated on Thu Sep 18 16:25:40 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: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      * <p>Repeat a String <code>n</code> times to form a new string.</p>
128      *
129      * @param str String to repeat
130      * @param repeat number of times to repeat str
131      * @return String with repeated String
132      * @throws NegativeArraySizeException if <code>repeat < 0</code>
133      * @throws NullPointerException if str is <code>null</code>
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      * Append a description to the buffer by respecting the indentSize and lineLength parameters.
149      * <b>Note</b>: The last character is always a new line.
150      * 
151      * @param sb The buffer to append the description, not <code>null</code>.
152      * @param description The description, not <code>null</code>.
153      * @param indent The base indentation level of each line, must not be negative.
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      * Splits the specified text into lines of convenient display length.
165      * 
166      * @param text The text to split into lines, must not be <code>null</code>.
167      * @param indent The base indentation level of each line, must not be negative.
168      * @param indentSize The size of each indentation, must not be negative.
169      * @param lineLength The length of the line, must not be negative.
170      * @return The sequence of display lines, never <code>null</code>.
171      * @throws NegativeArraySizeException if <code>indent < 0</code>
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      * Adds the specified line to the output sequence, performing line wrapping if necessary.
189      * 
190      * @param lines The sequence of display lines, must not be <code>null</code>.
191      * @param line The line to add, must not be <code>null</code>.
192      * @param indentSize The size of each indentation, must not be negative.
193      * @param lineLength The length of the line, must not be negative.
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      * Gets the indentation level of the specified line.
238      * 
239      * @param line The line whose indentation level should be retrieved, must not be <code>null</code>.
240      * @return The indentation level of the line.
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 }