You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ml...@apache.org on 2006/06/13 06:51:42 UTC
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/
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 @@
<fileset dir="${hy.beans.src.test.internal}">
<include name="**/*Test.java"/>
<!-- Excluded pending investigation -->
- <exclude name="org/apache/harmony/beans/ArrayPersistenceDelegateTest.java" />
<exclude name="org/apache/harmony/beans/ClassPersistenceDelegateTest.java" />
<exclude name="org/apache/harmony/beans/StringPersistenceDelegateTest.java" />
</fileset>
@@ -169,11 +168,9 @@
<exclude name="org/apache/harmony/beans/tests/java/beans/ExpressionTest.java" />
<exclude name="org/apache/harmony/beans/tests/java/beans/FeatureDescriptorTest.java" />
<exclude name="org/apache/harmony/beans/tests/java/beans/IndexedPropertyDescriptorTest.java" />
- <exclude name="org/apache/harmony/beans/tests/java/beans/IntrospectionExceptionTest.java" />
<exclude name="org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java" />
<exclude name="org/apache/harmony/beans/tests/java/beans/MethodDescriptorTest.java" />
<exclude name="org/apache/harmony/beans/tests/java/beans/PersistenceDelegateTest.java" />
- <exclude name="org/apache/harmony/beans/tests/java/beans/PropertyChangeEventTest.java" />
<exclude name="org/apache/harmony/beans/tests/java/beans/PropertyChangeSupportTest.java" />
<exclude name="org/apache/harmony/beans/tests/java/beans/PropertyDescriptorTest.java" />
<exclude name="org/apache/harmony/beans/tests/java/beans/PropertyEditorManagerTest.java" />
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(