--- old/src/share/classes/javax/sql/rowset/serial/SerialJavaObject.java 2012-11-02 18:37:42.000000000 -0400 +++ new/src/share/classes/javax/sql/rowset/serial/SerialJavaObject.java 2012-11-02 18:37:41.000000000 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. 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 @@ -27,6 +27,8 @@ import java.io.*; import java.lang.reflect.*; +import java.util.Arrays; +import java.util.Vector; import javax.sql.rowset.RowSetWarning; /** @@ -49,7 +51,7 @@ /** * Placeholder for object to be serialized. */ - private final Object obj; + private Object obj; /** @@ -132,7 +134,7 @@ } /** - * The identifier that assists in the serialization of this + * The identifier that assists in the serialization of this * SerialJavaObject object. */ static final long serialVersionUID = -1465795139032831023L; @@ -142,15 +144,96 @@ * object. When there are multiple warnings, each warning is chained to the * previous warning. */ - java.util.Vector chain; + Vector chain; + + /** + * Compares this SerialJavaObject to the specified object. + * The result is {@code true} if and only if the argument + * is not {@code null} and is a {@code SerialJavaObject} + * object that is identical to this object + * + * @param o The object to compare this {@code SerialJavaObject} against + * + * @return {@code true} if the given object represents a {@code SerialJavaObject} + * equivalent to this SerialJavaObject, {@code false} otherwise + * + */ + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o instanceof SerialJavaObject) { + if(this.obj.equals( ((SerialJavaObject)o).obj)) + return true; + } + return false; + } + + /** + * Returns a hash code for this SerialJavaObject. The hash code for a + * {@code SerialJavaObject} object is taken as the hash code of + * the {@code Object} it stores + * + * @return a hash code value for this object. + */ + public int hashCode() { + return 31 + obj.hashCode(); + } + + /** + * Returns a clone of this {@code SerialJavaObject}. + * + * @return a clone of this SerialJavaObject + */ + + public Object clone() { + try { + SerialJavaObject sjo = (SerialJavaObject) super.clone(); + sjo.fields = Arrays.copyOf(fields, fields.length); + if (chain != null) + sjo.chain = new Vector(chain); + return sjo; + } catch (CloneNotSupportedException ex) { + // this shouldn't happen, since we are Cloneable + throw new InternalError(); + } + } /** * Registers the given warning. */ private void setWarning(RowSetWarning e) { if (chain == null) { - chain = new java.util.Vector<>(); + chain = new Vector(); } chain.add(e); } + + /** + * readObject is called to restore the state of the {@code SerialJavaObject} + * from a stream. + */ + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + + ObjectInputStream.GetField fields1 = s.readFields(); + @SuppressWarnings("unchecked") + Vector tmp = (Vector)fields1.get("chain", null); + if (tmp != null) + chain = new Vector(tmp); + obj = fields1.get("obj", null); + fields = obj.getClass().getFields(); + } + + /** + * writeObject is called to save the state of the {@code SerialJavaObject} + * to a stream. + */ + private void writeObject(ObjectOutputStream s) + throws IOException { + ObjectOutputStream.PutField fields = s.putFields(); + fields.put("obj", obj); + fields.put("chain", chain); + s.writeFields(); + } }