package org.odata4j.stax2.staximpl; import java.io.Writer; import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.XMLEvent; import org.core4j.Enumerable; import org.odata4j.core.ODataConstants; import org.odata4j.core.ODataConstants.Charsets; import org.odata4j.core.Throwables; import org.odata4j.stax2.QName2; import org.odata4j.stax2.XMLWriter2; public class StaxXMLWriter2 implements XMLWriter2 { // private final XMLStreamWriter writer; private final XMLEventFactory eventFactory; private final XMLEventWriter eventWriter; public StaxXMLWriter2(Writer stream) { XMLOutputFactory f = XMLOutputFactory.newInstance(); try { // writer = f.createXMLStreamWriter(stream); eventFactory = XMLEventFactory.newInstance(); eventWriter = f.createXMLEventWriter(stream); eventWriter.setDefaultNamespace(""); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } // public void setPrefix(String prefix, String namespaceUri){ // try { // eventWriter.setPrefix(prefix, namespaceUri); // } catch (XMLStreamException e) { // throw Throwables.propagate(e); // } // } // // public void setDefaultNamespace( String namespaceUri){ // try { // eventWriter.setDefaultNamespace(namespaceUri); // } catch (XMLStreamException e) { // throw Throwables.propagate(e); // } // } public void startElement(String name) { startElement(new QName2(name)); } public void startElement(QName2 qname) { startElement(qname, null); } public void startElement(QName2 qname, String xmlns) { // writer.setDefaultNamespace("http://www.example.com/ns1"); try { Iterator<?> nsIterator = null; if (xmlns != null) { nsIterator = Enumerable.create(eventFactory.createNamespace(xmlns)).iterator(); } // writer.writeStartElement(prefix,localName,namespaceURI); XMLEvent event = eventFactory.createStartElement(StaxXMLFactoryProvider2.toQName(qname), null, nsIterator); eventWriter.add(event); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } public void writeAttribute(String localName, String value) { try { // writer.writeAttribute(localName, value); XMLEvent event = eventFactory.createAttribute(localName, value); eventWriter.add(event); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } public void writeAttribute(QName2 qname, String value) { try { // writer.writeAttribute(localName, value); XMLEvent event = eventFactory.createAttribute(StaxXMLFactoryProvider2.toQName(qname), value); eventWriter.add(event); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } public void writeText(String content) { try { // writer.writeAttribute(localName, value); XMLEvent event = eventFactory.createCharacters(content); eventWriter.add(event); } catch (XMLStreamException e) { // don't throw an exception; instead write a message as part of data and continue. this.writeErrorMessageAsCData(e.getMessage()); } } /** * In case we encounter any invalid characters in the XML, then print error message as CDATA so that it is highlighted at client side.<br><br> * * If we still have issue, we will throw the exception. * * @param content */ @Override public void writeErrorMessageAsCData(String message) { try { StringBuilder errorMessageBuilder = new StringBuilder(ODataConstants.ERROR_TEXT); if (message != null) { errorMessageBuilder.append(message); } XMLEvent event = eventFactory.createCData(errorMessageBuilder.toString()); eventWriter.add(event); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } public void writeNamespace(String prefix, String namespaceUri) { try { // writer.writeNamespace(prefix, namespaceURI); XMLEvent event = eventFactory.createNamespace(prefix, namespaceUri); eventWriter.add(event); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } public void startDocument() { try { eventWriter.add(eventFactory.createStartDocument(Charsets.Lower.UTF_8, "1.0", true)); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } public void endElement(String localName) { try { // writer.writeEndElement(); XMLEvent event = eventFactory.createEndElement(new QName(localName), null); eventWriter.add(event); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } public void endDocument() { try { // writer.writeEndDocument(); // writer.flush(); XMLEvent event = eventFactory.createEndDocument(); eventWriter.add(event); eventWriter.flush(); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } }