--- old/jaxp/src/javax/xml/xpath/XPathException.java 2013-05-24 20:30:00.670389120 +0400 +++ new/jaxp/src/javax/xml/xpath/XPathException.java 2013-05-24 20:30:00.594389124 +0400 @@ -26,6 +26,10 @@ package javax.xml.xpath; import java.io.PrintWriter; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamField; /** * XPathException represents a generic XPath exception.

@@ -35,9 +39,11 @@ * @since 1.5 */ public class XPathException extends Exception { - - private final Throwable cause; - + + private static final ObjectStreamField[] serialPersistentFields = { + new ObjectStreamField( "cause", Throwable.class ) + }; + /** *

Stream Unique Identifier.

*/ @@ -62,9 +68,8 @@ if ( message == null ) { throw new NullPointerException ( "message can't be null"); } - this.cause = null; } - + /** *

Constructs a new XPathException * with the specified cause.

@@ -77,8 +82,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,8 +94,45 @@ * @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); + try { + if (super.getCause() == null && scause != null) + super.initCause(scause); + } catch(IllegalStateException e) { + } + } /** *

Print stack trace to specified PrintStream.