jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java
changeset 25859 3317bb8137f4
parent 24970 094bfaa699c3
child 27747 3a271dc8b758
equal deleted inserted replaced
25858:836adbf7a2cd 25859:3317bb8137f4
       
     1 /*
       
     2  * reserved comment block
       
     3  * DO NOT REMOVE OR ALTER!
       
     4  */
       
     5 /**
       
     6  * Licensed to the Apache Software Foundation (ASF) under one
       
     7  * or more contributor license agreements. See the NOTICE file
       
     8  * distributed with this work for additional information
       
     9  * regarding copyright ownership. The ASF licenses this file
       
    10  * to you under the Apache License, Version 2.0 (the
       
    11  * "License"); you may not use this file except in compliance
       
    12  * with the License. You may obtain a copy of the License at
       
    13  *
       
    14  * http://www.apache.org/licenses/LICENSE-2.0
       
    15  *
       
    16  * Unless required by applicable law or agreed to in writing,
       
    17  * software distributed under the License is distributed on an
       
    18  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       
    19  * KIND, either express or implied. See the License for the
       
    20  * specific language governing permissions and limitations
       
    21  * under the License.
       
    22  */
       
    23 /*
       
    24  * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
       
    25  */
       
    26 /*
       
    27  * $Id: ApacheNodeSetData.java 1203890 2011-11-18 22:47:56Z mullan $
       
    28  */
       
    29 package org.jcp.xml.dsig.internal.dom;
       
    30 
       
    31 import java.util.Collections;
       
    32 import java.util.Iterator;
       
    33 import java.util.LinkedHashSet;
       
    34 import java.util.List;
       
    35 import java.util.Set;
       
    36 import javax.xml.crypto.NodeSetData;
       
    37 import org.w3c.dom.Node;
       
    38 import com.sun.org.apache.xml.internal.security.signature.NodeFilter;
       
    39 import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
       
    40 import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
       
    41 
       
    42 public class ApacheNodeSetData implements ApacheData, NodeSetData {
       
    43 
       
    44     private XMLSignatureInput xi;
       
    45 
       
    46     public ApacheNodeSetData(XMLSignatureInput xi) {
       
    47         this.xi = xi;
       
    48     }
       
    49 
       
    50     public Iterator<Node> iterator() {
       
    51         // If nodefilters are set, must execute them first to create node-set
       
    52         if (xi.getNodeFilters() != null && !xi.getNodeFilters().isEmpty()) {
       
    53             return Collections.unmodifiableSet
       
    54                 (getNodeSet(xi.getNodeFilters())).iterator();
       
    55         }
       
    56         try {
       
    57             return Collections.unmodifiableSet(xi.getNodeSet()).iterator();
       
    58         } catch (Exception e) {
       
    59             // should not occur
       
    60             throw new RuntimeException
       
    61                 ("unrecoverable error retrieving nodeset", e);
       
    62         }
       
    63     }
       
    64 
       
    65     public XMLSignatureInput getXMLSignatureInput() {
       
    66         return xi;
       
    67     }
       
    68 
       
    69     private Set<Node> getNodeSet(List<NodeFilter> nodeFilters) {
       
    70         if (xi.isNeedsToBeExpanded()) {
       
    71             XMLUtils.circumventBug2650
       
    72                 (XMLUtils.getOwnerDocument(xi.getSubNode()));
       
    73         }
       
    74 
       
    75         Set<Node> inputSet = new LinkedHashSet<Node>();
       
    76         XMLUtils.getSet(xi.getSubNode(), inputSet,
       
    77                         null, !xi.isExcludeComments());
       
    78         Set<Node> nodeSet = new LinkedHashSet<Node>();
       
    79         for (Node currentNode : inputSet) {
       
    80             Iterator<NodeFilter> it = nodeFilters.iterator();
       
    81             boolean skipNode = false;
       
    82             while (it.hasNext() && !skipNode) {
       
    83                 NodeFilter nf = it.next();
       
    84                 if (nf.isNodeInclude(currentNode) != 1) {
       
    85                     skipNode = true;
       
    86                 }
       
    87             }
       
    88             if (!skipNode) {
       
    89                 nodeSet.add(currentNode);
       
    90             }
       
    91         }
       
    92         return nodeSet;
       
    93     }
       
    94 }