You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by qi...@apache.org on 2008/06/05 03:52:36 UTC

svn commit: r663433 - in /harmony/enhanced/classlib/trunk/modules/beans/src: main/java/java/beans/ test/java-internal/java/beans/

Author: qiuxx
Date: Wed Jun  4 18:52:36 2008
New Revision: 663433

URL: http://svn.apache.org/viewvc?rev=663433&view=rev
Log:
Apply for HARMONY-4022, ([classlib][beans] Java assertions fail)

Added:
    harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ProxyPersistenceDelegateTest.java
Modified:
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ArrayPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ProxyPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java
    harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ArrayPersistenceDelegateTest.java

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ArrayPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ArrayPersistenceDelegate.java?rev=663433&r1=663432&r2=663433&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ArrayPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ArrayPersistenceDelegate.java Wed Jun  4 18:52:36 2008
@@ -71,25 +71,23 @@
 
     @Override
     protected boolean mutatesTo(Object oldInstance, Object newInstance) {
-        assert oldInstance != null && oldInstance.getClass().isArray() : oldInstance;
-
-        if (newInstance != null) {
-            Class<? extends Object> newCl = newInstance.getClass();
-
-            if (!newCl.isArray()) {
-                return false;
-            }
-            // both are arrays
-            int l1 = Array.getLength(oldInstance);
-            int l2 = Array.getLength(newInstance);
-            Class<?> cType1 = oldInstance.getClass().getComponentType();
-            Class<?> cType2 = newCl.getComponentType();
-
-            if (l1 == l2 && cType1.equals(cType2)) {
-                return true;
-            }
+        if(null == oldInstance || null == newInstance){
             return false;
         }
+        
+        if(!oldInstance.getClass().isArray() || !newInstance.getClass().isArray()){
+            return false;
+        }
+        
+        // both are array
+        int l1 = Array.getLength(oldInstance);
+        int l2 = Array.getLength(newInstance);
+        Class<?> cType1 = oldInstance.getClass().getComponentType();
+        Class<?> cType2 = newInstance.getClass().getComponentType();
+        if(l1 == l2 && cType1.equals(cType2)){
+            return true;
+        }
+        
         return false;
     }
 }

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ProxyPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ProxyPersistenceDelegate.java?rev=663433&r1=663432&r2=663433&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ProxyPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/ProxyPersistenceDelegate.java Wed Jun  4 18:52:36 2008
@@ -35,14 +35,15 @@
         // check for consistency
         assert oldInstance instanceof Proxy : oldInstance;
         assert newInstance instanceof Proxy : newInstance;
