001package org.jdtaus.mojo.resource;
002
003import java.util.ArrayList;
004import java.util.Iterator;
005import java.util.List;
006
007import org.apache.maven.plugin.AbstractMojo;
008import org.apache.maven.plugin.MojoExecutionException;
009
010/**
011 * 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.
012 *
013 * @version generated on Mon Jan 13 23:55:16 CET 2014
014 * @author org.apache.maven.tools.plugin.generator.PluginHelpGenerator (version 2.9)
015 * @goal help
016 * @requiresProject false
017 * @threadSafe
018 */
019public class HelpMojo
020    extends AbstractMojo
021{
022    /**
023     * If <code>true</code>, display all settable properties for each goal.
024     * 
025     * @parameter expression="${detail}" default-value="false"
026     */
027    private boolean detail;
028
029    /**
030     * The name of the goal for which to show help. If unspecified, all goals will be displayed.
031     * 
032     * @parameter expression="${goal}"
033     */
034    private java.lang.String goal;
035
036    /**
037     * The maximum length of a display line, should be positive.
038     * 
039     * @parameter expression="${lineLength}" default-value="80"
040     */
041    private int lineLength;
042
043    /**
044     * The number of spaces per indentation level, should be positive.
045     * 
046     * @parameter expression="${indentSize}" default-value="2"
047     */
048    private int indentSize;
049
050
051    /** {@inheritDoc} */
052    public void execute()
053        throws MojoExecutionException
054    {
055        if ( lineLength <= 0 )
056        {
057            getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." );
058            lineLength = 80;
059        }
060        if ( indentSize <= 0 )
061        {
062            getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." );
063            indentSize = 2;
064        }
065
066        StringBuffer sb = new StringBuffer();
067
068        append( sb, "org.jdtaus.mojo:jdtaus-resource-mojo:3.14", 0 );
069        append( sb, "", 0 );
070
071        append( sb, "jDTAUS Core \u2051 Resource Mojo", 0 );
072        append( sb, "Collection of tools dealing with a projects\' resources.", 1 );
073        append( sb, "", 0 );
074
075        if ( goal == null || goal.length() <= 0 )
076        {
077            append( sb, "This plugin has 2 goals:", 0 );
078            append( sb, "", 0 );
079        }
080
081        if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
082        {
083            append( sb, "jdtaus-resource-mojo:help", 0 );
084            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 );
085            append( sb, "", 0 );
086            if ( detail )
087            {
088                append( sb, "Available parameters:", 1 );
089                append( sb, "", 0 );
090
091                append( sb, "detail (Default: false)", 2 );
092                append( sb, "If true, display all settable properties for each goal.", 3 );
093                append( sb, "Expression: ${detail}", 3 );
094                append( sb, "", 0 );
095
096                append( sb, "goal", 2 );
097                append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
098                append( sb, "Expression: ${goal}", 3 );
099                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}