You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2006/11/21 18:03:27 UTC

svn commit: r477748 - in /harmony/enhanced/classlib/trunk/modules/luni/src: main/java/java/io/ObjectOutputStream.java test/java/tests/api/java/io/ObjectOutputStreamTest.java

Author: pyang
Date: Tue Nov 21 09:03:26 2006
New Revision: 477748

URL: http://svn.apache.org/viewvc?view=rev&rev=477748
Log:
Apply patch for HARMONY-2239 ( [classlib][luni]ObjectOutputStream fails to call ReplaceObject while the serialized class is int.class)

Modified:
    harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectOutputStream.java
    harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectOutputStreamTest.java

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectOutputStream.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectOutputStream.java?view=diff&rev=477748&r1=477747&r2=477748
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectOutputStream.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectOutputStream.java Tue Nov 21 09:03:26 2006
@@ -1843,14 +1843,15 @@
 		nestedLevels++;
 		try {
 
-			// Is it a Class ?
-			if (objClass == ObjectStreamClass.CLASSCLASS) {
-				return writeNewClass((Class) object, unshared);
-			}
-
-			// Is it an ObjectStreamClass ?
-			if (objClass == ObjectStreamClass.OBJECTSTREAMCLASSCLASS) {
-				return writeClassDesc((ObjectStreamClass) object, unshared);
+			if (!(enableReplace && computeStreamReplacement)) {
+				// Is it a Class ?
+				if (objClass == ObjectStreamClass.CLASSCLASS) {
+					return writeNewClass((Class) object, unshared);
+				}
+				// Is it an ObjectStreamClass ?
+				if (objClass == ObjectStreamClass.OBJECTSTREAMCLASSCLASS) {
+					return writeClassDesc((ObjectStreamClass) object, unshared);
+				}
 			}
 
 			if (ObjectStreamClass.isSerializable(object.getClass()) && computeClassBasedReplacement) {

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectOutputStreamTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectOutputStreamTest.java?view=diff&rev=477748&r1=477747&r2=477748
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectOutputStreamTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/ObjectOutputStreamTest.java Tue Nov 21 09:03:26 2006
@@ -29,6 +29,7 @@
 import java.io.ObjectInputStream;
 import java.io.ObjectOutput;
 import java.io.ObjectOutputStream;
+import java.io.ObjectStreamClass;
 import java.io.ObjectStreamException;
 import java.io.ObjectStreamField;
 import java.io.OutputStream;
@@ -454,6 +455,22 @@
 			return new Integer(42);
 		}
 	}
+	
+	private static class WriteReplaceObject implements Serializable {
+        private Object replaceObject;
+
+        private static enum Color {
+            red, blue, green
+        };
+
+        public WriteReplaceObject(Object o) {
+            replaceObject = o;
+        }
+
+        protected Object writeReplace() throws ObjectStreamException {
+            return replaceObject;
+        }
+    }
 
 	private static class ExternalizableWithReplace implements Externalizable {
 		private int foo;
@@ -486,6 +503,19 @@
             }
         }
     }
+        
+    private static class ObjectOutputStreamWithReplace2 extends
+            ObjectOutputStream {
+        public ObjectOutputStreamWithReplace2(OutputStream out)
+                throws IOException {
+            super(out);
+            enableReplaceObject(true);
+        }
+
+        protected Object replaceObject(Object obj) throws IOException {
+            return new Long(10);
+        }
+    }
 
 	protected static final String MODE_XLOAD = "xload";
 
@@ -1185,5 +1215,43 @@
         oos.close();
         ois.close();
         assertTrue("replaceObject has not been called", (obj instanceof Long));
-    }
+
+		//Regression for HARMONY-2239
+		Object replaceObject = int.class;
+		baos = new ByteArrayOutputStream();
+		ObjectOutputStreamWithReplace2 oos2 = new ObjectOutputStreamWithReplace2(
+				baos);
+		oos2.writeObject(new WriteReplaceObject(replaceObject));
+		oos2.flush();
+		ois = new ObjectInputStream(
+				new ByteArrayInputStream(baos.toByteArray()));
+		obj = ois.readObject();
+		oos.close();
+		ois.close();
+		assertTrue("replaceObject has not been called", (obj instanceof Long));
+
+		replaceObject = ObjectStreamClass.lookup(Integer.class);
+		baos = new ByteArrayOutputStream();
+		oos2 = new ObjectOutputStreamWithReplace2(baos);
+		oos2.writeObject(new WriteReplaceObject(replaceObject));
+		oos2.flush();
+		ois = new ObjectInputStream(
+				new ByteArrayInputStream(baos.toByteArray()));
+		obj = ois.readObject();
+		oos.close();
+		ois.close();
+		assertTrue("replaceObject has not been called", (obj instanceof Long));
+
+		replaceObject = WriteReplaceObject.Color.red;
+		baos = new ByteArrayOutputStream();
+		oos2 = new ObjectOutputStreamWithReplace2(baos);
+		oos2.writeObject(new WriteReplaceObject(replaceObject));
+		oos2.flush();
+		ois = new ObjectInputStream(
+				new ByteArrayInputStream(baos.toByteArray()));
+		obj = ois.readObject();
+		oos.close();
+		ois.close();
+		assertTrue("replaceObject has not been called", (obj instanceof Long));
+	}
 }