/*
 * 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.xml.util;

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

import org.apache.synapse.commons.staxon.core.util.StreamWriterDelegate;

/**
 * Pretty printing XML stream writer.
 */
public class PrettyXMLStreamWriter extends StreamWriterDelegate {
    private final PrettyXMLWhitespaceHandler handler;

    /**
     * Create instance using default indentation (\t) and line separator (\n).
     *
     * @param writer parent writer
     */
    public PrettyXMLStreamWriter(XMLStreamWriter writer) {
        this(writer, "\t", "\n");
    }

    /**
     * Create instance.
     *
     * @param writer      parent writer
     * @param indentation line indentation
     * @param newline     line separator
     */
    public PrettyXMLStreamWriter(XMLStreamWriter writer, String indentation, String newline) {
        super(writer);
        this.handler = new PrettyXMLWhitespaceHandler(writer, indentation, newline);
    }

    @Override
    public void setParent(XMLStreamWriter parent) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void writeStartDocument() throws XMLStreamException {
        handler.preStartDocument();
        super.writeStartDocument();
        handler.postStartDocument();
    }

    @Override
    public void writeStartDocument(String version) throws XMLStreamException {
        handler.preStartDocument();
        super.writeStartDocument(version);
        handler.postStartDocument();
    }

    @Override
    public void writeStartDocument(String encoding, String version) throws XMLStreamException {
        handler.preStartDocument();
        super.writeStartDocument(encoding, version);
        handler.postStartDocument();
    }

    @Override
    public void writeStartElement(String localName) throws XMLStreamException {
        handler.preStartElement();
        super.writeStartElement(localName);
        handler.postStartElement();
    }

    @Override
    public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
        handler.preStartElement();
        super.writeStartElement(namespaceURI, localName);
        handler.postStartElement();
    }

    @Override
    public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
        handler.preStartElement();
        super.writeStartElement(prefix, localName, namespaceURI);
        handler.postStartElement();
    }

    @Override
    public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
        handler.preEmptyELement();
        super.writeEmptyElement(namespaceURI, localName);
        handler.postEmptyELement();
    }

    @Override
    public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
        handler.preEmptyELement();
        super.writeEmptyElement(prefix, localName, namespaceURI);
        handler.postEmptyELement();
    }

    @Override
    public void writeEmptyElement(String localName) throws XMLStreamException {
        handler.preEmptyELement();
        super.writeEmptyElement(localName);
        handler.postEmptyELement();
    }

    @Override
    public void writeEndElement() throws XMLStreamException {
        handler.preEndElement();
        super.writeEndElement();
        handler.postEndElement();
    }

    @Override
    public void writeCData(String data) throws XMLStreamException {
        handler.preCharacters();
        super.writeCData(data);
        handler.postCharacters();
    }

    @Override
    public void writeCharacters(String text) throws XMLStreamException {
        handler.preCharacters();
        super.writeCharacters(text);
        handler.postCharacters();
    }

    @Override
    public void writeCharacters(char[] text, int start, int len) throws XMLStreamException {
        handler.preCharacters();
        super.writeCharacters(text, start, len);
        handler.postCharacters();
    }

    @Override
    public void writeComment(String data) throws XMLStreamException {
        handler.preComment();
        super.writeComment(data);
        handler.postComment();
    }

    @Override
    public void writeProcessingInstruction(String target) throws XMLStreamException {
        handler.preProcessingInstruction();
        super.writeProcessingInstruction(target);
        handler.postProcessingInstruction();
    }

    @Override
    public void writeProcessingInstruction(String target, String data) throws XMLStreamException {
        handler.preProcessingInstruction();
        super.writeProcessingInstruction(target, data);
        handler.postProcessingInstruction();
    }
}
