commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bay...@apache.org
Subject svn commit: r612367 - in /commons/proper/lang/trunk/src: java/org/apache/commons/lang/StringUtils.java test/org/apache/commons/lang/StringUtilsTest.java
Date Wed, 16 Jan 2008 06:43:38 GMT
Author: bayard
Date: Tue Jan 15 22:43:30 2008
New Revision: 612367

URL: http://svn.apache.org/viewvc?rev=612367&view=rev
Log:
Applying my patch from LANG-257, adding Cameron Whitehead's desired splitByWholeSeparatorPreserveAllTokens
methods. In addition to the patch, I've added @since 2.4 tags to the javadoc

Modified:
    commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java
    commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java

Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java?rev=612367&r1=612366&r2=612367&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java Tue Jan 15
22:43:30 2008
@@ -2228,7 +2228,7 @@
      * @return an array of parsed Strings, <code>null</code> if null String was
input
      */
     public static String[] splitByWholeSeparator(String str, String separator) {
-        return splitByWholeSeparator( str, separator, -1 ) ;
+        return splitByWholeSeparatorWorker( str, separator, -1, false ) ;
     }
 
     /**
@@ -2259,6 +2259,88 @@
      * @return an array of parsed Strings, <code>null</code> if null String was
input
      */
     public static String[] splitByWholeSeparator( String str, String separator, int max )
{
+        return splitByWholeSeparatorWorker(str, separator, max, false);
+    }
+
+    /**
+     * <p>Splits the provided text into an array, separator string specified. </p>
+     *
+     * <p>The separator is not included in the returned String array.
+     * Adjacent separators are treated as separators for empty tokens.
+     * For more control over the split use the StrTokenizer class.</p>
+     *
+     * <p>A <code>null</code> input String returns <code>null</code>.
+     * A <code>null</code> separator splits on whitespace.</p>
+     *
+     * <pre>
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens(null, *)               = null
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("", *)                 = []
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab de fg", null)      = ["ab",
"de", "fg"]
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab   de fg", null)    = ["ab",
"", "", "de", "fg"]
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab:cd:ef", ":")       = ["ab",
"cd", "ef"]
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab-!-cd-!-ef", "-!-") = ["ab",
"cd", "ef"]
+     * </pre>
+     *
+     * @param str  the String to parse, may be null
+     * @param separator  String containing the String to be used as a delimiter,
+     *  <code>null</code> splits on whitespace
+     * @return an array of parsed Strings, <code>null</code> if null String was
input
+     * @since 2.4
+     */
+    public static String[] splitByWholeSeparatorPreserveAllTokens(String str, String separator)
{
+        return splitByWholeSeparatorWorker( str, separator, -1, true ) ;
+    }
+
+    /**
+     * <p>Splits the provided text into an array, separator string specified.
+     * Returns a maximum of <code>max</code> substrings.</p>
+     *
+     * <p>The separator is not included in the returned String array.
+     * Adjacent separators are treated as separators for empty tokens.
+     * For more control over the split use the StrTokenizer class.</p>
+     *
+     * <p>A <code>null</code> input String returns <code>null</code>.
+     * A <code>null</code> separator splits on whitespace.</p>
+     *
+     * <pre>
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens(null, *, *)               = null
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("", *, *)                 = []
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab de fg", null, 0)      = ["ab",
"de", "fg"]
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab   de fg", null, 0)    = ["ab",
"", "", "de", "fg"]
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab:cd:ef", ":", 2)       = ["ab",
"cd:ef"]
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab-!-cd-!-ef", "-!-", 5) = ["ab",
"cd", "ef"]
+     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab-!-cd-!-ef", "-!-", 2) = ["ab",
"cd-!-ef"]
+     * </pre>
+     *
+     * @param str  the String to parse, may be null
+     * @param separator  String containing the String to be used as a delimiter,
+     *  <code>null</code> splits on whitespace
+     * @param max  the maximum number of elements to include in the returned
+     *  array. A zero or negative value implies no limit.
+     * @return an array of parsed Strings, <code>null</code> if null String was
input
+     * @since 2.4
+     */
+    public static String[] splitByWholeSeparatorPreserveAllTokens( String str, String separator,
int max ) {
+        return splitByWholeSeparatorWorker(str, separator, max, true);
+    }
+
+    /**
+     * Performs the logic for the <code>splitByWholeSeparatorPreserveAllTokens</code>
methods.
+     *
+     * @param str  the String to parse, may be <code>null</code>
+     * @param separator  String containing the String to be used as a delimiter,
+     *  <code>null</code> splits on whitespace
+     * @param max  the maximum number of elements to include in the returned
+     *  array. A zero or negative value implies no limit.
+     * @param preserveAllTokens if <code>true</code>, adjacent separators are
+     * treated as empty token separators; if <code>false</code>, adjacent
+     * separators are treated as one separator.
+     * @return an array of parsed Strings, <code>null</code> if null String input
+     * @since 2.4
+     */
+    private static String[] splitByWholeSeparatorWorker( String str, String separator, 
+                                                         int max, boolean preserveAllTokens
) 
+    {
         if (str == null) {
             return null;
         }
@@ -2271,7 +2353,7 @@
 
         if ( ( separator == null ) || ( "".equals( separator ) ) ) {
             // Split on whitespace.
-            return split( str, null, max ) ;
+            return splitWorker( str, null, max, preserveAllTokens ) ;
         }
 
 
@@ -2303,6 +2385,15 @@
                     }
                 } else {
                     // We found a consecutive occurrence of the separator, so skip it.
+                    if( preserveAllTokens ) {
+                        numberOfSubstrings += 1 ;
+                        if ( numberOfSubstrings == max ) {
+                            end = len ;
+                            substrings.add( str.substring( beg ) ) ;
+                        } else {
+                            substrings.add( "" );
+                        }
+                    }
                     beg = end + separatorLength ;
                 }
             } else {

Modified: commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java?rev=612367&r1=612366&r2=612367&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java (original)
+++ commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java Tue Jan
15 22:43:30 2008
@@ -486,6 +486,51 @@
         }
     }
 
