/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.ext.registry; import org.exoplatform.commons.utils.SecurityHelper; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; /** * Created by The eXo Platform SAS<br> * * Encapsulates registry entry (i.e services', applications' etc settings) * * @author Gennady Azarenkov * @LevelAPI Unsupported */ public final class RegistryEntry { private Document document; /** * creates a RegistryEntry after XML DOM Document root element node name it is the name of the * Entry * * @param dom */ public RegistryEntry(Document dom) { this.document = dom; } /** * creates an empty RegistryEntry * * @param rootName * @throws IOException * @throws SAXException * @throws ParserConfigurationException */ public RegistryEntry(String rootName) throws IOException, SAXException, ParserConfigurationException { DocumentBuilder db = SecurityHelper.doPrivilegedParserConfigurationAction(new PrivilegedExceptionAction<DocumentBuilder>() { public DocumentBuilder run() throws Exception { return DocumentBuilderFactory.newInstance().newDocumentBuilder(); } }); this.document = db.newDocument(); Element nodeElement = document.createElement(rootName); document.appendChild(nodeElement); } /** * Factory method to create RegistryEntry from serialized XML * * @param bytes * @return RegistryEntry * @throws IOException * @throws SAXException * @throws ParserConfigurationException */ public static RegistryEntry parse(final byte[] bytes) throws IOException, SAXException, ParserConfigurationException { try { return SecurityHelper.doPrivilegedExceptionAction(new PrivilegedExceptionAction<RegistryEntry>() { public RegistryEntry run() throws Exception { return new RegistryEntry(DocumentBuilderFactory.newInstance().newDocumentBuilder() .parse(new ByteArrayInputStream(bytes))); } }); } catch (PrivilegedActionException pae) { Throwable cause = pae.getCause(); if (cause instanceof ParserConfigurationException) { throw (ParserConfigurationException)cause; } else if (cause instanceof IOException) { throw (IOException)cause; } else if (cause instanceof SAXException) { throw (SAXException)cause; } else if (cause instanceof RuntimeException) { throw (RuntimeException)cause; } else { throw new RuntimeException(cause); } } } /** * Factory method to create RegistryEntry from stream XML * * @return RegistryEntry * @throws IOException * @throws SAXException * @throws ParserConfigurationException */ public static RegistryEntry parse(final InputStream in) throws IOException, SAXException, ParserConfigurationException { try { return SecurityHelper.doPrivilegedExceptionAction(new PrivilegedExceptionAction<RegistryEntry>() { public RegistryEntry run() throws Exception { return new RegistryEntry(DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in)); } }); } catch (PrivilegedActionException pae) { Throwable cause = pae.getCause(); if (cause instanceof ParserConfigurationException) { throw (ParserConfigurationException)cause; } else if (cause instanceof IOException) { throw (IOException)cause; } else if (cause instanceof SAXException) { throw (SAXException)cause; } else if (cause instanceof RuntimeException) { throw (RuntimeException)cause; } else { throw new RuntimeException(cause); } } } /** * @return the entry as InputStream * @throws TransformerException */ public InputStream getAsInputStream() throws TransformerException { ByteArrayOutputStream out = new ByteArrayOutputStream(); TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult(out)); return new ByteArrayInputStream(out.toByteArray()); } /** * @return the name of entry (which is the same as underlying Document's root name) */ public String getName() { return document.getDocumentElement().getNodeName(); } /** * @return the underlying Document */ public Document getDocument() { return document; } }