Author: sebb
Date: Sun May 20 10:38:24 2007
New Revision: 539898

URL: http://svn.apache.org/viewvc?view=rev&rev=539898
Log:
Fix CLI long optional argument to require "=" (as for short options)

Modified:
    
jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java
    
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java
    jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml

Modified: 
jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java?view=diff&rev=539898&r1=539897&r2=539898
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java
 Sun May 20 10:38:24 2007
@@ -34,7 +34,6 @@
  * Note that CLArgs uses a backing hashtable for the options index and so
  * duplicate arguments are only returned by getArguments().
  * 
- * @version $Revision$ $Date$
  * @see ParserControl
  * @see CLOption
  * @see CLOptionDescriptor
@@ -371,14 +370,9 @@
 
                m_stringLength = m_args[m_argIndex].length();
 
-               // ch = peekAtChar();
-
                while (true) {
                        m_ch = peekAtChar();
 
-                       // System.out.println( "Pre State=" + m_state );
-                       // System.out.println( "Pre Char=" + (char)ch + "/" + 
(int)ch );
-
                        if (m_argIndex >= m_args.length) {
                                break;
                        }
@@ -389,9 +383,6 @@
                                return;
                        }
 
-                       // System.out.println( "State=" + m_state );
-                       // System.out.println( "Char=" + (char)ch + "/" + 
(int)ch );
-
                        if (STATE_OPTION_MODE == m_state) {
                                // if get to an arg barrier then return to 
normal mode
                                // else continue accumulating options
@@ -406,14 +397,12 @@
                        } else if (STATE_NO_OPTIONS == m_state) {
                                // should never get to here when stringIndex != 0
                                addOption(new CLOption(m_args[m_argIndex++]));
-                       } else if (STATE_OPTIONAL_ARG == m_state && m_isLong && 
m_ch != 0) {
-                               m_state = STATE_NORMAL;
-                               addOption(m_option);
                        } else {
                                parseArguments();
                        }
                }
 
+               // Reached end of input arguments - perform final processing
                if (m_option != null) {
                        if (STATE_OPTIONAL_ARG == m_state) {
                                m_options.addElement(m_option);
@@ -482,10 +471,13 @@
                return m_args[m_argIndex].charAt(m_stringIndex++);
        }
 
+       private char m_tokesep; // Keep track of token separator
+       
        private final Token nextToken(final char[] separators) {
                m_ch = getChar();
 
                if (isSeparator(m_ch, separators)) {
+                       m_tokesep=m_ch;
                        m_ch = getChar();
                        return new Token(TOKEN_SEPARATOR, null);
                }
@@ -497,6 +489,7 @@
                        m_ch = getChar();
                } while (!isSeparator(m_ch, separators));
 
+               m_tokesep=m_ch;
                return new Token(TOKEN_STRING, sb.toString());
        }
 
@@ -558,6 +551,12 @@
                                addOption(m_option);
                                m_state = STATE_NORMAL;
                                return;
