Add ImmutableConfiguration.containsValue(Object)
- Account for null inputs
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 6cc84f1..89746c2 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -26,7 +26,7 @@
<release version="2.11.0" date="YYYY-MM-DD" description="Minor release with new features and updated dependencies; requires Java 8 or above.">
<!-- ADD -->
<action type="add" issue="CONFIGURATION-844" dev="ggregory" due-to="Thomas Steiner, Gary Gregory">Add support for empty sections #408.</action>
- <action type="add" dev="ggregory" due-to="Rikkarth, Gary Gregory">Add ImmutableConfiguration.containsValue(String).</action>
+ <action type="add" dev="ggregory" due-to="Rikkarth, Gary Gregory">Add ImmutableConfiguration.containsValue(Object).</action>
<!-- FIX -->
<action type="fix" dev="ggregory" due-to="Gary Gregory">Fail-fast with a NullPointerException if DataConfiguration.DataConfiguration(Configuration) is called with null.</action>
<action type="fix" dev="ggregory" due-to="Gary Gregory">Fail-fast with a NullPointerException if XMLPropertiesConfiguration.XMLPropertiesConfiguration(Element) is called with null.</action>
diff --git a/src/main/java/org/apache/commons/configuration2/AbstractConfiguration.java b/src/main/java/org/apache/commons/configuration2/AbstractConfiguration.java
index ba32c59..e4911b9 100644
--- a/src/main/java/org/apache/commons/configuration2/AbstractConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/AbstractConfiguration.java
@@ -424,7 +424,7 @@
* @since 2.11.0
*/
@Override
- public final boolean containsValue(final String value) {
+ public final boolean containsValue(final Object value) {
beginRead(false);
try {
return containsValueInternal(value);
@@ -444,20 +444,23 @@
protected abstract boolean containsKeyInternal(String key);
/**
- * Tests whether this configuration contains one or more matches to this value. This operation stops at first
- * match but may be more expensive than the {@link #containsKeyInternal containsKey} method.
- * <p>The implementation of this method will be different depending on the type of Configuration used.</p>
+ * Tests whether this configuration contains one or more matches to this value. This operation stops at first match but may be more expensive than the
+ * {@link #containsKeyInternal containsKey} method.
+ * <p>
+ * The implementation of this method will be different depending on the type of Configuration used.
+ * </p>
*
- * <p>Note that this method is identical in functionality to
- * {@link #containsValue containsValue}, (which is part of the {@link ImmutableConfiguration} interface).</p>
+ * <p>
+ * Note that this method is identical in functionality to {@link #containsValue containsValue}, (which is part of the {@link ImmutableConfiguration}
+ * interface).
+ * </p>
*
- * @param value a value to search for
- * @return {@code true} if and only if some key maps to the {@code value} argument in this hashtable as determined
- * by the {@code equals} method; {@code false} otherwise.
- * @throws NullPointerException if the value is {@code null}
+ * @param value the value in question
+ * @return {@code true} if and only if some key maps to the {@code value} argument in this configuration as determined by the {@code equals} method;
+ * {@code false} otherwise.
* @since 2.11.0
*/
- protected abstract boolean containsValueInternal(String value);
+ protected abstract boolean containsValueInternal(Object value);
/**
* Helper method for obtaining a property value with a type conversion.
@@ -1555,9 +1558,9 @@
* @return true if the value is found in the properties, false otherwise
* @since 2.11.0
*/
- protected boolean contains(final Iterator<String> keys, final String value) {
+ protected boolean contains(final Iterator<String> keys, final Object value) {
while (keys.hasNext()) {
- if (value.equals(getProperty(keys.next()))) {
+ if (Objects.equals(value, getProperty(keys.next()))) {
return true;
}
}
diff --git a/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java b/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java
index 0f5edb8..8857d1c 100644
--- a/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java
@@ -461,7 +461,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(final String value) {
+ protected boolean containsValueInternal(final Object value) {
return contains(getKeys(), value);
}
diff --git a/src/main/java/org/apache/commons/configuration2/BaseConfiguration.java b/src/main/java/org/apache/commons/configuration2/BaseConfiguration.java
index f6697c3..3a65de9 100644
--- a/src/main/java/org/apache/commons/configuration2/BaseConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/BaseConfiguration.java
@@ -142,7 +142,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(String value) {
+ protected boolean containsValueInternal(Object value) {
return store.containsValue(value);
}
diff --git a/src/main/java/org/apache/commons/configuration2/CompositeConfiguration.java b/src/main/java/org/apache/commons/configuration2/CompositeConfiguration.java
index c70ba27..a2d942f 100644
--- a/src/main/java/org/apache/commons/configuration2/CompositeConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/CompositeConfiguration.java
@@ -304,7 +304,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(final String value) {
+ protected boolean containsValueInternal(final Object value) {
return configList.stream().anyMatch(config -> config.containsValue(value));
}
diff --git a/src/main/java/org/apache/commons/configuration2/DataConfiguration.java b/src/main/java/org/apache/commons/configuration2/DataConfiguration.java
index d63fc39..f07ff8d 100644
--- a/src/main/java/org/apache/commons/configuration2/DataConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/DataConfiguration.java
@@ -219,7 +219,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(final String value) {
+ protected boolean containsValueInternal(final Object value) {
return configuration.containsValue(value);
}
diff --git a/src/main/java/org/apache/commons/configuration2/DatabaseConfiguration.java b/src/main/java/org/apache/commons/configuration2/DatabaseConfiguration.java
index 6517e81..84632e1 100644
--- a/src/main/java/org/apache/commons/configuration2/DatabaseConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/DatabaseConfiguration.java
@@ -484,8 +484,8 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(final String value) {
- final AbstractJdbcOperation<Boolean> op = new AbstractJdbcOperation<Boolean>(ConfigurationErrorEvent.READ, ConfigurationErrorEvent.READ, value, null) {
+ protected boolean containsValueInternal(final Object value) {
+ final AbstractJdbcOperation<Boolean> op = new AbstractJdbcOperation<Boolean>(ConfigurationErrorEvent.READ, ConfigurationErrorEvent.READ, null, value) {
@Override
protected Boolean performOperation() throws SQLException {
try (ResultSet rs = openResultSet(String.format(SQL_GET_PROPERTY, table, valueColumn), false, value)) {
diff --git a/src/main/java/org/apache/commons/configuration2/DynamicCombinedConfiguration.java b/src/main/java/org/apache/commons/configuration2/DynamicCombinedConfiguration.java
index 5c4a6d3..15fdde3 100644
--- a/src/main/java/org/apache/commons/configuration2/DynamicCombinedConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/DynamicCombinedConfiguration.java
@@ -364,7 +364,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(String value) {
+ protected boolean containsValueInternal(Object value) {
return this.getCurrentConfig().contains(getKeys(), value);
}
diff --git a/src/main/java/org/apache/commons/configuration2/ImmutableConfiguration.java b/src/main/java/org/apache/commons/configuration2/ImmutableConfiguration.java
index 57c97ca..db80868 100644
--- a/src/main/java/org/apache/commons/configuration2/ImmutableConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/ImmutableConfiguration.java
@@ -23,6 +23,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.Objects;
import java.util.Properties;
import org.apache.commons.configuration2.convert.PropertyConverter;
@@ -70,10 +71,10 @@
* @return {@code true} if this configuration maps one or more keys to the specified value, false otherwise.
* @since 2.11.0
*/
- default boolean containsValue(final String value) {
+ default boolean containsValue(final Object value) {
final Iterator<String> keys = getKeys();
while (keys.hasNext()) {
- if (value.equals(getProperty(keys.next()))) {
+ if (Objects.equals(value, getProperty(keys.next()))) {
return true;
}
}
diff --git a/src/main/java/org/apache/commons/configuration2/JNDIConfiguration.java b/src/main/java/org/apache/commons/configuration2/JNDIConfiguration.java
index 9cc1a27..b44fc91 100644
--- a/src/main/java/org/apache/commons/configuration2/JNDIConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/JNDIConfiguration.java
@@ -153,7 +153,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(final String value) {
+ protected boolean containsValueInternal(final Object value) {
return contains(getKeys(), value);
}
diff --git a/src/main/java/org/apache/commons/configuration2/MapConfiguration.java b/src/main/java/org/apache/commons/configuration2/MapConfiguration.java
index be0df0a..09c7c86 100644
--- a/src/main/java/org/apache/commons/configuration2/MapConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/MapConfiguration.java
@@ -178,8 +178,8 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(final String value) {
- return map.containsValue(value);
+ protected boolean containsValueInternal(final Object value) {
+ return value != null && map.containsValue(value);
}
@Override
diff --git a/src/main/java/org/apache/commons/configuration2/PatternSubtreeConfigurationWrapper.java b/src/main/java/org/apache/commons/configuration2/PatternSubtreeConfigurationWrapper.java
index 94a678f..cc80de9 100644
--- a/src/main/java/org/apache/commons/configuration2/PatternSubtreeConfigurationWrapper.java
+++ b/src/main/java/org/apache/commons/configuration2/PatternSubtreeConfigurationWrapper.java
@@ -136,7 +136,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(String value) {
+ protected boolean containsValueInternal(Object value) {
return config.containsValue(value);
}
diff --git a/src/main/java/org/apache/commons/configuration2/SubsetConfiguration.java b/src/main/java/org/apache/commons/configuration2/SubsetConfiguration.java
index 1f176fb..fa0aed5 100644
--- a/src/main/java/org/apache/commons/configuration2/SubsetConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/SubsetConfiguration.java
@@ -137,7 +137,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(final String value) {
+ protected boolean containsValueInternal(final Object value) {
return parent.containsValue(value);
}
diff --git a/src/main/java/org/apache/commons/configuration2/web/BaseWebConfiguration.java b/src/main/java/org/apache/commons/configuration2/web/BaseWebConfiguration.java
index 34a0a2c..d18d08b 100644
--- a/src/main/java/org/apache/commons/configuration2/web/BaseWebConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/web/BaseWebConfiguration.java
@@ -74,7 +74,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(final String value) {
+ protected boolean containsValueInternal(final Object value) {
return contains(getKeys(), value);
}
diff --git a/src/test/java/org/apache/commons/configuration2/NonCloneableConfiguration.java b/src/test/java/org/apache/commons/configuration2/NonCloneableConfiguration.java
index 552c3e5..aa5759f 100644
--- a/src/test/java/org/apache/commons/configuration2/NonCloneableConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/NonCloneableConfiguration.java
@@ -51,7 +51,7 @@
* @since 2.11.0
*/
@Override
- protected boolean containsValueInternal(String value) {
+ protected boolean containsValueInternal(Object value) {
return false;
}
diff --git a/src/test/java/org/apache/commons/configuration2/TestAbstractConfiguration.java b/src/test/java/org/apache/commons/configuration2/TestAbstractConfiguration.java
index 12f6886..773afa5 100644
--- a/src/test/java/org/apache/commons/configuration2/TestAbstractConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/TestAbstractConfiguration.java
@@ -81,6 +81,8 @@
@Test
public void testContainsValue() {
final Configuration config = getConfiguration();
+ assertFalse(config.containsValue(null));
+ assertFalse(config.containsValue(""));
assertTrue(config.containsValue("value1"));
assertFalse(config.containsValue("value99999"));
}
@@ -103,8 +105,8 @@
public void givenNullValueTestContains() {
AbstractConfiguration config = getConfiguration();
Iterator<String> keys = config.getKeys();
-
- assertThrows(NullPointerException.class, () -> config.contains(keys, null));
+ assertFalse(config.contains(keys, null));
+ assertFalse(config.contains(keys, ""));
}
@Test
diff --git a/src/test/java/org/apache/commons/configuration2/TestAbstractConfigurationBasicFeatures.java b/src/test/java/org/apache/commons/configuration2/TestAbstractConfigurationBasicFeatures.java
index d61f67d..0acce27 100644
--- a/src/test/java/org/apache/commons/configuration2/TestAbstractConfigurationBasicFeatures.java
+++ b/src/test/java/org/apache/commons/configuration2/TestAbstractConfigurationBasicFeatures.java
@@ -94,7 +94,7 @@
}
@Override
- protected boolean containsValueInternal(String value) {
+ protected boolean containsValueInternal(Object value) {
return config.containsValue(value);
}
diff --git a/src/test/java/org/apache/commons/configuration2/TestAbstractHierarchicalConfiguration.java b/src/test/java/org/apache/commons/configuration2/TestAbstractHierarchicalConfiguration.java
index 2eee1a2..bc2c7bd 100644
--- a/src/test/java/org/apache/commons/configuration2/TestAbstractHierarchicalConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/TestAbstractHierarchicalConfiguration.java
@@ -944,6 +944,7 @@
@Test
public void testContainsValue() {
- assertThrows(NullPointerException.class, () -> config.containsValue(null));
+ assertFalse(config.containsValue(null));
+ assertFalse(config.containsValue(""));
}
}
diff --git a/src/test/java/org/apache/commons/configuration2/TestDataConfiguration.java b/src/test/java/org/apache/commons/configuration2/TestDataConfiguration.java
index aff406b..b858789 100644
--- a/src/test/java/org/apache/commons/configuration2/TestDataConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/TestDataConfiguration.java
@@ -1970,5 +1970,6 @@
public void testContainsValue() {
final Configuration config = conf.getConfiguration();
assertFalse(config.containsValue(null));
+ assertTrue(config.containsValue(""));
}
}
diff --git a/src/test/java/org/apache/commons/configuration2/TestDefaultImmutableConfiguration.java b/src/test/java/org/apache/commons/configuration2/TestDefaultImmutableConfiguration.java
index 598b6f9..9b880d0 100644
--- a/src/test/java/org/apache/commons/configuration2/TestDefaultImmutableConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/TestDefaultImmutableConfiguration.java
@@ -18,6 +18,7 @@
package org.apache.commons.configuration2;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -365,6 +366,8 @@
@Test
public void testContainsValueDefaultImplementation() {
config.map.put("test", "213123");
+ assertFalse(config.containsValue(""));
+ assertFalse(config.containsValue(null));
assertTrue(config.containsValue("213123"));
}
diff --git a/src/test/java/org/apache/commons/configuration2/TestMapConfiguration.java b/src/test/java/org/apache/commons/configuration2/TestMapConfiguration.java
index 39675c5..d6f8120 100644
--- a/src/test/java/org/apache/commons/configuration2/TestMapConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/TestMapConfiguration.java
@@ -165,6 +165,7 @@
@Test
public void testContainsValue() {
- assertFalse(getConfiguration().containsValue(null), "should return false");
+ assertFalse(getConfiguration().containsValue(null));
+ assertFalse(getConfiguration().containsValue(""));
}
}
diff --git a/src/test/java/org/apache/commons/configuration2/TestPropertiesConfiguration.java b/src/test/java/org/apache/commons/configuration2/TestPropertiesConfiguration.java
index 56300ef..6a223b1 100644
--- a/src/test/java/org/apache/commons/configuration2/TestPropertiesConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/TestPropertiesConfiguration.java
@@ -1222,6 +1222,8 @@
assertTrue(config.containsValue("jndivalue2"));
assertFalse(config.containsValue("notFound"));
+ assertFalse(config.containsValue(null));
+ assertFalse(config.containsValue(""));
}
/**
diff --git a/src/test/java/org/apache/commons/configuration2/web/TestAppletConfiguration.java b/src/test/java/org/apache/commons/configuration2/web/TestAppletConfiguration.java
index b564bba..8f3c08c 100644
--- a/src/test/java/org/apache/commons/configuration2/web/TestAppletConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/web/TestAppletConfiguration.java
@@ -17,6 +17,7 @@
package org.apache.commons.configuration2.web;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.applet.Applet;
@@ -24,7 +25,6 @@
import org.apache.commons.configuration2.AbstractConfiguration;
import org.apache.commons.configuration2.BaseConfiguration;
-import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.MapConfiguration;
import org.apache.commons.configuration2.TestAbstractConfiguration;
import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
@@ -117,7 +117,7 @@
@Test
public void testContainsValue() {
- final Configuration config = getConfiguration();
- assertThrows(NullPointerException.class, () -> config.containsValue(null));
+ assertFalse(getConfiguration().containsValue(null));
+ assertFalse(getConfiguration().containsValue(""));
}
}
diff --git a/src/test/java/org/apache/commons/configuration2/web/TestServletConfiguration.java b/src/test/java/org/apache/commons/configuration2/web/TestServletConfiguration.java
index d333eab..08d2ef4 100644
--- a/src/test/java/org/apache/commons/configuration2/web/TestServletConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/web/TestServletConfiguration.java
@@ -17,6 +17,7 @@
package org.apache.commons.configuration2.web;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -28,7 +29,6 @@
import javax.servlet.http.HttpServlet;
import org.apache.commons.configuration2.AbstractConfiguration;
-import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.TestAbstractConfiguration;
import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
import org.junit.jupiter.api.Test;
@@ -101,7 +101,7 @@
@Test
public void testContainsValue() {
- final Configuration config = getConfiguration();
- assertThrows(NullPointerException.class, () -> config.containsValue(null));
+ assertFalse(getConfiguration().containsValue(null));
+ assertFalse(getConfiguration().containsValue(""));
}
}
diff --git a/src/test/java/org/apache/commons/configuration2/web/TestServletContextConfiguration.java b/src/test/java/org/apache/commons/configuration2/web/TestServletContextConfiguration.java
index 8cd6d4f..7726472 100644
--- a/src/test/java/org/apache/commons/configuration2/web/TestServletContextConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/web/TestServletContextConfiguration.java
@@ -17,6 +17,7 @@
package org.apache.commons.configuration2.web;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -29,7 +30,6 @@
import javax.servlet.http.HttpServlet;
import org.apache.commons.configuration2.AbstractConfiguration;
-import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.TestAbstractConfiguration;
import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
import org.junit.jupiter.api.Test;
@@ -111,7 +111,7 @@
@Test
public void testContainsValue() {
- final Configuration config = getConfiguration();
- assertThrows(NullPointerException.class, () -> config.containsValue(null));
+ assertFalse(getConfiguration().containsValue(null));
+ assertFalse(getConfiguration().containsValue(""));
}
}
diff --git a/src/test/java/org/apache/commons/configuration2/web/TestServletFilterConfiguration.java b/src/test/java/org/apache/commons/configuration2/web/TestServletFilterConfiguration.java
index a48a65f..0b6dd8d 100644
--- a/src/test/java/org/apache/commons/configuration2/web/TestServletFilterConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/web/TestServletFilterConfiguration.java
@@ -17,6 +17,7 @@
package org.apache.commons.configuration2.web;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.Enumeration;
@@ -26,7 +27,6 @@
import javax.servlet.ServletContext;
import org.apache.commons.configuration2.AbstractConfiguration;
-import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.TestAbstractConfiguration;
import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
import org.junit.jupiter.api.Test;
@@ -95,7 +95,7 @@
@Test
public void testContainsValue() {
- final Configuration config = getConfiguration();
- assertThrows(NullPointerException.class, () -> config.containsValue(null));
+ assertFalse(getConfiguration().containsValue(null));
+ assertFalse(getConfiguration().containsValue(""));
}
}
diff --git a/src/test/java/org/apache/commons/configuration2/web/TestServletRequestConfiguration.java b/src/test/java/org/apache/commons/configuration2/web/TestServletRequestConfiguration.java
index dad94ef..e32a947 100644
--- a/src/test/java/org/apache/commons/configuration2/web/TestServletRequestConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/web/TestServletRequestConfiguration.java
@@ -18,6 +18,7 @@
package org.apache.commons.configuration2.web;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -118,7 +119,7 @@
@Test
public void testContainsValue() {
- final Configuration config = getConfiguration();
- assertThrows(NullPointerException.class, () -> config.containsValue(null));
+ assertFalse(getConfiguration().containsValue(null));
+ assertFalse(getConfiguration().containsValue(""));
}
}