-        assert newInstance == oldInstance;
         super.initialize(type, oldInstance, newInstance, out);
     }
 
     @Override
     protected boolean mutatesTo(Object oldInstance, Object newInstance) {
-        assert oldInstance instanceof Proxy : oldInstance;
-        assert oldInstance == newInstance;
-        return super.mutatesTo(oldInstance, newInstance);
+        if((oldInstance instanceof Proxy) && (newInstance instanceof Proxy)){
+            return super.mutatesTo(oldInstance, newInstance);
+        }
+        
+        return false;
     }
 }

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java?rev=663433&r1=663432&r2=663433&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java Wed Jun  4 18:52:36 2008
@@ -95,7 +95,6 @@
 
     StandardBeanInfo(Class<?> beanClass, BeanInfo explicitBeanInfo, Class<?> stopClass)
             throws IntrospectionException {
-        assert (beanClass != null);
         this.beanClass = beanClass;
         /*--------------------------------------------------------------------------------------
          * There are 3 aspects of BeanInfo that must be supplied:

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ArrayPersistenceDelegateTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ArrayPersistenceDelegateTest.java?rev=663433&r1=663432&r2=663433&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ArrayPersistenceDelegateTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ArrayPersistenceDelegateTest.java Wed Jun  4 18:52:36 2008
@@ -37,13 +37,90 @@
         pd = new ArrayPersistenceDelegate();
     }
 
+    @Override
+    protected void tearDown() throws Exception {
+        pd = null;
+        super.tearDown();
+    }
+    
     public void testMutates() {
         assertFalse(pd.mutatesTo(new int[] { 1 }, null));
         assertFalse(pd.mutatesTo(null, null));
         assertFalse(pd.mutatesTo(new int[1], new int[2]));
         assertTrue(pd.mutatesTo(new int[] { 1, 3 }, new int[] { 1, 2 }));
     }
-
+    
+    /*
+     * test mutates with wrapper array
+     */
+    public void test_MutatesTo_WrapperArray() {
+        // Regression for Harmony-4022
+        // one wrapper array and null
+        assertFalse(pd.mutatesTo(new Integer[] { 1, 2, 3 }, null));
+        assertFalse(pd.mutatesTo(new Boolean[] { true, false }, null));
+        assertFalse(pd.mutatesTo(new Short[] { 1, 2 }, null));
+        assertFalse(pd.mutatesTo(new Long[] { 23000000094382l, 23000000094383l }, null));
+        assertFalse(pd.mutatesTo(new Character[] { 'a', 'b', 'c'}, null));
+        assertFalse(pd.mutatesTo(new Float[] { 0.1f, 0.2f }, null));
+        assertFalse(pd.mutatesTo(new Double[] { 0.1, 0.2 }, null));
+        
+        // two wrapper arries with the same component type but different length
+        assertFalse(pd.mutatesTo(new Integer[] { 1, 2, 3 }, new Integer[] { 1, 2}));
+        assertFalse(pd.mutatesTo(new Boolean[] { true, false }, new Boolean[] { true }));
+        assertFalse(pd.mutatesTo(new Short[] { 1, 2 }, new Short[] { 1, 2, 3}));
+        assertFalse(pd.mutatesTo(new Long[] { 23000000094382l, 23000000094383l }, new Long[] { 23000000094382l}));
+        assertFalse(pd.mutatesTo(new Character[] { 'a', 'b', 'c'}, new Character[] {}));
+        assertFalse(pd.mutatesTo(new Float[] { 0.1f, 0.2f }, new Float[] { 0.1f, 0.2f, 0.3f}));
+        assertFalse(pd.mutatesTo(new Double[] { 0.1, 0.2 }, new Double[] { 0.1 }));
+        
+        // two wrapper arries with the same length but different component types
+        assertFalse(pd.mutatesTo(new Integer[] { 1, 2, 3 }, new Boolean[] { true, false }));
+        assertFalse(pd.mutatesTo(new Boolean[] { true, false }, new Short[] { 1, 2 }));
+        assertFalse(pd.mutatesTo(new Short[] { 1, 2 }, new Long[] { 23000000094382l, 23000000094383l }));
+        assertFalse(pd.mutatesTo(new Long[] { 23000000094382l, 23000000094383l }, new Character[] { 'a', 'b', 'c'}));
+        assertFalse(pd.mutatesTo(new Character[] { 'a', 'b', 'c'}, new Float[] { 0.1f, 0.2f }));
+        assertFalse(pd.mutatesTo(new Float[] { 0.1f, 0.2f }, new Double[] { 0.1 }));
+        
+        // two wrapper arries with the same length and component type but different internal values
+        assertTrue(pd.mutatesTo(new Integer[] { 1, 2, 3 }, new Integer[] { 5, 6, 7 }));
+        assertTrue(pd.mutatesTo(new Boolean[] { true, false, false}, new Boolean[] { false, true, true}));
+        assertTrue(pd.mutatesTo(new Short[] { 1, 2 }, new Short[] { 4, 5 }));
+        assertTrue(pd.mutatesTo(new Long[] { 23000000094382l, 23000000094383l }, new Long[] { 534300002l, 23020094383l }));
+        assertTrue(pd.mutatesTo(new Character[] { 'a', 'b', 'c'}, new Character[] { 'd', 'e', 'f'}));
+        assertTrue(pd.mutatesTo(new Float[] { 0.1f, 0.2f }, new Float[] { 0.4f, 0.6f }));
+        assertTrue(pd.mutatesTo(new Double[] { 0.1, 0.2 }, new Double[] { 0.3, 0.343 }));
+    }
+    
+    /*
+     * test mutatesTo with object array
+     */
+    public void test_MutatesTo_ObjectArray(){
+        // Regression for Harmony-4022
+        // one object array and null
+        assertFalse(pd.mutatesTo(new MockAObject[] { new MockAObject() }, null));
+        assertFalse(pd.mutatesTo(new MockBObject[] { new MockBObject() }, null));
+        assertFalse(pd.mutatesTo(new MockObject[] { new MockAObject(), new MockBObject()}, null));
+        
+        // two wrapper arries with the same component type but different length
+        assertFalse(pd.mutatesTo(new MockObject[1], new MockObject[2]));
+        assertFalse(pd.mutatesTo(new MockAObject[1], new MockAObject[2]));
+        assertFalse(pd.mutatesTo(new MockBObject[1], new MockBObject[2]));
+        
+        // two object array with the same length but different component types
+        assertFalse(pd.mutatesTo(new MockAObject[] { new MockAObject() }, new MockBObject[] { new MockBObject() }));
+        assertFalse(pd.mutatesTo(new MockObject[] {new MockObject()}, new MockAObject[] { new MockAObject() }));
+        assertFalse(pd.mutatesTo(new MockObject[] {new MockAObject()}, new MockAObject[] { new MockAObject() }));
+        assertFalse(pd.mutatesTo(new MockObject[] {new MockBObject()}, new MockAObject[] { new MockAObject() }));
+        assertFalse(pd.mutatesTo(new MockObject[] {new MockObject()}, new MockBObject[] { new MockBObject() }));
+        assertFalse(pd.mutatesTo(new MockObject[] {new MockBObject()}, new MockBObject[] { new MockBObject() }));
+        assertFalse(pd.mutatesTo(new MockObject[] {new MockAObject()}, new MockBObject[] { new MockBObject() }));
+        
+        // two object array with the same length and component type but differnt internal values
+        assertTrue(pd.mutatesTo(new MockObject[] { new MockAObject() }, new MockObject[] { new MockBObject() }));
+        assertTrue(pd.mutatesTo(new MockAObject[] { new MockAObject(1) }, new MockAObject[] { new MockAObject(2) }));
+        assertTrue(pd.mutatesTo(new MockBObject[] { new MockBObject(1) }, new MockBObject[] { new MockBObject(2) }));
+    }
+    
     public void testInitialize() {
         // TBD
     }
@@ -58,5 +135,35 @@
         assertSame(Integer.TYPE, exp.getArguments()[0]);
         assertEquals(new Integer(3), exp.getArguments()[1]);
     }
