<?xml version="1.0" encoding="utf-8"?>
<!-- XSLT Web Services Framework (XWSF)

  Copyright (C) 2002, Regenstrief Institute. 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 as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  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 for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

  Written and maintained by Gunther Schadow <gschadow@regenstrief.org>
  Regenstrief Institute for Health Care
  1050 Wishard Blvd., Indianapolis, IN 46202, USA.

  $Id: exception.xsl,v 1.1.1.1 2005/02/17 00:45:51 gschadow Exp $
-->
<xsl:transform version="2.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:saxon="http://saxon.sf.net/"
   xmlns:ex="http://xwsf.sf.net/net.sf.xwsf.saxon.ExceptionElementFactory"
   xmlns:exd="http://xwsf.sf.net/exception"
   xmlns:ste="java:java.lang.StackTraceElement"
   xmlns:twb="java:java.lang.Throwable"
   xmlns:sqx="java:java.sql.SQLException"
   xmlns:xfx="java:javax.xml.transform.TransformerException"
   xmlns:slc="java:javax.xml.transform.SourceLocator"
   xmlns:svx="java:javax.servlet.ServletException"
   xmlns:ars="java:java.util.Arrays"
   xmlns:obj="java:java.lang.Object"
   xmlns:cls="java:java.lang.Class"
   extension-element-prefixes="ex saxon"
   exclude-result-prefixes="ex exd saxon ste twb ars obj cls xfx sqx slc svx">

  <!-- DUMP AN EXCEPTION AS AN EXCEPTION NODE -->

  <xsl:template name="exd:dump">
    <xsl:param name="name" select="'exception'"/>
    <xsl:param name="ex" select="ex:current-exception()"/>
    <!-- xsl:sequence select="twb:printStackTrace($ex)"/ -->
    <xsl:element name="exception" namespace="">
      <xsl:attribute name="class">
        <xsl:value-of select="cls:getName(obj:getClass($ex))"/>
      </xsl:attribute>
      <xsl:call-template name="exd:dump-attributes">
	<xsl:with-param name="ex" select="$ex"/>
      </xsl:call-template>
      <xsl:call-template name="exd:dump-elements">
	<xsl:with-param name="ex" select="$ex"/>
      </xsl:call-template>
    </xsl:element>
  </xsl:template>


  <!-- EXCEPTION'S DATA AS XML ATTRIBUTES -->

  <xsl:template name="exd:dump-attributes">
    <xsl:param name="ex" select="ex:current-exception()"/>
    <xsl:param name="exd:class">
      <xsl:value-of select="cls:getName(obj:getClass($ex))"/>
    </xsl:param>
    <xsl:attribute name="class">
      <xsl:value-of select="$exd:class"/>
    </xsl:attribute>
    <xsl:apply-templates mode="exd:dump-attributes"
	   select="$exd:class">
      <xsl:with-param name="ex" select="$ex"/>
    </xsl:apply-templates>
  </xsl:template>

  <!-- special templates for special exceptions' attributes -->

  <xsl:template mode="exd:dump-attributes" 
                 match="text()[.='java.sql.SQLException']">
    <xsl:param name="ex" select="ex:current-exception()"/>
    <xsl:attribute name="errorCode">
      <xsl:value-of select="string(sqx:getErrorCode($ex))"/>
    </xsl:attribute>
    <xsl:attribute name="SQLState">
      <xsl:value-of select="string(sqx:getSQLState($ex))"/>
    </xsl:attribute>
  </xsl:template>


  <xsl:template mode="exd:dump-attributes" match="text()">
    <xsl:param name="ex" select="ex:current-exception()"/>
  </xsl:template>


  <!-- EXCEPTION'S DATA AS XML ELEMENTS -->

  <xsl:template name="exd:dump-elements">
    <xsl:param name="ex" select="ex:current-exception()"/>
    <xsl:param name="exd:class">
      <xsl:value-of select="cls:getName(obj:getClass($ex))"/>
    </xsl:param>
    <xsl:param name="cause" select="twb:getCause($ex)"/>  

    <message>
      <xsl:value-of select="string(twb:getMessage($ex))"/>
    </message>
    <xsl:call-template name="exd:stack-dump">
      <xsl:with-param name="ex" select="$ex"/>
    </xsl:call-template>
    <xsl:if test="$cause">
      <xsl:call-template name="exd:dump">
	<xsl:with-param name="name" select="'cause'"/>
	<xsl:with-param name="ex" select="$cause"/>
      </xsl:call-template>
    </xsl:if>
    <xsl:apply-templates mode="exd:dump-elements"
	   select="$exd:class">
      <xsl:with-param name="ex" select="$ex"/>
    </xsl:apply-templates>
  </xsl:template>

  <!-- special templates for special exceptions' elements -->

  <xsl:template mode="exd:dump-elements" 
                 match="text()[.='javax.xml.transform.TransformerException']">
    <xsl:param name="ex" select="ex:current-exception()"/>
    <xsl:param name="wrapped" select="xfx:getException($ex)"/>  
    <xsl:param name="source" select="xfx:getLocator($ex)"/>  
    <xsl:if test="$source">
      <location publicId="{string(slc:getPublicId($source))}"
		systemId="{string(slc:getSystemId($source))}"
		line="{slc:getLineNumber($source)}"
		column="{slc:getColumnNumber($source)}">
        <xsl:value-of select="string(xfx:getLocationAsString($ex))"/>
      </location>
    </xsl:if>
    <xsl:if test="$wrapped">
      <xsl:call-template name="exd:dump">
	<xsl:with-param name="name" select="'exception'"/>
	<xsl:with-param name="ex" select="$wrapped"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

  <xsl:template mode="exd:dump-elements" 
                 match="text()[.='java.sql.SQLException']">
    <xsl:param name="ex" select="ex:current-exception()"/>
    <xsl:param name="next" select="sqx:getNextException($ex)"/>  

    <xsl:if test="$next">
      <xsl:call-template name="exd:dump">
	<xsl:with-param name="name" select="'nextException'"/>
	<xsl:with-param name="ex" select="$next"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

  <xsl:template mode="exd:dump-elements" 
                 match="text()[.='javax.servlet.ServletException']">
    <xsl:param name="ex" select="ex:current-exception()"/>
    <xsl:param name="rootCause" select="svx:getRootCause($ex)"/>  

    <xsl:if test="$rootCause">
      <xsl:call-template name="exd:dump">
	<xsl:with-param name="name" select="'rootCause'"/>
	<xsl:with-param name="ex" select="$rootCause"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
  
  <xsl:template mode="exd:dump-elements" match="text()">
    <xsl:param name="ex" select="ex:current-exception()"/>
  </xsl:template>


  <!-- STACK DUMP -->

  <xsl:template name="exd:stack-dump">
    <xsl:param name="ex" select="ex:current-exception()"/>
    <stack-dump>
      <xsl:call-template name="exd:stack-dump-content">
	<xsl:with-param name="ex" select="$ex"/>
      </xsl:call-template>
    </stack-dump>
  </xsl:template>

  <xsl:template name="exd:stack-dump-content">
    <xsl:param name="ex" select="ex:current-exception()"/>
    <!-- xsl:value-of select="twb:printStackTrace($ex)"/ -->
    <xsl:for-each select="twb:getStackTrace($ex)[position() le 10]">
      <frame file="{ste:getFileName(.)}" line="{ste:getLineNumber(.)}"
		class="{ste:getClassName(.)}" method="{ste:getMethodName(.)}"
		native="{ste:isNativeMethod(.)}"/>
    </xsl:for-each>
  </xsl:template>

</xsl:transform>
