Author: niallp
Date: Sun Jan  9 00:40:03 2011
New Revision: 1056846

URL: http://svn.apache.org/viewvc?rev=1056846&view=rev
Log:
Port LANG-633 to LANG 2.x Branch - use same optimization in 
toBooleanObject(String) as in toBoolean(String)

Modified:
    
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/BooleanUtils.java
    
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/BooleanUtilsTest.java

Modified: 
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/BooleanUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/BooleanUtils.java?rev=1056846&r1=1056845&r2=1056846&view=diff
==============================================================================
--- 
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/BooleanUtils.java
 (original)
+++ 
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/BooleanUtils.java
 Sun Jan  9 00:40:03 2011
@@ -560,20 +560,98 @@ public class BooleanUtils {
      *  <code>null</code> if no match or <code>null</code> input
      */
     public static Boolean toBooleanObject(String str) {
-        if ("true".equalsIgnoreCase(str)) {
-            return Boolean.TRUE;
-        } else if ("false".equalsIgnoreCase(str)) {
-            return Boolean.FALSE;
-        } else if ("on".equalsIgnoreCase(str)) {
-            return Boolean.TRUE;
-        } else if ("off".equalsIgnoreCase(str)) {
-            return Boolean.FALSE;
-        } else if ("yes".equalsIgnoreCase(str)) {
+        // Previously used equalsIgnoreCase, which was fast for interned 
'true'.
+        // Non interned 'true' matched 15 times slower.
+        // 
+        // Optimisation provides same performance as before for interned 
'true'.
+        // Similar performance for null, 'false', and other strings not length 
2/3/4.
+        // 'true'/'TRUE' match 4 times slower, 'tRUE'/'True' 7 times slower.
+        if (str == "true") {
             return Boolean.TRUE;
-        } else if ("no".equalsIgnoreCase(str)) {
-            return Boolean.FALSE;
         }
-        // no match
+        if (str == null) {
+            return null;
+        }
+        switch (str.length()) {
+            case 1: {
+                char ch0 = str.charAt(0);
+                if ((ch0 == 'y' || ch0 == 'Y') ||
+                    (ch0 == 't' || ch0 == 'T'))
+                {
+                    return Boolean.TRUE;
+                }
+                if ((ch0 == 'n' || ch0 == 'N') ||
+                    (ch0 == 'f' || ch0 == 'F'))
+                {
+                    return Boolean.FALSE;
+                }
+                break;
+            }
+            case 2: {
+                char ch0 = str.charAt(0);
+                char ch1 = str.charAt(1);
+                if ((ch0 == 'o' || ch0 == 'O') && 
+                    (ch1 == 'n' || ch1 == 'N') ) 
+                {
+                    return Boolean.TRUE;
+                }
+                if ((ch0 == 'n' || ch0 == 'N') && 
+                    (ch1 == 'o' || ch1 == 'O') ) 
+                {
+                    return Boolean.FALSE;
+                }
+                break;
+            }
+            case 3: {
+                char ch0 = str.charAt(0);
+                char ch1 = str.charAt(1);
+                char ch2 = str.charAt(2);
+                if ((ch0 == 'y' || ch0 == 'Y') &&
+                    (ch1 == 'e' || ch1 == 'E') &&
+                    (ch2 == 's' || ch2 == 'S') ) 
+                {
+                    return Boolean.TRUE;
+                }
+                if ((ch0 == 'o' || ch0 == 'O') &&
+                    (ch1 == 'f' || ch1 == 'F') &&
+                    (ch2 == 'f' || ch2 == 'F') ) 
+                {
+                    return Boolean.FALSE;
+                }
+                break;
+            }
+            case 4: {
+                char ch0 = str.charAt(0);
+                char ch1 = str.charAt(1);
+                char ch2 = str.charAt(2);
+                char ch3 = str.charAt(3);
+                if ((ch0 == 't' || ch0 == 'T') &&
+                    (ch1 == 'r' || ch1 == 'R') &&
+                    (ch2 == 'u' || ch2 == 'U') &&
+                    (ch3 == 'e' || ch3 == 'E') ) 
+                {
+                    return Boolean.TRUE;
+                }
+                break;
+            }
+            case 5: {
+                char ch0 = str.charAt(0);
+                char ch1 = str.charAt(1);
+                char ch2 = str.charAt(2);
+                char ch3 = str.charAt(3);
+                char ch4 = str.charAt(4);
+                if ((ch0 == 'f' || ch0 == 'F') &&
+                    (ch1 == 'a' || ch1 == 'A') &&
+                    (ch2 == 'l' || ch2 == 'L') &&
+                    (ch3 == 's' || ch3 == 'S') &&
+                    (ch4 == 'e' || ch4 == 'E') ) 
+                {
+                    return Boolean.FALSE;
+                }
+                break;
+            }
+        }
+
         return null;
     }
 
@@ -644,60 +722,10 @@ public class BooleanUtils {
      * </pre>
      *
      * @param str  the String to check
-     * @return the boolean value of the string, <code>false</code> if no match
+     * @return the boolean value of the string, <code>false</code> if no match 
or the String is null
      */
     public static boolean toBoolean(String str) {
-        // Previously used equalsIgnoreCase, which was fast for interned 
'true'.
-        // Non interned 'true' matched 15 times slower.
-        // 
-        // Optimisation provides same performance as before for interned 
'true'.
-        // Similar performance for null, 'false', and other strings not length 
2/3/4.
-        // 'true'/'TRUE' match 4 times slower, 'tRUE'/'True' 7 times slower.
-        if (str == "true") {
-            return true;
-        }
-        if (str == null) {
-            return false;
-        }
-        switch (str.length()) {
-            case 2: {
-                char ch0 = str.charAt(0);
-                char ch1 = str.charAt(1);
-                return 
-                    (ch0 == 'o' || ch0 == 'O') &&
-                    (ch1 == 'n' || ch1 == 'N');
-            }
-            case 3: {
-                char ch = str.charAt(0);
-                if (ch == 'y') {
-                    return 
-                        (str.charAt(1) == 'e' || str.charAt(1) == 'E') &&
-                        (str.charAt(2) == 's' || str.charAt(2) == 'S');
-                }
-                if (ch == 'Y') {
-                    return 
-                        (str.charAt(1) == 'E' || str.charAt(1) == 'e') &&
-                        (str.charAt(2) == 'S' || str.charAt(2) == 's');
-                }
-                return false;
-            }
-            case 4: {
-                char ch = str.charAt(0);
-                if (ch == 't') {
-                    return 
-                        (str.charAt(1) == 'r' || str.charAt(1) == 'R') &&
-                        (str.charAt(2) == 'u' || str.charAt(2) == 'U') &&
-                        (str.charAt(3) == 'e' || str.charAt(3) == 'E');
-                }
-                if (ch == 'T') {
-                    return 
-                        (str.charAt(1) == 'R' || str.charAt(1) == 'r') &&
-                        (str.charAt(2) == 'U' || str.charAt(2) == 'u') &&
-                        (str.charAt(3) == 'E' || str.charAt(3) == 'e');
-                }
-            }
-        }
-        return false;
+        return toBooleanObject(str) == Boolean.TRUE;
     }
     
     /**

Modified: 
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/BooleanUtilsTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/BooleanUtilsTest.java?rev=1056846&r1=1056845&r2=1056846&view=diff
==============================================================================
--- 
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/BooleanUtilsTest.java
 (original)
+++ 
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/BooleanUtilsTest.java
 Sun Jan  9 00:40:03 2011
@@ -246,6 +246,20 @@ public class BooleanUtilsTest extends Te
         assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("ON"));
         assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("YES"));
         assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("TruE"));
+        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("TruE"));
+
+        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("y"));
+        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("Y"));
+        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("t"));
+        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("T"));
+        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("f"));
+        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("F"));
+        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("n"));
+        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("N"));
+        assertEquals(null, BooleanUtils.toBooleanObject("z"));
+
+        assertEquals(null, BooleanUtils.toBooleanObject("ab"));
+        assertEquals(null, BooleanUtils.toBooleanObject("yoo"));
     }
     
     public void test_toBooleanObject_String_String_String_String() {
@@ -311,6 +325,10 @@ public class BooleanUtilsTest extends Te
         assertEquals(true, BooleanUtils.toBoolean("YES"));
         assertEquals(false, BooleanUtils.toBoolean("yes?"));
         assertEquals(false, BooleanUtils.toBoolean("tru"));
+
+        assertEquals(false, BooleanUtils.toBoolean("no"));
+        assertEquals(false, BooleanUtils.toBoolean("off"));
+        assertEquals(false, BooleanUtils.toBoolean("yoo"));
     }
 
     public void test_toBoolean_String_String_String() {


Reply via email to