+    
+    public class MockObject {
+        
+    }
+    
+    public class MockAObject extends MockObject {
+        String name = "A Object";
+        int id = 0x01;
+        
+        public MockAObject() {
+            
+        }
+        
+        public MockAObject(int idValue){
+            id = idValue;
+        }
+    }
+    
+    public class MockBObject extends MockObject {
+        String name = "B Object";
+        int id = 0x02;
+        
+        public MockBObject(){
+            
+        }
+        
+        public MockBObject(int idValue){
+            id = idValue;
+        }
+    }
 
 }

Added: harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ProxyPersistenceDelegateTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ProxyPersistenceDelegateTest.java?rev=663433&view=auto
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ProxyPersistenceDelegateTest.java (added)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/java-internal/java/beans/ProxyPersistenceDelegateTest.java Wed Jun  4 18:52:36 2008
@@ -0,0 +1,98 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.beans;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import junit.framework.TestCase;
+
+public class ProxyPersistenceDelegateTest extends TestCase {
+
+    private ProxyPersistenceDelegate pd = null;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        pd = new ProxyPersistenceDelegate();
+    }
+
+    protected void tearDown() throws Exception {
+        pd = null;
+        super.tearDown();
+    }
+
+    /*
+     * test mutatesTo method
+     */
+    public void test_MutatesTo() {
+        // Regression for Harmony-4022
+        Object proxy1 = Proxy.newProxyInstance(
+                this.getClass().getClassLoader(), new Class[] {
+                        ITestReturnObject.class, ITestReturnString.class },
+                new TestProxyHandler(new TestProxyImpl()));
+        Object proxy2 = Proxy.newProxyInstance(
+                this.getClass().getClassLoader(),
+                new Class[] { ITestReturnObject.class }, new TestProxyHandler(
+                        new TestProxyImpl()));
+
+        assertFalse(pd.mutatesTo(null, null));
+        assertFalse(pd.mutatesTo(new MockAObject(), new MockAObject()));
+        assertFalse(pd.mutatesTo(new MockAObject(), new MockBObject()));
+        assertFalse(pd.mutatesTo(proxy1, null));
+        assertFalse(pd.mutatesTo(proxy1, proxy2));
+        assertTrue(pd.mutatesTo(proxy1, proxy1));
+    }
+
+    public class MockAObject {
+
+    }
+
+    public class MockBObject {
+
+    }
+
+    public static interface ITestReturnObject {
+        Object f();
+    }
+
+    public static interface ITestReturnString {
+        String f();
+    }
+
+    public static class TestProxyImpl implements ITestReturnObject,
+            ITestReturnString {
+        public String f() {
+            return null;
+        }
+    }
+
+    public static class TestProxyHandler implements InvocationHandler {
+        private Object proxied;
+
+        public TestProxyHandler(Object object) {
+            proxied = object;
+        }
+
+        public Object invoke(Object object, Method method, Object[] args)
+                throws Throwable {
+            return method.invoke(proxied, args);
+        }
+    }
+
+}