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=<goal-name></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}