/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.util.exception;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.io.Serializable;
/**
* This class can package up an exception in a non-object-serialized form to send to a remote system that might not have
* the exception class available for deserialization.
*
* @author Greg Hinkle
* @author John Mazzitelli
* @see WrappedRemotingException
*/
public class ExceptionPackage implements Serializable {
private static final long serialVersionUID = 1L;
private final String exceptionName;
private final Severity severity;
private final String message;
private final ExceptionPackage cause;
private final String stackTrace;
private final String allMessages;
/**
* Constructor for {@link ExceptionPackage} that assumes the severity is {@link Severity#Warning}.
*
* @param throwable
*
* @throws IllegalArgumentException if <code>throwable</code> is <code>null</code>
*/
public ExceptionPackage(Throwable throwable) throws IllegalArgumentException {
this(null, throwable);
}
/**
* Creates a new {@link ExceptionPackage} object. If the <code>severity</code> is <code>null</code>, then
* {@link Severity#Warning} is assumed.
*
* @param severity the importance of the exception (may be <code>null</code>)
* @param throwable
*
* @throws IllegalArgumentException if <code>throwable</code> is <code>null</code>
*/
public ExceptionPackage(Severity severity, Throwable throwable) throws IllegalArgumentException {
if (throwable == null) {
throw new IllegalArgumentException("throwable==null");
}
this.exceptionName = throwable.getClass().getName();
this.severity = (severity == null) ? Severity.Warning : severity;
this.message = throwable.getMessage();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintWriter pw = new PrintWriter(baos);
throwable.printStackTrace(pw);
pw.flush();
this.stackTrace = baos.toString();
if (throwable.getCause() != null) {
// this will iterate over all child causes by recursively calling the constructor
this.cause = new ExceptionPackage(severity, throwable.getCause());
} else {
this.cause = null;
}
this.allMessages = ThrowableUtil.getAllMessages(throwable);
return;
}
/**
* Returns the name of the actual exception being packaged. This is equivalent to the <code>
* getClass().getName()</code> value of the exception.
*
* @return the name of the exception
*/
public String getExceptionName() {
return exceptionName;
}
/**
* Returns the severity of the exception, which marks how important or severe the problem is.
*
* @return exception severity
*/
public Severity getSeverity() {
return severity;
}
/**
* Returns the message associated with the exception.
*
* @return exception message
*/
public String getMessage() {
return message;
}
/**
* Returns the cause of this exception in the same non-object-serialized form.
*
* @return exception cause
*/
public ExceptionPackage getCause() {
return cause;
}
/**
* Returns the stack trace for this exception but not of its cause.
*
* @return the exception stack trace of this particular exception.
*/
public String getStackTraceString() {
return stackTrace;
}
/**
* Returns all the messages for this throwable and all of its causes in one long string. This is useful for logging
* an exception when you don't want to dump the entire stack trace but you still want to see the throwable and all
* of its causes.
*
* @return string containing the throwable's message and its causes' messages in the order of the causes (the lowest
* nested throwable's message appears last in the string)
*/
public String getAllMessages() {
return allMessages;
}
/**
* Returns a string consisting of the exception's name, the severity and message of the exception.
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return exceptionName + ": [" + severity.toString() + "] " + message;
}
}