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.
      */