problem reusing xmlfilters 2003-04-11 - By Simon Stanlake
hi, I've made a small modification to the UseXMLFilters example that ships with Xalan to try and reuse the XMLFilter on more than one xml source. I have a system that receives multiple xml inputs and needs to transform them with the same set of 3 stylesheets. The xmlfilter creation step accounts for 3/4 of my processing time so I'd like to not have to recreate it for every request (there are thousands!)
Here's the code...
public class UseXMLFilters { public static void main(String[] args) throws TransformerException, TransformerConfigurationException, SAXException, IOException {
TransformerFactory tFactory = TransformerFactory.newInstance();
if (tFactory.getFeature(SAXSource.FEATURE) && tFactory.getFeature(SAXResult.FEATURE)) {
SAXTransformerFactory saxTFactory = ((SAXTransformerFactory) tFactory);
StreamSource foo1 = new StreamSource("foo1.xsl"); StreamSource foo2 = new StreamSource("foo2.xsl"); StreamSource foo3 = new StreamSource("foo3.xsl"); Templates t1 = saxTFactory.newTemplates(foo1); Templates t2 = saxTFactory.newTemplates(foo2); Templates t3 = saxTFactory.newTemplates(foo3); XMLFilter xmlFilter1 = saxTFactory.newXMLFilter(t1); XMLFilter xmlFilter2 = saxTFactory.newXMLFilter(t2); XMLFilter xmlFilter3 = saxTFactory.newXMLFilter(t3);
XMLReader reader = XMLReaderFactory.createXMLReader();
// Create an XMLReader. // xmlFilter1 uses the XMLReader as its reader. xmlFilter1.setParent(reader);
// xmlFilter2 uses xmlFilter1 as its reader. xmlFilter2.setParent(xmlFilter1);
// xmlFilter3 uses xmlFilter2 as its reader. xmlFilter3.setParent(xmlFilter2);
// xmlFilter3 outputs SAX events to the serializer. Serializer serializer = SerializerFactory.getSerializer (OutputProperties.getDefaultMethodProperties("xml")); serializer.setOutputStream(System.out); xmlFilter3.setContentHandler(serializer.asContentHandler());
for (int i = 1; i <= 2; i++){ System.out.println("Trial " + i);
reader.parse(new InputSource("foo" + i + ".xml"));
} } } }
On the second iteration, I get a nullpointerexception from the Parser2.parseInternal method. I've tried several ways of getting the same result but no luck. I have a sneaky suspicion that some streams are being closed the first time through. If I just create a transformer from one stylesheet and reuse that, it works ok. as soon as I use filter chains, it dies. Can anyone shed some light?
Greatly appreciated, Simon
|
|