You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by to...@apache.org on 2007/07/17 05:47:31 UTC

svn commit: r556803 - in /harmony/enhanced/classlib/trunk/modules/beans/src: main/java/java/beans/IndexedPropertyDescriptor.java test/java/org/apache/harmony/beans/tests/java/beans/IndexedPropertyDescriptorTest.java

Author: tonywu
Date: Mon Jul 16 20:47:30 2007
New Revision: 556803

URL: http://svn.apache.org/viewvc?view=rev&rev=556803
Log:
Fix getter and setter methods
1, handle null value
2, remove redundant code
3, add javadoc

Modified:
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java
    harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IndexedPropertyDescriptorTest.java

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java?view=diff&rev=556803&r1=556802&r2=556803
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/IndexedPropertyDescriptor.java Mon Jul 16 20:47:30 2007
@@ -18,8 +18,8 @@
 package java.beans;
 
 import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import org.apache.harmony.beans.internal.nls.Messages;
+
+import org.apache.harmony.beans.BeansUtils;
 
 public class IndexedPropertyDescriptor extends PropertyDescriptor {
 
@@ -145,107 +145,92 @@
                 .concat(initialUpperCase(propertyName)));
     }
 
+    /**
+     * Sets the indexed getter as the specified method.
+     * 
+     * @param indexedGetter
+     *            the specified indexed getter.
+     * @throws IntrospectionException
+     */
     public void setIndexedReadMethod(Method indexedGetter)
             throws IntrospectionException {
-        if (indexedGetter != null) {
-            int modifiers = indexedGetter.getModifiers();
-            Class<?>[] parameterTypes;
-            Class<?> returnType;
-            Class<?> indexedPropertyType;
-
-            if (!Modifier.isPublic(modifiers)) {
-                throw new IntrospectionException(Messages.getString("beans.21")); //$NON-NLS-1$
-            }
-            parameterTypes = indexedGetter.getParameterTypes();
-            if (parameterTypes.length != 1) {
-                throw new IntrospectionException(Messages.getString("beans.22")); //$NON-NLS-1$
-            }
-            if (!parameterTypes[0].equals(int.class)) {
-                throw new IntrospectionException(Messages.getString("beans.23")); //$NON-NLS-1$
-            }
-            returnType = indexedGetter.getReturnType();
-            indexedPropertyType = getIndexedPropertyType();
-            if ((indexedPropertyType != null)
-                    && !returnType.equals(indexedPropertyType)) {
-                throw new IntrospectionException(Messages.getString("beans.24")); //$NON-NLS-1$
-            }
-        }
-        this.indexedGetter = indexedGetter;
+        this.internalSetIndexedReadMethod(indexedGetter);
     }
 
+    /**
+     * Sets the indexed setter as the specified method.
+     * 
+     * @param indexedSetter
+     *            the specified indexed setter.
+     * @throws IntrospectionException
+     */
     public void setIndexedWriteMethod(Method indexedSetter)
             throws IntrospectionException {
-        if (indexedSetter != null) {
-            int modifiers = indexedSetter.getModifiers();
-            Class<?>[] parameterTypes;
-            Class<?> firstParameterType;
-            Class<?> secondParameterType;
-            Class<?> propType;
-
-            if (!Modifier.isPublic(modifiers)) {
-                throw new IntrospectionException(Messages.getString("beans.25")); //$NON-NLS-1$
-            }
-            parameterTypes = indexedSetter.getParameterTypes();
-            if (parameterTypes.length != 2) {
-                throw new IntrospectionException(Messages.getString("beans.26")); //$NON-NLS-1$
-            }
-            firstParameterType = parameterTypes[0];
-            if (!firstParameterType.equals(int.class)) {
-                throw new IntrospectionException(Messages.getString("beans.27")); //$NON-NLS-1$
-            }
-            secondParameterType = parameterTypes[1];
-            propType = getIndexedPropertyType();
-            if (propType != null && !secondParameterType.equals(propType)) {
-                throw new IntrospectionException(Messages.getString("beans.28")); //$NON-NLS-1$
-            }
-        }
-        this.indexedSetter = indexedSetter;
+        this.internalSetIndexedWriteMethod(indexedSetter, false);
     }
 
+    /**
+     * Obtains the indexed setter.
+     * 
+     * @return the indexed setter.
+     */
     public Method getIndexedWriteMethod() {
         return indexedSetter;
     }
 
+    /**
+     * Obtains the indexed getter.
+     * 
+     * @return the indexed getter.
+     */
     public Method getIndexedReadMethod() {
         return indexedGetter;
     }
 
