jaxp/src/javax/xml/xpath/XPathException.java

Print this page

        

@@ -24,21 +24,27 @@
  */
 
 package javax.xml.xpath;
 
 import java.io.PrintWriter;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
 
 /**
  * <code>XPathException</code> represents a generic XPath exception.</p>
  *
  * @author  <a href="Norman.Walsh@Sun.com">Norman Walsh</a>
  * @author <a href="mailto:Jeff.Suttor@Sun.COM">Jeff Suttor</a>
  * @since 1.5
  */
 public class XPathException extends Exception {
 
-    private final Throwable cause;
+    private static final ObjectStreamField[] serialPersistentFields = {
+        new ObjectStreamField( "cause", Throwable.class )
+    };
 
     /**
      * <p>Stream Unique Identifier.</p>
      */
     private static final long serialVersionUID = -1837080260374986980L;

@@ -60,11 +66,10 @@
     public XPathException(String message) {
         super(message);
         if ( message == null ) {
             throw new NullPointerException ( "message can't be null");
         }
-        this.cause = null;
     }
 
     /**
      * <p>Constructs a new <code>XPathException</code>
      * with the specified <code>cause</code>.</p>

@@ -75,12 +80,11 @@
      * @param cause The cause.
      *
      * @throws NullPointerException if <code>cause</code> is <code>null</code>.
      */
     public XPathException(Throwable cause) {
-        super();
-        this.cause = cause;
+        super(cause);
         if ( cause == null ) {
             throw new NullPointerException ( "cause can't be null");
         }
     }
 

@@ -88,11 +92,48 @@
      * <p>Get the cause of this XPathException.</p>
      *
      * @return Cause of this XPathException.
      */
     public Throwable getCause() {
-        return cause;
+        return super.getCause();
+    }
+    
+    /**
+     * Writes "cause" field to the stream. 
+     * The cause is got from the parent class.
+     * 
+     * @param out stream used for serialization.
+     * @throws IOException thrown by <code>ObjectOutputStream</code>
+     * 
+     */
+    private void writeObject(ObjectOutputStream out) 
+            throws IOException 
+    {
+        ObjectOutputStream.PutField fields = out.putFields();
+        fields.put("cause", (Throwable) super.getCause());
+        out.writeFields();
+    }
+    
+    /**
+     * Reads the "cause" field from the stream.
+     * And initializes the "cause" if it wasn't 
+     * done before.
+     * 
+     * @param in stream used for deserialization
+     * @throws IOException thrown by <code>ObjectInputStream</code>
+     * @throws ClassNotFoundException  thrown by <code>ObjectInputStream</code>
+     */
+    private void readObject(ObjectInputStream in) 
+            throws IOException, ClassNotFoundException 
+    {
+        ObjectInputStream.GetField fields = in.readFields();
+        Throwable scause = (Throwable) fields.get("cause", null);
+        try {
+            if (super.getCause() == null && scause != null)
+                super.initCause(scause);
+        } catch(IllegalStateException e) {
+        }
     }
 
     /**
      * <p>Print stack trace to specified <code>PrintStream</code>.</p>
      *