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