You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by eb...@apache.org on 2008/07/28 01:38:21 UTC

svn commit: r680208 - in /commons/proper/cli/branches/cli-1.x/src: java/org/apache/commons/cli/PosixParser.java test/org/apache/commons/cli/PosixParserTest.java

Author: ebourg
Date: Sun Jul 27 16:38:21 2008
New Revision: 680208

URL: http://svn.apache.org/viewvc?rev=680208&view=rev
Log:
Fixed PosixParser to stop bursting tokens when a non option character is found (CLI-163)

Modified:
    commons/proper/cli/branches/cli-1.x/src/java/org/apache/commons/cli/PosixParser.java
    commons/proper/cli/branches/cli-1.x/src/test/org/apache/commons/cli/PosixParserTest.java

Modified: commons/proper/cli/branches/cli-1.x/src/java/org/apache/commons/cli/PosixParser.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/branches/cli-1.x/src/java/org/apache/commons/cli/PosixParser.java?rev=680208&r1=680207&r2=680208&view=diff
==============================================================================
--- commons/proper/cli/branches/cli-1.x/src/java/org/apache/commons/cli/PosixParser.java (original)
+++ commons/proper/cli/branches/cli-1.x/src/java/org/apache/commons/cli/PosixParser.java Sun Jul 27 16:38:21 2008
@@ -14,11 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.commons.cli;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
+import java.util.List;
 
 /**
  * The class PosixParser provides an implementation of the 
@@ -31,7 +33,7 @@
 public class PosixParser extends Parser {
 
     /** holder for flattened tokens */
-    private ArrayList tokens = new ArrayList();
+    private List tokens = new ArrayList();
 
     /** specifies if bursting should continue */
     private boolean eatTheRest;
@@ -43,9 +45,9 @@
     private Options options;
 
     /**
-     * <p>Resets the members to their original state i.e. remove
+     * Resets the members to their original state i.e. remove
      * all of <code>tokens</code> entries, set <code>eatTheRest</code>
-     * to false and set <code>currentOption</code> to null.</p>
+     * to false and set <code>currentOption</code> to null.
      */
     private void init()
     {
@@ -92,21 +94,19 @@
      * when an non option is found.
      * @return The flattened <code>arguments</code> String array.
      */
-    protected String[] flatten(Options options, String[] arguments, 
-                               boolean stopAtNonOption)
+    protected String[] flatten(Options options, String[] arguments, boolean stopAtNonOption)
     {
         init();
         this.options = options;
 
         // an iterator for the command line tokens
         Iterator iter = Arrays.asList(arguments).iterator();
-        String token;
 
         // process each command line token
         while (iter.hasNext())
         {
             // get the next command line token
-            token = (String) iter.next();
+            String token = (String) iter.next();
 
             // handle SPECIAL TOKEN
             if (token.startsWith("--"))
@@ -114,8 +114,7 @@
                 if (token.indexOf('=') != -1)
                 {
                     tokens.add(token.substring(0, token.indexOf('=')));
-                    tokens.add(token.substring(token.indexOf('=') + 1, 
-                                               token.length()));
+                    tokens.add(token.substring(token.indexOf('=') + 1, token.length()));
                 }
                 else
                 {
@@ -136,8 +135,9 @@
                 {
                     processOptionToken(token, stopAtNonOption);
                 }
-                else if (options.hasOption(token)) {
-                	tokens.add(token);
+                else if (options.hasOption(token))
+                {
+                    tokens.add(token);
                 }
                 // requires bursting
                 else
@@ -164,7 +164,7 @@
     }
 
     /**
-     * <p>Adds the remaining tokens to the processed tokens list.</p>
+     * Adds the remaining tokens to the processed tokens list.
      *
      * @param iter An iterator over the remaining tokens
      */
@@ -183,8 +183,10 @@
      * <p>If there is a current option and it can have an argument
      * value then add the token to the processed tokens list and 
      * set the current option to null.</p>
+     *
      * <p>If there is a current option and it can have argument
      * values then add the token to the processed tokens list.</p>
+     *
      * <p>If there is not a current option add the special token
      * "<b>--</b>" and the current <code>value</code> to the processed
      * tokens list.  The add all the remaining <code>argument</code>
@@ -194,7 +196,7 @@
      */
     private void process(String value)
     {
-        if ((currentOption != null) && currentOption.hasArg())
+        if (currentOption != null && currentOption.hasArg())
         {
             if (currentOption.hasArg())
             {
@@ -215,8 +217,8 @@
     }
 
     /**
-     * <p>If it is a hyphen then add the hyphen directly to
-     * the processed tokens list.</p>
+     * If it is a hyphen then add the hyphen directly to
+     * the processed tokens list.
      *
      * @param hyphen The hyphen token
      */
@@ -229,6 +231,7 @@
      * <p>If an {@link Option} exists for <code>token</code> then
      * set the current option and add the token to the processed 
      * list.</p>
+     *
      * <p>If an {@link Option} does not exist and <code>stopAtNonOption</code>
      * is set then ignore the current token and add the remaining tokens
      * to the processed tokens list directly.</p>
@@ -278,14 +281,11 @@
      */
     protected void burstToken(String token, boolean stopAtNonOption)
     {
-        int tokenLength = token.length();
-
-        for (int i = 1; i < tokenLength; i++)
+        for (int i = 1; i < token.length(); i++)
         {
             String ch = String.valueOf(token.charAt(i));
-            boolean hasOption = options.hasOption(ch);
 
-            if (hasOption)
+            if (options.hasOption(ch))
             {
                 tokens.add("-" + ch);
                 currentOption = options.getOption(ch);
@@ -300,6 +300,7 @@
             else if (stopAtNonOption)
             {
                 process(token.substring(i));
+                break;
             }
             else
             {

Modified: commons/proper/cli/branches/cli-1.x/src/test/org/apache/commons/cli/PosixParserTest.java
URL: http://svn.apache.org/viewvc/commons/proper/cli/branches/cli-1.x/src/test/org/apache/commons/cli/PosixParserTest.java?rev=680208&r1=680207&r2=680208&view=diff
==============================================================================
--- commons/proper/cli/branches/cli-1.x/src/test/org/apache/commons/cli/PosixParserTest.java (original)
+++ commons/proper/cli/branches/cli-1.x/src/test/org/apache/commons/cli/PosixParserTest.java Sun Jul 27 16:38:21 2008
@@ -130,6 +130,18 @@
         assertTrue( "Confirm  2 extra args: " + cl.getArgList().size(), cl.getArgList().size() == 2);
     }
 
+    public void testStopBursting() throws Exception
+    {
+        String[] args = new String[] { "-azc" };
+
+        CommandLine cl = parser.parse(options, args, true);
+        assertTrue( "Confirm -a is set", cl.hasOption("a") );
+        assertFalse( "Confirm -c is not set", cl.hasOption("c") );
+
+        assertTrue( "Confirm  1 extra arg: " + cl.getArgList().size(), cl.getArgList().size() == 1);
+        assertTrue(cl.getArgList().contains("zc"));
+    }
+
     public void testMultiple() throws Exception
     {
         String[] args = new String[] { "-c",
@@ -155,8 +167,7 @@
                                        "foobar",
                                        "--bfile", "toast" };
 
-        CommandLine cl = parser.parse(options,args,
-                                        true);
+        CommandLine cl = parser.parse(options,args, true);
         assertTrue( "Confirm -c is set", cl.hasOption("c") );
         assertTrue( "Confirm  3 extra args: " + cl.getArgList().size(), cl.getArgList().size() == 3);