package org.ovirt.engine.core.utils.ovf.xml;
import java.io.StringWriter;
import java.util.Map;
import java.util.Map.Entry;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
public class XmlTextWriter {
private XMLStreamWriter writer;
private StringWriter stream;
public XmlTextWriter() {
stream = new StringWriter();
try {
XMLOutputFactory factory = XMLOutputFactory.newInstance();
writer = factory.createXMLStreamWriter(stream);
writer.writeStartDocument("UTF-8", "1.0");
} catch (Exception e) {
throw new RuntimeException("Failed to initialize xml writer: ", e);
}
}
public void setPrefix(String prefix, String uri) {
try {
writer.setPrefix(prefix, uri);
} catch (XMLStreamException e) {
throw new RuntimeException("Failed to set prefix", e);
}
}
public void writeNamespace(String prefix, String uri) {
try {
writer.writeNamespace(prefix, uri);
} catch (XMLStreamException e) {
throw new RuntimeException("Failed to write namespace", e);
}
}
public void writeStartDocument(boolean b) {
// nothing, see ctor
}
public void writeStartElement(String namespaceURI, String localName) {
try {
writer.writeStartElement(namespaceURI, localName);
} catch (XMLStreamException e) {
throw new RuntimeException("Failed to write start element", e);
}
}
public void writeAttributeString(String namespaceURI, String localName, String value) {
try {
writer.writeAttribute(namespaceURI, localName, value);
} catch (XMLStreamException e) {
throw new RuntimeException("Failed to write attribute", e);
}
}
public void writeAttributeString(String localName, String value) {
try {
writer.writeAttribute(localName, value);
} catch (XMLStreamException e) {
throw new RuntimeException("Failed to write attribute", e);
}
}
public void writeEndElement() {
try {
writer.writeEndElement();
} catch (XMLStreamException e) {
throw new RuntimeException("Failed to write end element", e);
}
}
@SuppressWarnings("unchecked")
public void writeMap(Map<String, Object> map) {
if (map != null) {
for (Entry<String, Object> param : map.entrySet()) {
writeStartElement(param.getKey());
Object value = param.getValue();
if (value instanceof String) {
writeRaw((String) value);
} else if (value instanceof Map) {
writeMap((Map<String, Object>) value);
}
writeEndElement();
}
}
}
public void writeStartElement(String localName) {
try {
writer.writeStartElement(localName);
} catch (XMLStreamException e) {
throw new RuntimeException("Failed to write start element", e);
}
}
public void writeRaw (String string) {
try {
if (string == null) {
string = "";
}
writer.writeCharacters(string);
} catch (XMLStreamException e) {
throw new RuntimeException("Failed to write CDATA", e);
}
}
/**
* Write out an entire element in a simple format:
*
* <pre>
* <name>content</name>
* </pre>
*
* @param name
* The name of the element.
* @param content
* The content to write inside the element.
*/
public void writeElement(String name, String content) {
writeStartElement(name);
writeRaw(content);
writeEndElement();
}
/**
* Write out an entire element without content.
* @param name The name of the element.
*/
public void writeElement(String name) {
writeElement(name, null);
}
public String getStringXML() {
try {
writer.writeEndElement();
writer.flush();
writer.close();
return stream.getBuffer().toString();
} catch (XMLStreamException e) {
throw new RuntimeException(e);
}
}
}