You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2025/06/25 15:32:51 UTC

(commons-lang) 03/03: org.apache.commons.lang3.EnumUtils.getFirstEnumIgnoreCase(Class, String, Function, E) now returns the given default enum on null enumClass input

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

commit a4ba12e80c1b82b814b0165704934ef182ad069f
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Wed Jun 25 11:32:41 2025 -0400

    org.apache.commons.lang3.EnumUtils.getFirstEnumIgnoreCase(Class<E>,
    String, Function<E, String>, E) now returns the given default enum on
    null enumClass input
    
    - org.apache.commons.lang3.EnumUtils.getEnumIgnoreCase(Class<E>, String,
    E) now returns the given default enum on null enumClass input
    - org.apache.commons.lang3.EnumUtils.getEnumIgnoreCase(Class<E>, String)
    now returns the given default enum on null enumClass input
---
 src/changes/changes.xml                            |  3 ++
 .../java/org/apache/commons/lang3/EnumUtils.java   | 36 +++++++++++-----------
 .../org/apache/commons/lang3/EnumUtilsTest.java    |  7 +++--
 3 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f4d67b951..20e7e2ea1 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -100,6 +100,9 @@ The <action> type attribute can be add,update,fix,remove.
     <action                   type="fix" dev="ggregory" due-to="Gary Gregory">Fix edge-case NullPointerException in org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost(JavaVersion).</action>
     <action                   type="fix" dev="ggregory" due-to="Gary Gregory">Return the default enum if a SecurityException is caught in getEnumSystemProperty().</action>
     <action                   type="fix" dev="ggregory" due-to="Gary Gregory">Fix edge-case NullPointerException in org.apache.commons.lang3.EnumUtils.getEnum(Class, String, E).</action>
+    <action                   type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.lang3.EnumUtils.getFirstEnumIgnoreCase(Class, String, Function, E) now returns the given default enum on null enumClass input.</action>
+    <action                   type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.lang3.EnumUtils.getEnumIgnoreCase(Class, String, E) now returns the given default enum on null enumClass input.</action>
+    <action                   type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.lang3.EnumUtils.getEnumIgnoreCase(Class, String) now returns the given default enum on null enumClass input.</action>
     <!-- ADD -->
     <action                   type="add" dev="ggregory" due-to="Gary Gregory">Add Strings and refactor StringUtils.</action>
     <action issue="LANG-1747" type="add" dev="ggregory" due-to="Oliver B. Fischer, Gary Gregory">Add StopWatch.run([Failable]Runnable) and get([Failable]Supplier).</action>
