src/share/classes/com/sun/org/apache/xml/internal/security/transforms/implementations/TransformXPath2Filter.java
Print this page
@@ -1,33 +1,33 @@
/*
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-/*
- * Copyright 1999-2004 The Apache Software Foundation.
- *
- * Licensed 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
+/**
+ * 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.
- *
+ * 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 com.sun.org.apache.xml.internal.security.transforms.implementations;
-
-
import java.io.IOException;
+import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
@@ -40,80 +40,62 @@
import com.sun.org.apache.xml.internal.security.transforms.Transform;
import com.sun.org.apache.xml.internal.security.transforms.TransformSpi;
import com.sun.org.apache.xml.internal.security.transforms.TransformationException;
import com.sun.org.apache.xml.internal.security.transforms.Transforms;
import com.sun.org.apache.xml.internal.security.transforms.params.XPath2FilterContainer;
-import com.sun.org.apache.xml.internal.security.utils.CachedXPathAPIHolder;
-import com.sun.org.apache.xml.internal.security.utils.CachedXPathFuncHereAPI;
import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
+import com.sun.org.apache.xml.internal.security.utils.XPathAPI;
+import com.sun.org.apache.xml.internal.security.utils.XPathFactory;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* Implements the <I>XML Signature XPath Filter v2.0</I>
*
- * @author $Author: mullan $
* @see <A HREF="http://www.w3.org/TR/xmldsig-filter2/">XPath Filter v2.0 (TR)</A>
- * @see <a HREF="http://www.w3.org/Signature/Drafts/xmldsig-xfilter2/">XPath Filter v2.0 (editors copy)</a>
*/
public class TransformXPath2Filter extends TransformSpi {
- /** {@link java.util.logging} logging facility */
-// static java.util.logging.Logger log =
-// java.util.logging.Logger.getLogger(
-// TransformXPath2Filter.class.getName());
-
/** Field implementedTransformURI */
public static final String implementedTransformURI =
Transforms.TRANSFORM_XPATH2FILTER;
- //J-
- // contains the type of the filter
-
- // contains the node set
/**
* Method engineGetURI
*
* @inheritDoc
*/
protected String engineGetURI() {
return implementedTransformURI;
}
-
-
/**
* Method enginePerformTransform
* @inheritDoc
* @param input
*
* @throws TransformationException
*/
- protected XMLSignatureInput enginePerformTransform(XMLSignatureInput input, Transform _transformObject)
- throws TransformationException {
- CachedXPathAPIHolder.setDoc(_transformObject.getElement().getOwnerDocument());
+ protected XMLSignatureInput enginePerformTransform(
+ XMLSignatureInput input, OutputStream os, Transform transformObject
+ ) throws TransformationException {
try {
- List<NodeList> unionNodes=new ArrayList<NodeList>();
- List<NodeList> substractNodes=new ArrayList<NodeList>();
- List<NodeList> intersectNodes=new ArrayList<NodeList>();
-
- CachedXPathFuncHereAPI xPathFuncHereAPI =
- new CachedXPathFuncHereAPI(CachedXPathAPIHolder.getCachedXPathAPI());
-
-
- Element []xpathElements =XMLUtils.selectNodes(
- _transformObject.getElement().getFirstChild(),
+ List<NodeList> unionNodes = new ArrayList<NodeList>();
+ List<NodeList> subtractNodes = new ArrayList<NodeList>();
+ List<NodeList> intersectNodes = new ArrayList<NodeList>();
+
+ Element[] xpathElements =
+ XMLUtils.selectNodes(
+ transformObject.getElement().getFirstChild(),
XPath2FilterContainer.XPathFilter2NS,
- XPath2FilterContainer._TAG_XPATH2);
- int noOfSteps = xpathElements.length;
-
-
- if (noOfSteps == 0) {
+ XPath2FilterContainer._TAG_XPATH2
+ );
+ if (xpathElements.length == 0) {
Object exArgs[] = { Transforms.TRANSFORM_XPATH2FILTER, "XPath" };
throw new TransformationException("xml.WrongContent", exArgs);
}
@@ -122,36 +104,40 @@
inputDoc = XMLUtils.getOwnerDocument(input.getSubNode());
} else {
inputDoc = XMLUtils.getOwnerDocument(input.getNodeSet());
}
- for (int i = 0; i < noOfSteps; i++) {
- Element xpathElement =XMLUtils.selectNode(
- _transformObject.getElement().getFirstChild(),
- XPath2FilterContainer.XPathFilter2NS,
- XPath2FilterContainer._TAG_XPATH2,i);
+ for (int i = 0; i < xpathElements.length; i++) {
+ Element xpathElement = xpathElements[i];
+
XPath2FilterContainer xpathContainer =
- XPath2FilterContainer.newInstance(xpathElement,
- input.getSourceURI());
+ XPath2FilterContainer.newInstance(xpathElement, input.getSourceURI());
+
+ String str =
+ XMLUtils.getStrFromNode(xpathContainer.getXPathFilterTextNode());
+ XPathFactory xpathFactory = XPathFactory.newInstance();
+ XPathAPI xpathAPIInstance = xpathFactory.newXPathAPI();
- NodeList subtreeRoots = xPathFuncHereAPI.selectNodeList(inputDoc,
+ NodeList subtreeRoots =
+ xpathAPIInstance.selectNodeList(
+ inputDoc,
xpathContainer.getXPathFilterTextNode(),
- CachedXPathFuncHereAPI.getStrFromNode(xpathContainer.getXPathFilterTextNode()),
+ str,
xpathContainer.getElement());
if (xpathContainer.isIntersect()) {
intersectNodes.add(subtreeRoots);
} else if (xpathContainer.isSubtract()) {
- substractNodes.add(subtreeRoots);
+ subtractNodes.add(subtreeRoots);
} else if (xpathContainer.isUnion()) {
unionNodes.add(subtreeRoots);
}
}
-
- input.addNodeFilter(new XPath2NodeFilter(unionNodes, substractNodes,
- intersectNodes));
+ input.addNodeFilter(
+ new XPath2NodeFilter(unionNodes, subtractNodes, intersectNodes)
+ );
input.setNodeSet(true);
return input;
} catch (TransformerException ex) {
throw new TransformationException("empty", ex);
} catch (DOMException ex) {
@@ -171,91 +157,93 @@
}
}
}
class XPath2NodeFilter implements NodeFilter {
+
boolean hasUnionFilter;
- boolean hasSubstractFilter;
+ boolean hasSubtractFilter;
boolean hasIntersectFilter;
- XPath2NodeFilter(List<NodeList> unionNodes, List<NodeList> substractNodes,
- List<NodeList> intersectNodes) {
- hasUnionFilter=!unionNodes.isEmpty();
- this.unionNodes=convertNodeListToSet(unionNodes);
- hasSubstractFilter=!substractNodes.isEmpty();
- this.substractNodes=convertNodeListToSet(substractNodes);
- hasIntersectFilter=!intersectNodes.isEmpty();
- this.intersectNodes=convertNodeListToSet(intersectNodes);
- }
Set<Node> unionNodes;
- Set<Node> substractNodes;
+ Set<Node> subtractNodes;
Set<Node> intersectNodes;
+ int inSubtract = -1;
+ int inIntersect = -1;
+ int inUnion = -1;
+ XPath2NodeFilter(List<NodeList> unionNodes, List<NodeList> subtractNodes,
+ List<NodeList> intersectNodes) {
+ hasUnionFilter = !unionNodes.isEmpty();
+ this.unionNodes = convertNodeListToSet(unionNodes);
+ hasSubtractFilter = !subtractNodes.isEmpty();
+ this.subtractNodes = convertNodeListToSet(subtractNodes);
+ hasIntersectFilter = !intersectNodes.isEmpty();
+ this.intersectNodes = convertNodeListToSet(intersectNodes);
+ }
/**
* @see com.sun.org.apache.xml.internal.security.signature.NodeFilter#isNodeInclude(org.w3c.dom.Node)
*/
public int isNodeInclude(Node currentNode) {
- int result=1;
+ int result = 1;
- if (hasSubstractFilter && rooted(currentNode, substractNodes)) {
+ if (hasSubtractFilter && rooted(currentNode, subtractNodes)) {
result = -1;
} else if (hasIntersectFilter && !rooted(currentNode, intersectNodes)) {
result = 0;
}
//TODO OPTIMIZE
- if (result==1)
+ if (result == 1) {
return 1;
+ }
if (hasUnionFilter) {
if (rooted(currentNode, unionNodes)) {
return 1;
}
- result=0;
+ result = 0;
}
return result;
-
}
- int inSubstract=-1;
- int inIntersect=-1;
- int inUnion=-1;
+
public int isNodeIncludeDO(Node n, int level) {
- int result=1;
- if (hasSubstractFilter) {
- if ((inSubstract==-1) || (level<=inSubstract)) {
- if (inList(n, substractNodes)) {
- inSubstract=level;
+ int result = 1;
+ if (hasSubtractFilter) {
+ if ((inSubtract == -1) || (level <= inSubtract)) {
+ if (inList(n, subtractNodes)) {
+ inSubtract = level;
} else {
- inSubstract=-1;
+ inSubtract = -1;
}
}
- if (inSubstract!=-1){
- result=-1;
+ if (inSubtract != -1){
+ result = -1;
}
}
- if (result!=-1){
- if (hasIntersectFilter) {
- if ((inIntersect==-1) || (level<=inIntersect)) {
+ if (result != -1 && hasIntersectFilter
+ && ((inIntersect == -1) || (level <= inIntersect))) {
if (!inList(n, intersectNodes)) {
- inIntersect=-1;
- result=0;
+ inIntersect = -1;
+ result = 0;
} else {
- inIntersect=level;
- }
- }
+ inIntersect = level;
}
}
- if (level<=inUnion)
- inUnion=-1;
- if (result==1)
+ if (level <= inUnion) {
+ inUnion = -1;
+ }
+ if (result == 1) {
return 1;
+ }
if (hasUnionFilter) {
- if ((inUnion==-1) && inList(n, unionNodes)) {
- inUnion=level;
+ if ((inUnion == -1) && inList(n, unionNodes)) {
+ inUnion = level;
}
- if (inUnion!=-1)
+ if (inUnion != -1) {
return 1;
+ }
result=0;
}
return result;
}
@@ -265,20 +253,19 @@
* @param currentNode
* @param nodeList
*
* @return if rooted bye the rootnodes
*/
- static boolean rooted(Node currentNode, Set<Node> nodeList ) {
+ static boolean rooted(Node currentNode, Set<Node> nodeList) {
if (nodeList.isEmpty()) {
return false;
}
if (nodeList.contains(currentNode)) {
return true;
}
-
- for(Node rootNode : nodeList) {
- if (XMLUtils.isDescendantOrSelf(rootNode,currentNode)) {
+ for (Node rootNode : nodeList) {
+ if (XMLUtils.isDescendantOrSelf(rootNode, currentNode)) {
return true;
}
}
return false;
}
@@ -288,19 +275,19 @@
* @param currentNode
* @param nodeList
*
* @return if rooted bye the rootnodes
*/
- static boolean inList(Node currentNode, Set<Node> nodeList ) {
+ static boolean inList(Node currentNode, Set<Node> nodeList) {
return nodeList.contains(currentNode);
}
- private static Set<Node> convertNodeListToSet(List<NodeList> l){
- Set<Node> result=new HashSet<Node>();
-
+ private static Set<Node> convertNodeListToSet(List<NodeList> l) {
+ Set<Node> result = new HashSet<Node>();
for (NodeList rootNodes : l) {
int length = rootNodes.getLength();
+
for (int i = 0; i < length; i++) {
Node rootNode = rootNodes.item(i);
result.add(rootNode);
}
}