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 2003/06/04 03:11:41 UTC

cvs commit: jakarta-commons/cli/src/java/org/apache/commons/cli OptionGroup.java ExclusiveOptionGroup.java AnonymousArgumentImpl.java Options.java InclusiveOptionGroup.java CommandLineParser.java

jkeyes      2003/06/03 18:11:41

  Modified:    cli/src/java/org/apache/commons/cli Tag: cli_1_x
                        OptionGroup.java ExclusiveOptionGroup.java
                        AnonymousArgumentImpl.java Options.java
                        InclusiveOptionGroup.java CommandLineParser.java
  Log:
  inital work on new OptionGroup support, some tidy up remains
  added license
  removed tabs
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.8.2.2   +67 -9     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.8.2.1
  retrieving revision 1.8.2.2
  diff -u -r1.8.2.1 -r1.8.2.2
  --- OptionGroup.java	19 May 2003 20:59:44 -0000	1.8.2.1
  +++ OptionGroup.java	4 Jun 2003 01:11:40 -0000	1.8.2.2
  @@ -1,16 +1,74 @@
  +/*
  + * $Header$
  + * $Revision$
  + * $Date$
  + *
  + * ====================================================================
  + *
  + * The Apache Software License, Version 1.1
  + *
  + * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
  + * reserved.
  + *
  + * Redistribution and use in source and binary forms, with or without
  + * modification, are permitted provided that the following conditions
  + * are met:
  + *
  + * 1. Redistributions of source code must retain the above copyright
  + *    notice, this list of conditions and the following disclaimer.
  + *
  + * 2. Redistributions in binary form must reproduce the above copyright
  + *    notice, this list of conditions and the following disclaimer in
  + *    the documentation and/or other materials provided with the
  + *    distribution.
  + *
  + * 3. The end-user documentation included with the redistribution, if
  + *    any, must include the following acknowlegement:
  + *       "This product includes software developed by the
  + *        Apache Software Foundation (http://www.apache.org/)."
  + *    Alternately, this acknowlegement may appear in the software itself,
  + *    if and wherever such third-party acknowlegements normally appear.
  + *
  + * 4. The names "The Jakarta Project", "Commons", and "Apache Software
  + *    Foundation" must not be used to endorse or promote products derived
  + *    from this software without prior written permission. For written
  + *    permission, please contact apache@apache.org.
  + *
  + * 5. Products derived from this software may not be called "Apache"
  + *    nor may "Apache" appear in their names without prior written
  + *    permission of the Apache Group.
  + *
  + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  + * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  + * SUCH DAMAGE.
  + * ====================================================================
  + *
  + * This software consists of voluntary contributions made by many
  + * individuals on behalf of the Apache Software Foundation.  For more
  + * information on the Apache Software Foundation, please see
  + * <http://www.apache.org/>;.
  + *
  + */
   package org.apache.commons.cli;
   
  -import java.util.Set;
  -
   /**
  - * @author jkeyes
  + * @author John Keyes
    */
   public interface OptionGroup {
   
  -	Set getOptions();
  -	boolean containsOption(Option option);
  -	boolean isSelected();
  -	void setSelected(Option option);
  -	void reset();
  -	
  +
  +    boolean hasOption(String name);
  +    
  +    Option getOption(String name);
  +    
  +    void isValid(CommandLine line) throws ParseException;    
   }
  
  
  
  1.1.2.2   +176 -84   jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/ExclusiveOptionGroup.java
  
  Index: ExclusiveOptionGroup.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/ExclusiveOptionGroup.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- ExclusiveOptionGroup.java	19 May 2003 20:57:51 -0000	1.1.2.1
  +++ ExclusiveOptionGroup.java	4 Jun 2003 01:11:40 -0000	1.1.2.2
  @@ -1,101 +1,193 @@
  +/*
  + * $Header$
  + * $Revision$
  + * $Date$
  + *
  + * ====================================================================
  + *
  + * The Apache Software License, Version 1.1
  + *
  + * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
  + * reserved.
  + *
  + * Redistribution and use in source and binary forms, with or without
  + * modification, are permitted provided that the following conditions
  + * are met:
  + *
  + * 1. Redistributions of source code must retain the above copyright
  + *    notice, this list of conditions and the following disclaimer.
  + *
  + * 2. Redistributions in binary form must reproduce the above copyright
  + *    notice, this list of conditions and the following disclaimer in
  + *    the documentation and/or other materials provided with the
  + *    distribution.
  + *
  + * 3. The end-user documentation included with the redistribution, if
  + *    any, must include the following acknowlegement:
  + *       "This product includes software developed by the
  + *        Apache Software Foundation (http://www.apache.org/)."
  + *    Alternately, this acknowlegement may appear in the software itself,
  + *    if and wherever such third-party acknowlegements normally appear.
  + *
  + * 4. The names "The Jakarta Project", "Commons", and "Apache Software
  + *    Foundation" must not be used to endorse or promote products derived
  + *    from this software without prior written permission. For written
  + *    permission, please contact apache@apache.org.
  + *
  + * 5. Products derived from this software may not be called "Apache"
  + *    nor may "Apache" appear in their names without prior written
  + *    permission of the Apache Group.
  + *
  + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  + * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  + * SUCH DAMAGE.
  + * ====================================================================
  + *
  + * This software consists of voluntary contributions made by many
  + * individuals on behalf of the Apache Software Foundation.  For more
  + * information on the Apache Software Foundation, please see
  + * <http://www.apache.org/>;.
  + *
  + */
   package org.apache.commons.cli;
   
   import java.util.HashSet;
   import java.util.Iterator;
   import java.util.Set;
   
  +/**
  + * @author John Keyes
  + */
   public class ExclusiveOptionGroup implements OptionGroup {
   
       private Set options = new HashSet();
  -    private Set incGroups = new HashSet();
  -    private Option selected = null;
  -    private InclusiveOptionGroup selectedGroup = null;
  -    private boolean mandatory;
  -
  -    public ExclusiveOptionGroup() {
  -    }
  -
  -    public ExclusiveOptionGroup( Set options ) {
  -        options.addAll( options );
  -    }
  -
  -    public void add( Option option ) {
  -        options.add( option );
  -    }
  -
  -    public void add( Set options ) {
  -        options.addAll( options );
  -    }
       
  -    public void add(InclusiveOptionGroup group) {
  -   		incGroups.add(group);
  -    }
  -
  -    public Set getOptions() {
  -    	return this.options;
  -    }
  -
  -	public Set getOptionGroups() {
  -		return this.incGroups;
  -	}
  -	
  -    public boolean containsOption( Option option ) {
  -    	if(this.options.contains(option)) {
  -    		return true;
  -    	}
  -    	else {
  -    		for(Iterator iter = this.incGroups.iterator(); iter.hasNext();) {
  -				OptionGroup group = (OptionGroup) iter.next();
  -				if (group.containsOption(option)) {
  -					return true;
  -				}
  -    		}
  -    	}
  -        return false;
  -    }
  -
  -    public void setSelected( Option option ) {
  -    	if (option == null) {
  -    		this.selected = null;
  -    		this.selectedGroup = null;	
  -    	}
  -    	
  -		if(this.options.contains(option)) {
  -			this.selected = option;
  -		}
  -		else {
  -			for(Iterator iter = this.incGroups.iterator(); iter.hasNext();) {
  -				InclusiveOptionGroup group = (InclusiveOptionGroup) iter.next();
  -				if (group.containsOption(option)) {
  -					this.selectedGroup = group;
  -					group.setSelected(option);
  -					return;
  -				}
  -			}
  -		}
  -    }
  +    private Set optionGroups = new HashSet();
       
  -    public void setSelected( InclusiveOptionGroup group ) {
  -    	this.selectedGroup = group;
  +    public void add(Option option) {
  +        this.options.add(option);
       }
  -
  -    public boolean isSelected() {
  -    	if( this.selectedGroup != null && this.selectedGroup.allSelected()) {
  -    		return true;
  -    	}
  -        return (selected != null);
  -    }
  -
  -    public void setMandatory( boolean mandatory ) {
  -        this.mandatory = mandatory;
  +    
  +    public void add(OptionGroup group) {
  +        this.optionGroups.add(group);
       }
   
  -    public boolean isMandatory() {
  -        return this.mandatory;
  +    public boolean hasOption(String name) {
  +        
  +        if (name == null) {
  +            return false;
  +        }
  +        
  +        if (!options.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                Option option = (Option)iter.next();
  +                
  +                if (name.equals( "-" + option.getName())) {
  +                    return true;   
  +                }
  +                else if (name.equals( "--" + option.getLongName())) {
  +                    return true;
  +                }
  +            }
  +        }
  +        
  +        if (!optionGroups.isEmpty()) {
  +            for (Iterator iter = optionGroups.iterator(); iter.hasNext();) {
  +                OptionGroup group = (OptionGroup)iter.next();
  +                
  +                if (group.hasOption(name)) {
  +                   return true;                 
  +                }
  +            }
  +        }
  +        
  +        return false;
       }
  -    
  -    public void reset() {
  -    	//this.selected = null;
  -    	this.selectedGroup = null;
  +  
  +    public Option getOption(String name) {
  +        
  +        if (name == null) {
  +            return null;
  +        }
  +        
  +        if (!options.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                Option option = (Option)iter.next();
  +                
  +                if (name.equals("-" + option.getName())) {
  +                    return option;   
  +                }
  +                else if (name.equals("--" + option.getLongName())) {
  +                    return option;
  +                }
  +            }
  +        }
  +        
  +        if (!optionGroups.isEmpty()) {
  +            for (Iterator iter = optionGroups.iterator(); iter.hasNext();) {
  +                OptionGroup group = (OptionGroup)iter.next();
  +                
  +                if (group.hasOption(name)) {
  +                   return group.getOption(name);                 
  +                }
  +            }
  +        }
  +        
  +        return null;
  +    }
  +  
  +    /** @task return a descriptive message for the case
  +     * when the group is not valid */    
  +    public void isValid(CommandLine cmdLine) 
  +    throws ParseException {
  +        
  +        boolean optionFound = false;
  +        
  +        // validate all Options are present
  +        if (!options.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                Option option = (Option)iter.next();
  +                
  +                if (cmdLine.hasOption("-" + option.getName())) {
  +                    if (optionFound) {
  +                        throw new AlreadySelectedException("(5)");
  +    //                    return false;
  +                    }
  +                    optionFound = true;
  +                }
  +            }
  +        }
  +        
  +        // validate all OptionGroups are present
  +        if (!optionGroups.isEmpty()) {
  +            for (Iterator iter = optionGroups.iterator(); iter.hasNext();) {
  +                OptionGroup group = (OptionGroup)iter.next();
  +                
  +                boolean valid = true;
  +                
  +                try {
  +                    group.isValid(cmdLine);
  +                }
  +                catch (ParseException exp) {
  +                    valid = false;
  +                }
  +                
  +                if (valid && optionFound) {
  +                    throw new ParseException("option group not valid (1)");
  +                }
  +                else if (valid) {
  +                    optionFound = true;
  +                }
  +            }
  +        }
       }
   }
  
  
  
  1.1.2.3   +6 -5      jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/AnonymousArgumentImpl.java
  
  Index: AnonymousArgumentImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/AnonymousArgumentImpl.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- AnonymousArgumentImpl.java	24 May 2003 21:54:15 -0000	1.1.2.2
  +++ AnonymousArgumentImpl.java	4 Jun 2003 01:11:40 -0000	1.1.2.3
  @@ -194,7 +194,8 @@
        * Arguments cannot have a name.
        */
       public String getName() {
  -        throw new UnsupportedOperationException("anonymous argument cannot have a name");
  +        return "name";
  +        //throw new UnsupportedOperationException("anonymous argument cannot have a name");
       }
   
       /**
  @@ -210,6 +211,6 @@
        * Arguments cannot have be required.
        */
       public boolean isRequired() {
  -        throw new UnsupportedOperationException("anonymous argument cannot be required (yet)");
  +        return false;
       }
   }
  
  
  
  1.19.2.4  +143 -198  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.19.2.3
  retrieving revision 1.19.2.4
  diff -u -r1.19.2.3 -r1.19.2.4
  --- Options.java	24 May 2003 14:44:43 -0000	1.19.2.3
  +++ Options.java	4 Jun 2003 01:11:40 -0000	1.19.2.4
  @@ -58,187 +58,28 @@
    * <http://www.apache.org/>;.
    *
    */
  +/*
  + */
  +/*
  + */
   package org.apache.commons.cli;
   
  -import java.util.HashMap;
   import java.util.HashSet;
   import java.util.Iterator;
  -import java.util.Map;
   import java.util.Set;
   
   /**
  - * An Options instance defines the structure of a command
  - * line.  It can have three types of element, Option, Argument
  - * or OptionGroup.
  - * 
  - * @task consolidate the OptionGroup support
  - * @task consolidate the AnonymousArgument support
  - * 
    * @author John Keyes
    */
   public class Options {
   
  -    /** the child Options and Arguments */
  -    private Map options = new HashMap();
  -
  -    /** the required Options and Arguments */
  -    private Set required = new HashSet();
  -
  -    /** the OptionGroups */
  -    private Set groups = new HashSet();
  +    Set options = new HashSet();
  +    Set optionGroups = new HashSet();
   
       /** the AnonymousArgument */
       private Argument anonymousArgument;
   
       /**
  -     * Adds the specified Option to this definition
  -     * 
  -     * @param option
  -     *     a command line Option
  -     */
  -    public void add(Option option) {
  -        if (option instanceof AnonymousArgumentImpl) {
  -            this.anonymousArgument = (Argument) option;
  -        } else if (option.getName() != null) {
  -            if (options.get(option.getName()) != null) {
  -                options.remove(option.getName());
  -            }
  -            options.put(option.getName(), option);
  -        } else if (option.getLongName() != null) {
  -            if (options.get(option.getLongName()) != null) {
  -                options.remove(option.getLongName());
  -            }
  -            options.put(option.getLongName(), option);
  -        }
  -        addIfRequired(option);
  -
  -    }
  -
  -    /**
  -     * Adds all of the Options in the specified Set to this definition
  -     *
  -     * @param options
  -     *     command line Options to be added to this definition
  -     */
  -    public void addOptions(Set options) {
  -        for (Iterator iter = options.iterator(); iter.hasNext();) {
  -            Option opt = (Option) iter.next();
  -            add(opt);
  -            addIfRequired(opt);
  -        }
  -    }
  -
  -    /**
  -     * Registers the specified Option if it is 'required'.
  -     * 
  -     * @param option
  -     *     the Option to register if it is 'required'
  -     */
  -    private void addIfRequired(Option option) {
  -        if (option instanceof AnonymousArgumentImpl) {
  -            return;
  -        }
  -        if (option.isRequired()) {
  -            required.add(option);
  -        }
  -    }
  -
  -    /**
  -     * Removes any Options that have already been added 
  -     * and then adds all of the Options in the specified
  -     * Set.
  -     * 
  -     * @param options
  -     *     command line Options
  -     */
  -    public void setOptions(Set options) {
  -        this.options.clear();
  -        addOptions(options);
  -    }
  -
  -    /**
  -     * Returns the Options that this definition contains.  The
  -     * value that is returned is a new object so changes made 
  -     * to it do not modify this definition.
  -     * 
  -     * @return the Set of command line Options
  -     */
  -    public Set getOptions() {
  -        return new HashSet(options.values());
  -    }
  -
  -    /**
  -     * Return the Option that whose name is the same as the
  -     * specified name.  If no Option exists then check for
  -     * the Option whose long name is the same as the specified
  -     * name.  If there is still no match, return null.
  -     * 
  -     * @param name
  -     *     the name of the Option to search for
  -     * 
  -     * @return the Option that matches the search criteria, otherwise null
  -     */
  -    Option getOption(String name) {
  -        Option option = null;
  -        for (Iterator iter = options.keySet().iterator();
  -            iter.hasNext() && option == null;
  -            ) {
  -            Option currentOption = (Option) options.get(iter.next());
  -            if (currentOption.getName() != null
  -                && ("-" + currentOption.getName()).equals(name)) {
  -                option = currentOption;
  -            } else if (
  -                currentOption.getLongName() != null
  -                    && ("--" + currentOption.getLongName()).equals(name)) {
  -                option = currentOption;
  -            }
  -        }
  -        return option;
  -    }
  -
  -    /**
  -     * Return the number of command line options in this definition
  -     * 
  -     * @return the number of Options
  -     */
  -    public int size() {
  -        return this.options.size();
  -    }
  -
  -    /**
  -     * Returns the required Options that this definition contains.
  -     * The value that is returned is a new object so changes made 
  -     * to it do not modify this definition.
  -     * 
  -     * @return the Set of required command line Options
  -     */
  -    public Set getRequired() {
  -        return new HashSet(required);
  -    }
  -
  -    /**
  -     * Returns the OptionGroups that this definition contains.
  -     * The value that is returned is a new object so changes made 
  -     * to it do not modify this definition.
  -     * 
  -     * @return the Set of command line OptionGroups
  -     */
  -    public Set getOptionGroups() {
  -        return new HashSet(this.groups);
  -    }
  -
  -    /**
  -     * Adds the specified group to this definition.
  -     * 
  -     * @param group
  -     *     a command line OptionGroup
  -     */
  -    public void add(OptionGroup group) {
  -        this.groups.add(group);
  -        addGroupOptions(group);
  -    }
  -
  -    /**
        * Returns whether this definition has an AnonymousArgument
        * specified.
        * 
  @@ -257,43 +98,147 @@
           return this.anonymousArgument;
       }
   
  -    /**
  -     * Removes any OptionGroups that have already been added 
  -     * and then adds all of the OptionGroups in the specified
  -     * Set.
  -     *
  -     * @param groups
  -     *     a Set of OptionGroups
  -     */
  -    public void setOptionGroups(Set groups) {
  -        this.groups = groups;
  -        for (Iterator iter = groups.iterator(); iter.hasNext();) {
  -            add((OptionGroup) iter.next());
  +
  +    public void add(Option option) {
  +        if (option instanceof AnonymousArgumentImpl) {
  +            this.anonymousArgument = (Argument) option;
  +            return;
           }
  +        options.add(option);
       }
  -
  -    /**
  -     * Adds the individual Options from the specified group
  -     * to the options definition.
  -     * 
  -     * @task review this behaviour as it corrupts the contract
  -     *       for getOptions.
  -     * 
  -     * @param group
  -     *     an OptionGroup to add to this definition
  -     */
  -    private void addGroupOptions(OptionGroup group) {
  -        for (Iterator iter = group.getOptions().iterator(); iter.hasNext();) {
  -            add((Option) iter.next());
  +    
  +    public void add(Set options) {
  +        this.options.addAll(options);
  +    }
  +    
  +    public void add(OptionGroup group) {
  +        optionGroups.add(group);
  +    }
  +    
  +    public boolean hasOption(String name) {
  +        if (name == null) {
  +            return false;
  +        }
  +        
  +        if (!options.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                Option option = (Option)iter.next();
  +                
  +                if (option.getName() != null) {
  +                    if (name.equals("-" + option.getName())) {
  +                        return true;
  +                    }
  +                }
  +                if (option.getLongName() != null) {
  +                    if (name.equals("--" + option.getLongName())) {
  +                        return true;
  +                    }
  +                }
  +            }
  +        }
  +        
  +        return false;
  +    }
  +    
  +    public boolean hasArgument(String name) {
  +        return hasOption(name) && getOption(name) instanceof Argument;
  +    }
  +    
  +    public Argument getArgument(String name) {
  +        return (Argument)getOption(name);
  +    }
  + 
  +    public Option getOption(String name) {    
  +        if (name == null) {
  +            return null;
  +        }
  +        
  +        if (!options.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                Option option = (Option)iter.next();
  +                
  +                if (option.getName() != null) {
  +                    if (name.equals("-" + option.getName())) {
  +                        return option;
  +                    }
  +                }
  +                if (option.getLongName() != null) {
  +                    if (name.equals("--" + option.getLongName())) {
  +                        return option;
  +                    }
  +                }
  +            }
  +        }
  +        
  +        return null;
  +    }
  +    
  +    public void isValid(CommandLine line) throws ParseException {
  +        
  +        ParseException exception = null;
  +       
  +        if (!optionGroups.isEmpty()) {
  +            for (Iterator iter = optionGroups.iterator(); iter.hasNext();) {
  +                OptionGroup group = (OptionGroup)iter.next();
  +
  +                try {                                
  +                    group.isValid(line);
  +                }
  +                catch(ParseException exp) {
  +                    exception = exp;
  +                }
  +            }
           }
  +        
  +        if (!options.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext(); ) {
  +                Option option = (Option)iter.next();
  +                if (option.isRequired()) {
  +                    if (option.getName() != null) {
  +                        if (!line.hasOption("-" + option.getName())) {
  +                            exception = new MissingOptionException("(6)");
  +                        }
  +                    }
  +                    else if (option.getLongName() != null) {
  +                        if (!line.hasOption("--" + option.getLongName())) {
  +                            exception = new MissingOptionException("(7)");
  +                        }
  +                    }
   
  -        if (group instanceof ExclusiveOptionGroup) {
  -            ExclusiveOptionGroup excGroup = (ExclusiveOptionGroup) group;
  -            for (Iterator iter = excGroup.getOptionGroups().iterator();
  -                iter.hasNext();
  -                ) {
  -                addGroupOptions((OptionGroup) iter.next());
  +                }
  +            }
  +        }
  +        if (exception != null) {
  +            throw exception;
  +        }
  +    }
  +    
  +    public boolean inOptionGroup(String name) {
  +        
  +        if (!optionGroups.isEmpty()) {
  +            for (Iterator iter = optionGroups.iterator(); iter.hasNext();) {
  +                OptionGroup group = (OptionGroup)iter.next();
  +                
  +                if (group.hasOption(name)) {
  +                    return true;
  +                }
  +            }
  +        }
  +        
  +        return false;
  +    }
  +    
  +    public OptionGroup getOptionGroup(String name) {
  +        if (!optionGroups.isEmpty()) {
  +            for (Iterator iter = optionGroups.iterator(); iter.hasNext();) {
  +                OptionGroup group = (OptionGroup)iter.next();
  +                
  +                if (group.hasOption(name)) {
  +                    return group;
  +                }
               }
           }
  +        
  +        return null;
       }
  -}
  \ No newline at end of file
  +}
  
  
  
  1.1.2.2   +187 -61   jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/InclusiveOptionGroup.java
  
  Index: InclusiveOptionGroup.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Attic/InclusiveOptionGroup.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- InclusiveOptionGroup.java	19 May 2003 20:57:51 -0000	1.1.2.1
  +++ InclusiveOptionGroup.java	4 Jun 2003 01:11:41 -0000	1.1.2.2
  @@ -1,68 +1,194 @@
  +/*
  + * $Header$
  + * $Revision$
  + * $Date$
  + *
  + * ====================================================================
  + *
  + * The Apache Software License, Version 1.1
  + *
  + * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
  + * reserved.
  + *
  + * Redistribution and use in source and binary forms, with or without
  + * modification, are permitted provided that the following conditions
  + * are met:
  + *
  + * 1. Redistributions of source code must retain the above copyright
  + *    notice, this list of conditions and the following disclaimer.
  + *
  + * 2. Redistributions in binary form must reproduce the above copyright
  + *    notice, this list of conditions and the following disclaimer in
  + *    the documentation and/or other materials provided with the
  + *    distribution.
  + *
  + * 3. The end-user documentation included with the redistribution, if
  + *    any, must include the following acknowlegement:
  + *       "This product includes software developed by the
  + *        Apache Software Foundation (http://www.apache.org/)."
  + *    Alternately, this acknowlegement may appear in the software itself,
  + *    if and wherever such third-party acknowlegements normally appear.
  + *
  + * 4. The names "The Jakarta Project", "Commons", and "Apache Software
  + *    Foundation" must not be used to endorse or promote products derived
  + *    from this software without prior written permission. For written
  + *    permission, please contact apache@apache.org.
  + *
  + * 5. Products derived from this software may not be called "Apache"
  + *    nor may "Apache" appear in their names without prior written
  + *    permission of the Apache Group.
  + *
  + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  + * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  + * SUCH DAMAGE.
  + * ====================================================================
  + *
  + * This software consists of voluntary contributions made by many
  + * individuals on behalf of the Apache Software Foundation.  For more
  + * information on the Apache Software Foundation, please see
  + * <http://www.apache.org/>;.
  + *
  + */
   package org.apache.commons.cli;
   
  -import java.util.Set;
   import java.util.HashSet;
  +import java.util.Iterator;
  +import java.util.Set;
   
  +/**
  + * @author John Keyes
  + */
   public class InclusiveOptionGroup implements OptionGroup {
   
  -	private Set options = new HashSet();
  -	private Set selectedGroups= new HashSet();
  -	private Option selected = null;
  -	private boolean mandatory;
  -
  -	public InclusiveOptionGroup() {
  -	}
  -
  -	public InclusiveOptionGroup( Set options ) {
  -		options.addAll( options );
  -	}
  -
  -	public void add( Option option ) {
  -		options.add( option );
  -	}
  -
  -	public void add( Set options ) {
  -		options.addAll( options );
  -	}
  -
  -	public Set getOptions() {
  -		return this.options;
  -	}
  -
  -	public boolean containsOption( Option option ) {
  -		return this.options.contains( option );
  -	}
  -
  -	public void setFound( Option option ) {
  -		options.remove(option);
  -	}
  -
  -	public boolean allFound() {
  -		return options.isEmpty();
  -	}
  -
  -	public void setSelected(Option option){
  -		this.selectedGroups.add(option);
  -	}
  -
  -	public boolean allSelected() {
  -		return this.selectedGroups.equals(options);
  -	}
  -	
  -	public boolean isSelected() {
  -		return false;
  -	}
  -	
  -	public void setMandatory( boolean mandatory ) {
  -		this.mandatory = mandatory;
  -	}
  -
  -	public boolean isMandatory() {
  -		return this.mandatory;
  -	}
  -	
  -	public void reset() {
  -		// this.selected = null;
  -		this.selectedGroups.clear();
  -	}
  +    private Set options = new HashSet();
  +    
  +    private Set optionGroups = new HashSet();
  +    
  +    public void add(Option option) {
  +        this.options.add(option);
  +    }
  +    
  +    public void add(OptionGroup group) {
  +        this.optionGroups.add(group);
  +    }
  +
  +    public boolean hasOption(String name) {
  +        
  +        if (name == null) {
  +            return false;
  +        }
  +        
  +        if (!options.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                Option option = (Option)iter.next();
  +                
  +                if (name.equals("-" + option.getName())) {
  +                    return true;   
  +                }
  +                else if (name.equals("--" + option.getLongName())) {
  +                    return true;
  +                }
  +            }
  +        }
  +        
  +        if (!optionGroups.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                OptionGroup group = (OptionGroup)iter.next();
  +                
  +                if (group.hasOption(name)) {
  +                   return true;                 
  +                }
  +            }
  +        }
  +        
  +        return false;
  +    }
  +
  +    public Option getOption(String name) {
  +        
  +        if (name == null) {
  +            return null;
  +        }
  +        
  +        if (!options.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                Option option = (Option)iter.next();
  +                
  +                if (name.equals("-" + option.getName())) {
  +                    return option;   
  +                }
  +                else if (name.equals("--" + option.getLongName())) {
  +                    return option;
  +                }
  +            }
  +        }
  +        
  +        if (!optionGroups.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                OptionGroup group = (OptionGroup)iter.next();
  +                
  +                if (group.hasOption(name)) {
  +                   return group.getOption(name);                 
  +                }
  +            }
  +        }
  +        
  +        return null;
  +    }
  +
  +    /** @task return a descriptive message for the case
  +     * when the group is not valid */    
  +    public void isValid(CommandLine cmdLine) 
  +    throws ParseException {
  +        
  +        ParseException exp = null;
  +                
  +        // validate all Options are present
  +        if (!options.isEmpty()) {
  +            for (Iterator iter = options.iterator(); iter.hasNext();) {
  +                Option option = (Option)iter.next();
  +                
  +                if (option.getName() != null) {
  +                    if (!cmdLine.hasOption("-" + option.getName())) {
  +                        exp = new ParseException("(3)");
  +                    }
  +                }
  +                else if (option.getLongName() != null) {
  +                    if (!cmdLine.hasOption("--" + option.getLongName())) {
  +                        if (exp == null) {
  +                            exp = new ParseException("(3)");
  +                        }
  +                    }
  +                    else {
  +                        exp = null;
  +                    }
  +                }
  +            }
  +        }
  +        
  +        // validate all OptionGroups are present
  +        if (!optionGroups.isEmpty()) {
  +            for (Iterator iter = optionGroups.iterator(); iter.hasNext();) {
  +                OptionGroup group = (OptionGroup)iter.next();
  +                
  +                group.isValid(cmdLine);
  +                // reset exp
  +                exp = null;
  +            }
  +        }
  +        
  +        if (exp != null) {
  +            throw exp;
  +        }
  +
  +    }
   }
  
  
  
  1.6.2.5   +170 -462  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.6.2.4
  retrieving revision 1.6.2.5
  diff -u -r1.6.2.4 -r1.6.2.5
  --- CommandLineParser.java	25 May 2003 21:18:41 -0000	1.6.2.4
  +++ CommandLineParser.java	4 Jun 2003 01:11:41 -0000	1.6.2.5
  @@ -58,165 +58,74 @@
    * <http://www.apache.org/>;.
    *
    */
  +/*
  + */
   package org.apache.commons.cli;
   
   import java.util.ArrayList;
   import java.util.Arrays;
   import java.util.Collection;
  -import java.util.HashMap;
  -import java.util.HashSet;
   import java.util.Iterator;
   import java.util.List;
   import java.util.ListIterator;
  -import java.util.Map;
   import java.util.Properties;
  -import java.util.Set;
   import java.util.StringTokenizer;
   
   /**
  - * Parses command line arguments based upon the rules defined
  - * in the Options that are passed to it.
  - * 
    * @author John Keyes
    */
   public class CommandLineParser {
   
  -    /** 
  -     * @task investigate whether this can be eliminated
  -     * 
  -     * specifies whether to stop parsing at the first unknown
  -     * token
  -     */
  -    private boolean stopAtUnknown;
  -    
  -    /** a store for all of the options specified in the Options instance */
  -    private Map cache = new HashMap(11);
  -    
  -    /** a store of the required Options */
  -    private Set required = new HashSet();
  -    
  -    /** 
  -     * specifies the style of parsing to use, this is currently decided
  -     * when creating the Option cache.  If each Option has a single
  -     * character name, then treat the parsing as Posix, otherwise GNU.
  -     */
  -    private boolean posix = true;
  -
  -    /**
  -     * @task should this be a method variable rather than
  -     *       a member variable?
  -     *  
  -     * the Options to be used for the current parse
  -     */
  -    private Options options = null;
  -
  -    /**
  -     * the Java properties that were specified on the command line
  -     */
  +    public static final int POSIX = 1;
  +    public static final int GNU = 2;
  +    private int style = POSIX;
       private Properties props = new Properties();
  -
  -    /** 
  -     * Creates a CommandLineParser 
  -     */
  -    public CommandLineParser() {
  +        
  +    public void setStyle(int style) {
  +        this.style = style;    
       }
  +    
  +    public CommandLine parse(Options options, String[] args) 
  +    throws UnknownOptionException, MissingValueException, AlreadySelectedException, ParseException {
  +        CommandLineCreator creator = new CommandLineImpl();
  +        final List tokens = Arrays.asList(args);
   
  -    /**
  -     * Creates a CommandLineParser that will cease parsing at
  -     * the first unknown token encountered.
  -     * 
  -     * @param stopAtUnknown
  -     *     stop at the first unknown token
  -     */
  -    public CommandLineParser(boolean stopAtUnknown) {
  -        this.stopAtUnknown = stopAtUnknown;
  +        CommandLine line = parse(options, tokens.listIterator(), creator);
  +        
  +        options.isValid((CommandLine)creator);
  +        return line;
       }
  -
  -    /**
  -     * Parse the specified command line arguments using the
  -     * specified Options and populate the specified CommandLineCreator
  -     * with the results.
  -     * 
  -     * @param options
  -     *     the Options definition
  -     * 
  -     * @param args
  -     *     the command line arguments
  -     * 
  -     * @param cmdline
  -     *     the CommandLineCreator that will populate the CommandLine
  -     *     that will be returned
  -     * 
  -     * @return the CommandLine populated with the values
  -     * 
  -     * @throws UnknownOptionException
  -     *     if an option is specoified on the command line that
  -     *     is not defined in the Options
  -     * 
  -     * @throws MissingValueException
  -     *     if an Argument that requires a value does not have one
  -     *     specified on the command line
  -     * 
  -     * @throws MissingOptionException
  -     *     if a required Option is not specified on the command line
  -     * 
  -     * @throws AlreadySelectedException
  -     *     if more than one Option in an OptionGroup is present on the
  -     *     same command line
  -     */
  -    private CommandLine parse(
  -        Options options,
  -        String[] args,
  -        CommandLineCreator cmdline)
  -    throws  UnknownOptionException,
  -            MissingValueException,
  -            MissingOptionException,
  -            AlreadySelectedException {
  -
  -        this.options = options;
  -        List tokens = Arrays.asList(args);
  -        createOptionCache(options.getOptions());
  -
  -
  -        int index = 0;
  -        for (ListIterator iter = tokens.listIterator(); iter.hasNext();) {
  -            String token = (String) iter.next();
  -
  -            if ("--".equals(token)) {
  +    
  +    public CommandLine parse(Options options, ListIterator iter, CommandLineCreator creator) 
  +    throws UnknownOptionException, MissingValueException {
  +        while (iter.hasNext()) {
  +            String arg = iter.next().toString();
  +            
  +            if ("--".equals(arg)) {
                   List trailing = this.processTrailingValues(iter);
  -                cmdline.setUnprocessed(trailing); 
  +                creator.setUnprocessed(trailing); 
               }
  -            // java property
  -            else if (token.startsWith("-D") && token.length() > 2) {
  -                processJavaProperty(token);
  -            }
  -            // a simple key
  -            else if (cache.containsKey(token)) {
  -                Option option = (Option) cache.get(token);
  -
  -                if (option instanceof Argument) {
  -                    cmdline.addArgument(
  -                        (Argument) option,
  -                        processArgument((Argument) option, iter));
  -                } else {
  -                    cmdline.addOption(option);
  -                }
  -
  -                if (option.hasChildren()) {
  -                    processChildOptions(option, args, index, cmdline);
  -                }
  -                recordIfInOptionGroup(options, option);
  -                recordIfMandatory(option);
  +            else if (arg.startsWith("-D") && arg.length() > 2) {
  +                processJavaProperty(arg);
  +            }
  +            else if (options.hasArgument(arg)) {
  +                processArgument(options, iter, creator, arg, null);
  +            }
  +            else if (options.hasOption(arg)) {
  +                processOption(options, iter, creator, arg);
  +            }
  +            else if (options.inOptionGroup(arg)) {
  +                processOptionGroup(options, iter, creator, arg);
               }
  -            // we need to burst the key (one character at a time)
               else if (
  -                posix
  -                    && !token.equals("-")
  -                    && token.startsWith("-")
  -                    && !token.startsWith("--")) {
  -                burst(token, cmdline, iter);
  -            } else if (token.startsWith("-") && !token.equals("-")) {
  -                char[] chars = token.toCharArray();
  +                this.style == NewCommandLineParser.POSIX
  +                    && !arg.equals("-")
  +                    && arg.startsWith("-")
  +                    && !arg.startsWith("--")) {
  +                burst(options, arg, creator, iter);
  +            } 
  +            else if (arg.startsWith("-") && !arg.equals("-")) {
  +                char[] chars = arg.toCharArray();
                   int findex = -1;
                   for (int i = 0; i < chars.length && findex == -1; i++) {
                       if (!Character.isJavaIdentifierPart(chars[i])
  @@ -226,68 +135,42 @@
                   }
   
                   String ntoken =
  -                    (findex != -1) ? token.substring(0, findex) : "";
  +                    (findex != -1) ? arg.substring(0, findex) : "";
   
  -                if (cache.containsKey(ntoken)) {
  -                    Argument argument = (Argument) cache.get(ntoken);
  -
  -                    cmdline.addArgument(
  -                        argument,
  -                        processArgument(
  -                            argument,
  -                            iter,
  -                            token.substring(findex + 1)));
  -                } else {
  -                    throw new UnknownOptionException(
  -                        "Unknown option {" + token + "}");
  +                Option option = options.getOption(ntoken);
  +                if (option == null) {
  +                    if (options.inOptionGroup(ntoken)) {
  +                        OptionGroup group = options.getOptionGroup(arg);
  +                        option = group.getOption(arg);
  +                    }
                   }
  -            } else if (options.hasAnonymousArgument()) {
  -                iter.previous();
  -                cmdline.addArgument(
  -                    options.getAnonymousArgument(),
  -                    processAnonymousValues(iter));
  -            } else {
  -                throw new UnknownOptionException(
  -                    "Unknown option {" + token + "}");
  -            }
  -            index++;
  -        }
   
  -        if (!options.getRequired().equals(required)) {
  -            throw new MissingOptionException(
  -                "All of the required arguments have not been supplied");
  -        }
  -
  -        for (Iterator iter = options.getOptionGroups().iterator();
  -            iter.hasNext();
  -            ) {
  -            OptionGroup group = (OptionGroup) iter.next();
  -
  -            if (group instanceof ExclusiveOptionGroup) {
  -                ExclusiveOptionGroup g = (ExclusiveOptionGroup) group;
  -                if (g.isMandatory() && !group.isSelected()) {
  -                    throw new MissingOptionException(
  -                        "Required Option not present.");
  +                if (option != null) {
  +                    if (option instanceof Argument) {
  +                        List values =  processArgument((Argument)option, iter, arg.substring(findex + 1));
  +                        creator.addArgument((Argument)option, values);
  +                    }
                   }
  -                group.setSelected(null);
  -            } else {
  -                InclusiveOptionGroup g = (InclusiveOptionGroup) group;
  -                if (!g.allFound()) {
  -                    throw new MissingOptionException("Required inclusive");
  +                else {
  +                    throw new UnknownOptionException("unknown '" + arg + "'");
                   }
               }
  +            else if (options.hasAnonymousArgument()) {
  +                    iter.previous();
  +                    creator.addArgument(
  +                        options.getAnonymousArgument(),
  +                        processAnonymousValues(iter));
  +            }
  +            else {
  +                throw new UnknownOptionException(arg);
  +            }
           }
  -        cmdline.setProperties(this.props);
  +        
  +        creator.setProperties(this.props);
   
  -        return (CommandLine) cmdline;
  +        return (CommandLine)creator;
       }
   
  -    /**
  -     * Processes the specified token as a Java property
  -     * 
  -     * @param token
  -     *     the Java property
  -     */
       private void processJavaProperty(String token) {
           int sep = token.indexOf('=');
   
  @@ -304,138 +187,104 @@
           props.setProperty(key, value);
       }
   
  -    /**
  -     * @task no need for the two parse methods, refactor this
  -     *       so there is only one
  -     * 
  -     * Parse the specified command line arguments using the
  -     * specified Options and populate the specified CommandLineCreator
  -     * with the results.
  -     * 
  -     * @param options
  -     *     the Options definition
  -     * 
  -     * @param args
  -     *     the command line arguments
  -     * 
  -     * @return the CommandLine populated with the values
  -     * 
  -     * @throws UnknownOptionException
  -     *     if an option is specoified on the command line that
  -     *     is not defined in the Options
  -     * 
  -     * @throws MissingValueException
  -     *     if an Argument that requires a value does not have one
  -     *     specified on the command line
  -     * 
  -     * @throws MissingOptionException
  -     *     if a required Option is not specified on the command line
  -     * 
  -     * @throws AlreadySelectedException
  -     *     if more than one Option in an OptionGroup is present on the
  -     *     same command line
  -     */
  -    public CommandLine parse(Options options, String[] args)
  -    throws UnknownOptionException,
  -           MissingValueException,
  -           MissingOptionException,
  -           AlreadySelectedException {
  -                
  -        CommandLineCreator cmdline = new CommandLineImpl();
  -        parse(options, args, cmdline);
  -        return (CommandLine) cmdline;
  +    private void processOptionGroup(
  +        Options options,
  +        ListIterator iter,
  +        CommandLineCreator creator,
  +        String arg)
  +        throws MissingValueException, UnknownOptionException {
  +            
  +        OptionGroup group = options.getOptionGroup(arg);
  +        Option option = group.getOption(arg);
  +        if (option instanceof Argument) {
  +            List values =  processArgument((Argument)option, iter);
  +            creator.addArgument((Argument)option, values);
  +        }
  +        else {
  +            creator.addOption(option);
  +        }
  +        processChildOptions(option, iter, creator);
       }
   
  -    /**
  -     * The specified Option has children so process the
  -     * specified command line arguments, from the specified
  -     * index and populate the specified CommandLineCreator with
  -     * the results.
  -     * 
  -     * @param option
  -     *     the Option that has child Options
  -     * 
  -     * @param arguments
  -     *     the command line arguments
  -     * 
  -     * @param index
  -     *     the index where the processing of the command line
  -     *     arguments will begin
  -     * 
  -     * @param cmdline
  -     *     the CommandLineCreator that will record the results
  -     * 
  -     * @throws UnknownOptionException
  -     *     if an option is specoified on the command line that
  -     *     is not defined in the Options
  -     * 
  -     * @throws MissingValueException
  -     *     if an Argument that requires a value does not have one
  -     *     specified on the command line
  -     * 
  -     * @throws MissingOptionException
  -     *     if a required Option is not specified on the command line
  -     * 
  -     * @throws AlreadySelectedException
  -     *     if more than one Option in an OptionGroup is present on the
  -     *     same command line
  -     */
  +    private void processOption(
  +        Options options,
  +        ListIterator iter,
  +        CommandLineCreator creator,
  +        String arg)
  +    throws UnknownOptionException, MissingValueException {
  +
  +        Option option = options.getOption(arg);
  +        creator.addOption(option);
  +        processChildOptions(option, iter, creator);
  +    }
  +
  +    private void processArgument(
  +        Options options,
  +        ListIterator iter,
  +        CommandLineCreator creator,
  +        String arg,
  +        String value)
  +    throws MissingValueException, UnknownOptionException {
  +
  +        Argument argument = options.getArgument(arg);
  +        List values = null;
  +        if (value == null || value.length() == 0) {
  +            values = processArgument(argument, iter);
  +        }
  +        else {
  +            values = processArgument(argument, iter, value);
  +        }
  +        creator.addArgument(argument, values);
  +        processChildOptions(argument, iter, creator);
  +    }
  +
  +    //
  +    //
  +    //
  +    //
  +    private void burst(
  +        Options options,
  +        String token,
  +        CommandLineCreator creator,
  +        ListIterator iter)
  +    throws UnknownOptionException, MissingValueException {
  +               
  +        int tokenLength = token.length();
  +
  +        for (int i = 1; i < tokenLength; i++) {
  +            String arg = "-" + String.valueOf(token.charAt(i));
  +            
  +            if (options.hasArgument(arg)) {
  +                processArgument(options, iter, creator, arg, token.substring(i+1));
  +                break;
  +            }
  +            else if (options.hasOption(arg)) {
  +                processOption(options, iter, creator, arg);
  +            }
  +            else if (options.inOptionGroup(arg)) {
  +                processOptionGroup(options, iter, creator, arg);
  +            } 
  +            else {
  +                throw new UnknownOptionException("Unknown option {" + arg + "}");
  +            }
  +        }
  +    }
  +    
       private void processChildOptions(
           Option option,
  -        String[] arguments,
  -        int index,
  -        CommandLineCreator cmdline)
  -    throws UnknownOptionException,
  -           MissingValueException,
  -           MissingOptionException,
  -           AlreadySelectedException {
  +        ListIterator iter,
  +        CommandLineCreator cmdline) 
  +    throws UnknownOptionException, MissingValueException {
   
           if (option.getChildren().size() > 0) {
               Options opts = new Options();
  -            opts.addOptions(option.getChildren());
  +            opts.add(option.getChildren());
   
  -            String[] args = new String[arguments.length - index - 1];
  -            System.arraycopy(
  -                arguments,
  -                index + 1,
  -                args,
  -                0,
  -                arguments.length - index - 1);
  -            parse(opts, args, cmdline);
  +            parse(opts, iter, cmdline);
           }
   
       }
   
  -    /**
  -     * If the specified Option is a required Option then
  -     * record that it has been processed.
  -     * 
  -     * @param option
  -     *     the option that is checked to see if it is required
  -     */
  -    private void recordIfMandatory(Option option) {
  -        if (option.isRequired()) {
  -            required.add(option);
  -        }
  -    }
  -
  -    /**
  -     * Determine the values for the specified Argument.
  -     * 
  -     * @param argument
  -     *     the Argument whose values must be determined
  -     * 
  -     * @param iter
  -     *     an iterator over the command line arguments
  -     * 
  -     * @param arg
  -     *     the next token in the command line arguments,
  -     * 
  -     * @return the list of values for the specified Argument
  -     * 
  -     * @throws MissingValueException
  -     *     if <code>arg</code> is null or begins with "-"
  -     */
       private List processArgument(
           Argument argument,
           ListIterator iter,
  @@ -562,157 +411,6 @@
       }
   
       /**
  -     * Processes the Options for this parse and creates the
  -     * Option and required Option caches.
  -     * 
  -     * @param options
  -     *     the Options used for the current parse
  -     */
  -    private void createOptionCache(Set options) {
  -        cache.clear();
  -        required.clear();
  -
  -        for (Iterator iter = options.iterator(); iter.hasNext();) {
  -            Option option = (Option) iter.next();
  -
  -            String name = option.getName();
  -            if (posix) {
  -                if (name != null && name.length() > 1) {
  -                    posix = false;
  -                }
  -            }
  -            cache.put("-" + name, option);
  -            cache.put("--" + option.getLongName(), option);
  -        }
  -    }
  -
  -    /**
  -     * If the parse is a 'POSIX' one then the token may need
  -     * to be burst i.e. '-abc' is equivalent to '-a', '-b' and
  -     * '-c' if each of these were Options.  If '-a' was an 
  -     * Argument, then the tokens would be '-a' and 'bc'. 
  -     * 
  -     * @param token
  -     *     the token to burst
  -     * 
  -     * @param cmdline
  -     *     the CommandLineCreator to populate
  -     * 
  -     * @param iter
  -     *     the iterator over the command line arguments
  -     * 
  -     * @throws UnknownOptionException
  -     *     if an option is specoified on the command line that
  -     *     is not defined in the Options
  -     * 
  -     * @throws MissingValueException
  -     *     if an Argument that requires a value does not have one
  -     *     specified on the command line
  -     * 
  -     * @throws AlreadySelectedException
  -     *     if more than one Option in an OptionGroup is present on the
  -     *     same command line
  -     */
  -    private void burst(
  -        String token,
  -        CommandLineCreator cmdline,
  -        ListIterator iter)
  -    throws UnknownOptionException,
  -           MissingValueException,
  -           AlreadySelectedException {
  -               
  -        int tokenLength = token.length();
  -
  -        for (int i = 1; i < tokenLength; i++) {
  -            String ch = String.valueOf(token.charAt(i));
  -            Option option = (Option) cache.get("-" + ch);
  -
  -            if (option != null) {
  -                if (option instanceof Argument) {
  -                    List args = new ArrayList();
  -                    if (token.substring(i + 1).length() == 0) {
  -                        cmdline.addArgument(
  -                            (Argument) option,
  -                            processArgument((Argument) option, iter));
  -                    } else {
  -                        cmdline.addArgument(
  -                            (Argument) option,
  -                            processArgument(
  -                                (Argument) option,
  -                                iter,
  -                                token.substring(i + 1)));
  -                    }
  -                    recordIfInOptionGroup(this.options, option);
  -                    recordIfMandatory(option);
  -                    break;
  -                } else if (option instanceof Option) {
  -                    cmdline.addOption(option);
  -                    recordIfInOptionGroup(this.options, option);
  -                    recordIfMandatory(option);
  -                }
  -            } else {
  -                throw new UnknownOptionException("Unknown option {" + ch + "}");
  -            }
  -        }
  -    }
  -
  -    /**
  -     * @task review the OptionGroup behaviour
  -     * 
  -     * If the specified Option is a member of an OptionGroup then
  -     * record that it has been found.
  -     * 
  -     * @param options
  -     *     the Options instance
  -     * 
  -     * @param option
  -     *     the Option that is being tested
  -     * 
  -     * @throws AlreadySelectedException 
  -     *     if the group is an Exclusive one and an Option from that
  -     *     group has already been selected.
  -     */
  -    private void recordIfInOptionGroup(Options options, Option option)
  -        throws AlreadySelectedException {
  -        for (Iterator iter = options.getOptionGroups().iterator();
  -            iter.hasNext();
  -            ) {
  -            OptionGroup group = (OptionGroup) iter.next();
  -
  -            if (group instanceof ExclusiveOptionGroup) {
  -                if (group.containsOption(option)) {
  -                    if (group.isSelected()) {
  -                        throw new AlreadySelectedException(
  -                            "Option already selected");
  -                    } else {
  -                        group.setSelected(option);
  -                    }
  -                }
  -            } else if (group instanceof InclusiveOptionGroup) {
  -                ((InclusiveOptionGroup) group).setFound(option);
  -            }
  -        }
  -
  -    }
  -
  -    /**
  -     * Return all of the values that have not been processed.
  -     * 
  -     * @param iter
  -     *     the iterator over the command line arguments
  -     * 
  -     * @return the List of the command line arguments that remain
  -     */
  -    private List processTrailingValues(Iterator iter) {
  -        List args = new ArrayList();
  -
  -        while (iter.hasNext()) {
  -            args.add(iter.next());
  -        }
  -        return args;
  -    }
  -
  -    /**
        * All of the values that remain will be added to the anonymous
        * argument.
        * 
  @@ -752,4 +450,14 @@
           }
           return str;
       }
  -}
  \ No newline at end of file
  +
  +    private List processTrailingValues(Iterator iter) {
  +        List args = new ArrayList();
  +
  +        while (iter.hasNext()) {
  +            args.add(iter.next());
  +        }
  +        return args;
  +    }
  +
  +}
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org