19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: DTMDefaultBaseIterators.java 468653 2006-10-28 07:07:05Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.dtm.ref;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.*;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Source;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLStringFactory;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.res.XMLErrorResources;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.res.XMLMessages;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class implements the traversers for DTMDefaultBase.
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic abstract class DTMDefaultBaseIterators extends DTMDefaultBaseTraversers
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a DTMDefaultBaseTraversers object from a DOM node.
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mgr The DTMManager who owns this DTM.
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source The object that is used to specify the construction source.
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtmIdentity The DTM identity ID for this DTM.
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whiteSpaceFilter The white space filter for this DTM, which may
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                         be null.
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xstringfactory The factory to use for creating XMLStrings.
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param doIndexing true if the caller considers it worth it to use
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   indexing schemes.
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMDefaultBaseIterators(DTMManager mgr, Source source,
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 int dtmIdentity,
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 DTMWSFilter whiteSpaceFilter,
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 XMLStringFactory xstringfactory,
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 boolean doIndexing)
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super(mgr, source, dtmIdentity, whiteSpaceFilter,
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xstringfactory, doIndexing);
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a DTMDefaultBaseTraversers object from a DOM node.
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mgr The DTMManager who owns this DTM.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source The object that is used to specify the construction source.
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtmIdentity The DTM identity ID for this DTM.
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whiteSpaceFilter The white space filter for this DTM, which may
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                         be null.
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xstringfactory The factory to use for creating XMLStrings.
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param doIndexing true if the caller considers it worth it to use
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   indexing schemes.
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param blocksize The block size of the DTM.
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param usePrevsib true if we want to build the previous sibling node array.
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param newNameTable true if we want to use a new ExpandedNameTable for this DTM.
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMDefaultBaseIterators(DTMManager mgr, Source source,
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 int dtmIdentity,
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 DTMWSFilter whiteSpaceFilter,
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 XMLStringFactory xstringfactory,
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 boolean doIndexing,
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 int blocksize,
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 boolean usePrevsib,
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 boolean newNameTable)
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super(mgr, source, dtmIdentity, whiteSpaceFilter,
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xstringfactory, doIndexing, blocksize, usePrevsib, newNameTable);
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an iterator that can navigate over an XPath Axis, predicated by
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the extended type ID.
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Returns an iterator that must be initialized
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with a start node (using iterator.setStartNode()).
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param axis One of Axes.ANCESTORORSELF, etc.
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param type An extended type ID.
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A DTMAxisIterator, or null if the given axis isn't supported.
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMAxisIterator getTypedAxisIterator(int axis, int type)
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTMAxisIterator iterator = null;
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /* This causes an error when using patterns for elements that
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       do not exist in the DOM (translet types which do not correspond
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       to a DOM type are mapped to the DOM.ELEMENT type).
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    */
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //        if (type == NO_TYPE) {
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //            return(EMPTYITERATOR);
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //        }
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //        else if (type == ELEMENT) {
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //            iterator = new FilterIterator(getAxisIterator(axis),
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //                                          getElementFilter());
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //        }
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //        else
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      switch (axis)
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.SELF :
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = new TypedSingletonIterator(type);
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.CHILD :
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = new TypedChildrenIterator(type);
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.PARENT :
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (new ParentIterator().setNodeType(type));
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.ANCESTOR :
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (new TypedAncestorIterator(type));
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.ANCESTORORSELF :
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return ((new TypedAncestorIterator(type)).includeSelf());
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.ATTRIBUTE :
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (new TypedAttributeIterator(type));
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.DESCENDANT :
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = new TypedDescendantIterator(type);
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.DESCENDANTORSELF :
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = (new TypedDescendantIterator(type)).includeSelf();
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.FOLLOWING :
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = new TypedFollowingIterator(type);
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.PRECEDING :
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = new TypedPrecedingIterator(type);
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.FOLLOWINGSIBLING :
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = new TypedFollowingSiblingIterator(type);
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.PRECEDINGSIBLING :
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = new TypedPrecedingSiblingIterator(type);
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.NAMESPACE :
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = new TypedNamespaceIterator(type);
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case Axis.ROOT :
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        iterator = new TypedRootIterator(type);
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      default :
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new DTMException(XMLMessages.createXMLMessage(
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            XMLErrorResources.ER_TYPED_ITERATOR_AXIS_NOT_IMPLEMENTED,
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            new Object[]{Axis.getNames(axis)}));
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //"Error: typed iterator for axis "
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               //+ Axis.names[axis] + "not implemented");
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (iterator);
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This is a shortcut to the iterators that implement the
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * XPath axes.
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Returns a bare-bones iterator that must be initialized
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with a start node (using iterator.setStartNode()).
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param axis One of Axes.ANCESTORORSELF, etc.
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A DTMAxisIterator, or null if the given axis isn't supported.
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMAxisIterator getAxisIterator(final int axis)
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTMAxisIterator iterator = null;
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    switch (axis)
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.SELF :
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = new SingletonIterator();
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.CHILD :
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = new ChildrenIterator();
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.PARENT :
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (new ParentIterator());
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.ANCESTOR :
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (new AncestorIterator());
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.ANCESTORORSELF :
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return ((new AncestorIterator()).includeSelf());
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.ATTRIBUTE :
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (new AttributeIterator());
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.DESCENDANT :
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = new DescendantIterator();
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.DESCENDANTORSELF :
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = (new DescendantIterator()).includeSelf();
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.FOLLOWING :
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = new FollowingIterator();
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.PRECEDING :
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = new PrecedingIterator();
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.FOLLOWINGSIBLING :
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = new FollowingSiblingIterator();
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.PRECEDINGSIBLING :
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = new PrecedingSiblingIterator();
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.NAMESPACE :
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = new NamespaceIterator();
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Axis.ROOT :
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      iterator = new RootIterator();
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    default :
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new DTMException(XMLMessages.createXMLMessage(
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XMLErrorResources.ER_ITERATOR_AXIS_NOT_IMPLEMENTED,
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        new Object[]{Axis.getNames(axis)}));
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //"Error: iterator for axis '" + Axis.names[axis]
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                             //+ "' not implemented");
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (iterator);
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Abstract superclass defining behaviors shared by all DTMDefault's
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * internal implementations of DTMAxisIterator. Subclass this (and
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * override, if necessary) to implement the specifics of an
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * individual axis iterator.
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Currently there isn't a lot here
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract class InternalAxisIteratorBase extends DTMAxisIteratorBase
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW% We could opt to share _nodeType and setNodeType() as
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // well, and simply ignore them in iterators which don't use them.
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // But Scott's worried about the overhead involved in cloning
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // these, and wants them to have as few fields as possible. Note
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // that we can't create a TypedInternalAxisIteratorBase because
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // those are often based on the untyped versions and Java doesn't
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // support multiple inheritance. <sigh/>
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Current iteration location. Usually this is the last location
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * returned (starting point for the next() search); for single-node
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * iterators it may instead be initialized to point to that single node.
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int _currentNode;
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Remembers the current node for the next call to gotoMark().
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * %REVIEW% Should this save _position too?
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setMark()
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _markedNode = _currentNode;
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Restores the current node remembered by setMark().
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * %REVEIW% Should this restore _position too?
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void gotoMark()
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = _markedNode;
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of InternalAxisIteratorBase
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns all immediate children of a given node
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class ChildrenIterator extends InternalAxisIteratorBase
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Setting start to END should 'close' the iterator,
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If the iterator is not restartable, this has no effect.
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * %REVIEW% Should it return/throw something in that case,
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * or set current node to END, to indicate request-not-honored?
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = (node == DTM.NULL) ? DTM.NULL
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          : _firstch(makeNodeIdentity(node));
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END if no more
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * are available.
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_currentNode != NULL) {
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int node = _currentNode;
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = _nextsib(node);
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return returnNode(makeNodeHandle(node));
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return END;
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of ChildrenIterator
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns the parent of a given node. Note that
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this delivers only a single node; if you want all the ancestors,
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * see AncestorIterator.
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class ParentIterator extends InternalAxisIteratorBase
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private int _nodeType = -1;
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = getParent(node);
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set the node type of the parent that we're looking for.
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Note that this does _not_ mean "find the nearest ancestor of
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * this type", but "yield the parent if it is of this type".
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type extended type ID.
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return ParentIterator configured with the type filter set.
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setNodeType(final int type)
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = type;
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration. In this case, we return
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * only the immediate parent, _if_ it matches the requested nodeType.
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int result = _currentNode;
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_nodeType >= DTM.NTYPES) {
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (_nodeType != getExpandedTypeID(_currentNode)) {
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          result = END;
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else if (_nodeType != NULL) {
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (_nodeType != getNodeType(_currentNode)) {
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          result = END;
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = END;
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(result);
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of ParentIterator
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns children of a given type for a given node.
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The functionality chould be achieved by putting a filter on top
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of a basic child iterator, but a specialised iterator is used
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for efficiency (both speed and size of translet).
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class TypedChildrenIterator extends InternalAxisIteratorBase
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedChildrenIterator
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nodeType The extended type ID being requested.
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedChildrenIterator(int nodeType)
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = nodeType;
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = (node == DTM.NULL)
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                   ? DTM.NULL
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                   : _firstch(makeNodeIdentity(_startNode));
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int eType;
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _currentNode;
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nodeType = _nodeType;
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (nodeType >= DTM.NTYPES) {
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while (node != DTM.NULL && _exptype(node) != nodeType) {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node = _nextsib(node);
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while (node != DTM.NULL) {
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          eType = _exptype(node);
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (eType < DTM.NTYPES) {
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (eType == nodeType) {
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              break;
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else if (m_expandedNameTable.getType(eType) == nodeType) {
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node = _nextsib(node);
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTM.NULL) {
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = DTM.NULL;
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return DTM.NULL;
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = _nextsib(node);
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return returnNode(makeNodeHandle(node));
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedChildrenIterator
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns children within a given namespace for a
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * given node. The functionality chould be achieved by putting a
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * filter on top of a basic child iterator, but a specialised
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator is used for efficiency (both speed and size of translet).
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class NamespaceChildrenIterator
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          extends InternalAxisIteratorBase
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID being requested. */
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nsType;
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor NamespaceChildrenIterator
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type The extended type ID being requested.
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public NamespaceChildrenIterator(final int type)
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nsType = type;
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = (node == DTM.NULL) ? DTM.NULL : NOTPROCESSED;
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_currentNode != DTM.NULL) {
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int node = (NOTPROCESSED == _currentNode)
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                  ? _firstch(makeNodeIdentity(_startNode))
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                  : _nextsib(_currentNode);
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             node != END;
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             node = _nextsib(node)) {
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (m_expandedNameTable.getNamespaceID(_exptype(node)) == _nsType) {
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            _currentNode = node;
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return returnNode(node);
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return END;
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of NamespaceChildrenIterator
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns the namespace nodes as defined by the XPath data model
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for a given node.
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class NamespaceIterator
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          extends InternalAxisIteratorBase
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor NamespaceAttributeIterator
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public NamespaceIterator()
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      super();
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = getFirstNamespaceNode(node, true);
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _currentNode;
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (DTM.NULL != node)
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = getNextNamespaceNode(_startNode, node, true);
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(node);
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of NamespaceIterator
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns the namespace nodes as defined by the XPath data model
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for a given node, filtered by extended type ID.
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class TypedNamespaceIterator extends NamespaceIterator
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedNamespaceIterator
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nodeType The extended type ID being requested.
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedNamespaceIterator(int nodeType)
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      super();
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = nodeType;
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	int node;
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (node = _currentNode;
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           node != END;
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           node = getNextNamespaceNode(_startNode, node, true)) {
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (getExpandedTypeID(node) == _nodeType
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || getNodeType(node) == _nodeType
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || getNamespaceType(node) == _nodeType) {
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          _currentNode = node;
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return returnNode(node);
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (_currentNode =END);
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedNamespaceIterator
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns the the root node as defined by the XPath data model
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for a given node.
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class RootIterator
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          extends InternalAxisIteratorBase
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor RootIterator
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public RootIterator()
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      super();
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = getDocumentRoot(node);
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = NULL;
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(_startNode == _currentNode)
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = _startNode;
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(_startNode);
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of RootIterator
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns the namespace nodes as defined by the XPath data model
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for a given node, filtered by extended type ID.
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class TypedRootIterator extends RootIterator
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedRootIterator
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nodeType The extended type ID being requested.
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedRootIterator(int nodeType)
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      super();
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = nodeType;
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	if(_startNode == _currentNode)
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nodeType = _nodeType;
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _startNode;
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int expType = getExpandedTypeID(node);
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = node;
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (nodeType >= DTM.NTYPES) {
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeType == expType) {
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return returnNode(node);
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (expType < DTM.NTYPES) {
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (expType == nodeType) {
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return returnNode(node);
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (m_expandedNameTable.getType(expType) == nodeType) {
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return returnNode(node);
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return END;
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedRootIterator
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns attributes within a given namespace for a node.
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class NamespaceAttributeIterator
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          extends InternalAxisIteratorBase
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID being requested. */
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nsType;
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor NamespaceAttributeIterator
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nsType The extended type ID being requested.
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public NamespaceAttributeIterator(int nsType)
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      super();
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nsType = nsType;
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = getFirstNamespaceNode(node, false);
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _currentNode;
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (DTM.NULL != node)
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = getNextNamespaceNode(_startNode, node, false);
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(node);
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of NamespaceAttributeIterator
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns all siblings of a given node.
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class FollowingSiblingIterator extends InternalAxisIteratorBase
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = makeNodeIdentity(node);
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = (_currentNode == DTM.NULL) ? DTM.NULL
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                                : _nextsib(_currentNode);
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(makeNodeHandle(_currentNode));
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of FollowingSiblingIterator
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns all following siblings of a given node.
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class TypedFollowingSiblingIterator
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          extends FollowingSiblingIterator
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedFollowingSiblingIterator
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type The extended type ID being requested.
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedFollowingSiblingIterator(int type)
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = type;
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_currentNode == DTM.NULL) {
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return DTM.NULL;
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _currentNode;
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int eType;
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nodeType = _nodeType;
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (nodeType >= DTM.NTYPES) {
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        do {
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node = _nextsib(node);
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } while (node != DTM.NULL && _exptype(node) != nodeType);
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while ((node = _nextsib(node)) != DTM.NULL) {
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          eType = _exptype(node);
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (eType < DTM.NTYPES) {
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (eType == nodeType) {
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              break;
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else if (m_expandedNameTable.getType(eType) == nodeType) {
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = node;
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (_currentNode == DTM.NULL)
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      ? DTM.NULL
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      : returnNode(makeNodeHandle(_currentNode));
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedFollowingSiblingIterator
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns attribute nodes (of what nodes?)
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class AttributeIterator extends InternalAxisIteratorBase
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // assumes caller will pass element nodes
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = getFirstAttributeIdentity(makeNodeIdentity(node));
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      final int node = _currentNode;
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node != NULL) {
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = getNextAttributeIdentity(node);
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return returnNode(makeNodeHandle(node));
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return NULL;
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of AttributeIterator
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns attribute nodes of a given type
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class TypedAttributeIterator extends InternalAxisIteratorBase
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedAttributeIterator
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nodeType The extended type ID that is requested.
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedAttributeIterator(int nodeType)
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = nodeType;
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // assumes caller will pass element nodes
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = getTypedAttribute(node, _nodeType);
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      final int node = _currentNode;
10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // singleton iterator, since there can only be one attribute of
10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // a given type.
10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = NULL;
10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(node);
10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedAttributeIterator
10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns preceding siblings of a given node
10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class PrecedingSiblingIterator extends InternalAxisIteratorBase
10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The node identity of _startNode for this iterator
10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int _startNodeID;
10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * True if this iterator has a reversed axis.
10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true.
10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean isReverse()
10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return true;
10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = _startNodeID = makeNodeIdentity(node);
11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(node == NULL)
11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          _currentNode = node;
11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return resetPosition();
11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int type = m_expandedNameTable.getType(_exptype(node));
11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(ExpandedNameTable.ATTRIBUTE == type
11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           || ExpandedNameTable.NAMESPACE == type )
11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          _currentNode = node;
11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Be careful to handle the Document node properly
11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          _currentNode = _parent(node);
11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if(NULL!=_currentNode)
11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            _currentNode = _firstch(_currentNode);
11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            _currentNode = node;
11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_currentNode == _startNodeID || _currentNode == DTM.NULL)
11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int node = _currentNode;
11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = _nextsib(node);
11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return returnNode(makeNodeHandle(node));
11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of PrecedingSiblingIterator
11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns preceding siblings of a given type for
11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a given node
11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class TypedPrecedingSiblingIterator
11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          extends PrecedingSiblingIterator
11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedPrecedingSiblingIterator
11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type The extended type ID being requested.
11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedPrecedingSiblingIterator(int type)
11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = type;
11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _currentNode;
11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int expType;
11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nodeType = _nodeType;
12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int startID = _startNodeID;
12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (nodeType >= DTM.NTYPES) {
12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while (node != NULL && node != startID && _exptype(node) != nodeType) {
12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node = _nextsib(node);
12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while (node != NULL && node != startID) {
12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          expType = _exptype(node);
12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (expType < DTM.NTYPES) {
12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (expType == nodeType) {
12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              break;
12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else {
12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (m_expandedNameTable.getType(expType) == nodeType) {
12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              break;
12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node = _nextsib(node);
12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTM.NULL || node == _startNodeID) {
12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = NULL;
12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = _nextsib(node);
12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return returnNode(makeNodeHandle(node));
12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedPrecedingSiblingIterator
12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns preceding nodes of a given node.
12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This includes the node set {root+1, start-1}, but excludes
12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * all ancestors, attributes, and namespace nodes.
12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class PrecedingIterator extends InternalAxisIteratorBase
12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The max ancestors, but it can grow... */
12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _maxAncestors = 8;
12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The stack of start node + ancestors up to the root of the tree,
12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *  which we must avoid.
12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int[] _stack = new int[_maxAncestors];
12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** (not sure yet... -sb) */
12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int _sp, _oldsp;
12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int _markedsp, _markedNode, _markedDescendant;
12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /* _currentNode precedes candidates.  This is the identity, not the handle! */
12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * True if this iterator has a reversed axis.
12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true since this iterator is a reversed axis.
12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean isReverse()
12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return true;
12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns a deep copy of this iterator.   The cloned iterator is not reset.
12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return a deep copy of this iterator.
12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator cloneIterator()
12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _isRestartable = false;
12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final PrecedingIterator clone = (PrecedingIterator) super.clone();
12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int[] stackCopy = new int[_stack.length];
12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.arraycopy(_stack, 0, stackCopy, 0, _stack.length);
12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        clone._stack = stackCopy;
12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // return clone.reset();
12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return clone;
12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch (CloneNotSupportedException e)
12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new DTMException(XMLMessages.createXMLMessage(XMLErrorResources.ER_ITERATOR_CLONE_NOT_SUPPORTED, null)); //"Iterator clone not supported.");
12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = makeNodeIdentity(node);
13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // iterator is not a clone
13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int parent, index;
13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       if (_type(node) == DTM.ATTRIBUTE_NODE)
13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = _parent(node);
13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _stack[index = 0] = node;
13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		parent=node;
13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		while ((parent = _parent(parent)) != NULL)
13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		{
13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			if (++index == _stack.length)
13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			{
13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				final int[] stack = new int[index + 4];
13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				System.arraycopy(_stack, 0, stack, 0, index);
13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				_stack = stack;
13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			}
13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			_stack[index] = parent;
13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(index>0)
13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	        --index; // Pop actual root node (if not start) back off the stack
13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode=_stack[index]; // Last parent before root node
13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _oldsp = _sp = index;
13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	// Bugzilla 8324: We were forgetting to skip Attrs and NS nodes.
13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	// Also recoded the loop controls for clarity and to flatten out
13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	// the tail-recursion.
13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   		for(++_currentNode;
13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   			_sp>=0;
13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   			++_currentNode)
13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   		{
13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   			if(_currentNode < _stack[_sp])
13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   			{
13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   				if(_type(_currentNode) != ATTRIBUTE_NODE &&
13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   					_type(_currentNode) != NAMESPACE_NODE)
13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   					return returnNode(makeNodeHandle(_currentNode));
13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   			}
13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   			else
13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   				--_sp;
13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   		}
13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   		return NULL;
13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // redefine DTMAxisIteratorBase's reset
13719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Resets the iterator to the last start node.
13749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
13759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator, which may or may not be the same as this
13769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         iterator.
13779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator reset()
13799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _sp = _oldsp;
13829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return resetPosition();
13849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setMark() {
13879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _markedsp = _sp;
13889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _markedNode = _currentNode;
13899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _markedDescendant = _stack[0];
13909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void gotoMark() {
13939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _sp = _markedsp;
13949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = _markedNode;
13959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of PrecedingIterator
13979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns preceding nodes of agiven type for a
14009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * given node. This includes the node set {root+1, start-1}, but
14019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * excludes all ancestors.
14029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
14039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class TypedPrecedingIterator extends PrecedingIterator
14049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
14059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
14079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
14089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedPrecedingIterator
14119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type The extended type ID being requested.
14149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedPrecedingIterator(int type)
14169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = type;
14189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
14229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
14249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
14269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _currentNode;
14289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nodeType = _nodeType;
14299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (nodeType >= DTM.NTYPES) {
14319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while (true) {
14329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node = node + 1;
14339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (_sp < 0) {
14359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            node = NULL;
14369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
14379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else if (node >= _stack[_sp]) {
14389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (--_sp < 0) {
14399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              node = NULL;
14409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              break;
14419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else if (_exptype(node) == nodeType) {
14439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
14449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
14459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
14479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int expType;
14489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while (true) {
14509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node = node + 1;
14519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (_sp < 0) {
14539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            node = NULL;
14549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
14559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else if (node >= _stack[_sp]) {
14569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (--_sp < 0) {
14579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              node = NULL;
14589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              break;
14599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else {
14619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            expType = _exptype(node);
14629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (expType < DTM.NTYPES) {
14639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              if (expType == nodeType) {
14649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                break;
14659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
14669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
14679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              if (m_expandedNameTable.getType(expType) == nodeType) {
14689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                break;
14699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
14709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
14729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = node;
14769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (node == NULL) ? NULL : returnNode(makeNodeHandle(node));
14789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedPrecedingIterator
14809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
14829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns following nodes of for a given node.
14839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
14849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class FollowingIterator extends InternalAxisIteratorBase
14859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
14869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTMAxisTraverser m_traverser; // easier for now
14879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public FollowingIterator()
14899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_traverser = getAxisTraverser(Axis.FOLLOWING);
14919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
14959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
14969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
14989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
15009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
15029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
15049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
15059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
15069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
15079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
15089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
15099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // ?? -sb
15119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // find rightmost descendant (or self)
15129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // int current;
15139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // while ((node = getLastChild(current = node)) != NULL){}
15149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // _currentNode = current;
15159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = m_traverser.first(node);
15169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // _currentNode precedes possible following(node) nodes
15189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
15199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
15209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
15229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
15269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
15279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
15289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
15309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _currentNode;
15339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = m_traverser.next(_startNode, _currentNode);
15359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(node);
15379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of FollowingIterator
15399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns following nodes of a given type for a given node.
15429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class TypedFollowingIterator extends FollowingIterator
15449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
15479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
15489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedFollowingIterator
15519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
15529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
15539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type The extended type ID being requested.
15549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedFollowingIterator(int type)
15569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = type;
15589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
15629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
15639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
15649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
15669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node;
15699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      do{
15719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       node = _currentNode;
15729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = m_traverser.next(_startNode, _currentNode);
15749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
15769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (node != DTM.NULL
15779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             && (getExpandedTypeID(node) != _nodeType && getNodeType(node) != _nodeType));
15789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (node == DTM.NULL ? DTM.NULL :returnNode(node));
15809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedFollowingIterator
15829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns the ancestors of a given node in document
15859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * order.  (NOTE!  This was changed from the XSLTC code!)
15869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class AncestorIterator extends InternalAxisIteratorBase
15889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    org.apache.xml.utils.NodeVector m_ancestors =
15909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         new org.apache.xml.utils.NodeVector();
15919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int m_ancestorsPos;
15939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int m_markedPos;
15959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The real start node for this axes, since _startNode will be adjusted. */
15979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int m_realStartNode;
15989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get start to END should 'close' the iterator,
16019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
16029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
16039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The root node of the iteration.
16049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int getStartNode()
16069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_realStartNode;
16089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * True if this iterator has a reversed axis.
16129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
16139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true since this iterator is a reversed axis.
16149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public final boolean isReverse()
16169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return true;
16189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns a deep copy of this iterator.  The cloned iterator is not reset.
16229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
16239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return a deep copy of this iterator.
16249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator cloneIterator()
16269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _isRestartable = false;  // must set to false for any clone
16289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
16309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
16319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final AncestorIterator clone = (AncestorIterator) super.clone();
16329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        clone._startNode = _startNode;
16349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // return clone.reset();
16369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return clone;
16379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
16389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch (CloneNotSupportedException e)
16399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
16409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new DTMException(XMLMessages.createXMLMessage(XMLErrorResources.ER_ITERATOR_CLONE_NOT_SUPPORTED, null)); //"Iterator clone not supported.");
16419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
16429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
16469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
16479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
16489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
16499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
16509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
16519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
16539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
16559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
16569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
16579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_realStartNode = node;
16589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
16609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
16619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int nodeID = makeNodeIdentity(node);
16629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!_includeSelf && node != DTM.NULL) {
16649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nodeID = _parent(nodeID);
16659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node = makeNodeHandle(nodeID);
16669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
16679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
16699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while (nodeID != END) {
16719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_ancestors.addElement(node);
16729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nodeID = _parent(nodeID);
16739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node = makeNodeHandle(nodeID);
16749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
16759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_ancestorsPos = m_ancestors.size()-1;
16769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = (m_ancestorsPos>=0)
16789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               ? m_ancestors.elementAt(m_ancestorsPos)
16799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               : DTM.NULL;
16809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
16829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
16839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
16859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Resets the iterator to the last start node.
16899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
16909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator, which may or may not be the same as this
16919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         iterator.
16929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator reset()
16949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_ancestorsPos = m_ancestors.size()-1;
16979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = (m_ancestorsPos>=0) ? m_ancestors.elementAt(m_ancestorsPos)
16999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         : DTM.NULL;
17009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return resetPosition();
17029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
17039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
17059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
17069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
17079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
17089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
17099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
17109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
17119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int next = _currentNode;
17139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int pos = --m_ancestorsPos;
17159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = (pos >= 0) ? m_ancestors.elementAt(m_ancestorsPos)
17179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                : DTM.NULL;
17189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(next);
17209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
17219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setMark() {
17239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_markedPos = m_ancestorsPos;
17249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
17259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void gotoMark() {
17279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_ancestorsPos = m_markedPos;
17289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = m_ancestorsPos>=0 ? m_ancestors.elementAt(m_ancestorsPos)
17299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         : DTM.NULL;
17309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
17319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of AncestorIterator
17329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Typed iterator that returns the ancestors of a given node.
17359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class TypedAncestorIterator extends AncestorIterator
17379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
17409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
17419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
17439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedAncestorIterator
17449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
17459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
17469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type The extended type ID being requested.
17479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
17489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedAncestorIterator(int type)
17499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
17509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = type;
17519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
17529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
17549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
17559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
17569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
17579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
17589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
17599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
17609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
17619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
17629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
17639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
17649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
17659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
17669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_realStartNode = node;
17679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
17699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
17709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int nodeID = makeNodeIdentity(node);
17719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int nodeType = _nodeType;
17729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!_includeSelf && node != DTM.NULL) {
17749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nodeID = _parent(nodeID);
17759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
17769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
17789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeType >= DTM.NTYPES) {
17809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          while (nodeID != END) {
17819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int eType = _exptype(nodeID);
17829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (eType == nodeType) {
17849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              m_ancestors.addElement(makeNodeHandle(nodeID));
17859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
17869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nodeID = _parent(nodeID);
17879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
17889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
17899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          while (nodeID != END) {
17909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int eType = _exptype(nodeID);
17919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ((eType >= DTM.NTYPES
17939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    && m_expandedNameTable.getType(eType) == nodeType)
17949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || (eType < DTM.NTYPES && eType == nodeType)) {
17959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              m_ancestors.addElement(makeNodeHandle(nodeID));
17969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
17979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nodeID = _parent(nodeID);
17989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
17999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
18009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_ancestorsPos = m_ancestors.size()-1;
18019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = (m_ancestorsPos>=0)
18039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               ? m_ancestors.elementAt(m_ancestorsPos)
18049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               : DTM.NULL;
18059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
18079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
18089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
18109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
18119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedAncestorIterator
18129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns the descendants of a given node.
18159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class DescendantIterator extends InternalAxisIteratorBase
18179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
18189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
18209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
18219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
18229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
18239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
18249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
18259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
18269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
18279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
18289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
18299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
18309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
18319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
18329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isRestartable)
18339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
18349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = makeNodeIdentity(node);
18359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _startNode = node;
18369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (_includeSelf)
18389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          node--;
18399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = node;
18419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
18439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
18449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
18469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
18479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
18499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Tell if this node identity is a descendant.  Assumes that
18509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the node info for the element has already been obtained.
18519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
18529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This one-sided test works only if the parent has been
18539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * previously tested and is known to be a descendent. It fails if
18549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the parent is the _startNode's next sibling, or indeed any node
18559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * that follows _startNode in document order.  That may suffice
18569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * for this iterator, but it's not really an isDescendent() test.
18579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * %REVIEW% rename?
18589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
18599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param identity The index number of the node in question.
18609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if the index is a descendant of _startNode.
18619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
18629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean isDescendant(int identity)
18639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
18649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (_parent(identity) >= _startNode) || (_startNode == identity);
18659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
18669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
18689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
18699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
18709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
18719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
18729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
18739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
18749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_startNode == NULL) {
18759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
18769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
18779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_includeSelf && (_currentNode + 1) == _startNode)
18799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return returnNode(makeNodeHandle(++_currentNode)); // | m_dtmIdent);
18809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _currentNode;
18829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int type;
18839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      do {
18859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node++;
18869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        type = _type(node);
18879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (NULL == type ||!isDescendant(node)) {
18899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          _currentNode = NULL;
18909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return END;
18919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
18929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } while(ATTRIBUTE_NODE == type || TEXT_NODE == type
18939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 || NAMESPACE_NODE == type);
18949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = node;
18969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(makeNodeHandle(node));  // make handle.
18979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
18989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
19009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Reset.
19019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
19029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
19039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMAxisIterator reset()
19049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    final boolean temp = _isRestartable;
19079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    _isRestartable = true;
19099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setStartNode(makeNodeHandle(_startNode));
19119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    _isRestartable = temp;
19139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this;
19159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of DescendantIterator
19189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Typed iterator that returns the descendants of a given node.
19219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class TypedDescendantIterator extends DescendantIterator
19239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
19269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
19279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
19299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedDescendantIterator
19309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
19319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
19329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nodeType Extended type ID being requested.
19339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
19349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedDescendantIterator(int nodeType)
19359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = nodeType;
19379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
19409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
19419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
19429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
19439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
19449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
19459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node;
19479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int type;
19489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_startNode == NULL) {
19509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
19519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      node = _currentNode;
19549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      do
19569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
19579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node++;
19589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        type = _type(node);
19599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (NULL == type ||!isDescendant(node)) {
19619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          _currentNode = NULL;
19629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return END;
19639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
19649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (type != _nodeType && _exptype(node) != _nodeType);
19669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = node;
19689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(makeNodeHandle(node));
19699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedDescendantIterator
19719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns the descendants of a given node.
19749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * I'm not exactly clear about this one... -sb
19759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class NthDescendantIterator extends DescendantIterator
19779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The current nth position. */
19809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int _pos;
19819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
19839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor NthDescendantIterator
19849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
19859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
19869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param pos The nth position being requested.
19879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
19889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public NthDescendantIterator(int pos)
19899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _pos = pos;
19919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
19949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
19959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
19969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
19979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
19989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
19999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
20009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // I'm not exactly clear yet what this is doing... -sb
20029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node;
20039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while ((node = super.next()) != END)
20059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
20069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = makeNodeIdentity(node);
20079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int parent = _parent(node);
20099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int child = _firstch(parent);
20109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int pos = 0;
20119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        do
20139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
20149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int type = _type(child);
20159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (ELEMENT_NODE == type)
20179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            pos++;
20189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
20199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while ((pos < _pos) && (child = _nextsib(child)) != END);
20209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (node == child)
20229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return node;
20239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
20249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (END);
20269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of NthDescendantIterator
20289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Class SingletonIterator.
20319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
20329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public class SingletonIterator extends InternalAxisIteratorBase
20339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
20349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** (not sure yet what this is.  -sb)  (sc & sb remove final to compile in JDK 1.1.8) */
20369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean _isConstant;
20379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
20399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor SingletonIterator
20409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
20419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
20429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public SingletonIterator()
20439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
20449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      this(Integer.MIN_VALUE, false);
20459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
20489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor SingletonIterator
20499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
20509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
20519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node The node handle to return.
20529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
20539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public SingletonIterator(int node)
20549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
20559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      this(node, false);
20569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
20599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor SingletonIterator
20609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
20619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
20629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node the node handle to return.
20639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param constant (Not sure what this is yet.  -sb)
20649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
20659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public SingletonIterator(int node, boolean constant)
20669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
20679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = _startNode = node;
20689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _isConstant = constant;
20699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
20729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set start to END should 'close' the iterator,
20739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * i.e. subsequent call to next() should return END.
20749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
20759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node Sets the root of the iteration.
20769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
20779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator set to the start of the iteration.
20789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
20799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator setStartNode(int node)
20809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
20819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
20829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (node == DTMDefaultBase.ROOTNODE)
20839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = getDocument();
20849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isConstant)
20859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
20869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = _startNode;
20879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
20899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
20909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (_isRestartable)
20919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
20929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = _startNode = node;
20939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
20959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
20969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
20989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
21019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Resets the iterator to the last start node.
21029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
21039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DTMAxisIterator, which may or may not be the same as this
21049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         iterator.
21059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
21069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DTMAxisIterator reset()
21079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
21089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (_isConstant)
21109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
21119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _currentNode = _startNode;
21129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return resetPosition();
21149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
21159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
21169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
21179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final boolean temp = _isRestartable;
21189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _isRestartable = true;
21209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setStartNode(_startNode);
21229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        _isRestartable = temp;
21249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
21259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
21279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
21289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
21309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
21319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
21329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
21339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
21349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
21359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
21369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      final int result = _currentNode;
21389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = END;
21409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return returnNode(result);
21429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
21439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of SingletonIterator
21449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Iterator that returns a given node only if it is of a given type.
21479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final class TypedSingletonIterator extends SingletonIterator
21499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The extended type ID that was requested. */
21529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final int _nodeType;
21539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
21559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor TypedSingletonIterator
21569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
21579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
21589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nodeType The extended type ID being requested.
21599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
21609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public TypedSingletonIterator(int nodeType)
21619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
21629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _nodeType = nodeType;
21639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
21649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
21669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the next node in the iteration.
21679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
21689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The next node handle in the iteration, or END.
21699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
21709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int next()
21719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
21729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //final int result = super.next();
21749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      final int result = _currentNode;
21759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nodeType = _nodeType;
21769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      _currentNode = END;
21789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (nodeType >= DTM.NTYPES) {
21809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (getExpandedTypeID(result) == nodeType) {
21819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return returnNode(result);
21829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
21839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
21849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (getNodeType(result) == nodeType) {
21859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return returnNode(result);
21869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
21879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
21889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return NULL;
21909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
21919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end of TypedSingletonIterator
21929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
2193