Initial load
diff --git a/test/java/util/Hashtable/ReadObject.java b/test/java/util/Hashtable/ReadObject.java
new file mode 100644
index 0000000..0f1a61a
--- /dev/null
+++ b/test/java/util/Hashtable/ReadObject.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 4652911
+ * @summary test Hashtable readObject for invocation of overridable put method
+ */
+import java.util.Hashtable;
+
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+
+/**
+ * Class that extends Hashtable to demonstrate bug when
+ * subclass wraps the values put into the Hashtable.
+ */
+public class ReadObject extends Hashtable {
+ /**
+ * Wraps the values put into MyHashtable objects
+ */
+ class ValueWrapper implements Serializable {
+ private Object mValue;
+
+ ValueWrapper(Object value) {
+ mValue = value;
+ }
+
+ Object getValue() {
+ return mValue;
+ }
+ };
+
+ public Object get(Object key) {
+ ValueWrapper valueWrapper = (ValueWrapper)super.get(key);
+ Object value = valueWrapper.getValue();
+ if(value instanceof ValueWrapper)
+ throw new RuntimeException("Hashtable.get bug");
+ return value;
+ }
+
+ public Object put(Object key, Object value) {
+ if(value instanceof ValueWrapper)
+ throw new RuntimeException(
+ "Hashtable.put bug: value is already wrapped");
+ ValueWrapper valueWrapper = new ValueWrapper(value);
+ super.put(key, valueWrapper);
+ return value;
+ }
+
+ private static Object copyObject(Object oldObj) {
+ Object newObj = null;
+ try {
+ //Create a stream in which to serialize the object.
+ ByteArrayOutputStream ostream = new ByteArrayOutputStream();
+ ObjectOutputStream p = new ObjectOutputStream(ostream);
+ //Serialize the object into the stream
+ p.writeObject(oldObj);
+
+ //Create an input stream from which to deserialize the object
+ byte[] byteArray = ostream.toByteArray();
+ ByteArrayInputStream istream = new ByteArrayInputStream(byteArray);
+ ObjectInputStream q = new ObjectInputStream(istream);
+ //Deserialize the object
+ newObj = q.readObject();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ return newObj;
+ }
+
+ public static void main(String[] args) {
+ ReadObject myHashtable = new ReadObject();
+ myHashtable.put("key", "value");
+ ReadObject myHashtableCopy = (ReadObject)copyObject(myHashtable);
+ String value = (String)myHashtableCopy.get("key");
+ }
+};