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


Reply via email to