You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by br...@apache.org on 2014/10/22 22:07:01 UTC

svn commit: r1633705 - in /commons/sandbox/beanutils2/trunk/src: main/java/org/apache/commons/beanutils2/ test/java/org/apache/commons/beanutils2/

Author: britter
Date: Wed Oct 22 20:07:00 2014
New Revision: 1633705

URL: http://svn.apache.org/r1633705
Log:
Centralize BeanAccessor construction in BeanAccessorFactory

Removed:
    commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/NullBeanAccessor.java
Modified:
    commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessorFactory.java
    commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultArgumentsAccessor.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/DefaultBeanPropertySetter.java
    commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultClassAccessor.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/DefaultIndexedPropertySetter.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/DefaultMappedPropertySetter.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
    commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/VoidMethodsTestCase.java

Modified: commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessorFactory.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessorFactory.java?rev=1633705&r1=1633704&r2=1633705&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessorFactory.java (original)
+++ commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/BeanAccessorFactory.java Wed Oct 22 20:07:00 2014
@@ -17,10 +17,38 @@
 
 package org.apache.commons.beanutils2;
 
+import static java.lang.String.format;
+
+import java.beans.IntrospectionException;
+import java.lang.reflect.Method;
 import java.util.Map;
 
 final class BeanAccessorFactory {
 
+    /**
+     * Creates a BeanAccessor implementation for the given bean.
+     *
+     * @param bean       The bean to create the accessor for.
+     * @param clazz      the class of the bean, the wrapped been has been accessed from.
+     * @param readMethod the read method that read the bean.
+     * @param <B>        the type of the bean to be wrapped.
+     * @return a fitting BeanAccessor implementation
+     */
+    public static <B> BeanAccessor<B> createBeanAccessor(B bean, Class<?> clazz, Method readMethod) {
+        if (bean == null) {
+            return new NullBeanAccessor<B>(clazz.getName(), readMethod.getName());
+        } else {
+            return createBeanAccessor(bean);
+        }
+    }
+
+    /**
+     * Creates a BeanAccessor implementation for the given bean.
+     *
+     * @param bean The bean to create the accessor for.
+     * @param <B>  the type of the bean to be wrapped.
+     * @return a fitting BeanAccessor implementation
+     */
     public static <B> BeanAccessor<B> createBeanAccessor(B bean) {
         if (bean instanceof Map) {
             return new MapBeanAccessor<B>(asMap(bean));
@@ -49,4 +77,133 @@ final class BeanAccessorFactory {
             Assertions.checkArgument((firstKey instanceof String), "Map keys have to be of type String!");
         }
     }
+
+    private static final class NullBeanAccessor<B> implements BeanAccessor<B> {
+
+        private final String errorMessage;
+
+        public NullBeanAccessor(String beanTypeName, String methodName) {
+            errorMessage = format("%s.%s returned null!", beanTypeName, methodName);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public BeanAccessor<?> get(String propertyName) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public <V> V getValue(String propertyName) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public IndexedPropertyGetterAccessor<?> getIndexed(String propertyName) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public MappedPropertyGetterAccessor getMapped(String propertyName) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public B get() {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public <V> V cast() {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public BeanPropertySetter<B> set(String propertyName) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public IndexedPropertySetterAccessor<B> setIndexed(String propertyName) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public MappedPropertySetterAccessor<B> setMapped(String propertyName) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean isReadable(String propertyName) throws IntrospectionException {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean isWritable(String propertyName) throws IntrospectionException {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public B cloneBean() {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public <T extends B> void copyPropertiesTo(T target) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Map<String, Object> describe() {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void populate(Map<String, Object> properties) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public ArgumentsAccessor invoke(String methodName) {
+            throw new NullPointerException(errorMessage);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public ArgumentsAccessor invokeExact(String methodName) {
+            throw new NullPointerException(errorMessage);
+        }
+
+    }
 }

Modified: commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultArgumentsAccessor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultArgumentsAccessor.java?rev=1633705&r1=1633704&r2=1633705&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultArgumentsAccessor.java (original)
+++ commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultArgumentsAccessor.java Wed Oct 22 20:07:00 2014
@@ -62,11 +62,7 @@ final class DefaultArgumentsAccessor
         }
 
         Object result = invoke(method, arguments);
-
-        if (method.getReturnType() == void.class || result == null) {
-            return new NullBeanAccessor<Object>(beanType.getName(), methodName);
-        }
-        return new DefaultBeanAccessor<Object>(result);
+        return BeanAccessorFactory.createBeanAccessor(result, beanType, method);
     }
 
     private Object invoke(Method method, Argument<?>... arguments) {

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=1633705&r1=1633704&r2=1633705&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 20:07:00 2014
@@ -50,7 +50,7 @@ final class DefaultBeanAccessor<B>
      */
     public BeanAccessor<?> get(String propertyName) {
         Object value = getValue(propertyName);
-        return new DefaultBeanAccessor<Object>(value);
+        return BeanAccessorFactory.createBeanAccessor(value);
     }
 
     public <V> V getValue(String propertyName) {

Modified: commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultBeanPropertySetter.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultBeanPropertySetter.java?rev=1633705&r1=1633704&r2=1633705&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultBeanPropertySetter.java (original)
+++ commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultBeanPropertySetter.java Wed Oct 22 20:07:00 2014
@@ -56,7 +56,7 @@ final class DefaultBeanPropertySetter<B>
 
         invokeSetter(value);
 
-        return new DefaultBeanAccessor<B>(bean);
+        return BeanAccessorFactory.createBeanAccessor(bean);
     }
 
     private <V> void invokeSetter(V value) {

Modified: commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultClassAccessor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultClassAccessor.java?rev=1633705&r1=1633704&r2=1633705&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultClassAccessor.java (original)
+++ commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultClassAccessor.java Wed Oct 22 20:07:00 2014
@@ -93,7 +93,7 @@ final class DefaultClassAccessor<B>
         }
 
         B bean = doInvokeConstructor(constructor, parameterObjects);
-        return new DefaultBeanAccessor<B>(bean);
+        return BeanAccessorFactory.createBeanAccessor(bean);
     }
 
     /**

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=1633705&r1=1633704&r2=1633705&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 20:07:00 2014
@@ -44,10 +44,7 @@ final class DefaultIndexedPropertyGetter
      */
     public BeanAccessor<?> at(int index) {
         Object indexedValue = valueAt(index);
-        if (indexedValue == null) {
-            return new NullBeanAccessor<Object>(bean.getClass().getName(), indexedReadMethod.getName());
-        }
-        return BeanAccessorFactory.createBeanAccessor(indexedValue);
+        return BeanAccessorFactory.createBeanAccessor(indexedValue, bean.getClass(), indexedReadMethod);
     }
 
     public <V> V valueAt(int index) {

Modified: commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultIndexedPropertySetter.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultIndexedPropertySetter.java?rev=1633705&r1=1633704&r2=1633705&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultIndexedPropertySetter.java (original)
+++ commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultIndexedPropertySetter.java Wed Oct 22 20:07:00 2014
@@ -62,7 +62,7 @@ final class DefaultIndexedPropertySetter
 
         invokeSetter(value);
 
-        return new DefaultBeanAccessor<B>(bean);
+        return BeanAccessorFactory.createBeanAccessor(bean);
     }
 
     private <V> void invokeSetter(V value) {

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=1633705&r1=1633704&r2=1633705&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 20:07:00 2014
@@ -49,7 +49,7 @@ class DefaultMappedPropertyGetterAccesso
      */
     public BeanAccessor<?> of(String key) {
         Object mappedValue = valueOf(key);
-        return wrapInAccessor(mappedValue);
+        return BeanAccessorFactory.createBeanAccessor(mappedValue, bean.getClass(), mappedReadMethod);
     }
 
     /**
@@ -74,12 +74,4 @@ class DefaultMappedPropertyGetterAccesso
         }
     }
 
-    private BeanAccessor<?> wrapInAccessor(Object mappedValue) {
-        if (mappedValue != null) {
-            return BeanAccessorFactory.createBeanAccessor(mappedValue);
-        } else {
-            return new NullBeanAccessor<Object>(bean.getClass().getName(), mappedReadMethod.getName());
-        }
-    }
-
 }

Modified: commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultMappedPropertySetter.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultMappedPropertySetter.java?rev=1633705&r1=1633704&r2=1633705&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultMappedPropertySetter.java (original)
+++ commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/DefaultMappedPropertySetter.java Wed Oct 22 20:07:00 2014
@@ -56,7 +56,7 @@ final class DefaultMappedPropertySetter<
 
         invokeSetter(value);
 
-        return new DefaultBeanAccessor<B>(bean);
+        return BeanAccessorFactory.createBeanAccessor(bean);
     }
 
     private <V> void invokeSetter(V value) {

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=1633705&r1=1633704&r2=1633705&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 20:07:00 2014
@@ -59,6 +59,11 @@ public final class GetPropertyTestCase {
         assertTrue("Got an incorrect value", ((Boolean) value).booleanValue() == bean.getBooleanProperty());
     }
 
+    @Test
+    public void getMapProperty() throws Exception {
+        assertEquals("First Value", on(bean).get("mapProperty").get("First Key").get());
+    }
+
     @Test(expected = PropertyNotReadableException.class)
     public void getWriteOnlyProperty()
             throws Exception {

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=1633705&r1=1633704&r2=1633705&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 20:07:00 2014
@@ -223,6 +223,11 @@ public class MapBeanTestCase {
         assertEquals(Integer.valueOf(15), on(bean).getMapped("mappedMap").of("whatever").get("integerProperty").get());
     }
 
+    @Test
+    public void mapsReturnedFromMethodInvocationsAreWrappedCorrectly() throws Exception {
+        assertEquals(Integer.valueOf(15), on(bean).invoke("getMappedMap").with(argument("whatever")).get("integerProperty").get());
+    }
+
     private static class MapTestBean {
 
         private Map<String, Object> map;

Modified: commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/VoidMethodsTestCase.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/VoidMethodsTestCase.java?rev=1633705&r1=1633704&r2=1633705&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/VoidMethodsTestCase.java (original)
+++ commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/VoidMethodsTestCase.java Wed Oct 22 20:07:00 2014
@@ -39,7 +39,6 @@ public class VoidMethodsTestCase {
     public void setUp()
             throws Exception {
         voidAccessor = on(TestBean.class).invokeStatic("incrementCounter").with();
-        assertTrue(voidAccessor instanceof NullBeanAccessor);
     }
 
     @After