You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ni...@apache.org on 2010/01/29 20:18:36 UTC

svn commit: r904598 - in /commons/proper/lang/branches/LANG_2_X/src: main/java/org/apache/commons/lang/StringUtils.java test/java/org/apache/commons/lang/StringUtilsEqualsIndexOfTest.java

Author: niallp
Date: Fri Jan 29 19:18:36 2010
New Revision: 904598

URL: http://svn.apache.org/viewvc?rev=904598&view=rev
Log:
Port LANG-432 to 2.x branch - Applying the final part of Benjamin Bentmann's patch to LANG-432, improving handling of case-insensitive Strings

Modified:
    commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/StringUtils.java
    commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/StringUtilsEqualsIndexOfTest.java

Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/StringUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/StringUtils.java?rev=904598&r1=904597&r2=904598&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/StringUtils.java (original)
+++ commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/StringUtils.java Fri Jan 29 19:18:36 2010
@@ -1254,8 +1254,8 @@
 
     /**
      * <p>Checks if String contains a search String irrespective of case,
-     * handling <code>null</code>. This method uses
-     * {@link #contains(String, String)}.</p>
+     * handling <code>null</code>. Case-insensitivity is defined as by
+     * {@link String#equalsIgnoreCase(String)}.
      *
      * <p>A <code>null</code> String will return <code>false</code>.</p>
      *
@@ -1279,7 +1279,14 @@
         if (str == null || searchStr == null) {
             return false;
         }
-        return contains(str.toUpperCase(), searchStr.toUpperCase());
+        int len = searchStr.length();
+        int max = str.length() - len;
+        for (int i = 0; i <= max; i++) {
+            if (str.regionMatches(true, i, searchStr, 0, len)) {
+                return true;
+            }
+        }
+        return false;
     }
 
     // IndexOfAny chars

Modified: commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/StringUtilsEqualsIndexOfTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/StringUtilsEqualsIndexOfTest.java?rev=904598&r1=904597&r2=904598&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/StringUtilsEqualsIndexOfTest.java (original)
+++ commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/StringUtilsEqualsIndexOfTest.java Fri Jan 29 19:18:36 2010
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.lang;
 
+import java.util.Locale;
+
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -395,7 +397,41 @@
         assertTrue(StringUtils.containsIgnoreCase("xabcz", "ABC"));
     }
 
-    //-----------------------------------------------------------------------
+    public void testContainsIgnoreCase_LocaleIndependence() {
+        Locale orig = Locale.getDefault();
+
+        Locale[] locales = { Locale.ENGLISH, new Locale("tr", ""), Locale.getDefault() };
+
+        String[][] tdata = { 
+            { "i", "I" },
+            { "I", "i" },
+            { "\u03C2", "\u03C3" },
+            { "\u03A3", "\u03C2" },
+            { "\u03A3", "\u03C3" },
+        };
+
+        String[][] fdata = { 
+            { "\u00DF", "SS" },
+        };
+
+        try {
+            for (int i = 0; i < locales.length; i++) {
+                Locale.setDefault(locales[i]);
+                for (int j = 0; j < tdata.length; j++) {
+                    assertTrue(Locale.getDefault() + ": " + j + " " + tdata[j][0] + " " + tdata[j][1], StringUtils
+                            .containsIgnoreCase(tdata[j][0], tdata[j][1]));
+                }
+                for (int j = 0; j < fdata.length; j++) {
+                    assertFalse(Locale.getDefault() + ": " + j + " " + fdata[j][0] + " " + fdata[j][1], StringUtils
+                            .containsIgnoreCase(fdata[j][0], fdata[j][1]));
+                }
+            }
+        } finally {
+            Locale.setDefault(orig);
+        }
+    }
+
+    // -----------------------------------------------------------------------
     public void testIndexOfAny_StringStringarray() {
         assertEquals(-1, StringUtils.indexOfAny(null, (String[]) null));
         assertEquals(-1, StringUtils.indexOfAny(null, FOOBAR_SUB_ARRAY));