<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<FONT color="green">003</FONT>     * or more contributor license agreements. See the NOTICE file<a name="line.3"></a>
<FONT color="green">004</FONT>     * distributed with this work for additional information<a name="line.4"></a>
<FONT color="green">005</FONT>     * regarding copyright ownership. The ASF licenses this file<a name="line.5"></a>
<FONT color="green">006</FONT>     * to you under the Apache License, Version 2.0 (the  "License");<a name="line.6"></a>
<FONT color="green">007</FONT>     * you may not use this file except in compliance with the License.<a name="line.7"></a>
<FONT color="green">008</FONT>     * You may obtain a copy of the License at<a name="line.8"></a>
<FONT color="green">009</FONT>     *<a name="line.9"></a>
<FONT color="green">010</FONT>     *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<FONT color="green">011</FONT>     *<a name="line.11"></a>
<FONT color="green">012</FONT>     * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
<FONT color="green">013</FONT>     * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
<FONT color="green">014</FONT>     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
<FONT color="green">015</FONT>     * See the License for the specific language governing permissions and<a name="line.15"></a>
<FONT color="green">016</FONT>     * limitations under the License.<a name="line.16"></a>
<FONT color="green">017</FONT>     */<a name="line.17"></a>
<FONT color="green">018</FONT>    /*<a name="line.18"></a>
<FONT color="green">019</FONT>     * $Id: NodeSequence.java 469367 2006-10-31 04:41:08Z minchau $<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    package org.apache.xpath.axes;<a name="line.21"></a>
<FONT color="green">022</FONT>    <a name="line.22"></a>
<FONT color="green">023</FONT>    import java.util.Vector;<a name="line.23"></a>
<FONT color="green">024</FONT>    <a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.xml.dtm.DTM;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.xml.dtm.DTMFilter;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.xml.dtm.DTMIterator;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.xml.dtm.DTMManager;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.xml.utils.NodeVector;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.xpath.NodeSetDTM;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.xpath.XPathContext;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.xpath.objects.XObject;<a name="line.32"></a>
<FONT color="green">033</FONT>    <a name="line.33"></a>
<FONT color="green">034</FONT>    /**<a name="line.34"></a>
<FONT color="green">035</FONT>     * This class is the dynamic wrapper for a Xalan DTMIterator instance, and <a name="line.35"></a>
<FONT color="green">036</FONT>     * provides random access capabilities.<a name="line.36"></a>
<FONT color="green">037</FONT>     */<a name="line.37"></a>
<FONT color="green">038</FONT>    public class NodeSequence extends XObject<a name="line.38"></a>
<FONT color="green">039</FONT>      implements DTMIterator, Cloneable, PathComponent<a name="line.39"></a>
<FONT color="green">040</FONT>    {<a name="line.40"></a>
<FONT color="green">041</FONT>        static final long serialVersionUID = 3866261934726581044L;<a name="line.41"></a>
<FONT color="green">042</FONT>      /** The index of the last node in the iteration. */<a name="line.42"></a>
<FONT color="green">043</FONT>      protected int m_last = -1;<a name="line.43"></a>
<FONT color="green">044</FONT>      <a name="line.44"></a>
<FONT color="green">045</FONT>      /**<a name="line.45"></a>
<FONT color="green">046</FONT>       * The index of the next node to be fetched.  Useful if this<a name="line.46"></a>
<FONT color="green">047</FONT>       * is a cached iterator, and is being used as random access<a name="line.47"></a>
<FONT color="green">048</FONT>       * NodeList.<a name="line.48"></a>
<FONT color="green">049</FONT>       */<a name="line.49"></a>
<FONT color="green">050</FONT>      protected int m_next = 0;<a name="line.50"></a>
<FONT color="green">051</FONT>        <a name="line.51"></a>
<FONT color="green">052</FONT>      /**<a name="line.52"></a>
<FONT color="green">053</FONT>       * A cache of a list of nodes obtained from the iterator so far.<a name="line.53"></a>
<FONT color="green">054</FONT>       * This list is appended to until the iterator is exhausted and<a name="line.54"></a>
<FONT color="green">055</FONT>       * the cache is complete.<a name="line.55"></a>
<FONT color="green">056</FONT>       * &lt;p&gt;<a name="line.56"></a>
<FONT color="green">057</FONT>       * Multiple NodeSequence objects may share the same cache.<a name="line.57"></a>
<FONT color="green">058</FONT>       */<a name="line.58"></a>
<FONT color="green">059</FONT>      private IteratorCache m_cache;<a name="line.59"></a>
<FONT color="green">060</FONT>      <a name="line.60"></a>
<FONT color="green">061</FONT>      /**<a name="line.61"></a>
<FONT color="green">062</FONT>       * If this iterator needs to cache nodes that are fetched, they<a name="line.62"></a>
<FONT color="green">063</FONT>       * are stored in the Vector in the generic object.<a name="line.63"></a>
<FONT color="green">064</FONT>       */<a name="line.64"></a>
<FONT color="green">065</FONT>      protected NodeVector getVector() {<a name="line.65"></a>
<FONT color="green">066</FONT>          NodeVector nv = (m_cache != null) ?  m_cache.getVector() : null;<a name="line.66"></a>
<FONT color="green">067</FONT>          return nv;<a name="line.67"></a>
<FONT color="green">068</FONT>      }<a name="line.68"></a>
<FONT color="green">069</FONT>      <a name="line.69"></a>
<FONT color="green">070</FONT>      /**<a name="line.70"></a>
<FONT color="green">071</FONT>       * Get the cache (if any) of nodes obtained from<a name="line.71"></a>
<FONT color="green">072</FONT>       * the iterator so far. Note that the cache keeps<a name="line.72"></a>
<FONT color="green">073</FONT>       * growing until the iterator is walked to exhaustion,<a name="line.73"></a>
<FONT color="green">074</FONT>       * at which point the cache is "complete".<a name="line.74"></a>
<FONT color="green">075</FONT>       */<a name="line.75"></a>
<FONT color="green">076</FONT>      private IteratorCache getCache() {<a name="line.76"></a>
<FONT color="green">077</FONT>          return m_cache;<a name="line.77"></a>
<FONT color="green">078</FONT>      }<a name="line.78"></a>
<FONT color="green">079</FONT>      <a name="line.79"></a>
<FONT color="green">080</FONT>      /**<a name="line.80"></a>
<FONT color="green">081</FONT>       * Set the vector where nodes will be cached.<a name="line.81"></a>
<FONT color="green">082</FONT>       */<a name="line.82"></a>
<FONT color="green">083</FONT>      protected void SetVector(NodeVector v)<a name="line.83"></a>
<FONT color="green">084</FONT>      {<a name="line.84"></a>
<FONT color="green">085</FONT>            setObject(v);<a name="line.85"></a>
<FONT color="green">086</FONT>      }<a name="line.86"></a>
<FONT color="green">087</FONT>    <a name="line.87"></a>
<FONT color="green">088</FONT>      <a name="line.88"></a>
<FONT color="green">089</FONT>      /**<a name="line.89"></a>
<FONT color="green">090</FONT>       * If the iterator needs to cache nodes as they are fetched,<a name="line.90"></a>
<FONT color="green">091</FONT>       * then this method returns true. <a name="line.91"></a>
<FONT color="green">092</FONT>       */<a name="line.92"></a>
<FONT color="green">093</FONT>      public boolean hasCache()<a name="line.93"></a>
<FONT color="green">094</FONT>      {<a name="line.94"></a>
<FONT color="green">095</FONT>        final NodeVector nv = getVector();<a name="line.95"></a>
<FONT color="green">096</FONT>            return (nv != null);<a name="line.96"></a>
<FONT color="green">097</FONT>      }<a name="line.97"></a>
<FONT color="green">098</FONT>      <a name="line.98"></a>
<FONT color="green">099</FONT>      /**<a name="line.99"></a>
<FONT color="green">100</FONT>       * If this NodeSequence has a cache, and that cache is <a name="line.100"></a>
<FONT color="green">101</FONT>       * fully populated then this method returns true, otherwise<a name="line.101"></a>
<FONT color="green">102</FONT>       * if there is no cache or it is not complete it returns false.<a name="line.102"></a>
<FONT color="green">103</FONT>       */<a name="line.103"></a>
<FONT color="green">104</FONT>      private boolean cacheComplete() {<a name="line.104"></a>
<FONT color="green">105</FONT>          final boolean complete;<a name="line.105"></a>
<FONT color="green">106</FONT>          if (m_cache != null) {<a name="line.106"></a>
<FONT color="green">107</FONT>              complete = m_cache.isComplete();<a name="line.107"></a>
<FONT color="green">108</FONT>          } else {<a name="line.108"></a>
<FONT color="green">109</FONT>              complete = false;<a name="line.109"></a>
<FONT color="green">110</FONT>          }<a name="line.110"></a>
<FONT color="green">111</FONT>          return complete;<a name="line.111"></a>
<FONT color="green">112</FONT>      }<a name="line.112"></a>
<FONT color="green">113</FONT>      <a name="line.113"></a>
<FONT color="green">114</FONT>      /**<a name="line.114"></a>
<FONT color="green">115</FONT>       * If this NodeSequence has a cache, mark that it is complete.<a name="line.115"></a>
<FONT color="green">116</FONT>       * This method should be called after the iterator is exhausted.<a name="line.116"></a>
<FONT color="green">117</FONT>       */<a name="line.117"></a>
<FONT color="green">118</FONT>      private void markCacheComplete() {<a name="line.118"></a>
<FONT color="green">119</FONT>          NodeVector nv = getVector();<a name="line.119"></a>
<FONT color="green">120</FONT>          if (nv != null) {<a name="line.120"></a>
<FONT color="green">121</FONT>              m_cache.setCacheComplete(true);<a name="line.121"></a>
<FONT color="green">122</FONT>          }      <a name="line.122"></a>
<FONT color="green">123</FONT>      }<a name="line.123"></a>
<FONT color="green">124</FONT>    <a name="line.124"></a>
<FONT color="green">125</FONT>    <a name="line.125"></a>
<FONT color="green">126</FONT>      /**<a name="line.126"></a>
<FONT color="green">127</FONT>       * The functional iterator that fetches nodes.<a name="line.127"></a>
<FONT color="green">128</FONT>       */<a name="line.128"></a>
<FONT color="green">129</FONT>      protected DTMIterator m_iter;<a name="line.129"></a>
<FONT color="green">130</FONT>      <a name="line.130"></a>
<FONT color="green">131</FONT>      /**<a name="line.131"></a>
<FONT color="green">132</FONT>       * Set the functional iterator that fetches nodes.<a name="line.132"></a>
<FONT color="green">133</FONT>       * @param iter The iterator that is to be contained.<a name="line.133"></a>
<FONT color="green">134</FONT>       */<a name="line.134"></a>
<FONT color="green">135</FONT>      public final void setIter(DTMIterator iter)<a name="line.135"></a>
<FONT color="green">136</FONT>      {<a name="line.136"></a>
<FONT color="green">137</FONT>            m_iter = iter;<a name="line.137"></a>
<FONT color="green">138</FONT>      }<a name="line.138"></a>
<FONT color="green">139</FONT>      <a name="line.139"></a>
<FONT color="green">140</FONT>      /**<a name="line.140"></a>
<FONT color="green">141</FONT>       * Get the functional iterator that fetches nodes.<a name="line.141"></a>
<FONT color="green">142</FONT>       * @return The contained iterator.<a name="line.142"></a>
<FONT color="green">143</FONT>       */<a name="line.143"></a>
<FONT color="green">144</FONT>      public final DTMIterator getContainedIter()<a name="line.144"></a>
<FONT color="green">145</FONT>      {<a name="line.145"></a>
<FONT color="green">146</FONT>            return m_iter;<a name="line.146"></a>
<FONT color="green">147</FONT>      }<a name="line.147"></a>
<FONT color="green">148</FONT>      <a name="line.148"></a>
<FONT color="green">149</FONT>      /**<a name="line.149"></a>
<FONT color="green">150</FONT>       * The DTMManager to use if we're using a NodeVector only.<a name="line.150"></a>
<FONT color="green">151</FONT>       * We may well want to do away with this, and store it in the NodeVector.<a name="line.151"></a>
<FONT color="green">152</FONT>       */<a name="line.152"></a>
<FONT color="green">153</FONT>      protected DTMManager m_dtmMgr;<a name="line.153"></a>
<FONT color="green">154</FONT>      <a name="line.154"></a>
<FONT color="green">155</FONT>      // ==== Constructors ====<a name="line.155"></a>
<FONT color="green">156</FONT>      <a name="line.156"></a>
<FONT color="green">157</FONT>      /**<a name="line.157"></a>
<FONT color="green">158</FONT>       * Create a new NodeSequence from a (already cloned) iterator.<a name="line.158"></a>
<FONT color="green">159</FONT>       * <a name="line.159"></a>
<FONT color="green">160</FONT>       * @param iter Cloned (not static) DTMIterator.<a name="line.160"></a>
<FONT color="green">161</FONT>       * @param context The initial context node.<a name="line.161"></a>
<FONT color="green">162</FONT>       * @param xctxt The execution context.<a name="line.162"></a>
<FONT color="green">163</FONT>       * @param shouldCacheNodes True if this sequence can random access.<a name="line.163"></a>
<FONT color="green">164</FONT>       */<a name="line.164"></a>
<FONT color="green">165</FONT>      private NodeSequence(DTMIterator iter, int context, XPathContext xctxt, boolean shouldCacheNodes)<a name="line.165"></a>
<FONT color="green">166</FONT>      {<a name="line.166"></a>
<FONT color="green">167</FONT>            setIter(iter);<a name="line.167"></a>
<FONT color="green">168</FONT>            setRoot(context, xctxt);<a name="line.168"></a>
<FONT color="green">169</FONT>            setShouldCacheNodes(shouldCacheNodes);<a name="line.169"></a>
<FONT color="green">170</FONT>      }<a name="line.170"></a>
<FONT color="green">171</FONT>      <a name="line.171"></a>
<FONT color="green">172</FONT>      /**<a name="line.172"></a>
<FONT color="green">173</FONT>       * Create a new NodeSequence from a (already cloned) iterator.<a name="line.173"></a>
<FONT color="green">174</FONT>       * <a name="line.174"></a>
<FONT color="green">175</FONT>       * @param nodeVector<a name="line.175"></a>
<FONT color="green">176</FONT>       */<a name="line.176"></a>
<FONT color="green">177</FONT>      public NodeSequence(Object nodeVector)<a name="line.177"></a>
<FONT color="green">178</FONT>      {<a name="line.178"></a>
<FONT color="green">179</FONT>            super(nodeVector);<a name="line.179"></a>
<FONT color="green">180</FONT>        if (nodeVector instanceof NodeVector) {<a name="line.180"></a>
<FONT color="green">181</FONT>            SetVector((NodeVector) nodeVector);<a name="line.181"></a>
<FONT color="green">182</FONT>        }<a name="line.182"></a>
<FONT color="green">183</FONT>            if(null != nodeVector)<a name="line.183"></a>
<FONT color="green">184</FONT>            {<a name="line.184"></a>
<FONT color="green">185</FONT>                    assertion(nodeVector instanceof NodeVector, <a name="line.185"></a>
<FONT color="green">186</FONT>                            "Must have a NodeVector as the object for NodeSequence!");<a name="line.186"></a>
<FONT color="green">187</FONT>                    if(nodeVector instanceof DTMIterator)<a name="line.187"></a>
<FONT color="green">188</FONT>                    {<a name="line.188"></a>
<FONT color="green">189</FONT>                            setIter((DTMIterator)nodeVector);<a name="line.189"></a>
<FONT color="green">190</FONT>                            m_last = ((DTMIterator)nodeVector).getLength();<a name="line.190"></a>
<FONT color="green">191</FONT>                    }<a name="line.191"></a>
<FONT color="green">192</FONT>                    <a name="line.192"></a>
<FONT color="green">193</FONT>            }<a name="line.193"></a>
<FONT color="green">194</FONT>      }<a name="line.194"></a>
<FONT color="green">195</FONT>      <a name="line.195"></a>
<FONT color="green">196</FONT>      /**<a name="line.196"></a>
<FONT color="green">197</FONT>       * Construct an empty XNodeSet object.  This is used to create a mutable <a name="line.197"></a>
<FONT color="green">198</FONT>       * nodeset to which random nodes may be added.<a name="line.198"></a>
<FONT color="green">199</FONT>       */<a name="line.199"></a>
<FONT color="green">200</FONT>      private NodeSequence(DTMManager dtmMgr)<a name="line.200"></a>
<FONT color="green">201</FONT>      {<a name="line.201"></a>
<FONT color="green">202</FONT>        super(new NodeVector());<a name="line.202"></a>
<FONT color="green">203</FONT>        m_last = 0;<a name="line.203"></a>
<FONT color="green">204</FONT>        m_dtmMgr = dtmMgr;<a name="line.204"></a>
<FONT color="green">205</FONT>      }<a name="line.205"></a>
<FONT color="green">206</FONT>    <a name="line.206"></a>
<FONT color="green">207</FONT>      <a name="line.207"></a>
<FONT color="green">208</FONT>      /**<a name="line.208"></a>
<FONT color="green">209</FONT>       * Create a new NodeSequence in an invalid (null) state.<a name="line.209"></a>
<FONT color="green">210</FONT>       */<a name="line.210"></a>
<FONT color="green">211</FONT>      public NodeSequence()<a name="line.211"></a>
<FONT color="green">212</FONT>      {<a name="line.212"></a>
<FONT color="green">213</FONT>          return;<a name="line.213"></a>
<FONT color="green">214</FONT>      }<a name="line.214"></a>
<FONT color="green">215</FONT>    <a name="line.215"></a>
<FONT color="green">216</FONT>    <a name="line.216"></a>
<FONT color="green">217</FONT>      /**<a name="line.217"></a>
<FONT color="green">218</FONT>       * @see DTMIterator#getDTM(int)<a name="line.218"></a>
<FONT color="green">219</FONT>       */<a name="line.219"></a>
<FONT color="green">220</FONT>      public DTM getDTM(int nodeHandle)<a name="line.220"></a>
<FONT color="green">221</FONT>      {<a name="line.221"></a>
<FONT color="green">222</FONT>            DTMManager mgr = getDTMManager();<a name="line.222"></a>
<FONT color="green">223</FONT>            if(null != mgr)<a name="line.223"></a>
<FONT color="green">224</FONT>            return getDTMManager().getDTM(nodeHandle);<a name="line.224"></a>
<FONT color="green">225</FONT>        else<a name="line.225"></a>
<FONT color="green">226</FONT>        {<a name="line.226"></a>
<FONT color="green">227</FONT>            assertion(false, "Can not get a DTM Unless a DTMManager has been set!");<a name="line.227"></a>
<FONT color="green">228</FONT>            return null;<a name="line.228"></a>
<FONT color="green">229</FONT>        }<a name="line.229"></a>
<FONT color="green">230</FONT>      }<a name="line.230"></a>
<FONT color="green">231</FONT>    <a name="line.231"></a>
<FONT color="green">232</FONT>      /**<a name="line.232"></a>
<FONT color="green">233</FONT>       * @see DTMIterator#getDTMManager()<a name="line.233"></a>
<FONT color="green">234</FONT>       */<a name="line.234"></a>
<FONT color="green">235</FONT>      public DTMManager getDTMManager()<a name="line.235"></a>
<FONT color="green">236</FONT>      {<a name="line.236"></a>
<FONT color="green">237</FONT>        return m_dtmMgr;<a name="line.237"></a>
<FONT color="green">238</FONT>      }<a name="line.238"></a>
<FONT color="green">239</FONT>    <a name="line.239"></a>
<FONT color="green">240</FONT>      /**<a name="line.240"></a>
<FONT color="green">241</FONT>       * @see DTMIterator#getRoot()<a name="line.241"></a>
<FONT color="green">242</FONT>       */<a name="line.242"></a>
<FONT color="green">243</FONT>      public int getRoot()<a name="line.243"></a>
<FONT color="green">244</FONT>      {<a name="line.244"></a>
<FONT color="green">245</FONT>            if(null != m_iter)<a name="line.245"></a>
<FONT color="green">246</FONT>            return m_iter.getRoot();<a name="line.246"></a>
<FONT color="green">247</FONT>            else<a name="line.247"></a>
<FONT color="green">248</FONT>            {<a name="line.248"></a>
<FONT color="green">249</FONT>                    // NodeSetDTM will call this, and so it's not a good thing to throw <a name="line.249"></a>
<FONT color="green">250</FONT>                    // an assertion here.<a name="line.250"></a>
<FONT color="green">251</FONT>                    // assertion(false, "Can not get the root from a non-iterated NodeSequence!");<a name="line.251"></a>
<FONT color="green">252</FONT>                    return DTM.NULL;<a name="line.252"></a>
<FONT color="green">253</FONT>            }<a name="line.253"></a>
<FONT color="green">254</FONT>      }<a name="line.254"></a>
<FONT color="green">255</FONT>    <a name="line.255"></a>
<FONT color="green">256</FONT>      /**<a name="line.256"></a>
<FONT color="green">257</FONT>       * @see DTMIterator#setRoot(int, Object)<a name="line.257"></a>
<FONT color="green">258</FONT>       */<a name="line.258"></a>
<FONT color="green">259</FONT>      public void setRoot(int nodeHandle, Object environment)<a name="line.259"></a>
<FONT color="green">260</FONT>      {<a name="line.260"></a>
<FONT color="green">261</FONT>            if(null != m_iter)<a name="line.261"></a>
<FONT color="green">262</FONT>            {<a name="line.262"></a>
<FONT color="green">263</FONT>                    XPathContext xctxt = (XPathContext)environment;<a name="line.263"></a>
<FONT color="green">264</FONT>                    m_dtmMgr = xctxt.getDTMManager();<a name="line.264"></a>
<FONT color="green">265</FONT>                    m_iter.setRoot(nodeHandle, environment);<a name="line.265"></a>
<FONT color="green">266</FONT>                    if(!m_iter.isDocOrdered())<a name="line.266"></a>
<FONT color="green">267</FONT>                    {<a name="line.267"></a>
<FONT color="green">268</FONT>                            if(!hasCache())<a name="line.268"></a>
<FONT color="green">269</FONT>                                    setShouldCacheNodes(true);<a name="line.269"></a>
<FONT color="green">270</FONT>                            runTo(-1);<a name="line.270"></a>
<FONT color="green">271</FONT>                            m_next=0;<a name="line.271"></a>
<FONT color="green">272</FONT>                    }<a name="line.272"></a>
<FONT color="green">273</FONT>            }<a name="line.273"></a>
<FONT color="green">274</FONT>            else<a name="line.274"></a>
<FONT color="green">275</FONT>                    assertion(false, "Can not setRoot on a non-iterated NodeSequence!");<a name="line.275"></a>
<FONT color="green">276</FONT>      }<a name="line.276"></a>
<FONT color="green">277</FONT>    <a name="line.277"></a>
<FONT color="green">278</FONT>      /**<a name="line.278"></a>
<FONT color="green">279</FONT>       * @see DTMIterator#reset()<a name="line.279"></a>
<FONT color="green">280</FONT>       */<a name="line.280"></a>
<FONT color="green">281</FONT>      public void reset()<a name="line.281"></a>
<FONT color="green">282</FONT>      {<a name="line.282"></a>
<FONT color="green">283</FONT>            m_next = 0;<a name="line.283"></a>
<FONT color="green">284</FONT>            // not resetting the iterator on purpose!!!<a name="line.284"></a>
<FONT color="green">285</FONT>      }<a name="line.285"></a>
<FONT color="green">286</FONT>    <a name="line.286"></a>
<FONT color="green">287</FONT>      /**<a name="line.287"></a>
<FONT color="green">288</FONT>       * @see DTMIterator#getWhatToShow()<a name="line.288"></a>
<FONT color="green">289</FONT>       */<a name="line.289"></a>
<FONT color="green">290</FONT>      public int getWhatToShow()<a name="line.290"></a>
<FONT color="green">291</FONT>      {<a name="line.291"></a>
<FONT color="green">292</FONT>        return hasCache() ? (DTMFilter.SHOW_ALL &amp; ~DTMFilter.SHOW_ENTITY_REFERENCE) <a name="line.292"></a>
<FONT color="green">293</FONT>            : m_iter.getWhatToShow();<a name="line.293"></a>
<FONT color="green">294</FONT>      }<a name="line.294"></a>
<FONT color="green">295</FONT>    <a name="line.295"></a>
<FONT color="green">296</FONT>      /**<a name="line.296"></a>
<FONT color="green">297</FONT>       * @see DTMIterator#getExpandEntityReferences()<a name="line.297"></a>
<FONT color="green">298</FONT>       */<a name="line.298"></a>
<FONT color="green">299</FONT>      public boolean getExpandEntityReferences()<a name="line.299"></a>
<FONT color="green">300</FONT>      {<a name="line.300"></a>
<FONT color="green">301</FONT>            if(null != m_iter)<a name="line.301"></a>
<FONT color="green">302</FONT>                    return m_iter.getExpandEntityReferences();<a name="line.302"></a>
<FONT color="green">303</FONT>            else<a name="line.303"></a>
<FONT color="green">304</FONT>            return true;<a name="line.304"></a>
<FONT color="green">305</FONT>      }<a name="line.305"></a>
<FONT color="green">306</FONT>    <a name="line.306"></a>
<FONT color="green">307</FONT>      /**<a name="line.307"></a>
<FONT color="green">308</FONT>       * @see DTMIterator#nextNode()<a name="line.308"></a>
<FONT color="green">309</FONT>       */<a name="line.309"></a>
<FONT color="green">310</FONT>      public int nextNode()<a name="line.310"></a>
<FONT color="green">311</FONT>      {<a name="line.311"></a>
<FONT color="green">312</FONT>        // If the cache is on, and the node has already been found, then <a name="line.312"></a>
<FONT color="green">313</FONT>        // just return from the list.<a name="line.313"></a>
<FONT color="green">314</FONT>        NodeVector vec = getVector();<a name="line.314"></a>
<FONT color="green">315</FONT>        if (null != vec)<a name="line.315"></a>
<FONT color="green">316</FONT>        {   <a name="line.316"></a>
<FONT color="green">317</FONT>            // There is a cache<a name="line.317"></a>
<FONT color="green">318</FONT>            if(m_next &lt; vec.size())<a name="line.318"></a>
<FONT color="green">319</FONT>            {<a name="line.319"></a>
<FONT color="green">320</FONT>                // The node is in the cache, so just return it.<a name="line.320"></a>
<FONT color="green">321</FONT>                            int next = vec.elementAt(m_next);<a name="line.321"></a>
<FONT color="green">322</FONT>                    m_next++;<a name="line.322"></a>
<FONT color="green">323</FONT>                    return next;<a name="line.323"></a>
<FONT color="green">324</FONT>            }<a name="line.324"></a>
<FONT color="green">325</FONT>            else if(cacheComplete() || (-1 != m_last) || (null == m_iter))<a name="line.325"></a>
<FONT color="green">326</FONT>            {<a name="line.326"></a>
<FONT color="green">327</FONT>                    m_next++;<a name="line.327"></a>
<FONT color="green">328</FONT>                    return DTM.NULL;<a name="line.328"></a>
<FONT color="green">329</FONT>            }<a name="line.329"></a>
<FONT color="green">330</FONT>        }<a name="line.330"></a>
<FONT color="green">331</FONT>        <a name="line.331"></a>
<FONT color="green">332</FONT>      if (null == m_iter)<a name="line.332"></a>
<FONT color="green">333</FONT>        return DTM.NULL;<a name="line.333"></a>
<FONT color="green">334</FONT>      <a name="line.334"></a>
<FONT color="green">335</FONT>            int next = m_iter.nextNode();<a name="line.335"></a>
<FONT color="green">336</FONT>        if(DTM.NULL != next)<a name="line.336"></a>
<FONT color="green">337</FONT>        {<a name="line.337"></a>
<FONT color="green">338</FONT>            if(hasCache())<a name="line.338"></a>
<FONT color="green">339</FONT>            {<a name="line.339"></a>
<FONT color="green">340</FONT>                    if(m_iter.isDocOrdered())<a name="line.340"></a>
<FONT color="green">341</FONT>                {<a name="line.341"></a>
<FONT color="green">342</FONT>                            getVector().addElement(next);<a name="line.342"></a>
<FONT color="green">343</FONT>                            m_next++;<a name="line.343"></a>
<FONT color="green">344</FONT>                    }<a name="line.344"></a>
<FONT color="green">345</FONT>                    else<a name="line.345"></a>
<FONT color="green">346</FONT>                    {<a name="line.346"></a>
<FONT color="green">347</FONT>                            int insertIndex = addNodeInDocOrder(next);<a name="line.347"></a>
<FONT color="green">348</FONT>                            if(insertIndex &gt;= 0)<a name="line.348"></a>
<FONT color="green">349</FONT>                                    m_next++;<a name="line.349"></a>
<FONT color="green">350</FONT>                    }<a name="line.350"></a>
<FONT color="green">351</FONT>            }<a name="line.351"></a>
<FONT color="green">352</FONT>            else<a name="line.352"></a>
<FONT color="green">353</FONT>                    m_next++;<a name="line.353"></a>
<FONT color="green">354</FONT>        }<a name="line.354"></a>
<FONT color="green">355</FONT>        else<a name="line.355"></a>
<FONT color="green">356</FONT>        {<a name="line.356"></a>
<FONT color="green">357</FONT>            // We have exhausted the iterator, and if there is a cache<a name="line.357"></a>
<FONT color="green">358</FONT>            // it must have all nodes in it by now, so let the cache<a name="line.358"></a>
<FONT color="green">359</FONT>            // know that it is complete.<a name="line.359"></a>
<FONT color="green">360</FONT>            markCacheComplete();<a name="line.360"></a>
<FONT color="green">361</FONT>            <a name="line.361"></a>
<FONT color="green">362</FONT>            m_last = m_next;<a name="line.362"></a>
<FONT color="green">363</FONT>            m_next++;<a name="line.363"></a>
<FONT color="green">364</FONT>        }<a name="line.364"></a>
<FONT color="green">365</FONT>            <a name="line.365"></a>
<FONT color="green">366</FONT>        return next;<a name="line.366"></a>
<FONT color="green">367</FONT>      }<a name="line.367"></a>
<FONT color="green">368</FONT>    <a name="line.368"></a>
<FONT color="green">369</FONT>      /**<a name="line.369"></a>
<FONT color="green">370</FONT>       * @see DTMIterator#previousNode()<a name="line.370"></a>
<FONT color="green">371</FONT>       */<a name="line.371"></a>
<FONT color="green">372</FONT>      public int previousNode()<a name="line.372"></a>
<FONT color="green">373</FONT>      {<a name="line.373"></a>
<FONT color="green">374</FONT>            if(hasCache())<a name="line.374"></a>
<FONT color="green">375</FONT>            {<a name="line.375"></a>
<FONT color="green">376</FONT>                    if(m_next &lt;= 0)<a name="line.376"></a>
<FONT color="green">377</FONT>                            return DTM.NULL;<a name="line.377"></a>
<FONT color="green">378</FONT>                    else<a name="line.378"></a>
<FONT color="green">379</FONT>                    {<a name="line.379"></a>
<FONT color="green">380</FONT>                            m_next--;<a name="line.380"></a>
<FONT color="green">381</FONT>                            return item(m_next);<a name="line.381"></a>
<FONT color="green">382</FONT>                    }<a name="line.382"></a>
<FONT color="green">383</FONT>            }<a name="line.383"></a>
<FONT color="green">384</FONT>            else<a name="line.384"></a>
<FONT color="green">385</FONT>            {<a name="line.385"></a>
<FONT color="green">386</FONT>                int n = m_iter.previousNode();<a name="line.386"></a>
<FONT color="green">387</FONT>                m_next = m_iter.getCurrentPos();<a name="line.387"></a>
<FONT color="green">388</FONT>                return m_next;<a name="line.388"></a>
<FONT color="green">389</FONT>            }<a name="line.389"></a>
<FONT color="green">390</FONT>      }<a name="line.390"></a>
<FONT color="green">391</FONT>    <a name="line.391"></a>
<FONT color="green">392</FONT>      /**<a name="line.392"></a>
<FONT color="green">393</FONT>       * @see DTMIterator#detach()<a name="line.393"></a>
<FONT color="green">394</FONT>       */<a name="line.394"></a>
<FONT color="green">395</FONT>      public void detach()<a name="line.395"></a>
<FONT color="green">396</FONT>      {<a name="line.396"></a>
<FONT color="green">397</FONT>            if(null != m_iter)<a name="line.397"></a>
<FONT color="green">398</FONT>                    m_iter.detach();<a name="line.398"></a>
<FONT color="green">399</FONT>            super.detach();<a name="line.399"></a>
<FONT color="green">400</FONT>      }<a name="line.400"></a>
<FONT color="green">401</FONT>    <a name="line.401"></a>
<FONT color="green">402</FONT>      /**<a name="line.402"></a>
<FONT color="green">403</FONT>       * Calling this with a value of false will cause the nodeset <a name="line.403"></a>
<FONT color="green">404</FONT>       * to be cached.<a name="line.404"></a>
<FONT color="green">405</FONT>       * @see DTMIterator#allowDetachToRelease(boolean)<a name="line.405"></a>
<FONT color="green">406</FONT>       */<a name="line.406"></a>
<FONT color="green">407</FONT>      public void allowDetachToRelease(boolean allowRelease)<a name="line.407"></a>
<FONT color="green">408</FONT>      {<a name="line.408"></a>
<FONT color="green">409</FONT>            if((false == allowRelease) &amp;&amp; !hasCache())<a name="line.409"></a>
<FONT color="green">410</FONT>            {<a name="line.410"></a>
<FONT color="green">411</FONT>                    setShouldCacheNodes(true);<a name="line.411"></a>
<FONT color="green">412</FONT>            }<a name="line.412"></a>
<FONT color="green">413</FONT>            <a name="line.413"></a>
<FONT color="green">414</FONT>            if(null != m_iter)<a name="line.414"></a>
<FONT color="green">415</FONT>                    m_iter.allowDetachToRelease(allowRelease);<a name="line.415"></a>
<FONT color="green">416</FONT>            super.allowDetachToRelease(allowRelease);<a name="line.416"></a>
<FONT color="green">417</FONT>      }<a name="line.417"></a>
<FONT color="green">418</FONT>    <a name="line.418"></a>
<FONT color="green">419</FONT>      /**<a name="line.419"></a>
<FONT color="green">420</FONT>       * @see DTMIterator#getCurrentNode()<a name="line.420"></a>
<FONT color="green">421</FONT>       */<a name="line.421"></a>
<FONT color="green">422</FONT>      public int getCurrentNode()<a name="line.422"></a>
<FONT color="green">423</FONT>      {<a name="line.423"></a>
<FONT color="green">424</FONT>            if(hasCache())<a name="line.424"></a>
<FONT color="green">425</FONT>            {<a name="line.425"></a>
<FONT color="green">426</FONT>                    int currentIndex = m_next-1;<a name="line.426"></a>
<FONT color="green">427</FONT>                    NodeVector vec = getVector();<a name="line.427"></a>
<FONT color="green">428</FONT>                    if((currentIndex &gt;= 0) &amp;&amp; (currentIndex &lt; vec.size()))<a name="line.428"></a>
<FONT color="green">429</FONT>                            return vec.elementAt(currentIndex);<a name="line.429"></a>
<FONT color="green">430</FONT>                    else<a name="line.430"></a>
<FONT color="green">431</FONT>                            return DTM.NULL;<a name="line.431"></a>
<FONT color="green">432</FONT>            }<a name="line.432"></a>
<FONT color="green">433</FONT>            <a name="line.433"></a>
<FONT color="green">434</FONT>            if(null != m_iter)<a name="line.434"></a>
<FONT color="green">435</FONT>            {<a name="line.435"></a>
<FONT color="green">436</FONT>            return m_iter.getCurrentNode();<a name="line.436"></a>
<FONT color="green">437</FONT>            }<a name="line.437"></a>
<FONT color="green">438</FONT>            else<a name="line.438"></a>
<FONT color="green">439</FONT>                    return DTM.NULL;<a name="line.439"></a>
<FONT color="green">440</FONT>      }<a name="line.440"></a>
<FONT color="green">441</FONT>    <a name="line.441"></a>
<FONT color="green">442</FONT>      /**<a name="line.442"></a>
<FONT color="green">443</FONT>       * @see DTMIterator#isFresh()<a name="line.443"></a>
<FONT color="green">444</FONT>       */<a name="line.444"></a>
<FONT color="green">445</FONT>      public boolean isFresh()<a name="line.445"></a>
<FONT color="green">446</FONT>      {<a name="line.446"></a>
<FONT color="green">447</FONT>        return (0 == m_next);<a name="line.447"></a>
<FONT color="green">448</FONT>      }<a name="line.448"></a>
<FONT color="green">449</FONT>    <a name="line.449"></a>
<FONT color="green">450</FONT>      /**<a name="line.450"></a>
<FONT color="green">451</FONT>       * @see DTMIterator#setShouldCacheNodes(boolean)<a name="line.451"></a>
<FONT color="green">452</FONT>       */<a name="line.452"></a>
<FONT color="green">453</FONT>      public void setShouldCacheNodes(boolean b)<a name="line.453"></a>
<FONT color="green">454</FONT>      {<a name="line.454"></a>
<FONT color="green">455</FONT>        if (b)<a name="line.455"></a>
<FONT color="green">456</FONT>        {<a name="line.456"></a>
<FONT color="green">457</FONT>          if(!hasCache())<a name="line.457"></a>
<FONT color="green">458</FONT>          {<a name="line.458"></a>
<FONT color="green">459</FONT>            SetVector(new NodeVector());<a name="line.459"></a>
<FONT color="green">460</FONT>          }<a name="line.460"></a>
<FONT color="green">461</FONT>    //        else<a name="line.461"></a>
<FONT color="green">462</FONT>    //          getVector().RemoveAllNoClear();  // Is this good?<a name="line.462"></a>
<FONT color="green">463</FONT>        }<a name="line.463"></a>
<FONT color="green">464</FONT>        else<a name="line.464"></a>
<FONT color="green">465</FONT>          SetVector(null);<a name="line.465"></a>
<FONT color="green">466</FONT>      }<a name="line.466"></a>
<FONT color="green">467</FONT>    <a name="line.467"></a>
<FONT color="green">468</FONT>      /**<a name="line.468"></a>
<FONT color="green">469</FONT>       * @see DTMIterator#isMutable()<a name="line.469"></a>
<FONT color="green">470</FONT>       */<a name="line.470"></a>
<FONT color="green">471</FONT>      public boolean isMutable()<a name="line.471"></a>
<FONT color="green">472</FONT>      {<a name="line.472"></a>
<FONT color="green">473</FONT>        return hasCache(); // though may be surprising if it also has an iterator!<a name="line.473"></a>
<FONT color="green">474</FONT>      }<a name="line.474"></a>
<FONT color="green">475</FONT>    <a name="line.475"></a>
<FONT color="green">476</FONT>      /**<a name="line.476"></a>
<FONT color="green">477</FONT>       * @see DTMIterator#getCurrentPos()<a name="line.477"></a>
<FONT color="green">478</FONT>       */<a name="line.478"></a>
<FONT color="green">479</FONT>      public int getCurrentPos()<a name="line.479"></a>
<FONT color="green">480</FONT>      {<a name="line.480"></a>
<FONT color="green">481</FONT>        return m_next;<a name="line.481"></a>
<FONT color="green">482</FONT>      }<a name="line.482"></a>
<FONT color="green">483</FONT>    <a name="line.483"></a>
<FONT color="green">484</FONT>      /**<a name="line.484"></a>
<FONT color="green">485</FONT>       * @see DTMIterator#runTo(int)<a name="line.485"></a>
<FONT color="green">486</FONT>       */<a name="line.486"></a>
<FONT color="green">487</FONT>      public void runTo(int index)<a name="line.487"></a>
<FONT color="green">488</FONT>      {<a name="line.488"></a>
<FONT color="green">489</FONT>        int n;<a name="line.489"></a>
<FONT color="green">490</FONT>        <a name="line.490"></a>
<FONT color="green">491</FONT>        if (-1 == index)<a name="line.491"></a>
<FONT color="green">492</FONT>        {<a name="line.492"></a>
<FONT color="green">493</FONT>          int pos = m_next;<a name="line.493"></a>
<FONT color="green">494</FONT>          while (DTM.NULL != (n = nextNode()));<a name="line.494"></a>
<FONT color="green">495</FONT>          m_next = pos;<a name="line.495"></a>
<FONT color="green">496</FONT>        }<a name="line.496"></a>
<FONT color="green">497</FONT>        else if(m_next == index)<a name="line.497"></a>
<FONT color="green">498</FONT>        {<a name="line.498"></a>
<FONT color="green">499</FONT>          return;<a name="line.499"></a>
<FONT color="green">500</FONT>        }<a name="line.500"></a>
<FONT color="green">501</FONT>        else if(hasCache() &amp;&amp; m_next &lt; getVector().size())<a name="line.501"></a>
<FONT color="green">502</FONT>        {<a name="line.502"></a>
<FONT color="green">503</FONT>          m_next = index;<a name="line.503"></a>
<FONT color="green">504</FONT>        }<a name="line.504"></a>
<FONT color="green">505</FONT>        else if((null == getVector()) &amp;&amp; (index &lt; m_next))<a name="line.505"></a>
<FONT color="green">506</FONT>        {<a name="line.506"></a>
<FONT color="green">507</FONT>          while ((m_next &gt;= index) &amp;&amp; DTM.NULL != (n = previousNode()));<a name="line.507"></a>
<FONT color="green">508</FONT>        }<a name="line.508"></a>
<FONT color="green">509</FONT>        else<a name="line.509"></a>
<FONT color="green">510</FONT>        {   <a name="line.510"></a>
<FONT color="green">511</FONT>          while ((m_next &lt; index) &amp;&amp; DTM.NULL != (n = nextNode()));<a name="line.511"></a>
<FONT color="green">512</FONT>        }<a name="line.512"></a>
<FONT color="green">513</FONT>        <a name="line.513"></a>
<FONT color="green">514</FONT>      }<a name="line.514"></a>
<FONT color="green">515</FONT>    <a name="line.515"></a>
<FONT color="green">516</FONT>      /**<a name="line.516"></a>
<FONT color="green">517</FONT>       * @see DTMIterator#setCurrentPos(int)<a name="line.517"></a>
<FONT color="green">518</FONT>       */<a name="line.518"></a>
<FONT color="green">519</FONT>      public void setCurrentPos(int i)<a name="line.519"></a>
<FONT color="green">520</FONT>      {<a name="line.520"></a>
<FONT color="green">521</FONT>            runTo(i);<a name="line.521"></a>
<FONT color="green">522</FONT>      }<a name="line.522"></a>
<FONT color="green">523</FONT>    <a name="line.523"></a>
<FONT color="green">524</FONT>      /**<a name="line.524"></a>
<FONT color="green">525</FONT>       * @see DTMIterator#item(int)<a name="line.525"></a>
<FONT color="green">526</FONT>       */<a name="line.526"></a>
<FONT color="green">527</FONT>      public int item(int index)<a name="line.527"></a>
<FONT color="green">528</FONT>      {<a name="line.528"></a>
<FONT color="green">529</FONT>            setCurrentPos(index);<a name="line.529"></a>
<FONT color="green">530</FONT>            int n = nextNode();<a name="line.530"></a>
<FONT color="green">531</FONT>            m_next = index;<a name="line.531"></a>
<FONT color="green">532</FONT>            return n;<a name="line.532"></a>
<FONT color="green">533</FONT>      }<a name="line.533"></a>
<FONT color="green">534</FONT>    <a name="line.534"></a>
<FONT color="green">535</FONT>      /**<a name="line.535"></a>
<FONT color="green">536</FONT>       * @see DTMIterator#setItem(int, int)<a name="line.536"></a>
<FONT color="green">537</FONT>       */<a name="line.537"></a>
<FONT color="green">538</FONT>      public void setItem(int node, int index)<a name="line.538"></a>
<FONT color="green">539</FONT>      {<a name="line.539"></a>
<FONT color="green">540</FONT>            NodeVector vec = getVector();<a name="line.540"></a>
<FONT color="green">541</FONT>            if(null != vec)<a name="line.541"></a>
<FONT color="green">542</FONT>            {<a name="line.542"></a>
<FONT color="green">543</FONT>            int oldNode = vec.elementAt(index);<a name="line.543"></a>
<FONT color="green">544</FONT>            if (oldNode != node &amp;&amp; m_cache.useCount() &gt; 1) {<a name="line.544"></a>
<FONT color="green">545</FONT>                /* If we are going to set the node at the given index<a name="line.545"></a>
<FONT color="green">546</FONT>                 * to a different value, and the cache is shared<a name="line.546"></a>
<FONT color="green">547</FONT>                 * (has a use count greater than 1)<a name="line.547"></a>
<FONT color="green">548</FONT>                 * then make a copy of the cache and use it<a name="line.548"></a>
<FONT color="green">549</FONT>                 * so we don't overwrite the value for other<a name="line.549"></a>
<FONT color="green">550</FONT>                 * users of the cache.<a name="line.550"></a>
<FONT color="green">551</FONT>                 */<a name="line.551"></a>
<FONT color="green">552</FONT>                IteratorCache newCache = new IteratorCache();<a name="line.552"></a>
<FONT color="green">553</FONT>                final NodeVector nv;<a name="line.553"></a>
<FONT color="green">554</FONT>                try {<a name="line.554"></a>
<FONT color="green">555</FONT>                    nv = (NodeVector) vec.clone();<a name="line.555"></a>
<FONT color="green">556</FONT>                } catch (CloneNotSupportedException e) {<a name="line.556"></a>
<FONT color="green">557</FONT>                    // This should never happen<a name="line.557"></a>
<FONT color="green">558</FONT>                    e.printStackTrace();<a name="line.558"></a>
<FONT color="green">559</FONT>                    RuntimeException rte = new RuntimeException(e.getMessage()); <a name="line.559"></a>
<FONT color="green">560</FONT>                    throw rte;<a name="line.560"></a>
<FONT color="green">561</FONT>                }<a name="line.561"></a>
<FONT color="green">562</FONT>                newCache.setVector(nv);<a name="line.562"></a>
<FONT color="green">563</FONT>                newCache.setCacheComplete(true);<a name="line.563"></a>
<FONT color="green">564</FONT>                m_cache = newCache;<a name="line.564"></a>
<FONT color="green">565</FONT>                vec = nv;<a name="line.565"></a>
<FONT color="green">566</FONT>                <a name="line.566"></a>
<FONT color="green">567</FONT>                // Keep our superclass informed of the current NodeVector<a name="line.567"></a>
<FONT color="green">568</FONT>                super.setObject(nv); <a name="line.568"></a>
<FONT color="green">569</FONT>                <a name="line.569"></a>
<FONT color="green">570</FONT>                /* When we get to here the new cache has<a name="line.570"></a>
<FONT color="green">571</FONT>                 * a use count of 1 and when setting a<a name="line.571"></a>
<FONT color="green">572</FONT>                 * bunch of values on the same NodeSequence,<a name="line.572"></a>
<FONT color="green">573</FONT>                 * such as when sorting, we will keep setting<a name="line.573"></a>
<FONT color="green">574</FONT>                 * values in that same copy which has a use count of 1.<a name="line.574"></a>
<FONT color="green">575</FONT>                 */<a name="line.575"></a>
<FONT color="green">576</FONT>            }<a name="line.576"></a>
<FONT color="green">577</FONT>                    vec.setElementAt(node, index);<a name="line.577"></a>
<FONT color="green">578</FONT>                    m_last = vec.size();<a name="line.578"></a>
<FONT color="green">579</FONT>            }<a name="line.579"></a>
<FONT color="green">580</FONT>            else<a name="line.580"></a>
<FONT color="green">581</FONT>                    m_iter.setItem(node, index);<a name="line.581"></a>
<FONT color="green">582</FONT>      }<a name="line.582"></a>
<FONT color="green">583</FONT>    <a name="line.583"></a>
<FONT color="green">584</FONT>      /**<a name="line.584"></a>
<FONT color="green">585</FONT>       * @see DTMIterator#getLength()<a name="line.585"></a>
<FONT color="green">586</FONT>       */<a name="line.586"></a>
<FONT color="green">587</FONT>      public int getLength()<a name="line.587"></a>
<FONT color="green">588</FONT>      {<a name="line.588"></a>
<FONT color="green">589</FONT>        IteratorCache cache = getCache();<a name="line.589"></a>
<FONT color="green">590</FONT>        <a name="line.590"></a>
<FONT color="green">591</FONT>            if(cache != null)<a name="line.591"></a>
<FONT color="green">592</FONT>            {<a name="line.592"></a>
<FONT color="green">593</FONT>            // Nodes from the iterator are cached<a name="line.593"></a>
<FONT color="green">594</FONT>            if (cache.isComplete()) {<a name="line.594"></a>
<FONT color="green">595</FONT>                // All of the nodes from the iterator are cached<a name="line.595"></a>
<FONT color="green">596</FONT>                // so just return the number of nodes in the cache<a name="line.596"></a>
<FONT color="green">597</FONT>                NodeVector nv = cache.getVector();<a name="line.597"></a>
<FONT color="green">598</FONT>                return nv.size();<a name="line.598"></a>
<FONT color="green">599</FONT>            }<a name="line.599"></a>
<FONT color="green">600</FONT>            <a name="line.600"></a>
<FONT color="green">601</FONT>            // If this NodeSequence wraps a mutable nodeset, then<a name="line.601"></a>
<FONT color="green">602</FONT>            // m_last will not reflect the size of the nodeset if<a name="line.602"></a>
<FONT color="green">603</FONT>            // it has been mutated...<a name="line.603"></a>
<FONT color="green">604</FONT>            if (m_iter instanceof NodeSetDTM)<a name="line.604"></a>
<FONT color="green">605</FONT>            {<a name="line.605"></a>
<FONT color="green">606</FONT>                return m_iter.getLength();<a name="line.606"></a>
<FONT color="green">607</FONT>            }    <a name="line.607"></a>
<FONT color="green">608</FONT>            <a name="line.608"></a>
<FONT color="green">609</FONT>                    if(-1 == m_last)<a name="line.609"></a>
<FONT color="green">610</FONT>                    {<a name="line.610"></a>
<FONT color="green">611</FONT>                            int pos = m_next;<a name="line.611"></a>
<FONT color="green">612</FONT>                            runTo(-1);<a name="line.612"></a>
<FONT color="green">613</FONT>                            m_next = pos;<a name="line.613"></a>
<FONT color="green">614</FONT>                    }<a name="line.614"></a>
<FONT color="green">615</FONT>                return m_last;<a name="line.615"></a>
<FONT color="green">616</FONT>            }<a name="line.616"></a>
<FONT color="green">617</FONT>            else<a name="line.617"></a>
<FONT color="green">618</FONT>            {<a name="line.618"></a>
<FONT color="green">619</FONT>                    return (-1 == m_last) ? (m_last = m_iter.getLength()) : m_last;<a name="line.619"></a>
<FONT color="green">620</FONT>            }<a name="line.620"></a>
<FONT color="green">621</FONT>      }<a name="line.621"></a>
<FONT color="green">622</FONT>    <a name="line.622"></a>
<FONT color="green">623</FONT>      /**<a name="line.623"></a>
<FONT color="green">624</FONT>       * Note: Not a deep clone.<a name="line.624"></a>
<FONT color="green">625</FONT>       * @see DTMIterator#cloneWithReset()<a name="line.625"></a>
<FONT color="green">626</FONT>       */<a name="line.626"></a>
<FONT color="green">627</FONT>      public DTMIterator cloneWithReset() throws CloneNotSupportedException<a name="line.627"></a>
<FONT color="green">628</FONT>      {<a name="line.628"></a>
<FONT color="green">629</FONT>            NodeSequence seq = (NodeSequence)super.clone();<a name="line.629"></a>
<FONT color="green">630</FONT>        seq.m_next = 0;<a name="line.630"></a>
<FONT color="green">631</FONT>        if (m_cache != null) {<a name="line.631"></a>
<FONT color="green">632</FONT>            // In making this clone of an iterator we are making<a name="line.632"></a>
<FONT color="green">633</FONT>            // another NodeSequence object it has a reference<a name="line.633"></a>
<FONT color="green">634</FONT>            // to the same IteratorCache object as the original<a name="line.634"></a>
<FONT color="green">635</FONT>            // so we need to remember that more than one<a name="line.635"></a>
<FONT color="green">636</FONT>            // NodeSequence object shares the cache.<a name="line.636"></a>
<FONT color="green">637</FONT>            m_cache.increaseUseCount();<a name="line.637"></a>
<FONT color="green">638</FONT>        }<a name="line.638"></a>
<FONT color="green">639</FONT>        <a name="line.639"></a>
<FONT color="green">640</FONT>        return seq;<a name="line.640"></a>
<FONT color="green">641</FONT>      }<a name="line.641"></a>
<FONT color="green">642</FONT>      <a name="line.642"></a>
<FONT color="green">643</FONT>      /**<a name="line.643"></a>
<FONT color="green">644</FONT>       * Get a clone of this iterator, but don't reset the iteration in the <a name="line.644"></a>
<FONT color="green">645</FONT>       * process, so that it may be used from the current position.<a name="line.645"></a>
<FONT color="green">646</FONT>       * Note: Not a deep clone.<a name="line.646"></a>
<FONT color="green">647</FONT>       *<a name="line.647"></a>
<FONT color="green">648</FONT>       * @return A clone of this object.<a name="line.648"></a>
<FONT color="green">649</FONT>       *<a name="line.649"></a>
<FONT color="green">650</FONT>       * @throws CloneNotSupportedException<a name="line.650"></a>
<FONT color="green">651</FONT>       */<a name="line.651"></a>
<FONT color="green">652</FONT>      public Object clone() throws CloneNotSupportedException<a name="line.652"></a>
<FONT color="green">653</FONT>      {<a name="line.653"></a>
<FONT color="green">654</FONT>              NodeSequence clone = (NodeSequence) super.clone();<a name="line.654"></a>
<FONT color="green">655</FONT>              if (null != m_iter) clone.m_iter = (DTMIterator) m_iter.clone();<a name="line.655"></a>
<FONT color="green">656</FONT>              if (m_cache != null) {<a name="line.656"></a>
<FONT color="green">657</FONT>                  // In making this clone of an iterator we are making<a name="line.657"></a>
<FONT color="green">658</FONT>                  // another NodeSequence object it has a reference<a name="line.658"></a>
<FONT color="green">659</FONT>                  // to the same IteratorCache object as the original<a name="line.659"></a>
<FONT color="green">660</FONT>                  // so we need to remember that more than one<a name="line.660"></a>
<FONT color="green">661</FONT>                  // NodeSequence object shares the cache.<a name="line.661"></a>
<FONT color="green">662</FONT>                  m_cache.increaseUseCount();<a name="line.662"></a>
<FONT color="green">663</FONT>              }<a name="line.663"></a>
<FONT color="green">664</FONT>              <a name="line.664"></a>
<FONT color="green">665</FONT>              return clone;<a name="line.665"></a>
<FONT color="green">666</FONT>      }<a name="line.666"></a>
<FONT color="green">667</FONT>    <a name="line.667"></a>
<FONT color="green">668</FONT>    <a name="line.668"></a>
<FONT color="green">669</FONT>      /**<a name="line.669"></a>
<FONT color="green">670</FONT>       * @see DTMIterator#isDocOrdered()<a name="line.670"></a>
<FONT color="green">671</FONT>       */<a name="line.671"></a>
<FONT color="green">672</FONT>      public boolean isDocOrdered()<a name="line.672"></a>
<FONT color="green">673</FONT>      {<a name="line.673"></a>
<FONT color="green">674</FONT>            if(null != m_iter)<a name="line.674"></a>
<FONT color="green">675</FONT>                    return m_iter.isDocOrdered();<a name="line.675"></a>
<FONT color="green">676</FONT>            else<a name="line.676"></a>
<FONT color="green">677</FONT>            return true; // can't be sure?<a name="line.677"></a>
<FONT color="green">678</FONT>      }<a name="line.678"></a>
<FONT color="green">679</FONT>    <a name="line.679"></a>
<FONT color="green">680</FONT>      /**<a name="line.680"></a>
<FONT color="green">681</FONT>       * @see DTMIterator#getAxis()<a name="line.681"></a>
<FONT color="green">682</FONT>       */<a name="line.682"></a>
<FONT color="green">683</FONT>      public int getAxis()<a name="line.683"></a>
<FONT color="green">684</FONT>      {<a name="line.684"></a>
<FONT color="green">685</FONT>            if(null != m_iter)<a name="line.685"></a>
<FONT color="green">686</FONT>            return m_iter.getAxis();<a name="line.686"></a>
<FONT color="green">687</FONT>        else<a name="line.687"></a>
<FONT color="green">688</FONT>        {<a name="line.688"></a>
<FONT color="green">689</FONT>            assertion(false, "Can not getAxis from a non-iterated node sequence!");<a name="line.689"></a>
<FONT color="green">690</FONT>            return 0;<a name="line.690"></a>
<FONT color="green">691</FONT>        }<a name="line.691"></a>
<FONT color="green">692</FONT>      }<a name="line.692"></a>
<FONT color="green">693</FONT>    <a name="line.693"></a>
<FONT color="green">694</FONT>      /**<a name="line.694"></a>
<FONT color="green">695</FONT>       * @see PathComponent#getAnalysisBits()<a name="line.695"></a>
<FONT color="green">696</FONT>       */<a name="line.696"></a>
<FONT color="green">697</FONT>      public int getAnalysisBits()<a name="line.697"></a>
<FONT color="green">698</FONT>      {<a name="line.698"></a>
<FONT color="green">699</FONT>            if((null != m_iter) &amp;&amp; (m_iter instanceof PathComponent))<a name="line.699"></a>
<FONT color="green">700</FONT>            return ((PathComponent)m_iter).getAnalysisBits();<a name="line.700"></a>
<FONT color="green">701</FONT>        else<a name="line.701"></a>
<FONT color="green">702</FONT>            return 0;<a name="line.702"></a>
<FONT color="green">703</FONT>      }<a name="line.703"></a>
<FONT color="green">704</FONT>    <a name="line.704"></a>
<FONT color="green">705</FONT>      /**<a name="line.705"></a>
<FONT color="green">706</FONT>       * @see org.apache.xpath.Expression#fixupVariables(Vector, int)<a name="line.706"></a>
<FONT color="green">707</FONT>       */<a name="line.707"></a>
<FONT color="green">708</FONT>      public void fixupVariables(Vector vars, int globalsSize)<a name="line.708"></a>
<FONT color="green">709</FONT>      {<a name="line.709"></a>
<FONT color="green">710</FONT>            super.fixupVariables(vars, globalsSize);<a name="line.710"></a>
<FONT color="green">711</FONT>      }  <a name="line.711"></a>
<FONT color="green">712</FONT>      <a name="line.712"></a>
<FONT color="green">713</FONT>      /**<a name="line.713"></a>
<FONT color="green">714</FONT>       * Add the node into a vector of nodes where it should occur in<a name="line.714"></a>
<FONT color="green">715</FONT>       * document order.<a name="line.715"></a>
<FONT color="green">716</FONT>       * @param node The node to be added.<a name="line.716"></a>
<FONT color="green">717</FONT>       * @return insertIndex.<a name="line.717"></a>
<FONT color="green">718</FONT>       * @throws RuntimeException thrown if this NodeSetDTM is not of <a name="line.718"></a>
<FONT color="green">719</FONT>       * a mutable type.<a name="line.719"></a>
<FONT color="green">720</FONT>       */<a name="line.720"></a>
<FONT color="green">721</FONT>       protected int addNodeInDocOrder(int node)<a name="line.721"></a>
<FONT color="green">722</FONT>       {<a name="line.722"></a>
<FONT color="green">723</FONT>          assertion(hasCache(), "addNodeInDocOrder must be done on a mutable sequence!");<a name="line.723"></a>
<FONT color="green">724</FONT>    <a name="line.724"></a>
<FONT color="green">725</FONT>          int insertIndex = -1;<a name="line.725"></a>
<FONT color="green">726</FONT>          <a name="line.726"></a>
<FONT color="green">727</FONT>          NodeVector vec = getVector();<a name="line.727"></a>
<FONT color="green">728</FONT>    <a name="line.728"></a>
<FONT color="green">729</FONT>          // This needs to do a binary search, but a binary search <a name="line.729"></a>
<FONT color="green">730</FONT>          // is somewhat tough because the sequence test involves <a name="line.730"></a>
<FONT color="green">731</FONT>          // two nodes.<a name="line.731"></a>
<FONT color="green">732</FONT>          int size = vec.size(), i;<a name="line.732"></a>
<FONT color="green">733</FONT>    <a name="line.733"></a>
<FONT color="green">734</FONT>          for (i = size - 1; i &gt;= 0; i--)<a name="line.734"></a>
<FONT color="green">735</FONT>          {<a name="line.735"></a>
<FONT color="green">736</FONT>            int child = vec.elementAt(i);<a name="line.736"></a>
<FONT color="green">737</FONT>    <a name="line.737"></a>
<FONT color="green">738</FONT>            if (child == node)<a name="line.738"></a>
<FONT color="green">739</FONT>            {<a name="line.739"></a>
<FONT color="green">740</FONT>              i = -2; // Duplicate, suppress insert<a name="line.740"></a>
<FONT color="green">741</FONT>    <a name="line.741"></a>
<FONT color="green">742</FONT>              break;<a name="line.742"></a>
<FONT color="green">743</FONT>            }<a name="line.743"></a>
<FONT color="green">744</FONT>    <a name="line.744"></a>
<FONT color="green">745</FONT>            DTM dtm = m_dtmMgr.getDTM(node);<a name="line.745"></a>
<FONT color="green">746</FONT>            if (!dtm.isNodeAfter(node, child))<a name="line.746"></a>
<FONT color="green">747</FONT>            {<a name="line.747"></a>
<FONT color="green">748</FONT>              break;<a name="line.748"></a>
<FONT color="green">749</FONT>            }<a name="line.749"></a>
<FONT color="green">750</FONT>          }<a name="line.750"></a>
<FONT color="green">751</FONT>    <a name="line.751"></a>
<FONT color="green">752</FONT>          if (i != -2)<a name="line.752"></a>
<FONT color="green">753</FONT>          {<a name="line.753"></a>
<FONT color="green">754</FONT>            insertIndex = i + 1;<a name="line.754"></a>
<FONT color="green">755</FONT>    <a name="line.755"></a>
<FONT color="green">756</FONT>            vec.insertElementAt(node, insertIndex);<a name="line.756"></a>
<FONT color="green">757</FONT>          }<a name="line.757"></a>
<FONT color="green">758</FONT>    <a name="line.758"></a>
<FONT color="green">759</FONT>          // checkDups();<a name="line.759"></a>
<FONT color="green">760</FONT>          return insertIndex;<a name="line.760"></a>
<FONT color="green">761</FONT>        } // end addNodeInDocOrder(Vector v, Object obj)<a name="line.761"></a>
<FONT color="green">762</FONT>       <a name="line.762"></a>
<FONT color="green">763</FONT>       /**<a name="line.763"></a>
<FONT color="green">764</FONT>        * It used to be that many locations in the code simply<a name="line.764"></a>
<FONT color="green">765</FONT>        * did an assignment to this.m_obj directly, rather than<a name="line.765"></a>
<FONT color="green">766</FONT>        * calling the setObject(Object) method. The problem is<a name="line.766"></a>
<FONT color="green">767</FONT>        * that our super-class would be updated on what the <a name="line.767"></a>
<FONT color="green">768</FONT>        * cache associated with this NodeSequence, but<a name="line.768"></a>
<FONT color="green">769</FONT>        * we wouldn't know ourselves.<a name="line.769"></a>
<FONT color="green">770</FONT>        * &lt;p&gt;<a name="line.770"></a>
<FONT color="green">771</FONT>        * All setting of m_obj is done through setObject() now,<a name="line.771"></a>
<FONT color="green">772</FONT>        * and this method over-rides the super-class method.<a name="line.772"></a>
<FONT color="green">773</FONT>        * So now we are in the loop have an opportunity<a name="line.773"></a>
<FONT color="green">774</FONT>        * to update some caching information.<a name="line.774"></a>
<FONT color="green">775</FONT>        *<a name="line.775"></a>
<FONT color="green">776</FONT>        */<a name="line.776"></a>
<FONT color="green">777</FONT>       protected void setObject(Object obj) {<a name="line.777"></a>
<FONT color="green">778</FONT>           if (obj instanceof NodeVector) {<a name="line.778"></a>
<FONT color="green">779</FONT>               // Keep our superclass informed of the current NodeVector<a name="line.779"></a>
<FONT color="green">780</FONT>               // ... if we don't the smoketest fails (don't know why).<a name="line.780"></a>
<FONT color="green">781</FONT>               super.setObject(obj);<a name="line.781"></a>
<FONT color="green">782</FONT>               <a name="line.782"></a>
<FONT color="green">783</FONT>               // A copy of the code of what SetVector() would do.<a name="line.783"></a>
<FONT color="green">784</FONT>               NodeVector v = (NodeVector)obj;<a name="line.784"></a>
<FONT color="green">785</FONT>               if (m_cache != null) {<a name="line.785"></a>
<FONT color="green">786</FONT>                   m_cache.setVector(v);<a name="line.786"></a>
<FONT color="green">787</FONT>               } else if (v!=null) {<a name="line.787"></a>
<FONT color="green">788</FONT>                   m_cache = new IteratorCache();<a name="line.788"></a>
<FONT color="green">789</FONT>                   m_cache.setVector(v);<a name="line.789"></a>
<FONT color="green">790</FONT>               }<a name="line.790"></a>
<FONT color="green">791</FONT>           } else if (obj instanceof IteratorCache) {<a name="line.791"></a>
<FONT color="green">792</FONT>               IteratorCache cache = (IteratorCache) obj;<a name="line.792"></a>
<FONT color="green">793</FONT>               m_cache = cache;<a name="line.793"></a>
<FONT color="green">794</FONT>               m_cache.increaseUseCount();<a name="line.794"></a>
<FONT color="green">795</FONT>               <a name="line.795"></a>
<FONT color="green">796</FONT>               // Keep our superclass informed of the current NodeVector<a name="line.796"></a>
<FONT color="green">797</FONT>               super.setObject(cache.getVector());<a name="line.797"></a>
<FONT color="green">798</FONT>           } else {<a name="line.798"></a>
<FONT color="green">799</FONT>               super.setObject(obj);<a name="line.799"></a>
<FONT color="green">800</FONT>           }<a name="line.800"></a>
<FONT color="green">801</FONT>           <a name="line.801"></a>
<FONT color="green">802</FONT>       }<a name="line.802"></a>
<FONT color="green">803</FONT>    <a name="line.803"></a>
<FONT color="green">804</FONT>       /**<a name="line.804"></a>
<FONT color="green">805</FONT>        * Each NodeSequence object has an iterator which is "walked".<a name="line.805"></a>
<FONT color="green">806</FONT>        * As an iterator is walked one obtains nodes from it.<a name="line.806"></a>
<FONT color="green">807</FONT>        * As those nodes are obtained they may be cached, making<a name="line.807"></a>
<FONT color="green">808</FONT>        * the next walking of a copy or clone of the iterator faster.<a name="line.808"></a>
<FONT color="green">809</FONT>        * This field (m_cache) is a reference to such a cache, <a name="line.809"></a>
<FONT color="green">810</FONT>        * which is populated as the iterator is walked.<a name="line.810"></a>
<FONT color="green">811</FONT>        * &lt;p&gt;<a name="line.811"></a>
<FONT color="green">812</FONT>        * Note that multiple NodeSequence objects may hold a <a name="line.812"></a>
<FONT color="green">813</FONT>        * reference to the same cache, and also <a name="line.813"></a>
<FONT color="green">814</FONT>        * (and this is important) the same iterator.<a name="line.814"></a>
<FONT color="green">815</FONT>        * The iterator and its cache may be shared among <a name="line.815"></a>
<FONT color="green">816</FONT>        * many NodeSequence objects.<a name="line.816"></a>
<FONT color="green">817</FONT>        * &lt;p&gt;<a name="line.817"></a>
<FONT color="green">818</FONT>        * If one of the NodeSequence objects walks ahead<a name="line.818"></a>
<FONT color="green">819</FONT>        * of the others it fills in the cache.<a name="line.819"></a>
<FONT color="green">820</FONT>        * As the others NodeSequence objects catch up they<a name="line.820"></a>
<FONT color="green">821</FONT>        * get their values from<a name="line.821"></a>
<FONT color="green">822</FONT>        * the cache rather than the iterator itself, so<a name="line.822"></a>
<FONT color="green">823</FONT>        * the iterator is only ever walked once and everyone<a name="line.823"></a>
<FONT color="green">824</FONT>        * benefits from the cache.<a name="line.824"></a>
<FONT color="green">825</FONT>        * &lt;p&gt;<a name="line.825"></a>
<FONT color="green">826</FONT>        * At some point the cache may be<a name="line.826"></a>
<FONT color="green">827</FONT>        * complete due to walking to the end of one of<a name="line.827"></a>
<FONT color="green">828</FONT>        * the copies of the iterator, and the cache is<a name="line.828"></a>
<FONT color="green">829</FONT>        * then marked as "complete".<a name="line.829"></a>
<FONT color="green">830</FONT>        * and the cache will have no more nodes added to it.<a name="line.830"></a>
<FONT color="green">831</FONT>        * &lt;p&gt;<a name="line.831"></a>
<FONT color="green">832</FONT>        * Its use-count is the number of NodeSequence objects that use it.<a name="line.832"></a>
<FONT color="green">833</FONT>        */<a name="line.833"></a>
<FONT color="green">834</FONT>       private final static class IteratorCache {<a name="line.834"></a>
<FONT color="green">835</FONT>           /**<a name="line.835"></a>
<FONT color="green">836</FONT>            * A list of nodes already obtained from the iterator.<a name="line.836"></a>
<FONT color="green">837</FONT>            * As the iterator is walked the nodes obtained from<a name="line.837"></a>
<FONT color="green">838</FONT>            * it are appended to this list.<a name="line.838"></a>
<FONT color="green">839</FONT>            * &lt;p&gt;<a name="line.839"></a>
<FONT color="green">840</FONT>            * Both an iterator and its corresponding cache can<a name="line.840"></a>
<FONT color="green">841</FONT>            * be shared by multiple NodeSequence objects.<a name="line.841"></a>
<FONT color="green">842</FONT>            * &lt;p&gt;<a name="line.842"></a>
<FONT color="green">843</FONT>            * For example, consider three NodeSequence objects<a name="line.843"></a>
<FONT color="green">844</FONT>            * ns1, ns2 and ns3 doing such sharing, and the<a name="line.844"></a>
<FONT color="green">845</FONT>            * nodes to be obtaind from the iterator being <a name="line.845"></a>
<FONT color="green">846</FONT>            * the sequence { 33, 11, 44, 22, 55 }.<a name="line.846"></a>
<FONT color="green">847</FONT>            * &lt;p&gt;<a name="line.847"></a>
<FONT color="green">848</FONT>            * If ns3.nextNode() is called 3 times the the<a name="line.848"></a>
<FONT color="green">849</FONT>            * underlying iterator will have walked through<a name="line.849"></a>
<FONT color="green">850</FONT>            * 33, 11, 55 and these three nodes will have been put<a name="line.850"></a>
<FONT color="green">851</FONT>            * in the cache.<a name="line.851"></a>
<FONT color="green">852</FONT>            * &lt;p&gt;<a name="line.852"></a>
<FONT color="green">853</FONT>            * If ns2.nextNode() is called 2 times it will return<a name="line.853"></a>
<FONT color="green">854</FONT>            * 33 and 11 from the cache, leaving the iterator alone.<a name="line.854"></a>
<FONT color="green">855</FONT>            * &lt;p&gt;<a name="line.855"></a>
<FONT color="green">856</FONT>            * If ns1.nextNode() is called 6 times it will return<a name="line.856"></a>
<FONT color="green">857</FONT>            * 33 and 11 from the cache, then get 44, 22, 55 from<a name="line.857"></a>
<FONT color="green">858</FONT>            * the iterator, and appending 44, 22, 55 to the cache.<a name="line.858"></a>
<FONT color="green">859</FONT>            * On the sixth call it is found that the iterator is<a name="line.859"></a>
<FONT color="green">860</FONT>            * exhausted and the cache is marked complete.<a name="line.860"></a>
<FONT color="green">861</FONT>            * &lt;p&gt;<a name="line.861"></a>
<FONT color="green">862</FONT>            * Should ns2 or ns3 have nextNode() called they will<a name="line.862"></a>
<FONT color="green">863</FONT>            * know that the cache is complete, and they will<a name="line.863"></a>
<FONT color="green">864</FONT>            * obtain all subsequent nodes from the cache.<a name="line.864"></a>
<FONT color="green">865</FONT>            * &lt;p&gt;<a name="line.865"></a>
<FONT color="green">866</FONT>            * Note that the underlying iterator, though shared<a name="line.866"></a>
<FONT color="green">867</FONT>            * is only ever walked once. <a name="line.867"></a>
<FONT color="green">868</FONT>            */<a name="line.868"></a>
<FONT color="green">869</FONT>            private NodeVector m_vec2;<a name="line.869"></a>
<FONT color="green">870</FONT>    <a name="line.870"></a>
<FONT color="green">871</FONT>            /**<a name="line.871"></a>
<FONT color="green">872</FONT>             * true if the associated iterator is exhausted and<a name="line.872"></a>
<FONT color="green">873</FONT>             * all nodes obtained from it are in the cache.<a name="line.873"></a>
<FONT color="green">874</FONT>             */<a name="line.874"></a>
<FONT color="green">875</FONT>            private boolean m_isComplete2;<a name="line.875"></a>
<FONT color="green">876</FONT>    <a name="line.876"></a>
<FONT color="green">877</FONT>            private int m_useCount2;<a name="line.877"></a>
<FONT color="green">878</FONT>    <a name="line.878"></a>
<FONT color="green">879</FONT>            IteratorCache() {<a name="line.879"></a>
<FONT color="green">880</FONT>                m_vec2 = null;<a name="line.880"></a>
<FONT color="green">881</FONT>                m_isComplete2 = false;<a name="line.881"></a>
<FONT color="green">882</FONT>                m_useCount2 = 1;<a name="line.882"></a>
<FONT color="green">883</FONT>                return;<a name="line.883"></a>
<FONT color="green">884</FONT>            }<a name="line.884"></a>
<FONT color="green">885</FONT>    <a name="line.885"></a>
<FONT color="green">886</FONT>            /**<a name="line.886"></a>
<FONT color="green">887</FONT>             * Returns count of how many NodeSequence objects share this<a name="line.887"></a>
<FONT color="green">888</FONT>             * IteratorCache object.<a name="line.888"></a>
<FONT color="green">889</FONT>             */<a name="line.889"></a>
<FONT color="green">890</FONT>            private int useCount() {<a name="line.890"></a>
<FONT color="green">891</FONT>                return m_useCount2;<a name="line.891"></a>
<FONT color="green">892</FONT>            }<a name="line.892"></a>
<FONT color="green">893</FONT>    <a name="line.893"></a>
<FONT color="green">894</FONT>            /**<a name="line.894"></a>
<FONT color="green">895</FONT>             * This method is called when yet another<a name="line.895"></a>
<FONT color="green">896</FONT>             * NodeSequence object uses, or shares<a name="line.896"></a>
<FONT color="green">897</FONT>             * this same cache.<a name="line.897"></a>
<FONT color="green">898</FONT>             *<a name="line.898"></a>
<FONT color="green">899</FONT>             */<a name="line.899"></a>
<FONT color="green">900</FONT>            private void increaseUseCount() {<a name="line.900"></a>
<FONT color="green">901</FONT>                if (m_vec2 != null)<a name="line.901"></a>
<FONT color="green">902</FONT>                    m_useCount2++;<a name="line.902"></a>
<FONT color="green">903</FONT>    <a name="line.903"></a>
<FONT color="green">904</FONT>            }<a name="line.904"></a>
<FONT color="green">905</FONT>    <a name="line.905"></a>
<FONT color="green">906</FONT>            /**<a name="line.906"></a>
<FONT color="green">907</FONT>             * Sets the NodeVector that holds the<a name="line.907"></a>
<FONT color="green">908</FONT>             * growing list of nodes as they are appended<a name="line.908"></a>
<FONT color="green">909</FONT>             * to the cached list.<a name="line.909"></a>
<FONT color="green">910</FONT>             */<a name="line.910"></a>
<FONT color="green">911</FONT>            private void setVector(NodeVector nv) {<a name="line.911"></a>
<FONT color="green">912</FONT>                m_vec2 = nv;<a name="line.912"></a>
<FONT color="green">913</FONT>                m_useCount2 = 1;<a name="line.913"></a>
<FONT color="green">914</FONT>            }<a name="line.914"></a>
<FONT color="green">915</FONT>    <a name="line.915"></a>
<FONT color="green">916</FONT>            /**<a name="line.916"></a>
<FONT color="green">917</FONT>             * Get the cached list of nodes obtained from<a name="line.917"></a>
<FONT color="green">918</FONT>             * the iterator so far.<a name="line.918"></a>
<FONT color="green">919</FONT>             */<a name="line.919"></a>
<FONT color="green">920</FONT>            private NodeVector getVector() {<a name="line.920"></a>
<FONT color="green">921</FONT>                return m_vec2;<a name="line.921"></a>
<FONT color="green">922</FONT>            }<a name="line.922"></a>
<FONT color="green">923</FONT>    <a name="line.923"></a>
<FONT color="green">924</FONT>            /**<a name="line.924"></a>
<FONT color="green">925</FONT>             * Call this method with 'true' if the<a name="line.925"></a>
<FONT color="green">926</FONT>             * iterator is exhausted and the cached list<a name="line.926"></a>
<FONT color="green">927</FONT>             * is complete, or no longer growing.<a name="line.927"></a>
<FONT color="green">928</FONT>             */<a name="line.928"></a>
<FONT color="green">929</FONT>            private void setCacheComplete(boolean b) {<a name="line.929"></a>
<FONT color="green">930</FONT>                m_isComplete2 = b;<a name="line.930"></a>
<FONT color="green">931</FONT>    <a name="line.931"></a>
<FONT color="green">932</FONT>            }<a name="line.932"></a>
<FONT color="green">933</FONT>    <a name="line.933"></a>
<FONT color="green">934</FONT>            /**<a name="line.934"></a>
<FONT color="green">935</FONT>             * Returns true if no cache is complete<a name="line.935"></a>
<FONT color="green">936</FONT>             * and immutable.<a name="line.936"></a>
<FONT color="green">937</FONT>             */<a name="line.937"></a>
<FONT color="green">938</FONT>            private boolean isComplete() {<a name="line.938"></a>
<FONT color="green">939</FONT>                return m_isComplete2;<a name="line.939"></a>
<FONT color="green">940</FONT>            }<a name="line.940"></a>
<FONT color="green">941</FONT>        }<a name="line.941"></a>
<FONT color="green">942</FONT>       <a name="line.942"></a>
<FONT color="green">943</FONT>        /**<a name="line.943"></a>
<FONT color="green">944</FONT>         * Get the cached list of nodes appended with<a name="line.944"></a>
<FONT color="green">945</FONT>         * values obtained from the iterator as<a name="line.945"></a>
<FONT color="green">946</FONT>         * a NodeSequence is walked when its<a name="line.946"></a>
<FONT color="green">947</FONT>         * nextNode() method is called.<a name="line.947"></a>
<FONT color="green">948</FONT>         */<a name="line.948"></a>
<FONT color="green">949</FONT>        protected IteratorCache getIteratorCache() {<a name="line.949"></a>
<FONT color="green">950</FONT>            return m_cache;<a name="line.950"></a>
<FONT color="green">951</FONT>        }<a name="line.951"></a>
<FONT color="green">952</FONT>    }<a name="line.952"></a>
<FONT color="green">953</FONT>    <a name="line.953"></a>




























































</PRE>
</BODY>
</HTML>