+    /**
+     * Determines if this <code>IndexedPropertyDescriptor</code> is equal to
+     * the specified object. Two <code>IndexedPropertyDescriptor</code> s are
+     * equal if the reader, indexed reader, writer, indexed writer, property
+     * types, indexed property type, property editor and flags are equal.
+     * 
+     * @param obj
+     * @return true if this indexed property descriptor is equal to the
+     *         specified object.
+     */
     @Override
     public boolean equals(Object obj) {
-        boolean result = super.equals(obj);
-
-        if (result) {
-            IndexedPropertyDescriptor pd = (IndexedPropertyDescriptor) obj;
-
-            if (indexedGetter != null) {
-                result = indexedGetter.equals(pd.getIndexedReadMethod());
-            } else if (result && indexedGetter == null) {
-                result = pd.getIndexedReadMethod() == null;
-            }
-
-            if (result) {
-                if (indexedSetter != null) {
-                    result = indexedSetter.equals(pd.getIndexedWriteMethod());
-                } else if (indexedSetter == null) {
-                    result = pd.getIndexedWriteMethod() == null;
-                }
-            }
+        if (!(obj instanceof IndexedPropertyDescriptor)) {
+            return false;
         }
 
-        return result;
+        IndexedPropertyDescriptor other = (IndexedPropertyDescriptor) obj;
+
+        return (super.equals(other)
+                && (indexedPropertyType == null ? other.indexedPropertyType == null
+                        : indexedPropertyType.equals(other.indexedPropertyType))
+                && (indexedGetter == null ? other.indexedGetter == null
+                        : indexedGetter.equals(other.indexedGetter)) && (indexedSetter == null ? other.indexedSetter == null
+                : indexedSetter.equals(other.indexedSetter)));
+    }
+    
+    /**
+     * HashCode of the IndexedPropertyDescriptor
+     */
+    @Override
+    public int hashCode() {
+        return super.hashCode() + BeansUtils.getHashCode(indexedPropertyType)
+                + BeansUtils.getHashCode(indexedGetter)
+                + BeansUtils.getHashCode(indexedSetter);
     }
+    
 
+    /**
+     * Obtains the Class object of the indexed property type.
+     * 
+     * @return the Class object of the indexed property type.
+     */
     public Class<?> getIndexedPropertyType() {
-        Class<?> result = null;
-
-        if (indexedGetter != null) {
-            result = indexedGetter.getReturnType();
-        } else if (indexedSetter != null) {
-            Class<?>[] parameterTypes = indexedSetter.getParameterTypes();
-
-            result = parameterTypes[1];
-        }
-        return result;
+        return indexedPropertyType;
     }
 
     private void setIndexedReadMethod(Class beanClass, String indexedGetterName)

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IndexedPropertyDescriptorTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IndexedPropertyDescriptorTest.java?view=diff&rev=556803&r1=556802&r2=556803
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IndexedPropertyDescriptorTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IndexedPropertyDescriptorTest.java Mon Jul 16 20:47:30 2007
@@ -19,6 +19,7 @@
 
 import java.beans.IndexedPropertyDescriptor;
 import java.beans.IntrospectionException;
+import java.beans.PropertyDescriptor;
 import java.lang.reflect.Method;
 
 import junit.framework.TestCase;
@@ -1378,6 +1379,69 @@
             fail("Should throw IntrospectionException");
         } catch (IntrospectionException e) {
         }
