XPathException.java revision 726:68a9fc5c3567
1/*
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package javax.xml.xpath;
27
28import java.io.PrintWriter;
29import java.io.IOException;
30import java.io.ObjectInputStream;
31import java.io.ObjectOutputStream;
32import java.io.ObjectStreamField;
33import java.io.InvalidClassException;
34
35/**
36 * {@code XPathException} represents a generic XPath exception.
37 *
38 * @author  <a href="Norman.Walsh@Sun.com">Norman Walsh</a>
39 * @author <a href="mailto:Jeff.Suttor@Sun.COM">Jeff Suttor</a>
40 * @since 1.5
41 */
42public class XPathException extends Exception {
43
44    private static final ObjectStreamField[] serialPersistentFields = {
45        new ObjectStreamField( "cause", Throwable.class )
46    };
47
48    /**
49     * Stream Unique Identifier.
50     */
51    private static final long serialVersionUID = -1837080260374986980L;
52
53    /**
54     * Constructs a new {@code XPathException}
55     * with the specified detail {@code message}.
56     *
57     * <p>The {@code cause} is not initialized.
58     *
59     * <p>If {@code message} is {@code null},
60     * then a {@code NullPointerException} is thrown.
61     *
62     * @param message The detail message.
63     *
64     * @throws NullPointerException When {@code message} is
65     *   {@code null}.
66     */
67    public XPathException(String message) {
68        super(message);
69        if ( message == null ) {
70            throw new NullPointerException ( "message can't be null");
71        }
72    }
73
74    /**
75     * Constructs a new {@code XPathException}
76     * with the specified {@code cause}.
77     *
78     * <p>If {@code cause} is {@code null},
79     * then a {@code NullPointerException} is thrown.
80     *
81     * @param cause The cause.
82     *
83     * @throws NullPointerException if {@code cause} is {@code null}.
84     */
85    public XPathException(Throwable cause) {
86        super(cause);
87        if ( cause == null ) {
88            throw new NullPointerException ( "cause can't be null");
89        }
90    }
91
92    /**
93     * Get the cause of this XPathException.
94     *
95     * @return Cause of this XPathException.
96     */
97    public Throwable getCause() {
98        return super.getCause();
99    }
100
101    /**
102     * Writes "cause" field to the stream.
103     * The cause is got from the parent class.
104     *
105     * @param out stream used for serialization.
106     * @throws IOException thrown by {@code ObjectOutputStream}
107     *
108     */
109    private void writeObject(ObjectOutputStream out)
110            throws IOException
111    {
112        ObjectOutputStream.PutField fields = out.putFields();
113        fields.put("cause", (Throwable) super.getCause());
114        out.writeFields();
115    }
116
117    /**
118     * Reads the "cause" field from the stream.
119     * And initializes the "cause" if it wasn't
120     * done before.
121     *
122     * @param in stream used for deserialization
123     * @throws IOException thrown by {@code ObjectInputStream}
124     * @throws ClassNotFoundException  thrown by {@code ObjectInputStream}
125     */
126    private void readObject(ObjectInputStream in)
127            throws IOException, ClassNotFoundException
128    {
129        ObjectInputStream.GetField fields = in.readFields();
130        Throwable scause = (Throwable) fields.get("cause", null);
131
132        if (super.getCause() == null && scause != null) {
133            try {
134                super.initCause(scause);
135            } catch(IllegalStateException e) {
136                throw new InvalidClassException("Inconsistent state: two causes");
137            }
138        }
139    }
140
141    /**
142     * Print stack trace to specified {@code PrintStream}.
143     *
144     * @param s Print stack trace to this {@code PrintStream}.
145     */
146    public void printStackTrace(java.io.PrintStream s) {
147        if (getCause() != null) {
148            getCause().printStackTrace(s);
149          s.println("--------------- linked to ------------------");
150        }
151
152        super.printStackTrace(s);
153    }
154
155    /**
156     * Print stack trace to {@code System.err}.
157     */
158    public void printStackTrace() {
159        printStackTrace(System.err);
160    }
161
162    /**
163     * Print stack trace to specified {@code PrintWriter}.
164     *
165     * @param s Print stack trace to this {@code PrintWriter}.
166     */
167    public void printStackTrace(PrintWriter s) {
168
169        if (getCause() != null) {
170            getCause().printStackTrace(s);
171          s.println("--------------- linked to ------------------");
172        }
173
174        super.printStackTrace(s);
175    }
176}
177