You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2007/08/23 23:28:44 UTC
svn commit: r569151 - in /harmony/enhanced/classlib/trunk/modules/luni/src:
main/java/java/io/ObjectInputStream.java
main/java/java/io/ObjectStreamClass.java
test/api/common/tests/api/java/io/ObjectInputStreamTest.java
Author: tellison
Date: Thu Aug 23 14:28:43 2007
New Revision: 569151
URL: http://svn.apache.org/viewvc?rev=569151&view=rev
Log:
Apply patch for HARMONY-4638 ([classlib][luni] ObjectStreamClass.lookup() incorrectly works)
Modified:
harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java
harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java
harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java?rev=569151&r1=569150&r2=569151&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java Thu Aug 23 14:28:43 2007
@@ -1618,9 +1618,7 @@
Integer oldHandle = descriptorHandle;
descriptorHandle = Integer.valueOf(nextHandle());
classDesc = readClassDescriptor();
- if (descriptorHandle != null) {
- registerObjectRead(classDesc, descriptorHandle, false);
- }
+ registerObjectRead(classDesc, descriptorHandle, false);
descriptorHandle = oldHandle;
primitiveData = emptyStream;
classDesc.setClass(resolveClass(classDesc));
@@ -1700,9 +1698,7 @@
Integer oldHandle = descriptorHandle;
descriptorHandle = Integer.valueOf(nextHandle());
ObjectStreamClass newClassDesc = readClassDescriptor();
- if (descriptorHandle != null) {
- registerObjectRead(newClassDesc, descriptorHandle, unshared);
- }
+ registerObjectRead(newClassDesc, descriptorHandle, unshared);
descriptorHandle = oldHandle;
primitiveData = emptyStream;
@@ -1792,7 +1788,6 @@
descriptorHandle = (null == descriptorHandle ? Integer
.valueOf(nextHandle()) : descriptorHandle);
registerObjectRead(newClassDesc, descriptorHandle, false);
- descriptorHandle = null;
readFieldDescriptors(newClassDesc);
return newClassDesc;
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java?rev=569151&r1=569150&r2=569151&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectStreamClass.java Thu Aug 23 14:28:43 2007
@@ -232,6 +232,23 @@
result.setFields(new ObjectStreamField[0]);
}
+ // Copy all fields to loadFields - they should be read by default in
+ // ObjectInputStream.defaultReadObject() method
+ ObjectStreamField[] fields = result.getFields();
+
+ if (fields != null) {
+ ObjectStreamField[] loadFields = new ObjectStreamField[fields.length];
+
+ for (int i = 0; i < fields.length; ++i) {
+ loadFields[i] = new ObjectStreamField(fields[i].getName(),
+ fields[i].getType(), fields[i].isUnshared());
+
+ // resolve type string to init typeString field in ObjectStreamField
+ loadFields[i].getTypeString();
+ }
+ result.setLoadFields(loadFields);
+ }
+
byte flags = 0;
boolean externalizable = isExternalizable(cl);
if (externalizable) {
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java?rev=569151&r1=569150&r2=569151&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java Thu Aug 23 14:28:43 2007
@@ -32,12 +32,15 @@
import java.io.ObjectOutputStream;
import java.io.ObjectStreamClass;
import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
import java.io.Serializable;
import java.io.SerializablePermission;
import java.io.StreamCorruptedException;
import java.security.Permission;
import java.util.Arrays;
import java.util.Hashtable;
+import java.util.HashMap;
import java.util.Vector;
import org.apache.harmony.testframework.serialization.SerializationTest;
@@ -711,8 +714,7 @@
Object obj = ois.readObject();
ois.close();
assertEquals(cls, obj);
- }
-
+ }
// Regression Test for JIRA-2340
public static class ObjectOutputStreamWithWriteDesc1 extends
@@ -921,6 +923,59 @@
public void setCorrupt(boolean corrupt) {
this.corrupt = corrupt;
}
+ }
+
+ public static class ObjectIutputStreamWithReadDesc2 extends
+ ObjectInputStream {
+ private Class returnClass;
+
+ public ObjectIutputStreamWithReadDesc2(InputStream is, Class returnClass)
+ throws IOException {
+ super(is);
+ this.returnClass = returnClass;
+ }
+
+ public ObjectStreamClass readClassDescriptor() throws IOException,
+ ClassNotFoundException {
+ ObjectStreamClass osc = super.readClassDescriptor();
+
+ if (osc.getName().equals(returnClass.getName())) {
+ return ObjectStreamClass.lookup(returnClass);
+ }
+ return osc;
+ }
+ }
+
+ /*
+ * Testing classDescriptor replacement with the value generated by
+ * ObjectStreamClass.lookup() method.
+ * Regression test for HARMONY-4638
+ */
+ public void test_readClassDescriptor_1() throws IOException, ClassNotFoundException {
+ A a = new A();
+ a.name = "It's a test";
+ PipedOutputStream pout = new PipedOutputStream();
+ PipedInputStream pin = new PipedInputStream(pout);
+ ObjectOutputStream out = new ObjectOutputStream(pout);
+ ObjectInputStream in = new ObjectIutputStreamWithReadDesc2(pin, A.class);
+
+ // test single object
+ out.writeObject(a);
+ A a1 = (A) in.readObject();
+ assertEquals("Single case: incorrectly read the field of A", a.name, a1.name);
+
+ // test cyclic reference
+ HashMap m = new HashMap();
+ a = new A();
+ a.name = "It's a test 0";
+ a1 = new A();
+ a1.name = "It's a test 1";
+ m.put("0", a);
+ m.put("1", a1);
+ out.writeObject(m);
+ HashMap m1 = (HashMap) in.readObject();
+ assertEquals("Incorrectly read the field of A", a.name, ((A) m1.get("0")).name);
+ assertEquals("Incorrectly read the field of A1", a1.name, ((A) m1.get("1")).name);
}
public void test_registerValidation() throws Exception {