All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.picketlink.trust.jbossws.Util Maven / Gradle / Ivy

The newest version!
/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2010, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * 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.picketlink.trust.jbossws;

import org.w3c.dom.Element;
import org.w3c.dom.Node;

import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Jason T. Greene
 */
public class Util {

    public static int count = 0;

    public static String assignWsuId(Element element) {
        String id = element.getAttributeNS(Constants.WSU_NS, Constants.ID);

        if (id == null || id.length() < 1) {
            id = generateId();
            element.setAttributeNS(Constants.WSU_NS, Constants.WSU_ID, id);
            addNamespace(element, Constants.WSU_PREFIX, Constants.WSU_NS);
        }

        return id;
    }

    public static Element getFirstChildElement(Node node) {
        Node child = node.getFirstChild();
        while (child != null && child.getNodeType() != Node.ELEMENT_NODE) {
            child = child.getNextSibling();
        }

        return (Element) child;
    }

    public static Element getNextSiblingElement(Element element) {
        Node sibling = element.getNextSibling();
        while (sibling != null && sibling.getNodeType() != Node.ELEMENT_NODE) {
            sibling = sibling.getNextSibling();
        }

        return (Element) sibling;
    }

    public static Element getPreviousSiblingElement(Element element) {
        Node sibling = element.getPreviousSibling();
        while (sibling != null && sibling.getNodeType() != Node.ELEMENT_NODE) {
            sibling = sibling.getPreviousSibling();
        }

        return (Element) sibling;
    }

    public static Element findElement(Element root, String localName, String namespace) {
        return findElement(root, new QName(namespace, localName));
    }

    public static Element findElement(Element root, QName name) {
        // Here lies your standard recusive DFS.....
        if (matchNode(root, name)) {
            return root;
        }

        // Search children
        for (Node child = root.getFirstChild(); child != null; child = child.getNextSibling()) {
            if (child.getNodeType() != Node.ELEMENT_NODE) {
                continue;
            }

            Node possibleMatch = findElement((Element) child, name);
            if (possibleMatch != null) {
                return (Element) possibleMatch;
            }
        }

        return null;
    }

    public static List findAllElements(Element root, QName name, boolean local) {
        List list = new ArrayList();
        if (matchNode(root, name, local)) {
            list.add(root);
        }

        for (Node child = root.getFirstChild(); child != null; child = child.getNextSibling()) {
            if (child.getNodeType() != Node.ELEMENT_NODE) {
                continue;
            }

            list.addAll(findAllElements((Element) child, name, local));
        }

        return list;
    }

    public static Element findElementByWsuId(Element root, String id) {
        // Here lies another standard recusive DFS.....
        if (id.equals(getWsuId(root))) {
            return root;
        }

        // Search children
        for (Node child = root.getFirstChild(); child != null; child = child.getNextSibling()) {
            if (child.getNodeType() != Node.ELEMENT_NODE) {
                continue;
            }

            Node possibleMatch = findElementByWsuId((Element) child, id);
            if (possibleMatch != null) {
                return (Element) possibleMatch;
            }
        }

        return null;
    }

    public static Element findOrCreateSoapHeader(Element envelope) {
        String prefix = envelope.getPrefix();
        String uri = envelope.getNamespaceURI();
        QName name = new QName(uri, "Header");
        Element header = findElement(envelope, name);
        if (header == null) {
            header = envelope.getOwnerDocument().createElementNS(uri, prefix + ":Header");
            envelope.insertBefore(header, envelope.getFirstChild());
        }

        return header;
    }

    public static String getWsuId(Element element) {
        if (element.hasAttributeNS(Constants.WSU_NS, Constants.ID)) {
            return element.getAttributeNS(Constants.WSU_NS, Constants.ID);
        }

        if (element.hasAttribute(Constants.ID)) {
            String ns = element.getNamespaceURI();
            if (Constants.XML_SIGNATURE_NS.equals(ns) || Constants.XML_ENCRYPTION_NS.equals(ns)) {
                return element.getAttribute(Constants.ID);
            }
        }

        return null;
    }

    public static boolean equalStrings(String string1, String string2) {
        if (string1 == null && string2 == null) {
            return true;
        }

        return string1 != null && string1.equals(string2);
    }

    public static boolean matchNode(Node node, QName name) {
        return matchNode(node, name, false);
    }

    public static boolean matchNode(Node node, QName name, boolean local) {
        return equalStrings(node.getLocalName(), name.getLocalPart())
            && (local || equalStrings(node.getNamespaceURI(), name.getNamespaceURI()));
    }

    public static String generateId() {
        return generateId("element");
    }

    public static void addNamespace(Element element, String prefix, String uri) {
        element.setAttributeNS(Constants.XMLNS_NS, "xmlns:" + prefix, uri);
    }

    public static String generateId(String prefix) {
        StringBuilder id = new StringBuilder();
        long time = System.currentTimeMillis();

        // reasonably gaurantee uniqueness
        synchronized (Util.class) {
            count++;
        }

        id.append(prefix).append("-").append(count).append("-").append(time).append("-").append(id.hashCode());

        return id.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy