You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by "Hans van Rijswijk (JIRA)" <xa...@xml.apache.org> on 2008/11/13 16:28:44 UTC

[jira] Created: (XALANJ-2466) XSLT transform throws java.lang.StackOverflowError on docbook document containing large table

XSLT transform throws java.lang.StackOverflowError on docbook document containing large table
---------------------------------------------------------------------------------------------

                 Key: XALANJ-2466
                 URL: https://issues.apache.org/jira/browse/XALANJ-2466
             Project: XalanJ2
          Issue Type: Bug
      Security Level: No security risk; visible to anyone (Ordinary problems in Xalan projects.  Anybody can view the issue.)
    Affects Versions: 2.7.1
         Environment: Windows XP, Eclipse
            Reporter: Hans van Rijswijk


Transforming a docbook document with Xalan ends up with a java.lang.StackOverflowError.
I am using Xalan-J version 2.7.1, docbook-xsl version 1.74.0, docbook-xml version 4.5.

The following small Java program ilustrates this.
Setting NUMROWS  to a lower value makes the error disappear. However, I need this program to run with large tables too. 
Scaleability is a high priority issue. I think something has been solved in a recursive way, which makes the transformation of large tables not scaleable.
I am running the program under Eclipse with standard stack size settings. The error also appears in other environments.

package test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

/**
 * 
 * Xalan Processor
 * 
 */
public class XalanProcessor {

	public static int NUMROWS = 700;
	
	public static final String CHARSETNAME = "utf-8";
	public static TransformerFactory tFactory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl", XalanProcessor.class.getClassLoader());
	public static void transform(Source src, URL xsltUri, OutputStream out, final OutputStream debug) 
	throws TransformerConfigurationException, TransformerException {
		// Setup Transformer
		Source xsltSrc = new StreamSource(xsltUri.toExternalForm());
		Transformer transformer = tFactory.newTransformer(xsltSrc);
		
		if (debug != null) {
			try {
			debug.write("newTransformer successful".getBytes(CHARSETNAME));
			} catch (IOException e){
				
			}
		}
		Result res = new StreamResult(out);

		// Start the transformation process
		transformer.transform(src, res);
	}

	
	private static File _reportFile = null;
	private static OutputStream _reportStream;
	private static File _transformedFile;

	public static void main(String[] args) {
		URL xsltUri = null;
		OutputStream _transformedStream = null;
		OutputStream _debugStream = null;
		
		try {
			_reportFile = File.createTempFile("Report", ".tmp");
			_reportStream = new FileOutputStream(_reportFile);
			String string = "<!DOCTYPE book PUBLIC \"-//OASIS//DTD DocBook XML V4.5//EN\"\n" +
					"\"file:\\Documents and Settings\\hans\\workspace1\\xalan-fop-stacktest\\formatting\\docbook-xml-4.5\\docbookx.dtd\">\n" +
					"<book>\n" +
					"<title>Report</title>\n" +
					"\n" +
					"<chapter>\n" +
					"<title>First Section</title>\n" +
					"\n" +
					"<para>Some para.</para>\n" +
					"<para>Some list:<itemizedlist>\n" +
					"<listitem><para>A listitem</para></listitem>\n" +
					"</itemizedlist>\n" +
					"</para>\n" +
					"<sect1><title>Sect title</title><table>\n" +
					"<title>Table title</title>\n" +
					"<tgroup cols=\"1\"><colspec colname=\"leftcol\"/><colspec colnum=\"1\" colname=\"rightcol\"/><spanspec spanname=\"allcolumns\" namest=\"leftcol\" nameend=\"rightcol\"/>\n" +
					"<thead>\n" +
					"<row>\n" +
					"<entry><![CDATA[name]]></entry>\n" +
					"</row>\n" +
					"</thead>\n" +
					"<tbody>\n";
			_reportStream.write(string.getBytes(CHARSETNAME));
			
			for (int i = 1; i <= NUMROWS; i++) {
				string = "<row>\n" +
				"<entry><![CDATA[name"+i+"]]></entry>\n" +
				"</row>\n" ;
				_reportStream.write(string.getBytes(CHARSETNAME));
			}
			string = "</tbody>\n" +
					"</tgroup>\n" +
					"</table>\n" +
					"</sect1>\n" +
					"</chapter>\n" +
					"</book>\n";
			_reportStream.write(string.getBytes(CHARSETNAME));
			_reportStream.close();
			
			_transformedFile = File.createTempFile("Output", ".fo");
			_transformedStream = new FileOutputStream(_transformedFile);

		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		try {
			xsltUri = new URL("file:\\Documents and Settings\\hans\\workspace1\\xalan-fop-stacktest\\formatting\\docbook-xsl-1.74.0\\fo\\docbook.xsl");
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		}
		
		try {
			XalanProcessor.transform(new StreamSource(_reportFile), xsltUri, _transformedStream, _debugStream);
			_transformedStream.close();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("Done");
	}
	
}


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-dev-help@xml.apache.org