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