You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by si...@apache.org on 2012/03/15 12:56:49 UTC

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

Author: simonetripodi
Date: Thu Mar 15 11:56:49 2012
New Revision: 1300940

URL: http://svn.apache.org/viewvc?rev=1300940&view=rev
Log:
[SANDBOX-369] Move logic for type compatibility checking from AccessibleObjectsRegistry to TypeUtils - patch provided by Benedikt Ritter

Modified:
    commons/sandbox/beanutils2/trunk/src/changes/changes.xml
    commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/AccessibleObjectsRegistry.java
    commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/TypeUtils.java
    commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/TypeUtilsTest.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=1300940&r1=1300939&r2=1300940&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/changes/changes.xml (original)
+++ commons/sandbox/beanutils2/trunk/src/changes/changes.xml Thu Mar 15 11:56:49 2012
@@ -56,6 +56,9 @@
     <action dev="simonetripodi" type="update" issue="SANDBOX-371" due-to="Benedikt Ritter">
       Make sure that a property is readable in DefaultBeanAccessor.getProperty( String name )
     </action>
+    <action dev="simonetripodi" type="update" issue="SANDBOX-369" due-to="Benedikt Ritter">
+      Move logic for type compatibility checking from AccessibleObjectsRegistry to TypeUtils
+    </action>
     <action dev="simonetripodi" type="update" issue="SANDBOX-365" due-to="Benedikt Ritter">
       Extend Assertions for checking null references in arrays
     </action>

Modified: commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/AccessibleObjectsRegistry.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/AccessibleObjectsRegistry.java?rev=1300940&r1=1300939&r2=1300940&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/AccessibleObjectsRegistry.java (original)
+++ commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/AccessibleObjectsRegistry.java Thu Mar 15 11:56:49 2012
@@ -23,7 +23,7 @@ import static java.lang.System.getSecuri
 import static java.lang.reflect.Modifier.isPublic;
 import static java.security.AccessController.doPrivileged;
 import static org.apache.commons.beanutils2.TypeUtils.getPrimitiveWrapper;
-import static org.apache.commons.beanutils2.TypeUtils.isAssignmentCompatible;
+import static org.apache.commons.beanutils2.TypeUtils.*;
 import static org.apache.commons.beanutils2.internal.Assertions.checkArgument;
 
 import java.lang.ref.Reference;
