de.huxhorn.sulky.stax.IndentingXMLStreamWriter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of de.huxhorn.sulky.stax Show documentation
Show all versions of de.huxhorn.sulky.stax Show documentation
This file is part of the sulky modules. It contains helper methods to simplify usage of StAX.
The newest version!
/*
* sulky-modules - several general-purpose modules.
* Copyright (C) 2007-2019 Joern Huxhorn
*
* This program 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.
*
* This program 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 this program. If not, see .
*/
/*
* Copyright 2007-2019 Joern Huxhorn
*
* 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 de.huxhorn.sulky.stax;
import javax.xml.namespace.NamespaceContext;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class IndentingXMLStreamWriter
implements XMLStreamWriter
{
private static final String SYSTEM_LINE_SEPARATOR = System.getProperty("line.separator");
private XMLStreamWriter writer;
private int indentLevel;
private boolean wroteText;
private final String lineSeparator;
private final String indentString;
public IndentingXMLStreamWriter(XMLStreamWriter writer)
{
this(writer, SYSTEM_LINE_SEPARATOR, "\t");
}
public IndentingXMLStreamWriter(XMLStreamWriter writer, String lineSeparator)
{
this(writer, lineSeparator, "\t");
}
public IndentingXMLStreamWriter(XMLStreamWriter writer, String lineSeparator, String indentString)
{
if(writer == null)
{
// so we have consistent behaviour in case of debug or not.
throw new IllegalArgumentException("writer must not be null!");
}
if(lineSeparator == null)
{
throw new IllegalArgumentException("lineSeparator must not be null!");
}
if(indentString == null)
{
throw new IllegalArgumentException("indentString must not be null!");
}
this.writer = writer;
this.lineSeparator = lineSeparator;
this.indentString = indentString;
final Logger logger = LoggerFactory.getLogger(IndentingXMLStreamWriter.class);
if(logger.isDebugEnabled()) logger.debug("writer-class: {}", writer.getClass());
this.indentLevel = 0;
this.wroteText = false;
}
@Override
public void writeStartElement(String localName)
throws XMLStreamException
{
writeIndent();
writer.writeStartElement(localName);
increaseIndentLevel();
wroteText = false;
}
@Override
public void writeStartElement(String namespaceURI, String localName)
throws XMLStreamException
{
writeIndent();
writer.writeStartElement(namespaceURI, localName);
increaseIndentLevel();
wroteText = false;
}
@Override
public void writeStartElement(String prefix, String localName, String namespaceURI)
throws XMLStreamException
{
writeIndent();
writer.writeStartElement(prefix, localName, namespaceURI);
increaseIndentLevel();
wroteText = false;
}
@Override
public void writeEmptyElement(String namespaceURI, String localName)
throws XMLStreamException
{
writeIndent();
writer.writeEmptyElement(namespaceURI, localName);
wroteText = false;
}
@Override
public void writeEmptyElement(String prefix, String localName, String namespaceURI)
throws XMLStreamException
{
writeIndent();
writer.writeEmptyElement(prefix, localName, namespaceURI);
wroteText = false;
}
@Override
public void writeEmptyElement(String localName)
throws XMLStreamException
{
writeIndent();
writer.writeEmptyElement(localName);
wroteText = false;
}
private void writeIndent()
throws XMLStreamException
{
StringBuilder indentStr = new StringBuilder(lineSeparator);
for(int i = 0; i < indentLevel; i++)
{
indentStr.append(indentString);
}
writer.writeCharacters(indentStr.toString());
}
private void increaseIndentLevel()
{
indentLevel++;
}
private void decreaseIndentLevel()
{
indentLevel--;
if(indentLevel < 0)
{
indentLevel = 0;
}
}
@Override
public void writeEndElement()
throws XMLStreamException
{
decreaseIndentLevel();
if(!wroteText)
{
writeIndent();
wroteText = false;
}
writer.writeEndElement();
wroteText = 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
{
data = StaxUtilities.normalizeNewlines(data);
if(data != null)
{
data = data.replace("\n", lineSeparator);
}
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
{
data = StaxUtilities.normalizeNewlines(data);
if(data != null)
{
data = data.replace("\n", lineSeparator);
}
writer.writeCData(data);
wroteText = true;
}
@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();
wroteText = false;
}
@Override
public void writeStartDocument(String version)
throws XMLStreamException
{
writer.writeStartDocument(version);
wroteText = false;
}
@Override
public void writeStartDocument(String encoding, String version)
throws XMLStreamException
{
writer.writeStartDocument(encoding, version);
wroteText = false;
}
@Override
public void writeCharacters(String text)
throws XMLStreamException
{
text = StaxUtilities.normalizeNewlines(text);
if(text != null)
{
text = text.replace("\n", lineSeparator);
}
writer.writeCharacters(text);
wroteText = true;
}
@Override
public void writeCharacters(char[] text, int start, int len)
throws XMLStreamException
{
writer.writeCharacters(text, start, len);
wroteText = true;
}
@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);
}
}