package org.societies.security.digsig.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.api.security.digsig.DigsigException; import org.w3c.dom.DOMConfiguration; import org.w3c.dom.Document; import org.w3c.dom.bootstrap.DOMImplementationRegistry; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSOutput; import org.w3c.dom.ls.LSSerializer; import org.xml.sax.SAXException; public class DOMHelper { private static Logger LOG = LoggerFactory.getLogger(DOMHelper.class); private static DocumentBuilderFactory dbf; private static DocumentBuilder docBuilder; private static DOMImplementationRegistry domRegistry; private static DOMImplementationLS domImpl; private static LSSerializer serializer; private static DOMConfiguration domConfig; static { dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); try { docBuilder = dbf.newDocumentBuilder(); domRegistry = DOMImplementationRegistry.newInstance(); domImpl = (DOMImplementationLS) domRegistry.getDOMImplementation("LS"); serializer = domImpl.createLSSerializer(); domConfig = serializer.getDomConfig(); domConfig.setParameter("comments", new Boolean(true)); } catch (Exception e) { LOG.error("Initialization failed", e); } } public static Document parseDocument(InputStream is) throws DigsigException { Document doc = null; try { docBuilder = dbf.newDocumentBuilder(); doc = docBuilder.parse(is); } catch (Exception e) { throw new DigsigException(e); } return doc; } public static void outputDocument(Document doc, OutputStream os) { LSOutput domOutput = domImpl.createLSOutput(); domOutput.setByteStream(os); domOutput.setEncoding("UTF-8"); serializer.write(doc, domOutput); } /** * Transform XML from byte[] to {@link Document} * * @param xml * The XML in form of byte array * @return XML {@link Document} or null on error */ public static Document byteArray2doc(byte[] xml) { Document doc = null; try { doc = docBuilder.parse(new ByteArrayInputStream(xml)); } catch (SAXException e) { LOG.warn("byteArray2doc(" + xml + ")", e); } catch (IOException e) { LOG.warn("byteArray2doc(" + xml + ")", e); } return doc; } /** * Transform XML from {@link Document} to byte[] * * @param doc The XML in form of {@link Document} * @return XML byte array or null on error */ public static byte[] doc2byteArray(Document doc) { LSOutput domOutput = domImpl.createLSOutput(); ByteArrayOutputStream output = new ByteArrayOutputStream(); domOutput.setByteStream(output); domOutput.setEncoding("UTF-8"); serializer.write(doc, domOutput); return output.toByteArray(); } }