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

Reply via email to