This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push: new 6e78b38f0 Avoid JDK-8015417 in Strings.equals() 6e78b38f0 is described below commit 6e78b38f055516bfef2b7b1e2b83e96a7a67f2ec Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Thu Sep 26 11:01:53 2024 -0400 Avoid JDK-8015417 in Strings.equals() --- .../java/org/apache/commons/lang3/Strings.java | 13 +++++++++-- .../java/org/apache/commons/lang3/StringsTest.java | 26 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/Strings.java b/src/main/java/org/apache/commons/lang3/Strings.java index fa3814f17..d89fbae90 100644 --- a/src/main/java/org/apache/commons/lang3/Strings.java +++ b/src/main/java/org/apache/commons/lang3/Strings.java @@ -140,7 +140,7 @@ public abstract class Strings { @Override public boolean equals(final String s1, final String s2) { - return s1.equalsIgnoreCase(s2); + return s1 == null ? s2 == null : s1.equalsIgnoreCase(s2); } @Override @@ -247,7 +247,7 @@ public abstract class Strings { @Override public boolean equals(final String s1, final String s2) { - return s1.equals(s2); + return eq(s1, s2); } @Override @@ -305,6 +305,15 @@ public abstract class Strings { return false; } + /** + * Tests for equality in a null-safe manner. + * + * JDK-8015417. + */ + private static boolean eq(final Object o1, final Object o2) { + return o1 == null ? o2 == null : o1.equals(o2); + } + /** * Ignores case when possible. */ diff --git a/src/test/java/org/apache/commons/lang3/StringsTest.java b/src/test/java/org/apache/commons/lang3/StringsTest.java index 1bb29ddc0..b8cef63c4 100644 --- a/src/test/java/org/apache/commons/lang3/StringsTest.java +++ b/src/test/java/org/apache/commons/lang3/StringsTest.java @@ -21,13 +21,21 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.stream.Stream; + import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; /** * Tests {@link Strings}. */ public class StringsTest { + public static Stream<Strings> stringsFactory() { + return Stream.of(Strings.CS, Strings.CI); + } + @Test public void testBuilder() { assertTrue(Strings.builder().setIgnoreCase(false).get().isCaseSensitive()); @@ -54,4 +62,22 @@ public class StringsTest { assertNotNull(Strings.CS); assertTrue(Strings.CS.isCaseSensitive()); } + + @ParameterizedTest + @MethodSource("stringsFactory") + public void testEqualsStrings(final Strings strings) { + final String nullStr = null; + assertTrue(strings.equals(nullStr, nullStr)); + assertFalse(strings.equals(nullStr, "")); + assertFalse(strings.equals("", nullStr)); + } + + @ParameterizedTest + @MethodSource("stringsFactory") + public void testEqualsCharSequence(final Strings strings) { + final CharSequence nullCharSequence = null; + assertTrue(strings.equals(nullCharSequence, nullCharSequence)); + assertFalse(strings.equals(nullCharSequence, "")); + assertFalse(strings.equals("", nullCharSequence)); + } }