You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jk...@apache.org on 2002/09/02 00:54:56 UTC
cvs commit: jakarta-commons/cli/src/test/org/apache/commons/cli BugsTest.java
jkeyes 2002/09/01 15:54:56
Modified: cli/src/java/org/apache/commons/cli Option.java Options.java
Parser.java
cli/src/test/org/apache/commons/cli BugsTest.java
Log:
allowed characters are now isJavaIdentifierPart, added javadoc to Parser, minor refactoring for required options
Revision Changes Path
1.12 +1 -1 jakarta-commons/cli/src/java/org/apache/commons/cli/Option.java
Index: Option.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Option.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- Option.java 18 Aug 2002 19:07:42 -0000 1.11
+++ Option.java 1 Sep 2002 22:54:56 -0000 1.12
@@ -192,7 +192,7 @@
* @return true if <code>c</code> is a letter.
*/
private boolean isValidChar( char c ) {
- return Character.isLetter( c );
+ return Character.isJavaIdentifierPart( c );
}
/**
1.11 +7 -5 jakarta-commons/cli/src/java/org/apache/commons/cli/Options.java
Index: Options.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Options.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- Options.java 26 Aug 2002 20:15:02 -0000 1.10
+++ Options.java 1 Sep 2002 22:54:56 -0000 1.11
@@ -61,11 +61,13 @@
package org.apache.commons.cli;
+import java.util.ArrayList;
import java.util.Collection;
-import java.util.Map;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.Collections;
+import java.util.List;
+import java.util.Map;
/** <p>Main entry-point into the library.</p>
*
@@ -91,7 +93,7 @@
private Map longOpts = new HashMap();
/** a map of the required options */
- private Map requiredOpts = new HashMap();
+ private List requiredOpts = new ArrayList();
/** a map of the option groups */
private Map optionGroups = new HashMap();
@@ -163,7 +165,7 @@
// if the option is required add it to the required list
if ( opt.isRequired() ) {
- requiredOpts.put( shortOpt, opt );
+ requiredOpts.add( shortOpt );
}
shortOpts.put( shortOpt, opt );
@@ -184,7 +186,7 @@
*
* @return Collection of required options
*/
- public Map getRequiredOptions() {
+ public List getRequiredOptions() {
return requiredOpts;
}
1.4 +143 -26 jakarta-commons/cli/src/java/org/apache/commons/cli/Parser.java
Index: Parser.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/java/org/apache/commons/cli/Parser.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Parser.java 31 Aug 2002 17:53:11 -0000 1.3
+++ Parser.java 1 Sep 2002 22:54:56 -0000 1.4
@@ -1,3 +1,64 @@
+/*
+ * $Header$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
package org.apache.commons.cli;
import java.util.Arrays;
@@ -6,50 +67,102 @@
import java.util.ListIterator;
import java.util.Map;
+/**
+ * <p><code>Parser</code> creates {@link CommandLine}s.</p>
+ *
+ * @author John Keyes (jbjk at mac.com)
+ * @see Parser
+ * @version $Revision$
+ */
public abstract class Parser implements CommandLineParser {
+ /** commandline instance */
private CommandLine cmd;
+ /** current Options */
private Options options;
- private Map requiredOptions;
+ /** list of required options strings */
+ private List requiredOptions;
+ /**
+ * <p>Subclasses must implement this method to reduce
+ * the <code>arguments</code> that have been passed to the parse
+ * method.</p>
+ *
+ * @param opts The Options to parse the arguments by.
+ * @param args The arguments that have to be flattened.
+ * @param stopAtNonOption specifies whether to stop
+ * flattening when a non option has been encountered
+ * @return a String array of the flattened arguments
+ */
abstract protected String[] flatten( Options opts,
- String[] args,
+ String[] arguments,
boolean stopAtNonOption );
- public CommandLine parse( Options opts, String[] args )
+ /**
+ * <p>Parses the specified <code>arguments</code>
+ * based on the specifed {@link Options}.</p>
+ *
+ * @param options the <code>Options</code>
+ * @param arguments the <code>arguments</code>
+ * @return the <code>CommandLine</code>
+ * @throws ParseException if an error occurs when parsing the
+ * arguments.
+ */
+ public CommandLine parse( Options options, String[] arguments )
throws ParseException
{
- return parse( opts, args, false );
+ return parse( options, arguments, false );
}
+ /**
+ * <p>Parses the specified <code>arguments</code>
+ * based on the specifed {@link Options}.</p>
+ *
+ * @param options the <code>Options</code>
+ * @param arguments the <code>arguments</code>
+ * @param stopAtNonOption specifies whether to stop
+ * interpreting the arguments when a non option has
+ * been encountered and to add them to the CommandLines
+ * args list.
+ * @return the <code>CommandLine</code>
+ * @throws ParseException if an error occurs when parsing the
+ * arguments.
+ */
public CommandLine parse( Options opts,
- String[] args,
+ String[] arguments,
boolean stopAtNonOption )
throws ParseException
{
+ // initialise members
options = opts;
requiredOptions = options.getRequiredOptions();
- String[] tokens = flatten( opts, args, stopAtNonOption );
- List tokenList = Arrays.asList( tokens );
- ListIterator iterator = tokenList.listIterator();
cmd = new CommandLine();
+
boolean eatTheRest = false;
+
+ List tokenList = Arrays.asList( flatten( opts, arguments, stopAtNonOption ) );
+ ListIterator iterator = tokenList.listIterator();
+
+ // process each flattened token
while( iterator.hasNext() ) {
String t = (String)iterator.next();
+
+ // the value is the double-dash
if( "--".equals( t ) ) {
eatTheRest = true;
}
- else if( t.startsWith( "-" ) ) {
- if( t.length() == 1 ) {
- // not an option, so just drop it on the argument list
- if ( stopAtNonOption ) {
- eatTheRest = true;
- }
- else {
- cmd.addArg( t );
- }
+ // the value is a single dash
+ else if( "-".equals( t ) ) {
+ if( stopAtNonOption ) {
+ eatTheRest = true;
+ }
+ else {
+ cmd.addArg(t );
}
- else if ( stopAtNonOption && !options.hasOption( t ) ) {
+ }
+ // the value is an option
+ else if( t.startsWith( "-" ) ) {
+ if ( stopAtNonOption && !options.hasOption( t ) ) {
eatTheRest = true;
cmd.addArg( t );
}
@@ -57,6 +170,7 @@
processOption( t, iterator );
}
}
+ // the value is an argument
else {
cmd.addArg( t );
if( stopAtNonOption ) {
@@ -64,9 +178,11 @@
}
}
+ // eat the remaining tokens
if( eatTheRest ) {
while( iterator.hasNext() ) {
String str = (String)iterator.next();
+ // ensure only one double-dash is added
if( !"--".equals( str ) ) {
cmd.addArg( str );
}
@@ -77,22 +193,23 @@
return cmd;
}
- private void checkRequiredOptions( )
- throws ParseException {
+ /**
+ * <p>Throws a {@link MissingOptionException} if all of the
+ * required options are no present.</p>
+ */
+ private void checkRequiredOptions()
+ throws MissingOptionException
+ {
// if there are required options that have not been
// processsed
if( requiredOptions.size() > 0 ) {
- Iterator iter = requiredOptions.values().iterator();
+ Iterator iter = requiredOptions.iterator();
StringBuffer buff = new StringBuffer();
// loop through the required options
while( iter.hasNext() ) {
- Option missing = (Option)iter.next();
- buff.append( "-" );
- buff.append( missing.getOpt() );
- buff.append( " " );
- buff.append( missing.getDescription() );
+ buff.append( iter.next() );
}
throw new MissingOptionException( buff.toString() );
1.6 +6 -6 jakarta-commons/cli/src/test/org/apache/commons/cli/BugsTest.java
Index: BugsTest.java
===================================================================
RCS file: /home/cvs/jakarta-commons/cli/src/test/org/apache/commons/cli/BugsTest.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- BugsTest.java 31 Aug 2002 17:53:11 -0000 1.5
+++ BugsTest.java 1 Sep 2002 22:54:56 -0000 1.6
@@ -179,7 +179,7 @@
// Therefore, place them in an option group
- String[] argv = new String[] { "-exec", "-execopto", "-execoptt" };
+ String[] argv = new String[] { "-exec", "-exec_opt1", "-exec_opt2" };
OptionGroup grp = new OptionGroup();
grp.addOption(new Option("exec",false,"description for this option"));
@@ -190,8 +190,8 @@
// for the exec option, there are 2 options...
Options execOptions = new Options();
- execOptions.addOption("execopto",false," desc");
- execOptions.addOption("execoptt",false," desc");
+ execOptions.addOption("exec_opt1",false," desc");
+ execOptions.addOption("exec_opt2",false," desc");
// similarly, for rep there are 2 options...
Options repOptions = new Options();
@@ -214,8 +214,8 @@
if(cmd.hasOption("exec")){
cmd = parser.parse(execOptions,argv,false);
// process the exec_op1 and exec_opt2...
- assertTrue( cmd.hasOption("execopto") );
- assertTrue( cmd.hasOption("execoptt") );
+ assertTrue( cmd.hasOption("exec_opt1") );
+ assertTrue( cmd.hasOption("exec_opt2") );
}
else if(cmd.hasOption("rep")){
cmd = parser.parse(repOptions,argv,false);
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>