1 /* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.org.apache.xpath.internal.jaxp; 27 28 import java.util.Iterator; 29 import javax.xml.xpath.XPathException; 30 import javax.xml.xpath.XPathNodes; 31 import javax.xml.xpath.XPathEvaluationResult.XPathResultType; 32 import org.w3c.dom.Node; 33 import org.w3c.dom.NodeList; 34 35 /** 36 * This class implements XPathNodes that represents a set of nodes selected by 37 * evaluating an expression. 38 */ 39 public class XPathNodesImpl implements XPathNodes { 40 XPathResultType type; 41 Class<Node> elementType; 42 NodeList nodeList = null; 43 44 public XPathNodesImpl(NodeList nodeList, XPathResultType type, Class<Node> elementType) { 45 this.nodeList = nodeList; 46 this.type = type; 47 this.elementType = elementType; 48 } 49 50 @Override 51 public Iterator<Node> iterator() { 52 return new NodeSetIterator<>(elementType); 53 } 54 55 class NodeSetIterator<E> implements Iterator<E> { 56 int currentIndex; 57 Class<E> elementType; 58 NodeSetIterator(Class<E> elementType) { 59 this.elementType = elementType; 60 } 61 public boolean hasNext() { 62 if (type != XPathResultType.NODE) { 63 throw new UnsupportedOperationException("Incorrect type: result" 64 + "type requested: " + type + ", but assumed" 65 + "Node."); 66 } 67 if (nodeList != null) { 68 return currentIndex < nodeList.getLength(); 69 } 70 71 return false; 72 } 73 74 public E next() { 75 if (nodeList != null && nodeList.getLength() > 0) { 76 return elementType.cast(nodeList.item(currentIndex++)); 77 } 78 return null; 79 } 80 } 81 82 @Override 83 public int size() { 84 if (nodeList != null) { 85 return nodeList.getLength(); 86 } 87 return 0; 88 } 89 90 @Override 91 public Node get(int index) throws XPathException { 92 if (index <0 || index >= size()) { 93 throw new IndexOutOfBoundsException("Index " + index + " is out of bounds"); 94 } 95 if (nodeList != null) { 96 return nodeList.item(index); 97 } 98 return null; 99 } 100 }