[ 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]