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));
+    }
 }

Reply via email to