commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bay...@apache.org
Subject svn commit: r890205 - in /commons/proper/lang/trunk/src: java/org/apache/commons/lang3/StringUtils.java test/org/apache/commons/lang3/StringUtilsTrimEmptyTest.java
Date Mon, 14 Dec 2009 07:31:43 GMT
Author: bayard
Date: Mon Dec 14 07:31:42 2009
New Revision: 890205

URL: http://svn.apache.org/viewvc?rev=890205&view=rev
Log:
Adding stripAccents method to StringUtils. It requires JDK 1.6 (and accesses it via reflection
until Lang becomes 1.6 dependent). LANG-285

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

Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang3/StringUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang3/StringUtils.java?rev=890205&r1=890204&r2=890205&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang3/StringUtils.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang3/StringUtils.java Mon Dec 14
07:31:42 2009
@@ -607,6 +607,70 @@
         return newArr;
     }
 
+    /**
+     * <p>Removes the accents from a string. </p>
+     * <p>NOTE: This is a JDK 1.6 method, it will fail on JDK 1.5. </p>
+     *
+     * <pre>
+     * StringUtils.stripAccents(null)                = null
+     * StringUtils.stripAccents("")                  = ""
+     * StringUtils.stripAccents("control")           = "control"
+     * StringUtils.stripAccents("&ecute;clair")      = "eclair"
+     * </pre>
+     * 
+     * @param input String to be stripped
+     * @return String without accents on the text
+     *
+     * @since 3.0
+     */
+    public static String stripAccents(String input) {
+        if(input == null) {
+            return null;
+        }
+        if(SystemUtils.isJavaVersionAtLeast(1.6f)) {
+
+            // String decomposed = Normalizer.normalize(input, Normalizer.Form.NFD);
+
+            // START of 1.5 reflection - in 1.6 use the line commented out above
+            try {
+                // get java.text.Normalizer.Form class
+                Class normalizerFormClass = ClassUtils.getClass("java.text.Normalizer$Form",
false);
+
+                // get Normlizer class
+                Class normalizerClass = ClassUtils.getClass("java.text.Normalizer", false);
+
+                // get static method on Normalizer
+                java.lang.reflect.Method method = normalizerClass.getMethod("normalize",
CharSequence.class, normalizerFormClass );
+
+                // get Normalizer.NFD field
+                java.lang.reflect.Field nfd = normalizerFormClass.getField("NFD");
+
+                // invoke method
+                String decomposed = (String) method.invoke( null, input, nfd.get(null) );
+                // END of 1.5 reflection
+
+                java.util.regex.Pattern accentPattern = java.util.regex.Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
+                return accentPattern.matcher(decomposed).replaceAll("");
+            } catch(ClassNotFoundException cnfe) {
+                throw new RuntimeException("ClassNotFoundException occurred during 1.6 backcompat
code", cnfe);
+            } catch(NoSuchMethodException nsme) {
+                throw new RuntimeException("NoSuchMethodException occurred during 1.6 backcompat
code", nsme);
+            } catch(NoSuchFieldException nsfe) {
+                throw new RuntimeException("NoSuchFieldException occurred during 1.6 backcompat
code", nsfe);
+            } catch(IllegalAccessException iae) {
+                throw new RuntimeException("IllegalAccessException occurred during 1.6 backcompat
code", iae);
+            } catch(IllegalArgumentException iae) {
+                throw new RuntimeException("IllegalArgumentException occurred during 1.6
backcompat code", iae);
+            } catch(java.lang.reflect.InvocationTargetException ite) {
+                throw new RuntimeException("InvocationTargetException occurred during 1.6
backcompat code", ite);
+            } catch(SecurityException se) {
+                throw new RuntimeException("SecurityException occurred during 1.6 backcompat
code", se);
+            }
+        } else {
+            throw new UnsupportedOperationException("The stripAccents(String) method is not
supported until Java 1.6");
+        }
+    }
+
     // Equals
     //-----------------------------------------------------------------------
     /**

Modified: commons/proper/lang/trunk/src/test/org/apache/commons/lang3/StringUtilsTrimEmptyTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/org/apache/commons/lang3/StringUtilsTrimEmptyTest.java?rev=890205&r1=890204&r2=890205&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/org/apache/commons/lang3/StringUtilsTrimEmptyTest.java
(original)
+++ commons/proper/lang/trunk/src/test/org/apache/commons/lang3/StringUtilsTrimEmptyTest.java
Mon Dec 14 07:31:42 2009
@@ -264,6 +264,34 @@
         assertArrayEquals(foo, StringUtils.stripAll(fooDots, "."));
     }
 
+    public void testStripAccents() {
+        if(SystemUtils.isJavaVersionAtLeast(1.6f)) {
+            String cue = "\u00C7\u00FA\u00EA";
+            assertEquals( "Failed to strip accents from " + cue, "Cue", StringUtils.stripAccents(cue));
+
+            String lots = "\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C7\u00C8\u00C9" + 
+                          "\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D1\u00D2\u00D3" + 
+                          "\u00D4\u00D5\u00D6\u00D9\u00DA\u00DB\u00DC\u00DD";
+            assertEquals( "Failed to strip accents from " + lots, 
+                          "AAAAAACEEEEIIIINOOOOOUUUUY", 
+                          StringUtils.stripAccents(lots));
+
+            assertNull( "Failed null safety", StringUtils.stripAccents(null) );
+            assertEquals( "Failed empty String", "", StringUtils.stripAccents("") );
+            assertEquals( "Failed to handle non-accented text", "control", StringUtils.stripAccents("control")
);
+            assertEquals( "Failed to handle easy example", "eclair", StringUtils.stripAccents("\u00E9clair")
);
+        } else {
+            try {
+                StringUtils.stripAccents("string");
+                fail("Before JDK 1.6, stripAccents is not expected to work");
+            } catch(UnsupportedOperationException uoe) {
+                assertEquals("The stripAccents(String) method is not supported until Java
1.6", uoe.getMessage());
+            }
+        }
+    }
+
+    //-----------------------------------------------------------------------
+
     private void assertArrayEquals(Object[] o1, Object[] o2) {
         if(o1 == null) {
             assertEquals(o1,o2);



Mime
View raw message