/**
*
* Copyright 2004-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.geronimo.interop.util;
import java.io.BufferedReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.geronimo.interop.CheckedException;
import org.apache.geronimo.interop.SystemException;
public abstract class ExceptionUtil {
public static List addException(List exceptions, Throwable ex) {
if (exceptions == null) {
exceptions = new ArrayList(1);
}
exceptions.add(ex);
return exceptions;
}
public static void checkExceptions(List exceptions) {
if (exceptions != null) {
int n = exceptions.size();
if (n == 1) {
Throwable ex = (Throwable) exceptions.get(0);
if (ex instanceof Error) {
throw (Error) ex;
}
if (ex instanceof RuntimeException) {
throw (RuntimeException) ex;
}
throw new SystemException(ex);
} else {
StringBuffer buffer = new StringBuffer();
for (Iterator i = exceptions.iterator(); i.hasNext();) {
Exception ex = (Exception) i.next();
if (buffer.length() > 0) {
buffer.append("\n______________________________________________________________\n\n");
}
buffer.append(ExceptionUtil.getStackTrace(ex));
}
throw new SystemException(buffer.toString());
}
}
}
public static String getDivider() {
return "\n ______________________________________________________________\n";
}
/**
* * Construct a detail message for an exception which doesn't take a
* * cause parameter in its constructor.
*/
public static String causedBy(Throwable ex) {
return "\nCaused by: " + getStackTrace(ex) + getDivider();
}
public static String causedBy(String stackTrace)
{
return "\nCaused by: " + getTraceLines(stackTrace);
}
public static Throwable getCause(Throwable ex)
{
for (;;)
{
if (ex instanceof SystemException)
{
SystemException se = (SystemException)ex;
if (se.getCause() != null && se.getMessage() == null)
{
ex = se.getCause();
}
else
{
break;
}
}
else
{
break;
}
}
return ex;
}
public static String getCauseChain(Throwable ex) {
String stackTrace = getStackTrace(ex);
return getCauseChain(stackTrace);
}
public static String getCauseChain(String stackTrace) {
try {
BufferedReader input = new BufferedReader(new StringReader(stackTrace));
StringBuffer output = new StringBuffer(100);
String line;
while ((line = input.readLine()) != null) {
line = line.trim();
if (!line.startsWith("at ") && !line.startsWith("... ")) {
output.append(line);
output.append('\n');
}
}
return output.toString();
} catch (Exception ex2) {
ex2.printStackTrace();
return stackTrace;
}
}
public static String getStackTrace(Throwable ex) {
java.io.StringWriter sw = new java.io.StringWriter();
java.io.PrintWriter pw = new java.io.PrintWriter(sw);
ex.printStackTrace(pw);
return sw.toString().trim();
}
public static String getTraceLines(String stackTrace)
{
try
{
BufferedReader input = new BufferedReader(new StringReader(stackTrace));
StringBuffer output = new StringBuffer(100);
String line;
boolean first = true;
while ((line = input.readLine()) != null)
{
line = line.trim();
if (line.length() != 0)
{
if (! first)
{
output.append("| ");
}
first = false;
output.append(line);
output.append('\n');
}
}
return output.toString();
}
catch (Exception ex2)
{
ex2.printStackTrace();
return stackTrace;
}
}
public static String getCurrentStackTrace() {
return StringUtil.removePrefix(getStackTrace(new Exception()), "java.lang.Exception:");
}
public static String indentLines(String lines) {
return " " + StringUtil.replace(lines.trim(), "\n", "\n ");
}
public static boolean isApplicationException(Throwable ex) {
return !isSystemException(ex);
}
public static boolean isSystemException(Throwable ex) {
Class exClass = ex.getClass();
return Error.class.isAssignableFrom(exClass)
|| RuntimeException.class.isAssignableFrom(exClass);
}
public static boolean isUserException(Class exClass) {
if (RuntimeException.class.isAssignableFrom(exClass)
|| Error.class.isAssignableFrom(exClass)) {
return false;
}
return true;
}
public static RuntimeException getRuntimeException(Exception ex) {
if (ex instanceof RuntimeException) {
return (RuntimeException) ex;
} else {
return new SystemException(ex);
}
}
public static RuntimeException rethrow(Throwable ex) {
if (ex instanceof Error) {
throw (Error) ex;
} else if (ex instanceof RuntimeException) {
return (RuntimeException) ex;
} else {
return new CheckedException(ex);
}
}
}