+        
+        ipd = new IndexedPropertyDescriptor("data", NormalBean.class);
+        ipd.setIndexedReadMethod(null);
+        try {
+            ipd.setIndexedWriteMethod(NormalBean.class.getMethod("setData", Integer.TYPE, Integer.TYPE));
+            fail("should throw IntrospectionException");
+        } catch (IntrospectionException e) {
+            // expected
+        }
+    }
+    
+    public void testSetIndexedMethodNullNull() throws Exception {
+        try {
+            IndexedPropertyDescriptor i = new IndexedPropertyDescriptor("a",
+                    NormalBean.class, "getData", "setData", null,
+                    "setData");
+            i.setIndexedWriteMethod(null);
+            fail("should throw IntrospectionException.");
+        } catch (IntrospectionException e) {
+            // expected
+        }
+        try {
+            IndexedPropertyDescriptor i = new IndexedPropertyDescriptor("a",
+                    NormalBean.class, "getData", "setData",
+                    "getData", null);
+            i.setIndexedReadMethod(null);
+            fail("should throw IntrospectionException.");
+        } catch (IntrospectionException e) {
+            // expected
+        }
+    }
+
+    
+    public void testSetIndexedReadMethodFollowANullValue() throws Exception {
+        try {
+            IndexedPropertyDescriptor i = new IndexedPropertyDescriptor("a",
+                    DummyBean.class, "readMethod", "writeMethod", null,
+                    "indexedReadMethod");
+            Method irm = DummyBean.class.getDeclaredMethod("indexedReadMethod",
+                    Integer.TYPE);
+            i.setIndexedReadMethod(irm);
+            fail("should throw IntrospectionException.");
+        } catch (IntrospectionException e) {
+            // expected
+        }
+    }
+
+    static class DummyBean {
+
+        public int[] readMehtod() {
+            return null;
+        }
+
+        public void writeMethod(int[] a) {
+        }
+
+        public double indexedReadMethod(int i) {
+            return 0;
+        }
+
+        public void indexedWriteMethod(int i, int j) {
+        }
+
     }
 
     class NotJavaBean {
@@ -1407,5 +1471,114 @@
             this.propertyOne[i] = value;
         }
 
+    }
+    
+    //Regression Test
+    class InCompatibleGetterSetterBean
+    {
+        private Object[] data = new Object[10];
+        public void setData(Object[] data) {
+            this.data = data;
+        }
+        public Object[] getDate() {
+            return data;
+        }
+        public void setData(int index, Object o) {
+            this.data[index] = o;
+        }
+    }
+    
+    public void testInCompatibleGetterSetterBean() {
+        try {
+            new IndexedPropertyDescriptor("data",
+                    InCompatibleGetterSetterBean.class);
+            fail("should throw IntrospectionException");
+        } catch (IntrospectionException e) {
+            // expected
+        }
+    }
+    
+    class NormalBean {
+        private Object[] data = new Object[10];
+
+        public Object[] getData() {
+            return data;
+        }
+
+        public void setData(Object[] data) {
+            this.data = data;
+        }
+
+        public void setData(int index, Object o) {
+            data[index] = o;
+        }
+        
+        public void setData(int index, int value) {
+            // do nothing
+        }
+
+        public Object getData(int index) {
+            return data[index];
+        }
+    }
+    
+    public void testEquals_superClass() throws Exception {
+        PropertyDescriptor propertyDescriptor = new PropertyDescriptor("data",
+                NormalBean.class);
+        IndexedPropertyDescriptor indexedPropertyDescriptor = new IndexedPropertyDescriptor(
+                "data", NormalBean.class);
+        assertFalse(indexedPropertyDescriptor.equals(propertyDescriptor));
+        assertTrue(propertyDescriptor.equals(indexedPropertyDescriptor));
+    }
+    
+    public void testHashCode() throws Exception {
+        String propertyName = "PropertyFour";
+        Class<MockJavaBean> beanClass = MockJavaBean.class;
+
+        Method readMethod = beanClass.getMethod("get" + propertyName,
+                (Class[]) null);
+        Method writeMethod = beanClass.getMethod("set" + propertyName,
+                new Class[] { String[].class });
+        Method indexedReadMethod = beanClass.getMethod("get" + propertyName,
+                new Class[] { Integer.TYPE });
+        Method indexedWriteMethod = beanClass.getMethod("set" + propertyName,
+                new Class[] { Integer.TYPE, String.class });
+
+        IndexedPropertyDescriptor ipd = new IndexedPropertyDescriptor(
+                propertyName, readMethod, writeMethod, indexedReadMethod,
+                indexedWriteMethod);
+
+        IndexedPropertyDescriptor ipd2 = new IndexedPropertyDescriptor(
+                propertyName, beanClass);
+
+        assertEquals(ipd, ipd2);
+        assertEquals(ipd.hashCode(), ipd2.hashCode());
+    }
+    
+    public void testIncompatibleGetterAndIndexedGetterBean() {
+        try {
+            new IndexedPropertyDescriptor("data",
+                    IncompatibleGetterAndIndexedGetterBean.class);
+            fail("should throw IntrospectionException");
+
+        } catch (IntrospectionException e) {
+            //expected
+        }
+    }
+
+    private class IncompatibleGetterAndIndexedGetterBean {
+        private int[] data;
+
+        public int getData() {
+            return data[0];
+        }
+
+        public int getData(int index) {
+            return data[index];
+        }
+        
+        public void setData(int index, int data) {
+            this.data[index] = data;
+        }
     }
 }