/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.vertical.adminweb;
import com.enonic.esl.util.VectorWriter;
import com.enonic.esl.xml.XMLTool;
import com.enonic.vertical.VerticalException;
import com.enonic.vertical.VerticalRuntimeException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.servlet.ServletException;
import java.io.PrintWriter;
public final class ThrowableUtil
{
/**
* ExceptionUtil constructor comment.
*/
private ThrowableUtil()
{
}
public static Document throwableToDoc( Element parentElem, Throwable t )
{
Document doc;
Element throwablesElem;
if ( parentElem == null )
{
doc = XMLTool.createDocument( "throwables" );
throwablesElem = doc.getDocumentElement();
}
else
{
doc = parentElem.getOwnerDocument();
throwablesElem = XMLTool.createElement( doc, parentElem, "throwables" );
}
if ( t != null )
{
Element root = throwablesElem;
Element prevThrowable = null;
String[] throwableStackTrace = null;
do
{
Element throwable = XMLTool.createElement( doc, "throwable" );
XMLTool.createElement( doc, throwable, "class", t.getClass().getName() );
if ( t instanceof VerticalException )
{
VerticalException ve = (VerticalException) t;
XMLTool.createElement( doc, throwable, "message", ve.getMessage() );
StackTraceElement[] stackTrace = ve.getStackTrace();
Element stacktraceElem = XMLTool.createElement( doc, throwable, "stacktrace" );
for ( int i = 0; i < stackTrace.length; i++ )
{
XMLTool.createElement( doc, stacktraceElem, "stacktraceitem", stackTrace[i].toString() );
}
t = ve.getCause();
}
else if ( t instanceof VerticalRuntimeException )
{
VerticalRuntimeException vre = (VerticalRuntimeException) t;
XMLTool.createElement( doc, throwable, "message", vre.getMessage() );
StackTraceElement[] stackTrace = vre.getStackTrace();
Element stacktraceElem = XMLTool.createElement( doc, throwable, "stacktrace" );
for ( int i = 0; i < stackTrace.length; i++ )
{
XMLTool.createElement( doc, stacktraceElem, "stacktraceitem", stackTrace[i].toString() );
}
t = vre.getCause();
}
else
{
String message = t.getMessage();
if ( message != null )
{
XMLTool.createElement( doc, throwable, "message", message );
}
else
{
XMLTool.createElement( doc, throwable, "message", "null" );
}
Element stacktraceElem = XMLTool.createElement( doc, throwable, "stacktrace" );
if ( throwableStackTrace != null )
{
for ( int i = 0; i < throwableStackTrace.length; i++ )
{
XMLTool.createElement( doc, stacktraceElem, "stacktraceitem", throwableStackTrace[i] );
}
}
else
{
VectorWriter vw = new VectorWriter();
t.printStackTrace( new PrintWriter( vw ) );
String[] stackTrace = vw.toStringArray();
for ( int i = 0; i < stackTrace.length; i++ )
{
XMLTool.createElement( doc, stacktraceElem, "stacktraceitem", stackTrace[i] );
}
}
if ( t instanceof ServletException )
{
t = ( (ServletException) t ).getRootCause();
}
else
{
t = null;
}
}
root.appendChild( throwable );
prevThrowable = throwable;
}
while ( t != null );
}
return doc;
}
}