xyz.cofe.xml.FormatXMLWriter Maven / Gradle / Ivy
The newest version!
/*
* The MIT License
*
* Copyright 2015 Kamnev Georgiy ([email protected]).
*
* Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного
* обеспечения и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
* использовать Программное Обеспечение без ограничений, включая неограниченное право на
* использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование
* и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется
* данное Программное Обеспечение, при соблюдении следующих условий:
*
* Вышеупомянутый копирайт и данные условия должны быть включены во все копии
* или значимые части данного Программного Обеспечения.
*
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
* ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
* СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ
* ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ
* ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ
* ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
* ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
*/
package xyz.cofe.xml;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import javax.xml.namespace.NamespaceContext;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stax.StAXResult;
import org.w3c.dom.Node;
/**
* XMLWriter с поддержкой отступов, и поддержкой экранирования
* @author gocha
*/
public class FormatXMLWriter implements XMLStreamWriter
{
private static javax.xml.stream.XMLOutputFactory outFactory = null;
private OutlineXMLWriter outline = null;
private boolean escapeWriteChars = false;
private boolean writeStartDocument = true;
// private boolean closeStream =
public boolean isWriteOutline() {
if( outline==null )return true;
return outline.isWriteOutline();
}
public void setWriteOutline(boolean writeOutline) {
if( outline==null )return;
outline.setWriteOutline(writeOutline);
}
public FormatXMLWriter(File file,Charset encoding)
{
if (file == null) {
throw new IllegalArgumentException("file == null");
}
if (encoding == null) {
throw new IllegalArgumentException("encoding == null");
}
FileOutputStream fout = null;
try {
fout = new FileOutputStream(file);
} catch (FileNotFoundException ex) {
throw new Error(ex.getMessage(),ex);
}
Writer wr = new OutputStreamWriter(fout, encoding);
try
{
outline = new OutlineXMLWriter(createXMLWriter(wr));
}
catch(XMLStreamException ex)
{
throw new Error(ex.getMessage(),ex);
}
}
/**
* Конструктор по умолчанию
*/
public FormatXMLWriter()
{
try
{
outline = new OutlineXMLWriter(createXMLWriter(System.out));
} catch (XMLStreamException ex) {
throw new Error(ex.getMessage(),ex);
}
}
/**
* Конструктор
* @param writer исходный XMLStreamWriter
*/
public FormatXMLWriter(XMLStreamWriter writer)
{
if (writer == null)
{
throw new IllegalArgumentException("writer==null");
}
outline = new OutlineXMLWriter(writer);
}
/**
* Конструктор
* @param writer исходный Writer
* @throws javax.xml.stream.XMLStreamException Ошибка IO
*/
public FormatXMLWriter(Writer writer) throws XMLStreamException
{
if (writer == null)
{
throw new IllegalArgumentException("writer==null");
}
outline = new OutlineXMLWriter(createXMLWriter(writer));
}
/**
* Конструктор
* @param stream Поток куда будет писаться
* @param enconding Кодировка
* @throws XMLStreamException Мало ли что
*/
public FormatXMLWriter(OutputStream stream, String enconding) throws XMLStreamException
{
if (stream == null)
{
throw new IllegalArgumentException("stream==null");
}
if (enconding == null)
{
throw new IllegalArgumentException("enconding==null");
}
outline = new OutlineXMLWriter(createXMLWriter(stream, enconding));
}
/**
* Конструктор
* @param stream Поток куда будет писаться
* @throws javax.xml.stream.XMLStreamException Мало ли что
*/
public FormatXMLWriter(OutputStream stream) throws XMLStreamException
{
if (stream == null)
{
throw new IllegalArgumentException("stream==null");
}
outline = new OutlineXMLWriter(createXMLWriter(stream));
}
/**
* Конструктр
* @param result Поток куда будет писаться
* @throws javax.xml.stream.XMLStreamException Мало ли что
*/
public FormatXMLWriter(javax.xml.transform.Result result) throws XMLStreamException
{
if (result == null)
{
throw new IllegalArgumentException("result==null");
}
outline = new OutlineXMLWriter(createXMLWriter(result));
}
private static XMLStreamWriter createXMLWriter(OutputStream stream, String enconding) throws XMLStreamException
{
return outFactory().createXMLStreamWriter(stream, enconding);
}
private static XMLStreamWriter createXMLWriter(OutputStream stream) throws XMLStreamException
{
return outFactory().createXMLStreamWriter(stream);
}
private static XMLStreamWriter createXMLWriter(Writer writer) throws XMLStreamException
{
return outFactory().createXMLStreamWriter(writer);
}
private static XMLStreamWriter createXMLWriter(javax.xml.transform.Result result) throws XMLStreamException
{
return outFactory().createXMLStreamWriter(result);
}
private static javax.xml.stream.XMLOutputFactory outFactory()
{
if (outFactory == null)
{
outFactory = XMLOutputFactory.newInstance();
}
return outFactory;
}
/**
* Экранирует символы проходящие через методы writeCharacters. (по умол. нет)
* @return Экранирует (по умол. нет)
*/
public boolean isEscapeWriteChars()
{
return escapeWriteChars;
}
/**
* Устанавливае Экранирует символы проходящие через методы writeCharacters. (по умол. нет)
* @param escapeWriteChars Экранирует (по умол. нет)
*/
public void setEscapeWriteChars(boolean escapeWriteChars)
{
this.escapeWriteChars = escapeWriteChars;
}
/**
* Кодирует строку в формат html (замееняет символы &,<,> на соответствующие)
* @param text Текст
* @return Кодированный текст
*/
public static String htmlEncode(String text)
{
if (text == null)
{
return null;
}
String escaped = text.replace("&", "&");
escaped = escaped.replace("<", "<");
escaped = escaped.replace(">", ">");
return escaped;
}
/**
* Декодирует строку html (замееняет символы &,<,> на соответствующие)
* @param html Текст
* @return Декодированный текст
*/
public static String htmlDecode(String html)
{
if (html == null)
{
return null;
}
String decode = html.replace("<", "<");
decode = decode.replace(">", ">");
decode = decode.replace("&", "&");
return decode;
}
/**
* Кодирует и пишет текст
* @param text Текст
* @throws javax.xml.stream.XMLStreamException IO Ошибка
*/
public void writeEscapeCharacters(String text) throws XMLStreamException
{
if( outline==null )return;
if (text == null)
{
outline.writeCharacters(text);
return;
}
outline.writeCharacters(htmlEncode(text));
}
public void writeEscapeCharacters(char[] text, int start, int len) throws XMLStreamException
{
if( outline==null )return;
if (text == null)
{
outline.writeCharacters(text, start, len);
return;
}
String srcText = new String(text, start, len);
outline.writeCharacters(htmlEncode(srcText));
}
public void writeStartElement(String localName) throws XMLStreamException
{
if( outline==null )return;
outline.writeStartElement(localName);
}
public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException
{
if( outline==null )return;
outline.writeStartElement(namespaceURI, localName);
}
public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException
{
if( outline==null )return;
outline.writeStartElement(prefix, localName, namespaceURI);
}
public void writeStartDocument() throws XMLStreamException
{
if( outline==null )return;
if( writeStartDocument )outline.writeStartDocument();
}
public void writeStartDocument(String version) throws XMLStreamException
{
if( outline==null )return;
if( writeStartDocument )outline.writeStartDocument(version);
}
public void writeStartDocument(String encoding, String version) throws XMLStreamException
{
if( outline==null )return;
if( writeStartDocument )outline.writeStartDocument(encoding, version);
}
public void writeProcessingInstruction(String target) throws XMLStreamException
{
if( outline==null )return;
outline.writeProcessingInstruction(target);
}
public void writeProcessingInstruction(String target, String data) throws XMLStreamException
{
if( outline==null )return;
outline.writeProcessingInstruction(target, data);
}
public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException
{
if( outline==null )return;
outline.writeNamespace(prefix, namespaceURI);
}
public void writeEntityRef(String name) throws XMLStreamException
{
if( outline==null )return;
outline.writeEntityRef(name);
}
public void writeEndElement() throws XMLStreamException
{
if( outline==null )return;
outline.writeEndElement();
}
public void writeEndDocument() throws XMLStreamException
{
if( outline==null )return;
if( writeStartDocument )outline.writeEndDocument();
}
public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException
{
if( outline==null )return;
outline.writeEmptyElement(namespaceURI, localName);
}
public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException
{
if( outline==null )return;
outline.writeEmptyElement(prefix, localName, namespaceURI);
}
public void writeEmptyElement(String localName) throws XMLStreamException
{
if( outline==null )return;
outline.writeEmptyElement(localName);
}
public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException
{
if( outline==null )return;
outline.writeDefaultNamespace(namespaceURI);
}
public void writeDTD(String dtd) throws XMLStreamException
{
if( outline==null )return;
outline.writeDTD(dtd);
}
public void writeComment(String data) throws XMLStreamException
{
if( outline==null )return;
outline.writeComment(data);
}
public void writeCharacters(String text) throws XMLStreamException
{
if( outline==null )return;
if (isEscapeWriteChars())
{
writeEscapeCharacters(text);
}
else
{
outline.writeCharacters(text);
}
}
public void writeCharacters(char[] text, int start, int len) throws XMLStreamException
{
if( outline==null )return;
if (isEscapeWriteChars())
{
writeEscapeCharacters(text, start, len);
}
else
{
outline.writeCharacters(text, start, len);
}
}
public void writeCData(String data) throws XMLStreamException
{
if( outline==null )return;
outline.writeCData(data);
}
public void writeAttribute(String localName, String value) throws XMLStreamException
{
if( outline==null )return;
outline.writeAttribute(localName, value);
}
public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException
{
if( outline==null )return;
outline.writeAttribute(prefix, namespaceURI, localName, value);
}
public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException
{
if( outline==null )return;
outline.writeAttribute(namespaceURI, localName, value);
}
public void setSpacer(String spacer)
{
if( outline==null )return;
outline.setSpacer(spacer);
}
public void setPrefix(String prefix, String uri) throws XMLStreamException
{
if( outline==null )return;
outline.setPrefix(prefix, uri);
}
public void setNewline(String newline)
{
if( outline==null )return;
outline.setNewline(newline);
}
public void setNamespaceContext(NamespaceContext context) throws XMLStreamException
{
if( outline==null )return;
outline.setNamespaceContext(context);
}
public void setDefaultNamespace(String uri) throws XMLStreamException
{
if( outline==null )return;
outline.setDefaultNamespace(uri);
}
public XMLStreamWriter getWriter()
{
if( outline==null )return null;
return outline.getWriter();
}
public String getSpacer()
{
if( outline==null )return null;
return outline.getSpacer();
}
public Object getProperty(String name) throws IllegalArgumentException
{
if( outline==null )return null;
return outline.getProperty(name);
}
public String getPrefix(String uri) throws XMLStreamException
{
if( outline==null )return null;
return outline.getPrefix(uri);
}
public String getNewline()
{
if( outline==null )return null;
return outline.getNewline();
}
public NamespaceContext getNamespaceContext()
{
if( outline==null )return null;
return outline.getNamespaceContext();
}
public Integer getLevel()
{
if( outline==null )return 0;
return outline.getLevel();
}
public void flush() throws XMLStreamException
{
if( outline==null )return;
outline.flush();
}
public void close() throws XMLStreamException
{
if( outline==null )return;
outline.close();
}
public boolean isWriteStartDocument()
{
return writeStartDocument;
}
public void setWriteStartDocument(boolean writeStartDocument)
{
this.writeStartDocument = writeStartDocument;
}
/**
* Конвертирует XMLDOM древо в текстовое представление
* @param xmlDocument XMLDOM древо
* @return Текстовое представление XMLDOM древа
* @throws javax.xml.stream.XMLStreamException Если не смогло
* @throws javax.xml.transform.TransformerConfigurationException Если не смогло
* @throws javax.xml.transform.TransformerException Если не смогло
* @throws java.io.IOException Если не смогло
*/
public static String toStringWithException(Node xmlDocument)
throws
XMLStreamException,
TransformerConfigurationException,
TransformerException,
IOException
{
if (xmlDocument == null)
{
throw new IllegalArgumentException("xmlDocument == null");
}
Transformer tr = TransformerFactory.newInstance().newTransformer();
DOMSource domSrc= new DOMSource(xmlDocument);
StringWriter sWiter = new StringWriter();
XMLStreamWriter xml2format = new FormatXMLWriter(sWiter);
StAXResult sResult = new StAXResult(xml2format);
Result result = sResult;
tr.transform(domSrc, result);
// sWiter.flush();
xml2format.writeEndDocument();
xml2format.flush();
String toOutput = sWiter.toString();
xml2format.close();
sWiter.close();
return toOutput;
}
/**
* Конвертирует XMLDOM древо в текстовое представление с подовлением исключений
* @param xmlDocument XMLDOM древо
* @param defaultResult Результат возвращаем в случае, если не смогло сковертировать
* @return Текстовое представление XMLDOM древа
*/
public static String toStringWithoutException(Node xmlDocument, String defaultResult)
{
try
{
return toStringWithException(xmlDocument);
}
catch (IOException ex) {
// Logger.getLogger(FormatingXMLWriter.class.getName()).log(Level.SEVERE, null, ex);
}
catch (TransformerException ex) {
// Logger.getLogger(FormatingXMLWriter.class.getName()).log(Level.SEVERE, null, ex);
}
catch (XMLStreamException ex) {
// Logger.getLogger(FormatingXMLWriter.class.getName()).log(Level.SEVERE, null, ex);
}
return defaultResult;
}
}