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);