src/share/classes/javax/sql/rowset/serial/SerialClob.java
Print this page
@@ -1,7 +1,7 @@
/*
- * 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -25,10 +25,12 @@
package javax.sql.rowset.serial;
import java.sql.*;
import java.io.*;
+import java.util.Arrays;
+import java.util.Objects;
/**
* A serialized mapping in the Java programming language of an SQL
* <code>CLOB</code> value.
* <P>
@@ -58,11 +60,11 @@
/**
* Internal Clob representation if SerialClob is initialized with a
* Clob. Null if SerialClob is initialized with a char[].
*/
- private final Clob clob;
+ private Clob clob;
/**
* The length in characters of this <code>SerialClob</code> object's
* internal array of characters.
*
@@ -74,11 +76,11 @@
* The original length in characters of this <code>SerialClob</code>
* object's internal array of characters.
*
* @serial
*/
- private final long origLen;
+ private long origLen;
/**
* Constructs a <code>SerialClob</code> object that is a serialized version of
* the given <code>char</code> array.
* <p>
@@ -511,10 +513,100 @@
}
public void free() throws SQLException {
throw new java.lang.UnsupportedOperationException("Not supported");
}
+ /**
+ * Compares this SerialClob to the specified object. The result is {@code
+ * true} if and only if the argument is not {@code null} and is a {@code
+ * SerialClob} object that represents the same sequence of characters as this
+ * object.
+ *
+ * @param obj
+ * The object to compare this {@code SerialClob} against
+ *
+ * @return {@code true} if the given object represents a {@code SerialClob}
+ * equivalent to this SerialClob, {@code false} otherwise
+ *
+ */
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if(obj == null || !(obj instanceof SerialClob)) {
+ return false;
+ }
+
+ SerialClob sc = (SerialClob)obj;
+ if(this.len == sc.len) {
+ return Arrays.equals(buf, sc.buf);
+ }
+ return false;
+ }
+
+ /**
+ * Returns a hash code for this {@code SerialClob}.
+ * @return a hash code value for this object.
+ */
+ public int hashCode() {
+ return Objects.hash(buf, len, origLen);
+ }
+
+ /**
+ * Returns a clone of this {@code SerialClob}. The copy will contain a
+ * reference to a clone of the internal character array, not a reference
+ * to the original internal character array of this {@code SerialClob} object.
+ * The internal {@code Clob} field will be set to null.
+ *
+ * @return a clone of this SerialClob
+ */
+ public Object clone() {
+ SerialClob sc = null;
+ try {
+ sc = (SerialClob) super.clone();
+ sc.buf = Arrays.copyOf(buf, (int)len);
+ sc.clob = null;
+
+ } catch (CloneNotSupportedException ex) {
+ // this shouldn't happen, since we are Cloneable
+ }
+ return sc;
+ }
+
+ /**
+ * readObject is called to restore the state of the SerialClob from
+ * a stream.
+ */
+ private void readObject(ObjectInputStream s)
+ throws IOException, ClassNotFoundException {
+
+ ObjectInputStream.GetField fields = s.readFields();
+ char[] tmp = (char[])fields.get("buf", null);
+ if (tmp == null)
+ throw new InvalidObjectException("buf is null and should not be!");
+ buf = tmp.clone();
+ len = fields.get("len", 0L);
+ origLen = fields.get("origLen", 0L);
+ clob = (Clob) fields.get("clob", null);
+ if(buf.length != len)
+ throw new InvalidObjectException("buf is not the expected size");
+ }
+
+ /**
+ * writeObject is called to save the state of the SerialClob
+ * to a stream.
+ */
+ private void writeObject(ObjectOutputStream s)
+ throws IOException, ClassNotFoundException {
+
+ ObjectOutputStream.PutField fields = s.putFields();
+ fields.put("buf", buf);
+ fields.put("len", len);
+ fields.put("origLen", origLen);
+ fields.put("clob", clob instanceof Serializable ? clob : null);
+ s.writeFields();
+ }
/**
* The identifier that assists in the serialization of this <code>SerialClob</code>
* object.
*/