/* * XAdES4j - A Java library for generation and verification of XAdES signatures. * Copyright (C) 2010 Luis Goncalves. * * XAdES4j 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 3 of the License, or any later version. * * XAdES4j 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 XAdES4j. If not, see <http://www.gnu.org/licenses/>. */ package xades4j.utils; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.xml.security.utils.Constants; import org.apache.xml.security.utils.HelperNodeList; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Utility methods for DOM nodes. * @author Luís */ public class DOMHelper { private DOMHelper() { } /** * Gets the owner document of a node. * * @param node the node * @return the node's document or the node itself if it is a document node * * @throws NullPointerException if {@code node} is {@code null} */ public static Document getOwnerDocument(Node node) { if (node.getNodeType() == Node.DOCUMENT_NODE) return (Document)node; return node.getOwnerDocument(); } /** * Creates an element on the given document. Exceptions are as in {@link * Document#createElementNS(java.lang.String, java.lang.String)}. The qualified * name is obtained by {@code prefix}:{@code name} if the prefix is not {@code null}. * * @param doc the owner document * @param name the element's local name * @param prefix the element's prefix (may be {@code null}) * @param namespaceURI the element's uri ({@code null} for no namespace) * @return the created element * * @see Document#createElementNS(java.lang.String, java.lang.String) */ public static Element createElement(Document doc, String name, String prefix, String namespaceURI) { if (prefix != null) name = prefix + ":" + name; return doc.createElementNS(namespaceURI, name); } public static Element createElementInTempDocument( String name, String prefix, String namespaceURI) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); try { Document doc = dbf.newDocumentBuilder().newDocument(); return createElement(doc, name, prefix, namespaceURI); } catch (ParserConfigurationException ex) { return null; } } /** * Gets the first child element of a node. * @param node the node to get the child from * @return the first element child of {@code node} or {@code null} if none * @throws NullPointerException if {@code node} is {@code null} */ public static Element getFirstChildElement(Node node) { node = node.getFirstChild(); while (node != null && node.getNodeType() != Node.ELEMENT_NODE) { node = node.getNextSibling(); } return (Element)node; } /** * Gets the last child element of a node. * @param node the node to get the child from * @return the last element child of {@code node} or {@code null} if none * @throws NullPointerException if {@code node} is {@code null} */ public static Element getLastChildElement(Node node) { node = node.getLastChild(); while (node != null && node.getNodeType() != Node.ELEMENT_NODE) { node = node.getPreviousSibling(); } return (Element)node; } /** * Gets the next sibling of a node that is an element. * @param node the node * @return the next sibling element or {@code null} if none * @throws NullPointerException if {@code node} is {@code null} */ public static Element getNextSiblingElement(Node node) { do { node = node.getNextSibling(); } while (node != null && node.getNodeType() != Node.ELEMENT_NODE); return (Element)node; } /** * Gets the first element with the specified qualified name that is descendant * of {@code e}. * @return the element or {@code null} if there is no such element */ public static Element getFirstDescendant( Element e, String nameSpace, String localName) { return (Element)e.getElementsByTagNameNS(nameSpace, localName).item(0); } public static NodeList nodeList(Iterable<Node> nodes) { HelperNodeList nl = new HelperNodeList(); for (Node n : nodes) { nl.appendChild(n); } return nl; } /** * Sets the "Id" attribute of an element and sets it as the element's XML ID. * @param e the element where the ID should be set * @param id the id */ public static void setIdAsXmlId(Element e, String id) { e.setAttributeNS(null, Constants._ATT_ID, id); e.setIdAttributeNS(null, Constants._ATT_ID, true); } /** * Defines the element's "Id" attribute as its XML ID, if present. * @param e the element */ public static void useIdAsXmlId(Element e) { if(e.hasAttributeNS(null, Constants._ATT_ID)) { e.setIdAttributeNS(null, Constants._ATT_ID, true); } } }