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

svn commit: r549619 - in /harmony/enhanced/classlib/trunk/modules/beans/src: main/java/java/beans/Statement.java main/java/org/apache/harmony/beans/Handler.java test/java/org/apache/harmony/beans/tests/java/beans/XMLDecoderTest.java

Author: ayza
Date: Thu Jun 21 14:31:22 2007
New Revision: 549619

URL: http://svn.apache.org/viewvc?view=rev&rev=549619
Log:
Handling of special form of array constructor was added. This is a bug fix for HARMONY-1890 ([classlib][beans] java.beans.XMLDecoder.readObject() throws unexpected ArrayIndexOutOfBoundsException)

Modified:
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/Handler.java
    harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/XMLDecoderTest.java

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java?view=diff&rev=549619&r1=549618&r2=549619
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java Thu Jun 21 14:31:22 2007
@@ -50,10 +50,12 @@
     public String toString() {
         StringBuilder sb = new StringBuilder();
         String targetVar = target != null ? convertClassName(target.getClass()) : "null"; //$NON-NLS-1$
+
         sb.append(targetVar);
         sb.append('.');
         sb.append(methodName);
         sb.append('(');
+
         if (arguments != null) {
             for (int i = 0; i < arguments.length; ++i) {
                 if (i > 0) {
@@ -72,6 +74,7 @@
         }
         sb.append(')');
         sb.append(';');
+
         return sb.toString();
     }
 
@@ -93,6 +96,7 @@
 
     Object invokeMethod() throws Exception {
         Object result = null;
+
         try {
             if (target.getClass().isArray()) {
                 Method method = findArrayMethod();
@@ -101,21 +105,27 @@
             } else if (methodName.equals("newInstance") //$NON-NLS-1$
                     && target == Array.class) {
                 Class<?> componentType = (Class) arguments[0];
-                int length = ((Integer) arguments[1]).intValue();
+                int length = (Integer) arguments[1];
                 result = Array.newInstance(componentType, length);
-            } else if (methodName.equals("new") //$NON-NLS-1$
-                    || methodName.equals("newInstance")) { //$NON-NLS-1$
-                if (target instanceof Class) {
-                    Constructor<?> constructor = findConstructor();
-                    result = constructor.newInstance(arguments);
+            } else if (target instanceof Class &&
+                       (methodName.equals("new") || //$NON-NLS-1$
+                        methodName.equals("newInstance"))) { //$NON-NLS-1$
+                Constructor<?> constructor;
+                Class<?> clazz = (Class <?>) target;
+                
+                if (clazz.isArray()) {
+                    // special form for constructing arrays, 
+                    // can be passed from decoder
+                    result = Array.newInstance(clazz.getComponentType(),
+                            (Integer) arguments[0]);
                 } else {
-                    // XXX should be investigated, dead code?
-                    Constructor<?> constructor = findConstructor();
+                    constructor = findConstructor();
                     result = constructor.newInstance(arguments);
                 }
             } else if (target instanceof Class) {
                 Method method = null;
                 boolean found = false;
+
                 try {
                     /*
                      * Try to look for a static method of class described by the
@@ -129,6 +139,7 @@
                     }
                 } catch (NoSuchMethodException e) {
                 }
+
                 if (!found) {
                     // static method was not found
                     // try to invoke method of Class object
@@ -187,6 +198,7 @@
 
     private Object[] getArrayMethodArguments() {
         Object[] args = new Object[arguments.length + 1];
+
         args[0] = target;
         for (int i = 0; i < arguments.length; ++i) {
             args[i + 1] = arguments[i];
@@ -199,10 +211,13 @@
         Class<?> targetClass = (Class) target;
         Constructor<?> result = null;
         Constructor<?>[] constructors = targetClass.getConstructors();
+
         for (Constructor<?> constructor : constructors) {
             Class<?>[] parameterTypes = constructor.getParameterTypes();
+
             if (parameterTypes.length == argClasses.length) {
                 boolean found = true;
+
                 for (int j = 0; j < parameterTypes.length; ++j) {
                     boolean argIsNull = argClasses[j] == null;
                     boolean argIsPrimitiveWrapper = isPrimitiveWrapper(argClasses[j],
@@ -210,6 +225,7 @@
                     boolean paramIsPrimitive = parameterTypes[j].isPrimitive();
                     boolean paramIsAssignable = argIsNull ? false : parameterTypes[j]
                             .isAssignableFrom(argClasses[j]);
+
                     if (!argIsNull && !paramIsAssignable && !argIsPrimitiveWrapper || argIsNull
                             && paramIsPrimitive) {
                         found = false;
@@ -238,13 +254,17 @@
         Method[] methods = targetClass.getMethods();
         Vector<Method> foundMethods = new Vector<Method>();
         Method[] foundMethodsArr;
+
         for (Method method : methods) {
             int mods = method.getModifiers();
+
             if (method.getName().equals(methodName)
                     && (methodIsStatic ? Modifier.isStatic(mods) : true)) {
                 Class<?>[] parameterTypes = method.getParameterTypes();
+
                 if (parameterTypes.length == argClasses.length) {
                     boolean found = true;
+
                     for (int j = 0; j < parameterTypes.length; ++j) {
                         boolean argIsNull = (argClasses[j] == null);
                         boolean argIsPrimitiveWrapper = isPrimitiveWrapper(argClasses[j],
@@ -252,6 +272,7 @@
                         boolean paramIsPrimitive = parameterTypes[j].isPrimitive();
                         boolean paramIsAssignable = argIsNull ? false : parameterTypes[j]
                                 .isAssignableFrom(argClasses[j]);
+
                         if (!argIsNull && !paramIsAssignable && !argIsPrimitiveWrapper
                                 || argIsNull && paramIsPrimitive) {
                             found = false;
@@ -275,9 +296,11 @@
     static boolean isStaticMethodCall(Statement stmt) {
         Object target = stmt.getTarget();
         String mName = stmt.getMethodName();
+
         if (!(target instanceof Class)) {
             return false;
         }
+
         try {
             Statement.findMethod((Class) target, mName, stmt.getArguments(), true);
             return true;

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/Handler.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/Handler.java?view=diff&rev=549619&r1=549618&r2=549619
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/Handler.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/Handler.java Thu Jun 21 14:31:22 2007
@@ -110,7 +110,10 @@
         try {
             cmd.exec(references);
         } catch (Exception e) {
-            throw new SAXException(e);
+            SAXException e2 = new SAXException(e.getMessage());
+            
+            e2.initCause(e);
+            throw e2;
         }
 
         if (--tabCount < 0) {

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/XMLDecoderTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/XMLDecoderTest.java?view=diff&rev=549619&r1=549618&r2=549619
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/XMLDecoderTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/XMLDecoderTest.java Thu Jun 21 14:31:22 2007
@@ -25,6 +25,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.util.Vector;
+import java.lang.reflect.Array;
 
 import junit.framework.Test;
 import junit.framework.TestCase;
@@ -378,6 +379,29 @@
         decode("xml/Test7.xml");
     }
 
+
+    /**
+     * Regression test for HARMONY-1890
+     */
+    public void testDecodeEmptyStringArray1890() {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        XMLEncoder encoder = new XMLEncoder(out);
+        XMLDecoder decoder;
+        Object obj;
+
+        encoder.writeObject(new String[10]);
+        encoder.close();
+
+        decoder = new XMLDecoder(new ByteArrayInputStream(out.toByteArray()));
+        obj = decoder.readObject();
+        decoder.close();
+        
+        assertTrue("Returned object is not array", obj.getClass().isArray());
+        assertSame("String type expected", String.class,
+                obj.getClass().getComponentType());
+        assertEquals("Size mismatch", 10, Array.getLength(obj));
+    }
+    
     /*
      * The test checks the code generation for XML from MainTest.xml
      *