/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.util.xml;
import java.io.Flushable;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import javax.xml.namespace.NamespaceContext;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import net.sf.saxon.event.StreamWriterToReceiver;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.Serializer.Property;
import org.apache.commons.io.output.XmlStreamWriter;
import com.google.common.base.Throwables;
/**
* Provides utils for when working with XML.
*/
public final class FormattingXmlStreamWriter implements XMLStreamWriter {
private final StreamWriterToReceiver _delegate;
private final Flushable _flushable;
public FormattingXmlStreamWriter(StreamWriterToReceiver delegate, Flushable flushable) {
_delegate = delegate;
_flushable = flushable;
}
/**
*
*/
public static class FormattingXMLStreamWriterBuilder {
private final Serializer _serializer;
private final Flushable _flushable;
private boolean _indent;
private Integer _lineLength;
FormattingXMLStreamWriterBuilder(Serializer serializer, Flushable flushable) {
_serializer = serializer;
_flushable = flushable;
}
public FormattingXMLStreamWriterBuilder indent(boolean indent) {
this._indent = indent;
return this;
}
public FormattingXMLStreamWriterBuilder lineLength(int lineLength) {
this._lineLength = lineLength;
return this;
}
public FormattingXmlStreamWriter build() {
if (_indent) {
_serializer.setOutputProperty(Property.INDENT, "yes");
}
if (_lineLength != null) {
_serializer.setOutputProperty(Property.SAXON_LINE_LENGTH, _lineLength.toString());
}
StreamWriterToReceiver xmlStreamWriter;
try {
xmlStreamWriter = _serializer.getXMLStreamWriter();
} catch (SaxonApiException ex) {
throw Throwables.propagate(ex);
}
return new FormattingXmlStreamWriter(xmlStreamWriter, _flushable);
}
}
/**
* Create a new {@link XmlStreamWriter} builder with a {@link Writer}
* @param writer the writer to use
* @return a builder
*/
public static FormattingXMLStreamWriterBuilder builder(Writer writer) {
Serializer serializer = new Processor(false).newSerializer(writer);
return new FormattingXMLStreamWriterBuilder(serializer, writer);
}
/**
* Create a new {@link XmlStreamWriter} builder with an {@link OutputStream}
* @param os the output stream to use
* @return a builder
*/
public static FormattingXMLStreamWriterBuilder formattingStreamWriterBuilder(OutputStream os) {
Serializer serializer = new Processor(false).newSerializer(os);
return new FormattingXMLStreamWriterBuilder(serializer, os);
}
@Override
public void close() throws XMLStreamException {
_delegate.close();
}
@Override
public void flush() throws XMLStreamException {
//saxon XMLStreamWriter doesn't call through to the
//underlying writer/output stream in its flush
//implementation, so do it here.
try {
_flushable.flush();
} catch (IOException ex) {
throw new XMLStreamException(ex);
}
}
@Override
public NamespaceContext getNamespaceContext() {
return _delegate.getNamespaceContext();
}
@Override
public String getPrefix(String uri) throws XMLStreamException {
return _delegate.getPrefix(uri);
}
@Override
public Object getProperty(String name) throws IllegalArgumentException {
return _delegate.getProperty(name);
}
@Override
public void setDefaultNamespace(String uri) throws XMLStreamException {
_delegate.setDefaultNamespace(uri);
}
@Override
public void setNamespaceContext(NamespaceContext context) throws XMLStreamException {
_delegate.setNamespaceContext(context);
}
@Override
public void setPrefix(String prefix, String uri) throws XMLStreamException {
_delegate.setPrefix(prefix, uri);
}
@Override
public void writeAttribute(String localName, String value) throws XMLStreamException {
_delegate.writeAttribute(localName, value);
}
@Override
public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException {
_delegate.writeAttribute(namespaceURI, localName, value);
}
@Override
public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException {
_delegate.writeAttribute(prefix, namespaceURI, localName, value);
}
@Override
public void writeCData(String data) throws XMLStreamException {
_delegate.writeCData(data);
}
@Override
public void writeCharacters(String text) throws XMLStreamException {
_delegate.writeCharacters(text);
}
@Override
public void writeCharacters(char[] text, int start, int len) throws XMLStreamException {
_delegate.writeCharacters(text, start, len);
}
@Override
public void writeComment(String data) throws XMLStreamException {
_delegate.writeComment(data);
}
@Override
public void writeDTD(String dtd) throws XMLStreamException {
_delegate.writeDTD(dtd);
}
@Override
public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException {
_delegate.writeDefaultNamespace(namespaceURI);
}
@Override
public void writeEmptyElement(String localName) throws XMLStreamException {
_delegate.writeEmptyElement(localName);
}
@Override
public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
_delegate.writeEmptyElement(namespaceURI, localName);
}
@Override
public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
_delegate.writeEmptyElement(prefix, localName, namespaceURI);
}
@Override
public void writeEndDocument() throws XMLStreamException {
_delegate.writeEndDocument();
}
@Override
public void writeEndElement() throws XMLStreamException {
_delegate.writeEndElement();
}
@Override
public void writeEntityRef(String name) throws XMLStreamException {
_delegate.writeEntityRef(name);
}
@Override
public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException {
_delegate.writeNamespace(prefix, namespaceURI);
}
@Override
public void writeProcessingInstruction(String target) throws XMLStreamException {
_delegate.writeProcessingInstruction(target);
}
@Override
public void writeProcessingInstruction(String target, String data) throws XMLStreamException {
_delegate.writeProcessingInstruction(target, data);
}
@Override
public void writeStartDocument() throws XMLStreamException {
_delegate.writeStartDocument();
}
@Override
public void writeStartDocument(String version) throws XMLStreamException {
_delegate.writeStartDocument(version);
}
@Override
public void writeStartDocument(String encoding, String version) throws XMLStreamException {
_delegate.writeStartDocument(encoding, version);
}
@Override
public void writeStartElement(String localName) throws XMLStreamException {
_delegate.writeStartElement(localName);
}
@Override
public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
_delegate.writeStartElement(namespaceURI, localName);
}
@Override
public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
_delegate.writeStartElement(prefix, localName, namespaceURI);
}
}