From 9c2b569d52f71dc05c80776f537e9db43d9bbc1b Mon Sep 17 00:00:00 2001 From: Maksym Korshun Date: Wed, 29 Jul 2026 21:09:05 +0200 Subject: [PATCH 1/3] [TEXT-241] Annotate deprecated StrBuilderTest --- src/test/java/org/apache/commons/text/StrBuilderTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/org/apache/commons/text/StrBuilderTest.java b/src/test/java/org/apache/commons/text/StrBuilderTest.java index ab82eac524..660f98ce8c 100644 --- a/src/test/java/org/apache/commons/text/StrBuilderTest.java +++ b/src/test/java/org/apache/commons/text/StrBuilderTest.java @@ -45,6 +45,7 @@ * * @deprecated This class will be removed in 2.0. */ +@Deprecated class StrBuilderTest { private static final class MockReadable implements Readable { From 7779e9937652305fa63d2d3233d9edf7d180f568 Mon Sep 17 00:00:00 2001 From: Maksym Korshun Date: Wed, 29 Jul 2026 22:20:19 +0200 Subject: [PATCH 2/3] [TEXT-241] Fix lastIndexOf() for empty search strings in StrBuilder and TextStringBuilder --- src/main/java/org/apache/commons/text/StrBuilder.java | 7 +++++-- .../java/org/apache/commons/text/TextStringBuilder.java | 7 +++++-- src/test/java/org/apache/commons/text/StrBuilderTest.java | 3 +++ .../org/apache/commons/text/TextStringBuilderTest.java | 3 +++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/text/StrBuilder.java b/src/main/java/org/apache/commons/text/StrBuilder.java index 0791a1e493..58272d8aa6 100644 --- a/src/main/java/org/apache/commons/text/StrBuilder.java +++ b/src/main/java/org/apache/commons/text/StrBuilder.java @@ -2275,7 +2275,7 @@ public int lastIndexOf(final char ch, int startIndex) { * @return The last index of the string, or -1 if not found. */ public int lastIndexOf(final String str) { - return lastIndexOf(str, size - 1); + return lastIndexOf(str, size); } /** @@ -2289,7 +2289,7 @@ public int lastIndexOf(final String str) { * @return The last index of the string, or -1 if not found. */ public int lastIndexOf(final String str, int startIndex) { - startIndex = startIndex >= size ? size - 1 : startIndex; + startIndex = startIndex >= size ? size : startIndex; if (str == null || startIndex < 0) { return StringUtils.INDEX_NOT_FOUND; } @@ -2297,6 +2297,9 @@ public int lastIndexOf(final String str, int startIndex) { if (strLen == 0) { return startIndex; } + if (startIndex >= size) { + startIndex = size - 1; + } if (strLen > size) { return StringUtils.INDEX_NOT_FOUND; } diff --git a/src/main/java/org/apache/commons/text/TextStringBuilder.java b/src/main/java/org/apache/commons/text/TextStringBuilder.java index 2021f8d89c..8fc210059d 100644 --- a/src/main/java/org/apache/commons/text/TextStringBuilder.java +++ b/src/main/java/org/apache/commons/text/TextStringBuilder.java @@ -2388,7 +2388,7 @@ public int lastIndexOf(final char ch, int startIndex) { * @return The last index of the string, or -1 if not found. */ public int lastIndexOf(final String str) { - return lastIndexOf(str, size - 1); + return lastIndexOf(str, size); } /** @@ -2403,7 +2403,7 @@ public int lastIndexOf(final String str) { * @return The last index of the string, or -1 if not found. */ public int lastIndexOf(final String str, int startIndex) { - startIndex = startIndex >= size ? size - 1 : startIndex; + startIndex = startIndex >= size ? size : startIndex; if (str == null || startIndex < 0) { return StringUtils.INDEX_NOT_FOUND; } @@ -2411,6 +2411,9 @@ public int lastIndexOf(final String str, int startIndex) { if (strLen == 0) { return startIndex; } + if (startIndex >= size) { + startIndex = size - 1; + } if (strLen > size) { return StringUtils.INDEX_NOT_FOUND; } diff --git a/src/test/java/org/apache/commons/text/StrBuilderTest.java b/src/test/java/org/apache/commons/text/StrBuilderTest.java index 660f98ce8c..0dd55d8f44 100644 --- a/src/test/java/org/apache/commons/text/StrBuilderTest.java +++ b/src/test/java/org/apache/commons/text/StrBuilderTest.java @@ -1220,6 +1220,9 @@ void testLastIndexOf_String() { assertEquals(-1, sb.lastIndexOf("z")); assertEquals(-1, sb.lastIndexOf((String) null)); + + assertEquals(4, sb.lastIndexOf("")); + assertEquals("".lastIndexOf(""), new StringBuilder().lastIndexOf("")); } @Test diff --git a/src/test/java/org/apache/commons/text/TextStringBuilderTest.java b/src/test/java/org/apache/commons/text/TextStringBuilderTest.java index 5c2e117eb2..2b12a029da 100644 --- a/src/test/java/org/apache/commons/text/TextStringBuilderTest.java +++ b/src/test/java/org/apache/commons/text/TextStringBuilderTest.java @@ -1394,6 +1394,9 @@ void testLastIndexOf_String() { assertEquals(-1, sb.lastIndexOf("z")); assertEquals(-1, sb.lastIndexOf((String) null)); + + assertEquals(4, sb.lastIndexOf("")); + assertEquals("".lastIndexOf(""), new StringBuilder().lastIndexOf("")); } @Test From 1c12400583776ea817cb953fbd2ed8564c7f8ce2 Mon Sep 17 00:00:00 2001 From: Maksym Korshun Date: Wed, 29 Jul 2026 23:24:59 +0200 Subject: [PATCH 3/3] refactor: replace conditional with Math.min --- src/main/java/org/apache/commons/text/StrBuilder.java | 2 +- src/main/java/org/apache/commons/text/TextStringBuilder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/text/StrBuilder.java b/src/main/java/org/apache/commons/text/StrBuilder.java index 58272d8aa6..063d26ece2 100644 --- a/src/main/java/org/apache/commons/text/StrBuilder.java +++ b/src/main/java/org/apache/commons/text/StrBuilder.java @@ -2289,7 +2289,7 @@ public int lastIndexOf(final String str) { * @return The last index of the string, or -1 if not found. */ public int lastIndexOf(final String str, int startIndex) { - startIndex = startIndex >= size ? size : startIndex; + startIndex = Math.min(startIndex, size); if (str == null || startIndex < 0) { return StringUtils.INDEX_NOT_FOUND; } diff --git a/src/main/java/org/apache/commons/text/TextStringBuilder.java b/src/main/java/org/apache/commons/text/TextStringBuilder.java index 8fc210059d..5cf467acfa 100644 --- a/src/main/java/org/apache/commons/text/TextStringBuilder.java +++ b/src/main/java/org/apache/commons/text/TextStringBuilder.java @@ -2403,7 +2403,7 @@ public int lastIndexOf(final String str) { * @return The last index of the string, or -1 if not found. */ public int lastIndexOf(final String str, int startIndex) { - startIndex = startIndex >= size ? size : startIndex; + startIndex = Math.min(startIndex, size); if (str == null || startIndex < 0) { return StringUtils.INDEX_NOT_FOUND; }