View Javadoc

1   package org.apache.maven.doxia.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   * Display help information on doxia-maven-plugin.<br/> Call <pre>  mvn doxia:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</pre> to display parameter details.
12   *
13   * @version generated on Wed Apr 27 01:35:44 CEST 2011
14   * @author org.apache.maven.tools.plugin.generator.PluginHelpGenerator (version 2.5.1)
15   * @goal help
16   * @requiresProject false
17   */
18  public class HelpMojo
19      extends AbstractMojo
20  {
21      /**
22       * If <code>true</code>, display all settable properties for each goal.
23       * 
24       * @parameter expression="${detail}" default-value="false"
25       */
26      private boolean detail;
27  
28      /**
29       * The name of the goal for which to show help. If unspecified, all goals will be displayed.
30       * 
31       * @parameter expression="${goal}"
32       */
33      private java.lang.String goal;
34  
35      /**
36       * The maximum length of a display line, should be positive.
37       * 
38       * @parameter expression="${lineLength}" default-value="80"
39       */
40      private int lineLength;
41  
42      /**
43       * The number of spaces per indentation level, should be positive.
44       * 
45       * @parameter expression="${indentSize}" default-value="2"
46       */
47      private int indentSize;
48  
49  
50      /** {@inheritDoc} */
51      public void execute()
52          throws MojoExecutionException
53      {
54          if ( lineLength <= 0 )
55          {
56              getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." );
57              lineLength = 80;
58          }
59          if ( indentSize <= 0 )
60          {
61              getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." );
62              indentSize = 2;
63          }
64  
65          StringBuffer sb = new StringBuffer();
66  
67          append( sb, "org.apache.maven.doxia:doxia-maven-plugin:1.2", 0 );
68          append( sb, "", 0 );
69  
70          append( sb, "Doxia :: Maven Plugin", 0 );
71          append( sb, "A Maven plugin for Doxia.", 1 );
72          append( sb, "", 0 );
73  
74          if ( goal == null || goal.length() <= 0 )
75          {
76              append( sb, "This plugin has 2 goals:", 0 );
77              append( sb, "", 0 );
78          }
79  
80          if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
81          {
82              append( sb, "doxia:help", 0 );
83              append( sb, "Display help information on doxia-maven-plugin.\nCall\n\u00a0\u00a0mvn\u00a0doxia:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
84              append( sb, "", 0 );
85              if ( detail )
86              {
87                  append( sb, "Available parameters:", 1 );
88                  append( sb, "", 0 );
89  
90                  append( sb, "detail (Default: false)", 2 );
91                  append( sb, "If true, display all settable properties for each goal.", 3 );
92                  append( sb, "", 0 );
93  
94                  append( sb, "goal", 2 );
95                  append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
96                  append( sb, "", 0 );
97  
98                  append( sb, "indentSize (Default: 2)", 2 );
99                  append( sb, "The number of spaces per indentation level, should be positive.", 3 );
100                 append( sb, "", 0 );
101 
102                 append( sb, "lineLength (Default: 80)", 2 );
103                 append( sb, "The maximum length of a display line, should be positive.", 3 );
104                 append( sb, "", 0 );
105             }
106         }
107 
108         if ( goal == null || goal.length() <= 0 || "render-books".equals( goal ) )
109         {
110             append( sb, "doxia:render-books", 0 );
111             append( sb, "A Mojo to create books in different output formats.", 1 );
112             append( sb, "", 0 );
113             if ( detail )
114             {
115                 append( sb, "Available parameters:", 1 );
116                 append( sb, "", 0 );
117 
118                 append( sb, "basedir (Default: ${basedir})", 2 );
119                 append( sb, "Base directory of the project.", 3 );
120                 append( sb, "", 0 );
121 
122                 append( sb, "books", 2 );
123                 append( sb, "A list of books.", 3 );
124                 append( sb, "", 0 );
125 
126                 append( sb, "generatedDocs (Default: ${project.build.directory}/generated-site)", 2 );
127                 append( sb, "Directory containing the generated project docs.", 3 );
128                 append( sb, "", 0 );
129 
130                 append( sb, "inputEncoding (Default: ${project.build.sourceEncoding})", 2 );
131                 append( sb, "Specifies the input encoding.", 3 );
132                 append( sb, "", 0 );
133 
134                 append( sb, "locales (Default: ${locales})", 2 );
135                 append( sb, "A comma separated list of locales supported by Maven. The first valid token will be the default Locale for this instance of the Java Virtual Machine.", 3 );
136                 append( sb, "", 0 );
137 
138                 append( sb, "outputEncoding (Default: ${project.reporting.outputEncoding})", 2 );
139                 append( sb, "Specifies the output encoding.", 3 );
140                 append( sb, "", 0 );
141             }
142         }
143 
144         if ( getLog().isInfoEnabled() )
145         {
146             getLog().info( sb.toString() );
147         }
148     }
149 
150     /**
151      * <p>Repeat a String <code>n</code> times to form a new string.</p>
152      *
153      * @param str String to repeat
154      * @param repeat number of times to repeat str
155      * @return String with repeated String
156      * @throws NegativeArraySizeException if <code>repeat < 0</code>
157      * @throws NullPointerException if str is <code>null</code>
158      */
159     private static String repeat( String str, int repeat )
160     {
161         StringBuffer buffer = new StringBuffer( repeat * str.length() );
162 
163         for ( int i = 0; i < repeat; i++ )
164         {
165             buffer.append( str );
166         }
167 
168         return buffer.toString();
169     }
170 
171     /** 
172      * Append a description to the buffer by respecting the indentSize and lineLength parameters.
173      * <b>Note</b>: The last character is always a new line.
174      * 
175      * @param sb The buffer to append the description, not <code>null</code>.
176      * @param description The description, not <code>null</code>.
177      * @param indent The base indentation level of each line, must not be negative.
178      */
179     private void append( StringBuffer sb, String description, int indent )
180     {
181         for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
182         {
183             sb.append( it.next().toString() ).append( '\n' );
184         }
185     }
186 
187     /** 
188      * Splits the specified text into lines of convenient display length.
189      * 
190      * @param text The text to split into lines, must not be <code>null</code>.
191      * @param indent The base indentation level of each line, must not be negative.
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      * @return The sequence of display lines, never <code>null</code>.
195      * @throws NegativeArraySizeException if <code>indent < 0</code>
196      */
197     private static List toLines( String text, int indent, int indentSize, int lineLength )
198     {
199         List lines = new ArrayList();
200 
201         String ind = repeat( "\t", indent );
202         String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
203         for ( int i = 0; i < plainLines.length; i++ )
204         {
205             toLines( lines, ind + plainLines[i], indentSize, lineLength );
206         }
207 
208         return lines;
209     }
210 
211     /** 
212      * Adds the specified line to the output sequence, performing line wrapping if necessary.
213      * 
214      * @param lines The sequence of display lines, must not be <code>null</code>.
215      * @param line The line to add, must not be <code>null</code>.
216      * @param indentSize The size of each indentation, must not be negative.
217      * @param lineLength The length of the line, must not be negative.
218      */
219     private static void toLines( List lines, String line, int indentSize, int lineLength )
220     {
221         int lineIndent = getIndentLevel( line );
222         StringBuffer buf = new StringBuffer( 256 );
223         String[] tokens = line.split( " +" );
224         for ( int i = 0; i < tokens.length; i++ )
225         {
226             String token = tokens[i];
227             if ( i > 0 )
228             {
229                 if ( buf.length() + token.length() >= lineLength )
230                 {
231                     lines.add( buf.toString() );
232                     buf.setLength( 0 );
233                     buf.append( repeat( " ", lineIndent * indentSize ) );
234                 }
235                 else
236                 {
237                     buf.append( ' ' );
238                 }
239             }
240             for ( int j = 0; j < token.length(); j++ )
241             {
242                 char c = token.charAt( j );
243                 if ( c == '\t' )
244                 {
245                     buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
246                 }
247                 else if ( c == '\u00A0' )
248                 {
249                     buf.append( ' ' );
250                 }
251                 else
252                 {
253                     buf.append( c );
254                 }
255             }
256         }
257         lines.add( buf.toString() );
258     }
259 
260     /** 
261      * Gets the indentation level of the specified line.
262      * 
263      * @param line The line whose indentation level should be retrieved, must not be <code>null</code>.
264      * @return The indentation level of the line.
265      */
266     private static int getIndentLevel( String line )
267     {
268         int level = 0;
269         for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
270         {
271             level++;
272         }
273         for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
274         {
275             if ( line.charAt( i ) == '\t' )
276             {
277                 level++;
278                 break;
279             }
280         }
281         return level;
282     }
283 }