/******************************************************************************* * Copyright (c) 2015 Bruno Medeiros and other Contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.lang.utils; import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Text; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.misc.StringUtil; public abstract class DocumentSerializerHelper<ELEMENT> { protected DocumentBuilder getDocumentBuilder() throws CommonException { try { return DocumentBuilderFactory.newInstance().newDocumentBuilder(); } catch(ParserConfigurationException e) { throw new CommonException("Error obtaining XML DocumentBuilder: ", e); } } protected Document getDocumentParent(Node parentElement) { if(parentElement instanceof Document) { return (Document) parentElement; } return parentElement.getOwnerDocument(); } public String writeToString(ELEMENT buildTargets) throws CommonException { if(buildTargets == null) { return ""; } Document doc = getDocumentBuilder().newDocument(); writeDocument(doc, buildTargets); return documentToString(doc); } protected abstract void writeDocument(Document doc, ELEMENT buildTargets); /* ----------------- read ----------------- */ public ELEMENT readFromString(String targetsXml) throws CommonException { if(StringUtil.emptyAsNull(targetsXml) == null) { return null; } return doReadFromString(targetsXml); } public abstract ELEMENT doReadFromString(String targetsXml) throws CommonException; public String documentToString(Document doc) throws TransformerFactoryConfigurationError, CommonException { Transformer transformer; try { transformer = TransformerFactory.newInstance().newTransformer(); } catch(TransformerConfigurationException e) { throw new CommonException("Error obtaining XML Transformer: ", e); } transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StringWriter writer = new StringWriter(); try { transformer.transform(new DOMSource(doc), new StreamResult(writer)); } catch(TransformerException e) { throw new CommonException("Error writing XML: ", e); } return writer.toString(); } /* ----------------- ----------------- */ public Element addChild(Element parent, String elementName) { assertNotNull(elementName); Element newChild = parent.getOwnerDocument().createElement(elementName); parent.appendChild(newChild); return newChild; } public Text addTextChild(Element targetElem, String value) { if(value == null) { return null; } Text newChild = targetElem.getOwnerDocument().createTextNode(value); targetElem.appendChild(newChild); return newChild; } protected static void setAttribute(Element targetElem, String name, String value) { if(value != null) { targetElem.setAttribute(name, value); } } /* ----------------- ----------------- */ protected Document parseDocumentFromXml(String xmlSource) throws CommonException { try { return getDocumentBuilder().parse(new InputSource(new StringReader(xmlSource))); } catch(SAXException | IOException e) { throw new CommonException("Unable to parse XML", e); } } public static String getAttribute(Node targetElem, String keyName, String defaultValue) { Node attribute = targetElem.getAttributes().getNamedItem(keyName); if(attribute == null) { return defaultValue; } return attribute.getTextContent(); } public static boolean getBooleanAttribute(Node targetElem, String keyName, boolean defaultValue) { String enabledStr = getAttribute(targetElem, keyName, null); if(enabledStr == null) { return defaultValue; } return Boolean.parseBoolean(enabledStr); } }