001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/enterprise/ServiceException.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2006 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/deegree/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 This library is free software; you can redistribute it and/or
012 modify it under the terms of the GNU Lesser General Public
013 License as published by the Free Software Foundation; either
014 version 2.1 of the License, or (at your option) any later version.
015
016 This library is distributed in the hope that it will be useful,
017 but WITHOUT ANY WARRANTY; without even the implied warranty of
018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019 Lesser General Public License for more details.
020
021 You should have received a copy of the GNU Lesser General Public
022 License along with this library; if not, write to the Free Software
023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024
025 Contact:
026
027 Andreas Poth
028 lat/lon GmbH
029 Aennchenstr. 19
030 53115 Bonn
031 Germany
032 E-Mail: poth@lat-lon.de
033
034 Prof. Dr. Klaus Greve
035 Department of Geography
036 University of Bonn
037 Meckenheimer Allee 166
038 53115 Bonn
039 Germany
040 E-Mail: greve@giub.uni-bonn.de
041
042
043 ---------------------------------------------------------------------------*/
044 package org.deegree.enterprise;
045
046 // JDK 1.3
047 import java.io.PrintStream;
048 import java.io.PrintWriter;
049 import java.io.StringWriter;
050
051 /**
052 * The <code>ServiceException</code> class is used across all core framework services and is also
053 * suitable for use by developers extending the framework using the framework SPI.
054 *
055 * Based on code published by Terren Suydam in JavaWorld
056 *
057 * @see <a href="http://www.javaworld.com/javaworld/javatips/jw-javatip91.html">JavaWorld tip 91</a>
058 *
059 * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </A>
060 * @author last edited by: $Author: apoth $
061 *
062 * @version $Revision: 6696 $, $Date: 2007-04-25 21:57:05 +0200 (Mi, 25 Apr 2007) $
063 */
064 public class ServiceException extends Exception implements java.io.Serializable {
065
066 /**
067 *
068 */
069 private static final long serialVersionUID = 1L;
070
071 // the nested exception
072 private Throwable nestedException;
073
074 // String representation of stack trace - not transient!
075 private String stackTraceString;
076
077 /**
078 * Convert a stack trace to a String so it can be serialized
079 * @param t
080 *
081 * @return
082 */
083 public static String generateStackTraceString( Throwable t ) {
084 StringWriter s = new StringWriter();
085
086 t.printStackTrace( new PrintWriter( s ) );
087
088 return s.toString();
089 }
090
091 /**
092 * java.lang.Exception constructors
093 */
094 public ServiceException() {
095 }
096
097 /**
098 * Constructor declaration
099 *
100 * @param msg
101 *
102 */
103 public ServiceException( String msg ) {
104 super( msg );
105 }
106
107 /**
108 * additional c'tors - nest the exceptions, storing the stack trace
109 *
110 * @param nestedException
111 */
112 public ServiceException( Throwable nestedException ) {
113 this.nestedException = nestedException;
114 stackTraceString = generateStackTraceString( nestedException );
115 }
116
117 /**
118 * Constructor declaration
119 *
120 *
121 * @param msg
122 * @param nestedException
123 *
124 *
125 */
126 public ServiceException( String msg, Throwable nestedException ) {
127 this( msg );
128
129 this.nestedException = nestedException;
130 stackTraceString = generateStackTraceString( nestedException );
131 }
132
133 // methods
134
135 /**
136 * Method declaration
137 *
138 *
139 * @return nestedException
140 *
141 */
142 public Throwable getNestedException() {
143 return nestedException;
144 }
145
146 /**
147 * descend through linked-list of nesting exceptions, & output trace note that this displays the
148 * 'deepest' trace first
149 *
150 * @return
151 *
152 */
153 public String getStackTraceString() {
154
155 // if there's no nested exception, there's no stackTrace
156 if ( nestedException == null ) {
157 return null;
158 }
159
160 StringBuffer traceBuffer = new StringBuffer();
161
162 if ( nestedException instanceof ServiceException ) {
163 traceBuffer.append( ( (ServiceException) nestedException ).getStackTraceString() );
164 traceBuffer.append( " nested by:\n" );
165 }
166
167 traceBuffer.append( stackTraceString );
168
169 return traceBuffer.toString();
170 }
171
172 // overrides Exception.getMessage()
173
174 /**
175 * Method declaration
176 *
177 *
178 * @return
179 *
180 */
181 public String getMessage() {
182
183 // superMsg will contain whatever String was passed into the
184 // constructor, and null otherwise.
185 String superMsg = super.getMessage();
186
187 // if there's no nested exception, do like we would always do
188 if ( getNestedException() == null ) {
189 return superMsg;
190 }
191
192 StringBuffer theMsg = new StringBuffer();
193
194 // get the nested exception's message
195 String nestedMsg = getNestedException().getMessage();
196
197 if ( superMsg != null ) {
198 theMsg.append( superMsg ).append( ": " ).append( nestedMsg );
199 } else {
200 theMsg.append( nestedMsg );
201 }
202
203 return theMsg.toString();
204 }
205
206 // overrides Exception.toString()
207
208 /**
209 * Method declaration
210 *
211 *
212 * @return
213 *
214 */
215 public String toString() {
216 StringBuffer theMsg = new StringBuffer( super.toString() );
217
218 if ( getNestedException() != null ) {
219 theMsg.append( "; \n\t---> nested " ).append( getNestedException() );
220 }
221
222 return theMsg.toString();
223 }
224
225 /**
226 * Method declaration
227 *
228 *
229 *
230 */
231 public void printStackTrace() {
232 if ( this.getNestedException() != null ) {
233 this.getNestedException().printStackTrace();
234 } else {
235 super.printStackTrace();
236 }
237 }
238
239 /**
240 * Method declaration
241 *
242 *
243 * @param inPrintStream
244 *
245 *
246 */
247 public void printStackTrace( PrintStream inPrintStream ) {
248 this.printStackTrace( new PrintWriter( inPrintStream ) );
249 }
250
251 /**
252 * Method declaration
253 *
254 *
255 * @param inPrintWriter
256 *
257 *
258 */
259 public void printStackTrace( PrintWriter inPrintWriter ) {
260 if ( this.getNestedException() != null ) {
261 this.getNestedException().printStackTrace( inPrintWriter );
262 } else {
263 super.printStackTrace( inPrintWriter );
264 }
265 }
266
267 }
268
269 /***************************************************************************************************
270 * <code>
271 Changes to this class. What the people have been up to:
272 $Log$
273 Revision 1.10 2007/03/06 10:02:20 wanhoff
274 Fixed Javadoc (@url removed - link in @see tag)
275
276 Revision 1.9 2007/01/26 13:21:18 wanhoff
277 fixed Javadoc @return tag and footer
278
279 Revision 1.8 2006/07/12 14:46:18 poth
280 comment footer added
281
282 </code>
283 **************************************************************************************************/