1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
/* * =========================================================================== * * (C) Copyright IBM Corp. 2003 All Rights Reserved. * * =========================================================================== */ /* * Portions copyright 2006 Sun Microsystems, Inc. All rights reserved. */ /* * $Id: DOMXPathFilter2Transform.java,v 1.18 2005/09/19 18:30:30 mullan Exp $ */ package org.jcp.xml.dsig.internal.dom; import javax.xml.crypto.*; import javax.xml.crypto.dsig.*; import javax.xml.crypto.dsig.spec.TransformParameterSpec; import javax.xml.crypto.dsig.spec.XPathType; import javax.xml.crypto.dsig.spec.XPathFilter2ParameterSpec; import java.security.InvalidAlgorithmParameterException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.HashMap; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; /** * DOM-based implementation of XPath Filter 2.0 Transform. * (Uses Apache XML-Sec Transform implementation) * * @author Joyce Leung */ public final class DOMXPathFilter2Transform extends ApacheTransform { public void init(TransformParameterSpec params) throws InvalidAlgorithmParameterException { if (params == null) { throw new InvalidAlgorithmParameterException("params are required"); } else if (!(params instanceof XPathFilter2ParameterSpec)) { throw new InvalidAlgorithmParameterException ("params must be of type XPathFilter2ParameterSpec"); } this.params = params; } public void init(XMLStructure parent, XMLCryptoContext context) throws InvalidAlgorithmParameterException { super.init(parent, context); try { unmarshalParams(DOMUtils.getFirstChildElement(transformElem)); } catch (MarshalException me) { throw (InvalidAlgorithmParameterException) new InvalidAlgorithmParameterException().initCause(me); } } private void unmarshalParams(Element curXPathElem) throws MarshalException { List list = new ArrayList(); while (curXPathElem != null) { String xPath = curXPathElem.getFirstChild().getNodeValue(); String filterVal = DOMUtils.getAttributeValue(curXPathElem, "Filter"); if (filterVal == null) { throw new MarshalException("filter cannot be null"); } XPathType.Filter filter = null; if (filterVal.equals("intersect")) { filter = XPathType.Filter.INTERSECT; } else if (filterVal.equals("subtract")) { filter = XPathType.Filter.SUBTRACT; } else if (filterVal.equals("union")) { filter = XPathType.Filter.UNION; } else { throw new MarshalException("Unknown XPathType filter type" + filterVal); } NamedNodeMap attributes = curXPathElem.getAttributes(); if (attributes != null) { int length = attributes.getLength(); Map namespaceMap = new HashMap(length); for (int i = 0; i < length; i++) { Attr attr = (Attr) attributes.item(i); String prefix = attr.getPrefix(); if (prefix != null && prefix.equals("xmlns")) { namespaceMap.put(attr.getLocalName(), attr.getValue()); } } list.add(new XPathType(xPath, filter, namespaceMap)); } else { list.add(new XPathType(xPath, filter)); } curXPathElem = DOMUtils.getNextSiblingElement(curXPathElem); } this.params = new XPathFilter2ParameterSpec(list); } public void marshalParams(XMLStructure parent, XMLCryptoContext context) throws MarshalException { super.marshalParams(parent, context); XPathFilter2ParameterSpec xp = (XPathFilter2ParameterSpec) getParameterSpec(); String prefix = DOMUtils.getNSPrefix(context, Transform.XPATH2); String qname = (prefix == null) ? "xmlns" : "xmlns:" + prefix; List list = xp.getXPathList(); for (int i = 0, size = list.size(); i < size; i++) { XPathType xpathType = (XPathType) list.get(i); Element elem = DOMUtils.createElement (ownerDoc, "XPath", Transform.XPATH2, prefix); elem.appendChild (ownerDoc.createTextNode(xpathType.getExpression())); DOMUtils.setAttribute (elem, "Filter", xpathType.getFilter().toString()); elem.setAttributeNS("http://www.w3.org/2000/xmlns/", qname, Transform.XPATH2); // add namespace attributes, if necessary Iterator it = xpathType.getNamespaceMap().entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); elem.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" + (String) entry.getKey(), (String) entry.getValue()); } transformElem.appendChild(elem); } } }