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: NodeSet.java 468655 2006-10-28 07:12:06Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.DOM2Helper;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.axes.ContextNodeList;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.res.XPATHErrorResources;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.DOMException;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.NodeList;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.traversal.NodeFilter;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.traversal.NodeIterator;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>The NodeSet class can act as either a NodeVector,
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * NodeList, or NodeIterator.  However, in order for it to
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * act as a NodeVector or NodeList, it's required that
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * setShouldCacheNodes(true) be called before the first
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * nextNode() is called, in order that nodes can be added
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * as they are fetched.  Derived classes that implement iterators
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * must override runTo(int index), in order that they may
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * run the iteration to the given index. </p>
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Note that we directly implement the DOM's NodeIterator
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * interface. We do not emulate all the behavior of the
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * standard NodeIterator. In particular, we do not guarantee
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to present a "live view" of the document ... but in XSLT,
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the source document should never be mutated, so this should
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * never be an issue.</p>
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Thought: Should NodeSet really implement NodeList and NodeIterator,
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or should there be specific subclasses of it which do so? The
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * advantage of doing it all here is that all NodeSets will respond
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to the same calls; the disadvantage is that some of them may return
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * less-than-enlightening results when you do so.</p>
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class NodeSet
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        implements NodeList, NodeIterator, Cloneable, ContextNodeList
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create an empty nodelist.
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeSet()
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_blocksize = 32;
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_mapSize = 0;
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create an empty, using the given block size.
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param blocksize Size of blocks to allocate
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeSet(int blocksize)
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_blocksize = blocksize;
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_mapSize = 0;
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a NodeSet, and copy the members of the
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * given nodelist into it.
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodelist List of Nodes to be made members of the new set.
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeSet(NodeList nodelist)
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(32);
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    addNodes(nodelist);
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a NodeSet, and copy the members of the
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * given NodeSet into it.
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodelist Set of Nodes to be made members of the new set.
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeSet(NodeSet nodelist)
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(32);
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    addNodes((NodeIterator) nodelist);
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a NodeSet, and copy the members of the
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * given NodeIterator into it.
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ni Iterator which yields Nodes to be made members of the new set.
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeSet(NodeIterator ni)
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(32);
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    addNodes(ni);
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a NodeSet which contains the given Node.
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node Single node to be added to the new set.
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeSet(Node node)
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(32);
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    addNode(node);
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The root node of the Iterator, as specified when it was created.
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * For non-Iterator NodeSets, this will be null.
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Node getRoot()
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a cloned Iterator, and reset its state to the beginning of the
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iteration.
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return a new NodeSet of the same type, having the same state...
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * except that the reset() operation has been called.
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws CloneNotSupportedException if this subclass of NodeSet
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * does not support the clone() operation.
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeIterator cloneWithReset() throws CloneNotSupportedException
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    NodeSet clone = (NodeSet) clone();
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clone.reset();
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return clone;
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Reset the iterator. May have no effect on non-iterator Nodesets.
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void reset()
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_next = 0;
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  This attribute determines which node types are presented via the
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator. The available set of constants is defined in the
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>NodeFilter</code> interface. For NodeSets, the mask has been
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * hardcoded to show all nodes except EntityReference nodes, which have
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * no equivalent in the XPath data model.
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return integer used as a bit-array, containing flags defined in
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the DOM's NodeFilter class. The value will be
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>SHOW_ALL & ~SHOW_ENTITY_REFERENCE</code>, meaning that
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * only entity references are suppressed.
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getWhatToShow()
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return NodeFilter.SHOW_ALL & ~NodeFilter.SHOW_ENTITY_REFERENCE;
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The filter object used to screen nodes. Filters are applied to
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * further reduce (and restructure) the NodeIterator's view of the
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document. In our case, we will be using hardcoded filters built
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * into our iterators... but getFilter() is part of the DOM's
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NodeIterator interface, so we have to support it.
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null, which is slightly misleading. True, there is no
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * user-written filter object, but in fact we are doing some very
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * sophisticated custom filtering. A DOM purist might suggest
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * returning a placeholder object just to indicate that this is
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * not going to return all nodes selected by whatToShow.
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeFilter getFilter()
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  The value of this flag determines whether the children of entity
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * reference nodes are visible to the iterator. If false, they will be
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * skipped over.
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <br> To produce a view of the document that has entity references
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * expanded and does not expose the entity reference node itself, use the
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * whatToShow flags to hide the entity reference node and set
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * expandEntityReferences to true when creating the iterator. To produce
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a view of the document that has entity reference nodes but no entity
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * expansion, use the whatToShow flags to show the entity reference node
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and set expandEntityReferences to false.
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true for all iterators based on NodeSet, meaning that the
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * contents of EntityRefrence nodes may be returned (though whatToShow
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * says that the EntityReferences themselves are not shown.)
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean getExpandEntityReferences()
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Returns the next node in the set and advances the position of the
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator in the set. After a NodeIterator is created, the first call
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to nextNode() returns the first node in the set.
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return  The next <code>Node</code> in the set being iterated over, or
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   <code>null</code> if there are no more members in that set.
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws DOMException
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *    INVALID_STATE_ERR: Raised if this method is called after the
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   <code>detach</code> method was invoked.
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Node nextNode() throws DOMException
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((m_next) < this.size())
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node next = this.elementAt(m_next);
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_next++;
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return next;
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Returns the previous node in the set and moves the position of the
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator backwards in the set.
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return  The previous <code>Node</code> in the set being iterated over,
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   or<code>null</code> if there are no more members in that set.
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws DOMException
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *    INVALID_STATE_ERR: Raised if this method is called after the
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   <code>detach</code> method was invoked.
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a cached type, and hence doesn't know what the previous node was.
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Node previousNode() throws DOMException
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_cacheNodes)
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_CANNOT_ITERATE, null)); //"This NodeSet can not iterate to a previous node!");
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((m_next - 1) > 0)
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_next--;
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this.elementAt(m_next);
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Detaches the iterator from the set which it iterated over, releasing
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * any computational resources and placing the iterator in the INVALID
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * state. After<code>detach</code> has been invoked, calls to
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>nextNode</code> or<code>previousNode</code> will raise the
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * exception INVALID_STATE_ERR.
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This operation is a no-op in NodeSet, and will not cause
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * INVALID_STATE_ERR to be raised by later operations.
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * </p>
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void detach(){}
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tells if this NodeSet is "fresh", in other words, if
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the first nextNode() that is called will return the
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * first node in the set.
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if nextNode() would return the first node in the set,
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * false if it would return a later one.
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isFresh()
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (m_next == 0);
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If an index is requested, NodeSet will call this method
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to run the iterator to the index.  By default this sets
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * m_next to the index.  If the index argument is -1, this
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * signals that the iterator should be run to the end.
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param index Position to advance (or retreat) to, with
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * 0 requesting the reset ("fresh") position and -1 (or indeed
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * any out-of-bounds value) requesting the final position.
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * one of the types which supports indexing/counting.
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void runTo(int index)
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_cacheNodes)
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_CANNOT_INDEX, null)); //"This NodeSet can not do indexing or counting functions!");
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((index >= 0) && (m_next < m_firstFree))
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_next = index;
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_next = m_firstFree - 1;
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Returns the <code>index</code>th item in the collection. If
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>index</code> is greater than or equal to the number of nodes in
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the list, this returns <code>null</code>.
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TODO: What happens if index is out of range?
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param index Index into the collection.
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The node at the <code>index</code>th position in the
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   <code>NodeList</code>, or <code>null</code> if that is not a valid
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   index.
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Node item(int index)
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    runTo(index);
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (Node) this.elementAt(index);
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The number of nodes in the list. The range of valid child node indices is
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * 0 to <code>length-1</code> inclusive. Note that this operation requires
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * finding all the matching nodes, which may defeat attempts to defer
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that work.
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return integer indicating how many nodes are represented by this list.
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getLength()
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    runTo(-1);
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this.size();
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add a node to the NodeSet. Not all types of NodeSets support this
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * operation
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n Node to be added
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void addNode(Node n)
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.addElement(n);
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Insert a node at a given position.
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n Node to be added
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param pos Offset at which the node is to be inserted,
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with 0 being the first position.
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void insertNode(Node n, int pos)
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    insertElementAt(n, pos);
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Remove a node.
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n Node to be added
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void removeNode(Node n)
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.removeElement(n);
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Copy NodeList members into this nodelist, adding in
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document order.  If a node is null, don't add it.
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodelist List of nodes which should now be referenced by
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this NodeSet.
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void addNodes(NodeList nodelist)
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != nodelist)  // defensive to fix a bug that Sanjiva reported.
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nChildren = nodelist.getLength();
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < nChildren; i++)
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Node obj = nodelist.item(i);
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != obj)
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          addElement(obj);
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // checkDups();
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Copy NodeList members into this nodelist, adding in
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document order.  Only genuine node references will be copied;
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * nulls appearing in the source NodeSet will
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * not be added to this one. </p>
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p> In case you're wondering why this function is needed: NodeSet
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * implements both NodeIterator and NodeList. If this method isn't
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * provided, Java can't decide which of those to use when addNodes()
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is invoked. Providing the more-explicit match avoids that
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ambiguity.)</p>
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ns NodeSet whose members should be merged into this NodeSet.
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void addNodes(NodeSet ns)
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    addNodes((NodeIterator) ns);
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Copy NodeList members into this nodelist, adding in
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document order.  Null references are not added.
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param iterator NodeIterator which yields the nodes to be added.
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void addNodes(NodeIterator iterator)
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != iterator)  // defensive to fix a bug that Sanjiva reported.
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node obj;
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (null != (obj = iterator.nextNode()))
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        addElement(obj);
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // checkDups();
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Copy NodeList members into this nodelist, adding in
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document order.  If a node is null, don't add it.
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodelist List of nodes to be added
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support The XPath runtime context.
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void addNodesInDocOrder(NodeList nodelist, XPathContext support)
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nChildren = nodelist.getLength();
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < nChildren; i++)
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node node = nodelist.item(i);
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != node)
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        addNodeInDocOrder(node, support);
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Copy NodeList members into this nodelist, adding in
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document order.  If a node is null, don't add it.
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param iterator NodeIterator which yields the nodes to be added.
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support The XPath runtime context.
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void addNodesInDocOrder(NodeIterator iterator, XPathContext support)
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Node node;
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (null != (node = iterator.nextNode()))
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      addNodeInDocOrder(node, support);
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add the node list to this node set in document order.
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param start index.
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param end index.
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param testIndex index.
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodelist The nodelist to add.
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support The XPath runtime context.
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return false always.
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean addNodesInDocOrder(int start, int end, int testIndex,
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                     NodeList nodelist, XPathContext support)
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean foundit = false;
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int i;
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Node node = nodelist.item(testIndex);
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (i = end; i >= start; i--)
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node child = (Node) elementAt(i);
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (child == node)
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        i = -2;  // Duplicate, suppress insert
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!DOM2Helper.isNodeAfter(node, child))
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        insertElementAt(node, i + 1);
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        testIndex--;
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (testIndex > 0)
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          boolean foundPrev = addNodesInDocOrder(0, i, testIndex, nodelist,
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                                 support);
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (!foundPrev)
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addNodesInDocOrder(i, size() - 1, testIndex, nodelist, support);
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (i == -1)
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      insertElementAt(node, 0);
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return foundit;
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add the node into a vector of nodes where it should occur in
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document order.
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node The node to be added.
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param test true if we should test for doc order
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support The XPath runtime context.
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return insertIndex.
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int addNodeInDocOrder(Node node, boolean test, XPathContext support)
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int insertIndex = -1;
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (test)
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // This needs to do a binary search, but a binary search
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // is somewhat tough because the sequence test involves
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // two nodes.
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int size = size(), i;
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (i = size - 1; i >= 0; i--)
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Node child = (Node) elementAt(i);
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (child == node)
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          i = -2;  // Duplicate, suppress insert
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!DOM2Helper.isNodeAfter(node, child))
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (i != -2)
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        insertIndex = i + 1;
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        insertElementAt(node, insertIndex);
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      insertIndex = this.size();
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean foundit = false;
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < insertIndex; i++)
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (this.item(i).equals(node))
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          foundit = true;
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!foundit)
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        addElement(node);
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // checkDups();
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return insertIndex;
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end addNodeInDocOrder(Vector v, Object obj)
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add the node into a vector of nodes where it should occur in
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document order.
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node The node to be added.
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support The XPath runtime context.
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The index where it was inserted.
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a mutable type.
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int addNodeInDocOrder(Node node, XPathContext support)
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return addNodeInDocOrder(node, true, support);
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }  // end addNodeInDocOrder(Vector v, Object obj)
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** If this node is being used as an iterator, the next index that nextNode()
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  will return.  */
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected int m_next = 0;
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the current position, which is one less than
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the next nextNode() call will retrieve.  i.e. if
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * you call getCurrentPos() and the return is 0, the next
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * fetch will take place at index 1.
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The the current position index.
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getCurrentPos()
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_next;
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the current position in the node set.
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param i Must be a valid index.
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a cached type, and thus doesn't permit indexed access.
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setCurrentPos(int i)
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_cacheNodes)
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_CANNOT_INDEX, null)); //"This NodeSet can not do indexing or counting functions!");
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_next = i;
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the last fetched node.  Needed to support the UnionPathIterator.
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the last fetched node.
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if this NodeSet is not of
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a cached type, and thus doesn't permit indexed access.
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Node getCurrentNode()
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_cacheNodes)
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_CANNOT_INDEX, null)); //"This NodeSet can not do indexing or counting functions!");
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int saved = m_next;
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Node n = (m_next < m_firstFree) ? elementAt(m_next) : null;
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_next = saved; // HACK: I think this is a bit of a hack.  -sb
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return n;
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** True if this list can be mutated.  */
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected boolean m_mutable = true;
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** True if this list is cached.
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial  */
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected boolean m_cacheNodes = true;
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get whether or not this is a cached node set.
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if this list is cached.
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean getShouldCacheNodes()
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_cacheNodes;
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If setShouldCacheNodes(true) is called, then nodes will
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be cached.  They are not cached by default. This switch must
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be set before the first call to nextNode is made, to ensure
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that all nodes are cached.
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param b true if this node set should be cached.
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException thrown if an attempt is made to
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * request caching after we've already begun stepping through the
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * nodes in this set.
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  */
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setShouldCacheNodes(boolean b)
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!isFresh())
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XSLMessages.createXPATHMessage(XPATHErrorResources.ER_CANNOT_CALL_SETSHOULDCACHENODE, null)); //"Can not call setShouldCacheNodes after nextNode has been called!");
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_cacheNodes = b;
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_mutable = true;
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient private int m_last = 0;
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getLast()
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_last;
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setLast(int last)
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_last = last;
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Size of blocks to allocate.
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial          */
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int m_blocksize;
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Array of nodes this points to.
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial          */
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  Node m_map[];
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Number of nodes in this NodeVector.
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial          */
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int m_firstFree = 0;
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Size of the array this points to.
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial           */
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int m_mapSize;  // lazy initialization
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a cloned LocPathIterator.
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A clone of this
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws CloneNotSupportedException
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Object clone() throws CloneNotSupportedException
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    NodeSet clone = (NodeSet) super.clone();
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((null != this.m_map) && (this.m_map == clone.m_map))
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      clone.m_map = new Node[this.m_map.length];
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.arraycopy(this.m_map, 0, clone.m_map, 0, this.m_map.length);
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return clone;
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the length of the list.
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Number of nodes in this NodeVector
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int size()
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_firstFree;
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Append a Node onto the vector.
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value Node to add to the vector
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void addElement(Node value)
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((m_firstFree + 1) >= m_mapSize)
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == m_map)
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_map = new Node[m_blocksize];
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_mapSize = m_blocksize;
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_mapSize += m_blocksize;
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Node newMap[] = new Node[m_mapSize];
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_map = newMap;
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree] = value;
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree++;
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Append a Node onto the vector.
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value Node to add to the vector
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final void push(Node value)
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int ff = m_firstFree;
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((ff + 1) >= m_mapSize)
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == m_map)
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_map = new Node[m_blocksize];
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_mapSize = m_blocksize;
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_mapSize += m_blocksize;
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Node newMap[] = new Node[m_mapSize];
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.arraycopy(m_map, 0, newMap, 0, ff + 1);
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_map = newMap;
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[ff] = value;
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ff++;
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree = ff;
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Pop a node from the tail of the vector and return the result.
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the node at the tail of the vector
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final Node pop()
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree--;
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Node n = m_map[m_firstFree];
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree] = null;
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return n;
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Pop a node from the tail of the vector and return the
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * top of the stack after the pop.
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The top of the stack after it's been popped
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final Node popAndTop()
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree--;
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree] = null;
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (m_firstFree == 0) ? null : m_map[m_firstFree - 1];
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Pop a node from the tail of the vector.
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final void popQuick()
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree--;
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree] = null;
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the node at the top of the stack without popping the stack.
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Special purpose method for TransformerImpl, pushElemTemplateElement.
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Performance critical.
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Node at the top of the stack or null if stack is empty.
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final Node peepOrNull()
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return ((null != m_map) && (m_firstFree > 0))
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           ? m_map[m_firstFree - 1] : null;
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Push a pair of nodes into the stack.
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Special purpose method for TransformerImpl, pushElemTemplateElement.
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Performance critical.
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param v1 First node to add to vector
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param v2 Second node to add to vector
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final void pushPair(Node v1, Node v2)
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_map = new Node[m_blocksize];
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_mapSize = m_blocksize;
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if ((m_firstFree + 2) >= m_mapSize)
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_mapSize += m_blocksize;
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Node newMap[] = new Node[m_mapSize];
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.arraycopy(m_map, 0, newMap, 0, m_firstFree);
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_map = newMap;
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree] = v1;
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree + 1] = v2;
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree += 2;
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Pop a pair of nodes from the tail of the stack.
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Special purpose method for TransformerImpl, pushElemTemplateElement.
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Performance critical.
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final void popPair()
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree -= 2;
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree] = null;
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree + 1] = null;
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the tail of the stack to the given node.
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Special purpose method for TransformerImpl, pushElemTemplateElement.
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Performance critical.
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n Node to set at the tail of vector
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final void setTail(Node n)
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree - 1] = n;
10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the given node one position from the tail.
10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Special purpose method for TransformerImpl, pushElemTemplateElement.
10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Performance critical.
10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n Node to set
10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final void setTailSub1(Node n)
10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree - 2] = n;
10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the node at the tail of the vector without popping
10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Special purpose method for TransformerImpl, pushElemTemplateElement.
10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Performance critical.
10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Node at the tail of the vector
10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final Node peepTail()
10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_map[m_firstFree - 1];
10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the node one position from the tail without popping.
10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Special purpose method for TransformerImpl, pushElemTemplateElement.
10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Performance critical.
10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Node one away from the tail
10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final Node peepTailSub1()
10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_map[m_firstFree - 2];
10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Inserts the specified node in this vector at the specified index.
10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Each component in this vector with an index greater or equal to
10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the specified index is shifted upward to have an index one greater
10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * than the value it had previously.
10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value Node to insert
11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param at Position where to insert
11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void insertElementAt(Node value, int at)
11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_map = new Node[m_blocksize];
11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_mapSize = m_blocksize;
11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if ((m_firstFree + 1) >= m_mapSize)
11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_mapSize += m_blocksize;
11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node newMap[] = new Node[m_mapSize];
11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_map = newMap;
11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (at <= (m_firstFree - 1))
11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.arraycopy(m_map, at, m_map, at + 1, m_firstFree - at);
11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[at] = value;
11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree++;
11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Append the nodes to the list.
11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodes NodeVector to append to this list
11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void appendNodes(NodeSet nodes)
11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nNodes = nodes.size();
11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_mapSize = nNodes + m_blocksize;
11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_map = new Node[m_mapSize];
11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if ((m_firstFree + nNodes) >= m_mapSize)
11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_mapSize += (nNodes + m_blocksize);
11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node newMap[] = new Node[m_mapSize];
11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.arraycopy(m_map, 0, newMap, 0, m_firstFree + nNodes);
11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_map = newMap;
11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    System.arraycopy(nodes.m_map, 0, m_map, m_firstFree, nNodes);
11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree += nNodes;
11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Inserts the specified node in this vector at the specified index.
11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Each component in this vector with an index greater or equal to
11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the specified index is shifted upward to have an index one greater
11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * than the value it had previously.
11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void removeAllElements()
11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return;
11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < m_firstFree; i++)
11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_map[i] = null;
11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree = 0;
11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Removes the first occurrence of the argument from this vector.
11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If the object is found in this vector, each component in the vector
11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with an index greater or equal to the object's index is shifted
11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * downward to have an index one smaller than the value it had
11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * previously.
11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s Node to remove from the list
11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if the node was successfully removed
11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean removeElement(Node s)
11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return false;
12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < m_firstFree; i++)
12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node node = m_map[i];
12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if ((null != node) && node.equals(s))
12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (i < m_firstFree - 1)
12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          System.arraycopy(m_map, i + 1, m_map, i, m_firstFree - i - 1);
12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_firstFree--;
12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_map[m_firstFree] = null;
12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Deletes the component at the specified index. Each component in
12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this vector with an index greater or equal to the specified
12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * index is shifted downward to have an index one smaller than
12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the value it had previously.
12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param i Index of node to remove
12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void removeElementAt(int i)
12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return;
12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (i >= m_firstFree)
12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new ArrayIndexOutOfBoundsException(i + " >= " + m_firstFree);
12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (i < 0)
12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new ArrayIndexOutOfBoundsException(i);
12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (i < m_firstFree - 1)
12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.arraycopy(m_map, i + 1, m_map, i, m_firstFree - i - 1);
12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstFree--;
12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[m_firstFree] = null;
12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Sets the component at the specified index of this vector to be the
12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * specified object. The previous component at that position is discarded.
12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The index must be a value greater than or equal to 0 and less
12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * than the current size of the vector.
12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node Node to set
12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param index Index of where to set the node
12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setElementAt(Node node, int index)
12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_mutable)
12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_NOT_MUTABLE, null)); //"This NodeSet is not mutable!");
12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_map = new Node[m_blocksize];
12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_mapSize = m_blocksize;
12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_map[index] = node;
12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the nth element.
12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param i Index of node to get
12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Node at specified index
12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Node elementAt(int i)
12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_map[i];
12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if the table contains the given node.
12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s Node to look for
12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if the given node was found.
12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean contains(Node s)
12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    runTo(-1);
12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return false;
13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < m_firstFree; i++)
13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node node = m_map[i];
13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if ((null != node) && node.equals(s))
13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Searches for the first occurence of the given argument,
13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * beginning the search at index, and testing for equality
13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * using the equals method.
13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elem Node to look for
13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param index Index of where to start the search
13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the index of the first occurrence of the object
13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * argument in this vector at position index or later in the
13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * vector; returns -1 if the object is not found.
13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int indexOf(Node elem, int index)
13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    runTo(-1);
13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return -1;
13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = index; i < m_firstFree; i++)
13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node node = m_map[i];
13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if ((null != node) && node.equals(elem))
13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return i;
13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return -1;
13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Searches for the first occurence of the given argument,
13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * beginning the search at index, and testing for equality
13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * using the equals method.
13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elem Node to look for
13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the index of the first occurrence of the object
13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * argument in this vector at position index or later in the
13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * vector; returns -1 if the object is not found.
13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int indexOf(Node elem)
13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    runTo(-1);
13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_map)
13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return -1;
13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < m_firstFree; i++)
13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node node = m_map[i];
13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if ((null != node) && node.equals(elem))
13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return i;
13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return -1;
13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
1371