jkeyes      2002/10/24 16:17:49

  Modified:    cli/src/java/org/apache/commons/cli Parser.java
                        OptionGroup.java Options.java
               cli/src/test/org/apache/commons/cli BugsTest.java
  Log:
  fix pr 13935 - still need to improve the exception message
  
  Revision  Changes    Path
  1.7       +9 -5      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.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Parser.java       8 Oct 2002 21:24:11 -0000       1.6
  +++ Parser.java       24 Oct 2002 23:17:49 -0000      1.7
  @@ -265,7 +265,11 @@
           // if the option is in an OptionGroup make that option the selected
           // option of the group
           if ( options.getOptionGroup( opt ) != null ) {
  -            ( (OptionGroup)( options.getOptionGroup( opt ) ) ).setSelected( opt );
  +            OptionGroup group = ( OptionGroup ) options.getOptionGroup( opt );
  +            if( group.isRequired() ) {
  +                requiredOptions.remove( group );
  +            }
  +            group.setSelected( opt );
           }
   
           // if the option takes an argument value
  
  
  
  1.6       +19 -0     
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.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- OptionGroup.java  19 Sep 2002 22:59:43 -0000      1.5
  +++ OptionGroup.java  24 Oct 2002 23:17:49 -0000      1.6
  @@ -78,6 +78,9 @@
       /** the name of the selected option */
       private String selected;
   
  +    /** specified whether this group is required */
  +    private boolean required;
  +
       /**
        * add <code>opt</code> to this group
        *
  @@ -134,6 +137,22 @@
        */
       public String getSelected() {
           return selected;
  +    }
  +
  +    /**
  +     * @param required specifies if this group is required
  +     */
  +    public void setRequired( boolean required ) {
  +        this.required = required;
  +    }
  +
  +    /**
  +     * Returns whether this option group is required.
  +     *
  +     * @returns whether this option group is required
  +     */
  +    public boolean isRequired() {
  +        return this.required;
       }
   
       /**
  
  
  
  1.14      +8 -0      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.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- Options.java      8 Oct 2002 21:24:11 -0000       1.13
  +++ Options.java      24 Oct 2002 23:17:49 -0000      1.14
  @@ -113,8 +113,16 @@
       public Options addOptionGroup( OptionGroup group ) {
           Iterator options = group.getOptions().iterator();
   
  +        if( group.isRequired() ) {
  +            requiredOpts.add( group );
  +        }
  +
           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 );
   
               optionGroups.put( option.getOpt(), group );
  
  
  
  1.10      +66 -1     
jakarta-commons/cli/src/test/org/apache/commons/cli/BugsTest.java
  
  Index: BugsTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/cli/src/test/org/apache/commons/cli/BugsTest.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- BugsTest.java     19 Oct 2002 21:18:26 -0000      1.9
  +++ BugsTest.java     24 Oct 2002 23:17:49 -0000      1.10
  @@ -278,4 +278,69 @@
           }
       }
   
  +    public void test13935() {
  +        OptionGroup directions = new OptionGroup();
  +
  +        Option left = new Option( "l", "left", false, "go left" );
  +        Option right = new Option( "r", "right", false, "go right" );
  +        Option straight = new Option( "s", "straight", false, "go straight" );
  +        Option forward = new Option( "f", "forward", false, "go forward" );
  +        forward.setRequired( true );
  +
  +        directions.addOption( left );
  +        directions.addOption( right );
  +        directions.setRequired( true );
  +
  +        Options opts = new Options();
  +        opts.addOptionGroup( directions );
  +        opts.addOption( straight );
  +
  +        CommandLineParser parser = new PosixParser();
  +        boolean exception = false;
  +
  +        String[] args = new String[] {  };
  +        try {
  +            CommandLine line = parser.parse( opts, args );
  +        }
  +        catch( ParseException exp ) {
  +            exception = true;
  +        }
  +
  +        if( !exception ) {
  +            fail( "Expected exception not caught.");
  +        }
  +
  +        exception = false;
  +
  +        args = new String[] { "-s" };
  +        try {
  +            CommandLine line = parser.parse( opts, args );
  +        }
  +        catch( ParseException exp ) {
  +            exception = true;
  +        }
  +
  +        if( !exception ) {
  +            fail( "Expected exception not caught.");
  +        }
  +
  +        exception = false;
  +
  +        args = new String[] { "-s", "-l" };
  +        try {
  +            CommandLine line = parser.parse( opts, args );
  +        }
  +        catch( ParseException exp ) {
  +            fail( "Unexpected exception: " + exp.getMessage() );
  +        }
  +
  +        opts.addOption( forward );
  +        args = new String[] { "-s", "-l", "-f" };
  +        try {
  +            CommandLine line = parser.parse( opts, args );
  +        }
  +        catch( ParseException exp ) {
  +            fail( "Unexpected exception: " + exp.getMessage() );
  +        }
  +    }
   }
  
  
  

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

Reply via email to