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 2020/04/27 13:45:31 UTC
[commons-configuration] 02/02: [CONFIGURATION-789] Add
ImmutableConfiguration.getEnum() methods.
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-configuration.git
commit 2a20bf267662b709958c3d3c77ad8c16ce3312b9
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Mon Apr 27 09:45:24 2020 -0400
[CONFIGURATION-789] Add ImmutableConfiguration.getEnum() methods.
---
src/changes/changes.xml | 3 ++
.../configuration2/ImmutableConfiguration.java | 48 ++++++++++++++++++++++
.../configuration2/ex/ConversionException.java | 2 +-
.../apache/commons/configuration2/EnumFixture.java | 23 +++++++++++
.../configuration2/TestBaseConfiguration.java | 29 ++++++++++++-
5 files changed, 103 insertions(+), 2 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 764e1af..e124773 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -27,6 +27,9 @@
<action type="update" dev="ggregory" issue="CONFIGURATION-787" due-to="Gary Gregory">
Update from Apache Commons Lang 3.9 to 3.10.
</action>
+ <action type="add" dev="ggregory" issue="CONFIGURATION-789" due-to="Gary Gregory">
+ Add ImmutableConfiguration.getEnum() methods.
+ </action>
</release>
<release version="2.7" date="2020-03-07"
description="Minor release with new features and updated dependencies.">
diff --git a/src/main/java/org/apache/commons/configuration2/ImmutableConfiguration.java b/src/main/java/org/apache/commons/configuration2/ImmutableConfiguration.java
index d77d0b8..d2e7d93 100644
--- a/src/main/java/org/apache/commons/configuration2/ImmutableConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/ImmutableConfiguration.java
@@ -23,6 +23,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Properties;
+import org.apache.commons.configuration2.ex.ConversionException;
+
/**
* <p>The main interface for accessing configuration data in a read-only fashion.</p>
* <p>
@@ -492,6 +494,52 @@ public interface ImmutableConfiguration
String getEncodedString(String key);
/**
+ * Gets an enum associated with the given configuration key.
+ *
+ * @param <T> The enum type whose constant is to be returned.
+ * @param enumType the {@code Class} object of the enum type from which to return a constant
+ * @param key The configuration key.
+ * @return The associated enum.
+ *
+ * @throws org.apache.commons.configuration2.ex.ConversionException is thrown if the key maps to an object that
+ * is not a String.
+ * @since 2.8
+ */
+ default <T extends Enum<T>> T getEnum(String key, Class<T> enumType) {
+ try {
+ return Enum.valueOf(enumType, getString(key));
+ } catch (IllegalArgumentException e) {
+ throw new ConversionException(e);
+ }
+ }
+
+ /**
+ * Gets the enum associated with the given configuration key. If the key doesn't map to an existing object, the
+ * default value is returned.
+ *
+ * @param <T> The enum type whose constant is to be returned.
+ * @param key The configuration key.
+ * @param enumType the {@code Class} object of the enum type from which to return a constant
+ * @param defaultValue The default value.
+ * @return The associated enum if key is found and has valid format, default value otherwise.
+ *
+ * @throws org.apache.commons.configuration2.ex.ConversionException is thrown if the key maps to an object that is
+ * not a Enum.
+ * @since 2.8
+ */
+ default <T extends Enum<T>> T getEnum(String key, Class<T> enumType, T defaultValue) {
+ final String strValue = getString(key, null);
+ if (strValue == null) {
+ return defaultValue;
+ }
+ try {
+ return Enum.valueOf(enumType, strValue);
+ } catch (IllegalArgumentException e) {
+ throw new ConversionException(e);
+ }
+ }
+
+ /**
* Get an array of strings associated with the given configuration key.
* If the key doesn't map to an existing object an empty array is returned
*
diff --git a/src/main/java/org/apache/commons/configuration2/ex/ConversionException.java b/src/main/java/org/apache/commons/configuration2/ex/ConversionException.java
index 81f8f8c..6a3e3e7 100644
--- a/src/main/java/org/apache/commons/configuration2/ex/ConversionException.java
+++ b/src/main/java/org/apache/commons/configuration2/ex/ConversionException.java
@@ -19,7 +19,7 @@ package org.apache.commons.configuration2.ex;
/**
- * Exception thrown when a property is incompatible with the type requested.
+ * Thrown when a property is incompatible with the type requested.
*
* @since 1.0
*
diff --git a/src/test/java/org/apache/commons/configuration2/EnumFixture.java b/src/test/java/org/apache/commons/configuration2/EnumFixture.java
new file mode 100644
index 0000000..8d0688a
--- /dev/null
+++ b/src/test/java/org/apache/commons/configuration2/EnumFixture.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.configuration2;
+
+public enum EnumFixture {
+
+ JAVA, SMALLTALK, SCALA
+}
diff --git a/src/test/java/org/apache/commons/configuration2/TestBaseConfiguration.java b/src/test/java/org/apache/commons/configuration2/TestBaseConfiguration.java
index 3c56005..6d52866 100644
--- a/src/test/java/org/apache/commons/configuration2/TestBaseConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/TestBaseConfiguration.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -59,7 +60,6 @@ public class TestBaseConfiguration
static final String KEY_NUMBER = "number";
protected static Class<?> missingElementException = NoSuchElementException.class;
-
protected static Class<?> incompatibleElementException = ConversionException.class;
protected BaseConfiguration config = null;
@@ -527,6 +527,33 @@ public class TestBaseConfiguration
assertEquals("Missing key with default value", defaultValue, config.getString("stringNotInConfig", defaultValue));
}
+ @Test
+ public void testGetEnum()
+ {
+ config.setProperty("testEnum", EnumFixture.SMALLTALK.name());
+ config.setProperty("testBadEnum", "This is not an enum value.");
+ final EnumFixture enum1 = EnumFixture.SMALLTALK;
+ final EnumFixture defaultValue = EnumFixture.JAVA;
+ //
+ assertEquals("Existing key", enum1, config.getEnum("testEnum", EnumFixture.class));
+ assertEquals("Existing key with default value", enum1, config.getEnum("testEnum", EnumFixture.class, defaultValue));
+ assertEquals("Missing key with default value", defaultValue, config.getEnum("stringNotInConfig", EnumFixture.class, defaultValue));
+ //
+ try {
+ config.getEnum("testBadEnum", EnumFixture.class);
+ fail("Expected " + ConversionException.class);
+ } catch (ConversionException e) {
+ // expected
+ }
+ //
+ try {
+ config.getEnum("testBadEnum", EnumFixture.class, defaultValue);
+ fail("Expected " + ConversionException.class);
+ } catch (ConversionException e) {
+ // expected
+ }
+ }
+
/**
* Tests that the first scalar of a list is returned.
*/