# HG changeset patch # User dmeetry # Date 1370536843 -14400 # Node ID e827e84fc26579ae6364a0c06d581de2a30c71a7 # Parent 189f7f3d6acf6dc8a2930d1e736569d0723a00a8 8009579: Xpathexception does not honor initcause() Reviewed-by: alanb, dholmes, joehw Contributed-by: aleksej.efimov@oracle.com diff -r 189f7f3d6acf -r e827e84fc265 jaxp/src/javax/xml/xpath/XPathException.java --- a/jaxp/src/javax/xml/xpath/XPathException.java Tue Jun 04 21:33:07 2013 -0700 +++ b/jaxp/src/javax/xml/xpath/XPathException.java Thu Jun 06 20:40:43 2013 +0400 @@ -26,6 +26,11 @@ package javax.xml.xpath; import java.io.PrintWriter; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamField; +import java.io.InvalidClassException; /** * XPathException represents a generic XPath exception.

@@ -36,7 +41,9 @@ */ public class XPathException extends Exception { - private final Throwable cause; + private static final ObjectStreamField[] serialPersistentFields = { + new ObjectStreamField( "cause", Throwable.class ) + }; /** *

Stream Unique Identifier.

@@ -62,7 +69,6 @@ if ( message == null ) { throw new NullPointerException ( "message can't be null"); } - this.cause = null; } /** @@ -77,8 +83,7 @@ * @throws NullPointerException if cause is null. */ public XPathException(Throwable cause) { - super(); - this.cause = cause; + super(cause); if ( cause == null ) { throw new NullPointerException ( "cause can't be null"); } @@ -90,7 +95,47 @@ * @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 ObjectOutputStream + * + */ + 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 ObjectInputStream + * @throws ClassNotFoundException thrown by ObjectInputStream + */ + private void readObject(ObjectInputStream in) + throws IOException, ClassNotFoundException + { + ObjectInputStream.GetField fields = in.readFields(); + Throwable scause = (Throwable) fields.get("cause", null); + + if (super.getCause() == null && scause != null) { + try { + super.initCause(scause); + } catch(IllegalStateException e) { + throw new InvalidClassException("Inconsistent state: two causes"); + } + } } /**