# SimpleXMLEventWriter.java

    /*
     * Copyright 2011, 2012 Odysseus Software GmbH
     *
     * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package org.apache.synapse.commons.staxon.core.event;

    import java.util.Iterator;

    import javax.xml.namespace.NamespaceContext;
    import javax.xml.namespace.QName;
    import javax.xml.stream.XMLEventReader;
    import javax.xml.stream.XMLEventWriter;
    import javax.xml.stream.XMLStreamConstants;
    import javax.xml.stream.XMLStreamException;
    import javax.xml.stream.XMLStreamWriter;
    import javax.xml.stream.events.Attribute;
    import javax.xml.stream.events.Characters;
    import javax.xml.stream.events.Comment;
    import javax.xml.stream.events.DTD;
    import javax.xml.stream.events.EntityReference;
    import javax.xml.stream.events.Namespace;
    import javax.xml.stream.events.ProcessingInstruction;
    import javax.xml.stream.events.StartDocument;
    import javax.xml.stream.events.StartElement;
    import javax.xml.stream.events.XMLEvent;

    /**
     * Simple implementation of {@link XMLEventWriter}.
     */
    public class SimpleXMLEventWriter implements XMLEventWriter {
        private final XMLStreamWriter delegate;

        public SimpleXMLEventWriter(XMLStreamWriter delegate) {
            this.delegate = delegate;
        }

        @Override
        public void add(XMLEvent event) throws XMLStreamException {
            switch (event.getEventType()) {
                case XMLStreamConstants.ATTRIBUTE:
                    Attribute attribute = (Attribute) event;
                    QName attrName = attribute.getName();
                    delegate.writeAttribute(attrName.getPrefix(), attrName.getNamespaceURI(), attrName.getLocalPart(), attribute.getValue());
                    break;
                case XMLStreamConstants.END_DOCUMENT:
                    delegate.writeEndDocument();
                    break;
                case XMLStreamConstants.END_ELEMENT:
                    delegate.writeEndElement();
                    break;
                case XMLStreamConstants.NAMESPACE:
                    Namespace namespace = (Namespace) event;
                    delegate.writeNamespace(namespace.getPrefix(), namespace.getNamespaceURI());
                    break;
                case XMLStreamConstants.START_DOCUMENT:
                    StartDocument startDocument = (StartDocument) event;
                    if (startDocument.encodingSet()) { // encoding defined?
                        delegate.writeStartDocument(startDocument.getCharacterEncodingScheme(), startDocument.getVersion());
                    } else {
                        delegate.writeStartDocument(startDocument.getVersion());
                    }
                    break;
                case XMLStreamConstants.START_ELEMENT:
                    StartElement startElement = event.asStartElement();
                    QName elemName = startElement.getName();
                    delegate.writeStartElement(elemName.getPrefix(), elemName.getLocalPart(), elemName.getNamespaceURI());
                    Iterator<?> namespaces = startElement.getNamespaces();
                    while (namespaces.hasNext()) {
                        add((Namespace) namespaces.next());
                    }
                    Iterator<?> attributes = startElement.getAttributes();
                    while (attributes.hasNext()) {
                        add((Attribute) attributes.next());
                    }
                    break;
                case XMLStreamConstants.CHARACTERS:
                case XMLStreamConstants.CDATA:
                    Characters characters = event.asCharacters();
                    if (characters.isCData()) {
                        delegate.writeCData(characters.getData());
                    } else {
                        delegate.writeCharacters(characters.getData());
                    }
                    break;
                case XMLStreamConstants.COMMENT:
                    delegate.writeComment(((Comment) event).getText());
                    break;
                case XMLStreamConstants.DTD:
                    delegate.writeDTD(((DTD) event).getDocumentTypeDeclaration());
                    break;
                case XMLStreamConstants.ENTITY_REFERENCE:
                    delegate.writeEntityRef(((EntityReference) event).getName());
                    break;
                case XMLStreamConstants.PROCESSING_INSTRUCTION:
                    ProcessingInstruction processingInstruction = (ProcessingInstruction) event;
                    delegate.writeProcessingInstruction(processingInstruction.getTarget(), processingInstruction.getData());
                    break;
                case XMLStreamConstants.SPACE:
                    break;
                default:
                    throw new XMLStreamException("Cannot write event " + event);
            }
        }

        @Override
        public void add(XMLEventReader reader) throws XMLStreamException {
            while (reader.peek() != null) {
                add(reader.nextEvent());
            }
        }

        @Override
        public void close() throws XMLStreamException {
            delegate.close();
        }

        @Override
        public void flush() throws XMLStreamException {
            delegate.flush();
        }

        @Override
        public NamespaceContext getNamespaceContext() {
            return delegate.getNamespaceContext();
        }

        @Override
        public String getPrefix(String uri) throws XMLStreamException {
            return delegate.getPrefix(uri);
        }

        @Override
        public void setDefaultNamespace(String uri) throws XMLStreamException {
            delegate.setDefaultNamespace(uri);
        }

        @Override
        public void setNamespaceContext(NamespaceContext ctxt) throws XMLStreamException {
            delegate.setNamespaceContext(ctxt);
        }

        @Override
        public void setPrefix(String prefix, String uri) throws XMLStreamException {
            delegate.setPrefix(prefix, uri);
        }
    }