/******************************************************************************* * Open Behavioral Health Information Technology Architecture (OBHITA.org) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the <organization> nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ package gov.samhsa.acs.common.tool; import gov.samhsa.acs.common.namespace.PepNamespaceContext; import gov.samhsa.acs.common.tool.exception.DocumentAccessorException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; /** * The Class DocumentAccessorImpl. */ public class DocumentAccessorImpl implements DocumentAccessor { /* * (non-Javadoc) * * @see * gov.samhsa.acs.common.tool.DocumentAccessor#addingStylesheet(org.w3c. * dom.Document, java.lang.String) */ @SuppressWarnings("unchecked") @Override public <ProcessingInstructionImpl> Document addingStylesheet(Document doc, String xslHref) throws TransformerConfigurationException, ParserConfigurationException { final StringBuilder builder = new StringBuilder(); builder.append("type=\"text/xsl\" href="); builder.append(xslHref); final ProcessingInstructionImpl pi = (ProcessingInstructionImpl) doc .createProcessingInstruction("xml-stylesheet", builder.toString()); final Element root = doc.getDocumentElement(); doc.insertBefore((Node) pi, root); return doc; } /* * (non-Javadoc) * * @see * gov.samhsa.acs.common.tool.DocumentAccessor#getElement(org.w3c.dom.Document * , java.lang.String, java.lang.String[]) */ @Override public Element getElement(Document xmlDocument, String xPathExpr, String... arguments) throws DocumentAccessorException { final Node node = getNode(xmlDocument, xPathExpr, arguments); return (Element) node; } /* * (non-Javadoc) * * @see * gov.samhsa.acs.common.tool.DocumentAccessor#getNode(org.w3c.dom.Document, * java.lang.String, java.lang.String[]) */ @Override public Node getNode(Document xmlDocument, String xPathExpr, String... arguments) throws DocumentAccessorException { xPathExpr = setXpathArguments(xPathExpr, arguments); // Create XPath instance final XPath xpath = xpath(); // Evaluate XPath expression against parsed document Node node; try { node = (Node) xpath.evaluate(xPathExpr, xmlDocument, XPathConstants.NODE); } catch (final XPathExpressionException e) { throw new DocumentAccessorException(e); } return node; } /* * (non-Javadoc) * * @see * gov.samhsa.acs.common.tool.DocumentAccessor#getNodeList(org.w3c.dom.Document * , java.lang.String, java.lang.String[]) */ @Override public NodeList getNodeList(Document xmlDocument, String xPathExpr, String... arguments) throws DocumentAccessorException { xPathExpr = setXpathArguments(xPathExpr, arguments); // Create XPath instance final XPath xpath = xpath(); // Evaluate XPath expression against parsed document NodeList nodeList; try { nodeList = (NodeList) xpath.evaluate(xPathExpr, xmlDocument, XPathConstants.NODESET); } catch (final XPathExpressionException e) { throw new DocumentAccessorException(e); } return nodeList; } /* * (non-Javadoc) * * @see * gov.samhsa.acs.common.tool.DocumentAccessor#getProcessingInstruction( * org.w3c.dom.Document, java.lang.String, java.lang.String[]) */ @Override public ProcessingInstruction getProcessingInstruction(Document xmlDocument, String xPathExpr, String... arguments) throws DocumentAccessorException { try { return (ProcessingInstruction) getNode(xmlDocument, xPathExpr, arguments); } catch (final Exception e) { throw new DocumentAccessorException(e); } } /** * Sets the xpath arguments. * * @param xPath * the x path * @param arguments * the arguments * @return the string */ private String setXpathArguments(String xPath, String... arguments) { for (int i = 0; i < arguments.length; i++) { xPath = xPath.replace("%" + Integer.toString(i + 1), arguments[i]); } return xPath; } /** * Creates the x path instance. * * @return the x path */ private XPath xpath() { // Create XPath instance final XPath xpath = XPathFactory.newInstance().newXPath(); xpath.setNamespaceContext(new PepNamespaceContext()); return xpath; } }