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: LocPathIterator.java 468655 2006-10-28 07:12:06Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.axes;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMFilter;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMIterator;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMManager;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.PrefixResolver;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.ExpressionOwner;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathVisitor;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.Compiler;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XNodeSet;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.res.XPATHErrorResources;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class extends NodeSetDTM, which implements NodeIterator,
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * and fetches nodes one at a time in document order based on a XPath
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <a href="http://www.w3.org/TR/xpath#NT-LocationPath>LocationPath</a>.
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>If setShouldCacheNodes(true) is called,
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * as each node is iterated via nextNode(), the node is also stored
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in the NodeVector, so that previousNode() can easily be done, except in
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the case where the LocPathIterator is "owned" by a UnionPathIterator,
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in which case the UnionPathIterator will cache the nodes.</p>
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic abstract class LocPathIterator extends PredicatedNodeTest
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        implements Cloneable, DTMIterator, java.io.Serializable, PathComponent
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = -4602476357268405754L;
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a LocPathIterator object.
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected LocPathIterator()
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a LocPathIterator object.
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nscontext The namespace context for this iterator,
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should be OK if null.
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected LocPathIterator(PrefixResolver nscontext)
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setLocPathIterator(this);
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_prefixResolver = nscontext;
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a LocPathIterator object, including creation
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of step walkers from the opcode list, and call back
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * into the Compiler to create predicate expressions.
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param compiler The Compiler which is creating
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this expression.
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param opPos The position of this iterator in the
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * opcode list from the compiler.
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected LocPathIterator(Compiler compiler, int opPos, int analysis)
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(compiler, opPos, analysis, true);
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a LocPathIterator object, including creation
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of step walkers from the opcode list, and call back
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * into the Compiler to create predicate expressions.
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param compiler The Compiler which is creating
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this expression.
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param opPos The position of this iterator in the
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * opcode list from the compiler.
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param shouldLoadWalkers True if walkers should be
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * loaded, or false if this is a derived iterator and
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * it doesn't wish to load child walkers.
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected LocPathIterator(
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          Compiler compiler, int opPos, int analysis, boolean shouldLoadWalkers)
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setLocPathIterator(this);
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the analysis bits for this walker, as defined in the WalkerFactory.
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return One of WalkerFactory#BIT_DESCENDANT, etc.
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getAnalysisBits()
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	int axis = getAxis();
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	int bit = WalkerFactory.getAnalysisBitFromAxes(axis);
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	return bit;
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Read the object from a serialization stream.
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param stream Input stream to read from
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws java.io.IOException
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private void readObject(java.io.ObjectInputStream stream)
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws java.io.IOException, javax.xml.transform.TransformerException
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      stream.defaultReadObject();
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_clones =  new IteratorPool(this);
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (ClassNotFoundException cnfe)
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new javax.xml.transform.TransformerException(cnfe);
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the environment in which this iterator operates, which should provide:
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a node (the context node... same value as "root" defined below)
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a pair of non-zero positive integers (the context position and the context size)
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a set of variable bindings
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a function library
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the set of namespace declarations in scope for the expression.
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>At this time the exact implementation of this environment is application
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * dependent.  Probably a proper interface will be created fairly soon.</p>
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param environment The environment object.
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setEnvironment(Object environment)
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no-op for now.
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an instance of a DTM that "owns" a node handle.  Since a node
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator may be passed without a DTMManager, this allows the
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * caller to easily get the DTM using just the iterator.
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the nodeHandle.
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return a non-null DTM reference.
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTM getDTM(int nodeHandle)
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %OPT%
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_execContext.getDTM(nodeHandle);
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an instance of the DTMManager.  Since a node
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator may be passed without a DTMManager, this allows the
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * caller to easily get the DTMManager using just the iterator.
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return a non-null DTMManager reference.
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMManager getDTMManager()
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_execContext.getDTMManager();
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Execute this iterator, meaning create a clone that can
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * store state, and initialize it for fast execution from
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the current runtime state.  When this is called, no actual
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * query from the current context node is performed.
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath execution context.
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return An XNodeSet reference that holds this iterator.
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(XPathContext xctxt)
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XNodeSet iter = new XNodeSet((LocPathIterator)m_clones.getInstance());
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    iter.setRoot(xctxt.getCurrentNode(), xctxt);
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return iter;
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Execute an expression in the XPath runtime context, and return the
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * result of the expression.
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath runtime context.
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param handler The target content handler.
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The result of the expression in the form of a <code>XObject</code>.
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException if a runtime exception
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         occurs.
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXException
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void executeCharsToContentHandler(
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, org.xml.sax.ContentHandler handler)
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException,
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   org.xml.sax.SAXException
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    LocPathIterator clone = (LocPathIterator)m_clones.getInstance();
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int current = xctxt.getCurrentNode();
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clone.setRoot(current, xctxt);
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int node = clone.nextNode();
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTM dtm = clone.getDTM(node);
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clone.detach();
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(node != DTM.NULL)
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      dtm.dispatchCharactersEvents(node, handler, false);
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given an select expression and a context, evaluate the XPath
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and return the resulting iterator.
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The execution context.
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contextNode The node that "." expresses.
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException thrown if the active ProblemListener decides
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the error condition is severe enough to halt processing.
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage experimental
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMIterator asIterator(
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, int contextNode)
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XNodeSet iter = new XNodeSet((LocPathIterator)m_clones.getInstance());
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    iter.setRoot(contextNode, xctxt);
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return iter;
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if the expression is a nodeset expression.
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the expression can be represented as a nodeset.
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isNodesetExpr()
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the first node out of the nodeset, if this expression is
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a nodeset expression.  This is the default implementation for
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * nodesets.  Derived classes should try and override this and return a
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * value without having to do a clone operation.
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath runtime context.
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the first node out of the nodeset, or DTM.NULL.
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int asNode(XPathContext xctxt)
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    throws javax.xml.transform.TransformerException
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTMIterator iter = (DTMIterator)m_clones.getInstance();
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int current = xctxt.getCurrentNode();
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    iter.setRoot(current, xctxt);
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int next = iter.nextNode();
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // m_clones.freeInstance(iter);
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    iter.detach();
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return next;
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Evaluate this operation directly to a boolean.
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The runtime execution context.
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The result of the operation as a boolean.
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean bool(XPathContext xctxt)
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (asNode(xctxt) != DTM.NULL);
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set if this is an iterator at the upper level of
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the XPath.
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param b true if this location path is at the top level of the
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *          expression.
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setIsTopLevel(boolean b)
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_isTopLevel = b;
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get if this is an iterator at the upper level of
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the XPath.
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if this location path is at the top level of the
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *          expression.
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean getIsTopLevel()
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_isTopLevel;
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Initialize the context values for this expression
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * after it is cloned.
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param context The XPath runtime context for this
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * transformation.
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setRoot(int context, Object environment)
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_context = context;
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathContext xctxt = (XPathContext)environment;
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_execContext = xctxt;
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_cdtm = xctxt.getDTM(context);
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentContextNode = context; // only if top level?
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Yech, shouldn't have to do this.  -sb
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null == m_prefixResolver)
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	m_prefixResolver = xctxt.getNamespaceContext();
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_lastFetched = DTM.NULL;
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_foundLast = false;
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_pos = 0;
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_length = -1;
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_isTopLevel)
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      this.m_stackFrame = xctxt.getVarStack().getStackFrame();
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // reset();
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the next position index of this iterator.
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param next A value greater than or equal to zero that indicates the next
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node position to fetch.
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void setNextPosition(int next)
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    assertion(false, "setNextPosition not supported in this iterator!");
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the current position, which is one less than
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the next nextNode() call will retrieve.  i.e. if
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * you call getCurrentPos() and the return is 0, the next
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * fetch will take place at index 1.
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A value greater than or equal to zero that indicates the next
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node position to fetch.
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final int getCurrentPos()
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_pos;
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If setShouldCacheNodes(true) is called, then nodes will
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be cached.  They are not cached by default.
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param b True if this iterator should cache nodes.
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setShouldCacheNodes(boolean b)
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    assertion(false, "setShouldCacheNodes not supported by this iterater!");
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tells if this iterator can have nodes added to it or set via
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the <code>setItem(int node, int index)</code> method.
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if the nodelist can be mutated.
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isMutable()
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the current position in the node set.
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param i Must be a valid index greater
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * than or equal to zero and less than m_cachedNodes.size().
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setCurrentPos(int i)
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	assertion(false, "setCurrentPos not supported by this iterator!");
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Increment the current position in the node set.
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void incrementCurrentPos()
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	m_pos++;
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the length of the cached nodes.
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Note: for the moment at least, this only returns
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the size of the nodes that have been fetched to date,
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * it doesn't attempt to run to the end to make sure we
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * have found everything.  This should be reviewed.</p>
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The size of the current cache list.
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int size()
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	assertion(false, "size() not supported by this iterator!");
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	return 0;
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Returns the <code>index</code> th item in the collection. If
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>index</code> is greater than or equal to the number of nodes in
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the list, this returns <code>null</code> .
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param index  Index into the collection.
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return  The node at the <code>index</code> th position in the
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   <code>NodeList</code> , or <code>null</code> if that is not a valid
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   index.
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int item(int index)
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	assertion(false, "item(int index) not supported by this iterator!");
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	return 0;
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Sets the node at the specified index of this vector to be the
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * specified node. The previous component at that position is discarded.
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>The index must be a value greater than or equal to 0 and less
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * than the current size of the vector.
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The iterator must be in cached mode.</p>
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Meant to be used for sorted iterators.</p>
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node Node to set
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param index Index of where to set the node
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setItem(int node, int index)
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	assertion(false, "setItem not supported by this iterator!");
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  The number of nodes in the list. The range of valid child node indices
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is 0 to <code>length-1</code> inclusive.
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The number of nodes in the list, always greater or equal to zero.
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getLength()
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Tell if this is being called from within a predicate.
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	boolean isPredicateTest = (this == m_execContext.getSubContextList());
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // And get how many total predicates are part of this step.
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	int predCount = getPredicateCount();
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // If we have already calculated the length, and the current predicate
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // is the first predicate, then return the length.  We don't cache
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // the anything but the length of the list to the first predicate.
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (-1 != m_length && isPredicateTest && m_predicateIndex < 1)
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return m_length;
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // I'm a bit worried about this one, since it doesn't have the
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // checks found above.  I suspect it's fine.  -sb
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_foundLast)
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return m_pos;
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Create a clone, and count from the current position to the end
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // of the list, not taking into account the current predicate and
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // predicates after the current one.
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int pos = (m_predicateIndex >= 0) ? getProximityPosition() : m_pos;
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    LocPathIterator clone;
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      clone = (LocPathIterator) clone();
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (CloneNotSupportedException cnse)
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return -1;
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // We want to clip off the last predicate, but only if we are a sub
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // context node list, NOT if we are a context list.  See pos68 test,
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // also test against bug4638.
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (predCount > 0 && isPredicateTest)
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Don't call setPredicateCount, because it clones and is slower.
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      clone.m_predCount = m_predicateIndex;
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // The line above used to be:
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // clone.m_predCount = predCount - 1;
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // ...which looks like a dumb bug to me. -sb
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int next;
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (DTM.NULL != (next = clone.nextNode()))
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      pos++;
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (isPredicateTest && m_predicateIndex < 1)
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_length = pos;
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return pos;
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tells if this NodeSetDTM is "fresh", in other words, if
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the first nextNode() that is called will return the
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * first node in the set.
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true of nextNode has not been called.
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isFresh()
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (m_pos == 0);
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Returns the previous node in the set and moves the position of the
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator backwards in the set.
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return  The previous <code>Node</code> in the set being iterated over,
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   or<code>null</code> if there are no more members in that set.
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int previousNode()
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    throw new RuntimeException(
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESETDTM_CANNOT_ITERATE, null)); //"This NodeSetDTM can not iterate to a previous node!");
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This attribute determines which node types are presented via the
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator. The available set of constants is defined in the
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>NodeFilter</code> interface.
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>This is somewhat useless at this time, since it doesn't
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * really return information that tells what this iterator will
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * show.  It is here only to fullfill the DOM NodeIterator
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * interface.</p>
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return For now, always NodeFilter.SHOW_ALL & ~NodeFilter.SHOW_ENTITY_REFERENCE.
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.w3c.dom.traversal.NodeIterator
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getWhatToShow()
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // TODO: ??
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return DTMFilter.SHOW_ALL & ~DTMFilter.SHOW_ENTITY_REFERENCE;
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  The filter used to screen nodes.  Not used at this time,
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this is here only to fullfill the DOM NodeIterator
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * interface.
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Always null.
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.w3c.dom.traversal.NodeIterator
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMFilter getFilter()
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The root node of the Iterator, as specified when it was created.
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The "root" of this iterator, which, in XPath terms,
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is the node context for this iterator.
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getRoot()
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_context;
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  The value of this flag determines whether the children of entity
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * reference nodes are visible to the iterator. If false, they will be
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * skipped over.
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <br> To produce a view of the document that has entity references
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * expanded and does not expose the entity reference node itself, use the
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * whatToShow flags to hide the entity reference node and set
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * expandEntityReferences to true when creating the iterator. To produce
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a view of the document that has entity reference nodes but no entity
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * expansion, use the whatToShow flags to show the entity reference node
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and set expandEntityReferences to false.
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Always true, since entity reference nodes are not
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * visible in the XPath model.
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean getExpandEntityReferences()
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Control over whether it is OK for detach to reset the iterator. */
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected boolean m_allowDetach = true;
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Specify if it's OK for detach to release the iterator for reuse.
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param allowRelease true if it is OK for detach to release this iterator
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for pooling.
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void allowDetachToRelease(boolean allowRelease)
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_allowDetach = allowRelease;
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Detaches the iterator from the set which it iterated over, releasing
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * any computational resources and placing the iterator in the INVALID
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * state. After<code>detach</code> has been invoked, calls to
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>nextNode</code> or<code>previousNode</code> will raise the
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * exception INVALID_STATE_ERR.
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void detach()
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(m_allowDetach)
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // sb: allow reusing of cached nodes when possible?
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // m_cachedNodes = null;
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_execContext = null;
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // m_prefixResolver = null;  sb: Why would this ever want to be null?
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_cdtm = null;
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_length = -1;
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_pos = 0;
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_lastFetched = DTM.NULL;
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_context = DTM.NULL;
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_currentContextNode = DTM.NULL;
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_clones.freeInstance(this);
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Reset the iterator.
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void reset()
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	assertion(false, "This iterator can not reset!");
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a cloned Iterator that is reset to the beginning
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of the query.
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A cloned NodeIterator set of the start of the query.
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws CloneNotSupportedException
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMIterator cloneWithReset() throws CloneNotSupportedException
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    LocPathIterator clone;
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    clone = (LocPathIterator) clone();
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clone = (LocPathIterator)m_clones.getInstanceOrThrow();
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clone.m_execContext = m_execContext;
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clone.m_cdtm = m_cdtm;
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clone.m_context = m_context;
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clone.m_currentContextNode = m_currentContextNode;
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clone.m_stackFrame = m_stackFrame;
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // clone.reset();
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return clone;
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /**
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * Get a cloned LocPathIterator that holds the same
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * position as this iterator.
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @return A clone of this iterator that holds the same node position.
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @throws CloneNotSupportedException
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   */
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  public Object clone() throws CloneNotSupportedException
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  {
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    LocPathIterator clone = (LocPathIterator) super.clone();
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    return clone;
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  }
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Returns the next node in the set and advances the position of the
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator in the set. After a NodeIterator is created, the first call
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to nextNode() returns the first node in the set.
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return  The next <code>Node</code> in the set being iterated over, or
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   <code>null</code> if there are no more members in that set.
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract int nextNode();
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Bottleneck the return of a next node, to make returns
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * easier from nextNode().
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nextNode The next node found, may be null.
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The same node that was passed as an argument.
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int returnNextNode(int nextNode)
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.NULL != nextNode)
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_pos++;
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_lastFetched = nextNode;
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.NULL == nextNode)
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_foundLast = true;
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return nextNode;
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the last fetched node.  Needed to support the UnionPathIterator.
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The last fetched node, or null if the last fetch was null.
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getCurrentNode()
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_lastFetched;
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If an index is requested, NodeSetDTM will call this method
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to run the iterator to the index.  By default this sets
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * m_next to the index.  If the index argument is -1, this
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * signals that the iterator should be run to the end.
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param index The index to run to, or -1 if the iterator
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should run to the end.
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void runTo(int index)
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_foundLast || ((index >= 0) && (index <= getCurrentPos())))
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return;
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n;
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (-1 == index)
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (DTM.NULL != (n = nextNode()));
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (DTM.NULL != (n = nextNode()))
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (getCurrentPos() >= index)
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tells if we've found the last node yet.
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the last nextNode returned null.
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final boolean getFoundLast()
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_foundLast;
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The XPath execution context we are operating on.
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return XPath execution context this iterator is operating on,
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or null if setRoot has not been called.
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final XPathContext getXPathContext()
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_execContext;
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The node context for the iterator.
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The node context, same as getRoot().
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final int getContext()
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_context;
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The node context from where the expression is being
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * executed from (i.e. for current() support).
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The top-level node context of the entire expression.
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final int getCurrentContextNode()
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_currentContextNode;
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the current context node for this iterator.
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n Must be a non-null reference to the node context.
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final void setCurrentContextNode(int n)
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentContextNode = n;
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /**
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * Set the current context node for this iterator.
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @param n Must be a non-null reference to the node context.
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   */
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  public void setRoot(int n)
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  {
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    m_context = n;
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    m_cdtm = m_execContext.getDTM(n);
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  }
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the saved reference to the prefix resolver that
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * was in effect when this iterator was created.
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The prefix resolver or this iterator, which may be null.
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final PrefixResolver getPrefixResolver()
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(null == m_prefixResolver)
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	{
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	m_prefixResolver = (PrefixResolver)getExpressionOwner();
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	}
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_prefixResolver;
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /**
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * Get the analysis pattern built by the WalkerFactory.
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @return The analysis pattern built by the WalkerFactory.
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   */
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  int getAnalysis()
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  {
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    return m_analysis;
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  }
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /**
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * Set the analysis pattern built by the WalkerFactory.
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @param a The analysis pattern built by the WalkerFactory.
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   */
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  void setAnalysis(int a)
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  {
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    m_analysis = a;
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  }
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	 	if(visitor.visitLocationPath(owner, this))
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	 	{
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	 		visitor.visitStep(owner, this);
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	 		callPredicateVisitors(visitor);
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	 	}
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //============= State Data =============
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The pool for cloned iterators.  Iterators need to be cloned
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * because the hold running state, and thus the original iterator
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * expression from the stylesheet pool can not be used.
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected IteratorPool m_clones = new IteratorPool(this);
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The dtm of the context node.  Careful about using this... it may not
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be the dtm of the current node.
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected DTM m_cdtm;
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The stack frame index for this iterator.
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient int m_stackFrame = -1;
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Value determined at compile time, indicates that this is an
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator at the top level of the expression, rather than inside
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a predicate.
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_isTopLevel = false;
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The last node that was fetched, usually by nextNode. */
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient public int m_lastFetched = DTM.NULL;
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The context node for this iterator, which doesn't change through
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the course of the iteration.
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected int m_context = DTM.NULL;
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The node context from where the expression is being
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * executed from (i.e. for current() support).  Different
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * from m_context in that this is the context for the entire
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * expression, rather than the context for the subexpression.
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected int m_currentContextNode = DTM.NULL;
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The current position of the context node.
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected int m_pos = 0;
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected int m_length = -1;
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Fast access to the current prefix resolver.  It isn't really
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * clear that this is needed.
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private PrefixResolver m_prefixResolver;
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The XPathContext reference, needed for execution of many
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * operations.
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected XPathContext m_execContext;
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Returns true if all the nodes in the iteration well be returned in document
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * order.
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true as a default.
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isDocOrdered()
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Returns the axis being iterated, if it is known.
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Axis.CHILD, etc., or -1 if the axis is not known or is of multiple
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * types.
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getAxis()
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return -1;
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /**
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * The analysis pattern built by the WalkerFactory.
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * TODO: Move to LocPathIterator.
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @see org.apache.xpath.axes.WalkerFactory
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @serial
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   */
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  protected int m_analysis = 0x00000000;
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see PredicatedNodeTest#getLastPos(XPathContext)
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getLastPos(XPathContext xctxt)
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getLength();
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
1034