You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jk...@apache.org on 2002/12/10 00:47:26 UTC

cvs commit: jakarta-commons/cli/src/test/org/apache/commons/cli TestHelpFormatter.java

jkeyes      2002/12/09 15:47:26

  Modified:    cli/src/java/org/apache/commons/cli
                        AlreadySelectedException.java BasicParser.java
                        CommandLine.java CommandLineParser.java
                        GnuParser.java HelpFormatter.java
                        MissingArgumentException.java
                        MissingOptionException.java Option.java
                        OptionBuilder.java OptionGroup.java
                        OptionValidator.java Options.java
                        ParseException.java Parser.java
                        PatternOptionBuilder.java PosixParser.java
                        TypeHandler.java UnrecognizedOptionException.java
                        Util.java
               cli/src/test/org/apache/commons/cli TestHelpFormatter.java
  Log:
  checkstyle fixes
  
  Revision  Changes    Path
  1.5       +6 -4      jakarta-commons/cli/src/java/org/apache/commons/cli/AlreadySelectedException.java
  
  Index: AlreadySelectedException.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/AlreadySelectedException.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- AlreadySelectedException.java	19 Sep 2002 22:59:43 -0000	1.4
  +++ AlreadySelectedException.java	9 Dec 2002 23:47:24 -0000	1.5
  @@ -67,7 +67,8 @@
    * @author John Keyes ( john at integralsource.com )
    * @see ParseException
    */
  -public class AlreadySelectedException extends ParseException {
  +public class AlreadySelectedException
  +    extends ParseException {
   
       /** 
        * <p>Construct a new <code>AlreadySelectedException</code> 
  @@ -75,7 +76,8 @@
        *
        * @param message the detail message
        */
  -    public AlreadySelectedException( String message ) {
  -        super( message );
  +    public AlreadySelectedException(String message)
  +    {
  +        super(message);
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.4       +5 -6      jakarta-commons/cli/src/java/org/apache/commons/cli/BasicParser.java
  
  Index: BasicParser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/BasicParser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- BasicParser.java	19 Sep 2002 22:59:43 -0000	1.3
  +++ BasicParser.java	9 Dec 2002 23:47:24 -0000	1.4
  @@ -82,9 +82,8 @@
        * when an non option is found.
        * @return The <code>arguments</code> String array.
        */
  -    protected String[] flatten( Options options, 
  -                                String[] arguments, 
  -                                boolean stopAtNonOption )
  +    protected String[] flatten(Options options, String[] arguments, 
  +                               boolean stopAtNonOption)
       {
           // just echo the arguments
           return arguments;
  
  
  
  1.17      +100 -67   jakarta-commons/cli/src/java/org/apache/commons/cli/CommandLine.java
  
  Index: CommandLine.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/CommandLine.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- CommandLine.java	19 Nov 2002 22:47:11 -0000	1.16
  +++ CommandLine.java	9 Dec 2002 23:47:24 -0000	1.17
  @@ -60,12 +60,11 @@
    */
   package org.apache.commons.cli;
   
  -import java.util.ArrayList;
   import java.util.Collection;
   import java.util.HashMap;
   import java.util.Iterator;
  -import java.util.List;
   import java.util.LinkedList;
  +import java.util.List;
   import java.util.Map;
   
   /** 
  @@ -84,15 +83,15 @@
    * @author John Keyes (john at integralsource.com)
    */
   public class CommandLine {
  -    
  +
       /** the unrecognised options/arguments */
  -    private List args    = new LinkedList();
  +    private List args = new LinkedList();
   
       /** the processed options */
       private Map options = new HashMap();
   
       /** the option name map */
  -    private Map names   = new HashMap();
  +    private Map names = new HashMap();
   
       /** Map of unique options for ease to get complete list of options */
       private Map hashcodeMap = new HashMap();
  @@ -103,17 +102,19 @@
       /**
        * <p>Creates a command line.</p>
        */
  -    CommandLine() {
  +    CommandLine()
  +    {
       }
  -    
  +
       /** 
        * <p>Query to see if an option has been set.</p>
        *
        * @param opt Short name of the option
        * @return true if set, false if not
        */
  -    public boolean hasOption(String opt) {
  -        return options.containsKey( opt );
  +    public boolean hasOption(String opt)
  +    {
  +        return options.containsKey(opt);
       }
   
       /** 
  @@ -122,8 +123,9 @@
        * @param opt character name of the option
        * @return true if set, false if not
        */
  -    public boolean hasOption( char opt ) {
  -        return hasOption( String.valueOf( opt ) );
  +    public boolean hasOption(char opt)
  +    {
  +        return hasOption(String.valueOf(opt));
       }
   
       /**
  @@ -132,14 +134,18 @@
        * @param opt the name of the option
        * @return the type of this <code>Option</code>
        */
  -    public Object getOptionObject( String opt ) {
  -        String res = getOptionValue( opt );
  -        
  -        if( !options.containsKey( opt ) ) {
  +    public Object getOptionObject(String opt)
  +    {
  +        String res = getOptionValue(opt);
  +
  +        if (!options.containsKey(opt))
  +        {
               return null;
           }
  -        Object type = ((Option)options.get(opt)).getType();
  -        return res == null ? null : TypeHandler.createValue(res, type);
  +
  +        Object type = ((Option) options.get(opt)).getType();
  +
  +        return (res == null)        ? null : TypeHandler.createValue(res, type);
       }
   
       /**
  @@ -148,8 +154,9 @@
        * @param opt the name of the option
        * @return the type of opt
        */
  -    public Object getOptionObject( char opt ) {
  -        return getOptionObject( String.valueOf( opt ) );
  +    public Object getOptionObject(char opt)
  +    {
  +        return getOptionObject(String.valueOf(opt));
       }
   
       /** 
  @@ -159,8 +166,10 @@
        * @return Value of the argument if option is set, and has an argument,
        * otherwise null.
        */
  -    public String getOptionValue( String opt ) {
  +    public String getOptionValue(String opt)
  +    {
           String[] values = getOptionValues(opt);
  +
           return (values == null) ? null : values[0];
       }
   
  @@ -171,8 +180,9 @@
        * @return Value of the argument if option is set, and has an argument,
        * otherwise null.
        */
  -    public String getOptionValue( char opt ) {
  -        return getOptionValue( String.valueOf( opt ) );
  +    public String getOptionValue(char opt)
  +    {
  +        return getOptionValue(String.valueOf(opt));
       }
   
       /** 
  @@ -182,19 +192,24 @@
        * @return Values of the argument if option is set, and has an argument,
        * otherwise null.
        */
  -    public String[] getOptionValues( String opt ) {
  +    public String[] getOptionValues(String opt)
  +    {
           List values = new java.util.ArrayList();
   
  -        opt = Util.stripLeadingHyphens( opt );
  +        opt = Util.stripLeadingHyphens(opt);
   
           String key = opt;
  -        if( names.containsKey( opt ) ) {
  -            key = (String)names.get( opt );
  +
  +        if (names.containsKey(opt))
  +        {
  +            key = (String) names.get(opt);
           }
   
  -        if( options.containsKey( key ) ) {
  -            return ((Option)options.get(key)).getValues();
  +        if (options.containsKey(key))
  +        {
  +            return ((Option) options.get(key)).getValues();
           }
  +
           return null;
       }
   
  @@ -205,33 +220,39 @@
        * @return Values of the argument if option is set, and has an argument,
        * otherwise null.
        */
  -    public String[] getOptionValues( char opt ) {
  -        return getOptionValues( String.valueOf( opt ) );
  +    public String[] getOptionValues(char opt)
  +    {
  +        return getOptionValues(String.valueOf(opt));
       }
  -    
  +
       /** 
        * <p>Retrieve the argument, if any, of an option.</p>
        *
        * @param opt name of the option
  -     * @param defaultValue is the default value to be returned if the option is not specified
  +     * @param defaultValue is the default value to be returned if the option 
  +     * is not specified
        * @return Value of the argument if option is set, and has an argument,
        * otherwise <code>defaultValue</code>.
        */
  -    public String getOptionValue( String opt, String defaultValue ) {
  -        String answer = getOptionValue( opt );
  -        return ( answer != null ) ? answer : defaultValue;
  +    public String getOptionValue(String opt, String defaultValue)
  +    {
  +        String answer = getOptionValue(opt);
  +
  +        return (answer != null) ? answer : defaultValue;
       }
  -    
  +
       /** 
        * <p>Retrieve the argument, if any, of an option.</p>
        *
        * @param opt character name of the option
  -     * @param defaultValue is the default value to be returned if the option is not specified
  +     * @param defaultValue is the default value to be returned if the option 
  +     * is not specified
        * @return Value of the argument if option is set, and has an argument,
        * otherwise <code>defaultValue</code>.
        */
  -    public String getOptionValue( char opt, String defaultValue ) {
  -        return getOptionValue( String.valueOf( opt ), defaultValue );
  +    public String getOptionValue(char opt, String defaultValue)
  +    {
  +        return getOptionValue(String.valueOf(opt), defaultValue);
       }
   
       /** 
  @@ -239,21 +260,25 @@
        *
        * @return remaining items passed in but not parsed as an array
        */
  -    public String[] getArgs() {
  -        String[] answer = new String[ args.size() ];
  -        args.toArray( answer );
  +    public String[] getArgs()
  +    {
  +        String[] answer = new String[args.size()];
  +
  +        args.toArray(answer);
  +
           return answer;
       }
  -    
  +
       /** 
        * <p>Retrieve any left-over non-recognized options and arguments</p>
        *
        * @return remaining items passed in but not parsed as a <code>List</code>.
        */
  -    public List getArgList() {
  +    public List getArgList()
  +    {
           return args;
       }
  -    
  +
       /** 
        * jkeyes
        * - commented out until it is implemented properly
  @@ -261,16 +286,17 @@
        *
        * @return Stringified form of this object
        */
  +
       /*
       public String toString() {
           StringBuffer buf = new StringBuffer();
  -        
  -        buf.append( "[ CommandLine: [ options: " );
  -        buf.append( options.toString() );
  -        buf.append( " ] [ args: ");
  -        buf.append( args.toString() );
  -        buf.append( " ] ]" );
  -        
  +            
  +        buf.append("[ CommandLine: [ options: ");
  +        buf.append(options.toString());
  +        buf.append(" ] [ args: ");
  +        buf.append(args.toString());
  +        buf.append(" ] ]");
  +            
           return buf.toString();
       }
       */
  @@ -280,28 +306,33 @@
        *
        * @param arg the unrecognised option/argument.
        */
  -    void addArg(String arg) {
  -        args.add( arg );
  +    void addArg(String arg)
  +    {
  +        args.add(arg);
       }
  -        
  +
       /**
        * <p>Add an option to the command line.  The values of 
        * the option are stored.</p>
        *
        * @param opt the processed option
        */
  -    void addOption( Option opt ) {
  -        hashcodeMap.put( new Integer( opt.hashCode() ), opt );
  +    void addOption(Option opt)
  +    {
  +        hashcodeMap.put(new Integer(opt.hashCode()), opt);
   
           String key = opt.getKey();
  -        if( key == null ) {
  +
  +        if (key == null)
  +        {
               key = opt.getLongOpt();
           }
  -        else {
  -            names.put( opt.getLongOpt(), key );
  +        else
  +        {
  +            names.put(opt.getLongOpt(), key);
           }
   
  -        options.put( key, opt );
  +        options.put(key, opt);
       }
   
       /**
  @@ -310,7 +341,8 @@
        * @return an <code>Iterator</code> over the processed {@link Option} 
        * members of this {@link CommandLine}
        */
  -    public Iterator iterator( ) {
  +    public Iterator iterator()
  +    {
           return hashcodeMap.values().iterator();
       }
   
  @@ -319,14 +351,15 @@
        *
        * @return an array of the processed {@link Option}s.
        */
  -    public Option[] getOptions( ) {
  +    public Option[] getOptions()
  +    {
           Collection processed = options.values();
   
  +
           // reinitialise array
  -        optionsArray = new Option[ processed.size() ];
  +        optionsArray = new Option[processed.size()];
   
           // return the array
  -        return (Option[]) processed.toArray( optionsArray );
  +        return (Option[]) processed.toArray(optionsArray);
       }
  -
  -}
  +}
  \ No newline at end of file
  
  
  
  1.6       +15 -12    jakarta-commons/cli/src/java/org/apache/commons/cli/CommandLineParser.java
  
  Index: CommandLineParser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/CommandLineParser.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- CommandLineParser.java	18 Nov 2002 08:41:26 -0000	1.5
  +++ CommandLineParser.java	9 Dec 2002 23:47:24 -0000	1.6
  @@ -70,7 +70,7 @@
    * @author John Keyes (john at integralsource.com)
    */
   public interface CommandLineParser {
  -    
  +
       /**
        * Parse the arguments according to the specified options.
        *
  @@ -81,8 +81,8 @@
        * @throws ParseException if there are any problems encountered
        * while parsing the command line tokens.
        */
  -    public CommandLine parse( Options options, String[] arguments )
  -    throws ParseException;
  +    CommandLine parse(Options options, String[] arguments)
  +               throws ParseException;
   
       /**
        * Parse the arguments according to the specified options and
  @@ -96,8 +96,9 @@
        * @throws ParseException if there are any problems encountered
        * while parsing the command line tokens.
        */
  -    public CommandLine parse( Options options, String[] arguments, Properties props )
  -    throws ParseException;
  +    CommandLine parse(Options options, String[] arguments, 
  +                      Properties properties)
  +               throws ParseException;
   
       /**
        * Parse the arguments according to the specified options.
  @@ -111,8 +112,9 @@
        * @throws ParseException if there are any problems encountered
        * while parsing the command line tokens.
        */
  -    public CommandLine parse( Options options, String[] arguments, boolean stopAtNonOption )
  -    throws ParseException;
  +    CommandLine parse(Options options, String[] arguments, 
  +                      boolean stopAtNonOption)
  +               throws ParseException;
   
       /**
        * Parse the arguments according to the specified options and
  @@ -127,6 +129,7 @@
        * @throws ParseException if there are any problems encountered
        * while parsing the command line tokens.
        */
  -    public CommandLine parse( Options options, String[] arguments, Properties properties, boolean stopAtNonOption)
  -    throws ParseException;
  +    CommandLine parse(Options options, String[] arguments, 
  +                      Properties properties, boolean stopAtNonOption)
  +               throws ParseException;
   }
  
  
  
  1.11      +90 -59    jakarta-commons/cli/src/java/org/apache/commons/cli/GnuParser.java
  
  Index: GnuParser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/GnuParser.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- GnuParser.java	19 Sep 2002 22:59:43 -0000	1.10
  +++ GnuParser.java	9 Dec 2002 23:47:24 -0000	1.11
  @@ -60,10 +60,7 @@
    */
   package org.apache.commons.cli;
   
  -import java.util.Arrays;
   import java.util.ArrayList;
  -import java.util.Collection;
  -import java.util.Iterator;
   
   /**
    * The class GnuParser provides an implementation of the 
  @@ -82,7 +79,8 @@
        * <p>Resets the members to their original state i.e. remove
        * all of <code>tokens</code> entries.
        */
  -    private void init() {
  +    private void init()
  +    {
           tokens.clear();
       }
   
  @@ -98,90 +96,123 @@
        *  </li>
        * </ol>
        * </p>
  +     *
  +     * @param options The Options to parse the arguments by.
  +     * @param arguments The arguments that have to be flattened.
  +     * @param stopAtNonOption specifies whether to stop 
  +     * flattening when a non option has been encountered
  +     * @return a String array of the flattened arguments
        */
  -    protected String[] flatten( Options options, 
  -                                String[] arguments, 
  -                                boolean stopAtNonOption )
  +    protected String[] flatten(Options options, String[] arguments, 
  +                               boolean stopAtNonOption)
       {
           init();
  +
           boolean eatTheRest = false;
           Option currentOption = null;
   
  -        for( int i = 0; i < arguments.length; i++ ) {
  -            if( "--".equals( arguments[i] ) ) {
  +        for (int i = 0; i < arguments.length; i++)
  +        {
  +            if ("--".equals(arguments[i]))
  +            {
                   eatTheRest = true;
  -                tokens.add( "--" );
  +                tokens.add("--");
               }
  -            else if ( "-".equals( arguments[i] ) ) {
  -                tokens.add( "-" );
  +            else if ("-".equals(arguments[i]))
  +            {
  +                tokens.add("-");
               }
  -            else if( arguments[i].startsWith( "-" ) ) {
  -                Option option = options.getOption( arguments[i] );
  +            else if (arguments[i].startsWith("-"))
  +            {
  +                Option option = options.getOption(arguments[i]);
   
                   // this is not an Option
  -                if( option == null ) {
  +                if (option == null)
  +                {
                       // handle special properties Option
  -                    Option specialOption = options.getOption( arguments[i].substring(0,2) );
  -                    if( specialOption != null ) {
  -                        tokens.add( arguments[i].substring(0,2) );
  -                        tokens.add( arguments[i].substring(2) );
  +                    Option specialOption = 
  +                            options.getOption(arguments[i].substring(0, 2));
  +
  +                    if (specialOption != null)
  +                    {
  +                        tokens.add(arguments[i].substring(0, 2));
  +                        tokens.add(arguments[i].substring(2));
                       }
  -                    else if( stopAtNonOption ) {
  +                    else if (stopAtNonOption)
  +                    {
                           eatTheRest = true;
  -                        tokens.add( arguments[i] );
  +                        tokens.add(arguments[i]);
                       }
  -                    else {
  -                        tokens.add( arguments[i] );
  +                    else
  +                    {
  +                        tokens.add(arguments[i]);
                       }
                   }
  -                else {
  +                else
  +                {
                       currentOption = option;
  +
                       // special option
  -                    Option specialOption = options.getOption( arguments[i].substring(0,2) );
  -                    if( specialOption != null && option == null ) {
  -                        tokens.add( arguments[i].substring(0,2) );
  -                        tokens.add( arguments[i].substring(2) );
  -                    }
  -                    else if( currentOption != null && currentOption.hasArg() ) {
  -                        if( currentOption.hasArg() ) {
  -                            tokens.add( arguments[i] );
  -                            currentOption= null;
  +                    Option specialOption = 
  +                            options.getOption(arguments[i].substring(0, 2));
  +
  +                    if ((specialOption != null) && (option == null))
  +                    {
  +                        tokens.add(arguments[i].substring(0, 2));
  +                        tokens.add(arguments[i].substring(2));
  +                    }
  +                    else if ((currentOption != null) && currentOption.hasArg())
  +                    {
  +                        if (currentOption.hasArg())
  +                        {
  +                            tokens.add(arguments[i]);
  +                            currentOption = null;
                           }
  -                        else if ( currentOption.hasArgs() ) {
  -                            tokens.add( arguments[i] );
  +                        else if (currentOption.hasArgs())
  +                        {
  +                            tokens.add(arguments[i]);
                           }
  -                        else if ( stopAtNonOption ) {
  +                        else if (stopAtNonOption)
  +                        {
                               eatTheRest = true;
  -                            tokens.add( "--" );
  -                            tokens.add( arguments[i] );
  +                            tokens.add("--");
  +                            tokens.add(arguments[i]);
                           }
  -                        else {
  -                            tokens.add( arguments[i] );
  +                        else
  +                        {
  +                            tokens.add(arguments[i]);
                           }
  -                    } 
  -                    else if (currentOption != null ) {
  -                        tokens.add( arguments[i] );
  -                    } 
  -                    else if ( stopAtNonOption ) {
  +                    }
  +                    else if (currentOption != null)
  +                    {
  +                        tokens.add(arguments[i]);
  +                    }
  +                    else if (stopAtNonOption)
  +                    {
                           eatTheRest = true;
  -                        tokens.add( "--" );
  -                        tokens.add( arguments[i] );
  +                        tokens.add("--");
  +                        tokens.add(arguments[i]);
                       }
  -                    else {
  -                        tokens.add( arguments[i] );
  +                    else
  +                    {
  +                        tokens.add(arguments[i]);
                       }
                   }
               }
  -            else {
  -                tokens.add( arguments[i] );
  +            else
  +            {
  +                tokens.add(arguments[i]);
               }
   
  -            if( eatTheRest ) {
  -                for( i++; i < arguments.length; i++ ) {
  -                    tokens.add( arguments[i] );
  +            if (eatTheRest)
  +            {
  +                for (i++; i < arguments.length; i++)
  +                {
  +                    tokens.add(arguments[i]);
                   }
               }
           }
  -        return (String[])tokens.toArray( new String[] {} );
  +
  +        return (String[]) tokens.toArray(new String[] {  });
       }
   }
  
  
  
  1.12      +875 -479  jakarta-commons/cli/src/java/org/apache/commons/cli/HelpFormatter.java
  
  Index: HelpFormatter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/HelpFormatter.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- HelpFormatter.java	19 Nov 2002 22:50:19 -0000	1.11
  +++ HelpFormatter.java	9 Dec 2002 23:47:24 -0000	1.12
  @@ -58,10 +58,10 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   import java.io.PrintWriter;
  +
   import java.util.ArrayList;
   import java.util.Collection;
   import java.util.Collections;
  @@ -75,503 +75,899 @@
    * @author Slawek Zachcial
    * @author John Keyes (john at integralsource.com)
    **/
  -public class HelpFormatter
  -{
  -   // --------------------------------------------------------------- Constants
  -
  -   public static final int DEFAULT_WIDTH              = 74;
  -   public static final int DEFAULT_LEFT_PAD           = 1;
  -   public static final int DEFAULT_DESC_PAD           = 3;
  -   public static final String DEFAULT_SYNTAX_PREFIX   = "usage: ";
  -   public static final String DEFAULT_OPT_PREFIX      = "-";
  -   public static final String DEFAULT_LONG_OPT_PREFIX = "--";
  -   public static final String DEFAULT_ARG_NAME        = "arg";
  -
  -   // ------------------------------------------------------------------ Static
  -
  -   // -------------------------------------------------------------- Attributes
  -
  -   public int defaultWidth;
  -   public int defaultLeftPad;
  -   public int defaultDescPad;
  -   public String defaultSyntaxPrefix;
  -   public String defaultNewLine;
  -   public String defaultOptPrefix;
  -   public String defaultLongOptPrefix;
  -   public String defaultArgName;
  -
  -   // ------------------------------------------------------------ Constructors
  -   public HelpFormatter()
  -   {
  -      defaultWidth = DEFAULT_WIDTH;
  -      defaultLeftPad = DEFAULT_LEFT_PAD;
  -      defaultDescPad = DEFAULT_DESC_PAD;
  -      defaultSyntaxPrefix = DEFAULT_SYNTAX_PREFIX;
  -      defaultNewLine = System.getProperty("line.separator");
  -      defaultOptPrefix = DEFAULT_OPT_PREFIX;
  -      defaultLongOptPrefix = DEFAULT_LONG_OPT_PREFIX;
  -      defaultArgName = DEFAULT_ARG_NAME;
  -   }
  -
  -   // ------------------------------------------------------------------ Public
  -
  -   public void printHelp( String cmdLineSyntax,
  -                          Options options )
  -   {
  -       printHelp( defaultWidth, cmdLineSyntax, null, options, null, false );
  -   }
  -
  -   public void printHelp( String cmdLineSyntax,
  -                          Options options,
  -                          boolean autoUsage )
  -   {
  -       printHelp( defaultWidth, cmdLineSyntax, null, options, null, autoUsage );
  -   }
  -
  -   public void printHelp( String cmdLineSyntax,
  -                          String header,
  -                          Options options,
  -                          String footer )
  -   {
  -       printHelp( cmdLineSyntax, header, options, footer, false );
  -   }
  -
  -   public void printHelp( String cmdLineSyntax,
  -                          String header,
  -                          Options options,
  -                          String footer,
  -                          boolean autoUsage )
  -   {
  -      printHelp(defaultWidth, cmdLineSyntax, header, options, footer, autoUsage );
  -   }
  -   
  -   public void printHelp( int width,
  -                          String cmdLineSyntax,
  -                          String header,
  -                          Options options,
  -                          String footer )
  -   {
  -       printHelp( width, cmdLineSyntax, header, options, footer, false );
  -   }
  -
  -   public void printHelp( int width,
  -                          String cmdLineSyntax,
  -                          String header,
  -                          Options options,
  -                          String footer,
  -                          boolean autoUsage )
  -   {
  -      PrintWriter pw = new PrintWriter(System.out);
  -      printHelp( pw, width, cmdLineSyntax, header,
  -                 options, defaultLeftPad, defaultDescPad, footer, autoUsage );
  -      pw.flush();
  -   }
  -   public void printHelp( PrintWriter pw,
  -                          int width,
  -                          String cmdLineSyntax,
  -                          String header,
  -                          Options options,
  -                          int leftPad,
  -                          int descPad,
  -                          String footer )
  -   throws IllegalArgumentException
  -   {
  -       printHelp( pw, width, cmdLineSyntax, header, options, leftPad, descPad, footer, false );
  -   }
  -
  -   public void printHelp( PrintWriter pw,
  -                          int width,
  -                          String cmdLineSyntax,
  -                          String header,
  -                          Options options,
  -                          int leftPad,
  -                          int descPad,
  -                          String footer,
  -                          boolean autoUsage )
  -      throws IllegalArgumentException
  -   {
  -      if ( cmdLineSyntax == null || cmdLineSyntax.length() == 0 )
  -      {
  -         throw new IllegalArgumentException("cmdLineSyntax not provided");
  -      }
  -
  -      if ( autoUsage ) {
  -          printUsage( pw, width, cmdLineSyntax, options );
  -      }
  -      else {
  -          printUsage( pw, width, cmdLineSyntax );
  -      }
  -
  -      if ( header != null && header.trim().length() > 0 )
  -      {
  -         printWrapped( pw, width, header );
  -      }
  -      printOptions( pw, width, options, leftPad, descPad );
  -      if ( footer != null && footer.trim().length() > 0 )
  -      {
  -         printWrapped( pw, width, footer );
  -      }
  -   }
  -
  -   /**
  -    * <p>Prints the usage statement for the specified application.</p>
  -    *
  -    * @param pw The PrintWriter to print the usage statement 
  -    * @param width ??
  -    * @param appName The application name
  -    * @param options The command line Options
  -    * @see #appendOptionGroup(StringBuffer,OptionGroup)
  -    * @see #appendOption(StringBuffer,Option,boolean)
  -    *
  -    */
  -   public void printUsage( PrintWriter pw, int width, String app, Options options ) 
  -   {
  -       // initialise the string buffer
  -       StringBuffer buff = new StringBuffer( defaultSyntaxPrefix ).append( app ).append( " " );
  -       
  -       // create a list for processed option groups
  -       final Collection processedGroups = new ArrayList();
  -
  -       // temp variable
  -       Option option;
  -       
  -       // iterate over the options
  -       for ( Iterator i = options.getOptions().iterator(); i.hasNext(); )
  -       {
  -           // get the next Option
  -           option = (Option) i.next();
  -
  -           // check if the option is part of an OptionGroup
  -           OptionGroup group = options.getOptionGroup( option );
  -
  -           // if the option is part of a group 
  -           if( group != null) {
  -               // and if the group has not already been processed
  -               if( !processedGroups.contains(group) ) {
  -                   // add the group to the processed list
  -                   processedGroups.add( group );
  -                   // add the usage clause
  -                   appendOptionGroup( buff, group );
  -               }
  -               // otherwise the option was displayed in the group
  -               // previously so ignore it.
  -           }
  -           // if the Option is not part of an OptionGroup
  -           else {
  -               appendOption( buff, option, option.isRequired() );
  -           }
  -           
  -           if( i.hasNext() ){
  -               buff.append( " " );
  -           }
  -       }
  -
  -       // call printWrapped
  -       printWrapped( pw, width, buff.toString().indexOf(' ')+1,
  -                     buff.toString() );
  -   }
  -   
  -   /**
  -    * Appends the usage clause for an OptionGroup to a StringBuffer.  
  -    * The clause is wrapped in square brackets if the group is required.
  -    * The display of the options is handled by appendOption
  -    * @param buff the StringBuffer to append to
  -    * @param group the group to append
  -    * @see #appendOption(StringBuffer,Option,boolean)
  -    */
  -   private static void appendOptionGroup( final StringBuffer buff, final OptionGroup group )
  -   {
  -       if( !group.isRequired() ) {
  -           buff.append( "[" ); 
  -       }
  -
  -       // for each option in the OptionGroup
  -       for( Iterator i = group.getOptions().iterator(); i.hasNext(); ) {
  -           // whether the option is required or not is handled at group level
  -           appendOption( buff, (Option)i.next(), true);
  -           if( i.hasNext() ) {
  -               buff.append( " | " );
  -           }
  -       }
  -       
  -       if( !group.isRequired() ) {
  -           buff.append( "]" ); 
  -       }
  -   }
  -   
  -   /**
  -    * Appends the usage clause for an Option to a StringBuffer.  
  -    * The clause is wrapped in square brackets if the group is required.
  -    * The display of the options is handled by appendOption
  -    * @param buff the StringBuffer to append to
  -    * @param group the group to append
  -    * @see #appendOption(StringBuffer,Option,boolean)
  -    */
  -   private static void appendOption( final StringBuffer buff, final Option option, final boolean required)
  -   {
  -       if( !required ) {
  -           buff.append( "[" );
  -       }
  -
  -       if( option.getOpt() != null ) {
  -           buff.append( "-" ).append( option.getOpt() );
  -       }
  -       else {
  -           buff.append( "--" ).append( option.getLongOpt() );
  -       }
  -
  -       // if the Option has a value
  -       if( option.hasArg() && option.getArgName() != null ) {
  -           buff.append( " <" ).append( option.getArgName() ).append( ">" );
  -       }
  -
  -       // if the Option is not a required option
  -       if( !required ) {
  -           buff.append( "]" );
  -       }
  -   }
  -       
  -
  -   public void printUsage( PrintWriter pw, int width, String cmdLineSyntax )
  -   {
  -      int argPos = cmdLineSyntax.indexOf(' ') + 1;
  -      printWrapped(pw, width, defaultSyntaxPrefix.length() + argPos,
  -                   defaultSyntaxPrefix + cmdLineSyntax);
  -   }
  -
  -   public void printOptions( PrintWriter pw, int width, Options options, int leftPad, int descPad )
  -   {
  -      StringBuffer sb = new StringBuffer();
  -      renderOptions(sb, width, options, leftPad, descPad);
  -      pw.println(sb.toString());
  -   }
  -
  -   public void printWrapped( PrintWriter pw, int width, String text )
  -   {
  -      printWrapped(pw, width, 0, text);
  -   }
  -
  -   public void printWrapped( PrintWriter pw, int width, int nextLineTabStop, String text )
  -   {
  -      StringBuffer sb = new StringBuffer(text.length());
  -      renderWrappedText(sb, width, nextLineTabStop, text);
  -      pw.println(sb.toString());
  -   }
  -
  -   // --------------------------------------------------------------- Protected
  -
  -   protected StringBuffer renderOptions( StringBuffer sb,
  -                                         int width,
  -                                         Options options,
  -                                         int leftPad,
  -                                         int descPad )
  -   {
  -      final String lpad = createPadding(leftPad);
  -      final String dpad = createPadding(descPad);
  -
  -      //first create list containing only <lpad>-a,--aaa where -a is opt and --aaa is
  -      //long opt; in parallel look for the longest opt string
  -      //this list will be then used to sort options ascending
  -      int max = 0;
  -      StringBuffer optBuf;
  -      List prefixList = new ArrayList();
  -      Option option;
  -      List optList = options.helpOptions();
  -      Collections.sort( optList, new StringBufferComparator() );
  -      for ( Iterator i = optList.iterator(); i.hasNext(); )
  -      {
  -         option = (Option) i.next();
  -         optBuf = new StringBuffer(8);
  -
  -         if ( option.getOpt() == null )
  -         {
  -             optBuf.append(lpad).append("   " + defaultLongOptPrefix).append(option.getLongOpt());
  -         }
  -         else
  -         {
  -             optBuf.append(lpad).append(defaultOptPrefix).append(option.getOpt());
  -             if ( option.hasLongOpt() )
  -             {
  -                optBuf.append(',').append(defaultLongOptPrefix).append(option.getLongOpt());
  -             }
  -
  -         }
  -
  -         if( option.hasArg() ) {
  -             if( option.hasArgName() ) {
  -                 optBuf.append(" <").append( option.getArgName() ).append( ">" );
  -             }
  -             else {
  -                 optBuf.append(' ');
  -             }
  -         }
  -
  -         prefixList.add(optBuf);
  -         max = optBuf.length() > max ? optBuf.length() : max;
  -      }
  -      int x = 0;
  -      for ( Iterator i = optList.iterator(); i.hasNext(); )
  -      {
  -         option = (Option) i.next();
  -         optBuf = new StringBuffer( prefixList.get( x++ ).toString() );
  -
  -         if ( optBuf.length() < max )
  -         {
  -             optBuf.append(createPadding(max - optBuf.length()));
  -         }
  -         optBuf.append( dpad );
  -         
  -         int nextLineTabStop = max + descPad;
  -
  -         if( option.getDescription() != null ) {
  -             optBuf.append( option.getDescription() );
  -         }
  -         renderWrappedText(sb, width, nextLineTabStop,
  -                           optBuf.toString());
  -         if ( i.hasNext() )
  -         {
  -             sb.append(defaultNewLine);
  -         }
  -      }
  -
  -      return sb;
  -   }
  -
  -   protected StringBuffer renderWrappedText( StringBuffer sb,
  -                                             int width,
  -                                             int nextLineTabStop,
  -                                             String text )
  -   {
  -      int pos = findWrapPos( text, width, 0);
  -      if ( pos == -1 )
  -      {
  -         sb.append(rtrim(text));
  -         return sb;
  -      }
  -      else
  -      {
  -         sb.append(rtrim(text.substring(0, pos))).append(defaultNewLine);
  -      }
  -
  -      //all following lines must be padded with nextLineTabStop space characters
  -      final String padding = createPadding(nextLineTabStop);
  -
  -      while ( true )
  -      {
  -         text = padding + text.substring(pos).trim();
  -         pos = findWrapPos( text, width, nextLineTabStop );
  -         if ( pos == -1 )
  -         {
  -            sb.append(text);
  +public class HelpFormatter {
  +    // --------------------------------------------------------------- Constants
  +
  +    /** default number of characters per line */
  +    public static final int DEFAULT_WIDTH = 74;
  +
  +    /** default padding to the left of each line */
  +    public static final int DEFAULT_LEFT_PAD = 1;
  +
  +    /** ?? */
  +    public static final int DEFAULT_DESC_PAD = 3;
  +
  +    /** the string to display at the begining of the usage statement */
  +    public static final String DEFAULT_SYNTAX_PREFIX = "usage: ";
  +
  +    /** default prefix for shortOpts */
  +    public static final String DEFAULT_OPT_PREFIX = "-";
  +
  +    /** default prefix for long Option */
  +    public static final String DEFAULT_LONG_OPT_PREFIX = "--";
  +
  +    /** default name for an argument */
  +    public static final String DEFAULT_ARG_NAME = "arg";
  +
  +    // -------------------------------------------------------------- Attributes
  +
  +    /** number of characters per line */
  +    private int defaultWidth = DEFAULT_WIDTH;
  +
  +    /** amount of padding to the left of each line */
  +    private int defaultLeftPad = DEFAULT_LEFT_PAD;
  +
  +    /** ?? */
  +    private int defaultDescPad = DEFAULT_DESC_PAD;
  +
  +    /** the string to display at the begining of the usage statement */
  +    private String defaultSyntaxPrefix = DEFAULT_SYNTAX_PREFIX;
  +
  +    /** the new line character/string ?? */
  +    private String defaultNewLine = System.getProperty("line.separator");
  +
  +    /** the shortOpt prefix */
  +    private String defaultOptPrefix = DEFAULT_OPT_PREFIX;
  +
  +    /** the long Opt prefix */
  +    private String defaultLongOptPrefix = DEFAULT_LONG_OPT_PREFIX;
  +
  +    /** the name of the argument */
  +    private String defaultArgName = DEFAULT_ARG_NAME;
  +
  +    /**
  +     * Sets the 'width'.
  +     *
  +     * @param width the new value of 'width'
  +     */
  +    public void setWidth(int width)
  +    {
  +        this.defaultWidth = width;
  +    }
  +
  +    /**
  +     * Returns the 'width'.
  +     *
  +     * @return the 'width'
  +     */
  +    public int getWidth()
  +    {
  +        return this.defaultWidth;
  +    }
  +
  +    /**
  +     * Sets the 'leftPadding'.
  +     *
  +     * @param padding the new value of 'leftPadding'
  +     */
  +    public void setLeftPadding(int padding)
  +    {
  +        this.defaultLeftPad = padding;
  +    }
  +
  +    /**
  +     * Returns the 'leftPadding'.
  +     *
  +     * @return the 'leftPadding'
  +     */
  +    public int getLeftPadding()
  +    {
  +        return this.defaultLeftPad;
  +    }
  +
  +    /**
  +     * Sets the 'descPadding'.
  +     *
  +     * @param padding the new value of 'descPadding'
  +     */
  +    public void setDescPadding(int padding)
  +    {
  +        this.defaultDescPad = padding;
  +    }
  +
  +    /**
  +     * Returns the 'descPadding'.
  +     *
  +     * @return the 'descPadding'
  +     */
  +    public int getDescPadding()
  +    {
  +        return this.defaultDescPad;
  +    }
  +
  +    /**
  +     * Sets the 'syntaxPrefix'.
  +     *
  +     * @param prefix the new value of 'syntaxPrefix'
  +     */
  +    public void setSyntaxPrefix(String prefix)
  +    {
  +        this.defaultSyntaxPrefix = prefix;
  +    }
  +
  +    /**
  +     * Returns the 'syntaxPrefix'.
  +     *
  +     * @return the 'syntaxPrefix'
  +     */
  +    public String getSyntaxPrefix()
  +    {
  +        return this.defaultSyntaxPrefix;
  +    }
  +
  +    /**
  +     * Sets the 'newLine'.
  +     *
  +     * @param newline the new value of 'newLine'
  +     */
  +    public void setNewLine(String newline)
  +    {
  +        this.defaultNewLine = newline;
  +    }
  +
  +    /**
  +     * Returns the 'newLine'.
  +     *
  +     * @return the 'newLine'
  +     */
  +    public String getNewLine()
  +    {
  +        return this.defaultNewLine;
  +    }
  +
  +    /**
  +     * Sets the 'optPrefix'.
  +     *
  +     * @param prefix the new value of 'optPrefix'
  +     */
  +    public void setOptPrefix(String prefix)
  +    {
  +        this.defaultOptPrefix = prefix;
  +    }
  +
  +    /**
  +     * Returns the 'optPrefix'.
  +     *
  +     * @return the 'optPrefix'
  +     */
  +    public String getOptPrefix()
  +    {
  +        return this.defaultOptPrefix;
  +    }
  +
  +    /**
  +     * Sets the 'longOptPrefix'.
  +     *
  +     * @param prefix the new value of 'longOptPrefix'
  +     */
  +    public void setLongOptPrefix(String prefix)
  +    {
  +        this.defaultLongOptPrefix = prefix;
  +    }
  +
  +    /**
  +     * Returns the 'longOptPrefix'.
  +     *
  +     * @return the 'longOptPrefix'
  +     */
  +    public String getLongOptPrefix()
  +    {
  +        return this.defaultLongOptPrefix;
  +    }
  +
  +    /**
  +     * Sets the 'argName'.
  +     *
  +     * @param name the new value of 'argName'
  +     */
  +    public void setArgName(String name)
  +    {
  +        this.defaultArgName = name;
  +    }
  +
  +    /**
  +     * Returns the 'argName'.
  +     *
  +     * @return the 'argName'
  +     */
  +    public String getArgName()
  +    {
  +        return this.defaultArgName;
  +    }
  +
  +
  +    // ------------------------------------------------------------------ Public
  +
  +    /**
  +     * <p>Print the help for <code>options</code> with the specified
  +     * command line syntax.</p>
  +     *
  +     * @param cmdLineSyntax the syntax for this application
  +     * @param options the Options instance
  +     */
  +    public void printHelp(String cmdLineSyntax, Options options)
  +    {
  +        printHelp(defaultWidth, cmdLineSyntax, null, options, null, false);
  +    }
  +
  +    /**
  +     * <p>Print the help for <code>options</code> with the specified
  +     * command line syntax.</p>
  +     *
  +     * @param cmdLineSyntax the syntax for this application
  +     * @param options the Options instance
  +     * @param autoUsage whether to print an automatically generated 
  +     * usage statement
  +     */
  +    public void printHelp(String cmdLineSyntax, Options options, 
  +                          boolean autoUsage)
  +    {
  +        printHelp(defaultWidth, cmdLineSyntax, null, options, null, autoUsage);
  +    }
  +
  +    /**
  +     * <p>Print the help for <code>options</code> with the specified
  +     * command line syntax.</p>
  +     *
  +     * @param cmdLineSyntax the syntax for this application
  +     * @param header the banner to display at the begining of the help
  +     * @param options the Options instance
  +     * @param footer the banner to display at the end of the help
  +     */
  +    public void printHelp(String cmdLineSyntax, String header, Options options, 
  +                          String footer)
  +    {
  +        printHelp(cmdLineSyntax, header, options, footer, false);
  +    }
  +
  +    /**
  +     * <p>Print the help for <code>options</code> with the specified
  +     * command line syntax.</p>
  +     *
  +     * @param cmdLineSyntax the syntax for this application
  +     * @param header the banner to display at the begining of the help
  +     * @param options the Options instance
  +     * @param footer the banner to display at the end of the help
  +     * @param autoUsage whether to print an automatically generated 
  +     * usage statement
  +     */
  +    public void printHelp(String cmdLineSyntax, String header, Options options, 
  +                          String footer, boolean autoUsage)
  +    {
  +        printHelp(defaultWidth, cmdLineSyntax, header, options, footer, 
  +                  autoUsage);
  +    }
  +
  +    /**
  +     * <p>Print the help for <code>options</code> with the specified
  +     * command line syntax.</p>
  +     *
  +     * @param width the number of characters to be displayed on each line
  +     * @param cmdLineSyntax the syntax for this application
  +     * @param header the banner to display at the begining of the help
  +     * @param options the Options instance
  +     * @param footer the banner to display at the end of the help
  +     */
  +    public void printHelp(int width, String cmdLineSyntax, String header, 
  +                          Options options, String footer)
  +    {
  +        printHelp(width, cmdLineSyntax, header, options, footer, false);
  +    }
  +
  +    /**
  +     * <p>Print the help for <code>options</code> with the specified
  +     * command line syntax.</p>
  +     *
  +     * @param width the number of characters to be displayed on each line
  +     * @param cmdLineSyntax the syntax for this application
  +     * @param header the banner to display at the begining of the help
  +     * @param options the Options instance
  +     * @param footer the banner to display at the end of the help
  +     * @param autoUsage whether to print an automatically generated 
  +     * usage statement
  +     */
  +    public void printHelp(int width, String cmdLineSyntax, String header, 
  +                          Options options, String footer, boolean autoUsage)
  +    {
  +        PrintWriter pw = new PrintWriter(System.out);
  +
  +        printHelp(pw, width, cmdLineSyntax, header, options, defaultLeftPad, 
  +                  defaultDescPad, footer, autoUsage);
  +        pw.flush();
  +    }
  +
  +    /**
  +     * <p>Print the help for <code>options</code> with the specified
  +     * command line syntax.</p>
  +     *
  +     * @param pw the writer to which the help will be written
  +     * @param width the number of characters to be displayed on each line
  +     * @param cmdLineSyntax the syntax for this application
  +     * @param header the banner to display at the begining of the help
  +     * @param options the Options instance
  +     * @param leftPad the number of characters of padding to be prefixed
  +     * to each line
  +     * @param descPad the number of characters of padding to be prefixed
  +     * to each description line
  +     * @param footer the banner to display at the end of the help
  +     */
  +    public void printHelp(PrintWriter pw, int width, String cmdLineSyntax, 
  +                          String header, Options options, int leftPad, 
  +                          int descPad, String footer)
  +    {
  +        printHelp(pw, width, cmdLineSyntax, header, options, leftPad, descPad, 
  +                  footer, false);
  +    }
  +
  +
  +    /**
  +     * <p>Print the help for <code>options</code> with the specified
  +     * command line syntax.</p>
  +     *
  +     * @param pw the writer to which the help will be written
  +     * @param width the number of characters to be displayed on each line
  +     * @param cmdLineSyntax the syntax for this application
  +     * @param header the banner to display at the begining of the help
  +     * @param options the Options instance
  +     * @param leftPad the number of characters of padding to be prefixed
  +     * to each line
  +     * @param descPad the number of characters of padding to be prefixed
  +     * to each description line
  +     * @param footer the banner to display at the end of the help
  +     * @param autoUsage whether to print an automatically generated 
  +     * usage statement
  +     */
  +    public void printHelp(PrintWriter pw, int width, String cmdLineSyntax, 
  +                          String header, Options options, int leftPad, 
  +                          int descPad, String footer, boolean autoUsage)
  +    {
  +        if ((cmdLineSyntax == null) || (cmdLineSyntax.length() == 0))
  +        {
  +            throw new IllegalArgumentException("cmdLineSyntax not provided");
  +        }
  +
  +        if (autoUsage)
  +        {
  +            printUsage(pw, width, cmdLineSyntax, options);
  +        }
  +        else
  +        {
  +            printUsage(pw, width, cmdLineSyntax);
  +        }
  +
  +        if ((header != null) && (header.trim().length() > 0))
  +        {
  +            printWrapped(pw, width, header);
  +        }
  +
  +        printOptions(pw, width, options, leftPad, descPad);
  +
  +        if ((footer != null) && (footer.trim().length() > 0))
  +        {
  +            printWrapped(pw, width, footer);
  +        }
  +    }
  +
  +    /**
  +     * <p>Prints the usage statement for the specified application.</p>
  +     *
  +     * @param pw The PrintWriter to print the usage statement 
  +     * @param width The number of characters to display per line
  +     * @param app The application name
  +     * @param options The command line Options
  +     *
  +     */
  +    public void printUsage(PrintWriter pw, int width, String app, 
  +                           Options options)
  +    {
  +        // initialise the string buffer
  +        StringBuffer buff = new StringBuffer(defaultSyntaxPrefix).append(app)
  +                                                                 .append(" ");
  +
  +        // create a list for processed option groups
  +        final Collection processedGroups = new ArrayList();
  +
  +        // temp variable
  +        Option option;
  +
  +        // iterate over the options
  +        for (Iterator i = options.getOptions().iterator(); i.hasNext();)
  +        {
  +            // get the next Option
  +            option = (Option) i.next();
  +
  +            // check if the option is part of an OptionGroup
  +            OptionGroup group = options.getOptionGroup(option);
  +
  +            // if the option is part of a group 
  +            if (group != null)
  +            {
  +                // and if the group has not already been processed
  +                if (!processedGroups.contains(group))
  +                {
  +                    // add the group to the processed list
  +                    processedGroups.add(group);
  +
  +
  +                    // add the usage clause
  +                    appendOptionGroup(buff, group);
  +                }
  +
  +                // otherwise the option was displayed in the group
  +                // previously so ignore it.
  +            }
  +
  +            // if the Option is not part of an OptionGroup
  +            else
  +            {
  +                appendOption(buff, option, option.isRequired());
  +            }
  +
  +            if (i.hasNext())
  +            {
  +                buff.append(" ");
  +            }
  +        }
  +
  +
  +        // call printWrapped
  +        printWrapped(pw, width, buff.toString().indexOf(' ') + 1, 
  +                     buff.toString());
  +    }
  +
  +    /**
  +     * Appends the usage clause for an OptionGroup to a StringBuffer.  
  +     * The clause is wrapped in square brackets if the group is required.
  +     * The display of the options is handled by appendOption
  +     * @param buff the StringBuffer to append to
  +     * @param group the group to append
  +     * @see #appendOption(StringBuffer,Option,boolean)
  +     */
  +    private static void appendOptionGroup(final StringBuffer buff, 
  +                                          final OptionGroup group)
  +    {
  +        if (!group.isRequired())
  +        {
  +            buff.append("[");
  +        }
  +
  +        // for each option in the OptionGroup
  +        for (Iterator i = group.getOptions().iterator(); i.hasNext();)
  +        {
  +            // whether the option is required or not is handled at group level
  +            appendOption(buff, (Option) i.next(), true);
  +
  +            if (i.hasNext())
  +            {
  +                buff.append(" | ");
  +            }
  +        }
  +
  +        if (!group.isRequired())
  +        {
  +            buff.append("]");
  +        }
  +    }
  +
  +    /**
  +     * Appends the usage clause for an Option to a StringBuffer.  
  +     *
  +     * @param buff the StringBuffer to append to
  +     * @param option the Option to append
  +     * @param required whether the Option is required or not
  +     */
  +    private static void appendOption(final StringBuffer buff, 
  +                                     final Option option, 
  +                                     final boolean required)
  +    {
  +        if (!required)
  +        {
  +            buff.append("[");
  +        }
  +
  +        if (option.getOpt() != null)
  +        {
  +            buff.append("-").append(option.getOpt());
  +        }
  +        else
  +        {
  +            buff.append("--").append(option.getLongOpt());
  +        }
  +
  +        // if the Option has a value
  +        if (option.hasArg() && (option.getArgName() != null))
  +        {
  +            buff.append(" <").append(option.getArgName()).append(">");
  +        }
  +
  +        // if the Option is not a required option
  +        if (!required)
  +        {
  +            buff.append("]");
  +        }
  +    }
  +
  +    /**
  +     * <p>Print the cmdLineSyntax to the specified writer, using the
  +     * specified width.</p>
  +     *
  +     * @param pw The printWriter to write the help to
  +     * @param width The number of characters per line for the usage statement.
  +     * @param cmdLineSyntax The usage statement.
  +     */
  +    public void printUsage(PrintWriter pw, int width, String cmdLineSyntax)
  +    {
  +        int argPos = cmdLineSyntax.indexOf(' ') + 1;
  +
  +        printWrapped(pw, width, defaultSyntaxPrefix.length() + argPos, 
  +                     defaultSyntaxPrefix + cmdLineSyntax);
  +    }
  +
  +    /**
  +     * <p>Print the help for the specified Options to the specified writer, 
  +     * using the specified width, left padding and description padding.</p>
  +     *
  +     * @param pw The printWriter to write the help to
  +     * @param width The number of characters to display per line
  +     * @param options The command line Options
  +     * @param leftPad the number of characters of padding to be prefixed
  +     * to each line
  +     * @param descPad the number of characters of padding to be prefixed
  +     * to each description line
  +     */
  +    public void printOptions(PrintWriter pw, int width, Options options, 
  +                             int leftPad, int descPad)
  +    {
  +        StringBuffer sb = new StringBuffer();
  +
  +        renderOptions(sb, width, options, leftPad, descPad);
  +        pw.println(sb.toString());
  +    }
  +
  +    /**
  +     * <p>Print the specified text to the specified PrintWriter.</p>
  +     *
  +     * @param pw The printWriter to write the help to
  +     * @param width The number of characters to display per line
  +     * @param text The text to be written to the PrintWriter
  +     */
  +    public void printWrapped(PrintWriter pw, int width, String text)
  +    {
  +        printWrapped(pw, width, 0, text);
  +    }
  +
  +    /**
  +     * <p>Print the specified text to the specified PrintWriter.</p>
  +     *
  +     * @param pw The printWriter to write the help to
  +     * @param width The number of characters to display per line
  +     * @param nextLineTabStop The position on the next line for the first tab.
  +     * @param text The text to be written to the PrintWriter
  +     */
  +    public void printWrapped(PrintWriter pw, int width, int nextLineTabStop, 
  +                             String text)
  +    {
  +        StringBuffer sb = new StringBuffer(text.length());
  +
  +        renderWrappedText(sb, width, nextLineTabStop, text);
  +        pw.println(sb.toString());
  +    }
  +
  +    // --------------------------------------------------------------- Protected
  +
  +    /**
  +     * <p>Render the specified Options and return the rendered Options
  +     * in a StringBuffer.</p>
  +     *
  +     * @param sb The StringBuffer to place the rendered Options into.
  +     * @param width The number of characters to display per line
  +     * @param options The command line Options
  +     * @param leftPad the number of characters of padding to be prefixed
  +     * to each line
  +     * @param descPad the number of characters of padding to be prefixed
  +     * to each description line
  +     *
  +     * @return the StringBuffer with the rendered Options contents.
  +     */
  +    protected StringBuffer renderOptions(StringBuffer sb, int width, 
  +                                         Options options, int leftPad, 
  +                                         int descPad)
  +    {
  +        final String lpad = createPadding(leftPad);
  +        final String dpad = createPadding(descPad);
  +
  +        // first create list containing only <lpad>-a,--aaa where 
  +        // -a is opt and --aaa is long opt; in parallel look for 
  +        // the longest opt string this list will be then used to 
  +        // sort options ascending
  +        int max = 0;
  +        StringBuffer optBuf;
  +        List prefixList = new ArrayList();
  +        Option option;
  +        List optList = options.helpOptions();
  +
  +        Collections.sort(optList, new StringBufferComparator());
  +
  +        for (Iterator i = optList.iterator(); i.hasNext();)
  +        {
  +            option = (Option) i.next();
  +            optBuf = new StringBuffer(8);
  +
  +            if (option.getOpt() == null)
  +            {
  +                optBuf.append(lpad).append("   " + defaultLongOptPrefix)
  +                      .append(option.getLongOpt());
  +            }
  +            else
  +            {
  +                optBuf.append(lpad).append(defaultOptPrefix)
  +                      .append(option.getOpt());
  +
  +                if (option.hasLongOpt())
  +                {
  +                    optBuf.append(',').append(defaultLongOptPrefix)
  +                          .append(option.getLongOpt());
  +                }
  +            }
  +
  +            if (option.hasArg())
  +            {
  +                if (option.hasArgName())
  +                {
  +                    optBuf.append(" <").append(option.getArgName()).append(">");
  +                }
  +                else
  +                {
  +                    optBuf.append(' ');
  +                }
  +            }
  +
  +            prefixList.add(optBuf);
  +            max = (optBuf.length() > max)       ? optBuf.length() : max;
  +        }
  +
  +        int x = 0;
  +
  +        for (Iterator i = optList.iterator(); i.hasNext();)
  +        {
  +            option = (Option) i.next();
  +            optBuf = new StringBuffer(prefixList.get(x++).toString());
  +
  +            if (optBuf.length() < max)
  +            {
  +                optBuf.append(createPadding(max - optBuf.length()));
  +            }
  +
  +            optBuf.append(dpad);
  +
  +            int nextLineTabStop = max + descPad;
  +
  +            if (option.getDescription() != null)
  +            {
  +                optBuf.append(option.getDescription());
  +            }
  +
  +            renderWrappedText(sb, width, nextLineTabStop, optBuf.toString());
  +
  +            if (i.hasNext())
  +            {
  +                sb.append(defaultNewLine);
  +            }
  +        }
  +
  +        return sb;
  +    }
  +
  +    /**
  +     * <p>Render the specified text and return the rendered Options
  +     * in a StringBuffer.</p>
  +     *
  +     * @param sb The StringBuffer to place the rendered text into.
  +     * @param width The number of characters to display per line
  +     * @param nextLineTabStop The position on the next line for the first tab.
  +     * @param text The text to be rendered.
  +     *
  +     * @return the StringBuffer with the rendered Options contents.
  +     */
  +    protected StringBuffer renderWrappedText(StringBuffer sb, int width, 
  +                                             int nextLineTabStop, String text)
  +    {
  +        int pos = findWrapPos(text, width, 0);
  +
  +        if (pos == -1)
  +        {
  +            sb.append(rtrim(text));
  +
               return sb;
  -         }
  +        }
  +        else
  +        {
  +            sb.append(rtrim(text.substring(0, pos))).append(defaultNewLine);
  +        }
  +
  +        // all following lines must be padded with nextLineTabStop space 
  +        // characters
  +        final String padding = createPadding(nextLineTabStop);
  +
  +        while (true)
  +        {
  +            text = padding + text.substring(pos).trim();
  +            pos = findWrapPos(text, width, nextLineTabStop);
   
  -         sb.append(rtrim(text.substring(0, pos))).append(defaultNewLine);
  -      }
  +            if (pos == -1)
  +            {
  +                sb.append(text);
   
  -   }
  +                return sb;
  +            }
   
  -   /**
  -    * Finds the next text wrap position after <code>startPos</code> for the text
  -    * in <code>sb</code> with the column width <code>width</code>.
  -    * The wrap point is the last postion before startPos+width having a whitespace
  -    * character (space, \n, \r).
  -    *
  -    * @param sb text to be analyzed
  -    * @param width width of the wrapped text
  -    * @param startPos position from which to start the lookup whitespace character
  -    * @return postion on which the text must be wrapped or -1 if the wrap position is at the end
  -    *         of the text
  -    */
  -   protected int findWrapPos( String text, int width, int startPos )
  -   {
  -      int pos = -1;
  -      // the line ends before the max wrap pos or a new line char found
  -      if ( ((pos = text.indexOf('\n', startPos)) != -1 && pos <= width)  ||
  -           ((pos = text.indexOf('\t', startPos)) != -1 && pos <= width) )
  -      {
  -         return pos;
  -      }
  -      else if ( (startPos + width) >= text.length() )
  -      {
  -         return -1;
  -      }
  -
  -      //look for the last whitespace character before startPos+width
  -      pos = startPos + width;
  -      char c;
  -      while ( pos >= startPos && (c = text.charAt(pos)) != ' ' && c != '\n' && c != '\r' )
  -      {
  -         --pos;
  -      }
  -      //if we found it - just return
  -      if ( pos > startPos )
  -      {
  -         return pos;
  -      }
  -      else
  -      {
  -         //must look for the first whitespace chearacter after startPos + width
  -         pos = startPos + width;
  -         while ( pos <= text.length() && (c = text.charAt(pos)) != ' ' && c != '\n' && c != '\r' )
  -         {
  -            ++pos;
  -         }
  -         return pos == text.length() ? -1 : pos;
  -      }
  -   }
  -
  -   protected String createPadding(int len)
  -   {
  -      StringBuffer sb = new StringBuffer(len);
  -      for ( int i = 0; i < len; ++i )
  -      {
  -         sb.append(' ');
  -      }
  -      return sb.toString();
  -   }
  -
  -   protected String rtrim( String s )
  -   {
  -      if ( s == null || s.length() == 0 )
  -      {
  -         return s;
  -      }
  -
  -      int pos = s.length();
  -      while ( pos >= 0 && Character.isWhitespace(s.charAt(pos-1)) )
  -      {
  -         --pos;
  -      }
  -      return s.substring(0, pos);
  -   }
  -
  -   // ------------------------------------------------------- Package protected
  -   
  -   // ----------------------------------------------------------------- Private
  -   
  -   // ----------------------------------------------------------- Inner classes
  +            sb.append(rtrim(text.substring(0, pos))).append(defaultNewLine);
  +        }
  +    }
   
  -    private static class StringBufferComparator
  -    implements Comparator
  +    /**
  +     * Finds the next text wrap position after <code>startPos</code> for the 
  +     * text in <code>text</code> with the column width <code>width</code>.
  +     * The wrap point is the last postion before startPos+width having a 
  +     * whitespace character (space, \n, \r).
  +     *
  +     * @param text The text being searched for the wrap position
  +     * @param width width of the wrapped text
  +     * @param startPos position from which to start the lookup whitespace 
  +     * character
  +     * @return postion on which the text must be wrapped or -1 if the wrap 
  +     * position is at the end of the text
  +     */
  +    protected int findWrapPos(String text, int width, int startPos)
  +    {
  +        int pos = -1;
  +
  +        // the line ends before the max wrap pos or a new line char found
  +        if (((pos = text.indexOf('\n', startPos)) != -1 && pos <= width)
  +            || ((pos = text.indexOf('\t', startPos)) != -1 && pos <= width))
  +        {
  +            return pos;
  +        }
  +        else if ((startPos + width) >= text.length())
  +        {
  +            return -1;
  +        }
  +
  +
  +        // look for the last whitespace character before startPos+width
  +        pos = startPos + width;
  +
  +        char c;
  +
  +        while ((pos >= startPos) && ((c = text.charAt(pos)) != ' ')
  +               && (c != '\n') && (c != '\r'))
  +        {
  +            --pos;
  +        }
  +
  +        // if we found it - just return
  +        if (pos > startPos)
  +        {
  +            return pos;
  +        }
  +        else
  +        {
  +            // must look for the first whitespace chearacter after startPos 
  +            // + width
  +            pos = startPos + width;
  +
  +            while ((pos <= text.length()) && ((c = text.charAt(pos)) != ' ')
  +                   && (c != '\n') && (c != '\r'))
  +            {
  +                ++pos;
  +            }
  +
  +            return (pos == text.length())        ? (-1) : pos;
  +        }
  +    }
  +
  +    /**
  +     * <p>Return a String of padding of length <code>len</code>.</p>
  +     *
  +     * @param len The length of the String of padding to create.
  +     *
  +     * @return The String of padding
  +     */
  +    protected String createPadding(int len)
  +    {
  +        StringBuffer sb = new StringBuffer(len);
  +
  +        for (int i = 0; i < len; ++i)
  +        {
  +            sb.append(' ');
  +        }
  +
  +        return sb.toString();
  +    }
  +
  +    /**
  +     * <p>Remove the trailing whitespace from the specified String.</p>
  +     *
  +     * @param s The String to remove the trailing padding from.
  +     *
  +     * @return The String of without the trailing padding
  +     */
  +    protected String rtrim(String s)
       {
  -        public int compare( Object o1, Object o2 )
  +        if ((s == null) || (s.length() == 0))
  +        {
  +            return s;
  +        }
  +
  +        int pos = s.length();
  +
  +        while ((pos >= 0) && Character.isWhitespace(s.charAt(pos - 1)))
  +        {
  +            --pos;
  +        }
  +
  +        return s.substring(0, pos);
  +    }
  +
  +    // ------------------------------------------------------ Package protected
  +    // ---------------------------------------------------------------- Private
  +    // ---------------------------------------------------------- Inner classes
  +    /**
  +     * <p>This class implements the <code>Comparator</code> interface
  +     * for comparing StringBuffers.</p>
  +     */
  +    private static class StringBufferComparator
  +        implements Comparator {
  +
  +        /**
  +         * <p>Compares its two arguments for order. Returns a negative 
  +         * integer, zero, or a positive integer as the first argument 
  +         * is less than, equal to, or greater than the second.</p>
  +         *
  +         * @param o1 The first StringBuffer to be compared.
  +         * @param o2 The second StringBuffer to be compared.
  +         *
  +         * @return a negative integer, zero, or a positive integer as 
  +         * the first argument is less than, equal to, or greater than the 
  +         * second.
  +         */
  +        public int compare(Object o1, Object o2)
           {
               String str1 = stripPrefix(o1.toString());
               String str2 = stripPrefix(o2.toString());
  +
               return (str1.compareTo(str2));
           }
   
  +        /**
  +         * <p>Removes any leading hyphens from <code>strOption</code>.</p>
  +         *         
  +         * @param strOption The String from which to strip the leading
  +         * hyphens.
  +         *
  +         * @return The String without any leading hyphens.
  +         */
           private String stripPrefix(String strOption)
           {
               // Strip any leading '-' characters
               int iStartIndex = strOption.lastIndexOf('-');
  +
               if (iStartIndex == -1)
               {
  -              iStartIndex = 0;
  +                iStartIndex = 0;
               }
  -            return strOption.substring(iStartIndex);
   
  +            return strOption.substring(iStartIndex);
           }
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.4       +7 -6      jakarta-commons/cli/src/java/org/apache/commons/cli/MissingArgumentException.java
  
  Index: MissingArgumentException.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/MissingArgumentException.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MissingArgumentException.java	19 Sep 2002 22:59:43 -0000	1.3
  +++ MissingArgumentException.java	9 Dec 2002 23:47:24 -0000	1.4
  @@ -58,7 +58,6 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   /** 
  @@ -68,15 +67,17 @@
    * @author John Keyes (john at integralsource.com)
    * @see ParseException
    */
  -public class MissingArgumentException extends ParseException {
  -    
  +public class MissingArgumentException
  +    extends ParseException {
  +
       /** 
        * <p>Construct a new <code>MissingArgumentException</code> 
        * with the specified detail message.</p>
        *
        * @param message the detail message
        */
  -    public MissingArgumentException( String message ) {
  -        super( message );
  +    public MissingArgumentException(String message)
  +    {
  +        super(message);
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.4       +7 -6      jakarta-commons/cli/src/java/org/apache/commons/cli/MissingOptionException.java
  
  Index: MissingOptionException.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/MissingOptionException.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MissingOptionException.java	19 Sep 2002 22:59:43 -0000	1.3
  +++ MissingOptionException.java	9 Dec 2002 23:47:24 -0000	1.4
  @@ -58,7 +58,6 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   /** 
  @@ -67,15 +66,17 @@
    * @author John Keyes ( john at integralsource.com )
    * @see ParseException
    */
  -public class MissingOptionException extends ParseException {
  -    
  +public class MissingOptionException
  +    extends ParseException {
  +
       /** 
        * <p>Construct a new <code>MissingSelectedException</code> 
        * with the specified detail message.</p>
        *
        * @param message the detail message
        */
  -    public MissingOptionException( String message ) {
  -        super( message );
  +    public MissingOptionException(String message)
  +    {
  +        super(message);
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.20      +216 -122  jakarta-commons/cli/src/java/org/apache/commons/cli/Option.java
  
  Index: Option.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Option.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- Option.java	27 Nov 2002 23:17:41 -0000	1.19
  +++ Option.java	9 Dec 2002 23:47:24 -0000	1.20
  @@ -79,12 +79,13 @@
    */
   public class Option implements Cloneable {
   
  -    /** constant that specifies the number of argument values has not been specified */
  -    public final static int UNINITIALIZED = -1;
  -    
  +    /** constant that specifies the number of argument values has 
  +        not been specified */
  +    public static final int UNINITIALIZED = -1;
  +
       /** constant that specifies the number of argument values is infinite */
  -    public final static int UNLIMITED_VALUES = -2;
  -    
  +    public static final int UNLIMITED_VALUES = -2;
  +
       /** opt the name of the option */
       private String opt;
   
  @@ -110,14 +111,14 @@
        * numberOfArgs specifies the number of argument values this option 
        * can have 
        */
  -    private int numberOfArgs = UNINITIALIZED;   
  +    private int numberOfArgs = UNINITIALIZED;
   
       /** the type of this Option */
       private Object type;
   
       /** the list of argument values **/
       private ArrayList values = new ArrayList();
  -    
  +
       /** the character that is the value separator */
       private char valuesep;
   
  @@ -125,13 +126,15 @@
        * Creates an Option using the specified parameters.
        *
        * @param opt short representation of the option
  -     * @param hasArg specifies whether the Option takes an argument or not
        * @param description describes the function of the option
  +     *
  +     * @throws IllegalArgumentException if there are any non valid
  +     * Option characters in <code>opt</code>.
        */
  -    public Option( String opt, String description ) 
  -    throws IllegalArgumentException
  +    public Option(String opt, String description)
  +           throws IllegalArgumentException
       {
  -        this( opt, null, false, description );
  +        this(opt, null, false, description);
       }
   
       /**
  @@ -140,13 +143,16 @@
        * @param opt short representation of the option
        * @param hasArg specifies whether the Option takes an argument or not
        * @param description describes the function of the option
  +     *
  +     * @throws IllegalArgumentException if there are any non valid
  +     * Option characters in <code>opt</code>.
        */
  -    public Option( String opt, boolean hasArg, String description ) 
  -    throws IllegalArgumentException
  +    public Option(String opt, boolean hasArg, String description)
  +           throws IllegalArgumentException
       {
  -        this( opt, null, hasArg, description );
  +        this(opt, null, hasArg, description);
       }
  -    
  +
       /**
        * <p>Creates an Option using the specified parameters.</p>
        *
  @@ -154,25 +160,30 @@
        * @param longOpt the long representation of the option
        * @param hasArg specifies whether the Option takes an argument or not
        * @param description describes the function of the option
  +     *
  +     * @throws IllegalArgumentException if there are any non valid
  +     * Option characters in <code>opt</code>.
        */
  -    public Option( String opt, String longOpt, boolean hasArg, String description ) 
  -    throws IllegalArgumentException
  +    public Option(String opt, String longOpt, boolean hasArg, 
  +                  String description)
  +           throws IllegalArgumentException
       {
           // ensure that the option is valid
  -        OptionValidator.validateOption( opt );
  +        OptionValidator.validateOption(opt);
   
  -        this.opt          = opt;
  -        this.longOpt      = longOpt;
  +        this.opt = opt;
  +        this.longOpt = longOpt;
   
           // if hasArg is set then the number of arguments is 1
  -        if( hasArg ) {
  +        if (hasArg)
  +        {
               this.numberOfArgs = 1;
           }
   
  -        this.hasArg       = hasArg;
  -        this.description  = description;
  +        this.hasArg = hasArg;
  +        this.description = description;
       }
  -    
  +
       /**
        * <p>Returns the id of this Option.  This is only set when the
        * Option shortOpt is a single character.  This is used for switch
  @@ -180,8 +191,9 @@
        *
        * @return the id of this Option
        */
  -    public int getId( ) {
  -        return getKey().charAt( 0 );
  +    public int getId()
  +    {
  +        return getKey().charAt(0);
       }
   
       /**
  @@ -189,11 +201,14 @@
        * 
        * @return the 'unique' Option identifier
        */
  -    String getKey() {
  +    String getKey()
  +    {
           // if 'opt' is null, then it is a 'long' option
  -        if( opt == null ) {
  +        if (opt == null)
  +        {
               return this.longOpt;
           }
  +
           return this.opt;
       }
   
  @@ -206,7 +221,8 @@
        *
        * @return The name of this option
        */
  -    public String getOpt() {
  +    public String getOpt()
  +    {
           return this.opt;
       }
   
  @@ -215,7 +231,8 @@
        * 
        * @return The type of this option
        */
  -    public Object getType() {
  +    public Object getType()
  +    {
           return this.type;
       }
   
  @@ -224,16 +241,18 @@
        *
        * @param type the type of this Option
        */
  -    public void setType( Object type ) {
  +    public void setType(Object type)
  +    {
           this.type = type;
       }
  -    
  +
       /** 
        * <p>Retrieve the long name of this Option.</p>
        *
        * @return Long name of this option, or null, if there is no long name
        */
  -    public String getLongOpt() {
  +    public String getLongOpt()
  +    {
           return this.longOpt;
       }
   
  @@ -242,7 +261,8 @@
        *
        * @param longOpt the long name of this Option
        */
  -    public void setLongOpt( String longOpt ) {
  +    public void setLongOpt(String longOpt)
  +    {
           this.longOpt = longOpt;
       }
   
  @@ -252,38 +272,43 @@
        * @param optionalArg specifies whether the Option can have
        * an optional argument.
        */
  -    public void setOptionalArg( boolean optionalArg ) {
  +    public void setOptionalArg(boolean optionalArg)
  +    {
           this.optionalArg = optionalArg;
       }
   
       /**
        * @return whether this Option can have an optional argument
        */
  -    public boolean hasOptionalArg( ) {
  +    public boolean hasOptionalArg()
  +    {
           return this.optionalArg;
       }
  -    
  +
       /** <p>Query to see if this Option has a long name</p>
        *
        * @return boolean flag indicating existence of a long name
        */
  -    public boolean hasLongOpt() {
  -        return ( this.longOpt != null );
  +    public boolean hasLongOpt()
  +    {
  +        return (this.longOpt != null);
       }
  -    
  +
       /** <p>Query to see if this Option requires an argument</p>
        *
        * @return boolean flag indicating if an argument is required
        */
  -    public boolean hasArg() {
  -        return this.numberOfArgs > 0 || numberOfArgs == UNLIMITED_VALUES;
  +    public boolean hasArg()
  +    {
  +        return (this.numberOfArgs > 0) || (numberOfArgs == UNLIMITED_VALUES);
       }
  -    
  +
       /** <p>Retrieve the self-documenting description of this Option</p>
        *
        * @return The string description of this option
        */
  -    public String getDescription() {
  +    public String getDescription()
  +    {
           return this.description;
       }
   
  @@ -292,7 +317,8 @@
        *
        * @return boolean flag indicating if an argument is required
        */
  -    public boolean isRequired() {
  +    public boolean isRequired()
  +    {
           return this.required;
       }
   
  @@ -301,7 +327,8 @@
        *
        * @param required specifies whether this Option is mandatory
        */
  -    public void setRequired( boolean required ) {
  +    public void setRequired(boolean required)
  +    {
           this.required = required;
       }
   
  @@ -310,7 +337,8 @@
        *
        * @param argName the display name for the argument value.
        */
  -    public void setArgName( String argName ) {
  +    public void setArgName(String argName)
  +    {
           this.argName = argName;
       }
   
  @@ -319,7 +347,8 @@
        *
        * @return the display name for the argument value.
        */
  -    public String getArgName() {
  +    public String getArgName()
  +    {
           return this.argName;
       }
   
  @@ -330,8 +359,9 @@
        * @return if the display name for the argument value has been
        * set.
        */
  -    public boolean hasArgName() {
  -        return (this.argName != null && this.argName.length() > 0 );
  +    public boolean hasArgName()
  +    {
  +        return (this.argName != null && this.argName.length() > 0);
       }
   
       /** 
  @@ -339,8 +369,10 @@
        *
        * @return boolean flag indicating if multiple values are allowed
        */
  -    public boolean hasArgs() {
  -        return this.numberOfArgs > 1 || this.numberOfArgs == UNLIMITED_VALUES;
  +    public boolean hasArgs()
  +    {
  +        return (this.numberOfArgs > 1) 
  +                || (this.numberOfArgs == UNLIMITED_VALUES);
       }
   
       /** 
  @@ -348,7 +380,8 @@
        *
        * @param num the number of argument values
        */
  -    public void setArgs( int num ) {
  +    public void setArgs(int num)
  +    {
           this.numberOfArgs = num;
       }
   
  @@ -358,7 +391,8 @@
        *
        * @param sep The value separator.
        */
  -    public void setValueSeparator( char sep ) {
  +    public void setValueSeparator(char sep)
  +    {
           this.valuesep = sep;
       }
   
  @@ -367,15 +401,19 @@
        *
        * @return the value separator character.
        */
  -    public char getValueSeparator() {
  +    public char getValueSeparator()
  +    {
           return this.valuesep;
       }
   
       /**
  -     * ...
  +     * <p>Return whether this Option has specified a value separator.</p>
  +     * 
  +     * @return whether this Option has specified a value separator.</p>
        */
  -    public boolean hasValueSeparator() {
  -        return ( this.valuesep > 0 );
  +    public boolean hasValueSeparator()
  +    {
  +        return (this.valuesep > 0);
       }
   
       /** 
  @@ -383,7 +421,8 @@
        *
        * @return num the number of argument values
        */
  -    public int getArgs( ) {
  +    public int getArgs()
  +    {
           return this.numberOfArgs;
       }
   
  @@ -392,13 +431,15 @@
        * 
        * @param value is a/the value of this Option
        */
  -    void addValue( String value )
  +    void addValue(String value)
       {
  -        switch( numberOfArgs ) {
  -            case UNINITIALIZED:
  -                throw new RuntimeException( "Cannot add value, no arguments allowed." );
  -            default:
  -                processValue( value );
  +        switch (numberOfArgs)
  +        {
  +        case UNINITIALIZED:
  +            throw new RuntimeException("NO_ARGS_ALLOWED");
  +
  +        default:
  +            processValue(value);
           }
       }
   
  @@ -409,40 +450,47 @@
        * in the value, parsing is ceased and the remaining characters are
        * added as a single token.</p>
        *
  +     * @param value The String to be processed.
  +     *
        * @since 1.0.1
        */
  -    private void processValue( String value ) {
  -
  +    private void processValue(String value)
  +    {
           // this Option has a separator character
  -        if( hasValueSeparator() ) {
  -
  +        if (hasValueSeparator())
  +        {
               // get the separator character
               char sep = getValueSeparator();
   
               // store the index for the value separator
  -            int index = value.indexOf( sep );
  +            int index = value.indexOf(sep);
   
               // while there are more value separators
  -            while( index != -1 ) {
  -
  +            while (index != -1)
  +            {
                   // next value to be added 
  -                if( values.size() == numberOfArgs-1 ) {
  +                if (values.size() == (numberOfArgs - 1))
  +                {
                       break;
  -                } 
  +                }
  +
   
                   // store
  -                add( value.substring( 0, index ) );
  +                add(value.substring(0, index));
  +
   
                   // parse
  -                value = value.substring( index+1 );
  +                value = value.substring(index + 1);
  +
   
                   // get new index
  -                index = value.indexOf( sep );
  +                index = value.indexOf(sep);
               }
           }
   
  +
           // store the actual value or the last value that has been parsed
  -        add( value );
  +        add(value);
       }
   
       /**
  @@ -451,70 +499,105 @@
        * add the value.  Otherwise, throw a runtime exception.
        * </p>
        *
  +     * @param value The value to be added to this Option
  +     *
        * @since 1.0.1
        */
  -    private void add( String value ) {
  -        if( numberOfArgs > 0 && values.size() > numberOfArgs-1 ) {
  -            throw new RuntimeException( "Cannot add value, list full." );
  +    private void add(String value)
  +    {
  +        if ((numberOfArgs > 0) && (values.size() > (numberOfArgs - 1)))
  +        {
  +            throw new RuntimeException("Cannot add value, list full.");
           }
  +
  +
           // store value
  -        this.values.add( value );
  +        this.values.add(value);
       }
   
       /**
  +     * Returns the specified value of this Option or 
  +     * <code>null</code> if there is no value.
  +     *
        * @return the value/first value of this Option or 
  -     * <code>null</code> if there are no values.
  +     * <code>null</code> if there is no value.
        */
  -    public String getValue() {
  -        return this.values.size()==0 ? null : (String)this.values.get( 0 );
  +    public String getValue()
  +    {
  +        return hasNoValues() ? null : (String) this.values.get(0);
       }
   
       /**
  +     * Returns the specified value of this Option or 
  +     * <code>null</code> if there is no value.
  +     *
  +     * @param index The index of the value to be returned.
  +     *
        * @return the specified value of this Option or 
  -     * <code>null</code> if there are no values.
  +     * <code>null</code> if there is no value.
  +     *
  +     * @throws IndexOutOfBoundsException if index is less than 1
  +     * or greater than the number of the values for this Option.
        */
  -    public String getValue( int index ) 
  -    throws IndexOutOfBoundsException
  +    public String getValue(int index)
  +        throws IndexOutOfBoundsException
       {
  -        return ( this.values.size()==0 ) ? null : (String)this.values.get( index );
  +        return hasNoValues() ? null : (String) this.values.get(index);
       }
   
       /**
  +     * Returns the value/first value of this Option or the 
  +     * <code>defaultValue</code> if there is no value.
  +     *
  +     * @param defaultValue The value to be returned if ther
  +     * is no value.
  +     *
        * @return the value/first value of this Option or the 
        * <code>defaultValue</code> if there are no values.
        */
  -    public String getValue( String defaultValue ) {
  -        String value = getValue( );
  -        return ( value != null ) ? value : defaultValue;
  +    public String getValue(String defaultValue)
  +    {
  +        String value = getValue();
  +
  +        return (value != null) ? value : defaultValue;
       }
   
       /**
  +     * Return the values of this Option as a String array 
  +     * or null if there are no values
  +     *
        * @return the values of this Option as a String array 
        * or null if there are no values
        */
  -    public String[] getValues() {
  -        return this.values.size()==0 ? null : (String[])this.values.toArray(new String[]{});
  +    public String[] getValues()
  +    {
  +        return hasNoValues()
  +               ? null : (String[]) this.values.toArray(new String[] {  });
       }
   
       /**
        * @return the values of this Option as a List
        * or null if there are no values
        */
  -    public java.util.List getValuesList() {
  +    public java.util.List getValuesList()
  +    {
           return this.values;
       }
   
       /**
        * @return a copy of this Option
        */
  -    public Object clone() {
  -        Option option = new Option( getOpt(), getDescription() );
  -        option.setArgs( getArgs() );
  -        option.setOptionalArg( hasOptionalArg() );
  -        option.setRequired( isRequired() );
  -        option.setLongOpt( getLongOpt() );
  -        option.setType( getType() );
  -        option.setValueSeparator( getValueSeparator() );
  +    public Object clone()
  +    {
  +        Option option = new Option(getOpt(), getDescription());
  +
  +        option.setArgs(getArgs());
  +        option.setOptionalArg(hasOptionalArg());
  +        option.setRequired(isRequired());
  +        option.setLongOpt(getLongOpt());
  +        option.setType(getType());
  +        option.setValueSeparator(getValueSeparator());
  +
           return option;
       }
   
  @@ -523,32 +606,43 @@
        *
        * @return Stringified form of this object
        */
  -    public String toString() {
  +    public String toString()
  +    {
           StringBuffer buf = new StringBuffer().append("[ option: ");
  -        
  -        buf.append( this.opt );
  -        
  -        if ( this.longOpt != null ) {
  -            buf.append(" ")
  -            .append(this.longOpt);
  +
  +        buf.append(this.opt);
  +
  +        if (this.longOpt != null)
  +        {
  +            buf.append(" ").append(this.longOpt);
           }
  -        
  +
           buf.append(" ");
  -        
  -        if ( hasArg ) {
  -            buf.append( "+ARG" );
  +
  +        if (hasArg)
  +        {
  +            buf.append("+ARG");
           }
  -        
  -        buf.append(" :: ")
  -        .append( this.description );
  -        
  -        if ( this.type != null ) {
  -            buf.append(" :: ")
  -            .append( this.type );
  +
  +        buf.append(" :: ").append(this.description);
  +
  +        if (this.type != null)
  +        {
  +            buf.append(" :: ").append(this.type);
           }
   
           buf.append(" ]");
  +
           return buf.toString();
       }
   
  -}
  +    /**
  +     * Returns whether this Option has any values.
  +     *
  +     * @return whether this Option has any values.
  +     */
  +    private boolean hasNoValues()
  +    {
  +        return this.values.size() == 0;
  +    }
  +}
  \ No newline at end of file
  
  
  
  1.15      +101 -53   jakarta-commons/cli/src/java/org/apache/commons/cli/OptionBuilder.java
  
  Index: OptionBuilder.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/OptionBuilder.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- OptionBuilder.java	19 Nov 2002 22:54:48 -0000	1.14
  +++ OptionBuilder.java	9 Dec 2002 23:47:24 -0000	1.15
  @@ -58,48 +58,59 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   /**
    * <p>OptionBuilder allows the user to create Options using descriptive
    * methods.</p>
    * <p>Details on the Builder pattern can be found at 
  - * <a href="http://c2.com/cgi-bin/wiki?BuilderPattern">http://c2.com/cgi-bin/wiki?BuilderPattern</a>.</p>
  + * <a href="http://c2.com/cgi-bin/wiki?BuilderPattern">
  + * http://c2.com/cgi-bin/wiki?BuilderPattern</a>.</p>
    *
  - * @author John Keyes ( john at integralsource.com )
  + * @author John Keyes (john at integralsource.com)
    * @since 1.0
    */
   public class OptionBuilder {
   
       /** long option */
       private static String longopt;
  +
       /** option description */
       private static String description;
  +
       /** argument name */
       private static String argName;
  +
       /** is required? */
       private static boolean required;
  +
       /** the number of arguments */
       private static int numberOfArgs = Option.UNINITIALIZED;
  +
       /** option type */
       private static Object type;
  +
       /** option can have an optional argument value */
       private static boolean optionalArg;
  +
       /** value separator for argument value */
       private static char valuesep;
   
       /** option builder instance */
       private static OptionBuilder instance = new OptionBuilder();
   
  -    // private constructor
  -    private OptionBuilder() {
  +    /**
  +     * private constructor to prevent instances being created
  +     */
  +    private OptionBuilder()
  +    {
       }
   
       /**
        * <p>Resets the member variables to their default values.</p>
        */
  -    private static void reset() {
  +    private static void reset()
  +    {
           description = null;
           argName = "arg";
           longopt = null;
  @@ -107,6 +118,7 @@
           required = false;
           numberOfArgs = Option.UNINITIALIZED;
   
  +
           // PMM 9/6/02 - these were missing
           optionalArg = false;
           valuesep = (char) 0;
  @@ -118,8 +130,10 @@
        * @param longopt the long option value
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder withLongOpt( String longopt ) {
  +    public static OptionBuilder withLongOpt(String longopt)
  +    {
           instance.longopt = longopt;
  +
           return instance;
       }
   
  @@ -128,8 +142,10 @@
        *
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder hasArg( ) {
  +    public static OptionBuilder hasArg()
  +    {
           instance.numberOfArgs = 1;
  +
           return instance;
       }
   
  @@ -140,8 +156,10 @@
        * @param hasArg if true then the Option has an argument value
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder hasArg( boolean hasArg ) {
  -        instance.numberOfArgs = ( hasArg == true ) ? 1 : Option.UNINITIALIZED;
  +    public static OptionBuilder hasArg(boolean hasArg)
  +    {
  +        instance.numberOfArgs = (hasArg == true) ? 1 : Option.UNINITIALIZED;
  +
           return instance;
       }
   
  @@ -152,8 +170,10 @@
        * @param name the name for the argument value
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder withArgName( String name ) {
  +    public static OptionBuilder withArgName(String name)
  +    {
           instance.argName = name;
  +
           return instance;
       }
   
  @@ -162,8 +182,10 @@
        *
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder isRequired( ) {
  +    public static OptionBuilder isRequired()
  +    {
           instance.required = true;
  +
           return instance;
       }
   
  @@ -173,18 +195,22 @@
        *
        * <b>Example:</b>
        * <pre>
  -     * Option opt = OptionBuilder.withValueSeparator( ':' )
  -     *                           .create( 'D' );
  +     * Option opt = OptionBuilder.withValueSeparator(':')
  +     *                           .create('D');
        *
  -     * CommandLine line = parser.parse( args );
  -     * String propertyName = opt.getValue( 0 );
  -     * String propertyValue = opt.getValue( 1 );
  +     * CommandLine line = parser.parse(args);
  +     * String propertyName = opt.getValue(0);
  +     * String propertyValue = opt.getValue(1);
        * </pre>
        *
  +     * @param sep The value separator to be used for the argument values.
  +     *
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder withValueSeparator( char sep ) {
  +    public static OptionBuilder withValueSeparator(char sep)
  +    {
           instance.valuesep = sep;
  +
           return instance;
       }
   
  @@ -194,18 +220,20 @@
        *
        * <b>Example:</b>
        * <pre>
  -     * Option opt = OptionBuilder.withValueSeparator( )
  -     *                           .create( 'D' );
  +     * Option opt = OptionBuilder.withValueSeparator()
  +     *                           .create('D');
        *
  -     * CommandLine line = parser.parse( args );
  -     * String propertyName = opt.getValue( 0 );
  -     * String propertyValue = opt.getValue( 1 );
  +     * CommandLine line = parser.parse(args);
  +     * String propertyName = opt.getValue(0);
  +     * String propertyValue = opt.getValue(1);
        * </pre>
        *
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder withValueSeparator( ) {
  +    public static OptionBuilder withValueSeparator()
  +    {
           instance.valuesep = '=';
  +
           return instance;
       }
   
  @@ -216,8 +244,10 @@
        * @param required if true then the Option is required
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder isRequired( boolean required ) {
  +    public static OptionBuilder isRequired(boolean required)
  +    {
           instance.required = required;
  +
           return instance;
       }
   
  @@ -226,8 +256,10 @@
        *
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder hasArgs( ) {
  +    public static OptionBuilder hasArgs()
  +    {
           instance.numberOfArgs = Option.UNLIMITED_VALUES;
  +
           return instance;
       }
   
  @@ -238,8 +270,10 @@
        * @param num the number of args that the option can have
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder hasArgs( int num ) {
  +    public static OptionBuilder hasArgs(int num)
  +    {
           instance.numberOfArgs = num;
  +
           return instance;
       }
   
  @@ -248,9 +282,11 @@
        *
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder hasOptionalArg( ) {
  +    public static OptionBuilder hasOptionalArg()
  +    {
           instance.numberOfArgs = 1;
           instance.optionalArg = true;
  +
           return instance;
       }
   
  @@ -260,9 +296,11 @@
        *
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder hasOptionalArgs( ) {
  +    public static OptionBuilder hasOptionalArgs()
  +    {
           instance.numberOfArgs = Option.UNLIMITED_VALUES;
           instance.optionalArg = true;
  +
           return instance;
       }
   
  @@ -274,9 +312,11 @@
        * the next Option created can have.
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder hasOptionalArgs( int numArgs ) {
  +    public static OptionBuilder hasOptionalArgs(int numArgs)
  +    {
           instance.numberOfArgs = numArgs;
           instance.optionalArg = true;
  +
           return instance;
       }
   
  @@ -287,8 +327,10 @@
        * @param type the type of the Options argument value
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder withType( Object type ) {
  +    public static OptionBuilder withType(Object type)
  +    {
           instance.type = type;
  +
           return instance;
       }
   
  @@ -298,8 +340,10 @@
        * @param description a description of the Option's purpose
        * @return the OptionBuilder instance
        */
  -    public static OptionBuilder withDescription( String description ) {
  +    public static OptionBuilder withDescription(String description)
  +    {
           instance.description = description;
  +
           return instance;
       }
   
  @@ -312,10 +356,10 @@
        * @throws IllegalArgumentException if <code>opt</code> is not
        * a valid character.  See Option.
        */
  -    public static Option create( char opt )
  -    throws IllegalArgumentException
  +    public static Option create(char opt)
  +                         throws IllegalArgumentException
       {
  -        return create( String.valueOf( opt ) );
  +        return create(String.valueOf(opt));
       }
   
       /**
  @@ -325,14 +369,15 @@
        * @throws IllegalArgumentException if <code>longOpt</code> has
        * not been set.  
        */
  -    public static Option create() 
  -    throws IllegalArgumentException
  +    public static Option create()
  +                         throws IllegalArgumentException
       {
  -        if( longopt == null ) {
  -            throw new IllegalArgumentException( "must specify longopt" );
  +        if (longopt == null)
  +        {
  +            throw new IllegalArgumentException("must specify longopt");
           }
   
  -        return create( null );
  +        return create(null);
       }
   
       /**
  @@ -345,20 +390,23 @@
        * @throws IllegalArgumentException if <code>opt</code> is not
        * a valid character.  See Option.
        */
  -    public static Option create( String opt ) 
  -    throws IllegalArgumentException
  +    public static Option create(String opt)
  +                         throws IllegalArgumentException
       {
           // create the option
  -        Option option = new Option( opt, description );
  +        Option option = new Option(opt, description);
  +
   
           // set the option properties
  -        option.setLongOpt( longopt );
  -        option.setRequired( required );
  -        option.setOptionalArg( optionalArg );
  -        option.setArgs( numberOfArgs );
  -        option.setType( type );
  -        option.setValueSeparator( valuesep );
  -        option.setArgName( argName );
  +        option.setLongOpt(longopt);
  +        option.setRequired(required);
  +        option.setOptionalArg(optionalArg);
  +        option.setArgs(numberOfArgs);
  +        option.setType(type);
  +        option.setValueSeparator(valuesep);
  +        option.setArgName(argName);
  +
  +
           // reset the OptionBuilder properties
           instance.reset();
   
  
  
  
  1.8       +50 -33    jakarta-commons/cli/src/java/org/apache/commons/cli/OptionGroup.java
  
  Index: OptionGroup.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/OptionGroup.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- OptionGroup.java	19 Nov 2002 00:16:18 -0000	1.7
  +++ OptionGroup.java	9 Dec 2002 23:47:24 -0000	1.8
  @@ -58,7 +58,6 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   import java.util.Collection;
  @@ -87,10 +86,12 @@
        * @param opt the option to add to this group
        * @return this option group with opt added
        */
  -    public OptionGroup addOption(Option opt) {
  +    public OptionGroup addOption(Option opt)
  +    {
           // key   - option name
           // value - the option
  -        optionMap.put( opt.getKey(), opt );
  +        optionMap.put(opt.getKey(), opt);
  +
           return this;
       }
   
  @@ -98,7 +99,8 @@
        * @return the names of the options in this group as a 
        * <code>Collection</code>
        */
  -    public Collection getNames() {
  +    public Collection getNames()
  +    {
           // the key set is the collection of names
           return optionMap.keySet();
       }
  @@ -106,7 +108,8 @@
       /**
        * @return the options in this group as a <code>Collection</code>
        */
  -    public Collection getOptions() {
  +    public Collection getOptions()
  +    {
           // the values are the collection of options
           return optionMap.values();
       }
  @@ -117,41 +120,47 @@
        * @throws AlreadySelectedException if an option from this group has 
        * already been selected.
        */
  -    public void setSelected(Option opt) throws AlreadySelectedException {
  +    public void setSelected(Option opt)
  +                     throws AlreadySelectedException
  +    {
           // if no option has already been selected or the 
           // same option is being reselected then set the
           // selected member variable
  -
  -        if ( this.selected == null || this.selected.equals( opt.getOpt() ) ) {
  +        if ((this.selected == null) || this.selected.equals(opt.getOpt()))
  +        {
               this.selected = opt.getOpt();
           }
  -        else {
  -            throw new AlreadySelectedException( "an option from this group has " + 
  -                                                "already been selected: '" + 
  -                                                selected + "'");
  +        else
  +        {
  +            throw new AlreadySelectedException("an option from this group has "
  +                                               + "already been selected: '"
  +                                               + selected + "'");
           }
       }
   
       /**
        * @return the selected option name
        */
  -    public String getSelected() {
  +    public String getSelected()
  +    {
           return selected;
       }
   
       /**
        * @param required specifies if this group is required
        */
  -    public void setRequired( boolean required ) {
  +    public void setRequired(boolean required)
  +    {
           this.required = required;
       }
   
       /**
        * Returns whether this option group is required.
        *
  -     * @returns whether this option group is required
  +     * @return whether this option group is required
        */
  -    public boolean isRequired() {
  +    public boolean isRequired()
  +    {
           return this.required;
       }
   
  @@ -159,32 +168,40 @@
        * <p>Returns the stringified version of this OptionGroup.</p>
        * @return the stringified representation of this group
        */
  -    public String toString() {
  +    public String toString()
  +    {
           StringBuffer buff = new StringBuffer();
   
           Iterator iter = getOptions().iterator();
   
  -        buff.append( "[" );
  -        while( iter.hasNext() ) {
  -            Option option = (Option)iter.next();
  -
  -            if( option.getOpt() != null ) {
  -                buff.append( "-" );
  -                buff.append( option.getOpt() );
  +        buff.append("[");
  +
  +        while (iter.hasNext())
  +        {
  +            Option option = (Option) iter.next();
  +
  +            if (option.getOpt() != null)
  +            {
  +                buff.append("-");
  +                buff.append(option.getOpt());
               }
  -            else {
  -                buff.append( "--" );
  -                buff.append( option.getLongOpt() );
  +            else
  +            {
  +                buff.append("--");
  +                buff.append(option.getLongOpt());
               }
  -            buff.append( " " );
  -            buff.append( option.getDescription( ) );
   
  -            if( iter.hasNext() ) {
  -                buff.append( ", " );
  +            buff.append(" ");
  +            buff.append(option.getDescription());
  +
  +            if (iter.hasNext())
  +            {
  +                buff.append(", ");
               }
           }
  -        buff.append( "]" );
  +
  +        buff.append("]");
   
           return buff.toString();
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.2       +35 -20    jakarta-commons/cli/src/java/org/apache/commons/cli/OptionValidator.java
  
  Index: OptionValidator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/OptionValidator.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- OptionValidator.java	18 Nov 2002 08:41:26 -0000	1.1
  +++ OptionValidator.java	9 Dec 2002 23:47:25 -0000	1.2
  @@ -82,27 +82,39 @@
        * @param opt The option string to validate
        * @throws IllegalArgumentException if the Option is not valid.
        */
  -    static void validateOption( String opt ) 
  -    throws IllegalArgumentException
  +    static void validateOption(String opt)
  +                        throws IllegalArgumentException
       {
           // check that opt is not NULL
  -        if( opt == null ) {
  +        if (opt == null)
  +        {
               return;
           }
  +
           // handle the single character opt
  -        else if( opt.length() == 1 ) {
  -            char ch = opt.charAt( 0 );
  -            if ( !isValidOpt( ch ) ) {
  -                throw new IllegalArgumentException( "illegal option value '" 
  -                                                    + ch + "'" );
  +        else if (opt.length() == 1)
  +        {
  +            char ch = opt.charAt(0);
  +
  +            if (!isValidOpt(ch))
  +            {
  +                throw new IllegalArgumentException("illegal option value '" + ch
  +                                                   + "'");
               }
           }
  +
           // handle the multi character opt
  -        else {
  +        else
  +        {
               char[] chars = opt.toCharArray();
  -            for( int i = 0; i < chars.length; i++ ) {
  -                if( !isValidChar( chars[i] ) ) {
  -                    throw new IllegalArgumentException( "opt contains illegal character value '" + chars[i] + "'" );
  +
  +            for (int i = 0; i < chars.length; i++)
  +            {
  +                if (!isValidChar(chars[i]))
  +                {
  +                    throw new IllegalArgumentException(
  +                            "opt contains illegal character value '" + chars[i]
  +                            + "'");
                   }
               }
           }
  @@ -112,10 +124,12 @@
        * <p>Returns whether the specified character is a valid Option.</p>
        *
        * @param c the option to validate
  -     * @return true if <code>c</code> is a letter, ' ', '?' or '@', otherwise false.
  +     * @return true if <code>c</code> is a letter, ' ', '?' or '@', 
  +     * otherwise false.
        */
  -    private static boolean isValidOpt( char c ) {
  -        return ( isValidChar( c ) || c == ' ' || c == '?' || c == '@' );
  +    private static boolean isValidOpt(char c)
  +    {
  +        return (isValidChar(c) || (c == ' ') || (c == '?') || c == '@');
       }
   
       /**
  @@ -124,7 +138,8 @@
        * @param c the character to validate
        * @return true if <code>c</code> is a letter.
        */
  -    private static boolean isValidChar( char c ) {
  -        return Character.isJavaIdentifierPart( c );
  +    private static boolean isValidChar(char c)
  +    {
  +        return Character.isJavaIdentifierPart(c);
       }
   }
  
  
  
  1.18      +85 -60    jakarta-commons/cli/src/java/org/apache/commons/cli/Options.java
  
  Index: Options.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Options.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- Options.java	25 Nov 2002 23:43:40 -0000	1.17
  +++ Options.java	9 Dec 2002 23:47:25 -0000	1.18
  @@ -58,7 +58,6 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   import java.util.ArrayList;
  @@ -68,7 +67,6 @@
   import java.util.Iterator;
   import java.util.List;
   import java.util.Map;
  -import java.util.*;
   
   /** <p>Main entry-point into the library.</p>
    *
  @@ -88,20 +86,21 @@
   public class Options {
   
       /** a map of the options with the character key */
  -    private Map  shortOpts    = new HashMap();
  +    private Map shortOpts = new HashMap();
   
       /** a map of the options with the long key */
  -    private Map  longOpts     = new HashMap();
  +    private Map longOpts = new HashMap();
   
       /** a map of the required options */
       private List requiredOpts = new ArrayList();
  -    
  +
       /** a map of the option groups */
  -    private Map optionGroups  = new HashMap();
  +    private Map optionGroups = new HashMap();
   
       /** <p>Construct a new Options descriptor</p>
        */
  -    public Options() {        
  +    public Options()
  +    {
       }
   
       /**
  @@ -110,22 +109,27 @@
        * @param group the OptionGroup that is to be added
        * @return the resulting Options instance
        */
  -    public Options addOptionGroup( OptionGroup group ) {
  +    public Options addOptionGroup(OptionGroup group)
  +    {
           Iterator options = group.getOptions().iterator();
   
  -        if( group.isRequired() ) {
  -            requiredOpts.add( group );
  +        if (group.isRequired())
  +        {
  +            requiredOpts.add(group);
           }
   
  -        while( options.hasNext() ) {
  -            Option option = (Option)options.next();
  +        while (options.hasNext())
  +        {
  +            Option option = (Option) options.next();
  +
  +
               // an Option cannot be required if it is in an
               // OptionGroup, either the group is required or
               // nothing is required
  -            option.setRequired( false );
  -            addOption( option );
  +            option.setRequired(false);
  +            addOption(option);
   
  -            optionGroups.put( option.getKey(), group );
  +            optionGroups.put(option.getKey(), group);
           }
   
           return this;
  @@ -139,11 +143,13 @@
        * @param description Self-documenting description
        * @return the resulting Options instance
        */
  -    public Options addOption(String opt, boolean hasArg, String description) {
  -        addOption( opt, null, hasArg, description );
  +    public Options addOption(String opt, boolean hasArg, String description)
  +    {
  +        addOption(opt, null, hasArg, description);
  +
           return this;
       }
  -    
  +
       /** <p>Add an option that contains a short-name and a long-name</p>
        * <p>It may be specified as requiring an argument.</p>
        *
  @@ -153,8 +159,11 @@
        * @param description Self-documenting description
        * @return the resulting Options instance
        */
  -    public Options addOption(String opt, String longOpt, boolean hasArg, String description) {
  -        addOption( new Option( opt, longOpt, hasArg, description ) );        
  +    public Options addOption(String opt, String longOpt, boolean hasArg, 
  +                             String description)
  +    {
  +        addOption(new Option(opt, longOpt, hasArg, description));
  +
           return this;
       }
   
  @@ -164,29 +173,34 @@
        * @param opt the option that is to be added 
        * @return the resulting Options instance
        */
  -    public Options addOption(Option opt)  {
  +    public Options addOption(Option opt)
  +    {
           String key = opt.getKey();
  -        
  -            // add it to the long option list
  -            if ( opt.hasLongOpt() ) {
  -                longOpts.put( opt.getLongOpt(), opt );
  -            }
  -        
  -            // if the option is required add it to the required list
  -            if ( opt.isRequired() && !requiredOpts.contains( key ) ) {
  -                requiredOpts.add( key );
  -            }
  -            shortOpts.put( key, opt );
  +
  +        // add it to the long option list
  +        if (opt.hasLongOpt())
  +        {
  +            longOpts.put(opt.getLongOpt(), opt);
  +        }
  +
  +        // if the option is required add it to the required list
  +        if (opt.isRequired() && !requiredOpts.contains(key))
  +        {
  +            requiredOpts.add(key);
  +        }
  +
  +        shortOpts.put(key, opt);
   
           return this;
       }
  -    
  +
       /** <p>Retrieve a read-only list of options in this set</p>
        *
        * @return read-only Collection of {@link Option} objects in this descriptor
        */
  -    public Collection getOptions() {
  -        return Collections.unmodifiableCollection( helpOptions() );
  +    public Collection getOptions()
  +    {
  +        return Collections.unmodifiableCollection(helpOptions());
       }
   
       /**
  @@ -194,21 +208,25 @@
        *
        * @return the List of Options
        */
  -    List helpOptions() {
  -        List opts = new ArrayList( shortOpts.values() );
  +    List helpOptions()
  +    {
  +        List opts = new ArrayList(shortOpts.values());
   
           // now look through the long opts to see if there are any Long-opt
           // only options
           Iterator iter = longOpts.values().iterator();
  +
           while (iter.hasNext())
           {
               Object item = iter.next();
  +
               if (!opts.contains(item))
               {
                   opts.add(item);
               }
           }
  -        return new ArrayList( opts );
  +
  +        return new ArrayList(opts);
       }
   
       /** <p>Returns the required options as a 
  @@ -216,23 +234,26 @@
        *
        * @return Collection of required options
        */
  -    public List getRequiredOptions() {
  +    public List getRequiredOptions()
  +    {
           return requiredOpts;
       }
  -    
  +
       /** <p>Retrieve the named {@link Option}</p>
        *
        * @param opt short or long name of the {@link Option}
        * @return the option represented by opt
        */
  -    public Option getOption( String opt ) {
  +    public Option getOption(String opt)
  +    {
  +        opt = Util.stripLeadingHyphens(opt);
   
  -        opt = Util.stripLeadingHyphens( opt );
  -
  -        if( shortOpts.containsKey( opt ) ) {
  -            return (Option) shortOpts.get( opt );
  +        if (shortOpts.containsKey(opt))
  +        {
  +            return (Option) shortOpts.get(opt);
           }
  -        return (Option) longOpts.get( opt );
  +
  +        return (Option) longOpts.get(opt);
       }
   
       /** 
  @@ -243,9 +264,11 @@
        * @return true if the named {@link Option} is a member
        * of this {@link Options}
        */
  -    public boolean hasOption( String opt ) {
  -        opt = Util.stripLeadingHyphens( opt );
  -        return shortOpts.containsKey( opt ) || longOpts.containsKey( opt );
  +    public boolean hasOption(String opt)
  +    {
  +        opt = Util.stripLeadingHyphens(opt);
  +
  +        return shortOpts.containsKey(opt) || longOpts.containsKey(opt);
       }
   
       /** <p>Returns the OptionGroup the <code>opt</code>
  @@ -255,23 +278,25 @@
        * @return the OptionGroup if <code>opt</code> is part
        * of an OptionGroup, otherwise return null
        */
  -    public OptionGroup getOptionGroup( Option opt ) {
  -        return (OptionGroup)optionGroups.get( opt.getKey() );
  +    public OptionGroup getOptionGroup(Option opt)
  +    {
  +        return (OptionGroup) optionGroups.get(opt.getKey());
       }
  -    
  +
       /** <p>Dump state, suitable for debugging.</p>
        *
        * @return Stringified form of this object
        */
  -    public String toString() {
  +    public String toString()
  +    {
           StringBuffer buf = new StringBuffer();
  -        
  +
           buf.append("[ Options: [ short ");
  -        buf.append( shortOpts.toString() );
  -        buf.append( " ] [ long " );
  -        buf.append( longOpts );
  -        buf.append( " ]");
  -        
  +        buf.append(shortOpts.toString());
  +        buf.append(" ] [ long ");
  +        buf.append(longOpts);
  +        buf.append(" ]");
  +
           return buf.toString();
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.3       +6 -7      jakarta-commons/cli/src/java/org/apache/commons/cli/ParseException.java
  
  Index: ParseException.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/ParseException.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ParseException.java	26 Aug 2002 20:15:02 -0000	1.2
  +++ ParseException.java	9 Dec 2002 23:47:25 -0000	1.3
  @@ -58,7 +58,6 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   /** 
  @@ -67,16 +66,16 @@
    * @author bob mcwhirter (bob @ werken.com)
    * @version $Revision$
    */
  -public class ParseException extends Exception 
  -{
  -    
  +public class ParseException extends Exception {
  +
       /** 
        * <p>Construct a new <code>ParseException</code> 
        * with the specified detail message.</p>
        *
        * @param message the detail message
        */
  -    public ParseException( String message ) {
  -        super( message );
  +    public ParseException(String message)
  +    {
  +        super(message);
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.11      +187 -104  jakarta-commons/cli/src/java/org/apache/commons/cli/Parser.java
  
  Index: Parser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Parser.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- Parser.java	27 Nov 2002 23:22:02 -0000	1.10
  +++ Parser.java	9 Dec 2002 23:47:25 -0000	1.11
  @@ -58,7 +58,6 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   import java.util.Arrays;
  @@ -66,7 +65,6 @@
   import java.util.Iterator;
   import java.util.List;
   import java.util.ListIterator;
  -import java.util.Map;
   import java.util.Properties;
   
   /**
  @@ -80,8 +78,10 @@
   
       /** commandline instance */
       private CommandLine cmd;
  +
       /** current Options */
       private Options options;
  +
       /** list of required options strings */
       private List requiredOptions;
   
  @@ -91,14 +91,13 @@
        * method.</p>
        *
        * @param opts The Options to parse the arguments by.
  -     * @param args The arguments that have to be flattened.
  +     * @param arguments The arguments that have to be flattened.
        * @param stopAtNonOption specifies whether to stop 
        * flattening when a non option has been encountered
        * @return a String array of the flattened arguments
        */
  -    abstract protected String[] flatten( Options opts, 
  -                                         String[] arguments, 
  -                                         boolean stopAtNonOption );
  +    protected abstract String[] flatten(Options opts, String[] arguments, 
  +                                        boolean stopAtNonOption);
   
       /**
        * <p>Parses the specified <code>arguments</code> 
  @@ -110,11 +109,10 @@
        * @throws ParseException if an error occurs when parsing the
        * arguments.
        */
  -    public CommandLine parse( Options options, 
  -                              String[] arguments ) 
  -    throws ParseException 
  +    public CommandLine parse(Options options, String[] arguments)
  +                      throws ParseException
       {
  -        return parse( options, arguments, null, false );
  +        return parse(options, arguments, null, false);
       }
   
       /**
  @@ -129,12 +127,11 @@
        * @throws ParseException if there are any problems encountered
        * while parsing the command line tokens.
        */
  -    public CommandLine parse( Options options, 
  -                              String[] arguments,
  -                              Properties properties ) 
  -    throws ParseException 
  +    public CommandLine parse(Options options, String[] arguments, 
  +                             Properties properties)
  +        throws ParseException
       {
  -        return parse( options, arguments, properties, false );
  +        return parse(options, arguments, properties, false);
       }
   
       /**
  @@ -152,12 +149,11 @@
        * @throws ParseException if an error occurs when parsing the
        * arguments.
        */
  -    public CommandLine parse( Options options, 
  -                              String[] arguments,
  -                              boolean stopAtNonOption ) 
  -    throws ParseException 
  +    public CommandLine parse(Options options, String[] arguments, 
  +                             boolean stopAtNonOption)
  +        throws ParseException
       {
  -        return parse( options, arguments, null, stopAtNonOption );
  +        return parse(options, arguments, null, stopAtNonOption);
       }
   
       /**
  @@ -167,117 +163,156 @@
        * @param options the specified Options
        * @param arguments the command line arguments
        * @param properties command line option name-value pairs
  +     * @param stopAtNonOption stop parsing the arguments when the first
  +     * non option is encountered.
  +     *
        * @return the list of atomic option and value tokens
        *
        * @throws ParseException if there are any problems encountered
        * while parsing the command line tokens.
        */
  -    public CommandLine parse( Options opts, 
  -                              String[] arguments, 
  -                              Properties properties,
  -                              boolean stopAtNonOption ) 
  -    throws ParseException 
  +    public CommandLine parse(Options options, String[] arguments, 
  +                             Properties properties, boolean stopAtNonOption)
  +        throws ParseException
       {
           // initialise members
  -        options = opts;
  +        this.options = options;
           requiredOptions = options.getRequiredOptions();
           cmd = new CommandLine();
   
           boolean eatTheRest = false;
   
  -        if( arguments == null ) {
  +        if (arguments == null)
  +        {
               arguments = new String[0];
           }
   
  -        List tokenList = Arrays.asList( flatten( opts, arguments, stopAtNonOption ) );
  +        List tokenList = Arrays.asList(flatten(this.options, 
  +                                               arguments, 
  +                                               stopAtNonOption));
  +
           ListIterator iterator = tokenList.listIterator();
   
           // process each flattened token
  -        while( iterator.hasNext() ) {
  -            String t = (String)iterator.next();
  +        while (iterator.hasNext())
  +        {
  +            String t = (String) iterator.next();
   
               // the value is the double-dash
  -            if( "--".equals( t ) ) {
  +            if ("--".equals(t))
  +            {
                   eatTheRest = true;
               }
  +
               // the value is a single dash
  -            else if( "-".equals( t ) ) {
  -                if( stopAtNonOption ) {
  +            else if ("-".equals(t))
  +            {
  +                if (stopAtNonOption)
  +                {
                       eatTheRest = true;
                   }
  -                else {
  -                    cmd.addArg(t );
  +                else
  +                {
  +                    cmd.addArg(t);
                   }
               }
  +
               // the value is an option
  -            else if( t.startsWith( "-" ) ) {
  -                if ( stopAtNonOption && !options.hasOption( t ) ) {
  +            else if (t.startsWith("-"))
  +            {
  +                if (stopAtNonOption && !options.hasOption(t))
  +                {
                       eatTheRest = true;
  -                    cmd.addArg( t );
  +                    cmd.addArg(t);
                   }
  -                else {
  -                    processOption( t, iterator );
  +                else
  +                {
  +                    processOption(t, iterator);
                   }
               }
  +
               // the value is an argument
  -            else {
  -                cmd.addArg( t );
  -                if( stopAtNonOption ) {
  +            else
  +            {
  +                cmd.addArg(t);
  +
  +                if (stopAtNonOption)
  +                {
                       eatTheRest = true;
                   }
               }
   
               // eat the remaining tokens
  -            if( eatTheRest ) {
  -                while( iterator.hasNext() ) {
  -                    String str = (String)iterator.next();
  +            if (eatTheRest)
  +            {
  +                while (iterator.hasNext())
  +                {
  +                    String str = (String) iterator.next();
  +
                       // ensure only one double-dash is added
  -                    if( !"--".equals( str ) ) {
  -                        cmd.addArg( str );
  +                    if (!"--".equals(str))
  +                    {
  +                        cmd.addArg(str);
                       }
                   }
               }
           }
  -        processProperties( properties );
  +
  +        processProperties(properties);
           checkRequiredOptions();
  +
           return cmd;
       }
   
       /**
  -     * <p>Sets the values of Options using the values in <code>properties</code>.</p>
  +     * <p>Sets the values of Options using the values in 
  +     * <code>properties</code>.</p>
  +     *
  +     * @param properties The value properties to be processed.
        */
  -    private void processProperties( Properties properties ) {
  -        if( properties == null ) {
  +    private void processProperties(Properties properties)
  +    {
  +        if (properties == null)
  +        {
               return;
           }
   
  -        for( Enumeration e = properties.propertyNames(); e.hasMoreElements(); ) {
  +        for (Enumeration e = properties.propertyNames(); e.hasMoreElements();)
  +        {
               String option = e.nextElement().toString();
  -            if( !cmd.hasOption( option ) ) {
  -                Option opt = options.getOption( option );
  +
  +            if (!cmd.hasOption(option))
  +            {
  +                Option opt = options.getOption(option);
   
                   // get the value from the properties instance
  -                String value = properties.getProperty( option );
  +                String value = properties.getProperty(option);
   
  -                if( opt.hasArgs() ) {
  -                    if( opt.getValues() == null || opt.getValues().length == 0 ) {
  -                        try {
  -                            opt.addValue( value );
  +                if (opt.hasArgs())
  +                {
  +                    if ((opt.getValues() == null)
  +                        || (opt.getValues().length == 0))
  +                    {
  +                        try
  +                        {
  +                            opt.addValue(value);
                           }
  -                        catch( RuntimeException exp ) {
  +                        catch (RuntimeException exp)
  +                        {
                               // if we cannot add the value don't worry about it
                           }
                       }
                   }
  -                else if ( ! ( "yes".equalsIgnoreCase( value ) ||
  -                              "true".equalsIgnoreCase( value ) ||
  -                              "1".equalsIgnoreCase( value) ) ) {
  +                else if (!("yes".equalsIgnoreCase(value) 
  +                           || "true".equalsIgnoreCase(value)
  +                           || "1".equalsIgnoreCase(value)))
  +                {
                       // if the value is not yes, true or 1 then don't add the
                       // option to the CommandLine
                       break;
                   }
   
  -                cmd.addOption( opt );
  +                cmd.addOption(opt);
               }
           }
       }
  @@ -285,93 +320,141 @@
       /**
        * <p>Throws a {@link MissingOptionException} if all of the
        * required options are no present.</p>
  +     *
  +     * @throws MissingOptionException if any of the required Options
  +     * are not present.
        */
       private void checkRequiredOptions()
  -    throws MissingOptionException 
  +        throws MissingOptionException
       {
  -
           // if there are required options that have not been
           // processsed
  -        if( requiredOptions.size() > 0 ) {
  +        if (requiredOptions.size() > 0)
  +        {
               Iterator iter = requiredOptions.iterator();
               StringBuffer buff = new StringBuffer();
   
               // loop through the required options
  -            while( iter.hasNext() ) {
  -                buff.append( iter.next() );
  +            while (iter.hasNext())
  +            {
  +                buff.append(iter.next());
               }
   
  -            throw new MissingOptionException( buff.toString() );
  +            throw new MissingOptionException(buff.toString());
           }
       }
   
  -    public void processArgs( Option opt, ListIterator iter ) 
  -    throws ParseException
  +    /**
  +     * <p>Process the argument values for the specified Option
  +     * <code>opt</code> using the values retrieved from the 
  +     * specified iterator <code>iter</code>.
  +     *
  +     * @param opt The current Option
  +     * @param iter The iterator over the flattened command line
  +     * Options.
  +     *
  +     * @throws ParseException if an argument value is required
  +     * and it is has not been found.
  +     */
  +    public void processArgs(Option opt, ListIterator iter)
  +        throws ParseException
       {
           // loop until an option is found
  -        while( iter.hasNext() ) {
  -            String str = (String)iter.next();
  +        while (iter.hasNext())
  +        {
  +            String str = (String) iter.next();
   
               // found an Option
  -            if( options.hasOption( str ) ) {
  +            if (options.hasOption(str))
  +            {
                   iter.previous();
  +
                   break;
               }
  +
               // found a value
  -            else {
  -                try {
  -                    opt.addValue( str ) ;
  +            else
  +            {
  +                try
  +                {
  +                    opt.addValue(str);
                   }
  -                catch( RuntimeException exp ) {
  +                catch (RuntimeException exp)
  +                {
                       iter.previous();
  +
                       break;
                   }
               }
           }
   
  -        if( opt.getValues() == null && !opt.hasOptionalArg() ) {
  -            throw new MissingArgumentException( "no argument for:" + opt.getKey() );
  +        if ((opt.getValues() == null) && !opt.hasOptionalArg())
  +        {
  +            throw new MissingArgumentException("no argument for:"
  +                                               + opt.getKey());
           }
       }
   
  -    private void processOption( String arg, ListIterator iter ) 
  -    throws ParseException
  +    /**
  +     * <p>Process the Option specified by <code>arg</code>
  +     * using the values retrieved from the specfied iterator
  +     * <code>iter</code>.
  +     *
  +     * @param arg The String value representing an Option
  +     * @param iter The iterator over the flattened command 
  +     * line arguments.
  +     *
  +     * @throws ParseException if <code>arg</code> does not
  +     * represent an Option
  +     */
  +    private void processOption(String arg, ListIterator iter)
  +        throws ParseException
       {
           // get the option represented by arg
           Option opt = null;
   
  -        boolean hasOption = options.hasOption( arg );
  +        boolean hasOption = options.hasOption(arg);
   
           // if there is no option throw an UnrecognisedOptionException
  -        if( !hasOption ) {
  -            throw new UnrecognizedOptionException("Unrecognized option: " + arg);
  -        }
  -        else {
  -            opt = (Option) options.getOption( arg );
  +        if (!hasOption)
  +        {
  +            throw new UnrecognizedOptionException("Unrecognized option: " 
  +                                                  + arg);
  +        }
  +        else
  +        {
  +            opt = (Option) options.getOption(arg);
           }
   
           // if the option is a required option remove the option from
           // the requiredOptions list
  -        if ( opt.isRequired() ) {
  -            requiredOptions.remove( opt.getKey() );
  +        if (opt.isRequired())
  +        {
  +            requiredOptions.remove(opt.getKey());
           }
   
           // if the option is in an OptionGroup make that option the selected
           // option of the group
  -        if ( options.getOptionGroup( opt ) != null ) {
  -            OptionGroup group = ( OptionGroup ) options.getOptionGroup( opt );
  -            if( group.isRequired() ) {
  -                requiredOptions.remove( group );
  +        if (options.getOptionGroup(opt) != null)
  +        {
  +            OptionGroup group = (OptionGroup) options.getOptionGroup(opt);
  +
  +            if (group.isRequired())
  +            {
  +                requiredOptions.remove(group);
               }
  -            group.setSelected( opt );
  +
  +            group.setSelected(opt);
           }
   
           // if the option takes an argument value
  -        if ( opt.hasArg() ) {
  -            processArgs( opt, iter );
  +        if (opt.hasArg())
  +        {
  +            processArgs(opt, iter);
           }
   
  +
           // set the option on the command line
  -        cmd.addOption( opt );
  +        cmd.addOption(opt);
       }
   }
  
  
  
  1.5       +87 -58    jakarta-commons/cli/src/java/org/apache/commons/cli/PatternOptionBuilder.java
  
  Index: PatternOptionBuilder.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/PatternOptionBuilder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PatternOptionBuilder.java	30 Jul 2002 23:06:21 -0000	1.4
  +++ PatternOptionBuilder.java	9 Dec 2002 23:47:25 -0000	1.5
  @@ -58,42 +58,50 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   /** 
    * Allows Options to be created from a single String.
    *
  + * @todo These need to break out to OptionType and also 
  + * to be pluggable.
    *
    * @author Henri Yandell (bayard @ generationjava.com)
    * @version $Revision$
    */
   public class PatternOptionBuilder {
   
  -    /// TODO: These need to break out to OptionType and also to be pluggable.
  -
       /** String class */
  -    public static final Class STRING_VALUE        = java.lang.String.class;
  +    public static final Class STRING_VALUE = java.lang.String.class;
  +
       /** Object class */
  -    public static final Class OBJECT_VALUE        = java.lang.Object.class;
  +    public static final Class OBJECT_VALUE = java.lang.Object.class;
  +
       /** Number class */
  -    public static final Class NUMBER_VALUE        = java.lang.Number.class;
  +    public static final Class NUMBER_VALUE = java.lang.Number.class;
  +
       /** Date class */
  -    public static final Class DATE_VALUE          = java.util.Date.class;
  +    public static final Class DATE_VALUE = java.util.Date.class;
  +
       /** Class class */
  -    public static final Class CLASS_VALUE         = java.lang.Class.class;
  +    public static final Class CLASS_VALUE = java.lang.Class.class;
  +
  +    /// can we do this one?? 
  +    // is meant to check that the file exists, else it errors.
  +    // ie) it's for reading not writing.
   
  -/// can we do this one?? 
  -// is meant to check that the file exists, else it errors.
  -// ie) it's for reading not writing.
       /** FileInputStream class */
  -    public static final Class EXISTING_FILE_VALUE = java.io.FileInputStream.class;
  +    public static final Class EXISTING_FILE_VALUE = 
  +            java.io.FileInputStream.class;
  +
       /** File class */
  -    public static final Class FILE_VALUE          = java.io.File.class;
  +    public static final Class FILE_VALUE = java.io.File.class;
  +
       /** File array class */
  -    public static final Class FILES_VALUE         = java.io.File[].class;
  +    public static final Class FILES_VALUE = java.io.File[].class;
  +
       /** URL class */
  -    public static final Class URL_VALUE           = java.net.URL.class;
  +    public static final Class URL_VALUE = java.net.URL.class;
   
       /**
        * <p>Retrieve the class that <code>ch</code> represents.</p>
  @@ -101,29 +109,48 @@
        * @param ch the specified character
        * @return The class that <code>ch</code> represents
        */
  -    public static Object getValueClass(char ch) {
  -        if (ch == '@') {
  +    public static Object getValueClass(char ch)
  +    {
  +        if (ch == '@')
  +        {
               return PatternOptionBuilder.OBJECT_VALUE;
  -        } else if (ch == ':') {
  +        }
  +        else if (ch == ':')
  +        {
               return PatternOptionBuilder.STRING_VALUE;
  -        } else if (ch == '%') {
  +        }
  +        else if (ch == '%')
  +        {
               return PatternOptionBuilder.NUMBER_VALUE;
  -        } else if (ch == '+') {
  +        }
  +        else if (ch == '+')
  +        {
               return PatternOptionBuilder.CLASS_VALUE;
  -        } else if (ch == '#') {
  +        }
  +        else if (ch == '#')
  +        {
               return PatternOptionBuilder.DATE_VALUE;
  -        } else if (ch == '<') {
  +        }
  +        else if (ch == '<')
  +        {
               return PatternOptionBuilder.EXISTING_FILE_VALUE;
  -        } else if (ch == '>') {
  +        }
  +        else if (ch == '>')
  +        {
               return PatternOptionBuilder.FILE_VALUE;
  -        } else if (ch == '*') {
  +        }
  +        else if (ch == '*')
  +        {
               return PatternOptionBuilder.FILES_VALUE;
  -        } else if (ch == '/') {
  +        }
  +        else if (ch == '/')
  +        {
               return PatternOptionBuilder.URL_VALUE;
           }
  +
           return null;
       }
  - 
  +
       /**
        * <p>Returns whether <code>ch</code> is a value code, i.e.
        * whether it represents a class in a pattern.</p>
  @@ -131,23 +158,18 @@
        * @param ch the specified character
        * @return true if <code>ch</code> is a value code, otherwise false.
        */
  -    public static boolean isValueCode(char ch) {
  -        if( (ch != '@') &&
  -            (ch != ':') &&
  -            (ch != '%') &&
  -            (ch != '+') &&
  -            (ch != '#') &&
  -            (ch != '<') &&
  -            (ch != '>') &&
  -            (ch != '*') &&
  -            (ch != '/')
  -          )
  +    public static boolean isValueCode(char ch)
  +    {
  +        if ((ch != '@') && (ch != ':') && (ch != '%') && (ch != '+')
  +            && (ch != '#') && (ch != '<') && (ch != '>') && (ch != '*')
  +            && (ch != '/'))
           {
               return false;
           }
  +
           return true;
  -    }       
  - 
  +    }
  +
       /**
        * <p>Returns the {@link Options} instance represented by 
        * <code>pattern</code>.</p>
  @@ -155,7 +177,8 @@
        * @param pattern the pattern string
        * @return The {@link Options} instance
        */
  -    public static Options parsePattern(String pattern) {
  +    public static Options parsePattern(String pattern)
  +    {
           int sz = pattern.length();
   
           char opt = ' ';
  @@ -164,41 +187,47 @@
           Object type = null;
   
           Options options = new Options();
  -        
  -        for(int i=0; i<sz; i++) {
  +
  +        for (int i = 0; i < sz; i++)
  +        {
               ch = pattern.charAt(i);
   
               // a value code comes after an option and specifies 
               // details about it
  -            if(!isValueCode(ch)) {
  -                if(opt != ' ') {
  +            if (!isValueCode(ch))
  +            {
  +                if (opt != ' ')
  +                {
                       // we have a previous one to deal with
  -                    options.addOption( OptionBuilder.hasArg( type != null )
  -                                                    .isRequired( required )
  -                                                    .withType( type )
  -                                                    .create( opt ) );
  +                    options.addOption(
  +                            OptionBuilder.hasArg(type != null)
  +                                         .isRequired(required).withType(type)
  +                                         .create(opt));
                       required = false;
                       type = null;
                       opt = ' ';
                   }
  +
                   opt = ch;
  -            } else
  -            if(ch == '!') {
  +            }
  +            else if (ch == '!')
  +            {
                   required = true;
  -            } else {
  +            }
  +            else
  +            {
                   type = getValueClass(ch);
               }
           }
   
  -        if(opt != ' ') {
  +        if (opt != ' ')
  +        {
               // we have a final one to deal with
  -            options.addOption( OptionBuilder.hasArg( type != null )
  -                                            .isRequired( required )
  -                                            .withType( type )
  -                                            .create( opt ) );
  +            options.addOption(
  +                    OptionBuilder.hasArg(type != null).isRequired(required)
  +                                 .withType(type).create(opt));
           }
   
           return options;
       }
  -
  -}
  +}
  \ No newline at end of file
  
  
  
  1.12      +111 -73   jakarta-commons/cli/src/java/org/apache/commons/cli/PosixParser.java
  
  Index: PosixParser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/PosixParser.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- PosixParser.java	19 Sep 2002 22:59:43 -0000	1.11
  +++ PosixParser.java	9 Dec 2002 23:47:25 -0000	1.12
  @@ -60,11 +60,9 @@
    */
   package org.apache.commons.cli;
   
  -import java.util.Arrays;
   import java.util.ArrayList;
  -import java.util.Collection;
  +import java.util.Arrays;
   import java.util.Iterator;
  -import java.util.Map;
   
   /**
    * The class PosixParser provides an implementation of the 
  @@ -78,10 +76,13 @@
   
       /** holder for flattened tokens */
       private ArrayList tokens = new ArrayList();
  +
       /** specifies if bursting should continue */
       private boolean eatTheRest;
  +
       /** holder for the current option */
       private Option currentOption;
  +
       /** the command line Options */
       private Options options;
   
  @@ -90,7 +91,8 @@
        * all of <code>tokens</code> entries, set <code>eatTheRest</code>
        * to false and set <code>currentOption</code> to null.</p>
        */
  -    private void init() {
  +    private void init()
  +    {
           eatTheRest = false;
           tokens.clear();
           currentOption = null;
  @@ -121,7 +123,7 @@
        *  characters in length and the first character is "<b>-</b>" then
        *  we need to burst the entry to determine its constituents.  For more
        *  information on the bursting algorithm see 
  -     *  {@link PosixParser#burstToken( String, boolean) burstToken}.</li>
  +     *  {@link PosixParser#burstToken(String, boolean) burstToken}.</li>
        *  <li>if the current <code>arguments</code> entry is not handled 
        *  by any of the previous rules, then the entry is added to the list
        *  of processed tokens.</li>
  @@ -134,61 +136,73 @@
        * when an non option is found.
        * @return The flattened <code>arguments</code> String array.
        */
  -    protected String[] flatten( Options options, 
  -                                String[] arguments, 
  -                                boolean stopAtNonOption )
  +    protected String[] flatten(Options options, String[] arguments, 
  +                               boolean stopAtNonOption)
       {
           init();
           this.options = options;
   
           // an iterator for the command line tokens
  -        Iterator iter = Arrays.asList( arguments ).iterator();
  +        Iterator iter = Arrays.asList(arguments).iterator();
           String token = null;
  -        
  -        // process each command line token
  -        while ( iter.hasNext() ) {
   
  +        // process each command line token
  +        while (iter.hasNext())
  +        {
               // get the next command line token
               token = (String) iter.next();
   
               // handle SPECIAL TOKEN
  -            if( token.startsWith( "--" ) ) {
  -                if( token.indexOf( '=' ) != -1 ) {
  -                    tokens.add( token.substring( 0, token.indexOf( '=' ) ) );
  -                    tokens.add( token.substring( token.indexOf( '=' ) + 1,
  -                                                 token.length() ) );
  -                }
  -                else {
  -                    tokens.add( token );
  -                }	
  +            if (token.startsWith("--"))
  +            {
  +                if (token.indexOf('=') != -1)
  +                {
  +                    tokens.add(token.substring(0, token.indexOf('=')));
  +                    tokens.add(token.substring(token.indexOf('=') + 1, 
  +                                               token.length()));
  +                }
  +                else
  +                {
  +                    tokens.add(token);
  +                }
               }
  +
               // single hyphen
  -            else if( "-".equals( token ) ) {
  -                processSingleHyphen( token );
  +            else if ("-".equals(token))
  +            {
  +                processSingleHyphen(token);
               }
  -            else if( token.startsWith( "-" ) ) {
  +            else if (token.startsWith("-"))
  +            {
                   int tokenLength = token.length();
  -                if( tokenLength == 2 ) {
  -                    processOptionToken( token, stopAtNonOption );
  +
  +                if (tokenLength == 2)
  +                {
  +                    processOptionToken(token, stopAtNonOption);
                   }
  +
                   // requires bursting
  -                else {
  -                    burstToken( token, stopAtNonOption );
  +                else
  +                {
  +                    burstToken(token, stopAtNonOption);
                   }
               }
  -            else {
  -                if( stopAtNonOption ) {
  -                    process( token );
  +            else
  +            {
  +                if (stopAtNonOption)
  +                {
  +                    process(token);
                   }
  -                else {
  -                    tokens.add( token );
  +                else
  +                {
  +                    tokens.add(token);
                   }
               }
   
  -            gobble( iter );
  +            gobble(iter);
           }
   
  -        return (String[])tokens.toArray( new String[] {} );
  +        return (String[]) tokens.toArray(new String[] {  });
       }
   
       /**
  @@ -196,10 +210,13 @@
        *
        * @param iter An iterator over the remaining tokens
        */
  -    private void gobble( Iterator iter ) {
  -        if( eatTheRest ) {
  -            while( iter.hasNext() ) {
  -                tokens.add( iter.next() );
  +    private void gobble(Iterator iter)
  +    {
  +        if (eatTheRest)
  +        {
  +            while (iter.hasNext())
  +            {
  +                tokens.add(iter.next());
               }
           }
       }
  @@ -217,20 +234,25 @@
        *
        * @param value The current token
        */
  -    private void process( String value ) {
  -        if( currentOption != null && currentOption.hasArg() ) {
  -            if( currentOption.hasArg() ) {
  -                tokens.add( value );
  +    private void process(String value)
  +    {
  +        if ((currentOption != null) && currentOption.hasArg())
  +        {
  +            if (currentOption.hasArg())
  +            {
  +                tokens.add(value);
                   currentOption = null;
               }
  -            else if (currentOption.hasArgs() ) {
  -                tokens.add( value );
  +            else if (currentOption.hasArgs())
  +            {
  +                tokens.add(value);
               }
           }
  -        else {
  +        else
  +        {
               eatTheRest = true;
  -            tokens.add( "--" );
  -            tokens.add( value );
  +            tokens.add("--");
  +            tokens.add(value);
           }
       }
   
  @@ -240,8 +262,9 @@
        *
        * @param hyphen The hyphen token
        */
  -    private void processSingleHyphen( String hyphen ) {
  -        tokens.add( hyphen );
  +    private void processSingleHyphen(String hyphen)
  +    {
  +        tokens.add(hyphen);
       }
   
       /**
  @@ -256,12 +279,15 @@
        * @param stopAtNonOption Specifies whether flattening should halt
        * at the first non option.
        */
  -    private void processOptionToken( String token, boolean stopAtNonOption ) {
  -        if( this.options.hasOption( token ) ) {
  -            currentOption = this.options.getOption( token );
  -            tokens.add( token );
  +    private void processOptionToken(String token, boolean stopAtNonOption)
  +    {
  +        if (this.options.hasOption(token))
  +        {
  +            currentOption = this.options.getOption(token);
  +            tokens.add(token);
           }
  -        else if( stopAtNonOption ) {
  +        else if (stopAtNonOption)
  +        {
               eatTheRest = true;
           }
       }
  @@ -270,7 +296,7 @@
        * <p>Breaks <code>token</code> into its constituent parts
        * using the following algorithm.
        * <ul>
  -     *  <li>ignore the first character ("<b>-</b>" )</li>
  +     *  <li>ignore the first character ("<b>-</b>")</li>
        *  <li>foreach remaining character check if an {@link Option}
        *  exists with that id.</li>
        *  <li>if an {@link Option} does exist then add that character
  @@ -287,27 +313,39 @@
        *  character prepended with "<b>-</b>".</li>
        * </ul>
        * </p>
  +     *
  +     * @param token The current token to be <b>burst</b>
  +     * @param stopAtNonOption Specifies whether to stop processing
  +     * at the first non-Option encountered.
        */
  -    protected void burstToken( String token, boolean stopAtNonOption ) {
  +    protected void burstToken(String token, boolean stopAtNonOption)
  +    {
           int tokenLength = token.length();
   
  -        for( int i = 1; i < tokenLength; i++) {
  -            String ch = String.valueOf( token.charAt( i ) );
  -            boolean hasOption = options.hasOption( ch );
  -
  -            if( hasOption ) {
  -                tokens.add( "-" + ch );
  -                currentOption = options.getOption( ch );
  -                if( currentOption.hasArg() && token.length()!=i+1 ) {
  -                    tokens.add( token.substring( i+1 ) );
  +        for (int i = 1; i < tokenLength; i++)
  +        {
  +            String ch = String.valueOf(token.charAt(i));
  +            boolean hasOption = options.hasOption(ch);
  +
  +            if (hasOption)
  +            {
  +                tokens.add("-" + ch);
  +                currentOption = options.getOption(ch);
  +
  +                if (currentOption.hasArg() && (token.length() != (i + 1)))
  +                {
  +                    tokens.add(token.substring(i + 1));
  +
                       break;
                   }
               }
  -            else if( stopAtNonOption ) {
  -                process( token.substring( i ) );
  +            else if (stopAtNonOption)
  +            {
  +                process(token.substring(i));
               }
  -            else {
  -                tokens.add( "-" + ch );
  +            else
  +            {
  +                tokens.add("-" + ch);
               }
           }
       }
  
  
  
  1.6       +103 -54   jakarta-commons/cli/src/java/org/apache/commons/cli/TypeHandler.java
  
  Index: TypeHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/TypeHandler.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TypeHandler.java	26 Jul 2002 14:12:34 -0000	1.5
  +++ TypeHandler.java	9 Dec 2002 23:47:25 -0000	1.6
  @@ -58,12 +58,13 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   import java.io.File;
  -import java.net.URL;
  +
   import java.net.MalformedURLException;
  +import java.net.URL;
  +
   import java.util.Date;
   
   import org.apache.commons.lang.NumberUtils;
  @@ -76,7 +77,7 @@
     *
     * @author Henri Yandell (bayard @ generationjava.com)
     * @version $Revision$
  -  */    
  +  */
   public class TypeHandler {
   
       /**
  @@ -88,8 +89,9 @@
        * @return The instance of <code>obj</code> initialised with
        * the value of <code>str</code>.
        */
  -    public static Object createValue(String str, Object obj) {
  -        return createValue(str, (Class)obj);
  +    public static Object createValue(String str, Object obj)
  +    {
  +        return createValue(str, (Class) obj);
       }
   
       /**
  @@ -101,34 +103,46 @@
        * @return The instance of <code>clazz</code> initialised with
        * the value of <code>str</code>.
        */
  -    public static Object createValue(String str, Class clazz) {
  -        if( PatternOptionBuilder.STRING_VALUE == clazz) {
  +    public static Object createValue(String str, Class clazz)
  +    {
  +        if (PatternOptionBuilder.STRING_VALUE == clazz)
  +        {
               return str;
  -        } else
  -        if( PatternOptionBuilder.OBJECT_VALUE == clazz) {
  +        }
  +        else if (PatternOptionBuilder.OBJECT_VALUE == clazz)
  +        {
               return createObject(str);
  -        } else
  -        if( PatternOptionBuilder.NUMBER_VALUE == clazz) {
  +        }
  +        else if (PatternOptionBuilder.NUMBER_VALUE == clazz)
  +        {
               return createNumber(str);
  -        } else
  -        if( PatternOptionBuilder.DATE_VALUE   == clazz) {
  +        }
  +        else if (PatternOptionBuilder.DATE_VALUE == clazz)
  +        {
               return createDate(str);
  -        } else
  -        if( PatternOptionBuilder.CLASS_VALUE  == clazz) {
  +        }
  +        else if (PatternOptionBuilder.CLASS_VALUE == clazz)
  +        {
               return createClass(str);
  -        } else
  -        if( PatternOptionBuilder.FILE_VALUE   == clazz) {
  +        }
  +        else if (PatternOptionBuilder.FILE_VALUE == clazz)
  +        {
               return createFile(str);
  -        } else
  -        if( PatternOptionBuilder.EXISTING_FILE_VALUE   == clazz) {
  +        }
  +        else if (PatternOptionBuilder.EXISTING_FILE_VALUE == clazz)
  +        {
               return createFile(str);
  -        } else
  -        if( PatternOptionBuilder.FILES_VALUE  == clazz) {
  +        }
  +        else if (PatternOptionBuilder.FILES_VALUE == clazz)
  +        {
               return createFiles(str);
  -        } else
  -        if( PatternOptionBuilder.URL_VALUE    == clazz) {
  +        }
  +        else if (PatternOptionBuilder.URL_VALUE == clazz)
  +        {
               return createURL(str);
  -        } else {
  +        }
  +        else
  +        {
               return null;
           }
       }
  @@ -137,27 +151,42 @@
         * <p>Create an Object from the classname and empty constructor.</p>
         *
         * @param str the argument value
  -      * @return the initialised object, or null if it couldn't create the Object.
  +      * @return the initialised object, or null if it couldn't create 
  +      * the Object.
         */
  -    public static Object createObject(String str) {
  +    public static Object createObject(String str)
  +    {
           Class cl = null;
  -        try {
  +
  +        try
  +        {
               cl = Class.forName(str);
  -        } catch (ClassNotFoundException cnfe) {
  -            System.err.println("Unable to find: "+str);
  +        }
  +        catch (ClassNotFoundException cnfe)
  +        {
  +            System.err.println("Unable to find: " + str);
  +
               return null;
           }
   
           Object instance = null;
   
  -        try {
  +        try
  +        {
               instance = cl.newInstance();
  -        } catch (InstantiationException cnfe) {
  -            System.err.println("InstantiationException; Unable to create: "+str);
  +        }
  +        catch (InstantiationException cnfe)
  +        {
  +            System.err.println("InstantiationException; Unable to create: "
  +                               + str);
  +
               return null;
           }
  -        catch (IllegalAccessException cnfe) {
  -            System.err.println("IllegalAccessException; Unable to create: "+str);
  +        catch (IllegalAccessException cnfe)
  +        {
  +            System.err.println("IllegalAccessException; Unable to create: "
  +                               + str);
  +
               return null;
           }
   
  @@ -171,13 +200,18 @@
        * @return the number represented by <code>str</code>, if <code>str</code>
        * is not a number, null is returned.
        */
  -    public static Number createNumber(String str) {
  +    public static Number createNumber(String str)
  +    {
           // Needs to be able to create
  -        try {
  +        try
  +        {
               // do searching for decimal point etc, but atm just make an Integer
               return NumberUtils.createNumber(str);
  -        } catch (NumberFormatException nfe) {
  +        }
  +        catch (NumberFormatException nfe)
  +        {
               System.err.println(nfe.getMessage());
  +
               return null;
           }
       }
  @@ -188,11 +222,16 @@
        * @param str the class name
        * @return The class if it is found, otherwise return null
        */
  -    public static Class createClass(String str) {
  -        try {
  +    public static Class createClass(String str)
  +    {
  +        try
  +        {
               return Class.forName(str);
  -        } catch (ClassNotFoundException cnfe) {
  -            System.err.println("Unable to find: "+str);
  +        }
  +        catch (ClassNotFoundException cnfe)
  +        {
  +            System.err.println("Unable to find: " + str);
  +
               return null;
           }
       }
  @@ -204,11 +243,15 @@
        * @return The date if <code>str</code> is a valid date string,
        * otherwise return null.
        */
  -    public static Date createDate(String str) {
  +    public static Date createDate(String str)
  +    {
           Date date = null;
  -        if(date == null) {
  -            System.err.println("Unable to parse: "+str);
  +
  +        if (date == null)
  +        {
  +            System.err.println("Unable to parse: " + str);
           }
  +
           return date;
       }
   
  @@ -219,11 +262,16 @@
        * @return The URL is <code>str</code> is well-formed, otherwise
        * return null.
        */
  -    public static URL createURL(String str) {
  -        try {
  +    public static URL createURL(String str)
  +    {
  +        try
  +        {
               return new URL(str);
  -        } catch (MalformedURLException mue) {
  -            System.err.println("Unable to parse: "+str);
  +        }
  +        catch (MalformedURLException mue)
  +        {
  +            System.err.println("Unable to parse: " + str);
  +
               return null;
           }
       }
  @@ -234,7 +282,8 @@
        * @param str the File location
        * @return The file represented by <code>str</code>.
        */
  -    public static File createFile(String str) {
  +    public static File createFile(String str)
  +    {
           return new File(str);
       }
   
  @@ -244,10 +293,10 @@
        * @param str the paths to the files
        * @return The File[] represented by <code>str</code>.
        */
  -    public static File[] createFiles(String str) {
  -// to implement/port:
  -//        return FileW.findFiles(str);
  +    public static File[] createFiles(String str)
  +    {
  +        // to implement/port:
  +        //        return FileW.findFiles(str);
           return null;
       }
  -
  -}
  +}
  \ No newline at end of file
  
  
  
  1.3       +7 -6      jakarta-commons/cli/src/java/org/apache/commons/cli/UnrecognizedOptionException.java
  
  Index: UnrecognizedOptionException.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/UnrecognizedOptionException.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- UnrecognizedOptionException.java	26 Aug 2002 20:15:02 -0000	1.2
  +++ UnrecognizedOptionException.java	9 Dec 2002 23:47:25 -0000	1.3
  @@ -58,7 +58,6 @@
    * <http://www.apache.org/>.
    *
    */
  -
   package org.apache.commons.cli;
   
   /** 
  @@ -68,15 +67,17 @@
    * @author bob mcwhiter (bob @ werken.com)
    * @version $Revision$
    */
  -public class UnrecognizedOptionException extends ParseException {
  -    
  +public class UnrecognizedOptionException
  +    extends ParseException {
  +
       /** 
        * <p>Construct a new <code>UnrecognizedArgumentException</code> 
        * with the specified detail message.</p>
        *
        * @param message the detail message
        */
  -    public UnrecognizedOptionException( String message ) {
  -        super( message );
  +    public UnrecognizedOptionException(String message)
  +    {
  +        super(message);
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.2       +22 -9     jakarta-commons/cli/src/java/org/apache/commons/cli/Util.java
  
  Index: Util.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Util.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Util.java	18 Nov 2002 08:41:26 -0000	1.1
  +++ Util.java	9 Dec 2002 23:47:25 -0000	1.2
  @@ -67,13 +67,26 @@
    */
   class Util {
   
  -    static String stripLeadingHyphens( String str ) {
  -        if( str.startsWith( "--" ) ) {
  -            return str.substring( 2, str.length() );
  +    /**
  +     * <p>Remove the hyphens from the begining of <code>str</code> and
  +     * return the new String.</p>
  +     *
  +     * @param str The string from which the hyphens should be removed.
  +     *
  +     * @return the hyphens from the begining of <code>str</code> and
  +     * return the new String.
  +     */
  +    static String stripLeadingHyphens(String str)
  +    {
  +        if (str.startsWith("--"))
  +        {
  +            return str.substring(2, str.length());
           }
  -        else if ( str.startsWith( "-" ) ) {
  -            return str.substring( 1, str.length() );
  +        else if (str.startsWith("-"))
  +        {
  +            return str.substring(1, str.length());
           }
  +
           return str;
       }
  -            }
  \ No newline at end of file
  +}
  \ No newline at end of file
  
  
  
  1.6       +11 -11    jakarta-commons/cli/src/test/org/apache/commons/cli/TestHelpFormatter.java
  
  Index: TestHelpFormatter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/test/org/apache/commons/cli/TestHelpFormatter.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TestHelpFormatter.java	4 Oct 2002 11:06:58 -0000	1.5
  +++ TestHelpFormatter.java	9 Dec 2002 23:47:26 -0000	1.6
  @@ -64,18 +64,18 @@
         String text = "This is a test.";
         String expected;
   
  -      expected = "This is a" + hf.defaultNewLine + "test.";
  +      expected = "This is a" + hf.getNewLine() + "test.";
         hf.renderWrappedText(sb, 12, 0, text);
         assertEquals("single line text", expected, sb.toString());
   
         sb.setLength(0);
  -      expected = "This is a" + hf.defaultNewLine + "    test.";
  +      expected = "This is a" + hf.getNewLine() + "    test.";
         hf.renderWrappedText(sb, 12, 4, text);
         assertEquals("single line padded text", expected, sb.toString());
   
         text =
  -         "aaaa aaaa aaaa" + hf.defaultNewLine +
  -         "aaaaaa" + hf.defaultNewLine +
  +         "aaaa aaaa aaaa" + hf.getNewLine() +
  +         "aaaaaa" + hf.getNewLine() +
            "aaaaa";
   
         expected = text;
  @@ -84,8 +84,8 @@
         assertEquals("multi line text", expected, sb.toString());
   
         expected =
  -         "aaaa aaaa aaaa" + hf.defaultNewLine +
  -         "    aaaaaa" + hf.defaultNewLine +
  +         "aaaa aaaa aaaa" + hf.getNewLine() +
  +         "    aaaaaa" + hf.getNewLine() +
            "    aaaaa";
         sb.setLength(0);
         hf.renderWrappedText(sb, 16, 4, text);
  @@ -111,7 +111,7 @@
   
          int nextLineTabStop = leftPad+descPad+"-a".length();
          expected =
  -           lpad + "-a" + dpad + "aaaa aaaa aaaa" + hf.defaultNewLine +
  +           lpad + "-a" + dpad + "aaaa aaaa aaaa" + hf.getNewLine() +
              hf.createPadding(nextLineTabStop) + "aaaa aaaa";
          sb.setLength(0);
          hf.renderOptions(sb, nextLineTabStop+17, options, leftPad, descPad);
  @@ -126,7 +126,7 @@
   
          nextLineTabStop = leftPad+descPad+"-a,--aaa".length();
          expected =
  -           lpad + "-a,--aaa" + dpad + "dddd dddd" + hf.defaultNewLine +
  +           lpad + "-a,--aaa" + dpad + "dddd dddd" + hf.getNewLine() +
              hf.createPadding(nextLineTabStop) + "dddd dddd";
          sb.setLength(0);
          hf.renderOptions(sb, 25, options, leftPad, descPad);
  @@ -136,9 +136,9 @@
              addOption("a", "aaa", false, "dddd dddd dddd dddd").
              addOption("b", false, "feeee eeee eeee eeee");
          expected =
  -           lpad + "-a,--aaa" + dpad + "dddd dddd" + hf.defaultNewLine +
  -           hf.createPadding(nextLineTabStop) + "dddd dddd" + hf.defaultNewLine +
  -           lpad + "-b      " + dpad + "feeee eeee" + hf.defaultNewLine +
  +           lpad + "-a,--aaa" + dpad + "dddd dddd" + hf.getNewLine() +
  +           hf.createPadding(nextLineTabStop) + "dddd dddd" + hf.getNewLine() +
  +           lpad + "-b      " + dpad + "feeee eeee" + hf.getNewLine() +
              hf.createPadding(nextLineTabStop) + "eeee eeee";
          sb.setLength(0);
          hf.renderOptions(sb, 25, options, leftPad, descPad);
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>