Return-Path: Delivered-To: apmail-incubator-harmony-commits-archive@www.apache.org Received: (qmail 27187 invoked from network); 13 Jun 2006 04:52:05 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 13 Jun 2006 04:52:05 -0000 Received: (qmail 1495 invoked by uid 500); 13 Jun 2006 04:52:05 -0000 Delivered-To: apmail-incubator-harmony-commits-archive@incubator.apache.org Received: (qmail 1464 invoked by uid 500); 13 Jun 2006 04:52:04 -0000 Mailing-List: contact harmony-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: harmony-dev@incubator.apache.org Delivered-To: mailing list harmony-commits@incubator.apache.org Received: (qmail 1453 invoked by uid 99); 13 Jun 2006 04:52:04 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 12 Jun 2006 21:52:04 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 12 Jun 2006 21:52:03 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 74CA91A983A; Mon, 12 Jun 2006 21:51:43 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r413807 - in /incubator/harmony/enhanced/classlib/trunk/modules/beans: make/common/ src/main/java/java/beans/ src/main/java/org/apache/harmony/beans/ Date: Tue, 13 Jun 2006 04:51:42 -0000 To: harmony-commits@incubator.apache.org From: mloenko@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20060613045143.74CA91A983A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: mloenko Date: Mon Jun 12 21:51:41 2006 New Revision: 413807 URL: http://svn.apache.org/viewvc?rev=413807&view=rev Log: fixes for HARMONY-588 [classlib] [beans] Encoder and ArrayPersistenceDelegate handle arrays incorrectly Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/make/common/build.xml incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ArrayPersistenceDelegate.java incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/make/common/build.xml URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/make/common/build.xml?rev=413807&r1=413806&r2=413807&view=diff ============================================================================== --- incubator/harmony/enhanced/classlib/trunk/modules/beans/make/common/build.xml (original) +++ incubator/harmony/enhanced/classlib/trunk/modules/beans/make/common/build.xml Mon Jun 12 21:51:41 2006 @@ -122,7 +122,6 @@ - @@ -169,11 +168,9 @@ - - Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java?rev=413807&r1=413806&r2=413807&view=diff ============================================================================== --- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java (original) +++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java Mon Jun 12 21:51:41 2006 @@ -20,6 +20,7 @@ */ package java.beans; +import java.lang.reflect.Field; import java.util.HashMap; import java.util.Vector; @@ -107,11 +108,12 @@ PersistenceDelegate pd = (object != null) ? getPersistenceDelegate(object.getClass()) : new NullPersistenceDelegate(); - + + if(pd == null) { pd = new DefaultPersistenceDelegate(); } - + pd.writeObject(object, this); } @@ -123,8 +125,8 @@ if(node != null) { try { Object[] oldArgs = oldStm.getArguments(); - Object[] newArgs = write(oldArgs); - + write(oldArgs); + Statement statement = new Statement(node.getObjectValue(), oldStm.getMethodName(), oldArgs); node.addStatement(statement); @@ -146,7 +148,7 @@ ObjectNode node = null; Class type = null; - + if(oldInstance != null) { type = oldInstance.getClass(); node = (ObjectNode) nodes.get(oldInstance); @@ -154,17 +156,21 @@ if(node == null) { if(isNull(type) || isPrimitive(type) || isString(type) - || isClass(type)) { + //|| isClass(type) + ) + { node = new ObjectNode(oldExp); } else { write(oldExp.getArguments()); node = new ObjectNode(oldExp, nodes); } - + nodes.put(oldInstance, node); - + // if an expression is not a constructor - if(!(oldExp.getTarget() instanceof Class)) { + if(!(oldExp.getTarget() instanceof Class || + oldExp.getTarget() instanceof Field)) + { ObjectNode parent = (ObjectNode) nodes.get( oldExp.getTarget()); parent.addExpression(oldExp); @@ -211,14 +217,7 @@ if(node == null) { Class type = oldInstance.getClass(); - if(isPrimitive(type) || isString(type) || isClass(type)) { - Expression expr = new Expression(type, "new", - new Object[] { oldInstance }); - nodes.put(oldInstance, new ObjectNode(expr)); - } else { - doWriteObject(oldInstance); - } - + doWriteObject(oldInstance); node = (ObjectNode) nodes.get(oldInstance); } else { node.addReference(); Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java?rev=413807&r1=413806&r2=413807&view=diff ============================================================================== --- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java (original) +++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java Mon Jun 12 21:51:41 2006 @@ -60,7 +60,7 @@ && (newInstance == null); if(bothInstancesAreNull) { - return true; + return false; } else { return (oldInstance != null) && (newInstance != null) ? oldInstance.getClass() == newInstance.getClass() : false; @@ -73,7 +73,8 @@ public void writeObject(Object oldInstance, Encoder out) { Object newInstance = (oldInstance != null) ? out.get(oldInstance) : null; - + + // FIXME rewrite, handling of nulls is not obvious if(mutatesTo(oldInstance, newInstance)) { if(oldInstance != null) { initialize(oldInstance.getClass(), oldInstance, newInstance, Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java?rev=413807&r1=413806&r2=413807&view=diff ============================================================================== --- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java (original) +++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Statement.java Mon Jun 12 21:51:41 2006 @@ -97,29 +97,37 @@ Object invokeMethod() throws Exception { Object result = null; - + try { if(target.getClass().isArray()) { Method method = findArrayMethod(); Object[] ama = getArrayMethodArguments(); + result = method.invoke(null, ama); - } else if(methodName.equals("new")) { + } else if (methodName.equals("newInstance") && + target instanceof Class && + ((Class) target).getName().equals("java.lang.reflect.Array")) + { + Class componentType = (Class) arguments[0]; + int length = ((Integer) arguments[1]).intValue(); + + result = Array.newInstance(componentType, length); + } else if(methodName.equals("new") || + methodName.equals("newInstance")) + { if(target instanceof Class) { - Class type = (Class) target; - if(type.isArray()) { - Class componentType = type.getComponentType(); - int length = ((Integer) arguments[0]).intValue(); - result = Array.newInstance(componentType, length); - } else { - Constructor constructor = findConstructor(); - result = constructor.newInstance(arguments); - } + Constructor constructor = findConstructor(); + + result = constructor.newInstance(arguments); } else { + // XXX should be investigated, dead code? Constructor constructor = findConstructor(); + result = constructor.newInstance(arguments); } } else if(target instanceof Class) { Method method = findStaticMethod(); + result = method.invoke(null, arguments); } else { final Method method = findMethod(); @@ -130,10 +138,12 @@ return null; } }); + result = method.invoke(target, arguments); } } catch (InvocationTargetException ite) { Throwable t = ite.getCause(); + throw (t != null) && (t instanceof Exception) ? (Exception) t : ite; } return result; @@ -173,47 +183,47 @@ private Constructor findConstructor() throws NoSuchMethodException { Class[] argClasses = getClasses(); Class targetClass = (Class) target; - + Constructor result = null; - - Constructor[] constructors = targetClass.getConstructors(); - for(int i = 0; i < constructors.length; ++i) { - Constructor constructor = constructors[i]; - 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], parameterTypes[j]); - boolean paramIsPrimitive = - parameterTypes[j].isPrimitive(); - boolean paramIsAssignable = argIsNull ? false - : parameterTypes[j].isAssignableFrom( - argClasses[j]); - - if(!argIsNull && !paramIsAssignable - && !argIsPrimitiveWrapper - || argIsNull && paramIsPrimitive) { - found = false; - break; - } - } - - if(found) { - result = constructor; - break; - } - } + Constructor[] constructors = targetClass.getConstructors(); + + for(int i = 0; i < constructors.length; ++i) { + Constructor constructor = constructors[i]; + 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], parameterTypes[j]); + boolean paramIsPrimitive = + parameterTypes[j].isPrimitive(); + boolean paramIsAssignable = argIsNull ? false + : parameterTypes[j].isAssignableFrom( + argClasses[j]); + + if(!argIsNull && !paramIsAssignable + && !argIsPrimitiveWrapper + || argIsNull && paramIsPrimitive) { + found = false; + break; + } + } + + if(found) { + result = constructor; + break; + } + } } - if(result == null) { - throw new NoSuchMethodException( - "No constructor for class " + targetClass.getName() - + " found"); - } + if(result == null) { + throw new NoSuchMethodException( + "No constructor for class " + targetClass.getName() + + " found"); + } return result; } Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java?rev=413807&r1=413806&r2=413807&view=diff ============================================================================== --- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java (original) +++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java Mon Jun 12 21:51:41 2006 @@ -148,8 +148,8 @@ Tag tag = new Tag("array"); - tag.addAttr("class", object.getClass().getComponentType().getName()); - tag.addAttr("length", ((Integer) args[0]).toString()); + tag.addAttr("class", ((Class) args[0]).getName()); + tag.addAttr("length", ((Integer) args[1]).toString()); printBytes(tabCount, tag.toStringOnOpen()); Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ArrayPersistenceDelegate.java URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ArrayPersistenceDelegate.java?rev=413807&r1=413806&r2=413807&view=diff ============================================================================== --- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ArrayPersistenceDelegate.java (original) +++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ArrayPersistenceDelegate.java Mon Jun 12 21:51:41 2006 @@ -16,6 +16,7 @@ /** * @author Maxim V. Berkultsev + * @author Alexei Y. Zakharov * @version $Revision: 1.1.2.1 $ */ package org.apache.harmony.beans; @@ -28,11 +29,12 @@ /** * @author Maxim V. Berkultsev + * @author Alexei Y. Zakharov * @version $Revision: 1.1.2.1 $ */ public class ArrayPersistenceDelegate extends PersistenceDelegate { - + private static PersistenceDelegate pd = null; public static PersistenceDelegate getInstance() { @@ -43,12 +45,13 @@ } protected Expression instantiate(Object oldInstance, Encoder out) { - Class type = getArrayWrapperClass(oldInstance.getClass()); int length = Array.getLength(oldInstance); - return new Expression(oldInstance, type, "new", - new Object[] { new Integer(length) }); + Class componentType = oldInstance.getClass().getComponentType(); + + return new Expression(oldInstance, Array.class, "newInstance", + new Object[] { componentType, new Integer(length) }); } - + protected void initialize( Class type, Object oldInstance, Object newInstance, Encoder out) { int length = Array.getLength(oldInstance); @@ -77,32 +80,30 @@ } } - - private static Class getArrayWrapperClass(Class type) { - Class result = type; - if(type == boolean[].class) { - result = Boolean[].class; - } else if(type == byte[].class) { - result = Byte[].class; - } else if(type == char[].class) { - result = Character[].class; - } else if(type == double[].class) { - result = Double[].class; - } else if(type == float[].class) { - result = Float[].class; - } else if(type == int[].class) { - result = Integer[].class; - } else if(type == long[].class) { - result = Long[].class; - } else if(type == short[].class) { - result = Short[].class; - } - return result; - } - - // Added for testing purposes + protected boolean mutatesTo(Object oldInstance, Object newInstance) { + if (oldInstance != null && newInstance != null) { + Class oldCl = oldInstance.getClass(); + Class newCl = newInstance.getClass(); + + if (oldCl.isArray() && !newCl.isArray() || + newCl.isArray() && !oldCl.isArray()) { + return false; + } else if (oldCl.isArray() && newCl.isArray()) { + // both are arrays + int l1 = Array.getLength(oldInstance); + int l2 = Array.getLength(newInstance); + Class cType1 = oldCl.getComponentType(); + Class cType2 = newCl.getComponentType(); + + if (l1 == l2 && cType1.equals(cType2)) { + return true; + } else { + return false; + } + } + } + // both are nulls or have non-Array type return super.mutatesTo(oldInstance, newInstance); } - } Modified: incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java?rev=413807&r1=413806&r2=413807&view=diff ============================================================================== --- incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java (original) +++ incubator/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java Mon Jun 12 21:51:41 2006 @@ -16,6 +16,7 @@ /** * @author Maxim V. Berkultsev + * @author Alexei Y. Zakharov * @version $Revision: 1.1.2.1 $ */ package org.apache.harmony.beans; @@ -23,9 +24,11 @@ import java.beans.Encoder; import java.beans.Expression; import java.beans.PersistenceDelegate; +import java.lang.reflect.Field; /** * @author Maxim V. Berkultsev + * @author Alexei Y. Zakharov * @version $Revision: 1.1.2.1 $ */ @@ -33,8 +36,41 @@ protected Expression instantiate(Object oldInstance, Encoder out) { Class value = (Class) oldInstance; - return new Expression(oldInstance, Class.class, "forName", + Field fld = null; + final String TYPE = "TYPE"; + Expression result; + + try { + if (value.equals(Integer.TYPE)) { + fld = Integer.class.getField(TYPE); + } else if (value.equals(Short.TYPE)) { + fld = Short.class.getField(TYPE); + } else if (value.equals(Long.TYPE)) { + fld = Long.class.getField(TYPE); + } else if (value.equals(Float.TYPE)) { + fld = Float.class.getField(TYPE); + } else if (value.equals(Double.TYPE)) { + fld = Double.class.getField(TYPE); + } else if (value.equals(Byte.TYPE)) { + fld = Byte.class.getField(TYPE); + } else if (value.equals(Character.TYPE)) { + fld = Character.class.getField(TYPE); + } else if (value.equals(Boolean.TYPE)) { + fld = Boolean.class.getField(TYPE); + } + } catch (NoSuchFieldException e) { + // impossible situation for valid java.lang classes + // implementation with version >= 1.1 + } + if (fld != null) { + // we have primitive type + result = new Expression(oldInstance, fld, "get", + new Object[] {null}); + } else { + result = new Expression(oldInstance, Class.class, "forName", new Object[] { new String(value.getName()) }); + } + return result; } protected void initialize(