net.sf.joost.trax.TransformerHandlerImpl.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.joost.trax.TransformerHandlerImpl.java

Source

/*
 * $Id: TransformerHandlerImpl.java,v 1.15 2007/07/15 15:20:41 obecker Exp $
 *
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is: this file
 *
 * The Initial Developer of the Original Code is Anatolij Zubow.
 *
 * Portions created by  ______________________
 * are Copyright (C) ______ _______________________.
 * All Rights Reserved.
 *
 * Contributor(s): ______________________________________.
 */

package net.sf.joost.trax;

import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.TransformerHandler;

import net.sf.joost.Constants;
import net.sf.joost.OptionalLog;
import net.sf.joost.emitter.DOMEmitter;
import net.sf.joost.emitter.StxEmitter;
import net.sf.joost.stx.Processor;

import org.apache.commons.logging.Log;
import org.w3c.dom.Node;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;

/**
 * This class implements the TransformerHandler-Interface for TraX.
 * This class could be used with a SAXResult. So you can simply
 * downcast the TransformerFactory to a SAXTransformerFactory, calling
 * getTransformerHandler() and process the transformation with a
 * Sax-Parser.
 * TransformerHandler acts as a proxy an propagates the Sax-Events to
 * the underlying joost-stx-engine the Processor-class
 * @author Zubow
 */
public class TransformerHandlerImpl implements TransformerHandler, Constants {

    // Define a static logger variable so that it references the
    // Logger instance named "TransformerHandlerImpl".
    private static Log log = OptionalLog.getLog(TransformerHandlerImpl.class);

    /**
     * Processor is the joost-stx-engine
     */
    private Processor processor = null;
    private Transformer transformer = null;
    /**
     * Handler for constructing the Resulttype.
     */
    private StxEmitter stxEmitter = null;

    /**
     * Necessary for the document root.
     */
    private String systemId = null;

    /**
     * The according Result.
     */
    private Result result = null;

    /**
     * Constructor.
     * @param transformer
     */
    protected TransformerHandlerImpl(Transformer transformer) {

        if (DEBUG)
            log.debug("calling constructor");
        // Save the reference to the transformer
        this.transformer = transformer;
    }

    //*************************************************************************
    // IMPLEMENTATION OF TransformerHandler
    //*************************************************************************

    /**
     * Getter for {@link #systemId}
     * @return <code>String</code>
     */
    public String getSystemId() {
        return systemId;
    }

    /**
     * Gets a <code>Transformer</code> object.
     * @return <code>String</code>
     */
    public Transformer getTransformer() {
        return transformer;
    }

    /**
     * Setter for {@link #result}
     * @param result A <code>Result</code>
     * @throws IllegalArgumentException
     */
    public void setResult(Result result) throws IllegalArgumentException {

        if (DEBUG)
            log.debug("setting Result - here SAXResult");

        try {
            this.result = result;
            // init saxresult
            init(result);
        } catch (TransformerException e) {
            if (transformer instanceof TransformerImpl) {
                TransformerConfigurationException tE = new TransformerConfigurationException(e.getMessage(), e);
                try {
                    transformer.getErrorListener().fatalError(tE);
                } catch (TransformerException innerE) {
                    throw new IllegalArgumentException(innerE.getMessage());
                }
            } else {
                if (log != null)
                    log.fatal(e);
                throw new IllegalArgumentException("result is invalid.");
            }
        }
    }

    /**
     * Setter for {@link #systemId}
     * @param systemId the system identifier to set
     */
    public void setSystemId(String systemId) {
        this.systemId = systemId;
    }

    //*************************************************************************
    // Helper methods
    //*************************************************************************

    /**
     * Helpermethod
     */
    private void init(Result result) throws TransformerException {

        if (DEBUG)
            log.debug("init emitter-class according to result");

        if (this.transformer instanceof TransformerImpl) {
            this.processor = ((TransformerImpl) this.transformer).getStxProcessor();

            // initialize Emitter --> DOM-, SAX- or StreamEmitter
            stxEmitter = TrAXHelper.initStxEmitter(result, processor, null);
            stxEmitter.setSystemId(result.getSystemId());
            // setting Handler
            this.processor.setContentHandler(stxEmitter);
            this.processor.setLexicalHandler(stxEmitter);
        }
    }

    //*************************************************************************
    // IMPLEMENTATION of ContentHandler, LexicalHandler, DTDHandler
    //*************************************************************************

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void setDocumentLocator(Locator locator) {
        processor.setDocumentLocator(locator);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void startDocument() throws SAXException {
        processor.startDocument();
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void endDocument() throws SAXException {
        processor.endDocument();

        //set the constructed DOM-Node on the DOMResult
        if (result instanceof DOMResult) {
            if (DEBUG)
                log.debug("result is a DOMResult");
            Node nodeResult = ((DOMEmitter) stxEmitter).getDOMTree();
            //DOM specific Implementation
            ((DOMResult) result).setNode(nodeResult);
            return;
        }
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void startPrefixMapping(String prefix, String uri) throws SAXException {

        processor.startPrefixMapping(prefix, uri);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void endPrefixMapping(String prefix) throws SAXException {
        processor.endPrefixMapping(prefix);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void startElement(String namespaceURI, String localName, String qName, Attributes atts)
            throws SAXException {

        processor.startElement(namespaceURI, localName, qName, atts);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException {

        processor.endElement(namespaceURI, localName, qName);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void characters(char[] ch, int start, int length) throws SAXException {

        processor.characters(ch, start, length);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {

        processor.ignorableWhitespace(ch, start, length);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void processingInstruction(String target, String data) throws SAXException {

        processor.processingInstruction(target, data);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void skippedEntity(String name) throws SAXException {
        processor.skippedEntity(name);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void startDTD(String name, String publicId, String systemId) throws SAXException {

        processor.startDTD(name, publicId, systemId);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void endDTD() throws SAXException {
        processor.endDTD();
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void startEntity(String name) throws SAXException {
        processor.startEntity(name);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void endEntity(String name) throws SAXException {
        processor.endEntity(name);
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void startCDATA() throws SAXException {
        processor.startCDATA();
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void endCDATA() throws SAXException {
        processor.endCDATA();
    }

    /**
     * Propagates the Sax-Event to Joost-Processor.
     */
    public void comment(char[] ch, int start, int length) throws SAXException {
        processor.comment(ch, start, length);
    }

    /**
     * Sax-Event - empty
     */
    public void notationDecl(String name, String publicId, String systemId) throws SAXException {
        //what do with this ??? no analogon in Processor-class
    }

    /**
     * Sax-Event - empty
     */
    public void unparsedEntityDecl(String name, String publicId, String systemId, String notationName)
            throws SAXException {
        //what do with this ??? no analogon in Processor-class
    }
}