[BEANUTILS-527] Convert from Collections4 to java.util.function #8.
Implement java.util.function.Consumer<T> instead of
org.apache.commons.collections4.Closure:
org.apache.commons.beanutils2.BeanPropertyValueChangeClosure renamed to
BeanPropertyValueChangeConsumer.
diff --git a/src/main/java/org/apache/commons/beanutils2/BeanPropertyValueChangeClosure.java b/src/main/java/org/apache/commons/beanutils2/BeanPropertyValueChangeConsumer.java
similarity index 93%
rename from src/main/java/org/apache/commons/beanutils2/BeanPropertyValueChangeClosure.java
rename to src/main/java/org/apache/commons/beanutils2/BeanPropertyValueChangeConsumer.java
index 2801af4..fc44b53 100644
--- a/src/main/java/org/apache/commons/beanutils2/BeanPropertyValueChangeClosure.java
+++ b/src/main/java/org/apache/commons/beanutils2/BeanPropertyValueChangeConsumer.java
@@ -1,237 +1,240 @@
-/*
- * 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.beanutils2;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.apache.commons.collections4.Closure;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-
-/**
- * <p><code>Closure</code> that sets a property.</p>
- * <p>
- * An implementation of <code>org.apache.commons.collections4.Closure</code> that updates
- * a specified property on the object provided with a specified value.
- * The <code>BeanPropertyValueChangeClosure</code> constructor takes two parameters which determine
- * what property will be updated and with what value.
- * <dl>
- * <dt>
- * <code>public BeanPropertyValueChangeClosure( String propertyName, Object propertyValue )</code>
- * </dt>
- * <dd>
- * Will create a <code>Closure</code> that will update an object by setting the property
- * specified by <code>propertyName</code> to the value specified by <code>propertyValue</code>.
- * </dd>
- * </dl>
- *
- * <p>
- * <strong>Note:</strong> Property names can be a simple, nested, indexed, or mapped property as defined by
- * <code>org.apache.commons.beanutils2.PropertyUtils</code>. If any object in the property path
- * specified by <code>propertyName</code> is <code>null</code> then the outcome is based on the
- * value of the <code>ignoreNull</code> attribute.
- * </p>
- * <p>
- * A typical usage might look like:
- * </p>
- * <pre><code>
- * // create the closure
- * BeanPropertyValueChangeClosure closure =
- * new BeanPropertyValueChangeClosure( "activeEmployee", Boolean.TRUE );
- *
- * // update the Collection
- * CollectionUtils.forAllDo( peopleCollection, closure );
- * </code></pre>
- *
- * This would take a <code>Collection</code> of person objects and update the
- * <code>activeEmployee</code> property of each object in the <code>Collection</code> to
- * <code>true</code>. Assuming...
- * <ul>
- * <li>
- * The top level object in the <code>peopleCollection</code> is an object which represents a
- * person.
- * </li>
- * <li>
- * The person object has a <code>setActiveEmployee( boolean )</code> method which updates
- * the value for the object's <code>activeEmployee</code> property.
- * </li>
- * </ul>
- *
- * @see org.apache.commons.beanutils2.PropertyUtils
- * @see org.apache.commons.collections4.Closure
- */
-public class BeanPropertyValueChangeClosure implements Closure {
-
- /** For logging. */
- private final Log log = LogFactory.getLog(this.getClass());
-
- /**
- * The name of the property which will be updated when this <code>Closure</code> executes.
- */
- private String propertyName;
-
- /**
- * The value that the property specified by <code>propertyName</code>
- * will be updated to when this <code>Closure</code> executes.
- */
- private Object propertyValue;
-
- /**
- * Determines whether <code>null</code> objects in the property path will genenerate an
- * <code>IllegalArgumentException</code> or not. If set to <code>true</code> then if any objects
- * in the property path leading up to the target property evaluate to <code>null</code> then the
- * <code>IllegalArgumentException</code> throw by <code>PropertyUtils</code> will be logged but
- * not rethrown. If set to <code>false</code> then if any objects in the property path leading
- * up to the target property evaluate to <code>null</code> then the
- * <code>IllegalArgumentException</code> throw by <code>PropertyUtils</code> will be logged and
- * rethrown.
- */
- private boolean ignoreNull;
-
- /**
- * Constructor which takes the name of the property to be changed, the new value to set
- * the property to, and assumes <code>ignoreNull</code> to be <code>false</code>.
- *
- * @param propertyName The name of the property that will be updated with the value specified by
- * <code>propertyValue</code>.
- * @param propertyValue The value that <code>propertyName</code> will be set to on the target
- * object.
- * @throws IllegalArgumentException If the propertyName provided is null or empty.
- */
- public BeanPropertyValueChangeClosure(final String propertyName, final Object propertyValue) {
- this(propertyName, propertyValue, false);
- }
-
- /**
- * Constructor which takes the name of the property to be changed, the new value to set
- * the property to and a boolean which determines whether <code>null</code> objects in the
- * property path will genenerate an <code>IllegalArgumentException</code> or not.
- *
- * @param propertyName The name of the property that will be updated with the value specified by
- * <code>propertyValue</code>.
- * @param propertyValue The value that <code>propertyName</code> will be set to on the target
- * object.
- * @param ignoreNull Determines whether <code>null</code> objects in the property path will
- * genenerate an <code>IllegalArgumentException</code> or not.
- * @throws IllegalArgumentException If the propertyName provided is null or empty.
- */
- public BeanPropertyValueChangeClosure(final String propertyName, final Object propertyValue, final boolean ignoreNull) {
- super();
-
- if (propertyName != null && propertyName.length() > 0) {
- this.propertyName = propertyName;
- this.propertyValue = propertyValue;
- this.ignoreNull = ignoreNull;
- } else {
- throw new IllegalArgumentException("propertyName cannot be null or empty");
- }
- }
-
- /**
- * Updates the target object provided using the property update criteria provided when this
- * <code>BeanPropertyValueChangeClosure</code> was constructed. If any object in the property
- * path leading up to the target property is <code>null</code> then the outcome will be based on
- * the value of the <code>ignoreNull</code> attribute. By default, <code>ignoreNull</code> is
- * <code>false</code> and would result in an <code>IllegalArgumentException</code> if an object
- * in the property path leading up to the target property is <code>null</code>.
- *
- * @param object The object to be updated.
- * @throws IllegalArgumentException If an IllegalAccessException, InvocationTargetException, or
- * NoSuchMethodException is thrown when trying to access the property specified on the object
- * provided. Or if an object in the property path provided is <code>null</code> and
- * <code>ignoreNull</code> is set to <code>false</code>.
- */
- @Override
- public void execute(final Object object) {
-
- try {
- PropertyUtils.setProperty(object, propertyName, propertyValue);
- } catch (final IllegalArgumentException e) {
- final String errorMsg = "Unable to execute Closure. Null value encountered in property path...";
-
- if (ignoreNull) {
- log.warn("WARNING: " + errorMsg + e);
- } else {
- final IllegalArgumentException iae = new IllegalArgumentException(errorMsg);
- if (!BeanUtils.initCause(iae, e)) {
- log.error(errorMsg, e);
- }
- throw iae;
- }
- } catch (final IllegalAccessException e) {
- final String errorMsg = "Unable to access the property provided.";
- final IllegalArgumentException iae = new IllegalArgumentException(errorMsg);
- if (!BeanUtils.initCause(iae, e)) {
- log.error(errorMsg, e);
- }
- throw iae;
- } catch (final InvocationTargetException e) {
- final String errorMsg = "Exception occurred in property's getter";
- final IllegalArgumentException iae = new IllegalArgumentException(errorMsg);
- if (!BeanUtils.initCause(iae, e)) {
- log.error(errorMsg, e);
- }
- throw iae;
- } catch (final NoSuchMethodException e) {
- final String errorMsg = "Property not found";
- final IllegalArgumentException iae = new IllegalArgumentException(errorMsg);
- if (!BeanUtils.initCause(iae, e)) {
- log.error(errorMsg, e);
- }
- throw iae;
- }
- }
-
- /**
- * Returns the name of the property which will be updated when this <code>Closure</code> executes.
- *
- * @return The name of the property which will be updated when this <code>Closure</code> executes.
- */
- public String getPropertyName() {
- return propertyName;
- }
-
- /**
- * Returns the value that the property specified by <code>propertyName</code>
- * will be updated to when this <code>Closure</code> executes.
- *
- * @return The value that the property specified by <code>propertyName</code>
- * will be updated to when this <code>Closure</code> executes.
- */
- public Object getPropertyValue() {
- return propertyValue;
- }
-
- /**
- * Returns the flag that determines whether <code>null</code> objects in the property path will
- * genenerate an <code>IllegalArgumentException</code> or not. If set to <code>true</code> then
- * if any objects in the property path leading up to the target property evaluate to
- * <code>null</code> then the <code>IllegalArgumentException</code> throw by
- * <code>PropertyUtils</code> will be logged but not rethrown. If set to <code>false</code> then
- * if any objects in the property path leading up to the target property evaluate to
- * <code>null</code> then the <code>IllegalArgumentException</code> throw by
- * <code>PropertyUtils</code> will be logged and rethrown.
- *
- * @return The flag that determines whether <code>null</code> objects in the property path will
- * genenerate an <code>IllegalArgumentException</code> or not.
- */
- public boolean isIgnoreNull() {
- return ignoreNull;
- }
-}
+/*
+ * 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.beanutils2;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.function.Consumer;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+/**
+ * <p><code>Closure</code> that sets a property.</p>
+ * <p>
+ * An implementation of <code>java.util.function.Consumer</code> that updates
+ * a specified property on the object provided with a specified value.
+ * The <code>BeanPropertyValueChangeClosure</code> constructor takes two parameters which determine
+ * what property will be updated and with what value.
+ * <dl>
+ * <dt>
+ * <code>public BeanPropertyValueChangeClosure( String propertyName, Object propertyValue )</code>
+ * </dt>
+ * <dd>
+ * Will create a <code>Closure</code> that will update an object by setting the property
+ * specified by <code>propertyName</code> to the value specified by <code>propertyValue</code>.
+ * </dd>
+ * </dl>
+ *
+ * <p>
+ * <strong>Note:</strong> Property names can be a simple, nested, indexed, or mapped property as defined by
+ * <code>org.apache.commons.beanutils2.PropertyUtils</code>. If any object in the property path
+ * specified by <code>propertyName</code> is <code>null</code> then the outcome is based on the
+ * value of the <code>ignoreNull</code> attribute.
+ * </p>
+ * <p>
+ * A typical usage might look like:
+ * </p>
+ * <pre><code>
+ * // create the closure
+ * BeanPropertyValueChangeClosure closure =
+ * new BeanPropertyValueChangeClosure( "activeEmployee", Boolean.TRUE );
+ *
+ * // update the Collection
+ * CollectionUtils.forAllDo( peopleCollection, closure );
+ * </code></pre>
+ *
+ * This would take a <code>Collection</code> of person objects and update the
+ * <code>activeEmployee</code> property of each object in the <code>Collection</code> to
+ * <code>true</code>. Assuming...
+ * <ul>
+ * <li>
+ * The top level object in the <code>peopleCollection</code> is an object which represents a
+ * person.
+ * </li>
+ * <li>
+ * The person object has a <code>setActiveEmployee( boolean )</code> method which updates
+ * the value for the object's <code>activeEmployee</code> property.
+ * </li>
+ * </ul>
+ *
+ * @param <T> The type of the input to the operation
+ * @param <V> The property value type.
+ *
+ * @see org.apache.commons.beanutils2.PropertyUtils
+ * @see java.util.function.Consumer
+ */
+public class BeanPropertyValueChangeConsumer<T, V> implements Consumer<T> {
+
+ /** For logging. */
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ /**
+ * The name of the property which will be updated when this <code>Closure</code> executes.
+ */
+ private String propertyName;
+
+ /**
+ * The value that the property specified by <code>propertyName</code>
+ * will be updated to when this <code>Closure</code> executes.
+ */
+ private V propertyValue;
+
+ /**
+ * Determines whether <code>null</code> objects in the property path will genenerate an
+ * <code>IllegalArgumentException</code> or not. If set to <code>true</code> then if any objects
+ * in the property path leading up to the target property evaluate to <code>null</code> then the
+ * <code>IllegalArgumentException</code> throw by <code>PropertyUtils</code> will be logged but
+ * not rethrown. If set to <code>false</code> then if any objects in the property path leading
+ * up to the target property evaluate to <code>null</code> then the
+ * <code>IllegalArgumentException</code> throw by <code>PropertyUtils</code> will be logged and
+ * rethrown.
+ */
+ private boolean ignoreNull;
+
+ /**
+ * Constructor which takes the name of the property to be changed, the new value to set
+ * the property to, and assumes <code>ignoreNull</code> to be <code>false</code>.
+ *
+ * @param propertyName The name of the property that will be updated with the value specified by
+ * <code>propertyValue</code>.
+ * @param propertyValue The value that <code>propertyName</code> will be set to on the target
+ * object.
+ * @throws IllegalArgumentException If the propertyName provided is null or empty.
+ */
+ public BeanPropertyValueChangeConsumer(final String propertyName, final V propertyValue) {
+ this(propertyName, propertyValue, false);
+ }
+
+ /**
+ * Constructor which takes the name of the property to be changed, the new value to set
+ * the property to and a boolean which determines whether <code>null</code> objects in the
+ * property path will genenerate an <code>IllegalArgumentException</code> or not.
+ *
+ * @param propertyName The name of the property that will be updated with the value specified by
+ * <code>propertyValue</code>.
+ * @param propertyValue The value that <code>propertyName</code> will be set to on the target
+ * object.
+ * @param ignoreNull Determines whether <code>null</code> objects in the property path will
+ * genenerate an <code>IllegalArgumentException</code> or not.
+ * @throws IllegalArgumentException If the propertyName provided is null or empty.
+ */
+ public BeanPropertyValueChangeConsumer(final String propertyName, final V propertyValue, final boolean ignoreNull) {
+ super();
+
+ if (propertyName != null && propertyName.length() > 0) {
+ this.propertyName = propertyName;
+ this.propertyValue = propertyValue;
+ this.ignoreNull = ignoreNull;
+ } else {
+ throw new IllegalArgumentException("propertyName cannot be null or empty");
+ }
+ }
+
+ /**
+ * Updates the target object provided using the property update criteria provided when this
+ * <code>BeanPropertyValueChangeClosure</code> was constructed. If any object in the property
+ * path leading up to the target property is <code>null</code> then the outcome will be based on
+ * the value of the <code>ignoreNull</code> attribute. By default, <code>ignoreNull</code> is
+ * <code>false</code> and would result in an <code>IllegalArgumentException</code> if an object
+ * in the property path leading up to the target property is <code>null</code>.
+ *
+ * @param object The object to be updated.
+ * @throws IllegalArgumentException If an IllegalAccessException, InvocationTargetException, or
+ * NoSuchMethodException is thrown when trying to access the property specified on the object
+ * provided. Or if an object in the property path provided is <code>null</code> and
+ * <code>ignoreNull</code> is set to <code>false</code>.
+ */
+ @Override
+ public void accept(final Object object) {
+
+ try {
+ PropertyUtils.setProperty(object, propertyName, propertyValue);
+ } catch (final IllegalArgumentException e) {
+ final String errorMsg = "Unable to execute Closure. Null value encountered in property path...";
+
+ if (ignoreNull) {
+ log.warn("WARNING: " + errorMsg + e);
+ } else {
+ final IllegalArgumentException iae = new IllegalArgumentException(errorMsg);
+ if (!BeanUtils.initCause(iae, e)) {
+ log.error(errorMsg, e);
+ }
+ throw iae;
+ }
+ } catch (final IllegalAccessException e) {
+ final String errorMsg = "Unable to access the property provided.";
+ final IllegalArgumentException iae = new IllegalArgumentException(errorMsg);
+ if (!BeanUtils.initCause(iae, e)) {
+ log.error(errorMsg, e);
+ }
+ throw iae;
+ } catch (final InvocationTargetException e) {
+ final String errorMsg = "Exception occurred in property's getter";
+ final IllegalArgumentException iae = new IllegalArgumentException(errorMsg);
+ if (!BeanUtils.initCause(iae, e)) {
+ log.error(errorMsg, e);
+ }
+ throw iae;
+ } catch (final NoSuchMethodException e) {
+ final String errorMsg = "Property not found";
+ final IllegalArgumentException iae = new IllegalArgumentException(errorMsg);
+ if (!BeanUtils.initCause(iae, e)) {
+ log.error(errorMsg, e);
+ }
+ throw iae;
+ }
+ }
+
+ /**
+ * Returns the name of the property which will be updated when this <code>Closure</code> executes.
+ *
+ * @return The name of the property which will be updated when this <code>Closure</code> executes.
+ */
+ public String getPropertyName() {
+ return propertyName;
+ }
+
+ /**
+ * Returns the value that the property specified by <code>propertyName</code>
+ * will be updated to when this <code>Closure</code> executes.
+ *
+ * @return The value that the property specified by <code>propertyName</code>
+ * will be updated to when this <code>Closure</code> executes.
+ */
+ public V getPropertyValue() {
+ return propertyValue;
+ }
+
+ /**
+ * Returns the flag that determines whether <code>null</code> objects in the property path will
+ * genenerate an <code>IllegalArgumentException</code> or not. If set to <code>true</code> then
+ * if any objects in the property path leading up to the target property evaluate to
+ * <code>null</code> then the <code>IllegalArgumentException</code> throw by
+ * <code>PropertyUtils</code> will be logged but not rethrown. If set to <code>false</code> then
+ * if any objects in the property path leading up to the target property evaluate to
+ * <code>null</code> then the <code>IllegalArgumentException</code> throw by
+ * <code>PropertyUtils</code> will be logged and rethrown.
+ *
+ * @return The flag that determines whether <code>null</code> objects in the property path will
+ * genenerate an <code>IllegalArgumentException</code> or not.
+ */
+ public boolean isIgnoreNull() {
+ return ignoreNull;
+ }
+}
diff --git a/src/main/java/org/apache/commons/beanutils2/BeanPropertyValueEqualsPredicate.java b/src/main/java/org/apache/commons/beanutils2/BeanPropertyValueEqualsPredicate.java
index bd859d2..31b84e7 100644
--- a/src/main/java/org/apache/commons/beanutils2/BeanPropertyValueEqualsPredicate.java
+++ b/src/main/java/org/apache/commons/beanutils2/BeanPropertyValueEqualsPredicate.java
@@ -102,7 +102,8 @@
* the value for the object's <code>personId</code> property.
* </li>
* </ul>
- * @param <T> the type of the input to the predicate.
+ *
+ * @param <T> The type of the input to the predicate.
* @param <V> The property value type.
*
* @see org.apache.commons.beanutils2.PropertyUtils
diff --git a/src/test/java/org/apache/commons/beanutils2/BeanPropertyValueChangeClosureTestCase.java b/src/test/java/org/apache/commons/beanutils2/BeanPropertyValueChangeConsumerTestCase.java
similarity index 75%
rename from src/test/java/org/apache/commons/beanutils2/BeanPropertyValueChangeClosureTestCase.java
rename to src/test/java/org/apache/commons/beanutils2/BeanPropertyValueChangeConsumerTestCase.java
index cf77d7e..befef64 100644
--- a/src/test/java/org/apache/commons/beanutils2/BeanPropertyValueChangeClosureTestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/BeanPropertyValueChangeConsumerTestCase.java
@@ -1,321 +1,321 @@
-/*
- * 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.beanutils2;
-
-import junit.framework.TestCase;
-
-
-/**
- * Test cases for <code>BeanPropertyValueChangeClosure</code>.
- *
- */
-public class BeanPropertyValueChangeClosureTestCase extends TestCase {
-
- private static final Integer expectedIntegerValue = new Integer(123);
- private static final Float expectedFloatValue = new Float(123.123f);
- private static final Double expectedDoubleValue = new Double(567879.12344d);
- private static final Boolean expectedBooleanValue = Boolean.TRUE;
- private static final Byte expectedByteValue = new Byte("12");
-
- /**
- * Constructor for BeanPropertyValueChangeClosureTest.
- *
- * @param name Name of this test case.
- */
- public BeanPropertyValueChangeClosureTestCase(final String name) {
- super(name);
- }
-
- /**
- * Test execute with simple float property and Float value.
- */
- public void testExecuteWithSimpleFloatPropertyAndFloatValue() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("floatProperty", expectedFloatValue).execute(testBean);
- assertTrue(expectedFloatValue.floatValue() == testBean.getFloatProperty());
- }
-
- /**
- * Test execute with simple float property and String value.
- */
- public void testExecuteWithSimpleFloatPropertyAndStringValue() {
- try {
- new BeanPropertyValueChangeClosure("floatProperty", "123").execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with simple float property and Double value.
- */
- public void testExecuteWithSimpleFloatPropertyAndDoubleValue() {
- try {
- new BeanPropertyValueChangeClosure("floatProperty", expectedDoubleValue).execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with simple float property and Integer value.
- */
- public void testExecuteWithSimpleFloatPropertyAndIntegerValue() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("floatProperty", expectedIntegerValue).execute(testBean);
- assertTrue(expectedIntegerValue.floatValue() == testBean.getFloatProperty());
- }
-
- /**
- * Test execute with simple double property and Double value.
- */
- public void testExecuteWithSimpleDoublePropertyAndDoubleValue() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("doubleProperty", expectedDoubleValue).execute(testBean);
- assertTrue(expectedDoubleValue.doubleValue() == testBean.getDoubleProperty());
- }
-
- /**
- * Test execute with simple double property and String value.
- */
- public void testExecuteWithSimpleDoublePropertyAndStringValue() {
- try {
- new BeanPropertyValueChangeClosure("doubleProperty", "123").execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with simple double property and Float value.
- */
- public void testExecuteWithSimpleDoublePropertyAndFloatValue() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("doubleProperty", expectedFloatValue).execute(testBean);
- assertTrue(expectedFloatValue.doubleValue() == testBean.getDoubleProperty());
- }
-
- /**
- * Test execute with simple double property and Integer value.
- */
- public void testExecuteWithSimpleDoublePropertyAndIntegerValue() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("doubleProperty", expectedIntegerValue).execute(testBean);
- assertTrue(expectedIntegerValue.doubleValue() == testBean.getDoubleProperty());
- }
-
- /**
- * Test execute with simple int property and Double value.
- */
- public void testExecuteWithSimpleIntPropertyAndDoubleValue() {
- try {
- new BeanPropertyValueChangeClosure("intProperty", expectedDoubleValue).execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with simple int property and String value.
- */
- public void testExecuteWithSimpleIntPropertyAndStringValue() {
- try {
- new BeanPropertyValueChangeClosure("intProperty", "123").execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with simple int property and Float value.
- */
- public void testExecuteWithSimpleIntPropertyAndFloatValue() {
- try {
- new BeanPropertyValueChangeClosure("intProperty", expectedFloatValue).execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with simple int property and Integer value.
- */
- public void testExecuteWithSimpleIntPropertyAndIntegerValue() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("intProperty", expectedIntegerValue).execute(testBean);
- assertTrue(expectedIntegerValue.intValue() == testBean.getIntProperty());
- }
-
- /**
- * Test execute with simple boolean property and Boolean value.
- */
- public void testExecuteWithSimpleBooleanPropertyAndBooleanValue() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("booleanProperty", expectedBooleanValue).execute(testBean);
- assertTrue(expectedBooleanValue.booleanValue() == testBean.getBooleanProperty());
- }
-
- /**
- * Test execute with simple boolean property and String value.
- */
- public void testExecuteWithSimpleBooleanPropertyAndStringValue() {
- try {
- new BeanPropertyValueChangeClosure("booleanProperty", "true").execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with simple byte property and Byte value.
- */
- public void testExecuteWithSimpleBytePropertyAndByteValue() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("byteProperty", expectedByteValue).execute(testBean);
- assertTrue(expectedByteValue.byteValue() == testBean.getByteProperty());
- }
-
- /**
- * Test execute with simple boolean property and String value.
- */
- public void testExecuteWithSimpleBytePropertyAndStringValue() {
- try {
- new BeanPropertyValueChangeClosure("byteProperty", "foo").execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with simple primitive property and null value.
- */
- public void testExecuteWithSimplePrimitivePropertyAndNullValue() {
- try {
- new BeanPropertyValueChangeClosure("intProperty", null).execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with read only property.
- */
- public void testExecuteWithReadOnlyProperty() {
- try {
- new BeanPropertyValueChangeClosure("readOnlyProperty", "foo").execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with write only property.
- */
- public void testExecuteWithWriteOnlyProperty() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("writeOnlyProperty", "foo").execute(testBean);
- assertEquals("foo", testBean.getWriteOnlyPropertyValue());
- }
-
- /**
- * Test execute with a nested property.
- */
- public void testExecuteWithNestedProperty() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("nested.stringProperty", "bar").execute(testBean);
- assertEquals("bar", testBean.getNested().getStringProperty());
- }
-
- /**
- * Test execute with a nested property and null in the property path.
- */
- public void testExecuteWithNullInPropertyPath() {
- try {
- new BeanPropertyValueChangeClosure("anotherNested.stringProperty", "foo").execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-
- /**
- * Test execute with a nested property and null in the property path and ignoreNull = true.
- */
- public void testExecuteWithNullInPropertyPathAngIgnoreTrue() {
- final TestBean testBean = new TestBean();
-
- // create a closure that will attempt to set a property on the null bean in the path
- final BeanPropertyValueChangeClosure closure = new BeanPropertyValueChangeClosure("anotherNested.stringProperty",
- "Should ignore exception", true);
-
- try {
- closure.execute(testBean);
- } catch (final IllegalArgumentException e) {
- fail("Should have ignored the exception.");
- }
- }
-
- /**
- * Test execute with indexed property.
- */
- public void testExecuteWithIndexedProperty() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("intIndexed[0]", expectedIntegerValue).execute(testBean);
- assertTrue(expectedIntegerValue.intValue() == testBean.getIntIndexed(0));
- }
-
- /**
- * Test execute with mapped property.
- */
- public void testExecuteWithMappedProperty() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("mappedProperty(fred)", "barney").execute(testBean);
- assertEquals("barney", testBean.getMappedProperty("fred"));
- }
-
- /**
- * Test execute with a simple String property.
- */
- public void testExecuteWithSimpleStringProperty() {
- final TestBean testBean = new TestBean();
- new BeanPropertyValueChangeClosure("stringProperty", "barney").execute(testBean);
- assertEquals("barney", testBean.getStringProperty());
- }
-
- /**
- * Test execute with an invalid property name.
- */
- public void testExecuteWithInvalidPropertyName() {
- try {
- new BeanPropertyValueChangeClosure("bogusProperty", "foo").execute(new TestBean());
- fail("Should have thrown an IllegalArgumentException");
- } catch (final IllegalArgumentException e) {
- /* this is what we expect */
- }
- }
-}
+/*
+ * 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.beanutils2;
+
+import junit.framework.TestCase;
+
+
+/**
+ * Test cases for <code>BeanPropertyValueChangeClosure</code>.
+ *
+ */
+public class BeanPropertyValueChangeConsumerTestCase extends TestCase {
+
+ private static final Integer expectedIntegerValue = new Integer(123);
+ private static final Float expectedFloatValue = new Float(123.123f);
+ private static final Double expectedDoubleValue = new Double(567879.12344d);
+ private static final Boolean expectedBooleanValue = Boolean.TRUE;
+ private static final Byte expectedByteValue = new Byte("12");
+
+ /**
+ * Constructor for BeanPropertyValueChangeClosureTest.
+ *
+ * @param name Name of this test case.
+ */
+ public BeanPropertyValueChangeConsumerTestCase(final String name) {
+ super(name);
+ }
+
+ /**
+ * Test execute with simple float property and Float value.
+ */
+ public void testExecuteWithSimpleFloatPropertyAndFloatValue() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("floatProperty", expectedFloatValue).accept(testBean);
+ assertTrue(expectedFloatValue.floatValue() == testBean.getFloatProperty());
+ }
+
+ /**
+ * Test execute with simple float property and String value.
+ */
+ public void testExecuteWithSimpleFloatPropertyAndStringValue() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("floatProperty", "123").accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with simple float property and Double value.
+ */
+ public void testExecuteWithSimpleFloatPropertyAndDoubleValue() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("floatProperty", expectedDoubleValue).accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with simple float property and Integer value.
+ */
+ public void testExecuteWithSimpleFloatPropertyAndIntegerValue() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("floatProperty", expectedIntegerValue).accept(testBean);
+ assertTrue(expectedIntegerValue.floatValue() == testBean.getFloatProperty());
+ }
+
+ /**
+ * Test execute with simple double property and Double value.
+ */
+ public void testExecuteWithSimpleDoublePropertyAndDoubleValue() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("doubleProperty", expectedDoubleValue).accept(testBean);
+ assertTrue(expectedDoubleValue.doubleValue() == testBean.getDoubleProperty());
+ }
+
+ /**
+ * Test execute with simple double property and String value.
+ */
+ public void testExecuteWithSimpleDoublePropertyAndStringValue() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("doubleProperty", "123").accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with simple double property and Float value.
+ */
+ public void testExecuteWithSimpleDoublePropertyAndFloatValue() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("doubleProperty", expectedFloatValue).accept(testBean);
+ assertTrue(expectedFloatValue.doubleValue() == testBean.getDoubleProperty());
+ }
+
+ /**
+ * Test execute with simple double property and Integer value.
+ */
+ public void testExecuteWithSimpleDoublePropertyAndIntegerValue() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("doubleProperty", expectedIntegerValue).accept(testBean);
+ assertTrue(expectedIntegerValue.doubleValue() == testBean.getDoubleProperty());
+ }
+
+ /**
+ * Test execute with simple int property and Double value.
+ */
+ public void testExecuteWithSimpleIntPropertyAndDoubleValue() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("intProperty", expectedDoubleValue).accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with simple int property and String value.
+ */
+ public void testExecuteWithSimpleIntPropertyAndStringValue() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("intProperty", "123").accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with simple int property and Float value.
+ */
+ public void testExecuteWithSimpleIntPropertyAndFloatValue() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("intProperty", expectedFloatValue).accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with simple int property and Integer value.
+ */
+ public void testExecuteWithSimpleIntPropertyAndIntegerValue() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("intProperty", expectedIntegerValue).accept(testBean);
+ assertTrue(expectedIntegerValue.intValue() == testBean.getIntProperty());
+ }
+
+ /**
+ * Test execute with simple boolean property and Boolean value.
+ */
+ public void testExecuteWithSimpleBooleanPropertyAndBooleanValue() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("booleanProperty", expectedBooleanValue).accept(testBean);
+ assertTrue(expectedBooleanValue.booleanValue() == testBean.getBooleanProperty());
+ }
+
+ /**
+ * Test execute with simple boolean property and String value.
+ */
+ public void testExecuteWithSimpleBooleanPropertyAndStringValue() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("booleanProperty", "true").accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with simple byte property and Byte value.
+ */
+ public void testExecuteWithSimpleBytePropertyAndByteValue() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("byteProperty", expectedByteValue).accept(testBean);
+ assertTrue(expectedByteValue.byteValue() == testBean.getByteProperty());
+ }
+
+ /**
+ * Test execute with simple boolean property and String value.
+ */
+ public void testExecuteWithSimpleBytePropertyAndStringValue() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("byteProperty", "foo").accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with simple primitive property and null value.
+ */
+ public void testExecuteWithSimplePrimitivePropertyAndNullValue() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("intProperty", null).accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with read only property.
+ */
+ public void testExecuteWithReadOnlyProperty() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("readOnlyProperty", "foo").accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with write only property.
+ */
+ public void testExecuteWithWriteOnlyProperty() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("writeOnlyProperty", "foo").accept(testBean);
+ assertEquals("foo", testBean.getWriteOnlyPropertyValue());
+ }
+
+ /**
+ * Test execute with a nested property.
+ */
+ public void testExecuteWithNestedProperty() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("nested.stringProperty", "bar").accept(testBean);
+ assertEquals("bar", testBean.getNested().getStringProperty());
+ }
+
+ /**
+ * Test execute with a nested property and null in the property path.
+ */
+ public void testExecuteWithNullInPropertyPath() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("anotherNested.stringProperty", "foo").accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+
+ /**
+ * Test execute with a nested property and null in the property path and ignoreNull = true.
+ */
+ public void testExecuteWithNullInPropertyPathAngIgnoreTrue() {
+ final TestBean testBean = new TestBean();
+
+ // create a consumer that will attempt to set a property on the null bean in the path
+ final BeanPropertyValueChangeConsumer<TestBean, Object> consumer = new BeanPropertyValueChangeConsumer<>(
+ "anotherNested.stringProperty", "Should ignore exception", true);
+
+ try {
+ consumer.accept(testBean);
+ } catch (final IllegalArgumentException e) {
+ fail("Should have ignored the exception.");
+ }
+ }
+
+ /**
+ * Test execute with indexed property.
+ */
+ public void testExecuteWithIndexedProperty() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("intIndexed[0]", expectedIntegerValue).accept(testBean);
+ assertTrue(expectedIntegerValue.intValue() == testBean.getIntIndexed(0));
+ }
+
+ /**
+ * Test execute with mapped property.
+ */
+ public void testExecuteWithMappedProperty() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("mappedProperty(fred)", "barney").accept(testBean);
+ assertEquals("barney", testBean.getMappedProperty("fred"));
+ }
+
+ /**
+ * Test execute with a simple String property.
+ */
+ public void testExecuteWithSimpleStringProperty() {
+ final TestBean testBean = new TestBean();
+ new BeanPropertyValueChangeConsumer<>("stringProperty", "barney").accept(testBean);
+ assertEquals("barney", testBean.getStringProperty());
+ }
+
+ /**
+ * Test execute with an invalid property name.
+ */
+ public void testExecuteWithInvalidPropertyName() {
+ try {
+ new BeanPropertyValueChangeConsumer<>("bogusProperty", "foo").accept(new TestBean());
+ fail("Should have thrown an IllegalArgumentException");
+ } catch (final IllegalArgumentException e) {
+ /* this is what we expect */
+ }
+ }
+}