API Overview API Index Package Overview Direct link to this page
JDK 1.6
  org.jcp.xml.dsig.internal.dom. DOMXPathFilter2Transform View Javadoc
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);
        }
    }
}

Generated By: JavaOnTracks Doclet 0.1.4     ©Thibaut Colar