@@ -125,15 +125,7 @@ abstract class AccessibleObjectsRegistry
                     int methodParamSize = methodsParams.length;
                     if ( methodParamSize == paramSize )
                     {
-                        boolean match = true;
-                        for ( int n = 0; n < methodParamSize; n++ )
-                        {
-                            if ( !isAssignmentCompatible( methodsParams[n], parameterTypes[n] ) )
-                            {
-                                match = false;
-                                break;
-                            }
-                        }
+                        boolean match = checkTypesCompatible( methodsParams, parameterTypes );
 
                         if ( match )
                         {

Modified: commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/TypeUtils.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/TypeUtils.java?rev=1300940&r1=1300939&r2=1300940&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/TypeUtils.java (original)
+++ commons/sandbox/beanutils2/trunk/src/main/java/org/apache/commons/beanutils2/TypeUtils.java Thu Mar 15 11:56:49 2012
@@ -19,6 +19,7 @@ package org.apache.commons.beanutils2;
  * under the License.
  */
 
+import static org.apache.commons.beanutils2.internal.Assertions.checkNoneIsNull;
 import static org.apache.commons.beanutils2.internal.Assertions.checkNotNull;
 
 final class TypeUtils
@@ -185,4 +186,35 @@ final class TypeUtils
         return clazz;
     }
 
+    /**
+     * Checks if a set of parameters is compatible to another set. For example this method can be used to check if all
+     * parameter types of one method are compatible to the parameter types of another method. Note that two empty arrays
+     * will pass the test.
+     *
+     * @param types the types check against otherTypes. None must be {@code null}!
+     * @param otherTypes the other types used for comparing. None must be {@code null}!
+     * @return true if all parameters are compatible
+     * @throws NullPointerException if either {@code types}, {@code otherTypes} or one of the contained types is
+     *             {@code null}.
+     */
+    public static boolean checkTypesCompatible( Class<?>[] types, Class<?>[] otherTypes )
+    {
+        checkNotNull( types, "Input parameter 'types' must not be null!" );
+        checkNotNull( otherTypes, "Input parameter 'otherTypes' must not be null!" );
+        checkNoneIsNull( types );
+        checkNoneIsNull( otherTypes );
+        if ( types.length != otherTypes.length )
+        {
+            return false;
+        }
+        for ( int n = 0; n < types.length; n++ )
+        {
+            if ( !isAssignmentCompatible( types[n], otherTypes[n] ) )
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
 }

Modified: commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/TypeUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/TypeUtilsTest.java?rev=1300940&r1=1300939&r2=1300940&view=diff
==============================================================================
--- commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/TypeUtilsTest.java (original)
+++ commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/TypeUtilsTest.java Thu Mar 15 11:56:49 2012
@@ -19,6 +19,7 @@ package org.apache.commons.beanutils2;
  * under the License.
  */
 
+import static org.apache.commons.beanutils2.TypeUtils.checkTypesCompatible;
 import static org.apache.commons.beanutils2.TypeUtils.getPrimitiveType;
 import static org.apache.commons.beanutils2.TypeUtils.getPrimitiveWrapper;
 import static org.apache.commons.beanutils2.TypeUtils.isAssignmentCompatible;
@@ -1861,4 +1862,60 @@ public class TypeUtilsTest
         toNonPrimitiveClass( null );
     }
 
+    @Test
+    public void checkTypesCompatibleWithCompatibleTypes()
+    {
+        Class<?>[] primitives = new Class<?>[] { boolean.class, byte.class, short.class,
+                int.class, long.class, float.class, double.class, char.class };
+
+        Class<?>[] wrappers = new Class<?>[] { Boolean.class, Byte.class, Short.class,
+            Integer.class, Long.class, Float.class, Double.class, Character.class };
+
+        assertTrue(checkTypesCompatible(primitives, wrappers));
+    }
+
+    @Test
+    public void checkTypesCompatibleWithIncompatibleTypes()
+    {
+        Class<?>[] primitives = new Class<?>[] { boolean.class, byte.class, short.class,
+            int.class, long.class, float.class, double.class, char.class };
+
+        Class<?>[] objects = new Class<?>[] { String.class, Object.class, TestBean.class };
+
+        assertFalse(checkTypesCompatible(primitives, objects));
+    }
+
+    @Test( expected = NullPointerException.class )
+    public void checkTypesCompatibleArrayNull()
+    {
+        Class<?>[] types = new Class<?>[0];
+        Class<?>[] otherTypes = null;
+        checkTypesCompatible( types, otherTypes );
+    }
+
+    @Test( expected = NullPointerException.class )
+    public void checkTypesCompatibleNullArray()
+    {
+        Class<?>[] types = null;
+        Class<?>[] otherTypes = new Class<?>[0];
+        checkTypesCompatible( types, otherTypes );
+    }
+
+    @Test( expected = NullPointerException.class )
+    public void checkTypesCompatibleNullNull()
+    {
+        Class<?>[] types = null;
+        Class<?>[] otherTypes = null;
+        checkTypesCompatible( types, otherTypes );
+    }
+
+    @Test( expected = NullPointerException.class )
+    public void checkTypesCompatibleArrayWithNullReference()
+    {
+        Class<?>[] primitives = new Class<?>[] { boolean.class, null, short.class };
+        Class<?>[] objects = new Class<?>[] { String.class, Object.class, TestBean.class };
+
+        checkTypesCompatible(primitives, objects);
+    }
+
 }