/*******************************************************************************
 * Copyright (c) 2001, 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal;



/**
 * Base exception class for non-runtime exceptions, where a caught exception
 * causes this exception to be thrown
 */
public abstract class WrappedException extends Exception implements IWrappedException {
	/**
	 * 
	 */
	private static final long serialVersionUID = 2477488574387544467L;
	/** The exception which necessitated this exception */
	protected Exception nestedException;

public WrappedException() {
	super();
}
public WrappedException(Exception e) {
	super();
	setNestedException(e);
}
public WrappedException(String s) {
	super(s);
}
public WrappedException(String s, Exception e) {
	super(s);
	setNestedException(e);
}
/**
 * Return the messages from this and all nested exceptions, in order from outermost to innermost
 */
public java.lang.String[] getAllMessages() {
	return ExceptionHelper.getAllMessages(this);
}
/**
 * Return the messages from this and all nested exceptions, in order from outermost to innermost,
 * concatenated as one
 */
public java.lang.String getConcatenatedMessages() {
	return ExceptionHelper.getConcatenatedMessages(this);
}
public java.lang.Exception getNestedException() {
	return nestedException;
}
/**
 * Added to provide compatibility for the Java 1.4.2 addition of
 * <code>Throwable.getCause()</code>.
 */
@Override
public java.lang.Throwable getCause() {
	return getNestedException();
}
/**
 * Print out a stack trace to the system err.
 */
@Override
public void printStackTrace() {
	printStackTrace(System.err);
}
/**
* Prints the exception to System.err.
* If we have a nested exception, print its stack.
*/
@Override
public void printStackTrace(java.io.PrintStream s) {
	if (nestedException != null) {
		s.println(this);
		s.println(MOFJ2EEResourceHandler.Stack_trace_of_nested_exce); // = "Stack trace of nested exception:"
		nestedException.printStackTrace(s);
	} else {
		super.printStackTrace(s);
	}
}
/**
* Prints the exception to System.err.
* If we have a nested exception, print its stack.
*/
@Override
public void printStackTrace(java.io.PrintWriter s) {
	if (nestedException != null) {
		s.println(this);
		s.println(MOFJ2EEResourceHandler.Stack_trace_of_nested_exce); // = "Stack trace of nested exception:"
		nestedException.printStackTrace(s);
	} else {
		super.printStackTrace(s);
	}
}
public void setNestedException(java.lang.Exception newNestedException) {
	nestedException = newNestedException;
    initCause(newNestedException);
}
}


