You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ow...@apache.org on 2011/12/21 22:54:04 UTC
svn commit: r1221896 [2/4] - in /cxf/sandbox/fediz: ./ fediz-core/
fediz-core/.settings/ fediz-core/src/ fediz-core/src/main/
fediz-core/src/main/java/ fediz-core/src/main/java/org/
fediz-core/src/main/java/org/apache/ fediz-core/src/main/java/org/apac...
Added: cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/DOMUtils.java
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/DOMUtils.java?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/DOMUtils.java (added)
+++ cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/DOMUtils.java Wed Dec 21 21:53:59 2011
@@ -0,0 +1,702 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cxf.fediz.core.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+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.Text;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * Few simple utils to read DOM. This is originally from the Jakarta Commons Modeler.
+ *
+ * @author Costin Manolache
+ */
+public final class DOMUtils {
+ private static final String XMLNAMESPACE = "xmlns";
+
+ private static final Map<ClassLoader, DocumentBuilder> DOCUMENT_BUILDERS = Collections
+ .synchronizedMap(new WeakHashMap<ClassLoader, DocumentBuilder>());
+
+ private DOMUtils() {
+ }
+
+ private static DocumentBuilder getBuilder() throws ParserConfigurationException {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ if (loader == null) {
+ loader = DOMUtils.class.getClassLoader();
+ }
+ if (loader == null) {
+ return XMLUtils.getParser();
+ }
+ DocumentBuilder builder = DOCUMENT_BUILDERS.get(loader);
+ if (builder == null) {
+ builder = XMLUtils.getParser();
+ DOCUMENT_BUILDERS.put(loader, builder);
+ }
+ return builder;
+ }
+
+ /**
+ * This function is much like getAttribute, but returns null, not "", for a nonexistent attribute.
+ *
+ * @param e
+ * @param attributeName
+ * @return
+ */
+ public static String getAttributeValueEmptyNull(Element e, String attributeName) {
+ Attr node = e.getAttributeNode(attributeName);
+ if (node == null) {
+ return null;
+ }
+ return node.getValue();
+ }
+
+ /**
+ * Get the trimmed text content of a node or null if there is no text
+ */
+ public static String getContent(Node n) {
+ String s = getRawContent(n);
+ if (s != null) {
+ s = s.trim();
+ }
+ return s;
+ }
+
+ /**
+ * Get the raw text content of a node or null if there is no text
+ */
+ public static String getRawContent(Node n) {
+ if (n == null) {
+ return null;
+ }
+ StringBuilder b = null;
+ String s = null;
+ Node n1 = n.getFirstChild();
+ while (n1 != null) {
+ if (n1.getNodeType() == Node.TEXT_NODE) {
+ if (b != null) {
+ b.append(((Text)n1).getNodeValue());
+ } else if (s == null) {
+ s = ((Text)n1).getNodeValue();
+ } else {
+ b = new StringBuilder(s).append(((Text)n1).getNodeValue());
+ s = null;
+ }
+ }
+ n1 = n1.getNextSibling();
+ }
+ if (b != null) {
+ return b.toString();
+ }
+ return s;
+ }
+
+ /**
+ * Get the first element child.
+ *
+ * @param parent lookup direct childs
+ * @param name name of the element. If null return the first element.
+ */
+ public static Node getChild(Node parent, String name) {
+ if (parent == null) {
+ return null;
+ }
+
+ Node first = parent.getFirstChild();
+ if (first == null) {
+ return null;
+ }
+
+ for (Node node = first; node != null; node = node.getNextSibling()) {
+ // System.out.println("getNode: " + name + " " +
+ // node.getNodeName());
+ if (node.getNodeType() != Node.ELEMENT_NODE) {
+ continue;
+ }
+ if (name != null && name.equals(node.getNodeName())) {
+ return node;
+ }
+ if (name == null) {
+ return node;
+ }
+ }
+ return null;
+ }
+
+ public static String getAttribute(Node element, String attName) {
+ NamedNodeMap attrs = element.getAttributes();
+ if (attrs == null) {
+ return null;
+ }
+ Node attN = attrs.getNamedItem(attName);
+ if (attN == null) {
+ return null;
+ }
+ return attN.getNodeValue();
+ }
+
+ public static String getAttribute(Element element, QName attName) {
+ Attr attr;
+ if (StringUtils.isEmpty(attName.getNamespaceURI())) {
+ attr = element.getAttributeNode(attName.getLocalPart());
+ } else {
+ attr = element.getAttributeNodeNS(attName.getNamespaceURI(), attName.getLocalPart());
+ }
+ return attr == null ? null : attr.getValue();
+ }
+
+ public static void setAttribute(Node node, String attName, String val) {
+ NamedNodeMap attributes = node.getAttributes();
+ Node attNode = node.getOwnerDocument().createAttributeNS(null, attName);
+ attNode.setNodeValue(val);
+ attributes.setNamedItem(attNode);
+ }
+
+ public static void removeAttribute(Node node, String attName) {
+ NamedNodeMap attributes = node.getAttributes();
+ attributes.removeNamedItem(attName);
+ }
+
+ /**
+ * Set or replace the text value
+ */
+ public static void setText(Node node, String val) {
+ Node chld = DOMUtils.getChild(node, Node.TEXT_NODE);
+ if (chld == null) {
+ Node textN = node.getOwnerDocument().createTextNode(val);
+ node.appendChild(textN);
+ return;
+ }
+ // change the value
+ chld.setNodeValue(val);
+ }
+
+ /**
+ * Find the first direct child with a given attribute.
+ *
+ * @param parent
+ * @param elemName name of the element, or null for any
+ * @param attName attribute we're looking for
+ * @param attVal attribute value or null if we just want any
+ */
+ public static Node findChildWithAtt(Node parent, String elemName, String attName, String attVal) {
+
+ Node child = DOMUtils.getChild(parent, Node.ELEMENT_NODE);
+ if (attVal == null) {
+ while (child != null && (elemName == null || elemName.equals(child.getNodeName()))
+ && DOMUtils.getAttribute(child, attName) != null) {
+ child = getNext(child, elemName, Node.ELEMENT_NODE);
+ }
+ } else {
+ while (child != null && (elemName == null || elemName.equals(child.getNodeName()))
+ && !attVal.equals(DOMUtils.getAttribute(child, attName))) {
+ child = getNext(child, elemName, Node.ELEMENT_NODE);
+ }
+ }
+ return child;
+ }
+
+ /**
+ * Get the first child's content ( ie it's included TEXT node ).
+ */
+ public static String getChildContent(Node parent, String name) {
+ Node first = parent.getFirstChild();
+ if (first == null) {
+ return null;
+ }
+ for (Node node = first; node != null; node = node.getNextSibling()) {
+ // System.out.println("getNode: " + name + " " +
+ // node.getNodeName());
+ if (name.equals(node.getNodeName())) {
+ return getRawContent(node);
+ }
+ }
+ return null;
+ }
+
+ public static QName getElementQName(Element el) {
+ return new QName(el.getNamespaceURI(), el.getLocalName());
+ }
+
+ /**
+ * Get the first direct child with a given type
+ */
+ public static Element getFirstElement(Node parent) {
+ Node n = parent.getFirstChild();
+ while (n != null && Node.ELEMENT_NODE != n.getNodeType()) {
+ n = n.getNextSibling();
+ }
+ if (n == null) {
+ return null;
+ }
+ return (Element)n;
+ }
+
+ public static Element getNextElement(Element el) {
+ Node nd = el.getNextSibling();
+ while (nd != null) {
+ if (nd.getNodeType() == Node.ELEMENT_NODE) {
+ return (Element)nd;
+ }
+ nd = nd.getNextSibling();
+ }
+ return null;
+ }
+
+ /**
+ * Return the first element child with the specified qualified name.
+ *
+ * @param parent
+ * @param q
+ * @return
+ */
+ public static Element getFirstChildWithName(Element parent, QName q) {
+ String ns = q.getNamespaceURI();
+ String lp = q.getLocalPart();
+ return getFirstChildWithName(parent, ns, lp);
+ }
+
+ /**
+ * Return the first element child with the specified qualified name.
+ *
+ * @param parent
+ * @param ns
+ * @param lp
+ * @return
+ */
+ public static Element getFirstChildWithName(Element parent, String ns, String lp) {
+ for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) {
+ if (n instanceof Element) {
+ Element e = (Element)n;
+ String ens = (e.getNamespaceURI() == null) ? "" : e.getNamespaceURI();
+ if (ns.equals(ens) && lp.equals(e.getLocalName())) {
+ return e;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return child elements with specified name.
+ *
+ * @param parent
+ * @param ns
+ * @param localName
+ * @return
+ */
+ public static List<Element> getChildrenWithName(Element parent, String ns, String localName) {
+ List<Element> r = new ArrayList<Element>();
+ for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) {
+ if (n instanceof Element) {
+ Element e = (Element)n;
+ String eNs = (e.getNamespaceURI() == null) ? "" : e.getNamespaceURI();
+ if (ns.equals(eNs) && localName.equals(e.getLocalName())) {
+ r.add(e);
+ }
+ }
+ }
+ return r;
+ }
+
+ /**
+ * Returns all child elements with specified namespace.
+ *
+ * @param parent the element to search under
+ * @param ns the namespace to find elements in
+ * @return all child elements with specified namespace
+ */
+ public static List<Element> getChildrenWithNamespace(Element parent, String ns) {
+ List<Element> r = new ArrayList<Element>();
+ for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) {
+ if (n instanceof Element) {
+ Element e = (Element)n;
+ String eNs = (e.getNamespaceURI() == null) ? "" : e.getNamespaceURI();
+ if (ns.equals(eNs)) {
+ r.add(e);
+ }
+ }
+ }
+ return r;
+ }
+
+ /**
+ * Get the first child of the specified type.
+ *
+ * @param parent
+ * @param type
+ * @return
+ */
+ public static Node getChild(Node parent, int type) {
+ Node n = parent.getFirstChild();
+ while (n != null && type != n.getNodeType()) {
+ n = n.getNextSibling();
+ }
+ if (n == null) {
+ return null;
+ }
+ return n;
+ }
+
+ /**
+ * Get the next sibling with the same name and type
+ */
+ public static Node getNext(Node current) {
+ String name = current.getNodeName();
+ int type = current.getNodeType();
+ return getNext(current, name, type);
+ }
+
+ /**
+ * Return the next sibling with a given name and type
+ */
+ public static Node getNext(Node current, String name, int type) {
+ Node first = current.getNextSibling();
+ if (first == null) {
+ return null;
+ }
+
+ for (Node node = first; node != null; node = node.getNextSibling()) {
+
+ if (type >= 0 && node.getNodeType() != type) {
+ continue;
+ }
+
+ if (name == null) {
+ return node;
+ }
+ if (name.equals(node.getNodeName())) {
+ return node;
+ }
+ }
+ return null;
+ }
+
+ public static class NullResolver implements EntityResolver {
+ public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
+ return new InputSource(new StringReader(""));
+ }
+ }
+
+ /**
+ * Read XML as DOM.
+ */
+ public static Document readXml(InputStream is) throws SAXException, IOException,
+ ParserConfigurationException {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+
+ dbf.setValidating(false);
+ dbf.setIgnoringComments(false);
+ dbf.setIgnoringElementContentWhitespace(true);
+ dbf.setNamespaceAware(true);
+ // dbf.setCoalescing(true);
+ // dbf.setExpandEntityReferences(true);
+
+ DocumentBuilder db = null;
+ db = dbf.newDocumentBuilder();
+ db.setEntityResolver(new NullResolver());
+
+ // db.setErrorHandler( new MyErrorHandler());
+
+ return db.parse(is);
+ }
+
+ public static Document readXml(Reader is) throws SAXException, IOException, ParserConfigurationException {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+
+ dbf.setValidating(false);
+ dbf.setIgnoringComments(false);
+ dbf.setIgnoringElementContentWhitespace(true);
+ dbf.setNamespaceAware(true);
+ // dbf.setCoalescing(true);
+ // dbf.setExpandEntityReferences(true);
+
+ DocumentBuilder db = null;
+ db = dbf.newDocumentBuilder();
+ db.setEntityResolver(new NullResolver());
+
+ // db.setErrorHandler( new MyErrorHandler());
+ InputSource ips = new InputSource(is);
+ return db.parse(ips);
+ }
+
+ public static Document readXml(StreamSource is) throws SAXException, IOException,
+ ParserConfigurationException {
+
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+
+ dbf.setValidating(false);
+ dbf.setIgnoringComments(false);
+ dbf.setIgnoringElementContentWhitespace(true);
+ dbf.setNamespaceAware(true);
+ // dbf.setCoalescing(true);
+ // dbf.setExpandEntityReferences(true);
+
+ DocumentBuilder db = null;
+ db = dbf.newDocumentBuilder();
+ db.setEntityResolver(new NullResolver());
+
+ // db.setErrorHandler( new MyErrorHandler());
+ InputSource is2 = new InputSource();
+ is2.setSystemId(is.getSystemId());
+ is2.setByteStream(is.getInputStream());
+ is2.setCharacterStream(is.getReader());
+
+ return db.parse(is2);
+ }
+
+ public static void writeXml(Node n, OutputStream os) throws TransformerException {
+ TransformerFactory tf = TransformerFactory.newInstance();
+ // identity
+ Transformer t = tf.newTransformer();
+ t.setOutputProperty(OutputKeys.INDENT, "yes");
+ t.transform(new DOMSource(n), new StreamResult(os));
+ }
+
+ public static DocumentBuilder createDocumentBuilder() {
+ try {
+ return getBuilder();
+ } catch (ParserConfigurationException e) {
+ throw new RuntimeException("Couldn't find a DOM parser.", e);
+ }
+ }
+
+ public static Document createDocument() {
+ try {
+ return getBuilder().newDocument();
+ } catch (ParserConfigurationException e) {
+ throw new RuntimeException("Couldn't find a DOM parser.", e);
+ }
+ }
+
+ public static String getPrefixRecursive(Element el, String ns) {
+ String prefix = getPrefix(el, ns);
+ if (prefix == null && el.getParentNode() instanceof Element) {
+ prefix = getPrefixRecursive((Element)el.getParentNode(), ns);
+ }
+ return prefix;
+ }
+
+ public static String getPrefix(Element el, String ns) {
+ NamedNodeMap atts = el.getAttributes();
+ for (int i = 0; i < atts.getLength(); i++) {
+ Node node = atts.item(i);
+ String name = node.getNodeName();
+ if (ns.equals(node.getNodeValue())
+ && (name != null && (XMLNAMESPACE.equals(name) || name.startsWith(XMLNAMESPACE + ":")))) {
+ return node.getLocalName();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get all prefixes defined, up to the root, for a namespace URI.
+ *
+ * @param element
+ * @param namespaceUri
+ * @param prefixes
+ */
+ public static void getPrefixesRecursive(Element element, String namespaceUri, List<String> prefixes) {
+ getPrefixes(element, namespaceUri, prefixes);
+ Node parent = element.getParentNode();
+ if (parent instanceof Element) {
+ getPrefixesRecursive((Element)parent, namespaceUri, prefixes);
+ }
+ }
+
+ /**
+ * Get all prefixes defined on this element for the specified namespace.
+ *
+ * @param element
+ * @param namespaceUri
+ * @param prefixes
+ */
+ public static void getPrefixes(Element element, String namespaceUri, List<String> prefixes) {
+ NamedNodeMap atts = element.getAttributes();
+ for (int i = 0; i < atts.getLength(); i++) {
+ Node node = atts.item(i);
+ String name = node.getNodeName();
+ if (namespaceUri.equals(node.getNodeValue())
+ && (name != null && (XMLNAMESPACE.equals(name) || name.startsWith(XMLNAMESPACE + ":")))) {
+ prefixes.add(node.getPrefix());
+ }
+ }
+ }
+
+ public static String createNamespace(Element el, String ns) {
+ String p = "ns1";
+ int i = 1;
+ while (getPrefix(el, ns) != null) {
+ p = "ns" + i;
+ i++;
+ }
+ addNamespacePrefix(el, ns, p);
+ return p;
+ }
+
+ /**
+ * Starting from a node, find the namespace declaration for a prefix. for a matching namespace
+ * declaration.
+ *
+ * @param node search up from here to search for namespace definitions
+ * @param searchPrefix the prefix we are searching for
+ * @return the namespace if found.
+ */
+ public static String getNamespace(Node node, String searchPrefix) {
+
+ Element el;
+ while (!(node instanceof Element)) {
+ node = node.getParentNode();
+ }
+ el = (Element)node;
+
+ NamedNodeMap atts = el.getAttributes();
+ for (int i = 0; i < atts.getLength(); i++) {
+ Node currentAttribute = atts.item(i);
+ String currentLocalName = currentAttribute.getLocalName();
+ String currentPrefix = currentAttribute.getPrefix();
+ if (searchPrefix.equals(currentLocalName) && XMLNAMESPACE.equals(currentPrefix)) {
+ return currentAttribute.getNodeValue();
+ } else if (StringUtils.isEmpty(searchPrefix) && XMLNAMESPACE.equals(currentLocalName)
+ && StringUtils.isEmpty(currentPrefix)) {
+ return currentAttribute.getNodeValue();
+ }
+ }
+
+ Node parent = el.getParentNode();
+ if (parent instanceof Element) {
+ return getNamespace((Element)parent, searchPrefix);
+ }
+
+ return null;
+ }
+
+ public static List<Element> findAllElementsByTagNameNS(Element elem, String nameSpaceURI,
+ String localName) {
+ List<Element> ret = new LinkedList<Element>();
+ findAllElementsByTagNameNS(elem, nameSpaceURI, localName, ret);
+ return ret;
+ }
+
+ private static void findAllElementsByTagNameNS(Element el, String nameSpaceURI, String localName,
+ List<Element> elementList) {
+
+ if (localName.equals(el.getLocalName()) && nameSpaceURI.contains(el.getNamespaceURI())) {
+ elementList.add(el);
+ }
+ Element elem = getFirstElement(el);
+ while (elem != null) {
+ findAllElementsByTagNameNS(elem, nameSpaceURI, localName, elementList);
+ elem = getNextElement(elem);
+ }
+ }
+
+ public static List<Element> findAllElementsByTagName(Element elem, String tagName) {
+ List<Element> ret = new LinkedList<Element>();
+ findAllElementsByTagName(elem, tagName, ret);
+ return ret;
+ }
+
+ private static void findAllElementsByTagName(Element el, String tagName, List<Element> elementList) {
+
+ if (tagName.equals(el.getTagName())) {
+ elementList.add(el);
+ }
+ Element elem = getFirstElement(el);
+ while (elem != null) {
+ findAllElementsByTagName(elem, tagName, elementList);
+ elem = getNextElement(elem);
+ }
+ }
+ public static boolean hasElementInNS(Element el, String namespace) {
+
+ if (namespace.equals(el.getNamespaceURI())) {
+ return true;
+ }
+ Element elem = getFirstElement(el);
+ while (elem != null) {
+ if (hasElementInNS(elem, namespace)) {
+ return true;
+ }
+ elem = getNextElement(elem);
+ }
+ return false;
+ }
+ /**
+ * Set a namespace/prefix on an element if it is not set already. First off, it searches for the element
+ * for the prefix associated with the specified namespace. If the prefix isn't null, then this is
+ * returned. Otherwise, it creates a new attribute using the namespace/prefix passed as parameters.
+ *
+ * @param element
+ * @param namespace
+ * @param prefix
+ * @return the prefix associated with the set namespace
+ */
+ public static String setNamespace(Element element, String namespace, String prefix) {
+ String pre = getPrefixRecursive(element, namespace);
+ if (pre != null) {
+ return pre;
+ }
+ element.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:" + prefix, namespace);
+ return prefix;
+ }
+
+ /**
+ * Add a namespace prefix definition to an element.
+ *
+ * @param element
+ * @param namespaceUri
+ * @param prefix
+ */
+ public static void addNamespacePrefix(Element element, String namespaceUri, String prefix) {
+ element.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:" + prefix, namespaceUri);
+ }
+}
Added: cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/StringUtils.java
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/StringUtils.java?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/StringUtils.java (added)
+++ cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/StringUtils.java Wed Dec 21 21:53:59 2011
@@ -0,0 +1,228 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cxf.fediz.core.util;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Few simple utils. This is originally from the CXF project.
+ */
+public final class StringUtils {
+
+ private StringUtils() {
+ }
+
+ public static String extract(String string, String startToken, String endToken) {
+ int start = string.indexOf(startToken) + startToken.length();
+ int end = string.lastIndexOf(endToken);
+
+ if (start == -1 || end == -1) {
+ return null;
+ }
+
+ return string.substring(start, end);
+ }
+
+ public static String wrapper(String string, String startToken, String endToken) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(startToken);
+ sb.append(string);
+ sb.append(endToken);
+ return sb.toString();
+ }
+
+ public static boolean isFileExist(String file) {
+ return new File(file).exists() && new File(file).isFile();
+ }
+
+ public static boolean isFileAbsolute(String file) {
+ return isFileExist(file) && new File(file).isAbsolute();
+ }
+
+ public static URL getURL(String spec) throws MalformedURLException {
+ try {
+ return new URL(spec);
+ } catch (MalformedURLException e) {
+ return new File(spec).toURI().toURL();
+ }
+ }
+
+ public static boolean isEmpty(String str) {
+ if (str != null) {
+ int len = str.length();
+ for (int x = 0; x < len; ++x) {
+ if (str.charAt(x) > ' ') {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ public static boolean isEmpty(List<String> list) {
+ if (list == null || list.size() == 0) {
+ return true;
+ }
+ if (list.size() == 1 && isEmpty(list.get(0))) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isEqualUri(String uri1, String uri2) {
+
+ if (uri1.substring(uri1.length() - 1).equals("/") && !uri2.substring(uri2.length() - 1).equals("/")) {
+ return uri1.substring(0, uri1.length() - 1).equals(uri2);
+ } else if (uri2.substring(uri2.length() - 1).equals("/")
+ && !uri1.substring(uri1.length() - 1).equals("/")) {
+ return uri2.substring(0, uri2.length() - 1).equals(uri1);
+ } else {
+ return uri1.equals(uri2);
+ }
+ }
+
+ public static String diff(String str1, String str2) {
+ int index = str1.lastIndexOf(str2);
+ if (index > -1) {
+ return str1.substring(str2.length());
+ }
+ return str1;
+ }
+
+ public static List<String> getParts(String str, String sperator) {
+ List<String> ret = new ArrayList<String>();
+ List<String> parts = Arrays.asList(str.split("/"));
+ for (String part : parts) {
+ if (!isEmpty(part)) {
+ ret.add(part);
+ }
+ }
+ return ret;
+ }
+
+ public static String getFirstNotEmpty(String str, String sperator) {
+ List<String> parts = Arrays.asList(str.split("/"));
+ for (String part : parts) {
+ if (!isEmpty(part)) {
+ return part;
+ }
+ }
+ return str;
+ }
+
+ public static String getFirstNotEmpty(List<String> list) {
+ if (isEmpty(list)) {
+ return null;
+ }
+ for (String item : list) {
+ if (!isEmpty(item)) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ public static List<String> getFound(String contents, String regex) {
+ if (isEmpty(regex) || isEmpty(contents)) {
+ return null;
+ }
+ List<String> results = new ArrayList<String>();
+ Pattern pattern = Pattern.compile(regex, Pattern.UNICODE_CASE);
+ Matcher matcher = pattern.matcher(contents);
+
+ while (matcher.find()) {
+ if (matcher.groupCount() > 0) {
+ results.add(matcher.group(1));
+ } else {
+ results.add(matcher.group());
+ }
+ }
+ return results;
+ }
+
+ public static String getFirstFound(String contents, String regex) {
+ List<String> founds = getFound(contents, regex);
+ if (isEmpty(founds)) {
+ return null;
+ }
+ return founds.get(0);
+ }
+
+ public static String formatVersionNumber(String target) {
+ List<String> found = StringUtils.getFound(target, "\\d+\\.\\d+\\.?\\d*");
+ if (isEmpty(found)) {
+ return target;
+ }
+ return getFirstNotEmpty(found);
+ }
+
+ public static String addDefaultPortIfMissing(String urlString) {
+ return addDefaultPortIfMissing(urlString, "80");
+ }
+
+ public static String addDefaultPortIfMissing(String urlString, String defaultPort) {
+ URL url = null;
+ try {
+ url = new URL(urlString);
+ } catch (MalformedURLException e) {
+ return urlString;
+ }
+ if (url.getPort() != -1) {
+ return urlString;
+ }
+ String regex = "http://([^/]+)";
+ String found = StringUtils.getFirstFound(urlString, regex);
+ String replacer = "http://" + found + ":" + defaultPort;
+
+ if (!StringUtils.isEmpty(found)) {
+ urlString = urlString.replaceFirst(regex, replacer);
+ }
+ return urlString;
+ }
+
+ /**
+ * Return input string with first character in upper case.
+ * @param name input string.
+ * @return capitalized form.
+ */
+ public static String capitalize(String name) {
+ if (name == null || name.length() == 0) {
+ return name;
+ }
+ char chars[] = name.toCharArray();
+ chars[0] = Character.toUpperCase(chars[0]);
+ return new String(chars);
+ }
+
+ public static String uncapitalize(String str) {
+ if (str == null || str.length() == 0) {
+ return str;
+ }
+ return new StringBuilder(str.length())
+ .append(Character.toLowerCase(str.charAt(0)))
+ .append(str.substring(1))
+ .toString();
+ }
+}
Added: cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/XMLUtils.java
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/XMLUtils.java?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/XMLUtils.java (added)
+++ cxf/sandbox/fediz/fediz-core/src/main/java/org/apache/cxf/fediz/core/util/XMLUtils.java Wed Dec 21 21:53:59 2011
@@ -0,0 +1,482 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cxf.fediz.core.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.WeakHashMap;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+import org.w3c.dom.bootstrap.DOMImplementationRegistry;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSOutput;
+import org.w3c.dom.ls.LSSerializer;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * Few simple utils. This is originally from the CXF project.
+ */
+@SuppressWarnings("PMD")
+public final class XMLUtils {
+
+ //private static final Logger LOG = LogUtils.getL7dLogger(XMLUtils.class);
+
+ private static final Map<ClassLoader, DocumentBuilderFactory> DOCUMENT_BUILDER_FACTORIES
+ = Collections.synchronizedMap(new WeakHashMap<ClassLoader, DocumentBuilderFactory>());
+
+ private static final Map<ClassLoader, TransformerFactory> TRANSFORMER_FACTORIES
+ = Collections.synchronizedMap(new WeakHashMap<ClassLoader, TransformerFactory>());
+
+ private XMLUtils() {
+ }
+
+ private static TransformerFactory getTransformerFactory() {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ if (loader == null) {
+ loader = XMLUtils.class.getClassLoader();
+ }
+ if (loader == null) {
+ return TransformerFactory.newInstance();
+ }
+ TransformerFactory factory = TRANSFORMER_FACTORIES.get(loader);
+ if (factory == null) {
+ factory = TransformerFactory.newInstance();
+ TRANSFORMER_FACTORIES.put(loader, factory);
+ }
+ return factory;
+ }
+ private static DocumentBuilderFactory getDocumentBuilderFactory() {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ if (loader == null) {
+ loader = XMLUtils.class.getClassLoader();
+ }
+ if (loader == null) {
+ return DocumentBuilderFactory.newInstance();
+ }
+ DocumentBuilderFactory factory = DOCUMENT_BUILDER_FACTORIES.get(loader);
+ if (factory == null) {
+ factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ DOCUMENT_BUILDER_FACTORIES.put(loader, factory);
+ }
+ return factory;
+ }
+ public static Transformer newTransformer() throws TransformerConfigurationException {
+ return getTransformerFactory().newTransformer();
+ }
+ public static Transformer newTransformer(int indent) throws TransformerConfigurationException {
+ if (indent > 0) {
+ TransformerFactory f = TransformerFactory.newInstance();
+ try {
+ //sun way of setting indent
+ f.setAttribute("indent-number", Integer.toString(indent));
+ } catch (Throwable t) {
+ //ignore
+ }
+ return f.newTransformer();
+ }
+ return getTransformerFactory().newTransformer();
+ }
+
+ public static DocumentBuilder getParser() throws ParserConfigurationException {
+ return getDocumentBuilderFactory().newDocumentBuilder();
+ }
+
+ public static Document parse(InputSource is) throws ParserConfigurationException, SAXException,
+ IOException {
+ return getParser().parse(is);
+ }
+
+ public static Document parse(File is) throws ParserConfigurationException, SAXException,
+ IOException {
+ return getParser().parse(is);
+ }
+
+ public static Document parse(InputStream in) throws ParserConfigurationException, SAXException,
+ IOException {
+ return getParser().parse(in);
+ }
+
+ public static Document parse(String in) throws ParserConfigurationException, SAXException, IOException {
+ return parse(in.getBytes());
+ }
+
+ public static Document parse(byte[] in) throws ParserConfigurationException, SAXException, IOException {
+ if (in == null) {
+ return null;
+ }
+ return getParser().parse(new ByteArrayInputStream(in));
+ }
+
+ public static Document newDocument() throws ParserConfigurationException {
+ return getParser().newDocument();
+ }
+
+ public static void writeTo(Node node, OutputStream os) {
+ writeTo(new DOMSource(node), os);
+ }
+ public static void writeTo(Node node, OutputStream os, int indent) {
+ writeTo(new DOMSource(node), os, indent);
+ }
+ public static void writeTo(Source src, OutputStream os) {
+ writeTo(src, os, -1);
+ }
+ public static void writeTo(Node node, Writer os) {
+ writeTo(new DOMSource(node), os);
+ }
+ public static void writeTo(Node node, Writer os, int indent) {
+ writeTo(new DOMSource(node), os, indent);
+ }
+ public static void writeTo(Source src, Writer os) {
+ writeTo(src, os, -1);
+ }
+ public static void writeTo(Source src, OutputStream os, int indent) {
+ String enc = null;
+ if (src instanceof DOMSource
+ && ((DOMSource)src).getNode() instanceof Document) {
+ try {
+ enc = ((Document)((DOMSource)src).getNode()).getXmlEncoding();
+ } catch (Exception ex) {
+ //ignore - not DOM level 3
+ }
+ }
+ writeTo(src, os, indent, enc, "no");
+ }
+ public static void writeTo(Source src, Writer os, int indent) {
+ String enc = null;
+ if (src instanceof DOMSource
+ && ((DOMSource)src).getNode() instanceof Document) {
+ try {
+ enc = ((Document)((DOMSource)src).getNode()).getXmlEncoding();
+ } catch (Exception ex) {
+ //ignore - not DOM level 3
+ }
+ }
+ writeTo(src, os, indent, enc, "no");
+ }
+ public static void writeTo(Source src,
+ OutputStream os,
+ int indent,
+ String charset,
+ String omitXmlDecl) {
+ Transformer it;
+ try {
+ if (StringUtils.isEmpty(charset)) {
+ charset = "utf-8";
+ }
+
+ it = newTransformer(indent);
+ it.setOutputProperty(OutputKeys.METHOD, "xml");
+ if (indent > -1) {
+ it.setOutputProperty(OutputKeys.INDENT, "yes");
+ it.setOutputProperty("{http://xml.apache.org/xslt}indent-amount",
+ Integer.toString(indent));
+ }
+ it.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, omitXmlDecl);
+ it.setOutputProperty(OutputKeys.ENCODING, charset);
+ it.transform(src, new StreamResult(os));
+ } catch (TransformerException e) {
+ throw new RuntimeException("Failed to configure TRaX", e);
+ }
+ }
+ public static void writeTo(Source src,
+ Writer os,
+ int indent,
+ String charset,
+ String omitXmlDecl) {
+ Transformer it;
+ try {
+ if (StringUtils.isEmpty(charset)) {
+ charset = "utf-8";
+ }
+
+ it = newTransformer(indent);
+ it.setOutputProperty(OutputKeys.METHOD, "xml");
+ if (indent > -1) {
+ it.setOutputProperty(OutputKeys.INDENT, "yes");
+ it.setOutputProperty("{http://xml.apache.org/xslt}indent-amount",
+ Integer.toString(indent));
+ }
+ it.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, omitXmlDecl);
+ it.setOutputProperty(OutputKeys.ENCODING, charset);
+ it.transform(src, new StreamResult(os));
+ } catch (TransformerException e) {
+ throw new RuntimeException("Failed to configure TRaX", e);
+ }
+ }
+ public static String toString(Source source) throws TransformerException, IOException {
+ return toString(source, null);
+ }
+
+ public static String toString(Source source, Properties props) throws TransformerException, IOException {
+ StringWriter bos = new StringWriter();
+ StreamResult sr = new StreamResult(bos);
+ Transformer trans = newTransformer();
+ if (props == null) {
+ props = new Properties();
+ props.put(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ }
+ trans.setOutputProperties(props);
+ trans.transform(source, sr);
+ bos.close();
+ return bos.toString();
+ }
+
+ public static String toString(Node node, int indent) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ writeTo(node, out, indent);
+ return out.toString();
+ }
+ public static String toString(Node node) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ writeTo(node, out);
+ return out.toString();
+ }
+
+ public static void printDOM(Node node) {
+ printDOM("", node);
+ }
+
+ public static void printDOM(String words, Node node) {
+ System.out.println(words);
+ System.out.println(toString(node));
+ }
+
+ public static Attr getAttribute(Element el, String attrName) {
+ return el.getAttributeNode(attrName);
+ }
+
+ public static void replaceAttribute(Element element, String attr, String value) {
+ if (element.hasAttribute(attr)) {
+ element.removeAttribute(attr);
+ }
+ element.setAttribute(attr, value);
+ }
+
+ public static boolean hasAttribute(Element element, String value) {
+ NamedNodeMap attributes = element.getAttributes();
+ for (int i = 0; i < attributes.getLength(); i++) {
+ Node node = attributes.item(i);
+ if (value.equals(node.getNodeValue())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static void printAttributes(Element element) {
+ NamedNodeMap attributes = element.getAttributes();
+ for (int i = 0; i < attributes.getLength(); i++) {
+ Node node = attributes.item(i);
+ System.err.println("## prefix=" + node.getPrefix() + " localname:" + node.getLocalName()
+ + " value=" + node.getNodeValue());
+ }
+ }
+
+ public static QName getNamespace(Map<String, String> namespaces, String str, String defaultNamespace) {
+ String prefix = null;
+ String localName = null;
+
+ StringTokenizer tokenizer = new StringTokenizer(str, ":");
+ if (tokenizer.countTokens() == 2) {
+ prefix = tokenizer.nextToken();
+ localName = tokenizer.nextToken();
+ } else if (tokenizer.countTokens() == 1) {
+ localName = tokenizer.nextToken();
+ }
+
+ String namespceURI = defaultNamespace;
+ if (prefix != null) {
+ namespceURI = (String)namespaces.get(prefix);
+ }
+ return new QName(namespceURI, localName);
+ }
+
+ public static void generateXMLFile(Element element, Writer writer) {
+ try {
+ Transformer it = newTransformer();
+
+ it.setOutputProperty(OutputKeys.METHOD, "xml");
+ it.setOutputProperty(OutputKeys.INDENT, "yes");
+ it.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+ it.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+ it.transform(new DOMSource(element), new StreamResult(writer));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static Element createElementNS(Node node, QName name) {
+ return createElementNS(node.getOwnerDocument(), name.getNamespaceURI(), name.getLocalPart());
+ }
+
+ public static Element createElementNS(Document root, QName name) {
+ return createElementNS(root, name.getNamespaceURI(), name.getLocalPart());
+ }
+
+ public static Element createElementNS(Document root, String namespaceURI, String qualifiedName) {
+ return root.createElementNS(namespaceURI, qualifiedName);
+ }
+
+ public static Text createTextNode(Document root, String data) {
+ return root.createTextNode(data);
+ }
+
+ public static Text createTextNode(Node node, String data) {
+ return createTextNode(node.getOwnerDocument(), data);
+ }
+
+ public static void removeContents(Node parent) {
+ Node node = parent.getFirstChild();
+ while (node != null) {
+ parent.removeChild(node);
+ node = node.getNextSibling();
+ }
+ }
+
+ public static InputStream getInputStream(Document doc) throws Exception {
+ DOMImplementationLS impl = null;
+ DOMImplementation docImpl = doc.getImplementation();
+ // Try to get the DOMImplementation from doc first before
+ // defaulting to the sun implementation.
+ if (docImpl != null && docImpl.hasFeature("LS", "3.0")) {
+ impl = (DOMImplementationLS)docImpl.getFeature("LS", "3.0");
+ } else {
+ DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
+ impl = (DOMImplementationLS)registry.getDOMImplementation("LS");
+ if (impl == null) {
+ System.setProperty(DOMImplementationRegistry.PROPERTY,
+ "com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl");
+ registry = DOMImplementationRegistry.newInstance();
+ impl = (DOMImplementationLS)registry.getDOMImplementation("LS");
+ }
+ }
+ LSOutput output = impl.createLSOutput();
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ output.setByteStream(byteArrayOutputStream);
+ LSSerializer writer = impl.createLSSerializer();
+ writer.write(doc, output);
+ byte[] buf = byteArrayOutputStream.toByteArray();
+ return new ByteArrayInputStream(buf);
+ }
+
+ public static Element fetchElementByNameAttribute(Element parent, String targetName, String nameValue) {
+
+ List<Element> elemList = DOMUtils.findAllElementsByTagName(parent, targetName);
+ for (Element elem : elemList) {
+ if (elem.getAttribute("name").equals(nameValue)) {
+ return elem;
+ }
+ }
+ return null;
+ }
+
+ public static QName getQName(String value, Node node) {
+ if (value == null) {
+ return null;
+ }
+
+ int index = value.indexOf(":");
+
+ if (index == -1) {
+ return new QName(value);
+ }
+
+ String prefix = value.substring(0, index);
+ String localName = value.substring(index + 1);
+ String ns = node.lookupNamespaceURI(prefix);
+
+ if (ns == null || localName == null) {
+ throw new RuntimeException("Invalid QName in mapping: " + value);
+ }
+
+ return new QName(ns, localName, prefix);
+ }
+
+ public static Node fromSource(Source src) throws Exception {
+
+ Transformer trans = TransformerFactory.newInstance().newTransformer();
+ DOMResult res = new DOMResult();
+ trans.transform(src, res);
+ return res.getNode();
+ }
+
+ public static QName convertStringToQName(String expandedQName) {
+ return convertStringToQName(expandedQName, "");
+ }
+
+ public static QName convertStringToQName(String expandedQName, String prefix) {
+ int ind1 = expandedQName.indexOf('{');
+ if (ind1 != 0) {
+ return new QName(expandedQName);
+ }
+
+ int ind2 = expandedQName.indexOf('}');
+ if (ind2 <= ind1 + 1 || ind2 >= expandedQName.length() - 1) {
+ return null;
+ }
+ String ns = expandedQName.substring(ind1 + 1, ind2);
+ String localName = expandedQName.substring(ind2 + 1);
+ return new QName(ns, localName, prefix);
+ }
+
+ public static Set<QName> convertStringsToQNames(List<String> expandedQNames) {
+ Set<QName> dropElements = Collections.emptySet();
+ if (expandedQNames != null) {
+ dropElements = new LinkedHashSet<QName>(expandedQNames.size());
+ for (String val : expandedQNames) {
+ dropElements.add(XMLUtils.convertStringToQName(val));
+ }
+ }
+ return dropElements;
+ }
+
+}
Added: cxf/sandbox/fediz/fediz-core/src/test/java/org/apache/cxf/fediz/core/FederationProcessorTest.java
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/test/java/org/apache/cxf/fediz/core/FederationProcessorTest.java?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-core/src/test/java/org/apache/cxf/fediz/core/FederationProcessorTest.java (added)
+++ cxf/sandbox/fediz/fediz-core/src/test/java/org/apache/cxf/fediz/core/FederationProcessorTest.java Wed Dec 21 21:53:59 2011
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cxf.fediz.core;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.apache.cxf.fediz.core.FederationConfiguration;
+import org.apache.cxf.fediz.core.FederationConstants;
+import org.apache.cxf.fediz.core.FederationProcessor;
+import org.apache.cxf.fediz.core.FederationProcessorImpl;
+import org.apache.cxf.fediz.core.FederationRequest;
+import org.apache.cxf.fediz.core.FederationResponse;
+import org.junit.BeforeClass;
+
+import junit.framework.Assert;
+
+import static org.apache.cxf.fediz.core.FederationConstants.DEFAULT_ROLE_URI;
+
+public class FederationProcessorTest {
+
+ private static final String TEST_OTHER_ISSUER = "ZFS IDP DEV";
+ private static final String TEST_USER = "alice";
+ private static final String TEST_TRUSTSTORE_FILE = "stsstore.jks";
+ private static final String TEST_TRUSTSTORE_PASSWORD = "stsspass";
+ private static final String TEST_RSTR_ISSUER = "DoubleItSTSIssuer";
+ private static final String TEST_CERT_CONSTRAINT = ".*CN=www.sts.com.*";
+
+
+ private static String sRSTR = null;
+
+ @BeforeClass
+ public static void readWResult() {
+ InputStream is = null;
+ try {
+ is = FederationProcessorTest.class.getResourceAsStream("/RSTR.xml");
+ if (is == null) {
+ throw new FileNotFoundException("Failed to get RSTR.xml");
+ }
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
+ StringBuilder stringBuilder = new StringBuilder();
+ String line = null;
+ while ((line = bufferedReader.readLine()) != null) {
+ stringBuilder.append(line + "\n");
+ }
+ bufferedReader.close();
+ sRSTR = stringBuilder.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ Assert.assertNotNull("RSTR resource null", sRSTR);
+
+ }
+
+ @org.junit.Test
+ public void validateSAML2Token() {
+
+ FederationRequest wfReq = new FederationRequest();
+ wfReq.setWa(FederationConstants.ACTION_SIGNIN);
+ wfReq.setWresult(sRSTR);
+
+ FederationConfiguration config = new FederationConfiguration();
+ config.setTrustedIssuer(TEST_CERT_CONSTRAINT);
+ config.setRoleDelimiter(";");
+ config.setRoleURI(FederationConstants.DEFAULT_ROLE_URI);
+ config.setTrustStoreFile(TEST_TRUSTSTORE_FILE);
+ config.setTrustStorePassword(TEST_TRUSTSTORE_PASSWORD);
+ config.setDetectReplayedTokens(false);
+
+ FederationProcessor wfProc = new FederationProcessorImpl();
+ FederationResponse wfRes = wfProc.processRequest(wfReq, config);
+ Assert.assertEquals("Principal name wrong", TEST_USER, wfRes.getUsername());
+ Assert.assertEquals("Issuer wrong", TEST_RSTR_ISSUER, wfRes.getIssuer());
+ }
+
+
+ @org.junit.Test
+ public void validateSAML2TokenWithWrongIssuer() {
+
+ FederationRequest wfReq = new FederationRequest();
+ wfReq.setWa(FederationConstants.ACTION_SIGNIN);
+ wfReq.setWresult(sRSTR);
+
+ FederationConfiguration config = new FederationConfiguration();
+ config.setTrustedIssuer(TEST_OTHER_ISSUER);
+ config.setRoleDelimiter(";");
+ config.setRoleURI(FederationConstants.DEFAULT_ROLE_URI);
+ config.setTrustStoreFile(TEST_TRUSTSTORE_FILE);
+ config.setTrustStorePassword(TEST_TRUSTSTORE_PASSWORD);
+ config.setDetectReplayedTokens(false);
+
+ FederationProcessor wfProc = new FederationProcessorImpl();
+ try {
+ wfProc.processRequest(wfReq, config);
+ Assert.fail("Processing must fail because of wrong issuer configured");
+ }
+ catch (RuntimeException ex) {
+ Assert.assertEquals("Exception expected", "Issuer '" + TEST_RSTR_ISSUER + "' not trusted", ex.getMessage());
+ }
+ }
+
+ @org.junit.Test
+ public void validateSAML2TokenForRoles() {
+
+ FederationRequest wfReq = new FederationRequest();
+ wfReq.setWa(FederationConstants.ACTION_SIGNIN);
+ wfReq.setWresult(sRSTR);
+
+ FederationConfiguration config = new FederationConfiguration();
+ config.setTrustedIssuer(TEST_CERT_CONSTRAINT);
+ config.setRoleDelimiter(";");
+ config.setRoleURI(DEFAULT_ROLE_URI);
+ config.setTrustStoreFile(TEST_TRUSTSTORE_FILE);
+ config.setTrustStorePassword(TEST_TRUSTSTORE_PASSWORD);
+ config.setDetectReplayedTokens(false);
+
+ FederationProcessor wfProc = new FederationProcessorImpl();
+ FederationResponse wfRes = wfProc.processRequest(wfReq, config);
+ Assert.assertEquals("Principal name wrong", TEST_USER, wfRes.getUsername());
+ Assert.assertEquals("Issuer wrong", TEST_RSTR_ISSUER, wfRes.getIssuer());
+ Assert.assertEquals("One role must be found", 1, wfRes.getRoles().size());
+ }
+
+
+
+}
Added: cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR.formatted.xml
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR.formatted.xml?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR.formatted.xml (added)
+++ cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR.formatted.xml Wed Dec 21 21:53:59 2011
@@ -0,0 +1,107 @@
+<!-- DO NOT REFORMAT THIS XML DOCUMENT AS IT BREAKS THE SAML SIGNTATURE VALIDATION -->
+
+<RequestSecurityTokenResponseCollection
+ xmlns="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
+ xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
+ xmlns:ns3="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
+ xmlns:ns4="http://www.w3.org/2005/08/addressing" xmlns:ns5="http://docs.oasis-open.org/ws-sx/ws-trust/200802">
+ <RequestSecurityTokenResponse>
+ <TokenType>http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0
+ </TokenType>
+ <RequestedSecurityToken>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ ID="_93FDCC53AC1D5AE3EB131849544559910" IssueInstant="2011-10-13T08:44:05.599Z"
+ Version="2.0" xsi:type="saml2:AssertionType">
+ <saml2:Issuer>DoubleItSTSIssuer</saml2:Issuer>
+ <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:SignedInfo>
+ <ds:CanonicalizationMethod
+ Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+ <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
+ <ds:Reference URI="#_93FDCC53AC1D5AE3EB131849544559910">
+ <ds:Transforms>
+ <ds:Transform
+ Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
+ <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
+ <ec:InclusiveNamespaces
+ xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs" />
+ </ds:Transform>
+ </ds:Transforms>
+ <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
+ <ds:DigestValue>3BwoTotMyMTFt40DCmi0ayEdnko=</ds:DigestValue>
+ </ds:Reference>
+ </ds:SignedInfo>
+ <ds:SignatureValue>bXSIwaG+e2hDdpdDkciR3pjLbbpCLD/XwS+CezMygN/w2g1trgyaIlfkUvyAXVyk5ULJH9s+fFuecPgRm2n2JePm8Up2oZ0+vAJ6fvwQxbhhpuGz8j+OkVr11rGMjpVo1tFSVQNlq183blHVjjDQhGBl7TvoKAZsSGnhzoHclEY=
+ </ds:SignatureValue>
+ <ds:KeyInfo>
+ <ds:X509Data>
+ <ds:X509Certificate>MIID5jCCA0+gAwIBAgIJAPahVdM2UPibMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJVUzERMA8GA1UECBMITWFyeWxhbmQxEjAQBgNVBAcTCUJhbHRpbW9yZTEpMCcGA1UEChMgU2FtcGxlIFNUUyAtLSBOT1QgRk9SIFBST0RVQ1RJT04xFjAUBgNVBAsTDUlUIERlcGFydG1lbnQxFDASBgNVBAMTC3d3dy5zdHMuY29tMRowGAYJKoZIhvcNAQkBFgtzdHNAc3RzLmNvbTAeFw0xMTAyMDkxODM4MTNaFw0yMTAyMDYxODM4MTNaMIGpMQswCQYDVQQGEwJVUzERMA8GA1UECBMITWFyeWxhbmQxEjAQBgNVBAcTCUJhbHRpbW9yZTEpMCcGA1UEChMgU2FtcGxlIFNUUyAtLSBOT1QgRk9SIFBST0RVQ1RJT04xFjAUBgNVBAsTDUlUIERlcGFydG1lbnQxFDASBgNVBAMTC3d3dy5zdHMuY29tMRowGAYJKoZIhvcNAQkBFgtzdHNAc3RzLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAo+f8gs4WcteLdSPWPm8+ciyEz7zVmA7kcCGFQQvlO0smxRViWJ1x+yniT5Uu86UrAQjxRJyANBomQrirfE7KPrnCm6iVOsGDEntuIZAf7DFPnrv5p++jAZQuR3vm4ZHXFOFTXmI+/FD5AqLfNi17xiTxZCDYyDdD39CNFTrB2PkCAwEAAaOCARIwggEOMB0GA1UdDgQWBBRa0A38holQIbJMFW7m5ZSw+iVDHDCB3gYDVR0jBIHWMIHTgBRa0A38holQIbJMFW7m5ZSw+iVDHKGBr6SBrDCBqTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE1hcnlsYW5kMRIwEAYDVQQHEwlCYWx0aW1vcmUxKTAnBgNVBA
oTIFNhbXBsZSBTVFMgLS0gTk9UIEZPUiBQUk9EVUNUSU9OMRYwFAYDVQQLEw1JVCBEZXBhcnRtZW50MRQwEgYDVQQDEwt3d3cuc3RzLmNvbTEaMBgGCSqGSIb3DQEJARYLc3RzQHN0cy5jb22CCQD2oVXTNlD4mzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBACp9yK1I9r++pyFT0yrcaV1m1Sub6urJH+GxQLBaTnTsaPLuzq2gIsJHpwk5XggB+IDe69iKKeb74Vt8aOe5usIWVASgi9ckqCwdfTqYu6KG9BlezqHZdExnIG2v/cD/3NkKr7O/a7DjlbE6FZ4G1nrOfVJkjmeAa6txtYm1Dm/f
+ </ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </ds:Signature>
+ <saml2:Subject>
+ <saml2:NameID
+ Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
+ NameQualifier="http://cxf.apache.org/sts">alice</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer" />
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2011-10-13T08:44:05.600Z"
+ NotOnOrAfter="2011-10-13T08:49:05.600Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>http://localhost:8080/wsfedhelloworld/
+ </saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AttributeStatement>
+ <saml2:Attribute Name="givenname"
+ NameFormat="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
+ <saml2:AttributeValue xsi:type="xs:string">Alice
+ </saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute Name="surname"
+ NameFormat="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
+ <saml2:AttributeValue xsi:type="xs:string">Smith
+ </saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute Name="emailaddress"
+ NameFormat="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
+ <saml2:AttributeValue xsi:type="xs:string">alice@mycompany.org
+ </saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute Name="role"
+ NameFormat="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
+ <saml2:AttributeValue xsi:type="xs:string">User
+ </saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+ </RequestedSecurityToken>
+ <RequestedAttachedReference>
+ <ns3:SecurityTokenReference
+ xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd"
+ wsse11:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0">
+ <ns3:KeyIdentifier
+ ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">#_93FDCC53AC1D5AE3EB131849544559910</ns3:KeyIdentifier>
+ </ns3:SecurityTokenReference>
+ </RequestedAttachedReference>
+ <RequestedUnattachedReference>
+ <ns3:SecurityTokenReference
+ xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd"
+ wsse11:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0">
+ <ns3:KeyIdentifier
+ ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">_93FDCC53AC1D5AE3EB131849544559910</ns3:KeyIdentifier>
+ </ns3:SecurityTokenReference>
+ </RequestedUnattachedReference>
+ <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
+ <wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
+ <wsa:Address>http://localhost:8080/wsfedhelloworld/</wsa:Address>
+ </wsa:EndpointReference>
+ </wsp:AppliesTo>
+ <Lifetime>
+ <ns2:Created>2011-10-13T08:44:05.608Z</ns2:Created>
+ <ns2:Expires>2011-10-13T08:49:05.608Z</ns2:Expires>
+ </Lifetime>
+ </RequestSecurityTokenResponse>
+</RequestSecurityTokenResponseCollection>
\ No newline at end of file
Added: cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR.xml
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR.xml?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR.xml (added)
+++ cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR.xml Wed Dec 21 21:53:59 2011
@@ -0,0 +1,3 @@
+<!-- DO NOT REFORMAT THIS XML DOCUMENT AS IT BREAKS THE SAML SIGNTATURE VALIDATION -->
+
+<RequestSecurityTokenResponseCollection xmlns="http://docs.oasis-open.org/ws-sx/ws-trust/200512" xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns3="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:ns4="http://www.w3.org/2005/08/addressing" xmlns:ns5="http://docs.oasis-open.org/ws-sx/ws-trust/200802"><RequestSecurityTokenResponse><TokenType>http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0</TokenType><RequestedSecurityToken><saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="_93FDCC53AC1D5AE3EB131849544559910" IssueInstant="2011-10-13T08:44:05.599Z" Version="2.0" xsi:type="saml2:AssertionType"><saml2:Issuer>DoubleItSTSIssuer</saml2:Issuer><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:SignedInfo><ds:CanonicalizationMethod Algo
rithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><ds:Reference URI="#_93FDCC53AC1D5AE3EB131849544559910"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs"/></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ds:DigestValue>3BwoTotMyMTFt40DCmi0ayEdnko=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>bXSIwaG+e2hDdpdDkciR3pjLbbpCLD/XwS+CezMygN/w2g1trgyaIlfkUvyAXVyk5ULJH9s+fFuecPgRm2n2JePm8Up2oZ0+vAJ6fvwQxbhhpuGz8j+OkVr11rGMjpVo1tFSVQNlq183blHVjjDQhGBl7TvoKAZsSGnhzoHclEY=</ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIID5jCCA0+gAwIBAgIJAPahVdM2UPibMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJVUzERMA8GA1UECBMITWFyeWxhbmQxEjAQBg
NVBAcTCUJhbHRpbW9yZTEpMCcGA1UEChMgU2FtcGxlIFNUUyAtLSBOT1QgRk9SIFBST0RVQ1RJT04xFjAUBgNVBAsTDUlUIERlcGFydG1lbnQxFDASBgNVBAMTC3d3dy5zdHMuY29tMRowGAYJKoZIhvcNAQkBFgtzdHNAc3RzLmNvbTAeFw0xMTAyMDkxODM4MTNaFw0yMTAyMDYxODM4MTNaMIGpMQswCQYDVQQGEwJVUzERMA8GA1UECBMITWFyeWxhbmQxEjAQBgNVBAcTCUJhbHRpbW9yZTEpMCcGA1UEChMgU2FtcGxlIFNUUyAtLSBOT1QgRk9SIFBST0RVQ1RJT04xFjAUBgNVBAsTDUlUIERlcGFydG1lbnQxFDASBgNVBAMTC3d3dy5zdHMuY29tMRowGAYJKoZIhvcNAQkBFgtzdHNAc3RzLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAo+f8gs4WcteLdSPWPm8+ciyEz7zVmA7kcCGFQQvlO0smxRViWJ1x+yniT5Uu86UrAQjxRJyANBomQrirfE7KPrnCm6iVOsGDEntuIZAf7DFPnrv5p++jAZQuR3vm4ZHXFOFTXmI+/FD5AqLfNi17xiTxZCDYyDdD39CNFTrB2PkCAwEAAaOCARIwggEOMB0GA1UdDgQWBBRa0A38holQIbJMFW7m5ZSw+iVDHDCB3gYDVR0jBIHWMIHTgBRa0A38holQIbJMFW7m5ZSw+iVDHKGBr6SBrDCBqTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE1hcnlsYW5kMRIwEAYDVQQHEwlCYWx0aW1vcmUxKTAnBgNVBAoTIFNhbXBsZSBTVFMgLS0gTk9UIEZPUiBQUk9EVUNUSU9OMRYwFAYDVQQLEw1JVCBEZXBhcnRtZW50MRQwEgYDVQQDEwt3d3cuc3RzLmNvbTEaMBgGCSqGSIb3DQEJARYLc3R
zQHN0cy5jb22CCQD2oVXTNlD4mzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBACp9yK1I9r++pyFT0yrcaV1m1Sub6urJH+GxQLBaTnTsaPLuzq2gIsJHpwk5XggB+IDe69iKKeb74Vt8aOe5usIWVASgi9ckqCwdfTqYu6KG9BlezqHZdExnIG2v/cD/3NkKr7O/a7DjlbE6FZ4G1nrOfVJkjmeAa6txtYm1Dm/f</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature><saml2:Subject><saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" NameQualifier="http://cxf.apache.org/sts">alice</saml2:NameID><saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"/></saml2:Subject><saml2:Conditions NotBefore="2011-10-13T08:44:05.600Z" NotOnOrAfter="2011-10-13T08:49:05.600Z"><saml2:AudienceRestriction><saml2:Audience>http://localhost:8080/wsfedhelloworld/</saml2:Audience></saml2:AudienceRestriction></saml2:Conditions><saml2:AttributeStatement><saml2:Attribute Name="givenname" NameFormat="http://schemas.xmlsoap.org/ws/2005/05/identity/claims"><saml2:AttributeValue xsi:type="xs:string">Alice</saml2:AttributeValue></
saml2:Attribute><saml2:Attribute Name="surname" NameFormat="http://schemas.xmlsoap.org/ws/2005/05/identity/claims"><saml2:AttributeValue xsi:type="xs:string">Smith</saml2:AttributeValue></saml2:Attribute><saml2:Attribute Name="emailaddress" NameFormat="http://schemas.xmlsoap.org/ws/2005/05/identity/claims"><saml2:AttributeValue xsi:type="xs:string">alice@mycompany.org</saml2:AttributeValue></saml2:Attribute><saml2:Attribute Name="role" NameFormat="http://schemas.xmlsoap.org/ws/2005/05/identity/claims"><saml2:AttributeValue xsi:type="xs:string">User</saml2:AttributeValue></saml2:Attribute></saml2:AttributeStatement></saml2:Assertion></RequestedSecurityToken><RequestedAttachedReference><ns3:SecurityTokenReference xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd" wsse11:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0"><ns3:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#
SAMLID">#_93FDCC53AC1D5AE3EB131849544559910</ns3:KeyIdentifier></ns3:SecurityTokenReference></RequestedAttachedReference><RequestedUnattachedReference><ns3:SecurityTokenReference xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd" wsse11:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0"><ns3:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">_93FDCC53AC1D5AE3EB131849544559910</ns3:KeyIdentifier></ns3:SecurityTokenReference></RequestedUnattachedReference><wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"><wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:Address>http://localhost:8080/wsfedhelloworld/</wsa:Address></wsa:EndpointReference></wsp:AppliesTo><Lifetime><ns2:Created>2011-10-13T08:44:05.608Z</ns2:Created><ns2:Expires>2011-10-13T08:49:05.608Z</ns2:Expires></Lifetime></RequestSecurityTokenResponse></RequestSecurity
TokenResponseCollection>
\ No newline at end of file
Added: cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR_old.xml
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR_old.xml?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR_old.xml (added)
+++ cxf/sandbox/fediz/fediz-core/src/test/resources/RSTR_old.xml Wed Dec 21 21:53:59 2011
@@ -0,0 +1,3 @@
+<!-- DO NOT REFORMAT THIS XML DOCUMENT AS IT BREAKS THE SAML SIGNTATURE VALIDATION -->
+
+<trust:RequestSecurityTokenResponseCollection xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512"><trust:RequestSecurityTokenResponse><trust:Lifetime><wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2011-09-15T13:18:59.140Z</wsu:Created><wsu:Expires xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2011-09-15T14:18:59.140Z</wsu:Expires></trust:Lifetime><wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"><EndpointReference xmlns="http://www.w3.org/2005/08/addressing"><Address>http://ws-ubuntu-talend.z.ch.zurich.com:8080/wsfedhelloworld/secure/test.html</Address></EndpointReference></wsp:AppliesTo><trust:RequestedSecurityToken><Assertion ID="_1020637e-0ce4-4312-bd91-4adc38f47c0b" IssueInstant="2011-09-15T13:18:59.140Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion"><Issuer>ZFS IDP LAB</Issuer><ds:Signature xmlns:ds="http://www.w3.o
rg/2000/09/xmldsig#"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /><ds:Reference URI="#_1020637e-0ce4-4312-bd91-4adc38f47c0b"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>WozRF8Ml1jrUFlzMktNb1Aj28jvX+Giy2qhSqcGtStQ=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>FdlwgcqSw+VgUT98/48DvZbHguQZTndW1GM/ctKrWok8kuWP8Vmmt9Qa1ts1QnWe6Sv07du+jDA9shHE/mxctC97T/dgraQwggPe4X4/RhNYiRD8w5pKY3hiVI1mFrnRUEg/rEcyQiCXQhcE6YL2V+asO+RpU0YW34AgRWdgJLI=</ds:SignatureValue><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><X509Data><X509Certificate>MIIC1zCCAkCgAwIBAgICAj0wDQYJKoZIhvcNAQEFBQAwgaYxCzAJBgNVBAYTAkNIMQ8wDQYDVQQIEwZ
adXJpY2gxGTAXBgNVBAcTEFp1cmljaCBJbnN1cmFuY2UxGjAYBgNVBAoTEVN3aXNzIERhdGEgQ2VudGVyMQwwCgYDVQQLEwNJTkcxGDAWBgNVBAMTD1NEQyBJbnRlcm5hbCBDQTEnMCUGCSqGSIb3DQEJARYYY2hyX25ldHNlY3VyZUB6dXJpY2guY29tMB4XDTA5MTIyODE2MTMwOFoXDTExMTIyODE2MTMwOFowgZ4xCzAJBgNVBAYTAkNIMQ8wDQYDVQQIEwZadXJpY2gxDzANBgNVBAcTBlp1cmljaDEhMB8GA1UEChMYWnVyaWNoIEluc3VyYW5jZSBDb21wYW55MRMwEQYDVQQLEwpJU1AgRXVyb3BlMQwwCgYDVQQDEwNTVFMxJzAlBgkqhkiG9w0BCQEWGGNocl9uZXRzZWN1cmVAenVyaWNoLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAxLcHLtMzqstcDeIozxMethzbDunN+ZINWpW8ui5EbkuduwB4q9Um6zARnHe+ECfcaDkzBge+INgl4MSmHxWW79lFYSwIwH+8RcLpgZKabmX9G9EKeNW0T5tJjauzumU2Pc8Q66NiTa2hr/aNlRZzWUtz9UM4AL+V2GSwXNDYrakCAwEAAaMaMBgwCQYDVR0TBAIwADALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQEFBQADgYEAo+uaHVi02v7Pch1ispD5kQNCMgMJoXgGYGM/xuLlIIpz7785L+fp7j8F//aCXUSjj+4juAOCKe+vwc0/Ij9WDjhH10fruzTOHtOiCDyp1dzb9fwlug+zzGUvL07CJZY+ZDetqYJUHIq4F56bAe65d+S445I254uttRslM8D0DFU=</X509Certificate></X509Data></KeyInfo></ds:Signature><Subject><NameID>John</NameID><Subject
Confirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer" /></Subject><Conditions NotBefore="2011-09-15T13:18:59.140Z" NotOnOrAfter="2011-09-15T14:18:59.140Z"><AudienceRestriction><Audience>http://ws-ubuntu-talend.z.ch.zurich.com:8080/wsfedhelloworld/secure/test.html</Audience></AudienceRestriction></Conditions><AttributeStatement><Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"><AttributeValue>John</AttributeValue></Attribute><Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"><AttributeValue>Doe</AttributeValue></Attribute><Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth"><AttributeValue>5/5/1955</AttributeValue></Attribute><Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone"><AttributeValue>555-555-5555</AttributeValue></Attribute><Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"><AttributeValue>john@gh.com</Attri
buteValue></Attribute><Attribute Name="http://cloudbuddies.com/2009/06/FrequentFlyerProgram"><AttributeValue>ContosoAir</AttributeValue></Attribute><Attribute Name="http://cloudbuddies.com/2009/06/FrequentFlyerNumber"><AttributeValue>54545454</AttributeValue></Attribute><Attribute Name="http://cloudbuddies.com/2009/06/FrequentFlyerLevel"><AttributeValue>gold</AttributeValue></Attribute></AttributeStatement></Assertion></trust:RequestedSecurityToken><trust:RequestedAttachedReference><SecurityTokenReference d4p1:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0" xmlns:d4p1="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">_1020637e-0ce4-4312-bd91-4adc38f47c0b</KeyIdentifier></SecurityTokenReference></trust:RequestedAttachedReference><trust:
RequestedUnattachedReference><SecurityTokenReference d4p1:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0" xmlns:d4p1="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">_1020637e-0ce4-4312-bd91-4adc38f47c0b</KeyIdentifier></SecurityTokenReference></trust:RequestedUnattachedReference><trust:TokenType>urn:oasis:names:tc:SAML:2.0:assertion</trust:TokenType><trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType><trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType></trust:RequestSecurityTokenResponse></trust:RequestSecurityTokenResponseCollection>
\ No newline at end of file
Added: cxf/sandbox/fediz/fediz-core/src/test/resources/logging.properties
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/test/resources/logging.properties?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-core/src/test/resources/logging.properties (added)
+++ cxf/sandbox/fediz/fediz-core/src/test/resources/logging.properties Wed Dec 21 21:53:59 2011
@@ -0,0 +1,54 @@
+############################################################
+# Default Logging Configuration File
+#
+# You can use a different file by specifying a filename
+# with the java.util.logging.config.file system property.
+# For example java -Djava.util.logging.config.file=myfile
+############################################################
+
+############################################################
+# Global properties
+############################################################
+
+# "handlers" specifies a comma separated list of log Handler
+# classes. These handlers will be installed during VM startup.
+# Note that these classes must be on the system classpath.
+# By default we only configure a ConsoleHandler, which will only
+# show messages at the WARNING and above levels.
+handlers= java.util.logging.ConsoleHandler
+#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
+
+# Default global logging level.
+# This specifies which kinds of events are logged across
+# all loggers. For any given facility this global level
+# can be overridden by a facility specific level
+# Note that the ConsoleHandler also has a separate level
+# setting to limit messages printed to the console.
+.level= INFO
+
+############################################################
+# Handler specific properties.
+# Describes specific configuration info for Handlers.
+############################################################
+
+# default file output is in user's home directory.
+java.util.logging.FileHandler.pattern = %h/java%u.log
+java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+
+# Limit the message that are printed on the console to WARNING and above.
+java.util.logging.ConsoleHandler.level = FINEST
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+
+############################################################
+# Facility specific properties.
+# Provides extra control for each logger.
+############################################################
+
+# For example, set the com.xyz.foo logger to only log SEVERE
+# messages:
+#com.xyz.foo.level = SEVERE
+org.apache.ws.security.level = FINEST
+org.apache.cxf.fediz.level = FINEST
Added: cxf/sandbox/fediz/fediz-core/src/test/resources/signature.properties
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/test/resources/signature.properties?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-core/src/test/resources/signature.properties (added)
+++ cxf/sandbox/fediz/fediz-core/src/test/resources/signature.properties Wed Dec 21 21:53:59 2011
@@ -0,0 +1,6 @@
+org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
+org.apache.ws.security.crypto.merlin.keystore.type=jks
+org.apache.ws.security.crypto.merlin.keystore.password=changeit
+#org.apache.ws.security.crypto.merlin.keystore.alias=notneeded
+org.apache.ws.security.crypto.merlin.keystore.file=sdcinternal.jks
+
Added: cxf/sandbox/fediz/fediz-core/src/test/resources/stsstore.jks
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-core/src/test/resources/stsstore.jks?rev=1221896&view=auto
==============================================================================
Binary file - no diff available.
Propchange: cxf/sandbox/fediz/fediz-core/src/test/resources/stsstore.jks
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: cxf/sandbox/fediz/fediz-idp-sts/pom.xml
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-idp-sts/pom.xml?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-idp-sts/pom.xml (added)
+++ cxf/sandbox/fediz/fediz-idp-sts/pom.xml Wed Dec 21 21:53:59 2011
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.cxf.fediz</groupId>
+ <artifactId>fediz</artifactId>
+ <version>0.6-SNAPSHOT</version>
+ </parent>
+ <artifactId>fediz-idp-sts</artifactId>
+ <name>WS Federation IDP STS</name>
+ <packaging>war</packaging>
+
+ <properties>
+ <cxf.version>2.5.1</cxf.version>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-transports-http</artifactId>
+ <version>${cxf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-frontend-jaxws</artifactId>
+ <version>${cxf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-ws-policy</artifactId>
+ <version>${cxf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf.services.sts</groupId>
+ <artifactId>cxf-services-sts-core</artifactId>
+ <version>${cxf.version}</version>
+ <!--
+ <exclusions>
+ <exclusion>
+ <artifactId>slf4j-jdk14</artifactId>
+ <groupId>org.slf4j</groupId>
+ </exclusion>
+ <exclusion>
+ <artifactId>slf4j-api</artifactId>
+ <groupId>org.slf4j</groupId>
+ </exclusion>
+ </exclusions>
+ -->
+ </dependency>
+
+
+ <!--
+ <dependency>
+ <groupId>com.talend.sf</groupId>
+ <artifactId>cxf-sts-core</artifactId>
+ <version>${sts.version}</version>
+ </dependency>
+ -->
+ </dependencies>
+
+ <build>
+ <plugins>
+ <!--
+ <plugin>
+ <groupId>org.apache.tomcat.maven</groupId>
+ <artifactId>tomcat-maven-plugin</artifactId>
+ <version>2.0-SNAPSHOT</version>
+ <configuration>
+ <server>myTomcat</server>
+ <url>http://localhost:8080/manager/text</url>
+ <warFile>${project.build.finalName}.war</warFile>
+ </configuration>
+ </plugin>
+ -->
+ <plugin><!--for mvn tomcat:deploy/:undeploy/:redeploy -->
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>tomcat-maven-plugin</artifactId>
+ <version>1.1</version>
+ <configuration>
+ <server>myTomcat</server>
+ <url>http://localhost:9080/manager/text</url>
+ <path>/${project.build.finalName}</path>
+ </configuration>
+ </plugin>
+ </plugins>
+ <!-- Name of the generated WAR file -->
+ <finalName>fedizidpsts</finalName>
+ </build>
+
+</project>
Added: cxf/sandbox/fediz/fediz-idp-sts/src/main/java/org/apache/cxf/fediz/service/sts/FileClaimsHandler.java
URL: http://svn.apache.org/viewvc/cxf/sandbox/fediz/fediz-idp-sts/src/main/java/org/apache/cxf/fediz/service/sts/FileClaimsHandler.java?rev=1221896&view=auto
==============================================================================
--- cxf/sandbox/fediz/fediz-idp-sts/src/main/java/org/apache/cxf/fediz/service/sts/FileClaimsHandler.java (added)
+++ cxf/sandbox/fediz/fediz-idp-sts/src/main/java/org/apache/cxf/fediz/service/sts/FileClaimsHandler.java Wed Dec 21 21:53:59 2011
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cxf.fediz.service.sts;
+
+import java.net.URI;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.ws.WebServiceContext;
+
+import org.apache.cxf.sts.claims.Claim;
+import org.apache.cxf.sts.claims.ClaimCollection;
+import org.apache.cxf.sts.claims.ClaimTypes;
+import org.apache.cxf.sts.claims.ClaimsHandler;
+import org.apache.cxf.sts.claims.RequestClaim;
+import org.apache.cxf.sts.claims.RequestClaimCollection;
+
+/**
+ * A custom ClaimsHandler implementation for use in the tests.
+ */
+public class FileClaimsHandler implements ClaimsHandler {
+
+ public static final URI ROLE =
+ URI.create("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/role");
+
+ private Map<String,Map<String,String>> userClaims = null;
+
+ public void setUserClaims(Map<String,Map<String,String>> userClaims) {
+ this.userClaims = userClaims;
+ }
+
+ public Map<String,Map<String,String>> getUserClaims() {
+ return userClaims;
+ }
+
+ @Override
+ public ClaimCollection retrieveClaimValues(Principal principal, RequestClaimCollection claims, WebServiceContext context, String realm) {
+
+ if (getUserClaims() == null) {
+ return new ClaimCollection();
+ }
+
+ Map<String, String> claimMap = getUserClaims().get(principal.getName());
+ if (claimMap == null || claimMap.size() == 0) {
+ return new ClaimCollection();
+ }
+
+ if (claims != null && claims.size() > 0) {
+ ClaimCollection claimCollection = new ClaimCollection();
+ for (RequestClaim requestClaim : claims) {
+ String claimValue = claimMap.get(requestClaim.getClaimType().toString());
+ if (claimValue != null) {
+ Claim claim = new Claim();
+ claim.setClaimType(requestClaim.getClaimType());
+ claim.setIssuer("Test Issuer");
+ claim.setOriginalIssuer("Original Issuer");
+ claim.setValue(claimValue);
+ claimCollection.add(claim);
+ }
+ }
+ return claimCollection;
+ }
+ return null;
+ }
+
+ @Override
+ public List<URI> getSupportedClaimTypes() {
+ ArrayList<URI> list = new ArrayList<URI>();
+ list.add(ClaimTypes.EMAILADDRESS);
+ list.add(ClaimTypes.LASTNAME);
+ list.add(ClaimTypes.FIRSTNAME);
+ list.add(ROLE);
+ return list;
+ }
+
+
+
+}