scolebourne 2003/01/19 10:15:38 Modified: lang/src/test/org/apache/commons/lang StringUtilsTest.java lang/src/java/org/apache/commons/lang StringUtils.java Log: Fix infinite recursion in replace() when blank string used from Holger Krauth Revision Changes Path 1.12 +26 -25 jakarta-commons/lang/src/test/org/apache/commons/lang/StringUtilsTest.java Index: StringUtilsTest.java =================================================================== RCS file: /home/cvs/jakarta-commons/lang/src/test/org/apache/commons/lang/StringUtilsTest.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- StringUtilsTest.java 7 Dec 2002 21:50:30 -0000 1.11 +++ StringUtilsTest.java 19 Jan 2003 18:15:38 -0000 1.12 @@ -1,5 +1,3 @@ -package org.apache.commons.lang; - /* ==================================================================== * The Apache Software License, Version 1.1 * @@ -53,6 +51,7 @@ * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ +package org.apache.commons.lang; import java.util.Arrays; @@ -65,13 +64,14 @@ * * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Rall</a> * @author <a href="mailto:[EMAIL PROTECTED]">Henri Yandell</a> - * @author <a href="mailto:[EMAIL PROTECTED]">Stephen Colebourne</a> + * @author Stephen Colebourne * @author <a href="mailto:[EMAIL PROTECTED]">Ringo De Smet</a> * @author <a href="mailto:[EMAIL PROTECTED]>Fredrik Westermarck</a> + * @author Holger Krauth * @version $Id$ */ -public class StringUtilsTest extends TestCase -{ +public class StringUtilsTest extends TestCase { + private static final String[] ARRAY_LIST = { "foo", "bar", "baz" }; private static final String SEPARATOR = ","; @@ -108,8 +108,7 @@ //----------------------------------------------------------------------- - public void testCaseFunctions() - { + public void testCaseFunctions() { assertEquals("capitalise(String) failed", CAP_FOO, StringUtils.capitalise(FOO) ); assertEquals("capitalise(empty-string) failed", @@ -144,8 +143,7 @@ "Hello aPACHE", StringUtils.swapCase("hELLO Apache") ); } - public void testJoin() - { + public void testJoin() { assertEquals("concatenate(Object[]) failed", "foobarbaz", StringUtils.concatenate(ARRAY_LIST)); assertEquals("join(Object[], String) failed", TEXT_LIST, @@ -155,8 +153,7 @@ SEPARATOR)); } - public void testSplit() - { + public void testSplit() { String[] result = StringUtils.split(TEXT_LIST, SEPARATOR, 2); String[] expected = { "foo", "bar,baz" }; assertEquals("split(Object[], String, int) yielded unexpected length", @@ -193,8 +190,7 @@ assertEquals("split(Object[], null, int)[2] failed", "three four five six", result[2]); } - public void testReplaceFunctions() - { + public void testReplaceFunctions() { assertEquals("replace(String, String, String, int) failed", FOO, StringUtils.replace("oo" + FOO, "o", "", 2)); assertEquals("replace(String, String, String) failed", @@ -203,29 +199,35 @@ FOO, StringUtils.replaceOnce(FOO + FOO, FOO, "")); assertEquals("carriage-return replace(String,String,String) failed", "test123", StringUtils.replace("test\r1\r2\r3", "\r", "")); + + assertEquals("replace(String, String, String) failed", + "FOO", StringUtils.replace("FOO", "", "any")); + assertEquals("replace(String, String, String) failed", + "FOO", StringUtils.replace("FOO", null, "any")); + assertEquals("replace(String, String, String) failed", + "FOO", StringUtils.replace("FOO", "F", null)); + assertEquals("replace(String, String, String) failed", + "FOO", StringUtils.replace("FOO", null, null)); + assertEquals("replace(String, String, String) failed", + null, StringUtils.replace(null, "", "any")); } - public void testOverlayString() - { + public void testOverlayString() { assertEquals("overlayString(String, String, int, int) failed", "foo foor baz", StringUtils.overlayString(SENTENCE, FOO, 4, 6) ); } - public void testRepeat() - { + public void testRepeat() { assertEquals("repeat(String, int) failed", FOO + FOO + FOO, StringUtils.repeat(FOO, 3) ); } - public void testCenter() - { + public void testCenter() { assertEquals("center(String, int) failed", " "+FOO+" ", StringUtils.center(FOO, 9) ); } - public void testChompFunctions() - { - + public void testChompFunctions() { assertEquals("chomp(String) failed", FOO, StringUtils.chomp(FOO + "\n" + FOO) ); @@ -248,8 +250,7 @@ FOO, StringUtils.chopNewline(FOO + "\r\n") ); } - public void testPadFunctions() - { + public void testPadFunctions() { assertEquals("rightPad(String, int) failed", "1234 ", StringUtils.rightPad ("1234", 8) ); 1.31 +12 -11 jakarta-commons/lang/src/java/org/apache/commons/lang/StringUtils.java Index: StringUtils.java =================================================================== RCS file: /home/cvs/jakarta-commons/lang/src/java/org/apache/commons/lang/StringUtils.java,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- StringUtils.java 23 Dec 2002 00:32:24 -0000 1.30 +++ StringUtils.java 19 Jan 2003 18:15:38 -0000 1.31 @@ -73,6 +73,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Rand McNeely</a> * @author Stephen Colebourne * @author <a href="mailto:[EMAIL PROTECTED]">Fredrik Westermarck</a> + * @author Holger Krauth * @since 1.0 * @version $Id$ */ @@ -584,7 +585,9 @@ /** * <p>Replace a String with another String inside a larger String, once.</p> - * + * + * <p>A <code>null</code> reference passed to this method is a no-op.</p> + * * @see #replace(String text, String repl, String with, int max) * @param text text to search and replace in * @param repl String to search for @@ -598,6 +601,8 @@ /** * <p>Replace all occurances of a String within another String.</p> * + * <p>A <code>null</code> reference passed to this method is a no-op.</p> + * * @see #replace(String text, String repl, String with, int max) * @param text text to search and replace in * @param repl String to search for @@ -612,21 +617,17 @@ * <p>Replace a String with another String inside a larger String, * for the first <code>max</code> values of the search String.</p> * - * <p>A <code>null</code> reference is passed to this method is a - * no-op.</p> + * <p>A <code>null</code> reference passed to this method is a no-op.</p> * * @param text text to search and replace in * @param repl String to search for * @param with String to replace with - * @param max maximum number of values to replace, or - * <code>-1</code> if no maximum + * @param max maximum number of values to replace, or <code>-1</code> if no maximum * @return the text with any replacements processed - * @throws NullPointerException if repl is <code>null</code> */ - public static String replace(String text, String repl, String with, - int max) { - if (text == null) { - return null; + public static String replace(String text, String repl, String with, int max) { + if (text == null || repl == null || with == null || repl.length() == 0) { + return text; } StringBuffer buf = new StringBuffer(text.length());
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>