///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.xml.stream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Source; 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.stream.StreamResult; import org.apache.commons.lang.StringUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.projectforge.core.InternalErrorException; public class XmlHelper { public static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(XmlHelper.class); /** * Replace all single quotes by quotation marks. This is use-ful for writing xml string constants e. g. in test cases. * <node name='name' locale='en'/> is transformed to <node name="name" locale="en"/> * @param xml * @return */ public static String replaceQuotes(final String xml) { final String text = xml.replace('\'', '"'); return text; } public static Element fromString(final String str) { if (StringUtils.isBlank(str) == true) { return null; } try { final Document document = DocumentHelper.parseText(str); return document.getRootElement(); } catch (final DocumentException ex) { log.error("Exception encountered " + ex.getMessage()); } return null; } public static String toString(final Element el) { return toString(el, false); } public static String toString(final Element el, final boolean prettyFormat) { if (el == null) { return ""; } final StringWriter out = new StringWriter(); final OutputFormat format = new OutputFormat(); if (prettyFormat == true) { format.setNewlines(true); format.setIndentSize(2); } final XMLWriter writer = new XMLWriter(out, format); String result = null; try { writer.write(el); result = out.toString(); writer.close(); } catch (final IOException ex) { log.error(ex.getMessage(), ex); } return result; } public static String toString(final org.w3c.dom.Document document, final boolean prettyFormat) { final TransformerFactory tranFactory = TransformerFactory.newInstance(); final Transformer transformer; try { transformer = tranFactory.newTransformer(); } catch (final TransformerConfigurationException ex) { log.error("Exception encountered while transcoding org.w3c.dom.Document to a string: " + ex.getMessage(), ex); throw new InternalErrorException("Exception encountered while transcoding org.w3c.dom.Document to a string: " + ex.getMessage()); } if (prettyFormat == true) { transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); } final Source src = new DOMSource(document); final ByteArrayOutputStream bout = new ByteArrayOutputStream(); final Result dest = new StreamResult(bout); try { transformer.transform(src, dest); } catch (final TransformerException ex) { log.error("Exception encountered while transcoding org.w3c.dom.Document to a string: " + ex.getMessage(), ex); throw new InternalErrorException("Exception encountered while transcoding org.w3c.dom.Document to a string: " + ex.getMessage()); } final String result; try { result = new String(bout.toByteArray(), "UTF-8"); } catch (final UnsupportedEncodingException ex) { log.error("Exception encountered while transcoding org.w3c.dom.Document to a string: " + ex.getMessage(), ex); throw new InternalErrorException("Exception encountered while transcoding org.w3c.dom.Document to a string: " + ex.getMessage()); } return result; } }