/* * Copyright 2013 Skynav, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * THIS SOFTWARE IS PROVIDED BY SKYNAV, INC. AND ITS 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 SKYNAV, INC. OR ITS CONTRIBUTORS 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 com.skynav.xml.helpers; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Documents { private Documents() { } public static void assignIdAttributes(Document document, List<QName> idAttrs) { assignIdAttributes(document.getDocumentElement(), idAttrs); } public static void assignIdAttributes(Element elt, List<QName> idAttrs) { for (QName idAttr : idAttrs) { String ns = idAttr.getNamespaceURI(); String ln = idAttr.getLocalPart(); if (ns.length() == 0) ns = null; Attr a = elt.getAttributeNodeNS(ns, ln); if (a != null) { elt.setIdAttributeNode(a, true); break; } } for (Node n = elt.getFirstChild(); n != null; n = n.getNextSibling()) { if (n instanceof Element) { assignIdAttributes((Element) n, idAttrs); } } } public static Element findAncestorByName(Element elt, QName qn) { for (Node p = elt.getParentNode(); p != null; p = p.getParentNode()) { if (p instanceof Element) { Element pElement = (Element) p; if (getName(pElement).equals(qn)) return pElement; } } return null; } public static List<Element> findElementsByName(Document d, QName qn) { String ns = qn.getNamespaceURI(); NodeList nodes; if ((ns == null) || (ns.length() == 0)) nodes = d.getElementsByTagName(qn.getLocalPart()); else nodes = d.getElementsByTagNameNS(ns, qn.getLocalPart()); List<Element> elts = new java.util.ArrayList<Element>(); if (nodes != null) { for (int i = 0, n = nodes.getLength(); i < n; ++i) { elts.add((Element) nodes.item(i)); } } return elts; } public static List<Element> findElementsByName(Element e, QName qn) { String ns = qn.getNamespaceURI(); NodeList nodes; if ((ns == null) || (ns.length() == 0)) nodes = e.getElementsByTagName(qn.getLocalPart()); else nodes = e.getElementsByTagNameNS(ns, qn.getLocalPart()); List<Element> elts = new java.util.ArrayList<Element>(); for (int i = 0, n = nodes.getLength(); i < n; ++i) { elts.add((Element) nodes.item(i)); } return elts; } public static Element findElementByName(Document d, QName qn) { List<Element> elts = findElementsByName(d, qn); if (!elts.isEmpty()) return elts.get(0); else return null; } public static QName getName(Element e) { String ns = e.getNamespaceURI(); String ln; if ((ns == null) || (ns.length() == 0)) ln = e.getNodeName(); else ln = e.getLocalName(); return new QName(ns != null ? ns : "", ln); } public static List<Element> getChildElements(Element e) { List<Element> elts = new java.util.ArrayList<Element>(); for (Node n = e.getFirstChild(); n != null; n = n.getNextSibling()) { if (n instanceof Element) { elts.add((Element) n); } } return elts; } public static boolean isElement(Element e, QName qn) { String nsElt = e.getNamespaceURI(); String lnElt = e.getLocalName(); String ns = qn.getNamespaceURI(); String ln = qn.getLocalPart(); if ((ns == null) || (ns.length() == 0)) return lnElt.equals(ln); else if (nsElt != null) return nsElt.equals(ns) && lnElt.equals(ln); else return false; } public static Element createElement(Document d, QName qn) { String ns = qn.getNamespaceURI(); String ln = qn.getLocalPart(); if ((ns == null) || (ns.length() == 0)) return d.createElement(ln); else return d.createElementNS(ns, ln); } public static void addChildren(Element e, List<Element> children) { for (Element c : children) { e.appendChild(c); } } public static void insertFirst(Element e, Element f) { Node n = e.getFirstChild(); e.insertBefore(f, n); } public static boolean hasAttribute(Element e, QName qn) { String ns = qn.getNamespaceURI(); String ln = qn.getLocalPart(); if ((ns == null) || (ns.length() == 0)) return e.hasAttribute(ln); else return e.hasAttributeNS(ns, ln); } public static Map<QName,String> getAttributes(Element e) { Map<QName,String> attributes = new java.util.HashMap<QName,String>(); NamedNodeMap attrs = e.getAttributes(); for (int i = 0, n = attrs.getLength(); i < n; ++i) { Node node = attrs.item(i); if (node instanceof Attr) { Attr a = (Attr) node; String ns = a.getNamespaceURI(); String ln; if ((ns == null) || (ns.length() == 0)) ln = a.getName(); else ln = a.getLocalName(); attributes.put(new QName(ns != null ? ns : "", ln), a.getValue()); } } return attributes; } public static String getAttribute(Element e, QName qn) { return getAttribute(e, qn, null); } public static String getAttribute(Element e, QName qn, String defaultValue) { String ns = qn.getNamespaceURI(); String ln = qn.getLocalPart(); String value; if ((ns == null) || (ns.length() == 0)) { if (e.hasAttribute(ln)) value = e.getAttribute(ln); else value = defaultValue; } else { if (e.hasAttributeNS(ns, ln)) value = e.getAttributeNS(ns, ln); else value = defaultValue; } return value; } public static void setAttribute(Element e, QName qn, String value) { String ns = qn.getNamespaceURI(); String ln = qn.getLocalPart(); if ((ns == null) || (ns.length() == 0)) e.setAttribute(ln, value); else e.setAttributeNS(ns, ln, value); } public static void removeAttribute(Element e, QName qn) { String ns = qn.getNamespaceURI(); String ln = qn.getLocalPart(); if ((ns == null) || (ns.length() == 0)) e.removeAttribute(ln); else e.removeAttributeNS(ns, ln); } }