001package org.andromda.maven.plugin.cartridge.site;
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 andromda-site-cartridge-plugin.<br/> Call <pre>  mvn andromda-site-cartridge:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</pre> to display parameter details.
012 *
013 * @version generated on Thu Sep 18 16:31:49 EDT 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.andromda.maven.plugins.site:andromda-site-cartridge-plugin:3.5-SNAPSHOT", 0 );
069        append( sb, "", 0 );
070
071        append( sb, "AndroMDA Site Cartridge Plugin", 0 );
072        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 );
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 || "generate-cartridge-howto-artifacts".equals( goal ) )
082        {
083            append( sb, "andromda-site-cartridge:generate-cartridge-howto-artifacts", 0 );
084            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 );
085            append( sb, "", 0 );
086            if ( detail )
087            {
088                append( sb, "Available parameters:", 1 );
089                append( sb, "", 0 );
090
091                append( sb, "configurationUri", 2 );
092                append( sb, "This is the URI to the AndroMDA configuration file.", 3 );
093                append( sb, "Required: Yes", 3 );
094                append( sb, "Expression: file:${basedir}/conf/howto/andromda.xml", 3 );
095                append( sb, "", 0 );
096
097                append( sb, "howtoCartridgePicturesOutputDirectory", 2 );
098                append( sb, "Path to the cartride howto pictures destination extraction directory", 3 );
099                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}