You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by "Henri Yandell (JIRA)" <ji...@apache.org> on 2007/05/24 22:08:16 UTC

[jira] Closed: (CLI-71) [cli] A weakness of parser

     [ https://issues.apache.org/jira/browse/CLI-71?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Henri Yandell closed CLI-71.
----------------------------

    Resolution: Fixed

 svn ci -m "Applying Brian Egge and my work from CLI-71 to fix a lingering data problem in the parser and to confirm that other bugs have already been fixed" src/

Sending        src/java/org/apache/commons/cli/Option.java
Sending        src/java/org/apache/commons/cli/Parser.java
Adding         src/test/org/apache/commons/cli/OptionTest.java
Adding         src/test/org/apache/commons/cli/bug/BugCLI71Test.java
Transmitting file data ....
Committed revision 541408.

> [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, CLI-71-fix.patch, CLI71_resetvalues.patch, Cloneable.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: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org