/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.vertical.adminweb;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import com.enonic.cms.core.xslt.XsltProcessorErrors;
import com.enonic.cms.core.xslt.XsltProcessorException;
/**
* This class implements the base render functions.
*/
final class DataSourceFailedXmlCreator
{
/**
* Build exception document.
*/
public static Document buildExceptionDocument( final String resultRootName, Throwable e )
{
Document doc = new Document( new Element( resultRootName ) );
Element root = doc.getRootElement();
for ( Throwable tmp : findAllExceptions( e ) )
{
root.addContent( buildExceptionElement( tmp ) );
}
return doc;
}
/**
* Build exception exception.
*/
private static Element buildExceptionElement( Throwable e )
{
Element root = new Element( "exception" );
String clzName = e.getClass().getName();
String message = e.getMessage();
root.addContent( new Element( "class" ).setText( clzName ) );
if ( message != null )
{
root.addContent( new Element( "message" ).setText( message ) );
}
Element trace = new Element( "trace" );
root.addContent( trace );
for ( StackTraceElement traceElem : e.getStackTrace() )
{
Element elem = new Element( "element" );
elem.setAttribute( "class", traceElem.getClassName() );
elem.setAttribute( "method", traceElem.getMethodName() );
elem.setAttribute( "line", "" + traceElem.getLineNumber() );
trace.addContent( elem );
}
Element causes = new Element( "causes" );
root.addContent( causes );
for ( Throwable cause : getCauses( e ) )
{
causes.addContent( buildExceptionElement( cause ) );
}
return root;
}
/**
* Return the causes.
*/
private static List<Throwable> getCauses( Throwable e )
{
ArrayList<Throwable> causes = new ArrayList<Throwable>();
Throwable cause = e.getCause();
while ( cause != null )
{
causes.add( cause );
cause = cause.getCause();
}
return causes;
}
/**
* Find all exceptions.
*/
private static List<Throwable> findAllExceptions( Throwable ex )
{
LinkedList<Throwable> list = new LinkedList<Throwable>();
findAllExceptions( list, ex );
return list;
}
/**
* Find all exceptions.
*/
private static void findAllExceptions( List<Throwable> list, Throwable ex )
{
if ( ex instanceof XsltProcessorException )
{
XsltProcessorErrors errors = ( (XsltProcessorException) ex ).getErrors();
list.addAll( errors.getAllErrors() );
}
else
{
list.add( ex );
if ( ex.getCause() != null )
{
findAllExceptions( list, ex.getCause() );
}
}
}
}