+    public void testSplitByWholeSeparatorPreserveAllTokens_StringStringInt() {
+        assertEquals( null, StringUtils.splitByWholeSeparatorPreserveAllTokens( null, ".",
-1 ) ) ;
+
+        assertEquals( 0, StringUtils.splitByWholeSeparatorPreserveAllTokens( "", ".", -1
).length ) ;
+
+        // test whitespace
+        String input = "ab   de fg" ;
+        String[] expected = new String[] { "ab", "", "", "de", "fg" } ;
+
+        String[] actual = StringUtils.splitByWholeSeparatorPreserveAllTokens( input, null,
-1 ) ;
+        assertEquals( expected.length, actual.length ) ;
+        for ( int i = 0 ; i < actual.length ; i+= 1 ) {
+            assertEquals( expected[i], actual[i] );
+        }
+
+        // test delimiter singlechar
+        input = "1::2:::3::::4";
+        expected = new String[] { "1", "", "2", "", "", "3", "", "", "", "4" };
+
+        actual = StringUtils.splitByWholeSeparatorPreserveAllTokens( input, ":", -1 ) ;
+        assertEquals( expected.length, actual.length ) ;
+        for ( int i = 0 ; i < actual.length ; i+= 1 ) {
+            assertEquals( expected[i], actual[i] );
+        }
+
+        // test delimiter multichar
+        input = "1::2:::3::::4";
+        expected = new String[] { "1", "2", ":3", "", "4" };
+
+        actual = StringUtils.splitByWholeSeparatorPreserveAllTokens( input, "::", -1 ) ;
+        assertEquals( expected.length, actual.length ) ;
+        for ( int i = 0 ; i < actual.length ; i+= 1 ) {
+            assertEquals( expected[i], actual[i] );
+        }
+
+        // test delimiter char with max
+        input = "1::2::3:4";
+        expected = new String[] { "1", "", "2", ":3:4" };
+
+        actual = StringUtils.splitByWholeSeparatorPreserveAllTokens( input, ":", 4 ) ;
+        assertEquals( expected.length, actual.length ) ;
+        for ( int i = 0 ; i < actual.length ; i+= 1 ) {
+            assertEquals( expected[i], actual[i] );
+        }
+    }
     
     public void testSplitPreserveAllTokens_String() {
         assertEquals(null, StringUtils.splitPreserveAllTokens(null));



Mime
View raw message