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