View Javadoc

1   package org.jdtaus.mojo.resource;
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 jdtaus-resource-mojo.<br/> Call <pre>  mvn jdtaus-resource-mojo:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</pre> to display parameter details.
12   *
13   * @version generated on Wed Oct 03 04:28:39 CEST 2012
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.jdtaus.mojo:jdtaus-resource-mojo:3.12", 0 );
69          append( sb, "", 0 );
70  
71          append( sb, "jDTAUS Core \u2051 Resource Mojo", 0 );
72          append( sb, "Source generator for resource bundles.", 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 || "help".equals( goal ) )
82          {
83              append( sb, "jdtaus-resource-mojo:help", 0 );
84              append( sb, "Display help information on jdtaus-resource-mojo.\nCall\n\u00a0\u00a0mvn\u00a0jdtaus-resource-mojo:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
85              append( sb, "", 0 );
86              if ( detail )
87              {
88                  append( sb, "Available parameters:", 1 );
89                  append( sb, "", 0 );
90  
91                  append( sb, "detail (Default: false)", 2 );
92                  append( sb, "If true, display all settable properties for each goal.", 3 );
93                  append( sb, "Expression: ${detail}", 3 );
94                  append( sb, "", 0 );
95  
96                  append( sb, "goal", 2 );
97                  append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
98                  append( sb, "Expression: ${goal}", 3 );
99                  append( sb, "", 0 );
100 
101                 append( sb, "indentSize (Default: 2)", 2 );
102                 append( sb, "The number of spaces per indentation level, should be positive.", 3 );
103                 append( sb, "Expression: ${indentSize}", 3 );
104                 append( sb, "", 0 );
105 
106                 append( sb, "lineLength (Default: 80)", 2 );
107                 append( sb, "The maximum length of a display line, should be positive.", 3 );
108                 append( sb, "Expression: ${lineLength}", 3 );
109                 append( sb, "", 0 );
110             }
111         }
112 
113         if ( goal == null || goal.length() <= 0 || "java-resources".equals( goal ) )
114         {
115             append( sb, "jdtaus-resource-mojo:java-resources", 0 );
116             append( sb, "Mojo to generate java resource accessor classes backed by java ResourceBundles from a project\'s module descriptor.", 1 );
117             append( sb, "", 0 );
118             if ( detail )
119             {
120                 append( sb, "Available parameters:", 1 );
121                 append( sb, "", 0 );
122 
123                 append( sb, "buildDirectory", 2 );
124                 append( sb, "The directory to use for storing hashes for already generated files.", 3 );
125                 append( sb, "Expression: ${project.build.directory}/java-resources", 3 );
126                 append( sb, "", 0 );
127 
128                 append( sb, "defaultLanguage (Default: en)", 2 );
129                 append( sb, "The default language for generated bundles.", 3 );
130                 append( sb, "Expression: ${javaResources.defaultLanguage}", 3 );
131                 append( sb, "", 0 );
132 
133                 append( sb, "encoding", 2 );
134                 append( sb, "The encoding to use for writing sources.", 3 );
135                 append( sb, "Expression: ${project.build.sourceEncoding}", 3 );
136                 append( sb, "", 0 );
137 
138                 append( sb, "moduleDescriptor (Default: src/main/resources/META-INF/jdtaus/module.xml)", 2 );
139                 append( sb, "Project module descriptor to control the mojo.", 3 );
140                 append( sb, "Expression: ${javaResources.moduleDescriptor}", 3 );
141                 append( sb, "", 0 );
142 
143                 append( sb, "project", 2 );
144                 append( sb, "Currently executed MavenProject.", 3 );
145                 append( sb, "Required: Yes", 3 );
146                 append( sb, "Expression: ${project}", 3 );
147                 append( sb, "", 0 );
148 
149                 append( sb, "resourceDirectory", 2 );
150                 append( sb, "The directory to generate resources to.", 3 );
151                 append( sb, "Expression: ${project.build.directory}/generated-resources/java-resources", 3 );
152                 append( sb, "", 0 );
153 
154                 append( sb, "sourceDirectory", 2 );
155                 append( sb, "The directory to generate sources to.", 3 );
156                 append( sb, "Expression: ${project.build.directory}/generated-sources/java-resources", 3 );
157                 append( sb, "", 0 );
158             }
159         }
160 
161         if ( getLog().isInfoEnabled() )
162         {
163             getLog().info( sb.toString() );
164         }
165     }
166 
167     /**
168      * <p>Repeat a String <code>n</code> times to form a new string.</p>
169      *
170      * @param str String to repeat
171      * @param repeat number of times to repeat str
172      * @return String with repeated String
173      * @throws NegativeArraySizeException if <code>repeat < 0</code>
174      * @throws NullPointerException if str is <code>null</code>
175      */
176     private static String repeat( String str, int repeat )
177     {
178         StringBuffer buffer = new StringBuffer( repeat * str.length() );
179 
180         for ( int i = 0; i < repeat; i++ )
181         {
182             buffer.append( str );
183         }
184 
185         return buffer.toString();
186     }
187 
188     /** 
189      * Append a description to the buffer by respecting the indentSize and lineLength parameters.
190      * <b>Note</b>: The last character is always a new line.
191      * 
192      * @param sb The buffer to append the description, not <code>null</code>.
193      * @param description The description, not <code>null</code>.
194      * @param indent The base indentation level of each line, must not be negative.
195      */
196     private void append( StringBuffer sb, String description, int indent )
197     {
198         for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
199         {
200             sb.append( it.next().toString() ).append( '\n' );
201         }
202     }
203 
204     /** 
205      * Splits the specified text into lines of convenient display length.
206      * 
207      * @param text The text to split into lines, must not be <code>null</code>.
208      * @param indent The base indentation level of each line, must not be negative.
209      * @param indentSize The size of each indentation, must not be negative.
210      * @param lineLength The length of the line, must not be negative.
211      * @return The sequence of display lines, never <code>null</code>.
212      * @throws NegativeArraySizeException if <code>indent < 0</code>
213      */
214     private static List toLines( String text, int indent, int indentSize, int lineLength )
215     {
216         List lines = new ArrayList();
217 
218         String ind = repeat( "\t", indent );
219         String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
220         for ( int i = 0; i < plainLines.length; i++ )
221         {
222             toLines( lines, ind + plainLines[i], indentSize, lineLength );
223         }
224 
225         return lines;
226     }
227 
228     /** 
229      * Adds the specified line to the output sequence, performing line wrapping if necessary.
230      * 
231      * @param lines The sequence of display lines, must not be <code>null</code>.
232      * @param line The line to add, must not be <code>null</code>.
233      * @param indentSize The size of each indentation, must not be negative.
234      * @param lineLength The length of the line, must not be negative.
235      */
236     private static void toLines( List lines, String line, int indentSize, int lineLength )
237     {
238         int lineIndent = getIndentLevel( line );
239         StringBuffer buf = new StringBuffer( 256 );
240         String[] tokens = line.split( " +" );
241         for ( int i = 0; i < tokens.length; i++ )
242         {
243             String token = tokens[i];
244             if ( i > 0 )
245             {
246                 if ( buf.length() + token.length() >= lineLength )
247                 {
248                     lines.add( buf.toString() );
249                     buf.setLength( 0 );
250                     buf.append( repeat( " ", lineIndent * indentSize ) );
251                 }
252                 else
253                 {
254                     buf.append( ' ' );
255                 }
256             }
257             for ( int j = 0; j < token.length(); j++ )
258             {
259                 char c = token.charAt( j );
260                 if ( c == '\t' )
261                 {
262                     buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
263                 }
264                 else if ( c == '\u00A0' )
265                 {
266                     buf.append( ' ' );
267                 }
268                 else
269                 {
270                     buf.append( c );
271                 }
272             }
273         }
274         lines.add( buf.toString() );
275     }
276 
277     /** 
278      * Gets the indentation level of the specified line.
279      * 
280      * @param line The line whose indentation level should be retrieved, must not be <code>null</code>.
281      * @return The indentation level of the line.
282      */
283     private static int getIndentLevel( String line )
284     {
285         int level = 0;
286         for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
287         {
288             level++;
289         }
290         for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
291         {
292             if ( line.charAt( i ) == '\t' )
293             {
294                 level++;
295                 break;
296             }
297         }
298         return level;
299     }
300 }