I have created a XSL-FO filter, it reacts on a parameter and then pulls
the contents of the response through Apache's FOP. Simple exercise and
it almost works.
In order to capture the response output I have created a
BufferedHttpResponseWrapper and BufferedServletOutputStream similar to
the O'Reilly example
(http://www.unix.com.ua/orelly/xml/jxslt/ch08_04.htm). The filter reacts
to any url and the behavior is determined by a parameter being present
or not.
<filter>
<filter-name>XsltfoFilter</filter-name>
<filter-class>nl.knowledgeplaza.filters.XsltfoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XsltfoFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Now, if the filter captures the result of a servlet, then it works
perfectly:
public class XslfoTestServlet extends HttpServlet
{
public void doGet(final HttpServletRequest request, final
HttpServletResponse response) throws IOException, ServletException
{
PrintWriter lWriter = response.getWriter();
lWriter.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
lWriter.append("<fo:root
xmlns:fo=\"http://www.w3.org/1999/XSL/Format\">\n");
lWriter.append(" <fo:layout-master-set>\n");
lWriter.append(" <fo:simple-page-master
master-name=\"A4-portrait\"\n");
lWriter.append(" page-height=\"29.7cm\"
page-width=\"21.0cm\" margin=\"2cm\">\n");
lWriter.append(" <fo:region-body/>\n");
lWriter.append(" </fo:simple-page-master>\n");
lWriter.append(" </fo:layout-master-set>\n");
lWriter.append(" <fo:page-sequence
master-reference=\"A4-portrait\">\n");
lWriter.append(" <fo:flow flow-name=\"xsl-region-body\">\n");
lWriter.append(" <fo:block>\n");
lWriter.append(" Hello world!\n");
lWriter.append(" </fo:block>\n");
lWriter.append(" </fo:flow>\n");
lWriter.append(" </fo:page-sequence>\n");
lWriter.append("</fo:root>\n");
IOUtil.close(lWriter);
}
}
The filter's log says:
>> XSLFO
>> Content: 514 bytes
The content denotes the captured number of bytes by the
BufferedServletOutputStream. I get a nice PDF and all is well...
But if I use exactly the same XSL-FO source in a file I get this:
>> XSLFO
>> Content: 0 bytes
[Fatal Error] :-1:-1: Premature end of file.
[http-8080-1] |/CheyenneServlet,
session=F7CCB78F6878465CC3BE3DBBC7F874DF| 2008-11-04 10:14:12,125 ERROR
nl.knowledgeplaza.filters.XsltfoFilter.doFilter(XsltfoFilter.java:137) -
=========== 2008-11-04 10:14:12
javax.xml.transform.TransformerException: org.xml.sax.SAXParseException:
Premature end of file.
at
org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:501)
at
nl.knowledgeplaza.filters.XsltfoFilter.doFilter(XsltfoFilter.java:132)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at
org.tbee.servlets.util.ConfigurationPropertiesFilter.doFilter(ConfigurationPropertiesFilter.java:194)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: org.xml.sax.SAXParseException: Premature end of file.
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at
org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
... 16 more
I can however access the file directly (the filter will not try to
capture the output when the parameter is not present) and the content is
returned correctly.
It seems that when accessing the file, there are no calls made to the
"public void write(int data)" in the BufferedServletOutputStream. I
added some debugging there and the method simply is not called. I tried
flushing the original response, closing its stream, but to no avail.
Increasing the file size suddenly does make it write to the outputstream:
>> XSLFO
>> Content: 1766 bytes
But then there is an error in stating the generate PDF is corrupt. It
seems this has something to do with buffers... From servlet works
perfectly, from a file does not.
Any suggestions?
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]