Started cloning the input character array. Record in LANG-489 for migration guide.

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/lang/trunk@775429 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Henri Yandell 2009-05-16 08:18:46 +00:00
parent 0d231cb285
commit 58178ddfd8
2 changed files with 7 additions and 27 deletions

View File

@ -22,6 +22,8 @@ import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import org.apache.commons.lang.ArrayUtils;
/** /**
* Tokenizes a string based based on delimiters (separators) * Tokenizes a string based based on delimiters (separators)
* and supporting quoting and ignored character concepts. * and supporting quoting and ignored character concepts.
@ -319,22 +321,16 @@ public class StrTokenizer implements ListIterator<String>, Cloneable {
/** /**
* Constructs a tokenizer splitting on space, tab, newline and formfeed * Constructs a tokenizer splitting on space, tab, newline and formfeed
* as per StringTokenizer. * as per StringTokenizer.
* <p>
* The input character array is not cloned, and must not be altered after
* passing in to this method.
* *
* @param input the string which is to be parsed, not cloned * @param input the string which is to be parsed, not cloned
*/ */
public StrTokenizer(char[] input) { public StrTokenizer(char[] input) {
super(); super();
this.chars = input; this.chars = ArrayUtils.clone(input);
} }
/** /**
* Constructs a tokenizer splitting on the specified character. * Constructs a tokenizer splitting on the specified character.
* <p>
* The input character array is not cloned, and must not be altered after
* passing in to this method.
* *
* @param input the string which is to be parsed, not cloned * @param input the string which is to be parsed, not cloned
* @param delim the field delimiter character * @param delim the field delimiter character
@ -346,9 +342,6 @@ public class StrTokenizer implements ListIterator<String>, Cloneable {
/** /**
* Constructs a tokenizer splitting on the specified string. * Constructs a tokenizer splitting on the specified string.
* <p>
* The input character array is not cloned, and must not be altered after
* passing in to this method.
* *
* @param input the string which is to be parsed, not cloned * @param input the string which is to be parsed, not cloned
* @param delim the field delimiter string * @param delim the field delimiter string
@ -360,9 +353,6 @@ public class StrTokenizer implements ListIterator<String>, Cloneable {
/** /**
* Constructs a tokenizer splitting using the specified delimiter matcher. * Constructs a tokenizer splitting using the specified delimiter matcher.
* <p>
* The input character array is not cloned, and must not be altered after
* passing in to this method.
* *
* @param input the string which is to be parsed, not cloned * @param input the string which is to be parsed, not cloned
* @param delim the field delimiter matcher * @param delim the field delimiter matcher
@ -375,9 +365,6 @@ public class StrTokenizer implements ListIterator<String>, Cloneable {
/** /**
* Constructs a tokenizer splitting on the specified delimiter character * Constructs a tokenizer splitting on the specified delimiter character
* and handling quotes using the specified quote character. * and handling quotes using the specified quote character.
* <p>
* The input character array is not cloned, and must not be altered after
* passing in to this method.
* *
* @param input the string which is to be parsed, not cloned * @param input the string which is to be parsed, not cloned
* @param delim the field delimiter character * @param delim the field delimiter character
@ -391,9 +378,6 @@ public class StrTokenizer implements ListIterator<String>, Cloneable {
/** /**
* Constructs a tokenizer splitting using the specified delimiter matcher * Constructs a tokenizer splitting using the specified delimiter matcher
* and handling quotes using the specified quote matcher. * and handling quotes using the specified quote matcher.
* <p>
* The input character array is not cloned, and must not be altered after
* passing in to this method.
* *
* @param input the string which is to be parsed, not cloned * @param input the string which is to be parsed, not cloned
* @param delim the field delimiter character * @param delim the field delimiter character
@ -499,16 +483,13 @@ public class StrTokenizer implements ListIterator<String>, Cloneable {
* Reset this tokenizer, giving it a new input string to parse. * Reset this tokenizer, giving it a new input string to parse.
* In this manner you can re-use a tokenizer with the same settings * In this manner you can re-use a tokenizer with the same settings
* on multiple input lines. * on multiple input lines.
* <p>
* The input character array is not cloned, and must not be altered after
* passing in to this method.
* *
* @param input the new character array to tokenize, not cloned, null sets no text to parse * @param input the new character array to tokenize, not cloned, null sets no text to parse
* @return this, to enable chaining * @return this, to enable chaining
*/ */
public StrTokenizer reset(char[] input) { public StrTokenizer reset(char[] input) {
reset(); reset();
this.chars = input; this.chars = ArrayUtils.clone(input);
return this; return this;
} }

View File

@ -592,12 +592,12 @@ public class StrTokenizerTest extends TestCase {
StrTokenizer tokenizer = new StrTokenizer(input); StrTokenizer tokenizer = new StrTokenizer(input);
// Start sanity check // Start sanity check
assertEquals("a", tokenizer.nextToken()); assertEquals("a", tokenizer.nextToken());
tokenizer.reset(); tokenizer.reset(input);
assertEquals("a", tokenizer.nextToken()); assertEquals("a", tokenizer.nextToken());
// End sanity check // End sanity check
StrTokenizer clonedTokenizer = (StrTokenizer) tokenizer.clone(); StrTokenizer clonedTokenizer = (StrTokenizer) tokenizer.clone();
input[0] = 'b'; input[0] = 'b';
tokenizer.reset(); tokenizer.reset(input);
assertEquals("b", tokenizer.nextToken()); assertEquals("b", tokenizer.nextToken());
assertEquals("a", clonedTokenizer.nextToken()); assertEquals("a", clonedTokenizer.nextToken());
} }
@ -723,9 +723,8 @@ public class StrTokenizerTest extends TestCase {
public void testReset_charArray() { public void testReset_charArray() {
StrTokenizer tok = new StrTokenizer("x x x"); StrTokenizer tok = new StrTokenizer("x x x");
char[] array = new char[] {'a', ' ', 'c'}; char[] array = new char[] {'a', 'b', 'c'};
tok.reset(array); tok.reset(array);
array[1] = 'b'; // test linked array
assertEquals("abc", tok.next()); assertEquals("abc", tok.next());
assertEquals(false, tok.hasNext()); assertEquals(false, tok.hasNext());