[
https://issues.apache.org/jira/browse/CLI-71?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12498441
]
Henri Yandell commented on CLI-71:
----------------------------------
Testing by changing the test to use a fresh options object and then a fresh
parser object, the Options class is the one with the issue.
It wraps Option and OptionGroup classes. Looking at the PosixParser superclass
Parser, the problem would seem to be:
opt.addValue( Util.stripLeadingAndTrailingQuotes(str) );
ie) It's changing one of the Option classes; which is then handed over to the
CommandLine object.
A simple solution would be to clone the Option before passing it along to
modify it. This could be done in Options.getValue, but I'm wary of putting it
there. Simpler to put in the Parser class for just that usage of
Options.getValue. My first stab at this breaks other tests.
> [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,
> CLI-71-badfix.patch, 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]