[
https://issues.apache.org/jira/browse/CLI-71?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Henri Yandell updated CLI-71:
-----------------------------
Component/s: CLI-1.x
Description:
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();
}
}
}
was:
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 options 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 options 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();
}
}
}
> [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
> Attachments: 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]