14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file 44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information 54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file 64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License. 84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at 94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software 134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and 164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License. 174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id: DTMAxisIteratorBase.java 468653 2006-10-28 07:07:05Z minchau $ 204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xml.dtm.ref; 224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.dtm.DTMAxisIterator; 244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/** 264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This class serves as a default base for implementations of mutable 274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * DTMAxisIterators. 284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic abstract class DTMAxisIteratorBase implements DTMAxisIterator 304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{ 314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** The position of the last node within the iteration, as defined by XPath. 334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Note that this is _not_ the node's handle within the DTM. Also, don't 344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * confuse it with the current (most recently returned) position. 354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected int _last = -1; 374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** The position of the current node within the iteration, as defined by XPath. 394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Note that this is _not_ the node's handle within the DTM! 404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected int _position = 0; 424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** The position of the marked node within the iteration; 444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * a saved itaration state that we may want to come back to. 454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Note that only one mark is maintained; there is no stack. 464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected int _markedNode; 484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** The handle to the start, or root, of the iteration. 504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Set this to END to construct an empty iterator. 514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected int _startNode = DTMAxisIterator.END; 534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** True if the start node should be considered part of the iteration. 554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * False will cause it to be skipped. 564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected boolean _includeSelf = false; 584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** True if this iteration can be restarted. False otherwise (eg, if 604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * we are iterating over a stream that can not be re-scanned, or if 614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * the iterator was produced by cloning another iterator.) 624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected boolean _isRestartable = true; 644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Get start to END should 'close' the iterator, 674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * i.e. subsequent call to next() should return END. 684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return The root node of the iteration. 704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public int getStartNode() 724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return _startNode; 744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return A DTMAxisIterator which has been reset to the start node, 784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * which may or may not be the same as this iterator. 794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * */ 804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public DTMAxisIterator reset() 814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson final boolean temp = _isRestartable; 844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson _isRestartable = true; 864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson setStartNode(_startNode); 884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson _isRestartable = temp; 904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return this; 924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Set the flag to include the start node in the iteration. 964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return This default method returns just returns this DTMAxisIterator, 994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * after setting the flag. 1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * (Returning "this" permits C++-style chaining of 1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * method calls into a single expression.) 1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public DTMAxisIterator includeSelf() 1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson _includeSelf = true; 1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return this; 1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** Returns the position of the last node within the iteration, as 1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * defined by XPath. In a forward iterator, I believe this equals the number of nodes which this 1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * iterator will yield. In a reverse iterator, I believe it should return 1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1 (since the "last" is the first produced.) 1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This may be an expensive operation when called the first time, since 1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * it may have to iterate through a large part of the document to produce 1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * its answer. 1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return The number of nodes in this iterator (forward) or 1 (reverse). 1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public int getLast() 1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (_last == -1) // Not previously established 1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // Note that we're doing both setMark() -- which saves _currentChild 1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // -- and explicitly saving our position counter (number of nodes 1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // yielded so far). 1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // 1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // %REVIEW% Should position also be saved by setMark()? 1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // (It wasn't in the XSLTC version, but I don't understand why not.) 1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson final int temp = _position; // Save state 1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson setMark(); 1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson reset(); // Count the nodes found by this iterator 1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson do 1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson _last++; 1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson while (next() != END); 1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson gotoMark(); // Restore saved state 1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson _position = temp; 1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return _last; 1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return The position of the current node within the set, as defined by 1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * XPath. Note that this is one-based, not zero-based. 1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public int getPosition() 1564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return _position == 0 ? 1 : _position; 1584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return true if this iterator has a reversed axis, else false 1624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public boolean isReverse() 1644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return false; 1664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Returns a deep copy of this iterator. Cloned iterators may not be 1704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * restartable. The iterator being cloned may or may not become 1714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * non-restartable as a side effect of this operation. 1724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return a deep copy of this iterator. 1744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public DTMAxisIterator cloneIterator() 1764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson try 1794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson final DTMAxisIteratorBase clone = (DTMAxisIteratorBase) super.clone(); 1814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson clone._isRestartable = false; 1834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // return clone.reset(); 1854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return clone; 1864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson catch (CloneNotSupportedException e) 1884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throw new org.apache.xml.utils.WrappedRuntimeException(e); 1904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Do any final cleanup that is required before returning the node that was 1954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * passed in, and then return it. The intended use is 1964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <br /> 1974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <code>return returnNode(node);</code> 1984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * %REVIEW% If we're calling it purely for side effects, should we really 2004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * be bothering with a return value? Something like 2014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <br /> 2024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <code> accept(node); return node; </code> 2034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <br /> 2044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * would probably optimize just about as well and avoid questions 2054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * about whether what's returned could ever be different from what's 2064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * passed in. 2074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 2084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param node Node handle which iteration is about to yield. 2094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 2104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return The node handle passed in. */ 2114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected final int returnNode(final int node) 2124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson _position++; 2144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return node; 2164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 2194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Reset the position to zero. NOTE that this does not change the iteration 2204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * state, only the position number associated with that state. 2214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 2224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * %REVIEW% Document when this would be used? 2234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 2244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return This instance. 2254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 2264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected final DTMAxisIterator resetPosition() 2274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson _position = 0; 2304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return this; 2324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 2354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Returns true if all the nodes in the iteration well be returned in document 2364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * order. 2374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 2384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return true as a default. 2394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 2404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public boolean isDocOrdered() 2414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return true; 2434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 2464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Returns the axis being iterated, if it is known. 2474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 2484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return Axis.CHILD, etc., or -1 if the axis is not known or is of multiple 2494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * types. 2504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 2514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public int getAxis() 2524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return -1; 2544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void setRestartable(boolean isRestartable) { 2574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson _isRestartable = isRestartable; 2584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 2614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Return the node at the given position. 2624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 2634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param position The position 2644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return The node at the given position. 2654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 2664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public int getNodeByPosition(int position) 2674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (position > 0) { 2694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson final int pos = isReverse() ? getLast() - position + 1 2704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson : position; 2714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int node; 2724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson while ((node = next()) != DTMAxisIterator.END) { 2734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (pos == getPosition()) { 2744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return node; 2754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return END; 2794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson} 282