All Downloads are FREE. Search and download functionalities are using the official Maven repository.

javanet.staxutils.StAXStreamContentHandler Maven / Gradle / Ivy

There is a newer version: 2.2.1
Show newest version
/*
 * $Id: StAXStreamContentHandler.java,v 1.5 2004/07/05 23:15:11 cniles Exp $
 * 
 * Copyright (c) 2004, Christian Niles, Unit12
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 *		*   Redistributions of source code must retain the above copyright
 *          notice, this list of conditions and the following disclaimer.
 * 
 *	    *	Redistributions in binary form must reproduce the above copyright
 *          notice, this list of conditions and the following disclaimer in the
 *          documentation and/or other materials provided with the distribution.
 * 
 *      *   Neither the name of Christian Niles, Unit12, nor the names of its
 *          contributors may be used to endorse or promote products derived from
 *          this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 */
package javanet.staxutils;

import java.util.Iterator;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

/**
 * SAX ContentHandler that writes events to a StAX {@link XMLStreamWriter}.
 * 
 * @author Christian Niles
 * @version $Revision: 1.5 $
 */
public class StAXStreamContentHandler extends StAXContentHandler {

  /** The StAX stream to which SAX events will be written. */
  private XMLStreamWriter writer;

  public StAXStreamContentHandler() {

  }

  /**
   * Constructs an instance that writes SAX events to the specified StAX stream.
   * 
   * @param writer
   *          The StAX stream to which events will be written.
   */
  public StAXStreamContentHandler(XMLStreamWriter writer) {

    this.writer = writer;

  }

  /**
   * Returns a reference to the {@link XMLStreamWriter}to which SAX events are
   * written.
   * 
   * @return The {@link XMLStreamWriter}to which SAX events are written.
   */
  public XMLStreamWriter getStreamWriter() {

    return writer;

  }

  /**
   * Sets the {@link XMLStreamWriter}to which SAX events will be written.
   * 
   * @param writer
   *          The {@link XMLStreamWriter}to which SAX events will be written.
   */
  public void setStreamWriter(XMLStreamWriter writer) {

    this.writer = writer;

  }

  public void startDocument() throws SAXException {

    super.startDocument();
    try {

      writer.writeStartDocument();

    } catch (XMLStreamException e) {

      throw new SAXException(e);

    }

  }

  public void endDocument() throws SAXException {

    try {

      writer.writeEndDocument();

    } catch (XMLStreamException e) {

      throw new SAXException(e);

    }

    super.endDocument();

  }

  public void startElement(String uri, String localName, String qName, Attributes attributes)
      throws SAXException {

    try {

      String[] qname = { null, null };
      parseQName(qName, qname);

      writer.writeStartElement(qname[0], qname[1], uri);

      // copy namespaces
      if (namespaces != null) {

        Iterator prefixes = namespaces.getDeclaredPrefixes();
        while (prefixes.hasNext()) {

          String prefix = (String) prefixes.next();
          String nsURI = namespaces.getNamespaceURI(prefix);

          if (prefix.length() == 0) {

            writer.setDefaultNamespace(nsURI);

          } else {

            writer.setPrefix(prefix, nsURI);

          }

          writer.writeNamespace(prefix, nsURI);

        }

      }

      // write attributes
      for (int i = 0, s = attributes.getLength(); i < s; i++) {

        parseQName(attributes.getQName(i), qname);

        String attrPrefix = qname[0];
        String attrLocal = qname[1];

        String attrQName = attributes.getQName(i);
        String attrValue = attributes.getValue(i);
        String attrURI = attributes.getURI(i);

        if ("xmlns".equals(attrQName) || "xmlns".equals(attrPrefix)) {

          // namespace declaration disguised as an attribute. If the
          // namespace has already been declared, skip it, otherwise
          // write it as an namespace

          String nsURI = namespaces.getNamespaceURI(attrPrefix);
          if (nsURI == null) {

            if (attrPrefix.length() == 0) {

              writer.setDefaultNamespace(attrValue);

            } else {

              writer.setPrefix(attrPrefix, attrValue);

            }

            writer.writeNamespace(attrPrefix, attrValue);

          }

        } else if (attrPrefix.length() > 0) {

          writer.writeAttribute(attrPrefix, attrURI, attrLocal, attrValue);

        } else {

          writer.writeAttribute(attrQName, attrValue);

        }

      }

    } catch (XMLStreamException e) {

      throw new SAXException(e);

    } finally {

      super.startElement(uri, localName, qName, attributes);

    }

  }

  public void endElement(String uri, String localName, String qName) throws SAXException {

    try {

      writer.writeEndElement();

    } catch (XMLStreamException e) {

      throw new SAXException(e);

    } finally {

      super.endElement(uri, localName, qName);

    }

  }

  public void comment(char[] ch, int start, int length) throws SAXException {

    super.comment(ch, start, length);
    try {

      writer.writeComment(new String(ch, start, length));

    } catch (XMLStreamException e) {

      throw new SAXException(e);

    }

  }

  public void characters(char[] ch, int start, int length) throws SAXException {

    super.characters(ch, start, length);
    try {

      if (!isCDATA) {

        writer.writeCharacters(ch, start, length);

      }

    } catch (XMLStreamException e) {

      throw new SAXException(e);

    }

  }

  public void endCDATA() throws SAXException {

    try {

      writer.writeCData(CDATABuffer.toString());

    } catch (XMLStreamException e) {

      throw new SAXException(e);

    }

    super.endCDATA();

  }

  public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {

    super.ignorableWhitespace(ch, start, length);
    try {

      writer.writeCharacters(ch, start, length);

    } catch (XMLStreamException e) {

      throw new SAXException(e);

    }

  }

  public void processingInstruction(String target, String data) throws SAXException {

    super.processingInstruction(target, data);
    try {

      writer.writeProcessingInstruction(target, data);

    } catch (XMLStreamException e) {

      throw new SAXException(e);

    }

  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy