All,
my email seems to be stuck in some sort of email filter, so I am re-posting, this time providing a link for you to download the attachment instead: http://swiki.sparklingideas.co.uk/smith.zip Thank you. Henrik All, I have a question about how Orbeon works internally, how it uses DOM (it doesn't?) and SAX, and how Orbeon manages its memory. My problem is that I am getting a "java.lang.OutOfMemoryError: Java heap space" when I am parsing larger XML documents with the below pipeline definition. This is (to me) somewhat unexpected, as I imagined we are talking SAX events all the way, (hopefully) making the size of the input XML irrelevant. As a solution, I could of course increase the heap space, but what would happen if I then sent a really humongous XML document to my pipeline? I have attached a zip file with a self contained application that (sometimes) causes a OutOfMemory error when run on the default settings of Tomcat 5.5.26, OS X 10.4 and Java 1.5.0_13-b05-241. Here is my XPL definition: <p:config xmlns:p="http://www.orbeon.com/oxf/pipeline" xmlns:oxf="http://www.orbeon.com/oxf/processors" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xforms="http://www.w3.org/2002/xforms"> <!-- p:param name="instance" type="input"/ --> <p:param name="data" type="output"/> <!-- Read in the stylesheet definition --> <p:processor name="oxf:url-generator"> <p:input name="config"> <config> <url>transform.xsl</url> <content-type>text/xml</content-type> <validating>false</validating> <handle-xinclude>false</handle-xinclude> </config> </p:input> <p:output name="data" id="firstXslt" debug="firstXSLT"/> </p:processor> <!-- Read in the source XML --> <p:processor name="oxf:url-generator"> <p:input name="config"> <config> <url>smith.hotels.xml</url> <content-type>text/xml</content-type> <validating>false</validating> <handle-xinclude>false</handle-xinclude> </config> </p:input> <p:output name="data" id="smithXml" debug="smithXml"/> </p:processor> <!-- Create the Escenic format: Apply the stylesheet to the source xml --> <p:processor name="oxf:xslt"> <p:input name="data" href="#smithXml" debug="smithXml"/> <p:input name="config" href="#firstXslt" debug="firstXslt"/> <p:output name="data" id="escenicXml" debug="escenicXml"/> </p:processor> <!-- Wired off, just send the transformed XML back to the client for now (using the identity processor below) --> <!-- Call the REST webservice --> <!--p:processor name="oxf:xforms-submission"> <p:input name="submission"> <xforms:submission method="put" action="http://localhost:8080/timmy/import"/> </p:input> <p:input name="request" href="#escenicXml" debug="escenicXml"/> <p:output name="response" ref="data" debug="response"/> </p:processor--> <!-- Just return the transformed XML to the user for now. Once we get this right, will send it to the webservice instead (see above) --> <p:processor name="oxf:identity"> <p:input name="data" href="#escenicXml" debug="escenicXml"/> <p:output name="data" ref="data" debug="same"/> </p:processor> </p:config> And here is the stack trace: java.lang.OutOfMemoryError: Java heap space at org.orbeon.oxf.xml.SAXStore.addToCharBuffer(SAXStore.java:424) at org.orbeon.oxf.xml.SAXStore.characters(SAXStore.java:269) at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:197) at org.orbeon.oxf.processor.pipeline.TeeProcessor$1.readImpl(TeeProcessor.java:61) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$1400(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$6.run(PipelineProcessor.java:564) at org.orbeon.oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$1500(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$InternalTopOutput.readImpl(PipelineProcessor.java:560) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) The exception does not always occur, but appears more frequent with multiple parallel requests (as expected). I am also seeing Broken Pipe socket exceptions in the epilogue XPL (when we don't get OutOfMemory errors), which I think is related to the size of the XML document returned from the above XPL: 2008-08-15 15:05:34,250 ERROR ProcessorService - Exception at line 348, column 55 of oxf:/config/epilogue-servlet.xpl (reading processor output: name='data', id='converted') java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:136) at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:747) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432) at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347) at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:770) at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:126) at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:580) at org.apache.coyote.Response.doWrite(Response.java:560) at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:361) at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:323) at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:392) at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:381) at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89) at org.orbeon.oxf.processor.serializer.store.ResultStoreOutputStream.write(ResultStoreOutputStream.java:47) at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336) at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:395) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:191) at org.orbeon.oxf.util.TextContentHandler.characters(TextContentHandler.java:22) at org.orbeon.oxf.processor.serializer.BinaryTextContentHandler.characters(BinaryTextContentHandler.java:166) at org.orbeon.oxf.util.ContentHandlerWriter.write(ContentHandlerWriter.java:95) at org.orbeon.saxon.tinytree.CharSlice.write(CharSlice.java:170) at org.orbeon.saxon.event.XMLEmitter.writeCharSequence(XMLEmitter.java:595) at org.orbeon.saxon.event.XMLEmitter.writeEscape(XMLEmitter.java:686) at org.orbeon.saxon.event.XMLEmitter.characters(XMLEmitter.java:550) at org.orbeon.saxon.event.ReceivingContentHandler.flush(ReceivingContentHandler.java:425) at org.orbeon.saxon.event.ReceivingContentHandler.endElement(ReceivingContentHandler.java:332) at org.orbeon.oxf.xml.ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) at org.orbeon.oxf.xml.ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:201) at org.orbeon.oxf.processor.pipeline.TeeProcessor$1.readImpl(TeeProcessor.java:61) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$1400(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$6.run(PipelineProcessor.java:564) at org.orbeon.oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$1500(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$InternalTopOutput.readImpl(PipelineProcessor.java:560) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.serializer.legacy.XMLSerializer.readInput(XMLSerializer.java:58) at org.orbeon.oxf.processor.serializer.HttpTextSerializer$1.readImpl(HttpTextSerializer.java:101) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.serializer.HttpSerializer.readInput(HttpSerializer.java:42) at org.orbeon.oxf.processor.serializer.HttpSerializerBase$1.read(HttpSerializerBase.java:151) at org.orbeon.oxf.processor.ProcessorImpl.readCacheInputAsObject(ProcessorImpl.java:452) at org.orbeon.oxf.processor.serializer.HttpSerializerBase.start(HttpSerializerBase.java:142) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$11.run(PipelineProcessor.java:644) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.start(PipelineProcessor.java:641) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java:230) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$11.run(PipelineProcessor.java:644) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.start(PipelineProcessor.java:641) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$11.run(PipelineProcessor.java:644) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.start(PipelineProcessor.java:641) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java:230) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$11.run(PipelineProcessor.java:644) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.start(PipelineProcessor.java:641) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$11.run(PipelineProcessor.java:644) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.start(PipelineProcessor.java:641) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java:230) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$11.run(PipelineProcessor.java:644) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.start(PipelineProcessor.java:641) at org.orbeon.oxf.processor.PageFlowControllerProcessor.start(PageFlowControllerProcessor.java:489) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$11.run(PipelineProcessor.java:644) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.start(PipelineProcessor.java:641) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.getInput(PipelineProcessor.java:136) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:85) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.IdentityProcessor$1.readImpl(IdentityProcessor.java:33) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$000(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$2.run(PipelineProcessor.java:92) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$100(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$1.readImpl(PipelineProcessor.java:90) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor$1.readImpl(ConcreteChooseProcessor.java:122) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$1400(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$6.run(PipelineProcessor.java:564) at org.orbeon.oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access$1500(PipelineProcessor.java:62) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$InternalTopOutput.readImpl(PipelineProcessor.java:560) at org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) at org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) at org.orbeon.oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) at org.orbeon.oxf.processor.NullSerializer.start(NullSerializer.java:31) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$11.run(PipelineProcessor.java:644) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.start(PipelineProcessor.java:641) at org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java:230) at org.orbeon.oxf.processor.pipeline.PipelineProcessor$11.run(PipelineProcessor.java:644) at org.orbeon.oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) at org.orbeon.oxf.processor.pipeline.PipelineProcessor.start(PipelineProcessor.java:641) at org.orbeon.oxf.processor.PageFlowControllerProcessor.start(PageFlowControllerProcessor.java:489) at org.orbeon.oxf.pipeline.InitUtils.runProcessor(InitUtils.java:95) at org.orbeon.oxf.webapp.ProcessorService.service(ProcessorService.java:96) at org.orbeon.oxf.servlet.OPSServletDelegate.service(OPSServletDelegate.java:148) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Thread.java:613) Is it the size of the input / source XML that causes an OutOfMemory error? How about these broken pipes? If so, is there anything I can do to resolve this (except from -Xmx<size> )? Does anyone else have experiences with dealing with large XML documents as inputs and/or outputs? Am I just abusing Orbeon Forms with this type of use case? Any insight would be much appreciated. Many thanks! Sincerely, Henrik Pettersen -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Administrator
|
Henrik,
Processors do communicate through SAX, but individual processors may not stream. In particular: * XSLT doesn't stream, it will create a Saxon TinyTree for the input document. * The XForms processor also creates DOM trees before processing. I would say the case where you can do streaming is the exception rather than the rule. -Erik On Aug 17, 2008, at 11:57 AM, Henrik Pettersen wrote: > All, > > my email seems to be stuck in some sort of email filter, so I am > re-posting, this time providing a link for you to download the > attachment instead: > http://swiki.sparklingideas.co.uk/smith.zip > > Thank you. > > Henrik > > All, > > I have a question about how Orbeon works internally, how it uses DOM > (it doesn't?) and SAX, and how Orbeon manages its memory. > > My problem is that I am getting a "java.lang.OutOfMemoryError: Java > heap space" when I am parsing larger XML documents with the below > pipeline definition. This is (to me) somewhat unexpected, as I > imagined we are talking SAX events all the way, (hopefully) making > the size of the input XML irrelevant. As a solution, I could of course > increase the heap space, but what would happen if I then sent a really > humongous XML document to my pipeline? > > I have attached a zip file with a self contained application that > (sometimes) causes a OutOfMemory error when run on the default > settings of Tomcat 5.5.26, OS X 10.4 and Java 1.5.0_13-b05-241. > > Here is my XPL definition: > > <p:config xmlns:p="http://www.orbeon.com/oxf/pipeline" > xmlns:oxf="http://www.orbeon.com/oxf/processors" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xforms="http://www.w3.org/2002/xforms"> > > <!-- p:param name="instance" type="input"/ --> > <p:param name="data" type="output"/> > > <!-- Read in the stylesheet definition --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>transform.xsl</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="firstXslt" debug="firstXSLT"/> > </p:processor> > > <!-- Read in the source XML --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>smith.hotels.xml</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="smithXml" debug="smithXml"/> > </p:processor> > > <!-- Create the Escenic format: Apply the stylesheet to the > source xml --> > <p:processor name="oxf:xslt"> > <p:input name="data" href="#smithXml" debug="smithXml"/> > <p:input name="config" href="#firstXslt" debug="firstXslt"/> > <p:output name="data" id="escenicXml" debug="escenicXml"/> > </p:processor> > > <!-- Wired off, just send the transformed XML back to the client > for now (using the identity processor below) --> > <!-- Call the REST webservice --> > <!--p:processor name="oxf:xforms-submission"> > <p:input name="submission"> > <xforms:submission method="put" > action="http://localhost:8080/timmy/import"/> > </p:input> > <p:input name="request" href="#escenicXml" debug="escenicXml"/> > <p:output name="response" ref="data" debug="response"/> > </p:processor--> > > <!-- Just return the transformed XML to the user for now. > Once we get this right, will send it to the webservice instead > (see above) --> > <p:processor name="oxf:identity"> > <p:input name="data" href="#escenicXml" debug="escenicXml"/> > <p:output name="data" ref="data" debug="same"/> > </p:processor> > > </p:config> > > And here is the stack trace: > > java.lang.OutOfMemoryError: Java heap space > at org.orbeon.oxf.xml.SAXStore.addToCharBuffer(SAXStore.java: > 424) > at org.orbeon.oxf.xml.SAXStore.characters(SAXStore.java:269) > at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:197) > at org.orbeon.oxf.processor.pipeline.TeeProcessor > $1.readImpl(TeeProcessor.java:61) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > > The exception does not always occur, but appears more frequent with > multiple parallel requests (as expected). I am also seeing Broken Pipe > socket exceptions in the epilogue XPL (when we don't get OutOfMemory > errors), which I think is related to the size of the XML document > returned from the above XPL: > > 2008-08-15 15:05:34,250 ERROR ProcessorService - Exception at line > 348, column 55 of oxf:/config/epilogue-servlet.xpl (reading processor > output: name='data', id='converted') > java.net.SocketException: Broken pipe > at java.net.SocketOutputStream.socketWrite0(Native Method) > at > java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) > at java.net.SocketOutputStream.write(SocketOutputStream.java: > 136) > at > org > .apache > .coyote > .http11 > .InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:747) > at > org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432) > at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java: > 347) > at org.apache.coyote.http11.InternalOutputBuffer > $OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:770) > at > org > .apache > .coyote > .http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java: > 126) > at > org > .apache > .coyote > .http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:580) > at org.apache.coyote.Response.doWrite(Response.java:560) > at > org > .apache > .catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:361) > at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java: > 323) > at > org > .apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java: > 392) > at > org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java: > 381) > at > org > .apache > .catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java: > 89) > at > org > .orbeon > .oxf > .processor > .serializer > .store.ResultStoreOutputStream.write(ResultStoreOutputStream.java:47) > at sun.nio.cs.StreamEncoder > $CharsetSE.writeBytes(StreamEncoder.java:336) > at sun.nio.cs.StreamEncoder > $CharsetSE.implWrite(StreamEncoder.java:395) > at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136) > at java.io.OutputStreamWriter.write(OutputStreamWriter.java: > 191) > at > org > .orbeon > .oxf.util.TextContentHandler.characters(TextContentHandler.java:22) > at > org > .orbeon > .oxf > .processor > .serializer > .BinaryTextContentHandler.characters(BinaryTextContentHandler.java: > 166) > at > org > .orbeon > .oxf.util.ContentHandlerWriter.write(ContentHandlerWriter.java:95) > at org.orbeon.saxon.tinytree.CharSlice.write(CharSlice.java: > 170) > at > org.orbeon.saxon.event.XMLEmitter.writeCharSequence(XMLEmitter.java: > 595) > at > org.orbeon.saxon.event.XMLEmitter.writeEscape(XMLEmitter.java:686) > at > org.orbeon.saxon.event.XMLEmitter.characters(XMLEmitter.java:550) > at > org > .orbeon > .saxon > .event.ReceivingContentHandler.flush(ReceivingContentHandler.java:425) > at > org > .orbeon > .saxon > .event > .ReceivingContentHandler.endElement(ReceivingContentHandler.java:332) > at > org > .orbeon > .oxf > .xml > .ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) > at > org > .orbeon > .oxf > .xml > .ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) > at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:201) > at org.orbeon.oxf.processor.pipeline.TeeProcessor > $1.readImpl(TeeProcessor.java:61) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf > .processor > .serializer.legacy.XMLSerializer.readInput(XMLSerializer.java:58) > at org.orbeon.oxf.processor.serializer.HttpTextSerializer > $1.readImpl(HttpTextSerializer.java:101) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf > .processor.serializer.HttpSerializer.readInput(HttpSerializer.java:42) > at org.orbeon.oxf.processor.serializer.HttpSerializerBase > $1.read(HttpSerializerBase.java:151) > at > org > .orbeon > .oxf > .processor.ProcessorImpl.readCacheInputAsObject(ProcessorImpl.java: > 452) > at > org > .orbeon > .oxf > .processor > .serializer.HttpSerializerBase.start(HttpSerializerBase.java:142) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .PageFlowControllerProcessor.start(PageFlowControllerProcessor.java: > 489) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.getInput(PipelineProcessor.java:136) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:85) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at > org.orbeon.oxf.processor.NullSerializer.start(NullSerializer.java:31) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .PageFlowControllerProcessor.start(PageFlowControllerProcessor.java: > 489) > at > org.orbeon.oxf.pipeline.InitUtils.runProcessor(InitUtils.java:95) > at > org.orbeon.oxf.webapp.ProcessorService.service(ProcessorService.java: > 96) > at > org > .orbeon > .oxf.servlet.OPSServletDelegate.service(OPSServletDelegate.java:148) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) > at > org > .apache > .catalina > .core > .ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: > 269) > at > org > .apache > .catalina > .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) > at > org > .apache > .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: > 213) > at > org > .apache > .catalina.core.StandardContextValve.invoke(StandardContextValve.java: > 174) > at > org > .apache > .catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) > at > org > .apache > .catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) > at > org > .apache > .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: > 108) > at > org > .apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: > 174) > at > org > .apache.coyote.http11.Http11Processor.process(Http11Processor.java: > 874) > at org.apache.coyote.http11.Http11BaseProtocol > $Http11ConnectionHandler.processConnection(Http11BaseProtocol.java: > 665) > at > org > .apache > .tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java: > 528) > at > org > .apache > .tomcat > .util > .net > .LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) > at org.apache.tomcat.util.threads.ThreadPool > $ControlRunnable.run(ThreadPool.java:689) > at java.lang.Thread.run(Thread.java:613) > > > Is it the size of the input / source XML that causes an OutOfMemory > error? How about these broken pipes? If so, is there anything I can do > to resolve this (except from -Xmx<size> )? Does anyone else have > experiences with dealing with large XML documents as inputs and/or > outputs? Am I just abusing Orbeon Forms with this type of use case? > > Any insight would be much appreciated. Many thanks! > > Sincerely, > Henrik Pettersen > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws Orbeon Forms - Web Forms for the Enterprise Done the Right Way http://www.orbeon.com/ -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Hi Erik,
thank you for coming back to me, that makes sense to me. Is there any documentation on how the different processors handle the XML (DOM/SAX)? You mentioned a tinytree being built for XSLT, how about the oxf:xforms-submission processor? Many thanks! Henrik On Sun, Aug 17, 2008 at 8:29 PM, Erik Bruchez <[hidden email]> wrote: Henrik, -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Administrator
|
Henrik,
I don't think there is specific documentation on that. On top of my head: * oxf:url-generator is able to stream * oxf:http-serializer is able to stream * pretty much anything else doesn't ;-) oxf:xforms-submission uses XLST to build an XForm state, so here you will even possibly have several DOMs in memory possibly at the same time. -Erik On Aug 17, 2008, at 2:02 PM, Henrik Pettersen wrote: > Hi Erik, > > thank you for coming back to me, that makes sense to me. Is there > any documentation on how the different processors handle the XML > (DOM/SAX)? You mentioned a tinytree being built for XSLT, how about > the oxf:xforms-submission processor? > > Many thanks! > > Henrik > > On Sun, Aug 17, 2008 at 8:29 PM, Erik Bruchez <[hidden email]> > wrote: > Henrik, > > Processors do communicate through SAX, but individual processors may > not stream. In particular: > > * XSLT doesn't stream, it will create a Saxon TinyTree for the input > document. > * The XForms processor also creates DOM trees before processing. > > I would say the case where you can do streaming is the exception > rather than the rule. > > -Erik > > > On Aug 17, 2008, at 11:57 AM, Henrik Pettersen wrote: > > All, > > my email seems to be stuck in some sort of email filter, so I am > re-posting, this time providing a link for you to download the > attachment instead: > http://swiki.sparklingideas.co.uk/smith.zip > > Thank you. > > Henrik > > All, > > I have a question about how Orbeon works internally, how it uses DOM > (it doesn't?) and SAX, and how Orbeon manages its memory. > > My problem is that I am getting a "java.lang.OutOfMemoryError: Java > heap space" when I am parsing larger XML documents with the below > pipeline definition. This is (to me) somewhat unexpected, as I > imagined we are talking SAX events all the way, (hopefully) making > the size of the input XML irrelevant. As a solution, I could of course > increase the heap space, but what would happen if I then sent a really > humongous XML document to my pipeline? > > I have attached a zip file with a self contained application that > (sometimes) causes a OutOfMemory error when run on the default > settings of Tomcat 5.5.26, OS X 10.4 and Java 1.5.0_13-b05-241. > > Here is my XPL definition: > > <p:config xmlns:p="http://www.orbeon.com/oxf/pipeline" > xmlns:oxf="http://www.orbeon.com/oxf/processors" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xforms="http://www.w3.org/2002/xforms"> > > <!-- p:param name="instance" type="input"/ --> > <p:param name="data" type="output"/> > > <!-- Read in the stylesheet definition --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>transform.xsl</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="firstXslt" debug="firstXSLT"/> > </p:processor> > > <!-- Read in the source XML --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>smith.hotels.xml</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="smithXml" debug="smithXml"/> > </p:processor> > > <!-- Create the Escenic format: Apply the stylesheet to the source > xml --> > <p:processor name="oxf:xslt"> > <p:input name="data" href="#smithXml" debug="smithXml"/> > <p:input name="config" href="#firstXslt" debug="firstXslt"/> > <p:output name="data" id="escenicXml" debug="escenicXml"/> > </p:processor> > > <!-- Wired off, just send the transformed XML back to the client > for now (using the identity processor below) --> > <!-- Call the REST webservice --> > <!--p:processor name="oxf:xforms-submission"> > <p:input name="submission"> > <xforms:submission method="put" > action="http://localhost:8080/timmy/import"/> > </p:input> > <p:input name="request" href="#escenicXml" debug="escenicXml"/> > <p:output name="response" ref="data" debug="response"/> > </p:processor--> > > <!-- Just return the transformed XML to the user for now. > Once we get this right, will send it to the webservice instead > (see above) --> > <p:processor name="oxf:identity"> > <p:input name="data" href="#escenicXml" debug="escenicXml"/> > <p:output name="data" ref="data" debug="same"/> > </p:processor> > > </p:config> > > And here is the stack trace: > > java.lang.OutOfMemoryError: Java heap space > at org.orbeon.oxf.xml.SAXStore.addToCharBuffer(SAXStore.java: > 424) > at org.orbeon.oxf.xml.SAXStore.characters(SAXStore.java:269) > at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:197) > at org.orbeon.oxf.processor.pipeline.TeeProcessor > $1.readImpl(TeeProcessor.java:61) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > > The exception does not always occur, but appears more frequent with > multiple parallel requests (as expected). I am also seeing Broken Pipe > socket exceptions in the epilogue XPL (when we don't get OutOfMemory > errors), which I think is related to the size of the XML document > returned from the above XPL: > > 2008-08-15 15:05:34,250 ERROR ProcessorService - Exception at line > 348, column 55 of oxf:/config/epilogue-servlet.xpl (reading processor > output: name='data', id='converted') > java.net.SocketException: Broken pipe > at java.net.SocketOutputStream.socketWrite0(Native Method) > at > java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) > at java.net.SocketOutputStream.write(SocketOutputStream.java: > 136) > at > org > .apache > .coyote > .http11 > .InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:747) > at > org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432) > at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java: > 347) > at org.apache.coyote.http11.InternalOutputBuffer > $OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:770) > at > org > .apache > .coyote > .http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java: > 126) > at > org > .apache > .coyote > .http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:580) > at org.apache.coyote.Response.doWrite(Response.java:560) > at > org > .apache > .catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:361) > at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java: > 323) > at > org > .apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java: > 392) > at > org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java: > 381) > at > org > .apache > .catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java: > 89) > at > org > .orbeon > .oxf > .processor > .serializer > .store.ResultStoreOutputStream.write(ResultStoreOutputStream.java:47) > at sun.nio.cs.StreamEncoder > $CharsetSE.writeBytes(StreamEncoder.java:336) > at sun.nio.cs.StreamEncoder > $CharsetSE.implWrite(StreamEncoder.java:395) > at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136) > at java.io.OutputStreamWriter.write(OutputStreamWriter.java:191) > at > org > .orbeon > .oxf.util.TextContentHandler.characters(TextContentHandler.java:22) > at > org > .orbeon > .oxf > .processor > .serializer > .BinaryTextContentHandler.characters(BinaryTextContentHandler.java: > 166) > at > org > .orbeon > .oxf.util.ContentHandlerWriter.write(ContentHandlerWriter.java:95) > at org.orbeon.saxon.tinytree.CharSlice.write(CharSlice.java:170) > at > org.orbeon.saxon.event.XMLEmitter.writeCharSequence(XMLEmitter.java: > 595) > at > org.orbeon.saxon.event.XMLEmitter.writeEscape(XMLEmitter.java:686) > at > org.orbeon.saxon.event.XMLEmitter.characters(XMLEmitter.java:550) > at > org > .orbeon > .saxon > .event.ReceivingContentHandler.flush(ReceivingContentHandler.java:425) > at > org > .orbeon > .saxon > .event > .ReceivingContentHandler.endElement(ReceivingContentHandler.java:332) > at > org > .orbeon > .oxf > .xml > .ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) > at > org > .orbeon > .oxf > .xml > .ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) > at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:201) > at org.orbeon.oxf.processor.pipeline.TeeProcessor > $1.readImpl(TeeProcessor.java:61) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf > .processor > .serializer.legacy.XMLSerializer.readInput(XMLSerializer.java:58) > at org.orbeon.oxf.processor.serializer.HttpTextSerializer > $1.readImpl(HttpTextSerializer.java:101) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf > .processor.serializer.HttpSerializer.readInput(HttpSerializer.java:42) > at org.orbeon.oxf.processor.serializer.HttpSerializerBase > $1.read(HttpSerializerBase.java:151) > at > org > .orbeon > .oxf > .processor.ProcessorImpl.readCacheInputAsObject(ProcessorImpl.java: > 452) > at > org > .orbeon > .oxf > .processor > .serializer.HttpSerializerBase.start(HttpSerializerBase.java:142) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .PageFlowControllerProcessor.start(PageFlowControllerProcessor.java: > 489) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.getInput(PipelineProcessor.java:136) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:85) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at > org.orbeon.oxf.processor.NullSerializer.start(NullSerializer.java:31) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .PageFlowControllerProcessor.start(PageFlowControllerProcessor.java: > 489) > at > org.orbeon.oxf.pipeline.InitUtils.runProcessor(InitUtils.java:95) > at > org.orbeon.oxf.webapp.ProcessorService.service(ProcessorService.java: > 96) > at > org > .orbeon > .oxf.servlet.OPSServletDelegate.service(OPSServletDelegate.java:148) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) > at > org > .apache > .catalina > .core > .ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: > 269) > at > org > .apache > .catalina > .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) > at > org > .apache > .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: > 213) > at > org > .apache > .catalina.core.StandardContextValve.invoke(StandardContextValve.java: > 174) > at > org > .apache > .catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) > at > org > .apache > .catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) > at > org > .apache > .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: > 108) > at > org > .apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: > 174) > at > org > .apache.coyote.http11.Http11Processor.process(Http11Processor.java: > 874) > at org.apache.coyote.http11.Http11BaseProtocol > $Http11ConnectionHandler.processConnection(Http11BaseProtocol.java: > 665) > at > org > .apache > .tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java: > 528) > at > org > .apache > .tomcat > .util > .net > .LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) > at org.apache.tomcat.util.threads.ThreadPool > $ControlRunnable.run(ThreadPool.java:689) > at java.lang.Thread.run(Thread.java:613) > > > Is it the size of the input / source XML that causes an OutOfMemory > error? How about these broken pipes? If so, is there anything I can do > to resolve this (except from -Xmx<size> )? Does anyone else have > experiences with dealing with large XML documents as inputs and/or > outputs? Am I just abusing Orbeon Forms with this type of use case? > > Any insight would be much appreciated. Many thanks! > > Sincerely, > Henrik Pettersen > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > -- > Orbeon Forms - Web Forms for the Enterprise Done the Right Way > http://www.orbeon.com/ > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws Orbeon Forms - Web Forms for the Enterprise Done the Right Way http://www.orbeon.com/ -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Hi Erik,
that's very helpful, thank you. Is oxf:xforms-submission the preferred way to call a REST style webservice, then? Henrik On Mon, Aug 18, 2008 at 12:40 AM, Erik Bruchez <[hidden email]> wrote: Henrik, -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Administrator
|
Yes that, or directly calling services from an XForms page.
-Erik On Aug 17, 2008, at 5:33 PM, Henrik Pettersen wrote: > Hi Erik, > > that's very helpful, thank you. Is oxf:xforms-submission the > preferred way to call a REST style webservice, then? > > Henrik > > On Mon, Aug 18, 2008 at 12:40 AM, Erik Bruchez <[hidden email]> > wrote: > Henrik, > > I don't think there is specific documentation on that. On top of my > head: > > * oxf:url-generator is able to stream > * oxf:http-serializer is able to stream > * pretty much anything else doesn't ;-) > > oxf:xforms-submission uses XLST to build an XForm state, so here you > will even possibly have several DOMs in memory possibly at the same > time. > > -Erik > > > On Aug 17, 2008, at 2:02 PM, Henrik Pettersen wrote: > > Hi Erik, > > thank you for coming back to me, that makes sense to me. Is there > any documentation on how the different processors handle the XML > (DOM/SAX)? You mentioned a tinytree being built for XSLT, how about > the oxf:xforms-submission processor? > > Many thanks! > > Henrik > > On Sun, Aug 17, 2008 at 8:29 PM, Erik Bruchez <[hidden email]> > wrote: > Henrik, > > Processors do communicate through SAX, but individual processors may > not stream. In particular: > > * XSLT doesn't stream, it will create a Saxon TinyTree for the input > document. > * The XForms processor also creates DOM trees before processing. > > I would say the case where you can do streaming is the exception > rather than the rule. > > -Erik > > > On Aug 17, 2008, at 11:57 AM, Henrik Pettersen wrote: > > All, > > my email seems to be stuck in some sort of email filter, so I am > re-posting, this time providing a link for you to download the > attachment instead: > http://swiki.sparklingideas.co.uk/smith.zip > > Thank you. > > Henrik > > All, > > I have a question about how Orbeon works internally, how it uses DOM > (it doesn't?) and SAX, and how Orbeon manages its memory. > > My problem is that I am getting a "java.lang.OutOfMemoryError: Java > heap space" when I am parsing larger XML documents with the below > pipeline definition. This is (to me) somewhat unexpected, as I > imagined we are talking SAX events all the way, (hopefully) making > the size of the input XML irrelevant. As a solution, I could of course > increase the heap space, but what would happen if I then sent a really > humongous XML document to my pipeline? > > I have attached a zip file with a self contained application that > (sometimes) causes a OutOfMemory error when run on the default > settings of Tomcat 5.5.26, OS X 10.4 and Java 1.5.0_13-b05-241. > > Here is my XPL definition: > > <p:config xmlns:p="http://www.orbeon.com/oxf/pipeline" > xmlns:oxf="http://www.orbeon.com/oxf/processors" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xforms="http://www.w3.org/2002/xforms"> > > <!-- p:param name="instance" type="input"/ --> > <p:param name="data" type="output"/> > > <!-- Read in the stylesheet definition --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>transform.xsl</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="firstXslt" debug="firstXSLT"/> > </p:processor> > > <!-- Read in the source XML --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>smith.hotels.xml</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="smithXml" debug="smithXml"/> > </p:processor> > > <!-- Create the Escenic format: Apply the stylesheet to the source > xml --> > <p:processor name="oxf:xslt"> > <p:input name="data" href="#smithXml" debug="smithXml"/> > <p:input name="config" href="#firstXslt" debug="firstXslt"/> > <p:output name="data" id="escenicXml" debug="escenicXml"/> > </p:processor> > > <!-- Wired off, just send the transformed XML back to the client > for now (using the identity processor below) --> > <!-- Call the REST webservice --> > <!--p:processor name="oxf:xforms-submission"> > <p:input name="submission"> > <xforms:submission method="put" > action="http://localhost:8080/timmy/import"/> > </p:input> > <p:input name="request" href="#escenicXml" debug="escenicXml"/> > <p:output name="response" ref="data" debug="response"/> > </p:processor--> > > <!-- Just return the transformed XML to the user for now. > Once we get this right, will send it to the webservice instead > (see above) --> > <p:processor name="oxf:identity"> > <p:input name="data" href="#escenicXml" debug="escenicXml"/> > <p:output name="data" ref="data" debug="same"/> > </p:processor> > > </p:config> > > And here is the stack trace: > > java.lang.OutOfMemoryError: Java heap space > at org.orbeon.oxf.xml.SAXStore.addToCharBuffer(SAXStore.java:424) > at org.orbeon.oxf.xml.SAXStore.characters(SAXStore.java:269) > at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:197) > at org.orbeon.oxf.processor.pipeline.TeeProcessor > $1.readImpl(TeeProcessor.java:61) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > > The exception does not always occur, but appears more frequent with > multiple parallel requests (as expected). I am also seeing Broken Pipe > socket exceptions in the epilogue XPL (when we don't get OutOfMemory > errors), which I think is related to the size of the XML document > returned from the above XPL: > > 2008-08-15 15:05:34,250 ERROR ProcessorService - Exception at line > 348, column 55 of oxf:/config/epilogue-servlet.xpl (reading processor > output: name='data', id='converted') > java.net.SocketException: Broken pipe > at java.net.SocketOutputStream.socketWrite0(Native Method) > at > java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) > at java.net.SocketOutputStream.write(SocketOutputStream.java:136) > at > org > .apache > .coyote > .http11 > .InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:747) > at > org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432) > at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java: > 347) > at org.apache.coyote.http11.InternalOutputBuffer > $OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:770) > at > org > .apache > .coyote > .http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java: > 126) > at > org > .apache > .coyote > .http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:580) > at org.apache.coyote.Response.doWrite(Response.java:560) > at > org > .apache > .catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:361) > at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java: > 323) > at > org > .apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java: > 392) > at > org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java: > 381) > at > org > .apache > .catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java: > 89) > at > org > .orbeon > .oxf > .processor > .serializer > .store.ResultStoreOutputStream.write(ResultStoreOutputStream.java:47) > at sun.nio.cs.StreamEncoder > $CharsetSE.writeBytes(StreamEncoder.java:336) > at sun.nio.cs.StreamEncoder > $CharsetSE.implWrite(StreamEncoder.java:395) > at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136) > at java.io.OutputStreamWriter.write(OutputStreamWriter.java:191) > at > org > .orbeon > .oxf.util.TextContentHandler.characters(TextContentHandler.java:22) > at > org > .orbeon > .oxf > .processor > .serializer > .BinaryTextContentHandler.characters(BinaryTextContentHandler.java: > 166) > at > org > .orbeon > .oxf.util.ContentHandlerWriter.write(ContentHandlerWriter.java:95) > at org.orbeon.saxon.tinytree.CharSlice.write(CharSlice.java:170) > at > org.orbeon.saxon.event.XMLEmitter.writeCharSequence(XMLEmitter.java: > 595) > at > org.orbeon.saxon.event.XMLEmitter.writeEscape(XMLEmitter.java:686) > at org.orbeon.saxon.event.XMLEmitter.characters(XMLEmitter.java: > 550) > at > org > .orbeon > .saxon > .event.ReceivingContentHandler.flush(ReceivingContentHandler.java:425) > at > org > .orbeon > .saxon > .event > .ReceivingContentHandler.endElement(ReceivingContentHandler.java:332) > at > org > .orbeon > .oxf > .xml > .ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) > at > org > .orbeon > .oxf > .xml > .ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) > at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:201) > at org.orbeon.oxf.processor.pipeline.TeeProcessor > $1.readImpl(TeeProcessor.java:61) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf > .processor > .serializer.legacy.XMLSerializer.readInput(XMLSerializer.java:58) > at org.orbeon.oxf.processor.serializer.HttpTextSerializer > $1.readImpl(HttpTextSerializer.java:101) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf > .processor.serializer.HttpSerializer.readInput(HttpSerializer.java:42) > at org.orbeon.oxf.processor.serializer.HttpSerializerBase > $1.read(HttpSerializerBase.java:151) > at > org > .orbeon > .oxf > .processor.ProcessorImpl.readCacheInputAsObject(ProcessorImpl.java: > 452) > at > org > .orbeon > .oxf > .processor > .serializer.HttpSerializerBase.start(HttpSerializerBase.java:142) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .PageFlowControllerProcessor.start(PageFlowControllerProcessor.java: > 489) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.getInput(PipelineProcessor.java:136) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:85) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at > org.orbeon.oxf.processor.NullSerializer.start(NullSerializer.java:31) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .PageFlowControllerProcessor.start(PageFlowControllerProcessor.java: > 489) > at > org.orbeon.oxf.pipeline.InitUtils.runProcessor(InitUtils.java:95) > at > org.orbeon.oxf.webapp.ProcessorService.service(ProcessorService.java: > 96) > at > org > .orbeon > .oxf.servlet.OPSServletDelegate.service(OPSServletDelegate.java:148) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) > at > org > .apache > .catalina > .core > .ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: > 269) > at > org > .apache > .catalina > .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) > at > org > .apache > .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: > 213) > at > org > .apache > .catalina.core.StandardContextValve.invoke(StandardContextValve.java: > 174) > at > org > .apache > .catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) > at > org > .apache > .catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) > at > org > .apache > .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: > 108) > at > org > .apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: > 174) > at > org > .apache.coyote.http11.Http11Processor.process(Http11Processor.java: > 874) > at org.apache.coyote.http11.Http11BaseProtocol > $Http11ConnectionHandler.processConnection(Http11BaseProtocol.java: > 665) > at > org > .apache > .tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java: > 528) > at > org > .apache > .tomcat > .util > .net > .LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) > at org.apache.tomcat.util.threads.ThreadPool > $ControlRunnable.run(ThreadPool.java:689) > at java.lang.Thread.run(Thread.java:613) > > > Is it the size of the input / source XML that causes an OutOfMemory > error? How about these broken pipes? If so, is there anything I can do > to resolve this (except from -Xmx<size> )? Does anyone else have > experiences with dealing with large XML documents as inputs and/or > outputs? Am I just abusing Orbeon Forms with this type of use case? > > Any insight would be much appreciated. Many thanks! > > Sincerely, > Henrik Pettersen > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > -- > Orbeon Forms - Web Forms for the Enterprise Done the Right Way > http://www.orbeon.com/ > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > -- > Orbeon Forms - Web Forms for the Enterprise Done the Right Way > http://www.orbeon.com/ > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws Orbeon Forms - Web Forms for the Enterprise Done the Right Way http://www.orbeon.com/ -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Hi Erik,
thank you, that's very helpful. I'll probably end up writing my own Orbeon extension, then, for consuming REST style web services (using streaming / SAX). XPL is such a great web service integration / process control language, a resource-friendly REST style web service consumer seems like a natural extension of your allready extensive library of processors. Feature request, perhaps? I'll be sure to share any Orbeon extension code with you all, should I get that far... Many thanks! Henrik On Mon, Aug 18, 2008 at 6:02 AM, Erik Bruchez <[hidden email]> wrote: Yes that, or directly calling services from an XForms page. -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
In reply to this post by Erik Bruchez
Erik,
This is a question that's been puzzling me for a while. If streaming is the exception rather than the rule, why is SAX the preferred method for communicating between processors? Wouldn't it be more efficient just to create a DOM representation and pass it down the pipeline instead? It sounds like you might be marshalling and unmarshalling a document several times in the course of a pipeline's execution. </Jeff> Erik Bruchez wrote: > Henrik, > > Processors do communicate through SAX, but individual processors may not > stream. In particular: > > * XSLT doesn't stream, it will create a Saxon TinyTree for the input > document. > * The XForms processor also creates DOM trees before processing. > > I would say the case where you can do streaming is the exception rather > than the rule. > > -Erik > > On Aug 17, 2008, at 11:57 AM, Henrik Pettersen wrote: > >> All, >> >> my email seems to be stuck in some sort of email filter, so I am >> re-posting, this time providing a link for you to download the >> attachment instead: >> http://swiki.sparklingideas.co.uk/smith.zip >> >> Thank you. >> >> Henrik >> >> All, >> >> I have a question about how Orbeon works internally, how it uses DOM >> (it doesn't?) and SAX, and how Orbeon manages its memory. >> >> My problem is that I am getting a "java.lang.OutOfMemoryError: Java >> heap space" when I am parsing larger XML documents with the below >> pipeline definition. This is (to me) somewhat unexpected, as I >> imagined we are talking SAX events all the way, (hopefully) making >> the size of the input XML irrelevant. As a solution, I could of course >> increase the heap space, but what would happen if I then sent a really >> humongous XML document to my pipeline? >> >> I have attached a zip file with a self contained application that >> (sometimes) causes a OutOfMemory error when run on the default >> settings of Tomcat 5.5.26, OS X 10.4 and Java 1.5.0_13-b05-241. >> >> Here is my XPL definition: >> >> <p:config xmlns:p="http://www.orbeon.com/oxf/pipeline" >> xmlns:oxf="http://www.orbeon.com/oxf/processors" >> xmlns:xs="http://www.w3.org/2001/XMLSchema" >> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >> xmlns:xforms="http://www.w3.org/2002/xforms"> >> >> <!-- p:param name="instance" type="input"/ --> >> <p:param name="data" type="output"/> >> >> <!-- Read in the stylesheet definition --> >> <p:processor name="oxf:url-generator"> >> <p:input name="config"> >> <config> >> <url>transform.xsl</url> >> <content-type>text/xml</content-type> >> <validating>false</validating> >> <handle-xinclude>false</handle-xinclude> >> </config> >> </p:input> >> <p:output name="data" id="firstXslt" debug="firstXSLT"/> >> </p:processor> >> >> <!-- Read in the source XML --> >> <p:processor name="oxf:url-generator"> >> <p:input name="config"> >> <config> >> <url>smith.hotels.xml</url> >> <content-type>text/xml</content-type> >> <validating>false</validating> >> <handle-xinclude>false</handle-xinclude> >> </config> >> </p:input> >> <p:output name="data" id="smithXml" debug="smithXml"/> >> </p:processor> >> >> <!-- Create the Escenic format: Apply the stylesheet to the source >> xml --> >> <p:processor name="oxf:xslt"> >> <p:input name="data" href="#smithXml" debug="smithXml"/> >> <p:input name="config" href="#firstXslt" debug="firstXslt"/> >> <p:output name="data" id="escenicXml" debug="escenicXml"/> >> </p:processor> >> >> <!-- Wired off, just send the transformed XML back to the client >> for now (using the identity processor below) --> >> <!-- Call the REST webservice --> >> <!--p:processor name="oxf:xforms-submission"> >> <p:input name="submission"> >> <xforms:submission method="put" >> action="http://localhost:8080/timmy/import"/> >> </p:input> >> <p:input name="request" href="#escenicXml" debug="escenicXml"/> >> <p:output name="response" ref="data" debug="response"/> >> </p:processor--> >> >> <!-- Just return the transformed XML to the user for now. >> Once we get this right, will send it to the webservice instead >> (see above) --> >> <p:processor name="oxf:identity"> >> <p:input name="data" href="#escenicXml" debug="escenicXml"/> >> <p:output name="data" ref="data" debug="same"/> >> </p:processor> >> >> </p:config> >> >> And here is the stack trace: >> >> java.lang.OutOfMemoryError: Java heap space >> at org.orbeon.oxf.xml.SAXStore.addToCharBuffer(SAXStore.java:424) >> at org.orbeon.oxf.xml.SAXStore.characters(SAXStore.java:269) >> at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:197) >> at >> org.orbeon.oxf.processor.pipeline.TeeProcessor$1.readImpl(TeeProcessor.java:61) >> >> at >> org.orbeon.oxf.processor.ProcessorImpl$6.read(ProcessorImpl.java:994) >> at >> org.orbeon.oxf.processor.ProcessorImpl$ProcessorOutputImpl.read(ProcessorImpl.java:1177) >> >> at >> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) >> >> at java.lang.Thread.run(Thread.java:613) >> >> >> Is it the size of the input / source XML that causes an OutOfMemory >> error? How about these broken pipes? If so, is there anything I can do >> to resolve this (except from -Xmx<size> )? Does anyone else have >> experiences with dealing with large XML documents as inputs and/or >> outputs? Am I just abusing Orbeon Forms with this type of use case? >> >> Any insight would be much appreciated. Many thanks! >> >> Sincerely, >> Henrik Pettersen -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Administrator
|
In reply to this post by Henrik Pettersen
THanks Henrik. A streaming REST client would be good. Somehow we have
so far managed to work around this. Another way might be to still use oxf:xforms-submission, but to pass URLs in and out instead of the content. The process would be: * Receive document (oxf:request, oxf:url-generator, ...) * Store in temp file and obtain URL * Pass URL to oxf:xforms-submission * Run submission * Obtain URL of result back * Dereference URL and continue streamin Well, this would be pseudo-streaming as it would involve temp files, but it would be good for RAM usage. We have an extension to xforms:submission for serializing binary files already, but it doesn't stream yet. If that part was completed, you could probably achieve the above. -Erik On Aug 18, 2008, at 5:43 AM, Henrik Pettersen wrote: > Hi Erik, > > thank you, that's very helpful. I'll probably end up writing my own > Orbeon extension, then, for consuming REST style web services (using > streaming / SAX). > > XPL is such a great web service integration / process control > language, a resource-friendly REST style web service consumer seems > like a natural extension of your allready extensive library of > processors. Feature request, perhaps? I'll be sure to share any > Orbeon extension code with you all, should I get that far... > > Many thanks! > > Henrik > > On Mon, Aug 18, 2008 at 6:02 AM, Erik Bruchez <[hidden email]> > wrote: > Yes that, or directly calling services from an XForms page. > > -Erik > > > On Aug 17, 2008, at 5:33 PM, Henrik Pettersen wrote: > > Hi Erik, > > that's very helpful, thank you. Is oxf:xforms-submission the > preferred way to call a REST style webservice, then? > > Henrik > > On Mon, Aug 18, 2008 at 12:40 AM, Erik Bruchez <[hidden email]> > wrote: > Henrik, > > I don't think there is specific documentation on that. On top of my > head: > > * oxf:url-generator is able to stream > * oxf:http-serializer is able to stream > * pretty much anything else doesn't ;-) > > oxf:xforms-submission uses XLST to build an XForm state, so here you > will even possibly have several DOMs in memory possibly at the same > time. > > -Erik > > > On Aug 17, 2008, at 2:02 PM, Henrik Pettersen wrote: > > Hi Erik, > > thank you for coming back to me, that makes sense to me. Is there > any documentation on how the different processors handle the XML > (DOM/SAX)? You mentioned a tinytree being built for XSLT, how about > the oxf:xforms-submission processor? > > Many thanks! > > Henrik > > On Sun, Aug 17, 2008 at 8:29 PM, Erik Bruchez <[hidden email]> > wrote: > Henrik, > > Processors do communicate through SAX, but individual processors may > not stream. In particular: > > * XSLT doesn't stream, it will create a Saxon TinyTree for the input > document. > * The XForms processor also creates DOM trees before processing. > > I would say the case where you can do streaming is the exception > rather than the rule. > > -Erik > > > On Aug 17, 2008, at 11:57 AM, Henrik Pettersen wrote: > > All, > > my email seems to be stuck in some sort of email filter, so I am > re-posting, this time providing a link for you to download the > attachment instead: > http://swiki.sparklingideas.co.uk/smith.zip > > Thank you. > > Henrik > > All, > > I have a question about how Orbeon works internally, how it uses DOM > (it doesn't?) and SAX, and how Orbeon manages its memory. > > My problem is that I am getting a "java.lang.OutOfMemoryError: Java > heap space" when I am parsing larger XML documents with the below > pipeline definition. This is (to me) somewhat unexpected, as I > imagined we are talking SAX events all the way, (hopefully) making > the size of the input XML irrelevant. As a solution, I could of course > increase the heap space, but what would happen if I then sent a really > humongous XML document to my pipeline? > > I have attached a zip file with a self contained application that > (sometimes) causes a OutOfMemory error when run on the default > settings of Tomcat 5.5.26, OS X 10.4 and Java 1.5.0_13-b05-241. > > Here is my XPL definition: > > <p:config xmlns:p="http://www.orbeon.com/oxf/pipeline" > xmlns:oxf="http://www.orbeon.com/oxf/processors" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xforms="http://www.w3.org/2002/xforms"> > > <!-- p:param name="instance" type="input"/ --> > <p:param name="data" type="output"/> > > <!-- Read in the stylesheet definition --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>transform.xsl</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="firstXslt" debug="firstXSLT"/> > </p:processor> > > <!-- Read in the source XML --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>smith.hotels.xml</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="smithXml" debug="smithXml"/> > </p:processor> > > <!-- Create the Escenic format: Apply the stylesheet to the source > xml --> > <p:processor name="oxf:xslt"> > <p:input name="data" href="#smithXml" debug="smithXml"/> > <p:input name="config" href="#firstXslt" debug="firstXslt"/> > <p:output name="data" id="escenicXml" debug="escenicXml"/> > </p:processor> > > <!-- Wired off, just send the transformed XML back to the client > for now (using the identity processor below) --> > <!-- Call the REST webservice --> > <!--p:processor name="oxf:xforms-submission"> > <p:input name="submission"> > <xforms:submission method="put" > action="http://localhost:8080/timmy/import"/> > </p:input> > <p:input name="request" href="#escenicXml" debug="escenicXml"/> > <p:output name="response" ref="data" debug="response"/> > </p:processor--> > > <!-- Just return the transformed XML to the user for now. > Once we get this right, will send it to the webservice instead > (see above) --> > <p:processor name="oxf:identity"> > <p:input name="data" href="#escenicXml" debug="escenicXml"/> > <p:output name="data" ref="data" debug="same"/> > </p:processor> > > </p:config> > > And here is the stack trace: > > java.lang.OutOfMemoryError: Java heap space > at org.orbeon.oxf.xml.SAXStore.addToCharBuffer(SAXStore.java:424) > at org.orbeon.oxf.xml.SAXStore.characters(SAXStore.java:269) > at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:197) > at org.orbeon.oxf.processor.pipeline.TeeProcessor > $1.readImpl(TeeProcessor.java:61) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > > The exception does not always occur, but appears more frequent with > multiple parallel requests (as expected). I am also seeing Broken Pipe > socket exceptions in the epilogue XPL (when we don't get OutOfMemory > errors), which I think is related to the size of the XML document > returned from the above XPL: > > 2008-08-15 15:05:34,250 ERROR ProcessorService - Exception at line > 348, column 55 of oxf:/config/epilogue-servlet.xpl (reading processor > output: name='data', id='converted') > java.net.SocketException: Broken pipe > at java.net.SocketOutputStream.socketWrite0(Native Method) > at > java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) > at java.net.SocketOutputStream.write(SocketOutputStream.java:136) > at > org > .apache > .coyote > .http11 > .InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:747) > at > org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432) > at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347) > at org.apache.coyote.http11.InternalOutputBuffer > $OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:770) > at > org > .apache > .coyote > .http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java: > 126) > at > org > .apache > .coyote > .http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:580) > at org.apache.coyote.Response.doWrite(Response.java:560) > at > org > .apache > .catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:361) > at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:323) > at > org > .apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java: > 392) > at > org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java: > 381) > at > org > .apache > .catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java: > 89) > at > org > .orbeon > .oxf > .processor > .serializer > .store.ResultStoreOutputStream.write(ResultStoreOutputStream.java:47) > at sun.nio.cs.StreamEncoder > $CharsetSE.writeBytes(StreamEncoder.java:336) > at sun.nio.cs.StreamEncoder > $CharsetSE.implWrite(StreamEncoder.java:395) > at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136) > at java.io.OutputStreamWriter.write(OutputStreamWriter.java:191) > at > org > .orbeon > .oxf.util.TextContentHandler.characters(TextContentHandler.java:22) > at > org > .orbeon > .oxf > .processor > .serializer > .BinaryTextContentHandler.characters(BinaryTextContentHandler.java: > 166) > at > org > .orbeon > .oxf.util.ContentHandlerWriter.write(ContentHandlerWriter.java:95) > at org.orbeon.saxon.tinytree.CharSlice.write(CharSlice.java:170) > at > org.orbeon.saxon.event.XMLEmitter.writeCharSequence(XMLEmitter.java: > 595) > at org.orbeon.saxon.event.XMLEmitter.writeEscape(XMLEmitter.java: > 686) > at org.orbeon.saxon.event.XMLEmitter.characters(XMLEmitter.java: > 550) > at > org > .orbeon > .saxon > .event.ReceivingContentHandler.flush(ReceivingContentHandler.java:425) > at > org > .orbeon > .saxon > .event > .ReceivingContentHandler.endElement(ReceivingContentHandler.java:332) > at > org > .orbeon > .oxf > .xml > .ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) > at > org > .orbeon > .oxf > .xml > .ForwardingContentHandler.endElement(ForwardingContentHandler.java:52) > at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:201) > at org.orbeon.oxf.processor.pipeline.TeeProcessor > $1.readImpl(TeeProcessor.java:61) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf > .processor > .serializer.legacy.XMLSerializer.readInput(XMLSerializer.java:58) > at org.orbeon.oxf.processor.serializer.HttpTextSerializer > $1.readImpl(HttpTextSerializer.java:101) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf > .processor.serializer.HttpSerializer.readInput(HttpSerializer.java:42) > at org.orbeon.oxf.processor.serializer.HttpSerializerBase > $1.read(HttpSerializerBase.java:151) > at > org > .orbeon > .oxf > .processor.ProcessorImpl.readCacheInputAsObject(ProcessorImpl.java: > 452) > at > org > .orbeon > .oxf > .processor > .serializer.HttpSerializerBase.start(HttpSerializerBase.java:142) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .PageFlowControllerProcessor.start(PageFlowControllerProcessor.java: > 489) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.getInput(PipelineProcessor.java:136) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:85) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at org.orbeon.oxf.processor.IdentityProcessor > $1.readImpl(IdentityProcessor.java:33) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $000(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $2.run(PipelineProcessor.java:92) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $100(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $1.readImpl(PipelineProcessor.java:90) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org.orbeon.oxf.processor.pipeline.choose.ConcreteChooseProcessor > $1.readImpl(ConcreteChooseProcessor.java:122) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1400(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $6.run(PipelineProcessor.java:564) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeParents(ProcessorImpl.java:536) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor.access > $1500(PipelineProcessor.java:62) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $InternalTopOutput.readImpl(PipelineProcessor.java:560) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:349) > at > org > .orbeon > .oxf.processor.ProcessorImpl.readInputAsSAX(ProcessorImpl.java:354) > at > org.orbeon.oxf.processor.NullSerializer.start(NullSerializer.java:31) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .pipeline > .choose.ConcreteChooseProcessor.start(ConcreteChooseProcessor.java: > 230) > at org.orbeon.oxf.processor.pipeline.PipelineProcessor > $11.run(PipelineProcessor.java:644) > at > org > .orbeon > .oxf.processor.ProcessorImpl.executeChildren(ProcessorImpl.java:518) > at > org > .orbeon > .oxf > .processor.pipeline.PipelineProcessor.start(PipelineProcessor.java: > 641) > at > org > .orbeon > .oxf > .processor > .PageFlowControllerProcessor.start(PageFlowControllerProcessor.java: > 489) > at org.orbeon.oxf.pipeline.InitUtils.runProcessor(InitUtils.java: > 95) > at > org.orbeon.oxf.webapp.ProcessorService.service(ProcessorService.java: > 96) > at > org > .orbeon > .oxf.servlet.OPSServletDelegate.service(OPSServletDelegate.java:148) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) > at > org > .apache > .catalina > .core > .ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: > 269) > at > org > .apache > .catalina > .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) > at > org > .apache > .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: > 213) > at > org > .apache > .catalina.core.StandardContextValve.invoke(StandardContextValve.java: > 174) > at > org > .apache > .catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) > at > org > .apache > .catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) > at > org > .apache > .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: > 108) > at > org > .apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: > 174) > at > org > .apache.coyote.http11.Http11Processor.process(Http11Processor.java: > 874) > at org.apache.coyote.http11.Http11BaseProtocol > $Http11ConnectionHandler.processConnection(Http11BaseProtocol.java: > 665) > at > org > .apache > .tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java: > 528) > at > org > .apache > .tomcat > .util > .net > .LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) > at org.apache.tomcat.util.threads.ThreadPool > $ControlRunnable.run(ThreadPool.java:689) > at java.lang.Thread.run(Thread.java:613) > > > Is it the size of the input / source XML that causes an OutOfMemory > error? How about these broken pipes? If so, is there anything I can do > to resolve this (except from -Xmx<size> )? Does anyone else have > experiences with dealing with large XML documents as inputs and/or > outputs? Am I just abusing Orbeon Forms with this type of use case? > > Any insight would be much appreciated. Many thanks! > > Sincerely, > Henrik Pettersen > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > -- > Orbeon Forms - Web Forms for the Enterprise Done the Right Way > http://www.orbeon.com/ > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > -- > Orbeon Forms - Web Forms for the Enterprise Done the Right Way > http://www.orbeon.com/ > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > -- > Orbeon Forms - Web Forms for the Enterprise Done the Right Way > http://www.orbeon.com/ > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws Orbeon Forms - Web Forms for the Enterprise Done the Right Way http://www.orbeon.com/ -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Administrator
|
In reply to this post by Jeff Jones
I am not sure whether it would help or not. I can imagine cases where
it wouldn't. Realize that in a pipeline, you don't have a single document going through a sequence of steps, but really a new document being produced at each step. At least, this is the most common case (including XSLT). Consider these cases: * oxf:url-generator streams by nature (it uses a SAX parser). So producing a DOM instead would mean an extra step. * XSLT (Saxon) can take anything in pretty much, so a DOM in would be fine. But Saxon naturally streams its output. So again here producing a DOM is an extra step. * Now put two XSLT transformations in a chain: with a DOM, Saxon must create a DOM at the end of the first transformation. Using SAX, Saxon must create a DOM (well, TinyTree which is more efficient) at the beginning of the second transformation. So the cost is about the same. If you use SAX, at least you allow the consumer to decide whether a DOM is needed or not, and you keep open the possibility of streaming, which we still use once in a while. Now what could possibly be done would be some sort of negotiation between the sender and the receiver: the latter could say "I would prefer a TinyTree if you have it", and if the former happens to produce that naturally, then you get the optimal solution. The bottom line is that I don't think it would be more efficient to use DOM, but maybe, possibly, "format negotiation" could help in some cases. -Erik On Aug 18, 2008, at 8:08 AM, Jeff Jones wrote: > Erik, > > This is a question that's been puzzling me for a while. If streaming > is the exception rather than the rule, why is SAX the preferred > method for communicating between processors? Wouldn't it be more > efficient just to create a DOM representation and pass it down the > pipeline instead? It sounds like you might be marshalling and > unmarshalling a document several times in the course of a pipeline's > execution. > > </Jeff> > > Erik Bruchez wrote: >> Henrik, >> Processors do communicate through SAX, but individual processors >> may not stream. In particular: >> * XSLT doesn't stream, it will create a Saxon TinyTree for the >> input document. >> * The XForms processor also creates DOM trees before processing. >> I would say the case where you can do streaming is the exception >> rather than the rule. >> -Erik >> On Aug 17, 2008, at 11:57 AM, Henrik Pettersen wrote: >>> All, >>> >>> my email seems to be stuck in some sort of email filter, so I am >>> re-posting, this time providing a link for you to download the >>> attachment instead: >>> http://swiki.sparklingideas.co.uk/smith.zip >>> >>> Thank you. >>> >>> Henrik >>> >>> All, >>> >>> I have a question about how Orbeon works internally, how it uses DOM >>> (it doesn't?) and SAX, and how Orbeon manages its memory. >>> >>> My problem is that I am getting a "java.lang.OutOfMemoryError: Java >>> heap space" when I am parsing larger XML documents with the below >>> pipeline definition. This is (to me) somewhat unexpected, as I >>> imagined we are talking SAX events all the way, (hopefully) making >>> the size of the input XML irrelevant. As a solution, I could of >>> course >>> increase the heap space, but what would happen if I then sent a >>> really >>> humongous XML document to my pipeline? >>> >>> I have attached a zip file with a self contained application that >>> (sometimes) causes a OutOfMemory error when run on the default >>> settings of Tomcat 5.5.26, OS X 10.4 and Java 1.5.0_13-b05-241. >>> >>> Here is my XPL definition: >>> >>> <p:config xmlns:p="http://www.orbeon.com/oxf/pipeline" >>> xmlns:oxf="http://www.orbeon.com/oxf/processors" >>> xmlns:xs="http://www.w3.org/2001/XMLSchema" >>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >>> xmlns:xforms="http://www.w3.org/2002/xforms"> >>> >>> <!-- p:param name="instance" type="input"/ --> >>> <p:param name="data" type="output"/> >>> >>> <!-- Read in the stylesheet definition --> >>> <p:processor name="oxf:url-generator"> >>> <p:input name="config"> >>> <config> >>> <url>transform.xsl</url> >>> <content-type>text/xml</content-type> >>> <validating>false</validating> >>> <handle-xinclude>false</handle-xinclude> >>> </config> >>> </p:input> >>> <p:output name="data" id="firstXslt" debug="firstXSLT"/> >>> </p:processor> >>> >>> <!-- Read in the source XML --> >>> <p:processor name="oxf:url-generator"> >>> <p:input name="config"> >>> <config> >>> <url>smith.hotels.xml</url> >>> <content-type>text/xml</content-type> >>> <validating>false</validating> >>> <handle-xinclude>false</handle-xinclude> >>> </config> >>> </p:input> >>> <p:output name="data" id="smithXml" debug="smithXml"/> >>> </p:processor> >>> >>> <!-- Create the Escenic format: Apply the stylesheet to the >>> source xml --> >>> <p:processor name="oxf:xslt"> >>> <p:input name="data" href="#smithXml" debug="smithXml"/> >>> <p:input name="config" href="#firstXslt" debug="firstXslt"/> >>> <p:output name="data" id="escenicXml" debug="escenicXml"/> >>> </p:processor> >>> >>> <!-- Wired off, just send the transformed XML back to the client >>> for now (using the identity processor below) --> >>> <!-- Call the REST webservice --> >>> <!--p:processor name="oxf:xforms-submission"> >>> <p:input name="submission"> >>> <xforms:submission method="put" >>> action="http://localhost:8080/timmy/import"/> >>> </p:input> >>> <p:input name="request" href="#escenicXml" >>> debug="escenicXml"/> >>> <p:output name="response" ref="data" debug="response"/> >>> </p:processor--> >>> >>> <!-- Just return the transformed XML to the user for now. >>> Once we get this right, will send it to the webservice instead >>> (see above) --> >>> <p:processor name="oxf:identity"> >>> <p:input name="data" href="#escenicXml" debug="escenicXml"/> >>> <p:output name="data" ref="data" debug="same"/> >>> </p:processor> >>> >>> </p:config> >>> >>> And here is the stack trace: >>> >>> java.lang.OutOfMemoryError: Java heap space >>> at org.orbeon.oxf.xml.SAXStore.addToCharBuffer(SAXStore.java: >>> 424) >>> at org.orbeon.oxf.xml.SAXStore.characters(SAXStore.java:269) >>> at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:197) >>> at org.orbeon.oxf.processor.pipeline.TeeProcessor >>> $1.readImpl(TeeProcessor.java:61) >>> at org.orbeon.oxf.processor.ProcessorImpl >>> $6.read(ProcessorImpl.java:994) >>> at org.orbeon.oxf.processor.ProcessorImpl >>> $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > <snip> >>> at org.apache.tomcat.util.threads.ThreadPool >>> $ControlRunnable.run(ThreadPool.java:689) >>> at java.lang.Thread.run(Thread.java:613) >>> >>> >>> Is it the size of the input / source XML that causes an OutOfMemory >>> error? How about these broken pipes? If so, is there anything I >>> can do >>> to resolve this (except from -Xmx<size> )? Does anyone else have >>> experiences with dealing with large XML documents as inputs and/or >>> outputs? Am I just abusing Orbeon Forms with this type of use case? >>> >>> Any insight would be much appreciated. Many thanks! >>> >>> Sincerely, >>> Henrik Pettersen > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws Orbeon Forms - Web Forms for the Enterprise Done the Right Way http://www.orbeon.com/ -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Hi Erik,
thank you for all the background information, I'll be digging around this issue a bit more. Just for reference, I noticed that you offer an XSLT processor implemented with SAX instead of 'tinytree' constructs: Streaming Transformations for XML: http://www.orbeon.com/ops/doc/processors-xslt#d87e899 Here is the processor definition (processors-xslt.xml): <processor name="oxf:stx"> <instantiation name="oxf:trax"> <input name="transformer"> <config> <class>net.sf.joost.trax.TransformerFactoryImpl</class> </config> </input> </instantiation> </processor> (Notice that the stx processor (unusually) refers to a 3rd party API (Joost): net.sf.joost.trax.TransformerFactoryImpl) If I do this in my XPL: <!-- Read in the source XML --> <p:processor name="oxf:url-generator"> <p:input name="config"> <config> <url>smith.hotels.short.xml</url> <content-type>text/xml</content-type> <validating>false</validating> <handle-xinclude>false</handle-xinclude> </config> </p:input> <p:output name="data" id="smithXml" /> </p:processor> <!-- Load the stylesheet --> <p:processor name="oxf:url-generator"> <p:input name="config"> <config> <url>images.xsl</url> <content-type>text/xml</content-type> <validating>false</validating> <handle-xinclude>false</handle-xinclude> </config> </p:input> <p:output name="data" id="imagesXslt" /> </p:processor> <!-- Apply the stylesheet --> <!-- REPLACE WITH STX PROCESSOR HERE --> <p:processor name="oxf:xslt"> <p:input name="data" href="#smithXml" /> <p:input name="config" href="#imagesXslt" /> <p:output name="data" id="images" /> </p:processor> <!-- My custom processor then streams the href="#images" content to a webservice. --> I should then have a nice little brook running all the way through my XPL, hopefully avoiding any DOM mounting. Me thinks. That said, the trickiest part here is (hopefully) writing my custom streaming web service consumer processor: The SAX events are pushed into my processor, so getting an inputstream for this is a bit tricky. See my previous posting on the subject here: http://mail-archive.ow2.org/ops-users/2008-08/msg00085.html (Thanks, Erik!) Erik also had some good ideas for how to deal with this, using java.io.pipes (threads) or a disk buffer (NetUtils.inputStreamToAnyURI()), and I've also posted a question on Experts Exchange (no responses yet): Converting SAX events back to an InputSource, using a ContentHandler http://www.experts-exchange.com/Programming/Languages/Java/J2SE/JAX_SAXP/Q_23644349.html Oh, and I agree with your comment: I think sticking with SAX implementation as often as possible is essential, as DOM models do not scale indefinitely - you'll eventually run out of memory... Thanks for all your help! Henrik On Mon, Aug 18, 2008 at 7:05 PM, Erik Bruchez <[hidden email]> wrote: I am not sure whether it would help or not. I can imagine cases where it wouldn't. -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Re-post... My aplogies.
Henrik ---------- Forwarded message ---------- From: Henrik Pettersen <[hidden email]> Date: Tue, Aug 19, 2008 at 1:52 PM Subject: Re: [ops-users] Re: Re: Re: SAX, DOM, large XML documents and java.lang.OutOfMemory Errors To: [hidden email]
Hi Erik,
thank you for all the background information, I'll be digging around this issue a bit more. Just for reference, I noticed that you offer an XSLT processor implemented with SAX instead of 'tinytree' constructs: Streaming Transformations for XML: http://www.orbeon.com/ops/doc/processors-xslt#d87e899 Here is the processor definition (processors-xslt.xml): <processor name="oxf:stx"> <instantiation name="oxf:trax"> <input name="transformer"> <config> <class>net.sf.joost.trax.TransformerFactoryImpl</class> </config> </input> </instantiation> </processor> (Notice that the stx processor (unusually) refers to a 3rd party API (Joost): net.sf.joost.trax.TransformerFactoryImpl) If I do this in my XPL: <!-- Read in the source XML --> <p:processor name="oxf:url-generator"> <p:input name="config"> <config> <content-type>text/xml</content-type> <validating>false</validating> <handle-xinclude>false</handle-xinclude> </config> </p:input> </p:processor> <!-- Load the stylesheet --> <p:processor name="oxf:url-generator"> <p:input name="config"> <config> <content-type>text/xml</content-type> <validating>false</validating> <handle-xinclude>false</handle-xinclude> </config> </p:input> </p:processor> <!-- Apply the stylesheet --> <!-- REPLACE WITH STX PROCESSOR HERE --> <p:processor name="oxf:xslt"> <p:input name="data" href="#smithXml" /><p:input name="config" href="#imagesXslt" /> <p:output name="data" id="images" /> </p:processor> <!-- My custom processor then streams the href="#images" content to a webservice. --> I should then have a nice little brook running all the way through my XPL, hopefully avoiding any DOM mounting. Me thinks. That said, the trickiest part here is (hopefully) writing my custom streaming web service consumer processor: The SAX events are pushed into my processor, so getting an inputstream for this is a bit tricky. See my previous posting on the subject here: http://mail-archive.ow2.org/ops-users/2008-08/msg00085.html (Thanks, Erik!) Erik also had some good ideas for how to deal with this, using java.io.pipes (threads) or a disk buffer (NetUtils.inputStreamToAnyURI()), and I've also posted a question on Experts Exchange (no responses yet): Converting SAX events back to an InputSource, using a ContentHandler http://www.experts-exchange.com/Programming/Languages/Java/J2SE/JAX_SAXP/Q_23644349.html Oh, and I agree with your comment: I think sticking with SAX implementation as often as possible is essential, as DOM models do not scale indefinitely - you'll eventually run out of memory... Thanks for all your help! Henrik On Mon, Aug 18, 2008 at 7:05 PM, Erik Bruchez <[hidden email]> wrote: I am not sure whether it would help or not. I can imagine cases where it wouldn't. -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Administrator
|
Thanks for the feedback.
As a note, oxf:stx is not an XSLT processor: it is an (old) implementation of "Streaming Transformations for XML" [1]. -Erik [1] http://stx.sourceforge.net/ On Aug 20, 2008, at 9:38 AM, Henrik Pettersen wrote: > Re-post... My aplogies. > > Henrik > > ---------- Forwarded message ---------- > From: Henrik Pettersen <[hidden email]> > Date: Tue, Aug 19, 2008 at 1:52 PM > Subject: Re: [ops-users] Re: Re: Re: SAX, DOM, large XML documents > and java.lang.OutOfMemory Errors > To: [hidden email] > > > Hi Erik, > > thank you for all the background information, I'll be digging around > this issue a bit more. Just for reference, I noticed that you offer > an XSLT processor implemented with SAX instead of 'tinytree' > constructs: > Streaming Transformations for XML: http://www.orbeon.com/ops/doc/processors-xslt#d87e899 > > Here is the processor definition (processors-xslt.xml): > > <processor name="oxf:stx"> > <instantiation name="oxf:trax"> > <input name="transformer"> > <config> > <class>net.sf.joost.trax.TransformerFactoryImpl</ > class> > </config> > </input> > </instantiation> > </processor> > > (Notice that the stx processor (unusually) refers to a 3rd party API > (Joost): net.sf.joost.trax.TransformerFactoryImpl) > > If I do this in my XPL: > > > <!-- Read in the source XML --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>smith.hotels.short.xml</url> > > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="smithXml" /> > </p:processor> > > <!-- Load the stylesheet --> > > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>images.xsl</url> > > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="imagesXslt" /> > </p:processor> > > <!-- Apply the stylesheet --> <!-- REPLACE WITH STX PROCESSOR > HERE --> > <p:processor name="oxf:xslt"> > <p:input name="data" href="#smithXml" /> > <p:input name="config" href="#imagesXslt" /> > <p:output name="data" id="images" /> > </p:processor> > > <!-- My custom processor then streams the href="#images" content > to a webservice. --> > > I should then have a nice little brook running all the way through > my XPL, hopefully avoiding any DOM mounting. Me thinks. > > That said, the trickiest part here is (hopefully) writing my custom > streaming web service consumer processor: The SAX events are pushed > into my processor, so getting an inputstream for this is a bit > tricky. See my previous posting on the subject here: > http://mail-archive.ow2.org/ops-users/2008-08/msg00085.html (Thanks, > Erik!) > > Erik also had some good ideas for how to deal with this, using > java.io.pipes (threads) or a disk buffer > (NetUtils.inputStreamToAnyURI()), and I've also posted a question on > Experts Exchange (no responses yet): > Converting SAX events back to an InputSource, using a ContentHandler > http://www.experts-exchange.com/Programming/Languages/Java/J2SE/JAX_SAXP/Q_23644349.html > > Oh, and I agree with your comment: I think sticking with SAX > implementation as often as possible is essential, as DOM models do > not scale indefinitely - you'll eventually run out of memory... > > Thanks for all your help! > > Henrik > > > On Mon, Aug 18, 2008 at 7:05 PM, Erik Bruchez <[hidden email]> > wrote: > I am not sure whether it would help or not. I can imagine cases > where it wouldn't. > > Realize that in a pipeline, you don't have a single document going > through a sequence of steps, but really a new document being > produced at each step. At least, this is the most common case > (including XSLT). > > Consider these cases: > > * oxf:url-generator streams by nature (it uses a SAX parser). So > producing a DOM instead would mean an extra step. > > * XSLT (Saxon) can take anything in pretty much, so a DOM in would > be fine. But Saxon naturally streams its output. So again here > producing a DOM is an extra step. > > * Now put two XSLT transformations in a chain: with a DOM, Saxon > must create a DOM at the end of the first transformation. Using SAX, > Saxon must create a DOM (well, TinyTree which is more efficient) at > the beginning of the second transformation. So the cost is about the > same. > > If you use SAX, at least you allow the consumer to decide whether a > DOM is needed or not, and you keep open the possibility of > streaming, which we still use once in a while. > > Now what could possibly be done would be some sort of negotiation > between the sender and the receiver: the latter could say "I would > prefer a TinyTree if you have it", and if the former happens to > produce that naturally, then you get the optimal solution. > > The bottom line is that I don't think it would be more efficient to > use DOM, but maybe, possibly, "format negotiation" could help in > some cases. > > -Erik > > > On Aug 18, 2008, at 8:08 AM, Jeff Jones wrote: > > Erik, > > This is a question that's been puzzling me for a while. If streaming > is the exception rather than the rule, why is SAX the preferred > method for communicating between processors? Wouldn't it be more > efficient just to create a DOM representation and pass it down the > pipeline instead? It sounds like you might be marshalling and > unmarshalling a document several times in the course of a pipeline's > execution. > > </Jeff> > > Erik Bruchez wrote: > Henrik, > Processors do communicate through SAX, but individual processors may > not stream. In particular: > * XSLT doesn't stream, it will create a Saxon TinyTree for the input > document. > * The XForms processor also creates DOM trees before processing. > I would say the case where you can do streaming is the exception > rather than the rule. > -Erik > On Aug 17, 2008, at 11:57 AM, Henrik Pettersen wrote: > All, > > my email seems to be stuck in some sort of email filter, so I am > re-posting, this time providing a link for you to download the > attachment instead: > http://swiki.sparklingideas.co.uk/smith.zip > > Thank you. > > Henrik > > All, > > I have a question about how Orbeon works internally, how it uses DOM > (it doesn't?) and SAX, and how Orbeon manages its memory. > > My problem is that I am getting a "java.lang.OutOfMemoryError: Java > heap space" when I am parsing larger XML documents with the below > pipeline definition. This is (to me) somewhat unexpected, as I > imagined we are talking SAX events all the way, (hopefully) making > the size of the input XML irrelevant. As a solution, I could of course > increase the heap space, but what would happen if I then sent a really > humongous XML document to my pipeline? > > I have attached a zip file with a self contained application that > (sometimes) causes a OutOfMemory error when run on the default > settings of Tomcat 5.5.26, OS X 10.4 and Java 1.5.0_13-b05-241. > > Here is my XPL definition: > > <p:config xmlns:p="http://www.orbeon.com/oxf/pipeline" > xmlns:oxf="http://www.orbeon.com/oxf/processors" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xforms="http://www.w3.org/2002/xforms"> > > <!-- p:param name="instance" type="input"/ --> > <p:param name="data" type="output"/> > > <!-- Read in the stylesheet definition --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>transform.xsl</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="firstXslt" debug="firstXSLT"/> > </p:processor> > > <!-- Read in the source XML --> > <p:processor name="oxf:url-generator"> > <p:input name="config"> > <config> > <url>smith.hotels.xml</url> > <content-type>text/xml</content-type> > <validating>false</validating> > <handle-xinclude>false</handle-xinclude> > </config> > </p:input> > <p:output name="data" id="smithXml" debug="smithXml"/> > </p:processor> > > <!-- Create the Escenic format: Apply the stylesheet to the source > xml --> > <p:processor name="oxf:xslt"> > <p:input name="data" href="#smithXml" debug="smithXml"/> > <p:input name="config" href="#firstXslt" debug="firstXslt"/> > <p:output name="data" id="escenicXml" debug="escenicXml"/> > </p:processor> > > <!-- Wired off, just send the transformed XML back to the client > for now (using the identity processor below) --> > <!-- Call the REST webservice --> > <!--p:processor name="oxf:xforms-submission"> > <p:input name="submission"> > <xforms:submission method="put" > action="http://localhost:8080/timmy/import"/> > </p:input> > <p:input name="request" href="#escenicXml" debug="escenicXml"/> > <p:output name="response" ref="data" debug="response"/> > </p:processor--> > > <!-- Just return the transformed XML to the user for now. > Once we get this right, will send it to the webservice instead > (see above) --> > <p:processor name="oxf:identity"> > <p:input name="data" href="#escenicXml" debug="escenicXml"/> > <p:output name="data" ref="data" debug="same"/> > </p:processor> > > </p:config> > > And here is the stack trace: > > java.lang.OutOfMemoryError: Java heap space > at org.orbeon.oxf.xml.SAXStore.addToCharBuffer(SAXStore.java:424) > at org.orbeon.oxf.xml.SAXStore.characters(SAXStore.java:269) > at org.orbeon.oxf.xml.SAXStore.replay(SAXStore.java:197) > at org.orbeon.oxf.processor.pipeline.TeeProcessor > $1.readImpl(TeeProcessor.java:61) > at org.orbeon.oxf.processor.ProcessorImpl > $6.read(ProcessorImpl.java:994) > at org.orbeon.oxf.processor.ProcessorImpl > $ProcessorOutputImpl.read(ProcessorImpl.java:1177) > <snip> > at org.apache.tomcat.util.threads.ThreadPool > $ControlRunnable.run(ThreadPool.java:689) > at java.lang.Thread.run(Thread.java:613) > > > Is it the size of the input / source XML that causes an OutOfMemory > error? How about these broken pipes? If so, is there anything I can do > to resolve this (except from -Xmx<size> )? Does anyone else have > experiences with dealing with large XML documents as inputs and/or > outputs? Am I just abusing Orbeon Forms with this type of use case? > > Any insight would be much appreciated. Many thanks! > > Sincerely, > Henrik Pettersen > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > -- > Orbeon Forms - Web Forms for the Enterprise Done the Right Way > http://www.orbeon.com/ > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws > > > > > -- > You receive this message as a subscriber of the [hidden email] > mailing list. > To unsubscribe: mailto:[hidden email] > For general help: mailto:[hidden email]?subject=help > OW2 mailing lists service home page: http://www.ow2.org/wws Orbeon Forms - Web Forms for the Enterprise Done the Right Way http://www.orbeon.com/ -- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Hi,
Just to pitch in some remarks. Sax and Stax don't differ that much, both are streaming (event driven), but Stax keeps more overhead. Sax is awkward at sorting for example, while DOM isn't, Stax solves that more or less by keeping references of parent nodes (all the way up to the root node). See also: http://stax.codehaus.org/ If standard processors won't do the job, write your own? My 2 cents, - Mike |
Thanks, Mike!
I shall certainly have a look at stax. Authoring a few new processors for this wouldn't be all that tricky, except for this issue: http://mail-archive.ow2.org/ops-users/2008-08/msg00085.html I'll have to read up on both stx (thanks, Erik) and stax. Not too familiar with these... Thanks again, everyone. Henrik On Wed, Aug 20, 2008 at 10:16 PM, Mike Ahlers <[hidden email]> wrote:
-- You receive this message as a subscriber of the [hidden email] mailing list. To unsubscribe: mailto:[hidden email] For general help: mailto:[hidden email]?subject=help OW2 mailing lists service home page: http://www.ow2.org/wws |
Free forum by Nabble | Edit this page |