<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: DTMDefaultBaseTraversers.java 468653 2006-10-28 07:07:05Z minchau $<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    package org.apache.xml.dtm.ref;<a name="line.21"></a>
<FONT color="green">022</FONT>    <a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.xml.dtm.*;<a name="line.23"></a>
<FONT color="green">024</FONT>    <a name="line.24"></a>
<FONT color="green">025</FONT>    import javax.xml.transform.Source;<a name="line.25"></a>
<FONT color="green">026</FONT>    <a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.xml.utils.XMLStringFactory;<a name="line.27"></a>
<FONT color="green">028</FONT>    <a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.xml.res.XMLErrorResources;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.xml.res.XMLMessages;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.xalan.xsltc.dom.NodeCounter;<a name="line.31"></a>
<FONT color="green">032</FONT>    <a name="line.32"></a>
<FONT color="green">033</FONT>    /**<a name="line.33"></a>
<FONT color="green">034</FONT>     * This class implements the traversers for DTMDefaultBase.<a name="line.34"></a>
<FONT color="green">035</FONT>     *<a name="line.35"></a>
<FONT color="green">036</FONT>     * PLEASE NOTE that the public interface for all traversers should be<a name="line.36"></a>
<FONT color="green">037</FONT>     * in terms of DTM Node Handles... but they may use the internal node<a name="line.37"></a>
<FONT color="green">038</FONT>     * identity indices within their logic, for efficiency's sake. Be very<a name="line.38"></a>
<FONT color="green">039</FONT>     * careful to avoid confusing these when maintaining this code.<a name="line.39"></a>
<FONT color="green">040</FONT>     * */<a name="line.40"></a>
<FONT color="green">041</FONT>    public abstract class DTMDefaultBaseTraversers extends DTMDefaultBase<a name="line.41"></a>
<FONT color="green">042</FONT>    {<a name="line.42"></a>
<FONT color="green">043</FONT>    <a name="line.43"></a>
<FONT color="green">044</FONT>      /**<a name="line.44"></a>
<FONT color="green">045</FONT>       * Construct a DTMDefaultBaseTraversers object from a DOM node.<a name="line.45"></a>
<FONT color="green">046</FONT>       *<a name="line.46"></a>
<FONT color="green">047</FONT>       * @param mgr The DTMManager who owns this DTM.<a name="line.47"></a>
<FONT color="green">048</FONT>       * @param source The object that is used to specify the construction source.<a name="line.48"></a>
<FONT color="green">049</FONT>       * @param dtmIdentity The DTM identity ID for this DTM.<a name="line.49"></a>
<FONT color="green">050</FONT>       * @param whiteSpaceFilter The white space filter for this DTM, which may<a name="line.50"></a>
<FONT color="green">051</FONT>       *                         be null.<a name="line.51"></a>
<FONT color="green">052</FONT>       * @param xstringfactory The factory to use for creating XMLStrings.<a name="line.52"></a>
<FONT color="green">053</FONT>       * @param doIndexing true if the caller considers it worth it to use<a name="line.53"></a>
<FONT color="green">054</FONT>       *                   indexing schemes.<a name="line.54"></a>
<FONT color="green">055</FONT>       */<a name="line.55"></a>
<FONT color="green">056</FONT>      public DTMDefaultBaseTraversers(DTMManager mgr, Source source,<a name="line.56"></a>
<FONT color="green">057</FONT>                                      int dtmIdentity,<a name="line.57"></a>
<FONT color="green">058</FONT>                                      DTMWSFilter whiteSpaceFilter,<a name="line.58"></a>
<FONT color="green">059</FONT>                                      XMLStringFactory xstringfactory,<a name="line.59"></a>
<FONT color="green">060</FONT>                                      boolean doIndexing)<a name="line.60"></a>
<FONT color="green">061</FONT>      {<a name="line.61"></a>
<FONT color="green">062</FONT>        super(mgr, source, dtmIdentity, whiteSpaceFilter, xstringfactory,<a name="line.62"></a>
<FONT color="green">063</FONT>              doIndexing);<a name="line.63"></a>
<FONT color="green">064</FONT>      }<a name="line.64"></a>
<FONT color="green">065</FONT>    <a name="line.65"></a>
<FONT color="green">066</FONT>      /**<a name="line.66"></a>
<FONT color="green">067</FONT>       * Construct a DTMDefaultBaseTraversers object from a DOM node.<a name="line.67"></a>
<FONT color="green">068</FONT>       *<a name="line.68"></a>
<FONT color="green">069</FONT>       * @param mgr The DTMManager who owns this DTM.<a name="line.69"></a>
<FONT color="green">070</FONT>       * @param source The object that is used to specify the construction source.<a name="line.70"></a>
<FONT color="green">071</FONT>       * @param dtmIdentity The DTM identity ID for this DTM.<a name="line.71"></a>
<FONT color="green">072</FONT>       * @param whiteSpaceFilter The white space filter for this DTM, which may<a name="line.72"></a>
<FONT color="green">073</FONT>       *                         be null.<a name="line.73"></a>
<FONT color="green">074</FONT>       * @param xstringfactory The factory to use for creating XMLStrings.<a name="line.74"></a>
<FONT color="green">075</FONT>       * @param doIndexing true if the caller considers it worth it to use<a name="line.75"></a>
<FONT color="green">076</FONT>       *                   indexing schemes.<a name="line.76"></a>
<FONT color="green">077</FONT>       * @param blocksize The block size of the DTM.<a name="line.77"></a>
<FONT color="green">078</FONT>       * @param usePrevsib true if we want to build the previous sibling node array.<a name="line.78"></a>
<FONT color="green">079</FONT>       * @param newNameTable true if we want to use a new ExpandedNameTable for this DTM.<a name="line.79"></a>
<FONT color="green">080</FONT>       */<a name="line.80"></a>
<FONT color="green">081</FONT>      public DTMDefaultBaseTraversers(DTMManager mgr, Source source,<a name="line.81"></a>
<FONT color="green">082</FONT>                                      int dtmIdentity,<a name="line.82"></a>
<FONT color="green">083</FONT>                                      DTMWSFilter whiteSpaceFilter,<a name="line.83"></a>
<FONT color="green">084</FONT>                                      XMLStringFactory xstringfactory,<a name="line.84"></a>
<FONT color="green">085</FONT>                                      boolean doIndexing,<a name="line.85"></a>
<FONT color="green">086</FONT>                                      int blocksize,<a name="line.86"></a>
<FONT color="green">087</FONT>                                      boolean usePrevsib,<a name="line.87"></a>
<FONT color="green">088</FONT>                                      boolean newNameTable)<a name="line.88"></a>
<FONT color="green">089</FONT>      {<a name="line.89"></a>
<FONT color="green">090</FONT>        super(mgr, source, dtmIdentity, whiteSpaceFilter, xstringfactory,<a name="line.90"></a>
<FONT color="green">091</FONT>              doIndexing, blocksize, usePrevsib, newNameTable);<a name="line.91"></a>
<FONT color="green">092</FONT>      }<a name="line.92"></a>
<FONT color="green">093</FONT>    <a name="line.93"></a>
<FONT color="green">094</FONT>      /**<a name="line.94"></a>
<FONT color="green">095</FONT>       * This returns a stateless "traverser", that can navigate<a name="line.95"></a>
<FONT color="green">096</FONT>       * over an XPath axis, though perhaps not in document order.<a name="line.96"></a>
<FONT color="green">097</FONT>       *<a name="line.97"></a>
<FONT color="green">098</FONT>       * @param axis One of Axes.ANCESTORORSELF, etc.<a name="line.98"></a>
<FONT color="green">099</FONT>       *<a name="line.99"></a>
<FONT color="green">100</FONT>       * @return A DTMAxisTraverser, or null if the given axis isn't supported.<a name="line.100"></a>
<FONT color="green">101</FONT>       */<a name="line.101"></a>
<FONT color="green">102</FONT>      public DTMAxisTraverser getAxisTraverser(final int axis)<a name="line.102"></a>
<FONT color="green">103</FONT>      {<a name="line.103"></a>
<FONT color="green">104</FONT>    <a name="line.104"></a>
<FONT color="green">105</FONT>        DTMAxisTraverser traverser;<a name="line.105"></a>
<FONT color="green">106</FONT>    <a name="line.106"></a>
<FONT color="green">107</FONT>        if (null == m_traversers)  // Cache of stateless traversers for this DTM<a name="line.107"></a>
<FONT color="green">108</FONT>        {<a name="line.108"></a>
<FONT color="green">109</FONT>          m_traversers = new DTMAxisTraverser[Axis.getNamesLength()];<a name="line.109"></a>
<FONT color="green">110</FONT>          traverser = null;<a name="line.110"></a>
<FONT color="green">111</FONT>        }<a name="line.111"></a>
<FONT color="green">112</FONT>        else<a name="line.112"></a>
<FONT color="green">113</FONT>        {<a name="line.113"></a>
<FONT color="green">114</FONT>          traverser = m_traversers[axis];  // Share/reuse existing traverser<a name="line.114"></a>
<FONT color="green">115</FONT>    <a name="line.115"></a>
<FONT color="green">116</FONT>          if (traverser != null)<a name="line.116"></a>
<FONT color="green">117</FONT>            return traverser;<a name="line.117"></a>
<FONT color="green">118</FONT>        }<a name="line.118"></a>
<FONT color="green">119</FONT>    <a name="line.119"></a>
<FONT color="green">120</FONT>        switch (axis)  // Generate new traverser<a name="line.120"></a>
<FONT color="green">121</FONT>        {<a name="line.121"></a>
<FONT color="green">122</FONT>        case Axis.ANCESTOR :<a name="line.122"></a>
<FONT color="green">123</FONT>          traverser = new AncestorTraverser();<a name="line.123"></a>
<FONT color="green">124</FONT>          break;<a name="line.124"></a>
<FONT color="green">125</FONT>        case Axis.ANCESTORORSELF :<a name="line.125"></a>
<FONT color="green">126</FONT>          traverser = new AncestorOrSelfTraverser();<a name="line.126"></a>
<FONT color="green">127</FONT>          break;<a name="line.127"></a>
<FONT color="green">128</FONT>        case Axis.ATTRIBUTE :<a name="line.128"></a>
<FONT color="green">129</FONT>          traverser = new AttributeTraverser();<a name="line.129"></a>
<FONT color="green">130</FONT>          break;<a name="line.130"></a>
<FONT color="green">131</FONT>        case Axis.CHILD :<a name="line.131"></a>
<FONT color="green">132</FONT>          traverser = new ChildTraverser();<a name="line.132"></a>
<FONT color="green">133</FONT>          break;<a name="line.133"></a>
<FONT color="green">134</FONT>        case Axis.DESCENDANT :<a name="line.134"></a>
<FONT color="green">135</FONT>          traverser = new DescendantTraverser();<a name="line.135"></a>
<FONT color="green">136</FONT>          break;<a name="line.136"></a>
<FONT color="green">137</FONT>        case Axis.DESCENDANTORSELF :<a name="line.137"></a>
<FONT color="green">138</FONT>          traverser = new DescendantOrSelfTraverser();<a name="line.138"></a>
<FONT color="green">139</FONT>          break;<a name="line.139"></a>
<FONT color="green">140</FONT>        case Axis.FOLLOWING :<a name="line.140"></a>
<FONT color="green">141</FONT>          traverser = new FollowingTraverser();<a name="line.141"></a>
<FONT color="green">142</FONT>          break;<a name="line.142"></a>
<FONT color="green">143</FONT>        case Axis.FOLLOWINGSIBLING :<a name="line.143"></a>
<FONT color="green">144</FONT>          traverser = new FollowingSiblingTraverser();<a name="line.144"></a>
<FONT color="green">145</FONT>          break;<a name="line.145"></a>
<FONT color="green">146</FONT>        case Axis.NAMESPACE :<a name="line.146"></a>
<FONT color="green">147</FONT>          traverser = new NamespaceTraverser();<a name="line.147"></a>
<FONT color="green">148</FONT>          break;<a name="line.148"></a>
<FONT color="green">149</FONT>        case Axis.NAMESPACEDECLS :<a name="line.149"></a>
<FONT color="green">150</FONT>          traverser = new NamespaceDeclsTraverser();<a name="line.150"></a>
<FONT color="green">151</FONT>          break;<a name="line.151"></a>
<FONT color="green">152</FONT>        case Axis.PARENT :<a name="line.152"></a>
<FONT color="green">153</FONT>          traverser = new ParentTraverser();<a name="line.153"></a>
<FONT color="green">154</FONT>          break;<a name="line.154"></a>
<FONT color="green">155</FONT>        case Axis.PRECEDING :<a name="line.155"></a>
<FONT color="green">156</FONT>          traverser = new PrecedingTraverser();<a name="line.156"></a>
<FONT color="green">157</FONT>          break;<a name="line.157"></a>
<FONT color="green">158</FONT>        case Axis.PRECEDINGSIBLING :<a name="line.158"></a>
<FONT color="green">159</FONT>          traverser = new PrecedingSiblingTraverser();<a name="line.159"></a>
<FONT color="green">160</FONT>          break;<a name="line.160"></a>
<FONT color="green">161</FONT>        case Axis.SELF :<a name="line.161"></a>
<FONT color="green">162</FONT>          traverser = new SelfTraverser();<a name="line.162"></a>
<FONT color="green">163</FONT>          break;<a name="line.163"></a>
<FONT color="green">164</FONT>        case Axis.ALL :<a name="line.164"></a>
<FONT color="green">165</FONT>          traverser = new AllFromRootTraverser();<a name="line.165"></a>
<FONT color="green">166</FONT>          break;<a name="line.166"></a>
<FONT color="green">167</FONT>        case Axis.ALLFROMNODE :<a name="line.167"></a>
<FONT color="green">168</FONT>          traverser = new AllFromNodeTraverser();<a name="line.168"></a>
<FONT color="green">169</FONT>          break;<a name="line.169"></a>
<FONT color="green">170</FONT>        case Axis.PRECEDINGANDANCESTOR :<a name="line.170"></a>
<FONT color="green">171</FONT>          traverser = new PrecedingAndAncestorTraverser();<a name="line.171"></a>
<FONT color="green">172</FONT>          break;<a name="line.172"></a>
<FONT color="green">173</FONT>        case Axis.DESCENDANTSFROMROOT :<a name="line.173"></a>
<FONT color="green">174</FONT>          traverser = new DescendantFromRootTraverser();<a name="line.174"></a>
<FONT color="green">175</FONT>          break;<a name="line.175"></a>
<FONT color="green">176</FONT>        case Axis.DESCENDANTSORSELFFROMROOT :<a name="line.176"></a>
<FONT color="green">177</FONT>          traverser = new DescendantOrSelfFromRootTraverser();<a name="line.177"></a>
<FONT color="green">178</FONT>          break;<a name="line.178"></a>
<FONT color="green">179</FONT>        case Axis.ROOT :<a name="line.179"></a>
<FONT color="green">180</FONT>          traverser = new RootTraverser();<a name="line.180"></a>
<FONT color="green">181</FONT>          break;<a name="line.181"></a>
<FONT color="green">182</FONT>        case Axis.FILTEREDLIST :<a name="line.182"></a>
<FONT color="green">183</FONT>          return null; // Don't want to throw an exception for this one.<a name="line.183"></a>
<FONT color="green">184</FONT>        default :<a name="line.184"></a>
<FONT color="green">185</FONT>          throw new DTMException(XMLMessages.createXMLMessage(XMLErrorResources.ER_UNKNOWN_AXIS_TYPE, new Object[]{Integer.toString(axis)})); //"Unknown axis traversal type: "+axis);<a name="line.185"></a>
<FONT color="green">186</FONT>        }<a name="line.186"></a>
<FONT color="green">187</FONT>    <a name="line.187"></a>
<FONT color="green">188</FONT>        if (null == traverser)<a name="line.188"></a>
<FONT color="green">189</FONT>          throw new DTMException(XMLMessages.createXMLMessage(XMLErrorResources.ER_AXIS_TRAVERSER_NOT_SUPPORTED, new Object[]{Axis.getNames(axis)}));<a name="line.189"></a>
<FONT color="green">190</FONT>          // "Axis traverser not supported: "<a name="line.190"></a>
<FONT color="green">191</FONT>          //                       + Axis.names[axis]);<a name="line.191"></a>
<FONT color="green">192</FONT>    <a name="line.192"></a>
<FONT color="green">193</FONT>        m_traversers[axis] = traverser;<a name="line.193"></a>
<FONT color="green">194</FONT>    <a name="line.194"></a>
<FONT color="green">195</FONT>        return traverser;<a name="line.195"></a>
<FONT color="green">196</FONT>      }<a name="line.196"></a>
<FONT color="green">197</FONT>    <a name="line.197"></a>
<FONT color="green">198</FONT>      /**<a name="line.198"></a>
<FONT color="green">199</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.199"></a>
<FONT color="green">200</FONT>       */<a name="line.200"></a>
<FONT color="green">201</FONT>      private class AncestorTraverser extends DTMAxisTraverser<a name="line.201"></a>
<FONT color="green">202</FONT>      {<a name="line.202"></a>
<FONT color="green">203</FONT>    <a name="line.203"></a>
<FONT color="green">204</FONT>        /**<a name="line.204"></a>
<FONT color="green">205</FONT>         * Traverse to the next node after the current node.<a name="line.205"></a>
<FONT color="green">206</FONT>         *<a name="line.206"></a>
<FONT color="green">207</FONT>         * @param context The context node if this iteration.<a name="line.207"></a>
<FONT color="green">208</FONT>         * @param current The current node of the iteration.<a name="line.208"></a>
<FONT color="green">209</FONT>         *<a name="line.209"></a>
<FONT color="green">210</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.210"></a>
<FONT color="green">211</FONT>         */<a name="line.211"></a>
<FONT color="green">212</FONT>        public int next(int context, int current)<a name="line.212"></a>
<FONT color="green">213</FONT>        {<a name="line.213"></a>
<FONT color="green">214</FONT>                            return getParent(current);<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>         * Traverse to the next node after the current node that is matched<a name="line.218"></a>
<FONT color="green">219</FONT>         * by the expanded type ID.<a name="line.219"></a>
<FONT color="green">220</FONT>         *<a name="line.220"></a>
<FONT color="green">221</FONT>         * @param context The context node of this iteration.<a name="line.221"></a>
<FONT color="green">222</FONT>         * @param current The current node of the iteration.<a name="line.222"></a>
<FONT color="green">223</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.223"></a>
<FONT color="green">224</FONT>         *<a name="line.224"></a>
<FONT color="green">225</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.225"></a>
<FONT color="green">226</FONT>         */<a name="line.226"></a>
<FONT color="green">227</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.227"></a>
<FONT color="green">228</FONT>        {<a name="line.228"></a>
<FONT color="green">229</FONT>                            // Process using identities<a name="line.229"></a>
<FONT color="green">230</FONT>          current = makeNodeIdentity(current);<a name="line.230"></a>
<FONT color="green">231</FONT>    <a name="line.231"></a>
<FONT color="green">232</FONT>          while (DTM.NULL != (current = m_parent.elementAt(current)))<a name="line.232"></a>
<FONT color="green">233</FONT>          {<a name="line.233"></a>
<FONT color="green">234</FONT>            if (m_exptype.elementAt(current) == expandedTypeID)<a name="line.234"></a>
<FONT color="green">235</FONT>              return makeNodeHandle(current);<a name="line.235"></a>
<FONT color="green">236</FONT>          }<a name="line.236"></a>
<FONT color="green">237</FONT>    <a name="line.237"></a>
<FONT color="green">238</FONT>          return NULL;<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>    <a name="line.241"></a>
<FONT color="green">242</FONT>      /**<a name="line.242"></a>
<FONT color="green">243</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.243"></a>
<FONT color="green">244</FONT>       */<a name="line.244"></a>
<FONT color="green">245</FONT>      private class AncestorOrSelfTraverser extends AncestorTraverser<a name="line.245"></a>
<FONT color="green">246</FONT>      {<a name="line.246"></a>
<FONT color="green">247</FONT>    <a name="line.247"></a>
<FONT color="green">248</FONT>        /**<a name="line.248"></a>
<FONT color="green">249</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.249"></a>
<FONT color="green">250</FONT>         * returned or the iteration will go into an infinate loop.  To see if<a name="line.250"></a>
<FONT color="green">251</FONT>         * the self node should be processed, use this function.<a name="line.251"></a>
<FONT color="green">252</FONT>         *<a name="line.252"></a>
<FONT color="green">253</FONT>         * @param context The context node of this traversal.<a name="line.253"></a>
<FONT color="green">254</FONT>         *<a name="line.254"></a>
<FONT color="green">255</FONT>         * @return the first node in the traversal.<a name="line.255"></a>
<FONT color="green">256</FONT>         */<a name="line.256"></a>
<FONT color="green">257</FONT>        public int first(int context)<a name="line.257"></a>
<FONT color="green">258</FONT>        {<a name="line.258"></a>
<FONT color="green">259</FONT>          return context;<a name="line.259"></a>
<FONT color="green">260</FONT>        }<a name="line.260"></a>
<FONT color="green">261</FONT>    <a name="line.261"></a>
<FONT color="green">262</FONT>        /**<a name="line.262"></a>
<FONT color="green">263</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.263"></a>
<FONT color="green">264</FONT>         * returned or the iteration will go into an infinate loop.  To see if<a name="line.264"></a>
<FONT color="green">265</FONT>         * the self node should be processed, use this function.  If the context<a name="line.265"></a>
<FONT color="green">266</FONT>         * node does not match the expanded type ID, this function will return<a name="line.266"></a>
<FONT color="green">267</FONT>         * false.<a name="line.267"></a>
<FONT color="green">268</FONT>         *<a name="line.268"></a>
<FONT color="green">269</FONT>         * @param context The context node of this traversal.<a name="line.269"></a>
<FONT color="green">270</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.270"></a>
<FONT color="green">271</FONT>         *<a name="line.271"></a>
<FONT color="green">272</FONT>         * @return the first node in the traversal.<a name="line.272"></a>
<FONT color="green">273</FONT>         */<a name="line.273"></a>
<FONT color="green">274</FONT>        public int first(int context, int expandedTypeID)<a name="line.274"></a>
<FONT color="green">275</FONT>        {<a name="line.275"></a>
<FONT color="green">276</FONT>                            return (getExpandedTypeID(context) == expandedTypeID)<a name="line.276"></a>
<FONT color="green">277</FONT>                 ? context : next(context, context, expandedTypeID);<a name="line.277"></a>
<FONT color="green">278</FONT>        }<a name="line.278"></a>
<FONT color="green">279</FONT>      }<a name="line.279"></a>
<FONT color="green">280</FONT>    <a name="line.280"></a>
<FONT color="green">281</FONT>      /**<a name="line.281"></a>
<FONT color="green">282</FONT>       * Implements traversal of the Attribute access<a name="line.282"></a>
<FONT color="green">283</FONT>       */<a name="line.283"></a>
<FONT color="green">284</FONT>      private class AttributeTraverser extends DTMAxisTraverser<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>         * Traverse to the next node after the current node.<a name="line.288"></a>
<FONT color="green">289</FONT>         *<a name="line.289"></a>
<FONT color="green">290</FONT>         * @param context The context node of this iteration.<a name="line.290"></a>
<FONT color="green">291</FONT>         * @param current The current node of the iteration.<a name="line.291"></a>
<FONT color="green">292</FONT>         *<a name="line.292"></a>
<FONT color="green">293</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.293"></a>
<FONT color="green">294</FONT>         */<a name="line.294"></a>
<FONT color="green">295</FONT>        public int next(int context, int current)<a name="line.295"></a>
<FONT color="green">296</FONT>        {<a name="line.296"></a>
<FONT color="green">297</FONT>          return (context == current)<a name="line.297"></a>
<FONT color="green">298</FONT>                 ? getFirstAttribute(context) : getNextAttribute(current);<a name="line.298"></a>
<FONT color="green">299</FONT>        }<a name="line.299"></a>
<FONT color="green">300</FONT>    <a name="line.300"></a>
<FONT color="green">301</FONT>        /**<a name="line.301"></a>
<FONT color="green">302</FONT>         * Traverse to the next node after the current node that is matched<a name="line.302"></a>
<FONT color="green">303</FONT>         * by the expanded type ID.<a name="line.303"></a>
<FONT color="green">304</FONT>         *<a name="line.304"></a>
<FONT color="green">305</FONT>         * @param context The context node of this iteration.<a name="line.305"></a>
<FONT color="green">306</FONT>         * @param current The current node of the iteration.<a name="line.306"></a>
<FONT color="green">307</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.307"></a>
<FONT color="green">308</FONT>         *<a name="line.308"></a>
<FONT color="green">309</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.309"></a>
<FONT color="green">310</FONT>         */<a name="line.310"></a>
<FONT color="green">311</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.311"></a>
<FONT color="green">312</FONT>        {<a name="line.312"></a>
<FONT color="green">313</FONT>    <a name="line.313"></a>
<FONT color="green">314</FONT>          current = (context == current)<a name="line.314"></a>
<FONT color="green">315</FONT>                    ? getFirstAttribute(context) : getNextAttribute(current);<a name="line.315"></a>
<FONT color="green">316</FONT>    <a name="line.316"></a>
<FONT color="green">317</FONT>          do<a name="line.317"></a>
<FONT color="green">318</FONT>          {<a name="line.318"></a>
<FONT color="green">319</FONT>            if (getExpandedTypeID(current) == expandedTypeID)<a name="line.319"></a>
<FONT color="green">320</FONT>              return current;<a name="line.320"></a>
<FONT color="green">321</FONT>          }<a name="line.321"></a>
<FONT color="green">322</FONT>          while (DTM.NULL != (current = getNextAttribute(current)));<a name="line.322"></a>
<FONT color="green">323</FONT>    <a name="line.323"></a>
<FONT color="green">324</FONT>          return NULL;<a name="line.324"></a>
<FONT color="green">325</FONT>        }<a name="line.325"></a>
<FONT color="green">326</FONT>      }<a name="line.326"></a>
<FONT color="green">327</FONT>    <a name="line.327"></a>
<FONT color="green">328</FONT>      /**<a name="line.328"></a>
<FONT color="green">329</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.329"></a>
<FONT color="green">330</FONT>       */<a name="line.330"></a>
<FONT color="green">331</FONT>      private class ChildTraverser extends DTMAxisTraverser<a name="line.331"></a>
<FONT color="green">332</FONT>      {<a name="line.332"></a>
<FONT color="green">333</FONT>        <a name="line.333"></a>
<FONT color="green">334</FONT>        /**<a name="line.334"></a>
<FONT color="green">335</FONT>         * Get the next indexed node that matches the expanded type ID.  Before <a name="line.335"></a>
<FONT color="green">336</FONT>         * calling this function, one should first call <a name="line.336"></a>
<FONT color="green">337</FONT>         * {@link #isIndexed(int) isIndexed} to make sure that the index can <a name="line.337"></a>
<FONT color="green">338</FONT>         * contain nodes that match the given expanded type ID.<a name="line.338"></a>
<FONT color="green">339</FONT>         *<a name="line.339"></a>
<FONT color="green">340</FONT>         * @param axisRoot The root identity of the axis.<a name="line.340"></a>
<FONT color="green">341</FONT>         * @param nextPotential The node found must match or occur after this node.<a name="line.341"></a>
<FONT color="green">342</FONT>         * @param expandedTypeID The expanded type ID for the request.<a name="line.342"></a>
<FONT color="green">343</FONT>         *<a name="line.343"></a>
<FONT color="green">344</FONT>         * @return The node ID or NULL if not found.<a name="line.344"></a>
<FONT color="green">345</FONT>         */<a name="line.345"></a>
<FONT color="green">346</FONT>        protected int getNextIndexed(int axisRoot, int nextPotential,<a name="line.346"></a>
<FONT color="green">347</FONT>                                     int expandedTypeID)<a name="line.347"></a>
<FONT color="green">348</FONT>        {<a name="line.348"></a>
<FONT color="green">349</FONT>    <a name="line.349"></a>
<FONT color="green">350</FONT>          int nsIndex = m_expandedNameTable.getNamespaceID(expandedTypeID);<a name="line.350"></a>
<FONT color="green">351</FONT>          int lnIndex = m_expandedNameTable.getLocalNameID(expandedTypeID);<a name="line.351"></a>
<FONT color="green">352</FONT>    <a name="line.352"></a>
<FONT color="green">353</FONT>          for (; ; ) <a name="line.353"></a>
<FONT color="green">354</FONT>          {<a name="line.354"></a>
<FONT color="green">355</FONT>            int nextID = findElementFromIndex(nsIndex, lnIndex, nextPotential);<a name="line.355"></a>
<FONT color="green">356</FONT>    <a name="line.356"></a>
<FONT color="green">357</FONT>            if (NOTPROCESSED != nextID)<a name="line.357"></a>
<FONT color="green">358</FONT>            {<a name="line.358"></a>
<FONT color="green">359</FONT>              int parentID = m_parent.elementAt(nextID);<a name="line.359"></a>
<FONT color="green">360</FONT>              <a name="line.360"></a>
<FONT color="green">361</FONT>              // Is it a child?<a name="line.361"></a>
<FONT color="green">362</FONT>              if(parentID == axisRoot)<a name="line.362"></a>
<FONT color="green">363</FONT>                return nextID;<a name="line.363"></a>
<FONT color="green">364</FONT>              <a name="line.364"></a>
<FONT color="green">365</FONT>              // If the parent occured before the subtree root, then <a name="line.365"></a>
<FONT color="green">366</FONT>              // we know it is past the child axis.<a name="line.366"></a>
<FONT color="green">367</FONT>              if(parentID &lt; axisRoot)<a name="line.367"></a>
<FONT color="green">368</FONT>                  return NULL;<a name="line.368"></a>
<FONT color="green">369</FONT>              <a name="line.369"></a>
<FONT color="green">370</FONT>              // Otherwise, it could be a descendant below the subtree root <a name="line.370"></a>
<FONT color="green">371</FONT>              // children, or it could be after the subtree root.  So we have <a name="line.371"></a>
<FONT color="green">372</FONT>              // to climb up until the parent is less than the subtree root, in <a name="line.372"></a>
<FONT color="green">373</FONT>              // which case we return NULL, or until it is equal to the subtree <a name="line.373"></a>
<FONT color="green">374</FONT>              // root, in which case we continue to look.<a name="line.374"></a>
<FONT color="green">375</FONT>              do<a name="line.375"></a>
<FONT color="green">376</FONT>              {<a name="line.376"></a>
<FONT color="green">377</FONT>                parentID = m_parent.elementAt(parentID);<a name="line.377"></a>
<FONT color="green">378</FONT>                if(parentID &lt; axisRoot)<a name="line.378"></a>
<FONT color="green">379</FONT>                  return NULL;<a name="line.379"></a>
<FONT color="green">380</FONT>              }<a name="line.380"></a>
<FONT color="green">381</FONT>                while(parentID &gt; axisRoot);<a name="line.381"></a>
<FONT color="green">382</FONT>              <a name="line.382"></a>
<FONT color="green">383</FONT>              // System.out.println("Found node via index: "+first);<a name="line.383"></a>
<FONT color="green">384</FONT>              nextPotential = nextID+1;<a name="line.384"></a>
<FONT color="green">385</FONT>              continue;<a name="line.385"></a>
<FONT color="green">386</FONT>            }<a name="line.386"></a>
<FONT color="green">387</FONT>    <a name="line.387"></a>
<FONT color="green">388</FONT>            nextNode();<a name="line.388"></a>
<FONT color="green">389</FONT>            <a name="line.389"></a>
<FONT color="green">390</FONT>            if(!(m_nextsib.elementAt(axisRoot) == NOTPROCESSED))<a name="line.390"></a>
<FONT color="green">391</FONT>              break;<a name="line.391"></a>
<FONT color="green">392</FONT>          }<a name="line.392"></a>
<FONT color="green">393</FONT>    <a name="line.393"></a>
<FONT color="green">394</FONT>          return DTM.NULL;<a name="line.394"></a>
<FONT color="green">395</FONT>        }<a name="line.395"></a>
<FONT color="green">396</FONT>            <a name="line.396"></a>
<FONT color="green">397</FONT>        /**<a name="line.397"></a>
<FONT color="green">398</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.398"></a>
<FONT color="green">399</FONT>         * returned or the iteration will go into an infinate loop.  So to traverse <a name="line.399"></a>
<FONT color="green">400</FONT>         * an axis, the first function must be used to get the first node.<a name="line.400"></a>
<FONT color="green">401</FONT>         *<a name="line.401"></a>
<FONT color="green">402</FONT>         * &lt;p&gt;This method needs to be overloaded only by those axis that process<a name="line.402"></a>
<FONT color="green">403</FONT>         * the self node. &lt;\p&gt;<a name="line.403"></a>
<FONT color="green">404</FONT>         *<a name="line.404"></a>
<FONT color="green">405</FONT>         * @param context The context node of this traversal. This is the point<a name="line.405"></a>
<FONT color="green">406</FONT>         * that the traversal starts from.<a name="line.406"></a>
<FONT color="green">407</FONT>         * @return the first node in the traversal.<a name="line.407"></a>
<FONT color="green">408</FONT>         */<a name="line.408"></a>
<FONT color="green">409</FONT>        public int first(int context)<a name="line.409"></a>
<FONT color="green">410</FONT>        {<a name="line.410"></a>
<FONT color="green">411</FONT>          return getFirstChild(context);<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>        /**<a name="line.414"></a>
<FONT color="green">415</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.415"></a>
<FONT color="green">416</FONT>         * returned or the iteration will go into an infinate loop.  So to traverse <a name="line.416"></a>
<FONT color="green">417</FONT>         * an axis, the first function must be used to get the first node.<a name="line.417"></a>
<FONT color="green">418</FONT>         *<a name="line.418"></a>
<FONT color="green">419</FONT>         * &lt;p&gt;This method needs to be overloaded only by those axis that process<a name="line.419"></a>
<FONT color="green">420</FONT>         * the self node. &lt;\p&gt;<a name="line.420"></a>
<FONT color="green">421</FONT>         *<a name="line.421"></a>
<FONT color="green">422</FONT>         * @param context The context node of this traversal. This is the point<a name="line.422"></a>
<FONT color="green">423</FONT>         * of origin for the traversal -- its "root node" or starting point.<a name="line.423"></a>
<FONT color="green">424</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.424"></a>
<FONT color="green">425</FONT>         *<a name="line.425"></a>
<FONT color="green">426</FONT>         * @return the first node in the traversal.<a name="line.426"></a>
<FONT color="green">427</FONT>         */<a name="line.427"></a>
<FONT color="green">428</FONT>        public int first(int context, int expandedTypeID)<a name="line.428"></a>
<FONT color="green">429</FONT>        {<a name="line.429"></a>
<FONT color="green">430</FONT>          if(true)<a name="line.430"></a>
<FONT color="green">431</FONT>          {<a name="line.431"></a>
<FONT color="green">432</FONT>            int identity = makeNodeIdentity(context);<a name="line.432"></a>
<FONT color="green">433</FONT>            <a name="line.433"></a>
<FONT color="green">434</FONT>            int firstMatch = getNextIndexed(identity, _firstch(identity),<a name="line.434"></a>
<FONT color="green">435</FONT>                                     expandedTypeID);<a name="line.435"></a>
<FONT color="green">436</FONT>           <a name="line.436"></a>
<FONT color="green">437</FONT>            return makeNodeHandle(firstMatch);<a name="line.437"></a>
<FONT color="green">438</FONT>          }<a name="line.438"></a>
<FONT color="green">439</FONT>          else<a name="line.439"></a>
<FONT color="green">440</FONT>          {<a name="line.440"></a>
<FONT color="green">441</FONT>                                    // %REVIEW% Dead code. Eliminate?<a name="line.441"></a>
<FONT color="green">442</FONT>            for (int current = _firstch(makeNodeIdentity(context)); <a name="line.442"></a>
<FONT color="green">443</FONT>                 DTM.NULL != current; <a name="line.443"></a>
<FONT color="green">444</FONT>                 current = _nextsib(current)) <a name="line.444"></a>
<FONT color="green">445</FONT>            {<a name="line.445"></a>
<FONT color="green">446</FONT>              if (m_exptype.elementAt(current) == expandedTypeID)<a name="line.446"></a>
<FONT color="green">447</FONT>                  return makeNodeHandle(current);<a name="line.447"></a>
<FONT color="green">448</FONT>            }<a name="line.448"></a>
<FONT color="green">449</FONT>            return NULL;<a name="line.449"></a>
<FONT color="green">450</FONT>          }<a name="line.450"></a>
<FONT color="green">451</FONT>        }<a name="line.451"></a>
<FONT color="green">452</FONT>    <a name="line.452"></a>
<FONT color="green">453</FONT>        /**<a name="line.453"></a>
<FONT color="green">454</FONT>         * Traverse to the next node after the current node.<a name="line.454"></a>
<FONT color="green">455</FONT>         *<a name="line.455"></a>
<FONT color="green">456</FONT>         * @param context The context node of this iteration.<a name="line.456"></a>
<FONT color="green">457</FONT>         * @param current The current node of the iteration.<a name="line.457"></a>
<FONT color="green">458</FONT>         *<a name="line.458"></a>
<FONT color="green">459</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.459"></a>
<FONT color="green">460</FONT>         */<a name="line.460"></a>
<FONT color="green">461</FONT>        public int next(int context, int current)<a name="line.461"></a>
<FONT color="green">462</FONT>        {<a name="line.462"></a>
<FONT color="green">463</FONT>          return getNextSibling(current);<a name="line.463"></a>
<FONT color="green">464</FONT>        }<a name="line.464"></a>
<FONT color="green">465</FONT>    <a name="line.465"></a>
<FONT color="green">466</FONT>        /**<a name="line.466"></a>
<FONT color="green">467</FONT>         * Traverse to the next node after the current node that is matched<a name="line.467"></a>
<FONT color="green">468</FONT>         * by the expanded type ID.<a name="line.468"></a>
<FONT color="green">469</FONT>         *<a name="line.469"></a>
<FONT color="green">470</FONT>         * @param context The context node of this iteration.<a name="line.470"></a>
<FONT color="green">471</FONT>         * @param current The current node of the iteration.<a name="line.471"></a>
<FONT color="green">472</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.472"></a>
<FONT color="green">473</FONT>         *<a name="line.473"></a>
<FONT color="green">474</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.474"></a>
<FONT color="green">475</FONT>         */<a name="line.475"></a>
<FONT color="green">476</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.476"></a>
<FONT color="green">477</FONT>        {<a name="line.477"></a>
<FONT color="green">478</FONT>                            // Process in Identifier space<a name="line.478"></a>
<FONT color="green">479</FONT>          for (current = _nextsib(makeNodeIdentity(current)); <a name="line.479"></a>
<FONT color="green">480</FONT>               DTM.NULL != current; <a name="line.480"></a>
<FONT color="green">481</FONT>               current = _nextsib(current)) <a name="line.481"></a>
<FONT color="green">482</FONT>          {<a name="line.482"></a>
<FONT color="green">483</FONT>            if (m_exptype.elementAt(current) == expandedTypeID)<a name="line.483"></a>
<FONT color="green">484</FONT>                return makeNodeHandle(current);<a name="line.484"></a>
<FONT color="green">485</FONT>          }<a name="line.485"></a>
<FONT color="green">486</FONT>          <a name="line.486"></a>
<FONT color="green">487</FONT>          return NULL;<a name="line.487"></a>
<FONT color="green">488</FONT>        }<a name="line.488"></a>
<FONT color="green">489</FONT>      }<a name="line.489"></a>
<FONT color="green">490</FONT>    <a name="line.490"></a>
<FONT color="green">491</FONT>      /**<a name="line.491"></a>
<FONT color="green">492</FONT>       * Super class for derived classes that want a convenient way to access <a name="line.492"></a>
<FONT color="green">493</FONT>       * the indexing mechanism.<a name="line.493"></a>
<FONT color="green">494</FONT>       */<a name="line.494"></a>
<FONT color="green">495</FONT>      private abstract class IndexedDTMAxisTraverser extends DTMAxisTraverser<a name="line.495"></a>
<FONT color="green">496</FONT>      {<a name="line.496"></a>
<FONT color="green">497</FONT>    <a name="line.497"></a>
<FONT color="green">498</FONT>        /**<a name="line.498"></a>
<FONT color="green">499</FONT>         * Tell if the indexing is on and the given expanded type ID matches <a name="line.499"></a>
<FONT color="green">500</FONT>         * what is in the indexes.  Derived classes should call this before <a name="line.500"></a>
<FONT color="green">501</FONT>         * calling {@link #getNextIndexed(int, int, int) getNextIndexed} method.<a name="line.501"></a>
<FONT color="green">502</FONT>         *<a name="line.502"></a>
<FONT color="green">503</FONT>         * @param expandedTypeID The expanded type ID being requested.<a name="line.503"></a>
<FONT color="green">504</FONT>         *<a name="line.504"></a>
<FONT color="green">505</FONT>         * @return true if it is OK to call the <a name="line.505"></a>
<FONT color="green">506</FONT>         *         {@link #getNextIndexed(int, int, int) getNextIndexed} method.<a name="line.506"></a>
<FONT color="green">507</FONT>         */<a name="line.507"></a>
<FONT color="green">508</FONT>        protected final boolean isIndexed(int expandedTypeID)<a name="line.508"></a>
<FONT color="green">509</FONT>        {<a name="line.509"></a>
<FONT color="green">510</FONT>          return (m_indexing<a name="line.510"></a>
<FONT color="green">511</FONT>                  &amp;&amp; ExpandedNameTable.ELEMENT<a name="line.511"></a>
<FONT color="green">512</FONT>                     == m_expandedNameTable.getType(expandedTypeID)); <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>         * Tell if a node is outside the axis being traversed.  This method must be <a name="line.516"></a>
<FONT color="green">517</FONT>         * implemented by derived classes, and must be robust enough to handle any <a name="line.517"></a>
<FONT color="green">518</FONT>         * node that occurs after the axis root.<a name="line.518"></a>
<FONT color="green">519</FONT>         *<a name="line.519"></a>
<FONT color="green">520</FONT>         * @param axisRoot The root identity of the axis.<a name="line.520"></a>
<FONT color="green">521</FONT>         * @param identity The node in question.<a name="line.521"></a>
<FONT color="green">522</FONT>         *<a name="line.522"></a>
<FONT color="green">523</FONT>         * @return true if the given node falls outside the axis being traversed.<a name="line.523"></a>
<FONT color="green">524</FONT>         */<a name="line.524"></a>
<FONT color="green">525</FONT>        protected abstract boolean isAfterAxis(int axisRoot, int identity);<a name="line.525"></a>
<FONT color="green">526</FONT>    <a name="line.526"></a>
<FONT color="green">527</FONT>        /**<a name="line.527"></a>
<FONT color="green">528</FONT>         * Tell if the axis has been fully processed to tell if a the wait for <a name="line.528"></a>
<FONT color="green">529</FONT>         * an arriving node should terminate.  This method must be implemented <a name="line.529"></a>
<FONT color="green">530</FONT>         * be a derived class.<a name="line.530"></a>
<FONT color="green">531</FONT>         *<a name="line.531"></a>
<FONT color="green">532</FONT>         * @param axisRoot The root identity of the axis.<a name="line.532"></a>
<FONT color="green">533</FONT>         *<a name="line.533"></a>
<FONT color="green">534</FONT>         * @return true if the axis has been fully processed.<a name="line.534"></a>
<FONT color="green">535</FONT>         */<a name="line.535"></a>
<FONT color="green">536</FONT>        protected abstract boolean axisHasBeenProcessed(int axisRoot);<a name="line.536"></a>
<FONT color="green">537</FONT>    <a name="line.537"></a>
<FONT color="green">538</FONT>        /**<a name="line.538"></a>
<FONT color="green">539</FONT>         * Get the next indexed node that matches the expanded type ID.  Before <a name="line.539"></a>
<FONT color="green">540</FONT>         * calling this function, one should first call <a name="line.540"></a>
<FONT color="green">541</FONT>         * {@link #isIndexed(int) isIndexed} to make sure that the index can <a name="line.541"></a>
<FONT color="green">542</FONT>         * contain nodes that match the given expanded type ID.<a name="line.542"></a>
<FONT color="green">543</FONT>         *<a name="line.543"></a>
<FONT color="green">544</FONT>         * @param axisRoot The root identity of the axis.<a name="line.544"></a>
<FONT color="green">545</FONT>         * @param nextPotential The node found must match or occur after this node.<a name="line.545"></a>
<FONT color="green">546</FONT>         * @param expandedTypeID The expanded type ID for the request.<a name="line.546"></a>
<FONT color="green">547</FONT>         *<a name="line.547"></a>
<FONT color="green">548</FONT>         * @return The node ID or NULL if not found.<a name="line.548"></a>
<FONT color="green">549</FONT>         */<a name="line.549"></a>
<FONT color="green">550</FONT>        protected int getNextIndexed(int axisRoot, int nextPotential,<a name="line.550"></a>
<FONT color="green">551</FONT>                                     int expandedTypeID)<a name="line.551"></a>
<FONT color="green">552</FONT>        {<a name="line.552"></a>
<FONT color="green">553</FONT>    <a name="line.553"></a>
<FONT color="green">554</FONT>          int nsIndex = m_expandedNameTable.getNamespaceID(expandedTypeID);<a name="line.554"></a>
<FONT color="green">555</FONT>          int lnIndex = m_expandedNameTable.getLocalNameID(expandedTypeID);<a name="line.555"></a>
<FONT color="green">556</FONT>    <a name="line.556"></a>
<FONT color="green">557</FONT>          while(true)<a name="line.557"></a>
<FONT color="green">558</FONT>          {<a name="line.558"></a>
<FONT color="green">559</FONT>            int next = findElementFromIndex(nsIndex, lnIndex, nextPotential);<a name="line.559"></a>
<FONT color="green">560</FONT>    <a name="line.560"></a>
<FONT color="green">561</FONT>            if (NOTPROCESSED != next)<a name="line.561"></a>
<FONT color="green">562</FONT>            {<a name="line.562"></a>
<FONT color="green">563</FONT>              if (isAfterAxis(axisRoot, next))<a name="line.563"></a>
<FONT color="green">564</FONT>                return NULL;<a name="line.564"></a>
<FONT color="green">565</FONT>    <a name="line.565"></a>
<FONT color="green">566</FONT>              // System.out.println("Found node via index: "+first);<a name="line.566"></a>
<FONT color="green">567</FONT>              return next;<a name="line.567"></a>
<FONT color="green">568</FONT>            }<a name="line.568"></a>
<FONT color="green">569</FONT>            else if(axisHasBeenProcessed(axisRoot))<a name="line.569"></a>
<FONT color="green">570</FONT>              break;<a name="line.570"></a>
<FONT color="green">571</FONT>    <a name="line.571"></a>
<FONT color="green">572</FONT>            nextNode();<a name="line.572"></a>
<FONT color="green">573</FONT>          }<a name="line.573"></a>
<FONT color="green">574</FONT>    <a name="line.574"></a>
<FONT color="green">575</FONT>          return DTM.NULL;<a name="line.575"></a>
<FONT color="green">576</FONT>        }<a name="line.576"></a>
<FONT color="green">577</FONT>      }<a name="line.577"></a>
<FONT color="green">578</FONT>    <a name="line.578"></a>
<FONT color="green">579</FONT>      /**<a name="line.579"></a>
<FONT color="green">580</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.580"></a>
<FONT color="green">581</FONT>       */<a name="line.581"></a>
<FONT color="green">582</FONT>      private class DescendantTraverser extends IndexedDTMAxisTraverser<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>         * Get the first potential identity that can be returned.  This should <a name="line.585"></a>
<FONT color="green">586</FONT>         * be overridded by classes that need to return the self node.<a name="line.586"></a>
<FONT color="green">587</FONT>         *<a name="line.587"></a>
<FONT color="green">588</FONT>         * @param identity The node identity of the root context of the traversal.<a name="line.588"></a>
<FONT color="green">589</FONT>         *<a name="line.589"></a>
<FONT color="green">590</FONT>         * @return The first potential node that can be in the traversal.<a name="line.590"></a>
<FONT color="green">591</FONT>         */<a name="line.591"></a>
<FONT color="green">592</FONT>        protected int getFirstPotential(int identity)<a name="line.592"></a>
<FONT color="green">593</FONT>        {<a name="line.593"></a>
<FONT color="green">594</FONT>          return identity + 1;<a name="line.594"></a>
<FONT color="green">595</FONT>        }<a name="line.595"></a>
<FONT color="green">596</FONT>        <a name="line.596"></a>
<FONT color="green">597</FONT>        /**<a name="line.597"></a>
<FONT color="green">598</FONT>         * Tell if the axis has been fully processed to tell if a the wait for <a name="line.598"></a>
<FONT color="green">599</FONT>         * an arriving node should terminate.<a name="line.599"></a>
<FONT color="green">600</FONT>         *<a name="line.600"></a>
<FONT color="green">601</FONT>         * @param axisRoot The root identity of the axis.<a name="line.601"></a>
<FONT color="green">602</FONT>         *<a name="line.602"></a>
<FONT color="green">603</FONT>         * @return true if the axis has been fully processed.<a name="line.603"></a>
<FONT color="green">604</FONT>         */<a name="line.604"></a>
<FONT color="green">605</FONT>        protected boolean axisHasBeenProcessed(int axisRoot)<a name="line.605"></a>
<FONT color="green">606</FONT>        {<a name="line.606"></a>
<FONT color="green">607</FONT>          return !(m_nextsib.elementAt(axisRoot) == NOTPROCESSED);<a name="line.607"></a>
<FONT color="green">608</FONT>        }<a name="line.608"></a>
<FONT color="green">609</FONT>        <a name="line.609"></a>
<FONT color="green">610</FONT>        /**<a name="line.610"></a>
<FONT color="green">611</FONT>         * Get the subtree root identity from the handle that was passed in by <a name="line.611"></a>
<FONT color="green">612</FONT>         * the caller.  Derived classes may override this to change the root <a name="line.612"></a>
<FONT color="green">613</FONT>         * context of the traversal.<a name="line.613"></a>
<FONT color="green">614</FONT>         * <a name="line.614"></a>
<FONT color="green">615</FONT>         * @param handle handle to the root context.<a name="line.615"></a>
<FONT color="green">616</FONT>         * @return identity of the root of the subtree.<a name="line.616"></a>
<FONT color="green">617</FONT>         */<a name="line.617"></a>
<FONT color="green">618</FONT>        protected int getSubtreeRoot(int handle)<a name="line.618"></a>
<FONT color="green">619</FONT>        {<a name="line.619"></a>
<FONT color="green">620</FONT>          return makeNodeIdentity(handle);<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>         * Tell if this node identity is a descendant.  Assumes that<a name="line.624"></a>
<FONT color="green">625</FONT>         * the node info for the element has already been obtained.<a name="line.625"></a>
<FONT color="green">626</FONT>         *<a name="line.626"></a>
<FONT color="green">627</FONT>         * %REVIEW% This is really parentFollowsRootInDocumentOrder ...<a name="line.627"></a>
<FONT color="green">628</FONT>         * which fails if the parent starts after the root ends.<a name="line.628"></a>
<FONT color="green">629</FONT>         * May be sufficient for this class's logic, but misleadingly named!<a name="line.629"></a>
<FONT color="green">630</FONT>         *<a name="line.630"></a>
<FONT color="green">631</FONT>         * @param subtreeRootIdentity The root context of the subtree in question.<a name="line.631"></a>
<FONT color="green">632</FONT>         * @param identity The index number of the node in question.<a name="line.632"></a>
<FONT color="green">633</FONT>         * @return true if the index is a descendant of _startNode.<a name="line.633"></a>
<FONT color="green">634</FONT>         */<a name="line.634"></a>
<FONT color="green">635</FONT>        protected boolean isDescendant(int subtreeRootIdentity, int identity)<a name="line.635"></a>
<FONT color="green">636</FONT>        {<a name="line.636"></a>
<FONT color="green">637</FONT>          return _parent(identity) &gt;= subtreeRootIdentity;<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>        /**<a name="line.640"></a>
<FONT color="green">641</FONT>         * Tell if a node is outside the axis being traversed.  This method must be <a name="line.641"></a>
<FONT color="green">642</FONT>         * implemented by derived classes, and must be robust enough to handle any <a name="line.642"></a>
<FONT color="green">643</FONT>         * node that occurs after the axis root.<a name="line.643"></a>
<FONT color="green">644</FONT>         *<a name="line.644"></a>
<FONT color="green">645</FONT>         * @param axisRoot The root identity of the axis.<a name="line.645"></a>
<FONT color="green">646</FONT>         * @param identity The node in question.<a name="line.646"></a>
<FONT color="green">647</FONT>         *<a name="line.647"></a>
<FONT color="green">648</FONT>         * @return true if the given node falls outside the axis being traversed.<a name="line.648"></a>
<FONT color="green">649</FONT>         */<a name="line.649"></a>
<FONT color="green">650</FONT>        protected boolean isAfterAxis(int axisRoot, int identity)<a name="line.650"></a>
<FONT color="green">651</FONT>        {   <a name="line.651"></a>
<FONT color="green">652</FONT>          // %REVIEW% Is there *any* cheaper way to do this?<a name="line.652"></a>
<FONT color="green">653</FONT>                            // Yes. In ID space, compare to axisRoot's successor<a name="line.653"></a>
<FONT color="green">654</FONT>                            // (next-sib or ancestor's-next-sib). Probably shallower search.<a name="line.654"></a>
<FONT color="green">655</FONT>          do<a name="line.655"></a>
<FONT color="green">656</FONT>          {<a name="line.656"></a>
<FONT color="green">657</FONT>            if(identity == axisRoot)<a name="line.657"></a>
<FONT color="green">658</FONT>              return false;<a name="line.658"></a>
<FONT color="green">659</FONT>            identity = m_parent.elementAt(identity);<a name="line.659"></a>
<FONT color="green">660</FONT>          }<a name="line.660"></a>
<FONT color="green">661</FONT>            while(identity &gt;= axisRoot);<a name="line.661"></a>
<FONT color="green">662</FONT>            <a name="line.662"></a>
<FONT color="green">663</FONT>          return true;<a name="line.663"></a>
<FONT color="green">664</FONT>        }<a name="line.664"></a>
<FONT color="green">665</FONT>    <a name="line.665"></a>
<FONT color="green">666</FONT>        /**<a name="line.666"></a>
<FONT color="green">667</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.667"></a>
<FONT color="green">668</FONT>         * returned or the iteration will go into an infinate loop.  So to traverse<a name="line.668"></a>
<FONT color="green">669</FONT>         * an axis, the first function must be used to get the first node.<a name="line.669"></a>
<FONT color="green">670</FONT>         *<a name="line.670"></a>
<FONT color="green">671</FONT>         * &lt;p&gt;This method needs to be overloaded only by those axis that process<a name="line.671"></a>
<FONT color="green">672</FONT>         * the self node. &lt;\p&gt;<a name="line.672"></a>
<FONT color="green">673</FONT>         *<a name="line.673"></a>
<FONT color="green">674</FONT>         * @param context The context node of this traversal. This is the point<a name="line.674"></a>
<FONT color="green">675</FONT>         * of origin for the traversal -- its "root node" or starting point.<a name="line.675"></a>
<FONT color="green">676</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.676"></a>
<FONT color="green">677</FONT>         *<a name="line.677"></a>
<FONT color="green">678</FONT>         * @return the first node in the traversal.<a name="line.678"></a>
<FONT color="green">679</FONT>         */<a name="line.679"></a>
<FONT color="green">680</FONT>        public int first(int context, int expandedTypeID)<a name="line.680"></a>
<FONT color="green">681</FONT>        {<a name="line.681"></a>
<FONT color="green">682</FONT>    <a name="line.682"></a>
<FONT color="green">683</FONT>          if (isIndexed(expandedTypeID))<a name="line.683"></a>
<FONT color="green">684</FONT>          {<a name="line.684"></a>
<FONT color="green">685</FONT>            int identity = getSubtreeRoot(context);<a name="line.685"></a>
<FONT color="green">686</FONT>            int firstPotential = getFirstPotential(identity);<a name="line.686"></a>
<FONT color="green">687</FONT>    <a name="line.687"></a>
<FONT color="green">688</FONT>            return makeNodeHandle(getNextIndexed(identity, firstPotential, expandedTypeID));<a name="line.688"></a>
<FONT color="green">689</FONT>          }<a name="line.689"></a>
<FONT color="green">690</FONT>    <a name="line.690"></a>
<FONT color="green">691</FONT>          return next(context, context, expandedTypeID);<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>         * Traverse to the next node after the current node.<a name="line.695"></a>
<FONT color="green">696</FONT>         *<a name="line.696"></a>
<FONT color="green">697</FONT>         * @param context The context node of this iteration.<a name="line.697"></a>
<FONT color="green">698</FONT>         * @param current The current node of the iteration.<a name="line.698"></a>
<FONT color="green">699</FONT>         *<a name="line.699"></a>
<FONT color="green">700</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.700"></a>
<FONT color="green">701</FONT>         */<a name="line.701"></a>
<FONT color="green">702</FONT>        public int next(int context, int current)<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>          int subtreeRootIdent = getSubtreeRoot(context);<a name="line.705"></a>
<FONT color="green">706</FONT>    <a name="line.706"></a>
<FONT color="green">707</FONT>          for (current = makeNodeIdentity(current) + 1; ; current++)<a name="line.707"></a>
<FONT color="green">708</FONT>          {<a name="line.708"></a>
<FONT color="green">709</FONT>            int type = _type(current);  // may call nextNode()<a name="line.709"></a>
<FONT color="green">710</FONT>    <a name="line.710"></a>
<FONT color="green">711</FONT>            if (!isDescendant(subtreeRootIdent, current))<a name="line.711"></a>
<FONT color="green">712</FONT>              return NULL;<a name="line.712"></a>
<FONT color="green">713</FONT>    <a name="line.713"></a>
<FONT color="green">714</FONT>            if (ATTRIBUTE_NODE == type || NAMESPACE_NODE == type)<a name="line.714"></a>
<FONT color="green">715</FONT>              continue;<a name="line.715"></a>
<FONT color="green">716</FONT>    <a name="line.716"></a>
<FONT color="green">717</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.717"></a>
<FONT color="green">718</FONT>          }<a name="line.718"></a>
<FONT color="green">719</FONT>        }<a name="line.719"></a>
<FONT color="green">720</FONT>    <a name="line.720"></a>
<FONT color="green">721</FONT>        /**<a name="line.721"></a>
<FONT color="green">722</FONT>         * Traverse to the next node after the current node that is matched<a name="line.722"></a>
<FONT color="green">723</FONT>         * by the expanded type ID.<a name="line.723"></a>
<FONT color="green">724</FONT>         *<a name="line.724"></a>
<FONT color="green">725</FONT>         * @param context The context node of this iteration.<a name="line.725"></a>
<FONT color="green">726</FONT>         * @param current The current node of the iteration.<a name="line.726"></a>
<FONT color="green">727</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.727"></a>
<FONT color="green">728</FONT>         *<a name="line.728"></a>
<FONT color="green">729</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.729"></a>
<FONT color="green">730</FONT>         */<a name="line.730"></a>
<FONT color="green">731</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.731"></a>
<FONT color="green">732</FONT>        {<a name="line.732"></a>
<FONT color="green">733</FONT>    <a name="line.733"></a>
<FONT color="green">734</FONT>          int subtreeRootIdent = getSubtreeRoot(context);<a name="line.734"></a>
<FONT color="green">735</FONT>    <a name="line.735"></a>
<FONT color="green">736</FONT>          current = makeNodeIdentity(current) + 1;<a name="line.736"></a>
<FONT color="green">737</FONT>    <a name="line.737"></a>
<FONT color="green">738</FONT>          if (isIndexed(expandedTypeID))<a name="line.738"></a>
<FONT color="green">739</FONT>          {<a name="line.739"></a>
<FONT color="green">740</FONT>            return makeNodeHandle(getNextIndexed(subtreeRootIdent, current, expandedTypeID));<a name="line.740"></a>
<FONT color="green">741</FONT>          }<a name="line.741"></a>
<FONT color="green">742</FONT>    <a name="line.742"></a>
<FONT color="green">743</FONT>          for (; ; current++)<a name="line.743"></a>
<FONT color="green">744</FONT>          {<a name="line.744"></a>
<FONT color="green">745</FONT>            int exptype = _exptype(current);  // may call nextNode()<a name="line.745"></a>
<FONT color="green">746</FONT>    <a name="line.746"></a>
<FONT color="green">747</FONT>            if (!isDescendant(subtreeRootIdent, current))<a name="line.747"></a>
<FONT color="green">748</FONT>              return NULL;<a name="line.748"></a>
<FONT color="green">749</FONT>    <a name="line.749"></a>
<FONT color="green">750</FONT>            if (exptype != expandedTypeID)<a name="line.750"></a>
<FONT color="green">751</FONT>              continue;<a name="line.751"></a>
<FONT color="green">752</FONT>    <a name="line.752"></a>
<FONT color="green">753</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.753"></a>
<FONT color="green">754</FONT>          }<a name="line.754"></a>
<FONT color="green">755</FONT>        }<a name="line.755"></a>
<FONT color="green">756</FONT>      }<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>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.759"></a>
<FONT color="green">760</FONT>       */<a name="line.760"></a>
<FONT color="green">761</FONT>      private class DescendantOrSelfTraverser extends DescendantTraverser<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>        /**<a name="line.764"></a>
<FONT color="green">765</FONT>         * Get the first potential identity that can be returned, which is the <a name="line.765"></a>
<FONT color="green">766</FONT>         * axis context, in this case.<a name="line.766"></a>
<FONT color="green">767</FONT>         *<a name="line.767"></a>
<FONT color="green">768</FONT>         * @param identity The node identity of the root context of the traversal.<a name="line.768"></a>
<FONT color="green">769</FONT>         *<a name="line.769"></a>
<FONT color="green">770</FONT>         * @return The axis context.<a name="line.770"></a>
<FONT color="green">771</FONT>         */<a name="line.771"></a>
<FONT color="green">772</FONT>        protected int getFirstPotential(int identity)<a name="line.772"></a>
<FONT color="green">773</FONT>        {<a name="line.773"></a>
<FONT color="green">774</FONT>          return identity;<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>        /**<a name="line.777"></a>
<FONT color="green">778</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.778"></a>
<FONT color="green">779</FONT>         * returned or the iteration will go into an infinate loop.  To see if<a name="line.779"></a>
<FONT color="green">780</FONT>         * the self node should be processed, use this function.<a name="line.780"></a>
<FONT color="green">781</FONT>         *<a name="line.781"></a>
<FONT color="green">782</FONT>         * @param context The context node of this traversal.<a name="line.782"></a>
<FONT color="green">783</FONT>         *<a name="line.783"></a>
<FONT color="green">784</FONT>         * @return the first node in the traversal.<a name="line.784"></a>
<FONT color="green">785</FONT>         */<a name="line.785"></a>
<FONT color="green">786</FONT>        public int first(int context)<a name="line.786"></a>
<FONT color="green">787</FONT>        {<a name="line.787"></a>
<FONT color="green">788</FONT>          return context;<a name="line.788"></a>
<FONT color="green">789</FONT>        }<a name="line.789"></a>
<FONT color="green">790</FONT>      }<a name="line.790"></a>
<FONT color="green">791</FONT>    <a name="line.791"></a>
<FONT color="green">792</FONT>      /**<a name="line.792"></a>
<FONT color="green">793</FONT>       * Implements traversal of the entire subtree, including the root node.<a name="line.793"></a>
<FONT color="green">794</FONT>       */<a name="line.794"></a>
<FONT color="green">795</FONT>      private class AllFromNodeTraverser extends DescendantOrSelfTraverser<a name="line.795"></a>
<FONT color="green">796</FONT>      {<a name="line.796"></a>
<FONT color="green">797</FONT>    <a name="line.797"></a>
<FONT color="green">798</FONT>        /**<a name="line.798"></a>
<FONT color="green">799</FONT>         * Traverse to the next node after the current node.<a name="line.799"></a>
<FONT color="green">800</FONT>         *<a name="line.800"></a>
<FONT color="green">801</FONT>         * @param context The context node of this iteration.<a name="line.801"></a>
<FONT color="green">802</FONT>         * @param current The current node of the iteration.<a name="line.802"></a>
<FONT color="green">803</FONT>         *<a name="line.803"></a>
<FONT color="green">804</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.804"></a>
<FONT color="green">805</FONT>         */<a name="line.805"></a>
<FONT color="green">806</FONT>        public int next(int context, int current)<a name="line.806"></a>
<FONT color="green">807</FONT>        {<a name="line.807"></a>
<FONT color="green">808</FONT>    <a name="line.808"></a>
<FONT color="green">809</FONT>          int subtreeRootIdent = makeNodeIdentity(context);<a name="line.809"></a>
<FONT color="green">810</FONT>    <a name="line.810"></a>
<FONT color="green">811</FONT>          for (current = makeNodeIdentity(current) + 1; ; current++)<a name="line.811"></a>
<FONT color="green">812</FONT>          {<a name="line.812"></a>
<FONT color="green">813</FONT>            // Trickological code: _exptype() has the side-effect of<a name="line.813"></a>
<FONT color="green">814</FONT>            // running nextNode until the specified node has been loaded,<a name="line.814"></a>
<FONT color="green">815</FONT>            // and thus can be used to ensure that incremental construction of<a name="line.815"></a>
<FONT color="green">816</FONT>            // the DTM has gotten this far. Using it just for that side-effect<a name="line.816"></a>
<FONT color="green">817</FONT>            // is quite a kluge...<a name="line.817"></a>
<FONT color="green">818</FONT>            _exptype(current);  // make sure it's here.<a name="line.818"></a>
<FONT color="green">819</FONT>    <a name="line.819"></a>
<FONT color="green">820</FONT>            if (!isDescendant(subtreeRootIdent, current))<a name="line.820"></a>
<FONT color="green">821</FONT>              return NULL;<a name="line.821"></a>
<FONT color="green">822</FONT>    <a name="line.822"></a>
<FONT color="green">823</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.823"></a>
<FONT color="green">824</FONT>          }<a name="line.824"></a>
<FONT color="green">825</FONT>        }<a name="line.825"></a>
<FONT color="green">826</FONT>      }<a name="line.826"></a>
<FONT color="green">827</FONT>    <a name="line.827"></a>
<FONT color="green">828</FONT>      /**<a name="line.828"></a>
<FONT color="green">829</FONT>       * Implements traversal of the following access, in document order.<a name="line.829"></a>
<FONT color="green">830</FONT>       */<a name="line.830"></a>
<FONT color="green">831</FONT>      private class FollowingTraverser extends DescendantTraverser<a name="line.831"></a>
<FONT color="green">832</FONT>      {<a name="line.832"></a>
<FONT color="green">833</FONT>    <a name="line.833"></a>
<FONT color="green">834</FONT>        /**<a name="line.834"></a>
<FONT color="green">835</FONT>         * Get the first of the following.<a name="line.835"></a>
<FONT color="green">836</FONT>         *<a name="line.836"></a>
<FONT color="green">837</FONT>         * @param context The context node of this traversal. This is the point<a name="line.837"></a>
<FONT color="green">838</FONT>         * that the traversal starts from.<a name="line.838"></a>
<FONT color="green">839</FONT>         * @return the first node in the traversal.<a name="line.839"></a>
<FONT color="green">840</FONT>         */<a name="line.840"></a>
<FONT color="green">841</FONT>        public int first(int context)<a name="line.841"></a>
<FONT color="green">842</FONT>        {<a name="line.842"></a>
<FONT color="green">843</FONT>                            // Compute in ID space<a name="line.843"></a>
<FONT color="green">844</FONT>                            context=makeNodeIdentity(context);<a name="line.844"></a>
<FONT color="green">845</FONT>    <a name="line.845"></a>
<FONT color="green">846</FONT>          int first;<a name="line.846"></a>
<FONT color="green">847</FONT>          int type = _type(context);<a name="line.847"></a>
<FONT color="green">848</FONT>    <a name="line.848"></a>
<FONT color="green">849</FONT>          if ((DTM.ATTRIBUTE_NODE == type) || (DTM.NAMESPACE_NODE == type))<a name="line.849"></a>
<FONT color="green">850</FONT>          {<a name="line.850"></a>
<FONT color="green">851</FONT>            context = _parent(context);<a name="line.851"></a>
<FONT color="green">852</FONT>            first = _firstch(context);<a name="line.852"></a>
<FONT color="green">853</FONT>    <a name="line.853"></a>
<FONT color="green">854</FONT>            if (NULL != first)<a name="line.854"></a>
<FONT color="green">855</FONT>              return makeNodeHandle(first);<a name="line.855"></a>
<FONT color="green">856</FONT>          }<a name="line.856"></a>
<FONT color="green">857</FONT>    <a name="line.857"></a>
<FONT color="green">858</FONT>          do<a name="line.858"></a>
<FONT color="green">859</FONT>          {<a name="line.859"></a>
<FONT color="green">860</FONT>            first = _nextsib(context);<a name="line.860"></a>
<FONT color="green">861</FONT>    <a name="line.861"></a>
<FONT color="green">862</FONT>            if (NULL == first)<a name="line.862"></a>
<FONT color="green">863</FONT>              context = _parent(context);<a name="line.863"></a>
<FONT color="green">864</FONT>          }<a name="line.864"></a>
<FONT color="green">865</FONT>          while (NULL == first &amp;&amp; NULL != context);<a name="line.865"></a>
<FONT color="green">866</FONT>    <a name="line.866"></a>
<FONT color="green">867</FONT>          return makeNodeHandle(first);<a name="line.867"></a>
<FONT color="green">868</FONT>        }<a name="line.868"></a>
<FONT color="green">869</FONT>    <a name="line.869"></a>
<FONT color="green">870</FONT>        /**<a name="line.870"></a>
<FONT color="green">871</FONT>         * Get the first of the following.<a name="line.871"></a>
<FONT color="green">872</FONT>         *<a name="line.872"></a>
<FONT color="green">873</FONT>         * @param context The context node of this traversal. This is the point<a name="line.873"></a>
<FONT color="green">874</FONT>         * of origin for the traversal -- its "root node" or starting point.<a name="line.874"></a>
<FONT color="green">875</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.875"></a>
<FONT color="green">876</FONT>         *<a name="line.876"></a>
<FONT color="green">877</FONT>         * @return the first node in the traversal.<a name="line.877"></a>
<FONT color="green">878</FONT>         */<a name="line.878"></a>
<FONT color="green">879</FONT>        public int first(int context, int expandedTypeID)<a name="line.879"></a>
<FONT color="green">880</FONT>        {<a name="line.880"></a>
<FONT color="green">881</FONT>                            // %REVIEW% This looks like it might want shift into identity space<a name="line.881"></a>
<FONT color="green">882</FONT>                            // to avoid repeated conversion in the individual functions<a name="line.882"></a>
<FONT color="green">883</FONT>          int first;<a name="line.883"></a>
<FONT color="green">884</FONT>          int type = getNodeType(context);<a name="line.884"></a>
<FONT color="green">885</FONT>    <a name="line.885"></a>
<FONT color="green">886</FONT>          if ((DTM.ATTRIBUTE_NODE == type) || (DTM.NAMESPACE_NODE == type))<a name="line.886"></a>
<FONT color="green">887</FONT>          {<a name="line.887"></a>
<FONT color="green">888</FONT>            context = getParent(context);<a name="line.888"></a>
<FONT color="green">889</FONT>            first = getFirstChild(context);<a name="line.889"></a>
<FONT color="green">890</FONT>    <a name="line.890"></a>
<FONT color="green">891</FONT>            if (NULL != first)<a name="line.891"></a>
<FONT color="green">892</FONT>            {<a name="line.892"></a>
<FONT color="green">893</FONT>              if (getExpandedTypeID(first) == expandedTypeID)<a name="line.893"></a>
<FONT color="green">894</FONT>                return first;<a name="line.894"></a>
<FONT color="green">895</FONT>              else<a name="line.895"></a>
<FONT color="green">896</FONT>                return next(context, first, expandedTypeID);<a name="line.896"></a>
<FONT color="green">897</FONT>            }<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>          do<a name="line.900"></a>
<FONT color="green">901</FONT>          {<a name="line.901"></a>
<FONT color="green">902</FONT>            first = getNextSibling(context);<a name="line.902"></a>
<FONT color="green">903</FONT>    <a name="line.903"></a>
<FONT color="green">904</FONT>            if (NULL == first)<a name="line.904"></a>
<FONT color="green">905</FONT>              context = getParent(context);<a name="line.905"></a>
<FONT color="green">906</FONT>            else<a name="line.906"></a>
<FONT color="green">907</FONT>            {<a name="line.907"></a>
<FONT color="green">908</FONT>              if (getExpandedTypeID(first) == expandedTypeID)<a name="line.908"></a>
<FONT color="green">909</FONT>                return first;<a name="line.909"></a>
<FONT color="green">910</FONT>              else<a name="line.910"></a>
<FONT color="green">911</FONT>                return next(context, first, expandedTypeID);<a name="line.911"></a>
<FONT color="green">912</FONT>            }<a name="line.912"></a>
<FONT color="green">913</FONT>          }<a name="line.913"></a>
<FONT color="green">914</FONT>          while (NULL == first &amp;&amp; NULL != context);<a name="line.914"></a>
<FONT color="green">915</FONT>    <a name="line.915"></a>
<FONT color="green">916</FONT>          return first;<a name="line.916"></a>
<FONT color="green">917</FONT>        }<a name="line.917"></a>
<FONT color="green">918</FONT>    <a name="line.918"></a>
<FONT color="green">919</FONT>        /**<a name="line.919"></a>
<FONT color="green">920</FONT>         * Traverse to the next node after the current node.<a name="line.920"></a>
<FONT color="green">921</FONT>         *<a name="line.921"></a>
<FONT color="green">922</FONT>         * @param context The context node of this iteration.<a name="line.922"></a>
<FONT color="green">923</FONT>         * @param current The current node of the iteration.<a name="line.923"></a>
<FONT color="green">924</FONT>         *<a name="line.924"></a>
<FONT color="green">925</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.925"></a>
<FONT color="green">926</FONT>         */<a name="line.926"></a>
<FONT color="green">927</FONT>        public int next(int context, int current)<a name="line.927"></a>
<FONT color="green">928</FONT>        {<a name="line.928"></a>
<FONT color="green">929</FONT>                            // Compute in identity space<a name="line.929"></a>
<FONT color="green">930</FONT>                            current=makeNodeIdentity(current);<a name="line.930"></a>
<FONT color="green">931</FONT>    <a name="line.931"></a>
<FONT color="green">932</FONT>          while (true)<a name="line.932"></a>
<FONT color="green">933</FONT>          {<a name="line.933"></a>
<FONT color="green">934</FONT>            current++; // Only works on IDs, not handles.<a name="line.934"></a>
<FONT color="green">935</FONT>    <a name="line.935"></a>
<FONT color="green">936</FONT>                                    // %REVIEW% Are we using handles or indexes?<a name="line.936"></a>
<FONT color="green">937</FONT>            int type = _type(current);  // may call nextNode()<a name="line.937"></a>
<FONT color="green">938</FONT>    <a name="line.938"></a>
<FONT color="green">939</FONT>            if (NULL == type)<a name="line.939"></a>
<FONT color="green">940</FONT>              return NULL;<a name="line.940"></a>
<FONT color="green">941</FONT>    <a name="line.941"></a>
<FONT color="green">942</FONT>            if (ATTRIBUTE_NODE == type || NAMESPACE_NODE == type)<a name="line.942"></a>
<FONT color="green">943</FONT>              continue;<a name="line.943"></a>
<FONT color="green">944</FONT>    <a name="line.944"></a>
<FONT color="green">945</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.945"></a>
<FONT color="green">946</FONT>          }<a name="line.946"></a>
<FONT color="green">947</FONT>        }<a name="line.947"></a>
<FONT color="green">948</FONT>    <a name="line.948"></a>
<FONT color="green">949</FONT>        /**<a name="line.949"></a>
<FONT color="green">950</FONT>         * Traverse to the next node after the current node that is matched<a name="line.950"></a>
<FONT color="green">951</FONT>         * by the expanded type ID.<a name="line.951"></a>
<FONT color="green">952</FONT>         *<a name="line.952"></a>
<FONT color="green">953</FONT>         * @param context The context node of this iteration.<a name="line.953"></a>
<FONT color="green">954</FONT>         * @param current The current node of the iteration.<a name="line.954"></a>
<FONT color="green">955</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.955"></a>
<FONT color="green">956</FONT>         *<a name="line.956"></a>
<FONT color="green">957</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.957"></a>
<FONT color="green">958</FONT>         */<a name="line.958"></a>
<FONT color="green">959</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.959"></a>
<FONT color="green">960</FONT>        {<a name="line.960"></a>
<FONT color="green">961</FONT>                            // Compute in ID space<a name="line.961"></a>
<FONT color="green">962</FONT>                            current=makeNodeIdentity(current);<a name="line.962"></a>
<FONT color="green">963</FONT>    <a name="line.963"></a>
<FONT color="green">964</FONT>          while (true)<a name="line.964"></a>
<FONT color="green">965</FONT>          {<a name="line.965"></a>
<FONT color="green">966</FONT>            current++;<a name="line.966"></a>
<FONT color="green">967</FONT>    <a name="line.967"></a>
<FONT color="green">968</FONT>            int etype = _exptype(current);  // may call nextNode()<a name="line.968"></a>
<FONT color="green">969</FONT>    <a name="line.969"></a>
<FONT color="green">970</FONT>            if (NULL == etype)<a name="line.970"></a>
<FONT color="green">971</FONT>              return NULL;<a name="line.971"></a>
<FONT color="green">972</FONT>    <a name="line.972"></a>
<FONT color="green">973</FONT>            if (etype != expandedTypeID)<a name="line.973"></a>
<FONT color="green">974</FONT>              continue;<a name="line.974"></a>
<FONT color="green">975</FONT>    <a name="line.975"></a>
<FONT color="green">976</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.976"></a>
<FONT color="green">977</FONT>          }<a name="line.977"></a>
<FONT color="green">978</FONT>        }<a name="line.978"></a>
<FONT color="green">979</FONT>      }<a name="line.979"></a>
<FONT color="green">980</FONT>    <a name="line.980"></a>
<FONT color="green">981</FONT>      /**<a name="line.981"></a>
<FONT color="green">982</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.982"></a>
<FONT color="green">983</FONT>       */<a name="line.983"></a>
<FONT color="green">984</FONT>      private class FollowingSiblingTraverser extends DTMAxisTraverser<a name="line.984"></a>
<FONT color="green">985</FONT>      {<a name="line.985"></a>
<FONT color="green">986</FONT>    <a name="line.986"></a>
<FONT color="green">987</FONT>        /**<a name="line.987"></a>
<FONT color="green">988</FONT>         * Traverse to the next node after the current node.<a name="line.988"></a>
<FONT color="green">989</FONT>         *<a name="line.989"></a>
<FONT color="green">990</FONT>         * @param context The context node of this iteration.<a name="line.990"></a>
<FONT color="green">991</FONT>         * @param current The current node of the iteration.<a name="line.991"></a>
<FONT color="green">992</FONT>         *<a name="line.992"></a>
<FONT color="green">993</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.993"></a>
<FONT color="green">994</FONT>         */<a name="line.994"></a>
<FONT color="green">995</FONT>        public int next(int context, int current)<a name="line.995"></a>
<FONT color="green">996</FONT>        {<a name="line.996"></a>
<FONT color="green">997</FONT>          return getNextSibling(current);<a name="line.997"></a>
<FONT color="green">998</FONT>        }<a name="line.998"></a>
<FONT color="green">999</FONT>    <a name="line.999"></a>
<FONT color="green">1000</FONT>        /**<a name="line.1000"></a>
<FONT color="green">1001</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1001"></a>
<FONT color="green">1002</FONT>         * by the expanded type ID.<a name="line.1002"></a>
<FONT color="green">1003</FONT>         *<a name="line.1003"></a>
<FONT color="green">1004</FONT>         * @param context The context node of this iteration.<a name="line.1004"></a>
<FONT color="green">1005</FONT>         * @param current The current node of the iteration.<a name="line.1005"></a>
<FONT color="green">1006</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1006"></a>
<FONT color="green">1007</FONT>         *<a name="line.1007"></a>
<FONT color="green">1008</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1008"></a>
<FONT color="green">1009</FONT>         */<a name="line.1009"></a>
<FONT color="green">1010</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1010"></a>
<FONT color="green">1011</FONT>        {<a name="line.1011"></a>
<FONT color="green">1012</FONT>    <a name="line.1012"></a>
<FONT color="green">1013</FONT>          while (DTM.NULL != (current = getNextSibling(current)))<a name="line.1013"></a>
<FONT color="green">1014</FONT>          {<a name="line.1014"></a>
<FONT color="green">1015</FONT>            if (getExpandedTypeID(current) == expandedTypeID)<a name="line.1015"></a>
<FONT color="green">1016</FONT>              return current;<a name="line.1016"></a>
<FONT color="green">1017</FONT>          }<a name="line.1017"></a>
<FONT color="green">1018</FONT>    <a name="line.1018"></a>
<FONT color="green">1019</FONT>          return NULL;<a name="line.1019"></a>
<FONT color="green">1020</FONT>        }<a name="line.1020"></a>
<FONT color="green">1021</FONT>      }<a name="line.1021"></a>
<FONT color="green">1022</FONT>    <a name="line.1022"></a>
<FONT color="green">1023</FONT>      /**<a name="line.1023"></a>
<FONT color="green">1024</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.1024"></a>
<FONT color="green">1025</FONT>       */<a name="line.1025"></a>
<FONT color="green">1026</FONT>      private class NamespaceDeclsTraverser extends DTMAxisTraverser<a name="line.1026"></a>
<FONT color="green">1027</FONT>      {<a name="line.1027"></a>
<FONT color="green">1028</FONT>    <a name="line.1028"></a>
<FONT color="green">1029</FONT>        /**<a name="line.1029"></a>
<FONT color="green">1030</FONT>         * Traverse to the next node after the current node.<a name="line.1030"></a>
<FONT color="green">1031</FONT>         *<a name="line.1031"></a>
<FONT color="green">1032</FONT>         * @param context The context node of this iteration.<a name="line.1032"></a>
<FONT color="green">1033</FONT>         * @param current The current node of the iteration.<a name="line.1033"></a>
<FONT color="green">1034</FONT>         *<a name="line.1034"></a>
<FONT color="green">1035</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1035"></a>
<FONT color="green">1036</FONT>         */<a name="line.1036"></a>
<FONT color="green">1037</FONT>        public int next(int context, int current)<a name="line.1037"></a>
<FONT color="green">1038</FONT>        {<a name="line.1038"></a>
<FONT color="green">1039</FONT>    <a name="line.1039"></a>
<FONT color="green">1040</FONT>          return (context == current)<a name="line.1040"></a>
<FONT color="green">1041</FONT>                 ? getFirstNamespaceNode(context, false)<a name="line.1041"></a>
<FONT color="green">1042</FONT>                 : getNextNamespaceNode(context, current, false);<a name="line.1042"></a>
<FONT color="green">1043</FONT>        }<a name="line.1043"></a>
<FONT color="green">1044</FONT>    <a name="line.1044"></a>
<FONT color="green">1045</FONT>        /**<a name="line.1045"></a>
<FONT color="green">1046</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1046"></a>
<FONT color="green">1047</FONT>         * by the expanded type ID.<a name="line.1047"></a>
<FONT color="green">1048</FONT>         *<a name="line.1048"></a>
<FONT color="green">1049</FONT>         * @param context The context node of this iteration.<a name="line.1049"></a>
<FONT color="green">1050</FONT>         * @param current The current node of the iteration.<a name="line.1050"></a>
<FONT color="green">1051</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1051"></a>
<FONT color="green">1052</FONT>         *<a name="line.1052"></a>
<FONT color="green">1053</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1053"></a>
<FONT color="green">1054</FONT>         */<a name="line.1054"></a>
<FONT color="green">1055</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1055"></a>
<FONT color="green">1056</FONT>        {<a name="line.1056"></a>
<FONT color="green">1057</FONT>    <a name="line.1057"></a>
<FONT color="green">1058</FONT>          current = (context == current)<a name="line.1058"></a>
<FONT color="green">1059</FONT>                    ? getFirstNamespaceNode(context, false)<a name="line.1059"></a>
<FONT color="green">1060</FONT>                    : getNextNamespaceNode(context, current, false);<a name="line.1060"></a>
<FONT color="green">1061</FONT>    <a name="line.1061"></a>
<FONT color="green">1062</FONT>          do<a name="line.1062"></a>
<FONT color="green">1063</FONT>          {<a name="line.1063"></a>
<FONT color="green">1064</FONT>            if (getExpandedTypeID(current) == expandedTypeID)<a name="line.1064"></a>
<FONT color="green">1065</FONT>              return current;<a name="line.1065"></a>
<FONT color="green">1066</FONT>          }<a name="line.1066"></a>
<FONT color="green">1067</FONT>          while (DTM.NULL<a name="line.1067"></a>
<FONT color="green">1068</FONT>                 != (current = getNextNamespaceNode(context, current, false)));<a name="line.1068"></a>
<FONT color="green">1069</FONT>    <a name="line.1069"></a>
<FONT color="green">1070</FONT>          return NULL;<a name="line.1070"></a>
<FONT color="green">1071</FONT>        }<a name="line.1071"></a>
<FONT color="green">1072</FONT>      }<a name="line.1072"></a>
<FONT color="green">1073</FONT>    <a name="line.1073"></a>
<FONT color="green">1074</FONT>      /**<a name="line.1074"></a>
<FONT color="green">1075</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.1075"></a>
<FONT color="green">1076</FONT>       */<a name="line.1076"></a>
<FONT color="green">1077</FONT>      private class NamespaceTraverser extends DTMAxisTraverser<a name="line.1077"></a>
<FONT color="green">1078</FONT>      {<a name="line.1078"></a>
<FONT color="green">1079</FONT>    <a name="line.1079"></a>
<FONT color="green">1080</FONT>        /**<a name="line.1080"></a>
<FONT color="green">1081</FONT>         * Traverse to the next node after the current node.<a name="line.1081"></a>
<FONT color="green">1082</FONT>         *<a name="line.1082"></a>
<FONT color="green">1083</FONT>         * @param context The context node of this iteration.<a name="line.1083"></a>
<FONT color="green">1084</FONT>         * @param current The current node of the iteration.<a name="line.1084"></a>
<FONT color="green">1085</FONT>         *<a name="line.1085"></a>
<FONT color="green">1086</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1086"></a>
<FONT color="green">1087</FONT>         */<a name="line.1087"></a>
<FONT color="green">1088</FONT>        public int next(int context, int current)<a name="line.1088"></a>
<FONT color="green">1089</FONT>        {<a name="line.1089"></a>
<FONT color="green">1090</FONT>    <a name="line.1090"></a>
<FONT color="green">1091</FONT>          return (context == current)<a name="line.1091"></a>
<FONT color="green">1092</FONT>                 ? getFirstNamespaceNode(context, true)<a name="line.1092"></a>
<FONT color="green">1093</FONT>                 : getNextNamespaceNode(context, current, true);<a name="line.1093"></a>
<FONT color="green">1094</FONT>        }<a name="line.1094"></a>
<FONT color="green">1095</FONT>    <a name="line.1095"></a>
<FONT color="green">1096</FONT>        /**<a name="line.1096"></a>
<FONT color="green">1097</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1097"></a>
<FONT color="green">1098</FONT>         * by the expanded type ID.<a name="line.1098"></a>
<FONT color="green">1099</FONT>         *<a name="line.1099"></a>
<FONT color="green">1100</FONT>         * @param context The context node of this iteration.<a name="line.1100"></a>
<FONT color="green">1101</FONT>         * @param current The current node of the iteration.<a name="line.1101"></a>
<FONT color="green">1102</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1102"></a>
<FONT color="green">1103</FONT>         *<a name="line.1103"></a>
<FONT color="green">1104</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1104"></a>
<FONT color="green">1105</FONT>         */<a name="line.1105"></a>
<FONT color="green">1106</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1106"></a>
<FONT color="green">1107</FONT>        {<a name="line.1107"></a>
<FONT color="green">1108</FONT>    <a name="line.1108"></a>
<FONT color="green">1109</FONT>          current = (context == current)<a name="line.1109"></a>
<FONT color="green">1110</FONT>                    ? getFirstNamespaceNode(context, true)<a name="line.1110"></a>
<FONT color="green">1111</FONT>                    : getNextNamespaceNode(context, current, true);<a name="line.1111"></a>
<FONT color="green">1112</FONT>    <a name="line.1112"></a>
<FONT color="green">1113</FONT>          do<a name="line.1113"></a>
<FONT color="green">1114</FONT>          {<a name="line.1114"></a>
<FONT color="green">1115</FONT>            if (getExpandedTypeID(current) == expandedTypeID)<a name="line.1115"></a>
<FONT color="green">1116</FONT>              return current;<a name="line.1116"></a>
<FONT color="green">1117</FONT>          }<a name="line.1117"></a>
<FONT color="green">1118</FONT>          while (DTM.NULL<a name="line.1118"></a>
<FONT color="green">1119</FONT>                 != (current = getNextNamespaceNode(context, current, true)));<a name="line.1119"></a>
<FONT color="green">1120</FONT>    <a name="line.1120"></a>
<FONT color="green">1121</FONT>          return NULL;<a name="line.1121"></a>
<FONT color="green">1122</FONT>        }<a name="line.1122"></a>
<FONT color="green">1123</FONT>      }<a name="line.1123"></a>
<FONT color="green">1124</FONT>    <a name="line.1124"></a>
<FONT color="green">1125</FONT>      /**<a name="line.1125"></a>
<FONT color="green">1126</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.1126"></a>
<FONT color="green">1127</FONT>       */<a name="line.1127"></a>
<FONT color="green">1128</FONT>      private class ParentTraverser extends DTMAxisTraverser<a name="line.1128"></a>
<FONT color="green">1129</FONT>      {<a name="line.1129"></a>
<FONT color="green">1130</FONT>        /**<a name="line.1130"></a>
<FONT color="green">1131</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.1131"></a>
<FONT color="green">1132</FONT>         * returned or the iteration will go into an infinate loop.  So to traverse <a name="line.1132"></a>
<FONT color="green">1133</FONT>         * an axis, the first function must be used to get the first node.<a name="line.1133"></a>
<FONT color="green">1134</FONT>         *<a name="line.1134"></a>
<FONT color="green">1135</FONT>         * &lt;p&gt;This method needs to be overloaded only by those axis that process<a name="line.1135"></a>
<FONT color="green">1136</FONT>         * the self node. &lt;\p&gt;<a name="line.1136"></a>
<FONT color="green">1137</FONT>         *<a name="line.1137"></a>
<FONT color="green">1138</FONT>         * @param context The context node of this traversal. This is the point<a name="line.1138"></a>
<FONT color="green">1139</FONT>         * that the traversal starts from.<a name="line.1139"></a>
<FONT color="green">1140</FONT>         * @return the first node in the traversal.<a name="line.1140"></a>
<FONT color="green">1141</FONT>         */<a name="line.1141"></a>
<FONT color="green">1142</FONT>        public int first(int context)<a name="line.1142"></a>
<FONT color="green">1143</FONT>        {<a name="line.1143"></a>
<FONT color="green">1144</FONT>          return getParent(context);<a name="line.1144"></a>
<FONT color="green">1145</FONT>        }<a name="line.1145"></a>
<FONT color="green">1146</FONT>      <a name="line.1146"></a>
<FONT color="green">1147</FONT>        /**<a name="line.1147"></a>
<FONT color="green">1148</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.1148"></a>
<FONT color="green">1149</FONT>         * returned or the iteration will go into an infinate loop.  So to traverse <a name="line.1149"></a>
<FONT color="green">1150</FONT>         * an axis, the first function must be used to get the first node.<a name="line.1150"></a>
<FONT color="green">1151</FONT>         *<a name="line.1151"></a>
<FONT color="green">1152</FONT>         * &lt;p&gt;This method needs to be overloaded only by those axis that process<a name="line.1152"></a>
<FONT color="green">1153</FONT>         * the self node. &lt;\p&gt;<a name="line.1153"></a>
<FONT color="green">1154</FONT>         *<a name="line.1154"></a>
<FONT color="green">1155</FONT>         * @param context The context node of this traversal. This is the point<a name="line.1155"></a>
<FONT color="green">1156</FONT>         * of origin for the traversal -- its "root node" or starting point.<a name="line.1156"></a>
<FONT color="green">1157</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1157"></a>
<FONT color="green">1158</FONT>         *<a name="line.1158"></a>
<FONT color="green">1159</FONT>         * @return the first node in the traversal.<a name="line.1159"></a>
<FONT color="green">1160</FONT>         */<a name="line.1160"></a>
<FONT color="green">1161</FONT>        public int first(int current, int expandedTypeID)<a name="line.1161"></a>
<FONT color="green">1162</FONT>        {<a name="line.1162"></a>
<FONT color="green">1163</FONT>                            // Compute in ID space<a name="line.1163"></a>
<FONT color="green">1164</FONT>          current = makeNodeIdentity(current);<a name="line.1164"></a>
<FONT color="green">1165</FONT>    <a name="line.1165"></a>
<FONT color="green">1166</FONT>          while (NULL != (current = m_parent.elementAt(current)))<a name="line.1166"></a>
<FONT color="green">1167</FONT>          {<a name="line.1167"></a>
<FONT color="green">1168</FONT>            if (m_exptype.elementAt(current) == expandedTypeID)<a name="line.1168"></a>
<FONT color="green">1169</FONT>              return makeNodeHandle(current);<a name="line.1169"></a>
<FONT color="green">1170</FONT>          }<a name="line.1170"></a>
<FONT color="green">1171</FONT>    <a name="line.1171"></a>
<FONT color="green">1172</FONT>          return NULL;<a name="line.1172"></a>
<FONT color="green">1173</FONT>        }<a name="line.1173"></a>
<FONT color="green">1174</FONT>    <a name="line.1174"></a>
<FONT color="green">1175</FONT>    <a name="line.1175"></a>
<FONT color="green">1176</FONT>        /**<a name="line.1176"></a>
<FONT color="green">1177</FONT>         * Traverse to the next node after the current node.<a name="line.1177"></a>
<FONT color="green">1178</FONT>         *<a name="line.1178"></a>
<FONT color="green">1179</FONT>         * @param context The context node of this iteration.<a name="line.1179"></a>
<FONT color="green">1180</FONT>         * @param current The current node of the iteration.<a name="line.1180"></a>
<FONT color="green">1181</FONT>         *<a name="line.1181"></a>
<FONT color="green">1182</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1182"></a>
<FONT color="green">1183</FONT>         */<a name="line.1183"></a>
<FONT color="green">1184</FONT>        public int next(int context, int current)<a name="line.1184"></a>
<FONT color="green">1185</FONT>        {<a name="line.1185"></a>
<FONT color="green">1186</FONT>    <a name="line.1186"></a>
<FONT color="green">1187</FONT>          return NULL;<a name="line.1187"></a>
<FONT color="green">1188</FONT>        }<a name="line.1188"></a>
<FONT color="green">1189</FONT>        <a name="line.1189"></a>
<FONT color="green">1190</FONT>    <a name="line.1190"></a>
<FONT color="green">1191</FONT>    <a name="line.1191"></a>
<FONT color="green">1192</FONT>        /**<a name="line.1192"></a>
<FONT color="green">1193</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1193"></a>
<FONT color="green">1194</FONT>         * by the expanded type ID.<a name="line.1194"></a>
<FONT color="green">1195</FONT>         *<a name="line.1195"></a>
<FONT color="green">1196</FONT>         * @param context The context node of this iteration.<a name="line.1196"></a>
<FONT color="green">1197</FONT>         * @param current The current node of the iteration.<a name="line.1197"></a>
<FONT color="green">1198</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1198"></a>
<FONT color="green">1199</FONT>         *<a name="line.1199"></a>
<FONT color="green">1200</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1200"></a>
<FONT color="green">1201</FONT>         */<a name="line.1201"></a>
<FONT color="green">1202</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1202"></a>
<FONT color="green">1203</FONT>        {<a name="line.1203"></a>
<FONT color="green">1204</FONT>    <a name="line.1204"></a>
<FONT color="green">1205</FONT>          return NULL;<a name="line.1205"></a>
<FONT color="green">1206</FONT>        }<a name="line.1206"></a>
<FONT color="green">1207</FONT>      }<a name="line.1207"></a>
<FONT color="green">1208</FONT>    <a name="line.1208"></a>
<FONT color="green">1209</FONT>      /**<a name="line.1209"></a>
<FONT color="green">1210</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.1210"></a>
<FONT color="green">1211</FONT>       */<a name="line.1211"></a>
<FONT color="green">1212</FONT>      private class PrecedingTraverser extends DTMAxisTraverser<a name="line.1212"></a>
<FONT color="green">1213</FONT>      {<a name="line.1213"></a>
<FONT color="green">1214</FONT>    <a name="line.1214"></a>
<FONT color="green">1215</FONT>        /**<a name="line.1215"></a>
<FONT color="green">1216</FONT>         * Tell if the current identity is an ancestor of the context identity.<a name="line.1216"></a>
<FONT color="green">1217</FONT>         * This is an expensive operation, made worse by the stateless traversal.<a name="line.1217"></a>
<FONT color="green">1218</FONT>         * But the preceding axis is used fairly infrequently.<a name="line.1218"></a>
<FONT color="green">1219</FONT>         *<a name="line.1219"></a>
<FONT color="green">1220</FONT>         * @param contextIdent The context node of the axis traversal.<a name="line.1220"></a>
<FONT color="green">1221</FONT>         * @param currentIdent The node in question.<a name="line.1221"></a>
<FONT color="green">1222</FONT>         * @return true if the currentIdent node is an ancestor of contextIdent.<a name="line.1222"></a>
<FONT color="green">1223</FONT>         */<a name="line.1223"></a>
<FONT color="green">1224</FONT>        protected boolean isAncestor(int contextIdent, int currentIdent)<a name="line.1224"></a>
<FONT color="green">1225</FONT>        {<a name="line.1225"></a>
<FONT color="green">1226</FONT>                            // %REVIEW% See comments in IsAfterAxis; using the "successor" of<a name="line.1226"></a>
<FONT color="green">1227</FONT>                            // contextIdent is probably more efficient.<a name="line.1227"></a>
<FONT color="green">1228</FONT>          for (contextIdent = m_parent.elementAt(contextIdent); DTM.NULL != contextIdent;<a name="line.1228"></a>
<FONT color="green">1229</FONT>                  contextIdent = m_parent.elementAt(contextIdent))<a name="line.1229"></a>
<FONT color="green">1230</FONT>          {<a name="line.1230"></a>
<FONT color="green">1231</FONT>            if (contextIdent == currentIdent)<a name="line.1231"></a>
<FONT color="green">1232</FONT>              return true;<a name="line.1232"></a>
<FONT color="green">1233</FONT>          }<a name="line.1233"></a>
<FONT color="green">1234</FONT>    <a name="line.1234"></a>
<FONT color="green">1235</FONT>          return false;<a name="line.1235"></a>
<FONT color="green">1236</FONT>        }<a name="line.1236"></a>
<FONT color="green">1237</FONT>    <a name="line.1237"></a>
<FONT color="green">1238</FONT>        /**<a name="line.1238"></a>
<FONT color="green">1239</FONT>         * Traverse to the next node after the current node.<a name="line.1239"></a>
<FONT color="green">1240</FONT>         *<a name="line.1240"></a>
<FONT color="green">1241</FONT>         * @param context The context node of this iteration.<a name="line.1241"></a>
<FONT color="green">1242</FONT>         * @param current The current node of the iteration.<a name="line.1242"></a>
<FONT color="green">1243</FONT>         *<a name="line.1243"></a>
<FONT color="green">1244</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1244"></a>
<FONT color="green">1245</FONT>         */<a name="line.1245"></a>
<FONT color="green">1246</FONT>        public int next(int context, int current)<a name="line.1246"></a>
<FONT color="green">1247</FONT>        {<a name="line.1247"></a>
<FONT color="green">1248</FONT>                            // compute in ID space<a name="line.1248"></a>
<FONT color="green">1249</FONT>          int subtreeRootIdent = makeNodeIdentity(context);<a name="line.1249"></a>
<FONT color="green">1250</FONT>    <a name="line.1250"></a>
<FONT color="green">1251</FONT>          for (current = makeNodeIdentity(current) - 1; current &gt;= 0; current--)<a name="line.1251"></a>
<FONT color="green">1252</FONT>          {<a name="line.1252"></a>
<FONT color="green">1253</FONT>            short type = _type(current);<a name="line.1253"></a>
<FONT color="green">1254</FONT>    <a name="line.1254"></a>
<FONT color="green">1255</FONT>            if (ATTRIBUTE_NODE == type || NAMESPACE_NODE == type<a name="line.1255"></a>
<FONT color="green">1256</FONT>                    || isAncestor(subtreeRootIdent, current))<a name="line.1256"></a>
<FONT color="green">1257</FONT>              continue;<a name="line.1257"></a>
<FONT color="green">1258</FONT>    <a name="line.1258"></a>
<FONT color="green">1259</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.1259"></a>
<FONT color="green">1260</FONT>          }<a name="line.1260"></a>
<FONT color="green">1261</FONT>    <a name="line.1261"></a>
<FONT color="green">1262</FONT>          return NULL;<a name="line.1262"></a>
<FONT color="green">1263</FONT>        }<a name="line.1263"></a>
<FONT color="green">1264</FONT>    <a name="line.1264"></a>
<FONT color="green">1265</FONT>        /**<a name="line.1265"></a>
<FONT color="green">1266</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1266"></a>
<FONT color="green">1267</FONT>         * by the expanded type ID.<a name="line.1267"></a>
<FONT color="green">1268</FONT>         *<a name="line.1268"></a>
<FONT color="green">1269</FONT>         * @param context The context node of this iteration.<a name="line.1269"></a>
<FONT color="green">1270</FONT>         * @param current The current node of the iteration.<a name="line.1270"></a>
<FONT color="green">1271</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1271"></a>
<FONT color="green">1272</FONT>         *<a name="line.1272"></a>
<FONT color="green">1273</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1273"></a>
<FONT color="green">1274</FONT>         */<a name="line.1274"></a>
<FONT color="green">1275</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1275"></a>
<FONT color="green">1276</FONT>        {<a name="line.1276"></a>
<FONT color="green">1277</FONT>                            // Compute in ID space<a name="line.1277"></a>
<FONT color="green">1278</FONT>          int subtreeRootIdent = makeNodeIdentity(context);<a name="line.1278"></a>
<FONT color="green">1279</FONT>    <a name="line.1279"></a>
<FONT color="green">1280</FONT>          for (current = makeNodeIdentity(current) - 1; current &gt;= 0; current--)<a name="line.1280"></a>
<FONT color="green">1281</FONT>          {<a name="line.1281"></a>
<FONT color="green">1282</FONT>            int exptype = m_exptype.elementAt(current);<a name="line.1282"></a>
<FONT color="green">1283</FONT>    <a name="line.1283"></a>
<FONT color="green">1284</FONT>            if (exptype != expandedTypeID<a name="line.1284"></a>
<FONT color="green">1285</FONT>                    || isAncestor(subtreeRootIdent, current))<a name="line.1285"></a>
<FONT color="green">1286</FONT>              continue;<a name="line.1286"></a>
<FONT color="green">1287</FONT>    <a name="line.1287"></a>
<FONT color="green">1288</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.1288"></a>
<FONT color="green">1289</FONT>          }<a name="line.1289"></a>
<FONT color="green">1290</FONT>    <a name="line.1290"></a>
<FONT color="green">1291</FONT>          return NULL;<a name="line.1291"></a>
<FONT color="green">1292</FONT>        }<a name="line.1292"></a>
<FONT color="green">1293</FONT>      }<a name="line.1293"></a>
<FONT color="green">1294</FONT>    <a name="line.1294"></a>
<FONT color="green">1295</FONT>      /**<a name="line.1295"></a>
<FONT color="green">1296</FONT>       * Implements traversal of the Ancestor and the Preceding axis,<a name="line.1296"></a>
<FONT color="green">1297</FONT>       * in reverse document order.<a name="line.1297"></a>
<FONT color="green">1298</FONT>       */<a name="line.1298"></a>
<FONT color="green">1299</FONT>      private class PrecedingAndAncestorTraverser extends DTMAxisTraverser<a name="line.1299"></a>
<FONT color="green">1300</FONT>      {<a name="line.1300"></a>
<FONT color="green">1301</FONT>    <a name="line.1301"></a>
<FONT color="green">1302</FONT>        /**<a name="line.1302"></a>
<FONT color="green">1303</FONT>         * Traverse to the next node after the current node.<a name="line.1303"></a>
<FONT color="green">1304</FONT>         *<a name="line.1304"></a>
<FONT color="green">1305</FONT>         * @param context The context node of this iteration.<a name="line.1305"></a>
<FONT color="green">1306</FONT>         * @param current The current node of the iteration.<a name="line.1306"></a>
<FONT color="green">1307</FONT>         *<a name="line.1307"></a>
<FONT color="green">1308</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1308"></a>
<FONT color="green">1309</FONT>         */<a name="line.1309"></a>
<FONT color="green">1310</FONT>        public int next(int context, int current)<a name="line.1310"></a>
<FONT color="green">1311</FONT>        {<a name="line.1311"></a>
<FONT color="green">1312</FONT>                            // Compute in ID space<a name="line.1312"></a>
<FONT color="green">1313</FONT>          int subtreeRootIdent = makeNodeIdentity(context );<a name="line.1313"></a>
<FONT color="green">1314</FONT>    <a name="line.1314"></a>
<FONT color="green">1315</FONT>          for (current = makeNodeIdentity(current) - 1; current &gt;= 0; current--)<a name="line.1315"></a>
<FONT color="green">1316</FONT>          {<a name="line.1316"></a>
<FONT color="green">1317</FONT>            short type = _type(current);<a name="line.1317"></a>
<FONT color="green">1318</FONT>    <a name="line.1318"></a>
<FONT color="green">1319</FONT>            if (ATTRIBUTE_NODE == type || NAMESPACE_NODE == type)<a name="line.1319"></a>
<FONT color="green">1320</FONT>              continue;<a name="line.1320"></a>
<FONT color="green">1321</FONT>    <a name="line.1321"></a>
<FONT color="green">1322</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.1322"></a>
<FONT color="green">1323</FONT>          }<a name="line.1323"></a>
<FONT color="green">1324</FONT>    <a name="line.1324"></a>
<FONT color="green">1325</FONT>          return NULL;<a name="line.1325"></a>
<FONT color="green">1326</FONT>        }<a name="line.1326"></a>
<FONT color="green">1327</FONT>    <a name="line.1327"></a>
<FONT color="green">1328</FONT>        /**<a name="line.1328"></a>
<FONT color="green">1329</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1329"></a>
<FONT color="green">1330</FONT>         * by the expanded type ID.<a name="line.1330"></a>
<FONT color="green">1331</FONT>         *<a name="line.1331"></a>
<FONT color="green">1332</FONT>         * @param context The context node of this iteration.<a name="line.1332"></a>
<FONT color="green">1333</FONT>         * @param current The current node of the iteration.<a name="line.1333"></a>
<FONT color="green">1334</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1334"></a>
<FONT color="green">1335</FONT>         *<a name="line.1335"></a>
<FONT color="green">1336</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1336"></a>
<FONT color="green">1337</FONT>         */<a name="line.1337"></a>
<FONT color="green">1338</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1338"></a>
<FONT color="green">1339</FONT>        {<a name="line.1339"></a>
<FONT color="green">1340</FONT>                            // Compute in ID space<a name="line.1340"></a>
<FONT color="green">1341</FONT>          int subtreeRootIdent = makeNodeIdentity(context);<a name="line.1341"></a>
<FONT color="green">1342</FONT>    <a name="line.1342"></a>
<FONT color="green">1343</FONT>          for (current = makeNodeIdentity(current) - 1; current &gt;= 0; current--)<a name="line.1343"></a>
<FONT color="green">1344</FONT>          {<a name="line.1344"></a>
<FONT color="green">1345</FONT>            int exptype = m_exptype.elementAt(current);<a name="line.1345"></a>
<FONT color="green">1346</FONT>    <a name="line.1346"></a>
<FONT color="green">1347</FONT>            if (exptype != expandedTypeID)<a name="line.1347"></a>
<FONT color="green">1348</FONT>              continue;<a name="line.1348"></a>
<FONT color="green">1349</FONT>    <a name="line.1349"></a>
<FONT color="green">1350</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.1350"></a>
<FONT color="green">1351</FONT>          }<a name="line.1351"></a>
<FONT color="green">1352</FONT>    <a name="line.1352"></a>
<FONT color="green">1353</FONT>          return NULL;<a name="line.1353"></a>
<FONT color="green">1354</FONT>        }<a name="line.1354"></a>
<FONT color="green">1355</FONT>      }<a name="line.1355"></a>
<FONT color="green">1356</FONT>    <a name="line.1356"></a>
<FONT color="green">1357</FONT>      /**<a name="line.1357"></a>
<FONT color="green">1358</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.1358"></a>
<FONT color="green">1359</FONT>       */<a name="line.1359"></a>
<FONT color="green">1360</FONT>      private class PrecedingSiblingTraverser extends DTMAxisTraverser<a name="line.1360"></a>
<FONT color="green">1361</FONT>      {<a name="line.1361"></a>
<FONT color="green">1362</FONT>    <a name="line.1362"></a>
<FONT color="green">1363</FONT>        /**<a name="line.1363"></a>
<FONT color="green">1364</FONT>         * Traverse to the next node after the current node.<a name="line.1364"></a>
<FONT color="green">1365</FONT>         *<a name="line.1365"></a>
<FONT color="green">1366</FONT>         * @param context The context node of this iteration.<a name="line.1366"></a>
<FONT color="green">1367</FONT>         * @param current The current node of the iteration.<a name="line.1367"></a>
<FONT color="green">1368</FONT>         *<a name="line.1368"></a>
<FONT color="green">1369</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1369"></a>
<FONT color="green">1370</FONT>         */<a name="line.1370"></a>
<FONT color="green">1371</FONT>        public int next(int context, int current)<a name="line.1371"></a>
<FONT color="green">1372</FONT>        {<a name="line.1372"></a>
<FONT color="green">1373</FONT>          return getPreviousSibling(current);<a name="line.1373"></a>
<FONT color="green">1374</FONT>        }<a name="line.1374"></a>
<FONT color="green">1375</FONT>    <a name="line.1375"></a>
<FONT color="green">1376</FONT>        /**<a name="line.1376"></a>
<FONT color="green">1377</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1377"></a>
<FONT color="green">1378</FONT>         * by the expanded type ID.<a name="line.1378"></a>
<FONT color="green">1379</FONT>         *<a name="line.1379"></a>
<FONT color="green">1380</FONT>         * @param context The context node of this iteration.<a name="line.1380"></a>
<FONT color="green">1381</FONT>         * @param current The current node of the iteration.<a name="line.1381"></a>
<FONT color="green">1382</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1382"></a>
<FONT color="green">1383</FONT>         *<a name="line.1383"></a>
<FONT color="green">1384</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1384"></a>
<FONT color="green">1385</FONT>         */<a name="line.1385"></a>
<FONT color="green">1386</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1386"></a>
<FONT color="green">1387</FONT>        {<a name="line.1387"></a>
<FONT color="green">1388</FONT>    <a name="line.1388"></a>
<FONT color="green">1389</FONT>          while (DTM.NULL != (current = getPreviousSibling(current)))<a name="line.1389"></a>
<FONT color="green">1390</FONT>          {<a name="line.1390"></a>
<FONT color="green">1391</FONT>            if (getExpandedTypeID(current) == expandedTypeID)<a name="line.1391"></a>
<FONT color="green">1392</FONT>              return current;<a name="line.1392"></a>
<FONT color="green">1393</FONT>          }<a name="line.1393"></a>
<FONT color="green">1394</FONT>    <a name="line.1394"></a>
<FONT color="green">1395</FONT>          return NULL;<a name="line.1395"></a>
<FONT color="green">1396</FONT>        }<a name="line.1396"></a>
<FONT color="green">1397</FONT>      }<a name="line.1397"></a>
<FONT color="green">1398</FONT>    <a name="line.1398"></a>
<FONT color="green">1399</FONT>      /**<a name="line.1399"></a>
<FONT color="green">1400</FONT>       * Implements traversal of the Self axis.<a name="line.1400"></a>
<FONT color="green">1401</FONT>       */<a name="line.1401"></a>
<FONT color="green">1402</FONT>      private class SelfTraverser extends DTMAxisTraverser<a name="line.1402"></a>
<FONT color="green">1403</FONT>      {<a name="line.1403"></a>
<FONT color="green">1404</FONT>    <a name="line.1404"></a>
<FONT color="green">1405</FONT>        /**<a name="line.1405"></a>
<FONT color="green">1406</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.1406"></a>
<FONT color="green">1407</FONT>         * returned or the iteration will go into an infinate loop.  To see if<a name="line.1407"></a>
<FONT color="green">1408</FONT>         * the self node should be processed, use this function.<a name="line.1408"></a>
<FONT color="green">1409</FONT>         *<a name="line.1409"></a>
<FONT color="green">1410</FONT>         * @param context The context node of this traversal.<a name="line.1410"></a>
<FONT color="green">1411</FONT>         *<a name="line.1411"></a>
<FONT color="green">1412</FONT>         * @return the first node in the traversal.<a name="line.1412"></a>
<FONT color="green">1413</FONT>         */<a name="line.1413"></a>
<FONT color="green">1414</FONT>        public int first(int context)<a name="line.1414"></a>
<FONT color="green">1415</FONT>        {<a name="line.1415"></a>
<FONT color="green">1416</FONT>          return context;<a name="line.1416"></a>
<FONT color="green">1417</FONT>        }<a name="line.1417"></a>
<FONT color="green">1418</FONT>    <a name="line.1418"></a>
<FONT color="green">1419</FONT>        /**<a name="line.1419"></a>
<FONT color="green">1420</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.1420"></a>
<FONT color="green">1421</FONT>         * returned or the iteration will go into an infinate loop.  To see if<a name="line.1421"></a>
<FONT color="green">1422</FONT>         * the self node should be processed, use this function.  If the context<a name="line.1422"></a>
<FONT color="green">1423</FONT>         * node does not match the expanded type ID, this function will return<a name="line.1423"></a>
<FONT color="green">1424</FONT>         * false.<a name="line.1424"></a>
<FONT color="green">1425</FONT>         *<a name="line.1425"></a>
<FONT color="green">1426</FONT>         * @param context The context node of this traversal.<a name="line.1426"></a>
<FONT color="green">1427</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1427"></a>
<FONT color="green">1428</FONT>         *<a name="line.1428"></a>
<FONT color="green">1429</FONT>         * @return the first node in the traversal.<a name="line.1429"></a>
<FONT color="green">1430</FONT>         */<a name="line.1430"></a>
<FONT color="green">1431</FONT>        public int first(int context, int expandedTypeID)<a name="line.1431"></a>
<FONT color="green">1432</FONT>        {<a name="line.1432"></a>
<FONT color="green">1433</FONT>          return (getExpandedTypeID(context) == expandedTypeID) ? context : NULL;<a name="line.1433"></a>
<FONT color="green">1434</FONT>        }<a name="line.1434"></a>
<FONT color="green">1435</FONT>    <a name="line.1435"></a>
<FONT color="green">1436</FONT>        /**<a name="line.1436"></a>
<FONT color="green">1437</FONT>         * Traverse to the next node after the current node.<a name="line.1437"></a>
<FONT color="green">1438</FONT>         *<a name="line.1438"></a>
<FONT color="green">1439</FONT>         * @param context The context node of this iteration.<a name="line.1439"></a>
<FONT color="green">1440</FONT>         * @param current The current node of the iteration.<a name="line.1440"></a>
<FONT color="green">1441</FONT>         *<a name="line.1441"></a>
<FONT color="green">1442</FONT>         * @return Always return NULL for this axis.<a name="line.1442"></a>
<FONT color="green">1443</FONT>         */<a name="line.1443"></a>
<FONT color="green">1444</FONT>        public int next(int context, int current)<a name="line.1444"></a>
<FONT color="green">1445</FONT>        {<a name="line.1445"></a>
<FONT color="green">1446</FONT>          return NULL;<a name="line.1446"></a>
<FONT color="green">1447</FONT>        }<a name="line.1447"></a>
<FONT color="green">1448</FONT>    <a name="line.1448"></a>
<FONT color="green">1449</FONT>        /**<a name="line.1449"></a>
<FONT color="green">1450</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1450"></a>
<FONT color="green">1451</FONT>         * by the expanded type ID.<a name="line.1451"></a>
<FONT color="green">1452</FONT>         *<a name="line.1452"></a>
<FONT color="green">1453</FONT>         * @param context The context node of this iteration.<a name="line.1453"></a>
<FONT color="green">1454</FONT>         * @param current The current node of the iteration.<a name="line.1454"></a>
<FONT color="green">1455</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1455"></a>
<FONT color="green">1456</FONT>         *<a name="line.1456"></a>
<FONT color="green">1457</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1457"></a>
<FONT color="green">1458</FONT>         */<a name="line.1458"></a>
<FONT color="green">1459</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1459"></a>
<FONT color="green">1460</FONT>        {<a name="line.1460"></a>
<FONT color="green">1461</FONT>          return NULL;<a name="line.1461"></a>
<FONT color="green">1462</FONT>        }<a name="line.1462"></a>
<FONT color="green">1463</FONT>      }<a name="line.1463"></a>
<FONT color="green">1464</FONT>    <a name="line.1464"></a>
<FONT color="green">1465</FONT>      /**<a name="line.1465"></a>
<FONT color="green">1466</FONT>       * Implements traversal of the Ancestor access, in reverse document order.<a name="line.1466"></a>
<FONT color="green">1467</FONT>       */<a name="line.1467"></a>
<FONT color="green">1468</FONT>      private class AllFromRootTraverser extends AllFromNodeTraverser<a name="line.1468"></a>
<FONT color="green">1469</FONT>      {<a name="line.1469"></a>
<FONT color="green">1470</FONT>    <a name="line.1470"></a>
<FONT color="green">1471</FONT>        /**<a name="line.1471"></a>
<FONT color="green">1472</FONT>         * Return the root.<a name="line.1472"></a>
<FONT color="green">1473</FONT>         *<a name="line.1473"></a>
<FONT color="green">1474</FONT>         * @param context The context node of this traversal.<a name="line.1474"></a>
<FONT color="green">1475</FONT>         *<a name="line.1475"></a>
<FONT color="green">1476</FONT>         * @return the first node in the traversal.<a name="line.1476"></a>
<FONT color="green">1477</FONT>         */<a name="line.1477"></a>
<FONT color="green">1478</FONT>        public int first(int context)<a name="line.1478"></a>
<FONT color="green">1479</FONT>        {<a name="line.1479"></a>
<FONT color="green">1480</FONT>          return getDocumentRoot(context);<a name="line.1480"></a>
<FONT color="green">1481</FONT>        }<a name="line.1481"></a>
<FONT color="green">1482</FONT>    <a name="line.1482"></a>
<FONT color="green">1483</FONT>        /**<a name="line.1483"></a>
<FONT color="green">1484</FONT>         * Return the root if it matches the expanded type ID.<a name="line.1484"></a>
<FONT color="green">1485</FONT>         *<a name="line.1485"></a>
<FONT color="green">1486</FONT>         * @param context The context node of this traversal.<a name="line.1486"></a>
<FONT color="green">1487</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1487"></a>
<FONT color="green">1488</FONT>         *<a name="line.1488"></a>
<FONT color="green">1489</FONT>         * @return the first node in the traversal.<a name="line.1489"></a>
<FONT color="green">1490</FONT>         */<a name="line.1490"></a>
<FONT color="green">1491</FONT>        public int first(int context, int expandedTypeID)<a name="line.1491"></a>
<FONT color="green">1492</FONT>        {<a name="line.1492"></a>
<FONT color="green">1493</FONT>          return (getExpandedTypeID(getDocumentRoot(context)) == expandedTypeID)<a name="line.1493"></a>
<FONT color="green">1494</FONT>                 ? context : next(context, context, expandedTypeID);<a name="line.1494"></a>
<FONT color="green">1495</FONT>        }<a name="line.1495"></a>
<FONT color="green">1496</FONT>    <a name="line.1496"></a>
<FONT color="green">1497</FONT>        /**<a name="line.1497"></a>
<FONT color="green">1498</FONT>         * Traverse to the next node after the current node.<a name="line.1498"></a>
<FONT color="green">1499</FONT>         *<a name="line.1499"></a>
<FONT color="green">1500</FONT>         * @param context The context node of this iteration.<a name="line.1500"></a>
<FONT color="green">1501</FONT>         * @param current The current node of the iteration.<a name="line.1501"></a>
<FONT color="green">1502</FONT>         *<a name="line.1502"></a>
<FONT color="green">1503</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1503"></a>
<FONT color="green">1504</FONT>         */<a name="line.1504"></a>
<FONT color="green">1505</FONT>        public int next(int context, int current)<a name="line.1505"></a>
<FONT color="green">1506</FONT>        {<a name="line.1506"></a>
<FONT color="green">1507</FONT>                            // Compute in ID space<a name="line.1507"></a>
<FONT color="green">1508</FONT>          int subtreeRootIdent = makeNodeIdentity(context);<a name="line.1508"></a>
<FONT color="green">1509</FONT>    <a name="line.1509"></a>
<FONT color="green">1510</FONT>          for (current = makeNodeIdentity(current) + 1; ; current++)<a name="line.1510"></a>
<FONT color="green">1511</FONT>          {<a name="line.1511"></a>
<FONT color="green">1512</FONT>                                    // Kluge test: Just make sure +1 yielded a real node<a name="line.1512"></a>
<FONT color="green">1513</FONT>            int type = _type(current);  // may call nextNode()<a name="line.1513"></a>
<FONT color="green">1514</FONT>            if (type == NULL)<a name="line.1514"></a>
<FONT color="green">1515</FONT>              return NULL;<a name="line.1515"></a>
<FONT color="green">1516</FONT>    <a name="line.1516"></a>
<FONT color="green">1517</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.1517"></a>
<FONT color="green">1518</FONT>          }<a name="line.1518"></a>
<FONT color="green">1519</FONT>        }<a name="line.1519"></a>
<FONT color="green">1520</FONT>    <a name="line.1520"></a>
<FONT color="green">1521</FONT>        /**<a name="line.1521"></a>
<FONT color="green">1522</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1522"></a>
<FONT color="green">1523</FONT>         * by the expanded type ID.<a name="line.1523"></a>
<FONT color="green">1524</FONT>         *<a name="line.1524"></a>
<FONT color="green">1525</FONT>         * @param context The context node of this iteration.<a name="line.1525"></a>
<FONT color="green">1526</FONT>         * @param current The current node of the iteration.<a name="line.1526"></a>
<FONT color="green">1527</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1527"></a>
<FONT color="green">1528</FONT>         *<a name="line.1528"></a>
<FONT color="green">1529</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1529"></a>
<FONT color="green">1530</FONT>         */<a name="line.1530"></a>
<FONT color="green">1531</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1531"></a>
<FONT color="green">1532</FONT>        {<a name="line.1532"></a>
<FONT color="green">1533</FONT>                            // Compute in ID space<a name="line.1533"></a>
<FONT color="green">1534</FONT>          int subtreeRootIdent = makeNodeIdentity(context);<a name="line.1534"></a>
<FONT color="green">1535</FONT>    <a name="line.1535"></a>
<FONT color="green">1536</FONT>          for (current = makeNodeIdentity(current) + 1; ; current++)<a name="line.1536"></a>
<FONT color="green">1537</FONT>          {<a name="line.1537"></a>
<FONT color="green">1538</FONT>            int exptype = _exptype(current);  // may call nextNode()<a name="line.1538"></a>
<FONT color="green">1539</FONT>    <a name="line.1539"></a>
<FONT color="green">1540</FONT>            if (exptype == NULL)<a name="line.1540"></a>
<FONT color="green">1541</FONT>              return NULL;<a name="line.1541"></a>
<FONT color="green">1542</FONT>    <a name="line.1542"></a>
<FONT color="green">1543</FONT>            if (exptype != expandedTypeID)<a name="line.1543"></a>
<FONT color="green">1544</FONT>              continue;<a name="line.1544"></a>
<FONT color="green">1545</FONT>    <a name="line.1545"></a>
<FONT color="green">1546</FONT>            return makeNodeHandle(current);  // make handle.<a name="line.1546"></a>
<FONT color="green">1547</FONT>          }<a name="line.1547"></a>
<FONT color="green">1548</FONT>        }<a name="line.1548"></a>
<FONT color="green">1549</FONT>      }<a name="line.1549"></a>
<FONT color="green">1550</FONT>    <a name="line.1550"></a>
<FONT color="green">1551</FONT>      /**<a name="line.1551"></a>
<FONT color="green">1552</FONT>       * Implements traversal of the Self axis.<a name="line.1552"></a>
<FONT color="green">1553</FONT>       */<a name="line.1553"></a>
<FONT color="green">1554</FONT>      private class RootTraverser extends AllFromRootTraverser<a name="line.1554"></a>
<FONT color="green">1555</FONT>      {<a name="line.1555"></a>
<FONT color="green">1556</FONT>        /**<a name="line.1556"></a>
<FONT color="green">1557</FONT>         * Return the root if it matches the expanded type ID,<a name="line.1557"></a>
<FONT color="green">1558</FONT>         * else return null (nothing found)<a name="line.1558"></a>
<FONT color="green">1559</FONT>         *<a name="line.1559"></a>
<FONT color="green">1560</FONT>         * @param context The context node of this traversal.<a name="line.1560"></a>
<FONT color="green">1561</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1561"></a>
<FONT color="green">1562</FONT>         *<a name="line.1562"></a>
<FONT color="green">1563</FONT>         * @return the first node in the traversal.<a name="line.1563"></a>
<FONT color="green">1564</FONT>         */<a name="line.1564"></a>
<FONT color="green">1565</FONT>        public int first(int context, int expandedTypeID)<a name="line.1565"></a>
<FONT color="green">1566</FONT>        {<a name="line.1566"></a>
<FONT color="green">1567</FONT>          int root=getDocumentRoot(context);<a name="line.1567"></a>
<FONT color="green">1568</FONT>          return (getExpandedTypeID(root) == expandedTypeID)<a name="line.1568"></a>
<FONT color="green">1569</FONT>            ? root : NULL;<a name="line.1569"></a>
<FONT color="green">1570</FONT>        }<a name="line.1570"></a>
<FONT color="green">1571</FONT>    <a name="line.1571"></a>
<FONT color="green">1572</FONT>        /**<a name="line.1572"></a>
<FONT color="green">1573</FONT>         * Traverse to the next node after the current node.<a name="line.1573"></a>
<FONT color="green">1574</FONT>         *<a name="line.1574"></a>
<FONT color="green">1575</FONT>         * @param context The context node of this iteration.<a name="line.1575"></a>
<FONT color="green">1576</FONT>         * @param current The current node of the iteration.<a name="line.1576"></a>
<FONT color="green">1577</FONT>         *<a name="line.1577"></a>
<FONT color="green">1578</FONT>         * @return Always return NULL for this axis.<a name="line.1578"></a>
<FONT color="green">1579</FONT>         */<a name="line.1579"></a>
<FONT color="green">1580</FONT>        public int next(int context, int current)<a name="line.1580"></a>
<FONT color="green">1581</FONT>        {<a name="line.1581"></a>
<FONT color="green">1582</FONT>          return NULL;<a name="line.1582"></a>
<FONT color="green">1583</FONT>        }<a name="line.1583"></a>
<FONT color="green">1584</FONT>    <a name="line.1584"></a>
<FONT color="green">1585</FONT>        /**<a name="line.1585"></a>
<FONT color="green">1586</FONT>         * Traverse to the next node after the current node that is matched<a name="line.1586"></a>
<FONT color="green">1587</FONT>         * by the expanded type ID.<a name="line.1587"></a>
<FONT color="green">1588</FONT>         *<a name="line.1588"></a>
<FONT color="green">1589</FONT>         * @param context The context node of this iteration.<a name="line.1589"></a>
<FONT color="green">1590</FONT>         * @param current The current node of the iteration.<a name="line.1590"></a>
<FONT color="green">1591</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1591"></a>
<FONT color="green">1592</FONT>         *<a name="line.1592"></a>
<FONT color="green">1593</FONT>         * @return the next node in the iteration, or DTM.NULL.<a name="line.1593"></a>
<FONT color="green">1594</FONT>         */<a name="line.1594"></a>
<FONT color="green">1595</FONT>        public int next(int context, int current, int expandedTypeID)<a name="line.1595"></a>
<FONT color="green">1596</FONT>        {<a name="line.1596"></a>
<FONT color="green">1597</FONT>          return NULL;<a name="line.1597"></a>
<FONT color="green">1598</FONT>        }<a name="line.1598"></a>
<FONT color="green">1599</FONT>      }<a name="line.1599"></a>
<FONT color="green">1600</FONT>    <a name="line.1600"></a>
<FONT color="green">1601</FONT>      /**<a name="line.1601"></a>
<FONT color="green">1602</FONT>       * A non-xpath axis, returns all nodes that aren't namespaces or attributes,<a name="line.1602"></a>
<FONT color="green">1603</FONT>       * from and including the root.<a name="line.1603"></a>
<FONT color="green">1604</FONT>       */<a name="line.1604"></a>
<FONT color="green">1605</FONT>      private class DescendantOrSelfFromRootTraverser extends DescendantTraverser<a name="line.1605"></a>
<FONT color="green">1606</FONT>      {<a name="line.1606"></a>
<FONT color="green">1607</FONT>    <a name="line.1607"></a>
<FONT color="green">1608</FONT>        /**<a name="line.1608"></a>
<FONT color="green">1609</FONT>         * Get the first potential identity that can be returned, which is the axis <a name="line.1609"></a>
<FONT color="green">1610</FONT>         * root context in this case.<a name="line.1610"></a>
<FONT color="green">1611</FONT>         *<a name="line.1611"></a>
<FONT color="green">1612</FONT>         * @param identity The node identity of the root context of the traversal.<a name="line.1612"></a>
<FONT color="green">1613</FONT>         *<a name="line.1613"></a>
<FONT color="green">1614</FONT>         * @return The identity argument.<a name="line.1614"></a>
<FONT color="green">1615</FONT>         */<a name="line.1615"></a>
<FONT color="green">1616</FONT>        protected int getFirstPotential(int identity)<a name="line.1616"></a>
<FONT color="green">1617</FONT>        {<a name="line.1617"></a>
<FONT color="green">1618</FONT>          return identity;<a name="line.1618"></a>
<FONT color="green">1619</FONT>        }<a name="line.1619"></a>
<FONT color="green">1620</FONT>    <a name="line.1620"></a>
<FONT color="green">1621</FONT>        /**<a name="line.1621"></a>
<FONT color="green">1622</FONT>         * Get the first potential identity that can be returned.<a name="line.1622"></a>
<FONT color="green">1623</FONT>         * @param handle handle to the root context.<a name="line.1623"></a>
<FONT color="green">1624</FONT>         * @return identity of the root of the subtree.<a name="line.1624"></a>
<FONT color="green">1625</FONT>         */<a name="line.1625"></a>
<FONT color="green">1626</FONT>        protected int getSubtreeRoot(int handle)<a name="line.1626"></a>
<FONT color="green">1627</FONT>        {<a name="line.1627"></a>
<FONT color="green">1628</FONT>                            // %REVIEW% Shouldn't this always be 0?<a name="line.1628"></a>
<FONT color="green">1629</FONT>          return makeNodeIdentity(getDocument());<a name="line.1629"></a>
<FONT color="green">1630</FONT>        }<a name="line.1630"></a>
<FONT color="green">1631</FONT>    <a name="line.1631"></a>
<FONT color="green">1632</FONT>        /**<a name="line.1632"></a>
<FONT color="green">1633</FONT>         * Return the root.<a name="line.1633"></a>
<FONT color="green">1634</FONT>         *<a name="line.1634"></a>
<FONT color="green">1635</FONT>         * @param context The context node of this traversal.<a name="line.1635"></a>
<FONT color="green">1636</FONT>         *<a name="line.1636"></a>
<FONT color="green">1637</FONT>         * @return the first node in the traversal.<a name="line.1637"></a>
<FONT color="green">1638</FONT>         */<a name="line.1638"></a>
<FONT color="green">1639</FONT>        public int first(int context)<a name="line.1639"></a>
<FONT color="green">1640</FONT>        {<a name="line.1640"></a>
<FONT color="green">1641</FONT>          return getDocumentRoot(context);<a name="line.1641"></a>
<FONT color="green">1642</FONT>        }<a name="line.1642"></a>
<FONT color="green">1643</FONT>        <a name="line.1643"></a>
<FONT color="green">1644</FONT>        /**<a name="line.1644"></a>
<FONT color="green">1645</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.1645"></a>
<FONT color="green">1646</FONT>         * returned or the iteration will go into an infinate loop.  So to traverse<a name="line.1646"></a>
<FONT color="green">1647</FONT>         * an axis, the first function must be used to get the first node.<a name="line.1647"></a>
<FONT color="green">1648</FONT>         *<a name="line.1648"></a>
<FONT color="green">1649</FONT>         * &lt;p&gt;This method needs to be overloaded only by those axis that process<a name="line.1649"></a>
<FONT color="green">1650</FONT>         * the self node. &lt;\p&gt;<a name="line.1650"></a>
<FONT color="green">1651</FONT>         *<a name="line.1651"></a>
<FONT color="green">1652</FONT>         * @param context The context node of this traversal. This is the point<a name="line.1652"></a>
<FONT color="green">1653</FONT>         * of origin for the traversal -- its "root node" or starting point.<a name="line.1653"></a>
<FONT color="green">1654</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1654"></a>
<FONT color="green">1655</FONT>         *<a name="line.1655"></a>
<FONT color="green">1656</FONT>         * @return the first node in the traversal.<a name="line.1656"></a>
<FONT color="green">1657</FONT>         */<a name="line.1657"></a>
<FONT color="green">1658</FONT>        public int first(int context, int expandedTypeID)<a name="line.1658"></a>
<FONT color="green">1659</FONT>        {<a name="line.1659"></a>
<FONT color="green">1660</FONT>          if (isIndexed(expandedTypeID))<a name="line.1660"></a>
<FONT color="green">1661</FONT>          {<a name="line.1661"></a>
<FONT color="green">1662</FONT>            int identity = 0;<a name="line.1662"></a>
<FONT color="green">1663</FONT>            int firstPotential = getFirstPotential(identity);<a name="line.1663"></a>
<FONT color="green">1664</FONT>    <a name="line.1664"></a>
<FONT color="green">1665</FONT>            return makeNodeHandle(getNextIndexed(identity, firstPotential, expandedTypeID));<a name="line.1665"></a>
<FONT color="green">1666</FONT>          }<a name="line.1666"></a>
<FONT color="green">1667</FONT>    <a name="line.1667"></a>
<FONT color="green">1668</FONT>          int root = first(context); <a name="line.1668"></a>
<FONT color="green">1669</FONT>          return next(root, root, expandedTypeID);<a name="line.1669"></a>
<FONT color="green">1670</FONT>        }<a name="line.1670"></a>
<FONT color="green">1671</FONT>      }<a name="line.1671"></a>
<FONT color="green">1672</FONT>      <a name="line.1672"></a>
<FONT color="green">1673</FONT>      /**<a name="line.1673"></a>
<FONT color="green">1674</FONT>       * A non-xpath axis, returns all nodes that aren't namespaces or attributes,<a name="line.1674"></a>
<FONT color="green">1675</FONT>       * from but not including the root.<a name="line.1675"></a>
<FONT color="green">1676</FONT>       */<a name="line.1676"></a>
<FONT color="green">1677</FONT>      private class DescendantFromRootTraverser extends DescendantTraverser<a name="line.1677"></a>
<FONT color="green">1678</FONT>      {<a name="line.1678"></a>
<FONT color="green">1679</FONT>    <a name="line.1679"></a>
<FONT color="green">1680</FONT>        /**<a name="line.1680"></a>
<FONT color="green">1681</FONT>         * Get the first potential identity that can be returned, which is the axis <a name="line.1681"></a>
<FONT color="green">1682</FONT>         * root context in this case.<a name="line.1682"></a>
<FONT color="green">1683</FONT>         *<a name="line.1683"></a>
<FONT color="green">1684</FONT>         * @param identity The node identity of the root context of the traversal.<a name="line.1684"></a>
<FONT color="green">1685</FONT>         *<a name="line.1685"></a>
<FONT color="green">1686</FONT>         * @return The identity argument.<a name="line.1686"></a>
<FONT color="green">1687</FONT>         */<a name="line.1687"></a>
<FONT color="green">1688</FONT>        protected int getFirstPotential(int identity)<a name="line.1688"></a>
<FONT color="green">1689</FONT>        {<a name="line.1689"></a>
<FONT color="green">1690</FONT>          return _firstch(0);<a name="line.1690"></a>
<FONT color="green">1691</FONT>        }<a name="line.1691"></a>
<FONT color="green">1692</FONT>    <a name="line.1692"></a>
<FONT color="green">1693</FONT>        /**<a name="line.1693"></a>
<FONT color="green">1694</FONT>         * Get the first potential identity that can be returned.<a name="line.1694"></a>
<FONT color="green">1695</FONT>         * @param handle handle to the root context.<a name="line.1695"></a>
<FONT color="green">1696</FONT>         * @return identity of the root of the subtree.<a name="line.1696"></a>
<FONT color="green">1697</FONT>         */<a name="line.1697"></a>
<FONT color="green">1698</FONT>        protected int getSubtreeRoot(int handle)<a name="line.1698"></a>
<FONT color="green">1699</FONT>        {<a name="line.1699"></a>
<FONT color="green">1700</FONT>          return 0;<a name="line.1700"></a>
<FONT color="green">1701</FONT>        }<a name="line.1701"></a>
<FONT color="green">1702</FONT>    <a name="line.1702"></a>
<FONT color="green">1703</FONT>        /**<a name="line.1703"></a>
<FONT color="green">1704</FONT>         * Return the root.<a name="line.1704"></a>
<FONT color="green">1705</FONT>         *<a name="line.1705"></a>
<FONT color="green">1706</FONT>         * @param context The context node of this traversal.<a name="line.1706"></a>
<FONT color="green">1707</FONT>         *<a name="line.1707"></a>
<FONT color="green">1708</FONT>         * @return the first node in the traversal.<a name="line.1708"></a>
<FONT color="green">1709</FONT>         */<a name="line.1709"></a>
<FONT color="green">1710</FONT>        public int first(int context)<a name="line.1710"></a>
<FONT color="green">1711</FONT>        {<a name="line.1711"></a>
<FONT color="green">1712</FONT>          return makeNodeHandle(_firstch(0));<a name="line.1712"></a>
<FONT color="green">1713</FONT>        }<a name="line.1713"></a>
<FONT color="green">1714</FONT>        <a name="line.1714"></a>
<FONT color="green">1715</FONT>        /**<a name="line.1715"></a>
<FONT color="green">1716</FONT>         * By the nature of the stateless traversal, the context node can not be<a name="line.1716"></a>
<FONT color="green">1717</FONT>         * returned or the iteration will go into an infinate loop.  So to traverse<a name="line.1717"></a>
<FONT color="green">1718</FONT>         * an axis, the first function must be used to get the first node.<a name="line.1718"></a>
<FONT color="green">1719</FONT>         *<a name="line.1719"></a>
<FONT color="green">1720</FONT>         * &lt;p&gt;This method needs to be overloaded only by those axis that process<a name="line.1720"></a>
<FONT color="green">1721</FONT>         * the self node. &lt;\p&gt;<a name="line.1721"></a>
<FONT color="green">1722</FONT>         *<a name="line.1722"></a>
<FONT color="green">1723</FONT>         * @param context The context node of this traversal. This is the point<a name="line.1723"></a>
<FONT color="green">1724</FONT>         * of origin for the traversal -- its "root node" or starting point.<a name="line.1724"></a>
<FONT color="green">1725</FONT>         * @param expandedTypeID The expanded type ID that must match.<a name="line.1725"></a>
<FONT color="green">1726</FONT>         *<a name="line.1726"></a>
<FONT color="green">1727</FONT>         * @return the first node in the traversal.<a name="line.1727"></a>
<FONT color="green">1728</FONT>         */<a name="line.1728"></a>
<FONT color="green">1729</FONT>        public int first(int context, int expandedTypeID)<a name="line.1729"></a>
<FONT color="green">1730</FONT>        {<a name="line.1730"></a>
<FONT color="green">1731</FONT>          if (isIndexed(expandedTypeID))<a name="line.1731"></a>
<FONT color="green">1732</FONT>          {<a name="line.1732"></a>
<FONT color="green">1733</FONT>            int identity = 0; <a name="line.1733"></a>
<FONT color="green">1734</FONT>            int firstPotential = getFirstPotential(identity);<a name="line.1734"></a>
<FONT color="green">1735</FONT>    <a name="line.1735"></a>
<FONT color="green">1736</FONT>            return makeNodeHandle(getNextIndexed(identity, firstPotential, expandedTypeID));<a name="line.1736"></a>
<FONT color="green">1737</FONT>          }<a name="line.1737"></a>
<FONT color="green">1738</FONT>    <a name="line.1738"></a>
<FONT color="green">1739</FONT>          int root = getDocumentRoot(context); <a name="line.1739"></a>
<FONT color="green">1740</FONT>          return next(root, root, expandedTypeID);<a name="line.1740"></a>
<FONT color="green">1741</FONT>        }<a name="line.1741"></a>
<FONT color="green">1742</FONT>        <a name="line.1742"></a>
<FONT color="green">1743</FONT>      }<a name="line.1743"></a>
<FONT color="green">1744</FONT>    <a name="line.1744"></a>
<FONT color="green">1745</FONT>    }<a name="line.1745"></a>




























































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