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 56 class NodeSetIterator<E> implements Iterator<E> { 57 int currentIndex; 58 Class<E> elementType; 59 NodeSetIterator(Class<E> elementType) { 60 this.elementType = elementType; 61 } 62 public boolean hasNext() { 63 if (type != XPathResultType.NODE) { 64 throw new UnsupportedOperationException("Incorrect type: result" 65 + "type requested: " + type + ", but assumed" 66 + "Node."); 67 } 68 if (nodeList != null) { 69 return currentIndex < nodeList.getLength(); 70 } 71 72 return false; 73 } 74 75 public E next() { 76 if (nodeList != null && nodeList.getLength() > 0) { 77 return elementType.cast(nodeList.item(currentIndex++)); 78 } 79 return null; 80 } 81 } 82 83 @Override 84 public int size() { 85 if (nodeList != null) { 86 return nodeList.getLength(); 87 } 88 return 0; 89 } 90 91 @Override 92 public Node get(int index) throws XPathException { 93 if (index <0 || index >= size()) { 94 throw new IndexOutOfBoundsException("Index " + index + " is out of bounds"); 95 } 96 if (nodeList != null) { 97 return (Node)nodeList.item(index); 98 } 99 return null; 100 } 101 }