Author: britter
Date: Wed Oct 22 19:37:25 2014
New Revision: 1633693
URL: http://svn.apache.org/r1633693
Log:
SANDBOX-482: Add short cut methods for accessing property values
Modified:
commons/sandbox/beanutils2/trunk/src/changes/changes.xml
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessor.java
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultBeanAccessor.java
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultIndexedPropertyGetterAccessor.java
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultMappedPropertyGetterAccessor.java
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/IndexedPropertyGetterAccessor.java
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MapBeanAccessor.java
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MappedPropertyGetterAccessor.java
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/NullBeanAccessor.java
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetIndexedPropertyTestCase.java
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetMappedPropertyTestCase.java
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetPropertyTestCase.java
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/MapBeanTestCase.java
Modified: commons/sandbox/beanutils2/trunk/src/changes/changes.xml
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/changes/changes.xml?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/changes/changes.xml (original)
+++ commons/sandbox/beanutils2/trunk/src/changes/changes.xml Wed Oct 22
19:37:25 2014
@@ -23,6 +23,9 @@
</properties>
<body>
<release version="2.0" date="TBA" description="Redesign of beanutils with a
fluent API">
+ <action dev="britter" type="add" issue="SANDBOX-482">
+ Add short cut methods for accessing property values
+ </action>
<action dev="britter" type="add" issue="SANDBOX-478">
BeanUtils and Maps
</action>
Modified:
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessor.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessor.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessor.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessor.java
Wed Oct 22 19:37:25 2014
@@ -40,6 +40,16 @@ public interface BeanAccessor<B> {
BeanAccessor<?> get(String propertyName);
/**
+ * Gets the value of the property with name {@code propertyName} from the
bean wrapped by this BeanAccessor. This
+ * is a shortcut for calling {@link #get(String)} followed by {@link
#get()}.
+ *
+ * @param <V> the type of the property
+ * @param propertyName the name of the property to get the value from.
Must not be {@code null}!
+ * @return a {@code BeanAccessor} wrapping the properties value.
+ */
+ <V> V getValue(String propertyName);
+
+ /**
* Selects the indexed property with name {@code propertyName} from the
bean wrapped by this {@code BeanAccessor}. A
* {@link IndexedPropertyGetterAccessor} will be returned for specifying
the index to return the value of.
*
Modified:
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultBeanAccessor.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultBeanAccessor.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultBeanAccessor.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultBeanAccessor.java
Wed Oct 22 19:37:25 2014
@@ -49,6 +49,11 @@ final class DefaultBeanAccessor<B>
* {@inheritDoc}
*/
public BeanAccessor<?> get(String propertyName) {
+ Object value = getValue(propertyName);
+ return new DefaultBeanAccessor<Object>(value);
+ }
+
+ public <V> V getValue(String propertyName) {
checkNotNull(propertyName, "Parameter 'propertyName' must not be
null!");
Method readMethod = properties.getReadPropertyMethod(propertyName);
@@ -60,7 +65,7 @@ final class DefaultBeanAccessor<B>
} catch (InvocationTargetException e) {
throw new PropertyGetterInvocationException(propertyName,
readMethod.getName(), bean.getClass(), e);
}
- return new DefaultBeanAccessor<Object>(newBean);
+ return (V) newBean;
}
/**
Modified:
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultIndexedPropertyGetterAccessor.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultIndexedPropertyGetterAccessor.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultIndexedPropertyGetterAccessor.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultIndexedPropertyGetterAccessor.java
Wed Oct 22 19:37:25 2014
@@ -43,15 +43,22 @@ final class DefaultIndexedPropertyGetter
* {@inheritDoc}
*/
public BeanAccessor<?> at(int index) {
- checkArgument(index >= 0, "Indexed property '%s' in bean of type %s
cannot be get from a negative index %s",
- propertyName, bean.getClass().getName(), index);
- Object indexedValue = invokeGetter(index);
+ Object indexedValue = valueAt(index);
if (indexedValue == null) {
return new NullBeanAccessor<Object>(bean.getClass().getName(),
indexedReadMethod.getName());
}
return BeanAccessorFactory.createBeanAccessor(indexedValue);
}
+ public <V> V valueAt(int index) {
+ checkArgument(index >= 0, "Indexed property '%s' in bean of type %s
cannot be get from a negative index %s",
+ propertyName, bean.getClass().getName(), index);
+ // V is determined by the user
+ @SuppressWarnings("unchecked")
+ V indexedValue = (V) invokeGetter(index);
+ return indexedValue;
+ }
+
private Object invokeGetter(int index) {
try {
return indexedReadMethod.invoke(bean, index);
Modified:
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultMappedPropertyGetterAccessor.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultMappedPropertyGetterAccessor.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultMappedPropertyGetterAccessor.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultMappedPropertyGetterAccessor.java
Wed Oct 22 19:37:25 2014
@@ -48,10 +48,20 @@ class DefaultMappedPropertyGetterAccesso
* {@inheritDoc}
*/
public BeanAccessor<?> of(String key) {
+ Object mappedValue = valueOf(key);
+ return wrapInAccessor(mappedValue);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public <V> V valueOf(String key) {
checkNotNull(key, "Can not get mapped property '%s' in bean of type
'%s' for null!", propertyName,
bean.getClass().getName());
- Object mappedValue = invokeGetter(key);
- return wrapInAccessor(mappedValue);
+ // V is determined by the user
+ @SuppressWarnings("unchecked")
+ V mappedValue = (V) invokeGetter(key);
+ return mappedValue;
}
private Object invokeGetter(String key) {
Modified:
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/IndexedPropertyGetterAccessor.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/IndexedPropertyGetterAccessor.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/IndexedPropertyGetterAccessor.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/IndexedPropertyGetterAccessor.java
Wed Oct 22 19:37:25 2014
@@ -23,4 +23,6 @@ public interface IndexedPropertyGetterAc
BeanAccessor<?> at(int index);
+ <V> V valueAt(int index);
+
}
Modified:
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MapBeanAccessor.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MapBeanAccessor.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MapBeanAccessor.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MapBeanAccessor.java
Wed Oct 22 19:37:25 2014
@@ -46,6 +46,16 @@ final class MapBeanAccessor<B> implement
throw new NoSuchPropertyException(propertyName, map.getClass(), null);
}
+ public <V> V getValue(String propertyName) {
+ checkNotNull(propertyName, "Parameter 'propertyName' must not be
null!");
+ if (map.containsKey(propertyName)) {
+ Object value = map.get(propertyName);
+ return (V) value;
+ }
+ // TODO better default message doesn't fit for map access
+ throw new NoSuchPropertyException(propertyName, map.getClass(), null);
+ }
+
public IndexedPropertyGetterAccessor<?> getIndexed(String propertyName) {
throw new NoSuchPropertyException(propertyName, map.getClass(), null);
}
Modified:
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MappedPropertyGetterAccessor.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MappedPropertyGetterAccessor.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MappedPropertyGetterAccessor.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/MappedPropertyGetterAccessor.java
Wed Oct 22 19:37:25 2014
@@ -23,4 +23,5 @@ public interface MappedPropertyGetterAcc
BeanAccessor<?> of(String key);
+ <V> V valueOf(String key);
}
Modified:
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/NullBeanAccessor.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/NullBeanAccessor.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/NullBeanAccessor.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/NullBeanAccessor.java
Wed Oct 22 19:37:25 2014
@@ -43,6 +43,13 @@ final class NullBeanAccessor<B>
/**
* {@inheritDoc}
*/
+ public <V> V getValue(String propertyName) {
+ throw new NullPointerException(errorMessage);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public IndexedPropertyGetterAccessor<?> getIndexed(String propertyName) {
throw new NullPointerException(errorMessage);
}
Modified:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetIndexedPropertyTestCase.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetIndexedPropertyTestCase.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetIndexedPropertyTestCase.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetIndexedPropertyTestCase.java
Wed Oct 22 19:37:25 2014
@@ -69,6 +69,19 @@ public class GetIndexedPropertyTestCase
assertEquals(expected, accessor.get());
}
+ @Test(expected = IllegalArgumentException.class)
+ public void getIndexedValueNegative() {
+ on(testBean).getIndexed("intIndexed").valueAt(-1);
+ }
+
+ @Test
+ public void getIndexedValue() throws Exception {
+ int expected = testBean.getIntIndexed(0);
+ Integer value = on(testBean).getIndexed("intIndexed").valueAt(0);
+ assertNotNull(value);
+ assertEquals(expected, value.intValue());
+ }
+
@Test
public void getIndexedForNullIndex() throws Exception {
testBean.setStringIndexed(0, null);
Modified:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetMappedPropertyTestCase.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetMappedPropertyTestCase.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetMappedPropertyTestCase.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetMappedPropertyTestCase.java
Wed Oct 22 19:37:25 2014
@@ -89,6 +89,24 @@ public class GetMappedPropertyTestCase {
assertEquals("First Value", result.get());
}
+ @Test
+ public void getMappedValueUnknownKey() throws Exception {
+ Object result =
on(testBean).getMapped("mappedProperty").valueOf("unknownKey");
+ assertNull(result);
+ }
+
+ @Test
+ public void getMappedValueMappedProperty() throws Exception {
+ String result =
on(testBean).getMapped("mappedProperty").valueOf("First Key");
+ assertEquals("First Value", result);
+ }
+
+ @Test
+ public void getMappedValueMappedIntProperty() throws Exception {
+ Integer result =
on(testBean).getMapped("mappedIntProperty").valueOf("One");
+ assertEquals(Integer.valueOf(1), result);
+ }
+
@Test(expected = PropertyGetterInvocationException.class)
public void getExceptionMapped() {
on(exceptionBean).getMapped("exceptionMapped").of("A Key");
Modified:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetPropertyTestCase.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetPropertyTestCase.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetPropertyTestCase.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/GetPropertyTestCase.java
Wed Oct 22 19:37:25 2014
@@ -20,6 +20,7 @@
package org.apache.commons.beanutils2;
import static org.apache.commons.beanutils2.BeanUtils.on;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -96,4 +97,13 @@ public final class GetPropertyTestCase {
on(exceptionBean).get("exceptionProperty");
}
+ @Test(expected = NullPointerException.class)
+ public void getValueNull() throws Exception {
+ on(bean).getValue(null);
+ }
+
+ @Test
+ public void getValueSimpleBoolean() throws Exception {
+ assertEquals(bean.getBooleanProperty(),
on(bean).getValue("booleanProperty"));
+ }
}
Modified:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/MapBeanTestCase.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/MapBeanTestCase.java?rev=1633693&r1=1633692&r2=1633693&view=diff
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/MapBeanTestCase.java
(original)
+++
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/MapBeanTestCase.java
Wed Oct 22 19:37:25 2014
@@ -71,6 +71,16 @@ public class MapBeanTestCase {
assertEquals(on(map).get("integerProperty").get(),
Integer.valueOf(15));
}
+ @Test(expected = NoSuchPropertyException.class)
+ public void missingPropertyGetValueThrowsException() throws Exception {
+ on(map).getValue("nonExistingProperty");
+ }
+
+ @Test
+ public void getValueReturnsIntegerProperty() throws Exception {
+ assertEquals(on(map).getValue("integerProperty"), Integer.valueOf(15));
+ }
+
@Test
public void returnsNestedMap() throws Exception {
assertEquals(Boolean.TRUE,
on(map).get("nestedMap").get("booleanProperty").get());