001: /*
002: * ========================================================================
003: *
004: * Copyright 2001-2003 The Apache Software Foundation.
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: *
018: * ========================================================================
019: */
020: package org.apache.cactus.internal.client;
021:
022: import java.io.PrintStream;
023: import java.io.PrintWriter;
024:
025: /**
026: * Wrapper around a <code>Throwable</code> object. Whenever an exception occurs
027: * in a test case executed on the server side, the text of this exception
028: * along with the stack trace as a String are sent back in the HTTP response.
029: * This is because some exceptions are not serializable and because the stack
030: * trace is implemented as a <code>transient</code> variable by the JDK so it
031: * cannot be transported in the response. However, we need to send a real
032: * exception object to JUnit so that the exception stack trace will be printed
033: * in the JUnit console. This class does this by being a <code>Throwable</code>
034: * and overloading the <code>printStackTrace()</code> methods to print a
035: * text stack trace.
036: *
037: * @version $Id: ServletExceptionWrapper.java 238991 2004-05-22 11:34:50Z vmassol $
038: */
039: public class ServletExceptionWrapper extends Throwable {
040: /**
041: * The stack trace that was sent back from the servlet redirector as a
042: * string.
043: */
044: private String stackTrace;
045:
046: /**
047: * The class name of the exception that was raised on the server side.
048: */
049: private String className;
050:
051: /**
052: * Standard throwable constructor.
053: *
054: * @param theMessage the exception message
055: */
056: public ServletExceptionWrapper(String theMessage) {
057: super (theMessage);
058: }
059:
060: /**
061: * Standard throwable constructor.
062: */
063: public ServletExceptionWrapper() {
064: super ();
065: }
066:
067: /**
068: * The constructor to use to simulate a real exception.
069: *
070: * @param theMessage the server exception message
071: * @param theClassName the server exception class name
072: * @param theStackTrace the server exception stack trace
073: */
074: public ServletExceptionWrapper(String theMessage,
075: String theClassName, String theStackTrace) {
076: super (theMessage);
077: this .className = theClassName;
078: this .stackTrace = theStackTrace;
079: }
080:
081: /**
082: * Simulates a printing of a stack trace by printing the string stack trace
083: *
084: * @param thePs the stream to which to output the stack trace
085: */
086: public void printStackTrace(PrintStream thePs) {
087: if (this .stackTrace == null) {
088: thePs.print(getMessage());
089: } else {
090: thePs.print(this .stackTrace);
091: }
092: }
093:
094: /**
095: * Simulates a printing of a stack trace by printing the string stack trace
096: *
097: * @param thePw the writer to which to output the stack trace
098: */
099: public void printStackTrace(PrintWriter thePw) {
100: if (this .stackTrace == null) {
101: thePw.print(getMessage());
102: } else {
103: thePw.print(this .stackTrace);
104: }
105: }
106:
107: /**
108: * @return the wrapped class name
109: */
110: public String getWrappedClassName() {
111: return this.className;
112: }
113: }
|