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());