[ https://issues.apache.org/jira/browse/CLI-71?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12498436 ]
Henri Yandell commented on CLI-71: ---------------------------------- So... in terms of problems we have the following test cases: 1] "-a Caesar -k a" does not work. I think that should be fixed and it's in the attached unit test. It's a bit more convoluted than Amro noticed, it only fails when the parser has been setup the first time with a different structure. Something it lingering in the parser. 2] "-k -a Caesar" does not error. I think it should. Need to add that to the test. 3] "-k -a Caesar" where k is optional has k as being not set rather than having a default. Need to add to the unit test. > [cli] A weakness of parser > -------------------------- > > Key: CLI-71 > URL: https://issues.apache.org/jira/browse/CLI-71 > Project: Commons CLI > Issue Type: Bug > Components: CLI-1.x > Environment: Operating System: other > Platform: All > Reporter: Amro Al-Akkad > Fix For: 1.1 > > Attachments: BugCLI71Test.java, BugCLI71Test.java, TestCommonsCLI.java > > > I found a weakness of Jakarta Commons CLI and want to explain it with a simple > example: > Our program provides 2 options: > 1. -a or --algo <name>: The -a option requires an argument. > 2. -k or --key <value>: The -k option requires an argument too. > a) > If you pass the following command line arguments everything will be ok: > -a Caesar -k A > After evaluation: > • "Caesar" is the parameter of the -a option and > • "A" is the parameter of the -k option. > b) > However an org.apache.commons.cli.MissingArgumentException: no argument for:k > is > thrown if you pass the following input: > -a Caesar -k a > The Parser assumes that the argument "a" after the -k option, is the -a option > missing the hyphen. At the end of this description there is Java code for > executing this problem. > Information: > The handling of this command line > -a Caesar -k a > works in Getopt without any problem: > • "Caesar" is the parameter of the -a option and > • "a" of the -k option. > After parsing a valid option Getopt always takes the next (available) command > line argument as the option's parameter if the option requires an argument - > means if you pass to the command line > -k -a Caesar > After evaluation: > • "a" is the parameter of the -k option > • the "Caesar" argument is just ignored > If the option's parameter (<value>) represents an optional argument the next > argument is not required, if it represents a valid option - means if you pass > to > the command line > -k -a Caesar > After evaluation: > • "Caesar" is the parameter of the -a option > • k option is set without a parameter - in this case a default value > makes sense. > Last but not least here is the code snippet for the CLI Test: > import org.apache.commons.cli.CommandLine; > import org.apache.commons.cli.CommandLineParser; > import org.apache.commons.cli.Option; > import org.apache.commons.cli.Options; > import org.apache.commons.cli.ParseException; > import org.apache.commons.cli.PosixParser; > public class TestCommonsCLI { > /** > * @param args > */ > public static void main(String[] args) { > > Options options = new Options(); > > Option algorithm = new Option("a" , "algo", true, "the > algorithm which it to > perform executing"); > algorithm.setArgName("algorithm name"); > options.addOption(algorithm); > > Option key = new Option("k" , "key", true, "the key the setted > algorithm uses > to process"); > algorithm.setArgName("value"); > options.addOption(key); > > CommandLineParser parser = new PosixParser(); > > try { > CommandLine line = parser.parse( options, args); > > if(line.hasOption('a')){ > System.out.println("algo: "+ line.getOptionValue( "a" > )); > } > > if(line.hasOption('k')){ > System.out.println("key: " + line.getOptionValue('k')); > } > > > } catch (ParseException e) { > // TODO Auto-generated catch block > e.printStackTrace(); > } > } > } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]