+                       }
+
+                       if (m_isLong && '=' != m_tokesep){ // Long optional arg 
must have = as separator
+                               addOption(m_option);
+                               m_state = STATE_NORMAL;
+                               return;                         
                        }
 
                        if ('=' == m_ch) {

Modified: 
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java?view=diff&rev=539898&r1=539897&r2=539898
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java
 Sun May 20 10:38:24 2007
@@ -23,6 +23,7 @@
 import java.util.List;
 
 import junit.framework.TestCase;
+import junit.framework.TestSuite;
 
 /**
  * 
@@ -91,15 +92,37 @@
        private static final CLOptionDescriptor BLEE = new 
CLOptionDescriptor("blee",
                        CLOptionDescriptor.ARGUMENT_DISALLOWED, BLEE_OPT, 
"blee");
 
-       private static final CLOptionDescriptor ALL = new 
CLOptionDescriptor("all", CLOptionDescriptor.ARGUMENT_DISALLOWED,
+       private static final CLOptionDescriptor ALL = new 
CLOptionDescriptor("all",
+                       CLOptionDescriptor.ARGUMENT_DISALLOWED,
                        ALL_OPT, "all", new CLOptionDescriptor[] { BLEE });
 
-       private static final CLOptionDescriptor FILE = new 
CLOptionDescriptor("file", CLOptionDescriptor.ARGUMENT_REQUIRED,
-                       FILE_OPT, "the build file.");
+       private static final CLOptionDescriptor FILE = new 
CLOptionDescriptor("file", 
+                       CLOptionDescriptor.ARGUMENT_REQUIRED, FILE_OPT, "the 
build file.");
 
        private static final CLOptionDescriptor TAINT = new 
CLOptionDescriptor("taint",
                        CLOptionDescriptor.ARGUMENT_OPTIONAL, TAINT_OPT, "turn 
on tainting checks (optional level).");
 
+       private static final CLOptionDescriptor [] OPTIONS = new 
CLOptionDescriptor [] {
+               new CLOptionDescriptor("none", 
+                               CLOptionDescriptor.ARGUMENT_DISALLOWED | 
CLOptionDescriptor.DUPLICATES_ALLOWED,
+                               '0', "no parameter"),
+
+               new CLOptionDescriptor("optional", 
+                               CLOptionDescriptor.ARGUMENT_OPTIONAL | 
CLOptionDescriptor.DUPLICATES_ALLOWED, 
+                               '?', "optional parameter"),
+                       
+                       new CLOptionDescriptor("one", 
+                                       CLOptionDescriptor.ARGUMENT_REQUIRED | 
CLOptionDescriptor.DUPLICATES_ALLOWED, 
+                                       '1', "one parameter"),
+                       
+                       new CLOptionDescriptor("two", 
+                                       CLOptionDescriptor.ARGUMENTS_REQUIRED_2 
| CLOptionDescriptor.DUPLICATES_ALLOWED, 
+                                       '2', "two parameters")
+       };
+
+
+       
+
        public ClutilTestCase() {
                this("Command Line Interpreter Test Case");
        }
@@ -176,7 +199,7 @@
                final List clOptions = parser.getArguments();
                final int size = clOptions.size();
 
-               assertEquals("Option count", 3, size);
+               assertEquals("Option count", 2, size);
 
                final CLOption option0 = (CLOption) clOptions.get(0);
                assertEquals("Option Code: " + option0.getDescriptor().getId(), 
TAINT_OPT, option0.getDescriptor().getId());
@@ -216,12 +239,8 @@
 
                final String[] args = new String[] { "-T3", "-a" };
 
-               // System.out.println("[before parsing]");
-
                final CLArgsParser parser = new CLArgsParser(args, options);
 
-               // System.out.println("[after parsing]");
-
                assertNull(parser.getErrorString(), parser.getErrorString());
 
                final List clOptions = parser.getArguments();
@@ -243,12 +262,8 @@
 
                final String[] args = new String[] { "-T=3", "-a" };
 
-               // System.out.println("[before parsing]");
-
                final CLArgsParser parser = new CLArgsParser(args, options);
 
-               // System.out.println("[after parsing]");
-
                assertNull(parser.getErrorString(), parser.getErrorString());
 
                final List clOptions = parser.getArguments();
@@ -270,11 +285,8 @@
 
                final String[] args = new String[] { "-T", "-a" };
 
-               // System.out.println("[before parsing]");
                final CLArgsParser parser = new CLArgsParser(args, options);
 
-               // System.out.println("[after parsing]");
-
                assertNull(parser.getErrorString(), parser.getErrorString());
 
                final List clOptions = parser.getArguments();
@@ -837,13 +849,17 @@
                final CLOptionDescriptor[] options = { FILE };
                final CLArgsParser parser = new CLArgsParser(args, options);
 
+               assertNull(parser.getErrorString(), parser.getErrorString());
+
                CLOption optionById = parser.getArgumentById(FILE_OPT);
                assertNotNull(optionById);
                assertEquals(FILE_OPT, optionById.getDescriptor().getId());
+               assertEquals("testarg", optionById.getArgument());
 
                CLOption optionByName = 
parser.getArgumentByName(FILE.getName());
                assertNotNull(optionByName);
                assertEquals(FILE_OPT, optionByName.getDescriptor().getId());
+               assertEquals("testarg", optionByName.getArgument());
        }
 
        /**
@@ -857,6 +873,8 @@
                final CLOptionDescriptor[] options = { test };
                final CLArgsParser parser = new CLArgsParser(args, options);
 
+               assertNull(parser.getErrorString(), parser.getErrorString());
+
                final CLOption optionByID = parser.getArgumentById('n');
                assertNotNull(optionByID);
                assertEquals('n', optionByID.getDescriptor().getId());
@@ -876,6 +894,8 @@
                final CLOptionDescriptor[] options = { test };
                final CLArgsParser parser = new CLArgsParser(args, options);
 
+               assertNull(parser.getErrorString(), parser.getErrorString());
+
                final CLOption optionByID = parser.getArgumentById('n');
                assertNotNull(optionByID);
                assertEquals('n', optionByID.getDescriptor().getId());
@@ -883,6 +903,57 @@
                final StringBuffer sb = CLUtil.describeOptions(options);
                final String lineSeparator = 
System.getProperty("line.separator");
                assertEquals("Testing display of null description", "\t-n, 
--nulltest" + lineSeparator, sb.toString());
+       }
+       
+       public void testCombinations() throws Exception {
+               check(new String [] {},"");     
+               check(new String [] {"--none",
+                                            "-0"
+                                            },
+                                            "-0 -0"); // Canonical form
+               check(new String [] {"--one=a",
+                                            "--one","A",
+                                            "-1b",
+                                            "-1=c",
+                                            "-1","d"
+                                            },
+                                    "-1=[a] -1=[A] -1=[b] -1=[c] -1=[d]");     
+               check(new String [] {"-2n=v",
+                                            "-2","N=V"
+                                            },
+                                            "-2=[n, v] -2=[N, V]");    
+               check(new String [] {"--two=n=v",
+                                            "--two","N=V"
+                                            },
+                                            "-2=[n, v] -2=[N, V]");
+               // Test optional arguments
+               check(new String [] {"-?",
+                                            "A", // Separate argument
+                                            "-?=B",
+                                            "-?C",
+                                            "-?"
+                                           },
+                                "-? [A] -?=[B] -?=[C] -?");    
+               check(new String [] {"--optional=A", // OK
+                                "--optional","B", // should treat B as separate
+                                "--optional" // Should have no arg
+                                },
+                                "-?=[A] -? [B] -?");   
+       }
+       
+       private void check(String args[], String canon){
+               final CLArgsParser parser = new CLArgsParser(args, OPTIONS);
+
+               assertNull(parser.getErrorString(),parser.getErrorString());
+
+               final List clOptions = parser.getArguments();
+               final int size = clOptions.size();
+               StringBuffer sb = new StringBuffer();
+               for (int i=0; i< size; i++){
+                       if (i>0) sb.append(" ");
+                       
sb.append(((CLOption)clOptions.get(i)).toShortString());        
+               }
+               assertEquals("Canonical form ("+size+")",canon,sb.toString());
        }
        /*
         * TODO add tests to check for: - name clash - long option abbreviations

Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?view=diff&rev=539898&r1=539897&r2=539898
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Sun May 20 10:38:24 2007
@@ -234,6 +234,7 @@
 <li>Bug 24684 - remote startup problems if spaces in the path of the 
jmeter</li>
 <li>Use Listener configuration when loading CSV data files</li>
 <li>Function methods setParameters() need to be synchronized</li>
+<li>Fix CLI long optional argument to require "=" (as for short options)</li>
 </ul>
 
 <h3>Version 2.2</h3>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to