Hi,
I am working on a cache for XML resolved through an URIResolver. I have
been storing byte arrays and providing them as a ByteArrayInputStream to
a StreamSource. It is very expensive to convert a file to a byte array
and it still has to be parsed every time, so I am trying to provide
cached SAX events. Is it possible? I have tried using Saxon653, Xalan
and Resin to process the stylesheets (none work, but Saxon gets the
closest). I have the following XML Parser system properties set:
org.xml.sax.driver=org.apache.xerces.parsers.XIncludeParserConfiguration
javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
org.apache.xerces.xni.parser.XMLParserConfiguration=org.apache.xerces.parsers.XIncludeParserConfiguration
I am extending InputSource to be able to use an XMLFilter that stores an
ArrayList of SAX events. The SAX events are output using the
TransformerHandler from the transformation.
// handler is the current TransformerHandler
// file is the key/source for the cache entry
InputSource in = new SaxEventsInputSource(handler, file);
// entry is the XMLFilter that has the ArrayList of SAXEvents
// in is the extended InputSource
SAXSource source = new SAXSource(entry, in);
The events are stored correctly and when the parse of the XMLFilter
occurs the events are output correctly (I believe). The parse calls a
method (sendEvents) that iterates over the list of SAX events. See my
trace of what is going on below the exception. I get the following
exception when running the code:
java.lang.NullPointerException
at
com.icl.saxon.output.GeneralOutputter.makeEmitter(GeneralOutputter.java:272)
at
com.icl.saxon.output.GeneralOutputter.setOutputDestination(GeneralOutputter.java:66)
at com.icl.saxon.Controller.changeOutputDestination(Controller.java:405)
at com.icl.saxon.Controller.transformDocument(Controller.java:1076)
at
com.icl.saxon.TransformerHandlerImpl.endDocument(TransformerHandlerImpl.java:101)
at com.livestoryboard.SaxEventsCacheEntry.sendEvents(Unknown Source)
at com.livestoryboard.SaxEventsCacheEntry.parse(Unknown Source)
at com.icl.saxon.om.Builder.build(Builder.java:265)
at com.icl.saxon.functions.Document.makeDoc(Document.java:228)
at com.icl.saxon.functions.Document.getDocuments(Document.java:134)
at com.icl.saxon.functions.Document.evaluate(Document.java:70)
at com.icl.saxon.functions.Document.reduce(Document.java:299)
at com.icl.saxon.expr.PathExpression.reduce(PathExpression.java:160)
at com.icl.saxon.expr.NodeSetExpression.evaluate(NodeSetExpression.java:39)
at
com.icl.saxon.style.XSLGeneralVariable.getSelectValue(XSLGeneralVariable.java:251)
at com.icl.saxon.style.XSLVariable.process(XSLVariable.java:89)
at com.icl.saxon.style.XSLStyleSheet.process(XSLStyleSheet.java:626)
at com.icl.saxon.Controller.transformDocument(Controller.java:1082)
at com.icl.saxon.Controller.transform(Controller.java:953)
at com.livestoryboard.actions.Preview.service(Unknown Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)
at
com.caucho.server.http.FilterChainServlet.doFilter(FilterChainServlet.java:96)
at com.livestoryboard.actions.EntryFilter.doFilter(Unknown Source)
at
com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
at com.livestoryboard.actions.PermissionsFilter.doFilter(Unknown Source)
at
com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
at com.livestoryboard.actions.CheckUserFilter.doFilter(Unknown Source)
at
com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
at com.caucho.server.http.Invocation.service(Invocation.java:315)
at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
at
com.caucho.server.http.RunnerRequest.handleRequest(RunnerRequest.java:346)
at
com.caucho.server.http.RunnerRequest.handleConnection(RunnerRequest.java:274)
at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
at java.lang.Thread.run(Thread.java:595)
[Trace]
SaxEventsCache.getSaxSource file:
projects\rob-test\lsb\metadata\site\site_root.xml
SaxEventsCache.getSaxSource entry: null
SaxEventsCacheEntry.parse source: org.xml.sax.InputSource@33b121
SaxEventsCacheEntry.startElement namespaceURI:
http://livestoryboard.com/schemas/lsb
SaxEventsCacheEntry.startElement localName: md-folder
SaxEventsCacheEntry.startElement qualifiedName: md-folder
SaxEventsCache.getSaxSource entry NEW:
com.livestoryboard.SaxEventsCacheEntry@1aa2c23
SaxEventsCacheEntry.parse source (instanceof SaxEventsInputSource):
com.livestoryboard.SaxEventsInputSource@7d4a4
SaxEventsCacheEntry.sendEvents saxEvent: START_DOCUMENT
SaxEventsCacheEntry.sendEvents saxEvent: START_PREFIX_MAPPING
SaxEventsCacheEntry.sendEvents saxEvent: START_ELEMENT
SaxEventsCacheEntry.sendEvents saxEvent.getParm(0):
http://livestoryboard.com/schemas/lsb
SaxEventsCacheEntry.sendEvents saxEvent.getParm(1): md-folder
SaxEventsCacheEntry.sendEvents saxEvent.getParm(2): md-folder
SaxEventsCacheEntry.sendEvents attParms[0]:
SaxEventsCacheEntry.sendEvents attParms[1]:
SaxEventsCacheEntry.sendEvents attParms[2]: xmlns
SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
SaxEventsCacheEntry.sendEvents attParms[4]:
http://livestoryboard.com/schemas/lsb
SaxEventsCacheEntry.sendEvents attParms[0]:
SaxEventsCacheEntry.sendEvents attParms[1]: created
SaxEventsCacheEntry.sendEvents attParms[2]: created
SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
SaxEventsCacheEntry.sendEvents attParms[4]: 2004-03-08T11:25:05
SaxEventsCacheEntry.sendEvents attParms[0]:
SaxEventsCacheEntry.sendEvents attParms[1]: creator
SaxEventsCacheEntry.sendEvents attParms[2]: creator
SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
SaxEventsCacheEntry.sendEvents attParms[4]: Robert Koberg
SaxEventsCacheEntry.sendEvents attParms[0]:
SaxEventsCacheEntry.sendEvents attParms[1]: last_mod_by
SaxEventsCacheEntry.sendEvents attParms[2]: last_mod_by
SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
SaxEventsCacheEntry.sendEvents attParms[4]: Robert Koberg
SaxEventsCacheEntry.sendEvents attParms[0]:
SaxEventsCacheEntry.sendEvents attParms[1]: modified
SaxEventsCacheEntry.sendEvents attParms[2]: modified
SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
SaxEventsCacheEntry.sendEvents attParms[4]: 2004-08-02T17:00:02
SaxEventsCacheEntry.sendEvents saxEvent: END_ELEMENT
SaxEventsCacheEntry.sendEvents saxEvent: END_PREFIX_MAPPING
SaxEventsCacheEntry.sendEvents saxEvent: END_DOCUMENT