[jdom-interest] making SAXHandler class public?

Jan Peter Hecking jan at netgaroo.com
Wed Feb 14 15:12:03 PST 2001


A while ago I asked whether it would be possible to turn the SAXHandler
class used by the SAXBuilder internaly into a public class. Well, I
went ahead and did so in my JDOM source tree. In the attached program
one can see why I think this change is useful: there's no need any more
for those pesky Piped(Input|Output)Streams when trying to transform a
JDOM document into another JDOM document using the TrAX API. As the
J2SE API docs state:

------------------------------ snip --------------------------------
[...] Typically, data is read from a PipedInputStream object by one
thread and data is written to the corresponding PipedOutputStream
by some other thread. Attempting to use both objects from a single
thread is not recommended, as it may deadlock the thread. [...]
------------------------------ snip --------------------------------

I had this problem and using the SAXHandler directly is the most elegant
solution to this problem I think. It is probably a lot faster, too.

If there is no fundamental problem with turning the SAXHandler into a
public class I would like to suggest this change for the JDOM API.
No changes to the SAXHandler class or the SAXBuilder class are


Jan Peter Hecking                  jhecking at netgaroo.com
University of Rostock     Department of Computer Science
Homepage: http://www.informatik.uni-rostock.de/~jhecking
-------------- next part --------------
import org.jdom.Document;
import org.jdom.input.SAXHandler;
import org.jdom.output.SAXOutputter;

import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import javax.xml.transform.Templates;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TemplatesHandler;
import javax.xml.transform.sax.TransformerHandler;

 * Helper class with one static method to allow clients to transform JDOM
 * documents using XSLT.
public class XsltTransformer
    private static SAXOutputter saxOutputter;
    private static SAXTransformerFactory saxTFactory;
    private static TemplatesHandler templatesHandler;
    private static XMLReader reader;

            // don't forget to set the ContentHandler before using
            // the outputter!
            saxOutputter = new SAXOutputter( null );
            saxTFactory = (SAXTransformerFactory) TransformerFactory.newInstance();
            templatesHandler = saxTFactory.newTemplatesHandler();
            reader = XMLReaderFactory.createXMLReader();
            reader.setContentHandler( templatesHandler );
        catch( Exception e ){
            //System.exit( -1 );

     * Transforms a JDOM document into another JDOM document using the given
     * stylesheet.
    public static Document transform( Document sourceDoc, String stylesheet )
        throws XsltTransformerException
            reader.parse( stylesheet );

            Templates templates = templatesHandler.getTemplates();
            TransformerHandler handler = saxTFactory.newTransformerHandler(
                    templates );

            Document targetDoc = new Document( null );
            // had to turn SAXHandler into a public class to use it here:
            handler.setResult( new SAXResult( new SAXHandler( targetDoc ) ) );

            saxOutputter.setContentHandler( handler );
            saxOutputter.output( sourceDoc );

            return targetDoc;
        catch( Exception e ){
            throw new XsltTransformerException( e );
-------------- next part --------------
 * Encapsulates all Exceptions that can be thrown by the
 * XsltTransformer.transform() method.
public class XsltTransformerException
    extends Exception
    private Exception nestedException;

    public XsltTransformerException( Exception e )
        super( e.getMessage() );
        nestedException = e;

    public Exception getNestedException()
        return nestedException;

More information about the jdom-interest mailing list