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