diff --git a/src/main/java/org/apache/commons/lang3/EnumUtils.java b/src/main/java/org/apache/commons/lang3/EnumUtils.java
index cd6950ea6..1ab0d4aa0 100644
--- a/src/main/java/org/apache/commons/lang3/EnumUtils.java
+++ b/src/main/java/org/apache/commons/lang3/EnumUtils.java
@@ -231,10 +231,10 @@ public static <E extends Enum<E>> E getEnum(final Class<E> enumClass, final Stri
      * <p>This method differs from {@link Enum#valueOf} in that it does not throw an exception
      * for an invalid enum name and performs case insensitive matching of the name.</p>
      *
-     * @param <E>         the type of the enumeration
-     * @param enumClass   the class of the enum to query, not null
-     * @param enumName    the enum name, null returns null
-     * @return the enum, null if not found
+     * @param <E>         the type of the enumeration.
+     * @param enumClass   the class of the enum to query, may be null.
+     * @param enumName    the enum name, null returns null.
+     * @return the enum, null if not found.
      * @since 3.8
      */
     public static <E extends Enum<E>> E getEnumIgnoreCase(final Class<E> enumClass, final String enumName) {
@@ -247,11 +247,11 @@ public static <E extends Enum<E>> E getEnumIgnoreCase(final Class<E> enumClass,
      * <p>This method differs from {@link Enum#valueOf} in that it does not throw an exception
      * for an invalid enum name and performs case insensitive matching of the name.</p>
      *
-     * @param <E>         the type of the enumeration
-     * @param enumClass   the class of the enum to query, not null
-     * @param enumName    the enum name, null returns default enum
-     * @param defaultEnum the default enum
-     * @return the enum, default enum if not found
+     * @param <E>         the type of the enumeration.
+     * @param enumClass   the class of the enum to query, null returns default enum.
+     * @param enumName    the enum name, null returns default enum.
+     * @param defaultEnum the default enum.
+     * @return the enum, default enum if not found.
      * @since 3.10
      */
     public static <E extends Enum<E>> E getEnumIgnoreCase(final Class<E> enumClass, final String enumName,
@@ -353,17 +353,17 @@ public static <E extends Enum<E>> E getFirstEnum(final Class<E> enumClass, final
      * <p>This method differs from {@link Enum#valueOf} in that it does not throw an exception
      * for an invalid enum name and performs case insensitive matching of the name.</p>
      *
-     * @param <E>         the type of the enumeration
-     * @param enumClass   the class of the enum to query, not null
-     * @param enumName    the enum name, null returns default enum
+     * @param <E>         the type of the enumeration.
+     * @param enumClass   the class of the enum to query, null returns default enum.
+     * @param enumName    the enum name, null returns default enum.
      * @param stringFunction the function that gets the string for an enum for comparison to {@code enumName}.
-     * @param defaultEnum the default enum
-     * @return an enum, default enum if not found
+     * @param defaultEnum the default enum.
+     * @return an enum, default enum if not found.
      * @since 3.13.0
      */
     public static <E extends Enum<E>> E getFirstEnumIgnoreCase(final Class<E> enumClass, final String enumName, final Function<E, String> stringFunction,
             final E defaultEnum) {
-        if (enumName == null || !enumClass.isEnum()) {
+        if (enumName == null) {
             return defaultEnum;
         }
         return stream(enumClass).filter(e -> enumName.equalsIgnoreCase(stringFunction.apply(e))).findFirst().orElse(defaultEnum);
@@ -454,13 +454,13 @@ public static <E extends Enum<E>> EnumSet<E> processBitVectors(final Class<E> en
      * Returns a sequential ordered stream whose elements are the given class' enum values.
      *
      * @param <T>   the type of stream elements.
-     * @param clazz the class containing the enum values.
-     * @return the new stream.
+     * @param clazz the class containing the enum values, may be null.
+     * @return the new stream, empty of {@code clazz} is null.
      * @since 3.18.0
      * @see Class#getEnumConstants()
      */
     public static <T> Stream<T> stream(final Class<T> clazz) {
-        return Streams.of(clazz.getEnumConstants());
+        return clazz != null ? Streams.of(clazz.getEnumConstants()) : Stream.empty();
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java b/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java
index ab2375584..502f745a7 100644
--- a/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java
@@ -321,6 +321,7 @@ void testGetEnumIgnoreCase_defaultEnum() {
         assertEquals(Traffic.GREEN, EnumUtils.getEnumIgnoreCase(Traffic.class, null, Traffic.GREEN));
         assertEquals(Traffic.RED, EnumUtils.getEnumIgnoreCase(Traffic.class, null, Traffic.RED));
         assertNull(EnumUtils.getEnumIgnoreCase(Traffic.class, "PURPLE", null));
+        assertNull(EnumUtils.getEnumIgnoreCase(null, "PURPLE", null));
     }
 
     /**
@@ -336,7 +337,7 @@ void testGetEnumIgnoreCase_nonEnumClass() {
 
     @Test
     void testGetEnumIgnoreCase_nullClass() {
-        assertNullPointerException(() -> EnumUtils.getEnumIgnoreCase((Class<Traffic>) null, "PURPLE"));
+        assertNull(EnumUtils.getEnumIgnoreCase((Class<Traffic>) null, "PURPLE"));
     }
 
     @Test
@@ -440,6 +441,7 @@ void testGetFirstEnumIgnoreCase_defaultEnum() {
         assertEquals(Traffic2.GREEN, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, null, f, Traffic2.GREEN));
         assertEquals(Traffic2.RED, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, null, f, Traffic2.RED));
         assertNull(EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, "PURPLE", f, null));
+        assertNull(EnumUtils.getFirstEnumIgnoreCase(null, "PURPLE", f, null));
     }
 
     @Test
@@ -482,7 +484,7 @@ void testIsValidEnumIgnoreCase() {
 
     @Test
     void testIsValidEnumIgnoreCase_nullClass() {
-        assertNullPointerException(() -> EnumUtils.isValidEnumIgnoreCase(null, "PURPLE"));
+        assertFalse(EnumUtils.isValidEnumIgnoreCase(null, "PURPLE"));
     }
 
     @Test
@@ -613,6 +615,7 @@ void testStream() {
         assertEquals(7, EnumUtils.stream(TimeUnit.class).count());
         Assertions.assertArrayEquals(TimeUnit.values(), EnumUtils.stream(TimeUnit.class).toArray(TimeUnit[]::new));
         assertEquals(0, EnumUtils.stream(Object.class).count());
+        assertEquals(0, EnumUtils.stream(null).count());
     }
 
 }