DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6981>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6981 XALAN throws EmptyStackException every two runs in a servlet Summary: XALAN throws EmptyStackException every two runs in a servlet Product: XalanJ2 Version: 2.2.0 Platform: PC OS/Version: Windows NT/2K Status: NEW Severity: Normal Priority: Other Component: Xalan AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] I have a simple XML document, a simple XSLT stylesheet and a simple testing servlet (actually the real files are significantly more complex, but I reduced it on the simplest structure that causes the error). The behaviour is that when I start the servlet and run the transformation the first time, everything works fine - the output should be: aaa bbb ccc sub bbb ccc The second request results into an EmptyStackException thrown in the deepness of XALAN. See this Stacktrace: javax.xml.transform.TransformerException: java.util.EmptyStackException at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1230) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:642) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1092) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1070) at com.iviews.test.XALANEmptyStackExcpetionTestServlet.doGet(XALANEmptyStackExcpetionTestServlet.java:42) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503) at org.apache.tomcat.core.ContextManager.service(ContextManager.java:559) at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:160) at org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.java:338) at java.lang.Thread.run(Thread.java:484) --------- java.util.EmptyStackException at java.util.Stack.peek(Stack.java:82) at java.util.Stack.pop(Stack.java:64) at org.apache.xpath.XPathContext.popContextNodeList(XPathContext.java:682) at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1179) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:642) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1092) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1070) at com.iviews.test.XALANEmptyStackExcpetionTestServlet.doGet(XALANEmptyStackExcpetionTestServlet.java:42) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503) at org.apache.tomcat.core.ContextManager.service(ContextManager.java:559) at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:160) at org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.java:338) at java.lang.Thread.run(Thread.java:484) The third request runs normal again, the fourth fails and so on. The error does not appear, if I remove a certain xsl:sort statement (see xslt file). Though the problem is quite annoying, somehow it seems to me an interesting behaviour. I tested all the last versions of XALAN and XERCES with the same result. If I run a simple java application that just does the transformation few times, no exception is thrown. My servlet container is tomcat 3.1 and 3.2 Regards Jonny Newald XML document EmptyStackExceptionTest.xml: <?xml version="1.0" encoding="UTF-8"?> <Test> <Config> <ItemConfig/> <SubtreeConfig> <Config> <ItemConfig/> </Config> </SubtreeConfig> </Config> <Response> <Item> <Name>ccc</Name> </Item> <Item> <Name>bbb</Name> </Item> <Item> <Name>aaa</Name> </Item> <Subtree> <Name>sub</Name> <Item> <Name>bbb</Name> </Item> <Item> <Name>ccc</Name> </Item> </Subtree> </Response> </Test> XSLT stylesheet EmptyStackExceptionTest.xslt: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" version="1.0" encoding="ISO-8859-1" omit-xml-declaration="yes"/> <xsl:template match="/Test"> <xsl:apply-templates select="Config"> <xsl:with-param name="data" select="Response"/> </xsl:apply-templates> </xsl:template> <xsl:template match="Config"> <xsl:param name="data" select="/.."/> <xsl:apply-templates select="ItemConfig | SubtreeConfig"> <xsl:with-param name="data" select="$data"/> </xsl:apply-templates> </xsl:template> <xsl:template match="ItemConfig"> <xsl:param name="data" select="/.."/> <xsl:for-each select="$data/Item"> <!-- To bad, XALAN throws every two runs a java.util.EmptyStackException, if this xsl:sort statement is activated --> <xsl:sort select="Name" order="ascending"/> <xsl:value-of select="Name"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> <xsl:template match="SubtreeConfig"> <xsl:param name="data" select="/.."/> <xsl:variable name="me" select="."/> <xsl:for-each select="$data/Subtree"> <xsl:sort select="Name" order="ascending"/> <xsl:value-of select="Name"/><xsl:text> </xsl:text> <xsl:apply-templates select="$me/Config"> <xsl:with-param name="data" select="."/> </xsl:apply-templates> </xsl:for-each> </xsl:template> </xsl:stylesheet> Testing Servlet: package com.iviews.test; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.w3c.dom.Document; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class XALANEmptyStackExcpetionTestServlet extends HttpServlet { private static final TransformerFactory tFactory = TransformerFactory.newInstance(); private static final DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); private Templates xsl; private Document doc; private static String xmlFileName = "Test/EmptyStackExceptionTest.xml"; private static String xslFileName = "Test/EmptyStackExceptionTest.xslt"; public void init(ServletConfig config) throws ServletException { super.init(config); try { doc = dFactory.newDocumentBuilder().parse(new FileInputStream(config.getServletContext().getRealPath(xmlFileName))); xsl = tFactory.newTemplates(new StreamSource(new File(config.getServletContext().getRealPath(xslFileName)))); } catch (Exception e) { throw new ServletException(e); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); PrintWriter out = response.getWriter(); try { xsl.newTransformer().transform(new DOMSource(doc),new StreamResult(out)); } catch (Exception e) { throw new ServletException(e); } } }
