Uploaded image for project: 'Commons CLI'
  1. Commons CLI
  2. CLI-220

MissingOptionException.getMissingOptions() returns OptionGroup, not just String

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 1.2
    • 1.3
    • CLI-1.x, Documentation
    • None

    Description

      The following code:

      Test.java
      import java.util.List;
      
      import org.apache.commons.cli.CommandLine;
      import org.apache.commons.cli.CommandLineParser;
      import org.apache.commons.cli.GnuParser;
      import org.apache.commons.cli.MissingOptionException;
      import org.apache.commons.cli.Option;
      import org.apache.commons.cli.OptionBuilder;
      import org.apache.commons.cli.OptionGroup;
      import org.apache.commons.cli.Options;
      
      public class Test {
      	public static void main(String[] argv)
      	{
      		Option opt_foo =
      			OptionBuilder.hasArg(false)
      				.isRequired(true)
      				.withDescription("option foo")
      		        .create("foo");
      
      		Option opt_bar =
      			OptionBuilder.hasArg(false)
      				.isRequired(false)
      				.withDescription("option bar")
      		        .create("bar");
      
      		Option opt_baz =
      			OptionBuilder.hasArg(false)
      				.isRequired(false)
      				.withDescription("option baz")
      		        .create("baz");
      
      		OptionGroup optgrp = new OptionGroup();
      		optgrp.setRequired(true);
      		optgrp.addOption(opt_bar)
      			.addOption(opt_baz);
      
      		Options optsdef = new Options();
      		optsdef.addOption(opt_foo)
      			.addOptionGroup(optgrp);
      
      		try {
      			CommandLineParser parser = new GnuParser();
      			CommandLine cmdline = parser.parse(optsdef, argv);
      		}
      		catch (MissingOptionException ex) {
      			List opts = ex.getMissingOptions();
      
      			for (Object option : opts) {
      				System.out.println("OPT: " + option.getClass().getName());
      			}
      		}
      		catch (Exception ex) {
      			ex.printStackTrace();
      			System.exit(1);
      		}
      	}
      }
      

      produces the following output:

      </tmp/MissingOptionException> $ javac -cp commons-cli-1.2.jar Test.java
      
      </tmp/MissingOptionException> $ java -cp commons-cli-1.2.jar:. Test
      OPT: java.lang.String
      OPT: org.apache.commons.cli.OptionGroup
      

      The JavaDoc for MissingOptionException.getMissingOptions() says:

      Return the list of options (as strings) missing in the command line parsed.

      Attachments

        Activity

          ebourg Emmanuel Bourg added a comment -

          Thank you for the detailed report Joe. The javadoc should be updated to reflect this.

          ebourg Emmanuel Bourg added a comment - Thank you for the detailed report Joe. The javadoc should be updated to reflect this.
          joe.casadonte Joe Casadonte added a comment -

          Hi Emmanuel,

          I'm curious why you're considering this a documentation bug and not a code bug? The amount of code I have to write to deal with the possibility that I'm not getting a String back is not a lot, but it is a PITA. I would think the method should return all Strings or all Objects, but not a mix of the two. Just my thoughts – thank you for all of the work you and others do maintaining this code!

          joe

          joe.casadonte Joe Casadonte added a comment - Hi Emmanuel, I'm curious why you're considering this a documentation bug and not a code bug? The amount of code I have to write to deal with the possibility that I'm not getting a String back is not a lot, but it is a PITA. I would think the method should return all Strings or all Objects, but not a mix of the two. Just my thoughts – thank you for all of the work you and others do maintaining this code! joe
          ebourg Emmanuel Bourg added a comment -

          I agree it's not really nice to have a list of mixed types, but that's how it was done and it can't be changed without breaking the backward compatibility.

          What we can do is to add helper methods in the exception to simplify the processing, but what kind of string would you expect for a missing group of options?

          ebourg Emmanuel Bourg added a comment - I agree it's not really nice to have a list of mixed types, but that's how it was done and it can't be changed without breaking the backward compatibility. What we can do is to add helper methods in the exception to simplify the processing, but what kind of string would you expect for a missing group of options?

          People

            Unassigned Unassigned
            joe.casadonte Joe Casadonte
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: