TEXT-219: StringTokenizer.getTokenList to return an independent list
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 3a557ac..3893deb 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -46,6 +46,7 @@
<body>
<release version="1.10.1" date="20YY-MM-DD" description="Release 1.10.1. Requires Java 8.">
<!-- FIX -->
+ <action issue="TEXT-219" type="fix" dev="aherbert" due-to="Jaap Sperling">Fix StringTokenizer.getTokenList to return an independent modifiable list</action>
<!-- ADD -->
<!-- UPDATE -->
<action type="update" dev="kinow" due-to="Dependabot">Bump actions/cache from 3.0.8 to 3.0.10 #361, #365.</action>
diff --git a/src/main/java/org/apache/commons/text/StringTokenizer.java b/src/main/java/org/apache/commons/text/StringTokenizer.java
index 731c468..3df7423 100644
--- a/src/main/java/org/apache/commons/text/StringTokenizer.java
+++ b/src/main/java/org/apache/commons/text/StringTokenizer.java
@@ -558,7 +558,7 @@
*/
public List<String> getTokenList() {
checkTokenized();
- return Arrays.asList(tokens);
+ return new ArrayList<>(Arrays.asList(tokens));
}
/**
diff --git a/src/test/java/org/apache/commons/text/StringTokenizerTest.java b/src/test/java/org/apache/commons/text/StringTokenizerTest.java
index 6bf9788..458cc81 100644
--- a/src/test/java/org/apache/commons/text/StringTokenizerTest.java
+++ b/src/test/java/org/apache/commons/text/StringTokenizerTest.java
@@ -767,10 +767,24 @@
final String input = "a b c";
final StringTokenizer tok = new StringTokenizer(input);
final String[] array = tok.getTokenArray();
- final List<?> list = tok.getTokenList();
+ final List<String> list = tok.getTokenList();
assertEquals(Arrays.asList(array), list);
assertEquals(3, list.size());
+
+ // Test modification of the returned list
+ list.set(0, "z");
+ list.remove(1);
+ list.set(1, "y");
+ list.add("x");
+
+ assertEquals(Arrays.asList(new String[] {"z", "y", "x"}), list);
+
+ // The tokenizer is unchanged
+ assertEquals(Arrays.asList(array), tok.getTokenList());
+ assertEquals("a", tok.next());
+ assertEquals("b", tok.next());
+ assertEquals("c", tok.next());
}
@Test