/*-
 *  Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
 * 
 *  This file is part of CityDoctor2.
 *
 *  CityDoctor2 is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  CityDoctor2 is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with CityDoctor2.  If not, see <https://www.gnu.org/licenses/>.
 */
package de.hft.stuttgart.citydoctor2.checkresult.utility;

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

/**
 * Writer for writing indentation as the standard jaxb indentation wraps around
 * at depth 8, which is unwanted in the report. Indentation is 4 blanks
 * currently.
 * 
 * @author Matthias Betz
 *
 */
public class IndentationXmlStreamWriter implements XMLStreamWriter {

	private static final String INDENTATION = "    ";

	private XMLStreamWriter writer;
	private int depth = -1;
	boolean sameElement = true;

	public IndentationXmlStreamWriter(XMLStreamWriter writer) {
		this.writer = writer;
	}

	private void writeIdentation() throws XMLStreamException {
		for (int i = 0; i < depth; i++) {
			writer.writeCharacters(INDENTATION);
		}
	}

	@Override
	public void writeStartElement(String localName) throws XMLStreamException {
		writer.writeCharacters("\n");
		depth++;
		writeIdentation();
		writer.writeStartElement(localName);
		sameElement = true;
	}

	@Override
	public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
		writer.writeCharacters("\n");
		depth++;
		writeIdentation();
		writer.writeStartElement(namespaceURI, localName);
		sameElement = true;
	}

	@Override
	public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
		writer.writeCharacters("\n");
		depth++;
		writeIdentation();
		writer.writeStartElement(prefix, localName, namespaceURI);
		sameElement = true;
	}

	@Override
	public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
		writer.writeCharacters("\n");
		depth++;
		writeIdentation();
		depth--;
		writer.writeEmptyElement(namespaceURI, localName);
		sameElement = false;
	}

	@Override
	public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
		writer.writeCharacters("\n");
		depth++;
		writeIdentation();
		depth--;
		writer.writeEmptyElement(prefix, localName, namespaceURI);
		sameElement = false;
	}

	@Override
	public void writeEmptyElement(String localName) throws XMLStreamException {
		writer.writeCharacters("\n");
		depth++;
		writeIdentation();
		depth--;
		writer.writeEmptyElement(localName);
		sameElement = false;
	}

	@Override
	public void writeEndElement() throws XMLStreamException {
		if (!sameElement) {
			writer.writeCharacters("\n");
			writeIdentation();
		}
		depth--;
		writer.writeEndElement();
		sameElement = false;
	}

	@Override
	public void writeEndDocument() throws XMLStreamException {
		writer.writeEndDocument();
	}

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

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

	@Override
	public void writeAttribute(String localName, String value) throws XMLStreamException {
		writer.writeAttribute(localName, value);
	}

	@Override
	public void writeAttribute(String prefix, String namespaceURI, String localName, String value)
			throws XMLStreamException {
		writer.writeAttribute(prefix, namespaceURI, localName, value);
	}

	@Override
	public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException {
		writer.writeAttribute(namespaceURI, localName, value);
	}

	@Override
	public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException {
		writer.writeNamespace(prefix, namespaceURI);
	}

	@Override
	public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException {
		writer.writeDefaultNamespace(namespaceURI);
	}

	@Override
	public void writeComment(String data) throws XMLStreamException {
		writeIdentation();
		writer.writeComment(data);
	}

	@Override
	public void writeProcessingInstruction(String target) throws XMLStreamException {
		writer.writeProcessingInstruction(target);
	}

	@Override
	public void writeProcessingInstruction(String target, String data) throws XMLStreamException {
		writer.writeProcessingInstruction(target, data);
	}

	@Override
	public void writeCData(String data) throws XMLStreamException {
		writer.writeCData(data);
	}

	@Override
	public void writeDTD(String dtd) throws XMLStreamException {
		writer.writeDTD(dtd);
	}

	@Override
	public void writeEntityRef(String name) throws XMLStreamException {
		writer.writeEntityRef(name);
	}

	@Override
	public void writeStartDocument() throws XMLStreamException {
		writer.writeStartDocument();
	}

	@Override
	public void writeStartDocument(String version) throws XMLStreamException {
		writer.writeStartDocument(version);
	}

	@Override
	public void writeStartDocument(String encoding, String version) throws XMLStreamException {
		writer.writeStartDocument(encoding, version);
	}

	@Override
	public void writeCharacters(String text) throws XMLStreamException {
		writer.writeCharacters(text);
	}

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

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

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

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

	@Override
	public void setNamespaceContext(NamespaceContext context) throws XMLStreamException {
		writer.setNamespaceContext(context);
	}

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

	@Override
	public Object getProperty(String name) {
		return writer.getProperty(name);
	}

}
