Repository: commons-lang Updated Branches: refs/heads/master 30dcb8de4 -> 63f11e9dc
LANG-1352: EnumUtils.getEnumIgnoreCase and isValidEnumIgnoreCase methods added (closes #286) Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/0b70b01a Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/0b70b01a Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/0b70b01a Branch: refs/heads/master Commit: 0b70b01a9f1d9664bb5eac737175f58f06979b60 Parents: 30dcb8d Author: Ruslan Sibgatullin <better...@gmail.com> Authored: Thu Sep 14 23:19:41 2017 +0300 Committer: pascalschumacher <pascalschumac...@gmx.net> Committed: Fri Jan 12 17:58:38 2018 +0100 ---------------------------------------------------------------------- .../org/apache/commons/lang3/EnumUtils.java | 49 ++++++++++++++++---- .../org/apache/commons/lang3/EnumUtilsTest.java | 44 +++++++++++++++++- 2 files changed, 82 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-lang/blob/0b70b01a/src/main/java/org/apache/commons/lang3/EnumUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/lang3/EnumUtils.java b/src/main/java/org/apache/commons/lang3/EnumUtils.java index ab062ad..5aa7668 100644 --- a/src/main/java/org/apache/commons/lang3/EnumUtils.java +++ b/src/main/java/org/apache/commons/lang3/EnumUtils.java @@ -87,15 +87,23 @@ public class EnumUtils { * @return true if the enum name is valid, otherwise false */ public static <E extends Enum<E>> boolean isValidEnum(final Class<E> enumClass, final String enumName) { - if (enumName == null) { - return false; - } - try { - Enum.valueOf(enumClass, enumName); - return true; - } catch (final IllegalArgumentException ex) { - return false; - } + return getEnum(enumClass, enumName) != null; + } + + /** + * <p>Checks if the specified name is a valid enum for the class.</p> + * + * <p>This method differs from {@link Enum#valueOf} in that checks if the name is + * a valid enum without needing to catch the exception + * 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 false + * @return true if the enum name is valid, otherwise false + */ + public static <E extends Enum<E>> boolean isValidEnumIgnoreCase(final Class<E> enumClass, final String enumName) { + return getEnumIgnoreCase(enumClass, enumName) != null; } /** @@ -121,6 +129,29 @@ public class EnumUtils { } /** + * <p>Gets the enum for the class, returning {@code null} if not found.</p> + * + * <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 + */ + public static <E extends Enum<E>> E getEnumIgnoreCase(final Class<E> enumClass, final String enumName) { + if (enumName == null || !enumClass.isEnum()) { + return null; + } + for (final E each : enumClass.getEnumConstants()) { + if (each.name().equalsIgnoreCase(enumName)) { + return each; + } + } + return null; + } + + /** * <p>Creates a long bit vector representation of the given subset of an Enum.</p> * * <p>This generates a value that is usable by {@link EnumUtils#processBitVector}.</p> http://git-wip-us.apache.org/repos/asf/commons-lang/blob/0b70b01a/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java b/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java index f17ddda..7c732b2 100644 --- a/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java @@ -67,7 +67,7 @@ public class EnumUtilsTest { } @Test - public void test_isEnum() { + public void test_isValidEnum() { assertTrue(EnumUtils.isValidEnum(Traffic.class, "RED")); assertTrue(EnumUtils.isValidEnum(Traffic.class, "AMBER")); assertTrue(EnumUtils.isValidEnum(Traffic.class, "GREEN")); @@ -76,11 +76,25 @@ public class EnumUtilsTest { } @Test(expected=NullPointerException.class) - public void test_isEnum_nullClass() { + public void test_isValidEnum_nullClass() { EnumUtils.isValidEnum(null, "PURPLE"); } @Test + public void test_isValidEnumIgnoreCase() { + assertTrue(EnumUtils.isValidEnumIgnoreCase(Traffic.class, "red")); + assertTrue(EnumUtils.isValidEnumIgnoreCase(Traffic.class, "Amber")); + assertTrue(EnumUtils.isValidEnumIgnoreCase(Traffic.class, "grEEn")); + assertFalse(EnumUtils.isValidEnumIgnoreCase(Traffic.class, "purple")); + assertFalse(EnumUtils.isValidEnumIgnoreCase(Traffic.class, null)); + } + + @Test(expected=NullPointerException.class) + public void test_isValidEnumIgnoreCase_nullClass() { + EnumUtils.isValidEnumIgnoreCase(null, "PURPLE"); + } + + @Test public void test_getEnum() { assertEquals(Traffic.RED, EnumUtils.getEnum(Traffic.class, "RED")); assertEquals(Traffic.AMBER, EnumUtils.getEnum(Traffic.class, "AMBER")); @@ -89,11 +103,37 @@ public class EnumUtilsTest { assertNull(EnumUtils.getEnum(Traffic.class, null)); } + @Test + public void test_getEnum_nonEnumClass() { + final Class rawType = Object.class; + assertNull(EnumUtils.getEnum(rawType, "rawType")); + } + @Test(expected=NullPointerException.class) public void test_getEnum_nullClass() { EnumUtils.getEnum((Class<Traffic>) null, "PURPLE"); } + @Test + public void test_getEnumIgnoreCase() { + assertEquals(Traffic.RED, EnumUtils.getEnumIgnoreCase(Traffic.class, "red")); + assertEquals(Traffic.AMBER, EnumUtils.getEnumIgnoreCase(Traffic.class, "Amber")); + assertEquals(Traffic.GREEN, EnumUtils.getEnumIgnoreCase(Traffic.class, "grEEn")); + assertNull(EnumUtils.getEnumIgnoreCase(Traffic.class, "purple")); + assertNull(EnumUtils.getEnumIgnoreCase(Traffic.class, null)); + } + + @Test + public void test_getEnumIgnoreCase_nonEnumClass() { + final Class rawType = Object.class; + assertNull(EnumUtils.getEnumIgnoreCase(rawType, "rawType")); + } + + @Test(expected=NullPointerException.class) + public void test_getEnumIgnoreCase_nullClass() { + EnumUtils.getEnumIgnoreCase((Class<Traffic>) null, "PURPLE"); + } + @Test(expected=NullPointerException.class) public void test_generateBitVector_nullClass() { EnumUtils.generateBitVector(null, EnumSet.of(Traffic.RED));