• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * $RCSfile$
3  * $Revision$
4  * $Date$
5  *
6  * Copyright 2003-2007 Jive Software.
7  *
8  * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 package org.jivesoftware.smack;
22 
23 import org.jivesoftware.smack.packet.StreamError;
24 import org.jivesoftware.smack.packet.XMPPError;
25 
26 import java.io.PrintStream;
27 import java.io.PrintWriter;
28 
29 /**
30  * A generic exception that is thrown when an error occurs performing an
31  * XMPP operation. XMPP servers can respond to error conditions with an error code
32  * and textual description of the problem, which are encapsulated in the XMPPError
33  * class. When appropriate, an XMPPError instance is attached instances of this exception.<p>
34  *
35  * When a stream error occured, the server will send a stream error to the client before
36  * closing the connection. Stream errors are unrecoverable errors. When a stream error
37  * is sent to the client an XMPPException will be thrown containing the StreamError sent
38  * by the server.
39  *
40  * @see XMPPError
41  * @author Matt Tucker
42  */
43 public class XMPPException extends Exception {
44 
45     private StreamError streamError = null;
46     private XMPPError error = null;
47     private Throwable wrappedThrowable = null;
48 
49     /**
50      * Creates a new XMPPException.
51      */
XMPPException()52     public XMPPException() {
53         super();
54     }
55 
56     /**
57      * Creates a new XMPPException with a description of the exception.
58      *
59      * @param message description of the exception.
60      */
XMPPException(String message)61     public XMPPException(String message) {
62         super(message);
63     }
64 
65     /**
66      * Creates a new XMPPException with the Throwable that was the root cause of the
67      * exception.
68      *
69      * @param wrappedThrowable the root cause of the exception.
70      */
XMPPException(Throwable wrappedThrowable)71     public XMPPException(Throwable wrappedThrowable) {
72         super();
73         this.wrappedThrowable = wrappedThrowable;
74     }
75 
76     /**
77      * Cretaes a new XMPPException with the stream error that was the root case of the
78      * exception. When a stream error is received from the server then the underlying
79      * TCP connection will be closed by the server.
80      *
81      * @param streamError the root cause of the exception.
82      */
XMPPException(StreamError streamError)83     public XMPPException(StreamError streamError) {
84         super();
85         this.streamError = streamError;
86     }
87 
88     /**
89      * Cretaes a new XMPPException with the XMPPError that was the root case of the
90      * exception.
91      *
92      * @param error the root cause of the exception.
93      */
XMPPException(XMPPError error)94     public XMPPException(XMPPError error) {
95         super();
96         this.error = error;
97     }
98 
99     /**
100      * Creates a new XMPPException with a description of the exception and the
101      * Throwable that was the root cause of the exception.
102      *
103      * @param message a description of the exception.
104      * @param wrappedThrowable the root cause of the exception.
105      */
XMPPException(String message, Throwable wrappedThrowable)106     public XMPPException(String message, Throwable wrappedThrowable) {
107         super(message);
108         this.wrappedThrowable = wrappedThrowable;
109     }
110 
111     /**
112      * Creates a new XMPPException with a description of the exception, an XMPPError,
113      * and the Throwable that was the root cause of the exception.
114      *
115      * @param message a description of the exception.
116      * @param error the root cause of the exception.
117      * @param wrappedThrowable the root cause of the exception.
118      */
XMPPException(String message, XMPPError error, Throwable wrappedThrowable)119     public XMPPException(String message, XMPPError error, Throwable wrappedThrowable) {
120         super(message);
121         this.error = error;
122         this.wrappedThrowable = wrappedThrowable;
123     }
124 
125     /**
126      * Creates a new XMPPException with a description of the exception and the
127      * XMPPException that was the root cause of the exception.
128      *
129      * @param message a description of the exception.
130      * @param error the root cause of the exception.
131      */
XMPPException(String message, XMPPError error)132     public XMPPException(String message, XMPPError error) {
133         super(message);
134         this.error = error;
135     }
136 
137     /**
138      * Returns the XMPPError asscociated with this exception, or <tt>null</tt> if there
139      * isn't one.
140      *
141      * @return the XMPPError asscociated with this exception.
142      */
getXMPPError()143     public XMPPError getXMPPError() {
144         return error;
145     }
146 
147     /**
148      * Returns the StreamError asscociated with this exception, or <tt>null</tt> if there
149      * isn't one. The underlying TCP connection is closed by the server after sending the
150      * stream error to the client.
151      *
152      * @return the StreamError asscociated with this exception.
153      */
getStreamError()154     public StreamError getStreamError() {
155         return streamError;
156     }
157 
158     /**
159      * Returns the Throwable asscociated with this exception, or <tt>null</tt> if there
160      * isn't one.
161      *
162      * @return the Throwable asscociated with this exception.
163      */
getWrappedThrowable()164     public Throwable getWrappedThrowable() {
165         return wrappedThrowable;
166     }
167 
printStackTrace()168     public void printStackTrace() {
169         printStackTrace(System.err);
170     }
171 
printStackTrace(PrintStream out)172     public void printStackTrace(PrintStream out) {
173         super.printStackTrace(out);
174         if (wrappedThrowable != null) {
175             out.println("Nested Exception: ");
176             wrappedThrowable.printStackTrace(out);
177         }
178     }
179 
printStackTrace(PrintWriter out)180     public void printStackTrace(PrintWriter out) {
181         super.printStackTrace(out);
182         if (wrappedThrowable != null) {
183             out.println("Nested Exception: ");
184             wrappedThrowable.printStackTrace(out);
185         }
186     }
187 
getMessage()188     public String getMessage() {
189         String msg = super.getMessage();
190         // If the message was not set, but there is an XMPPError, return the
191         // XMPPError as the message.
192         if (msg == null && error != null) {
193             return error.toString();
194         }
195         else if (msg == null && streamError != null) {
196             return streamError.toString();
197         }
198         return msg;
199     }
200 
toString()201     public String toString() {
202         StringBuilder buf = new StringBuilder();
203         String message = super.getMessage();
204         if (message != null) {
205             buf.append(message).append(": ");
206         }
207         if (error != null) {
208             buf.append(error);
209         }
210         if (streamError != null) {
211             buf.append(streamError);
212         }
213         if (wrappedThrowable != null) {
214             buf.append("\n  -- caused by: ").append(wrappedThrowable);
215         }
216 
217         return buf.toString();
218     }
219 }