/* * © Copyright IBM Corp. 2013 * * 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 com.ibm.sbt.services.client.base.serializers; import java.io.StringWriter; import java.io.Writer; import java.util.Arrays; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Attr; import org.w3c.dom.DOMException; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Text; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSOutput; import org.w3c.dom.ls.LSSerializer; import com.ibm.commons.util.StringUtil; import com.ibm.commons.xml.DOMUtil; import com.ibm.commons.xml.XMLException; /** * @author Mario Duarte * */ public class XmlSerializer { private Document doc; public XmlSerializer() { try { resetDocument(); } catch (Exception e) { throw new RuntimeException(e); } } public Document getDocument() { return doc; } public Node getRootNode() { return doc.getDocumentElement(); } public String serializeToString() { DOMImplementation impl = doc.getImplementation(); DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS", "3.0"); LSSerializer lsSerializer = implLS.createLSSerializer(); lsSerializer.getDomConfig().setParameter("format-pretty-print", true); LSOutput lsOutput = implLS.createLSOutput(); lsOutput.setEncoding("UTF-8"); Writer stringWriter = new StringWriter(); lsOutput.setCharacterStream(stringWriter); lsSerializer.write(doc, lsOutput); return stringWriter.toString(); } public String serializeToString2() { StringWriter writer = new StringWriter(); serialize2(writer); return writer.toString(); } public void serialize(Writer writer) { try { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(writer); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.transform(source, result); } catch (TransformerException e) { throw new RuntimeException(e); } } public void serialize2(Writer writer) { try { DOMUtil.serialize(writer, doc, false, true); } catch (XMLException e) { throw new RuntimeException(e); } } protected void resetDocument() throws Exception { this.doc = newDocument(); } protected Document newDocument() throws Exception { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); docFactory.setNamespaceAware(true); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); return docBuilder.newDocument(); } protected <T extends Node> Node appendChildren(String rootElementName, List<T> children) { Node element = element(rootElementName); return appendChildren(element, children); } protected <T extends Node> Node appendChildren(String rootElementName, T... children) { return appendChildren(rootElementName, children); } protected <T extends Node> Node appendChildren(Node root, List<T> children) { if(children != null) { for(Node child : children) { if(child != null) { try { root.appendChild(child); } catch(DOMException e) { root.appendChild(importNode(child)); } } } } return root; } protected Node appendChildren(Node root, Node... children) { return appendChildren(root, list(children)); } protected Node rootNode(Node root) { doc.appendChild(root); return root; } protected Element element(String tagName) { if(StringUtil.isEmpty(tagName)) throw new NullPointerException("The name of an element may not be null or empty."); return doc.createElement(tagName); } protected Element element(String tagName, Attr... attributes) { Element element = element(tagName); return addAttributes(element, attributes); } protected Element element(String namespaceURI, String tagName) { if(StringUtil.isEmpty(tagName)) throw new NullPointerException("The name of an element may not be null or empty."); if(StringUtil.isEmpty(namespaceURI)) throw new NullPointerException("The namespaceURI of an element may not be null or empty."); return doc.createElementNS(namespaceURI, tagName); } protected Element element(String namespaceURI, String tagName, Attr... attributes) { Element element = element(namespaceURI, tagName); return addAttributes(element, attributes); } protected Element textElement(String tagName, String data) { if(data == null) return null; else { Element element = element(tagName); return addText(element, data); } } protected Element textElement(String tagName, String data, Attr... attributes) { Element element = textElement(tagName, data); return addAttributes(element, attributes); } protected Element textElement(String namespaceURI, String tagName, String data) { if(data == null) return null; else { Element element = element(namespaceURI, tagName); return addText(element, data); } } protected Element textElement(String namespaceURI, String tagName, String data, Attr... attributes) { Element element = textElement(namespaceURI, tagName, data); return addAttributes(element, attributes); } protected Attr attribute(String name, String value) { Attr attr = doc.createAttribute(name); attr.setValue(value); return attr; } protected Attr attribute(String name, long value) { Attr attr = doc.createAttribute(name); attr.setValue("" + value); return attr; } protected Attr attribute(String name, boolean value) { Attr attr = doc.createAttribute(name); attr.setValue(value ? "true" : "false"); return attr; } protected Attr attribute(String namespaceURI, String name, String value) { Attr attr = doc.createAttributeNS(namespaceURI, name); attr.setValue(value); return attr; } protected Node importNode(Node node) { return doc.importNode(node, true); } protected List<Node> list(Node... nodes) { return Arrays.asList(nodes); } protected Element addText(Element element, String data) { if(element == null) return null; if(data == null) return element; Text textNode = doc.createTextNode(data); element.appendChild(textNode); return element; } protected Element addAttributes(Element element, Attr... attributes) { if(element == null) return null; if(attributes == null) throw new NullPointerException("The attributes may not be null."); for(Attr attr : attributes) { element.setAttributeNode(attr); } return element; } }