<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: StepPattern.java 468655 2006-10-28 07:12:06Z minchau $<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    package org.apache.xpath.patterns;<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.Axis;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.xml.dtm.DTM;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.xml.dtm.DTMAxisTraverser;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.xml.dtm.DTMFilter;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.xpath.Expression;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.xpath.ExpressionOwner;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.xpath.XPathContext;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.xpath.XPathVisitor;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.xpath.axes.SubContextList;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.xpath.compiler.PsuedoNames;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.xpath.objects.XObject;<a name="line.33"></a>
<FONT color="green">034</FONT>    <a name="line.34"></a>
<FONT color="green">035</FONT>    /**<a name="line.35"></a>
<FONT color="green">036</FONT>     * This class represents a single pattern match step.<a name="line.36"></a>
<FONT color="green">037</FONT>     * @xsl.usage advanced<a name="line.37"></a>
<FONT color="green">038</FONT>     */<a name="line.38"></a>
<FONT color="green">039</FONT>    public class StepPattern extends NodeTest implements SubContextList, ExpressionOwner<a name="line.39"></a>
<FONT color="green">040</FONT>    {<a name="line.40"></a>
<FONT color="green">041</FONT>        static final long serialVersionUID = 9071668960168152644L;<a name="line.41"></a>
<FONT color="green">042</FONT>    <a name="line.42"></a>
<FONT color="green">043</FONT>      /** The axis for this test. */<a name="line.43"></a>
<FONT color="green">044</FONT>      protected int m_axis;<a name="line.44"></a>
<FONT color="green">045</FONT>    <a name="line.45"></a>
<FONT color="green">046</FONT>      /**<a name="line.46"></a>
<FONT color="green">047</FONT>       * Construct a StepPattern that tests for namespaces and node names.<a name="line.47"></a>
<FONT color="green">048</FONT>       *<a name="line.48"></a>
<FONT color="green">049</FONT>       *<a name="line.49"></a>
<FONT color="green">050</FONT>       * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.<a name="line.50"></a>
<FONT color="green">051</FONT>       * @param namespace The namespace to be tested.<a name="line.51"></a>
<FONT color="green">052</FONT>       * @param name The local name to be tested.<a name="line.52"></a>
<FONT color="green">053</FONT>       * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.<a name="line.53"></a>
<FONT color="green">054</FONT>       * @param axisForPredicate No longer used.<a name="line.54"></a>
<FONT color="green">055</FONT>       */<a name="line.55"></a>
<FONT color="green">056</FONT>      public StepPattern(int whatToShow, String namespace, String name, int axis,<a name="line.56"></a>
<FONT color="green">057</FONT>                         int axisForPredicate)<a name="line.57"></a>
<FONT color="green">058</FONT>      {<a name="line.58"></a>
<FONT color="green">059</FONT>    <a name="line.59"></a>
<FONT color="green">060</FONT>        super(whatToShow, namespace, name);<a name="line.60"></a>
<FONT color="green">061</FONT>    <a name="line.61"></a>
<FONT color="green">062</FONT>        m_axis = axis;<a name="line.62"></a>
<FONT color="green">063</FONT>      }<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>       * Construct a StepPattern that doesn't test for node names.<a name="line.66"></a>
<FONT color="green">067</FONT>       *<a name="line.67"></a>
<FONT color="green">068</FONT>       *<a name="line.68"></a>
<FONT color="green">069</FONT>       * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.<a name="line.69"></a>
<FONT color="green">070</FONT>       * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.<a name="line.70"></a>
<FONT color="green">071</FONT>       * @param axisForPredicate No longer used.<a name="line.71"></a>
<FONT color="green">072</FONT>       */<a name="line.72"></a>
<FONT color="green">073</FONT>      public StepPattern(int whatToShow, int axis, int axisForPredicate)<a name="line.73"></a>
<FONT color="green">074</FONT>      {<a name="line.74"></a>
<FONT color="green">075</FONT>    <a name="line.75"></a>
<FONT color="green">076</FONT>        super(whatToShow);<a name="line.76"></a>
<FONT color="green">077</FONT>    <a name="line.77"></a>
<FONT color="green">078</FONT>        m_axis = axis;<a name="line.78"></a>
<FONT color="green">079</FONT>      }<a name="line.79"></a>
<FONT color="green">080</FONT>    <a name="line.80"></a>
<FONT color="green">081</FONT>      /**<a name="line.81"></a>
<FONT color="green">082</FONT>       * The target local name or psuedo name, for hash table lookup optimization.<a name="line.82"></a>
<FONT color="green">083</FONT>       *  @serial<a name="line.83"></a>
<FONT color="green">084</FONT>       */<a name="line.84"></a>
<FONT color="green">085</FONT>      String m_targetString;  // only calculate on head<a name="line.85"></a>
<FONT color="green">086</FONT>    <a name="line.86"></a>
<FONT color="green">087</FONT>      /**<a name="line.87"></a>
<FONT color="green">088</FONT>       * Calculate the local name or psuedo name of the node that this pattern will test,<a name="line.88"></a>
<FONT color="green">089</FONT>       * for hash table lookup optimization.<a name="line.89"></a>
<FONT color="green">090</FONT>       *<a name="line.90"></a>
<FONT color="green">091</FONT>       * @see org.apache.xpath.compiler.PsuedoNames<a name="line.91"></a>
<FONT color="green">092</FONT>       */<a name="line.92"></a>
<FONT color="green">093</FONT>      public void calcTargetString()<a name="line.93"></a>
<FONT color="green">094</FONT>      {<a name="line.94"></a>
<FONT color="green">095</FONT>    <a name="line.95"></a>
<FONT color="green">096</FONT>        int whatToShow = getWhatToShow();<a name="line.96"></a>
<FONT color="green">097</FONT>    <a name="line.97"></a>
<FONT color="green">098</FONT>        switch (whatToShow)<a name="line.98"></a>
<FONT color="green">099</FONT>        {<a name="line.99"></a>
<FONT color="green">100</FONT>        case DTMFilter.SHOW_COMMENT :<a name="line.100"></a>
<FONT color="green">101</FONT>          m_targetString = PsuedoNames.PSEUDONAME_COMMENT;<a name="line.101"></a>
<FONT color="green">102</FONT>          break;<a name="line.102"></a>
<FONT color="green">103</FONT>        case DTMFilter.SHOW_TEXT :<a name="line.103"></a>
<FONT color="green">104</FONT>        case DTMFilter.SHOW_CDATA_SECTION :<a name="line.104"></a>
<FONT color="green">105</FONT>        case (DTMFilter.SHOW_TEXT | DTMFilter.SHOW_CDATA_SECTION) :<a name="line.105"></a>
<FONT color="green">106</FONT>          m_targetString = PsuedoNames.PSEUDONAME_TEXT;<a name="line.106"></a>
<FONT color="green">107</FONT>          break;<a name="line.107"></a>
<FONT color="green">108</FONT>        case DTMFilter.SHOW_ALL :<a name="line.108"></a>
<FONT color="green">109</FONT>          m_targetString = PsuedoNames.PSEUDONAME_ANY;<a name="line.109"></a>
<FONT color="green">110</FONT>          break;<a name="line.110"></a>
<FONT color="green">111</FONT>        case DTMFilter.SHOW_DOCUMENT :<a name="line.111"></a>
<FONT color="green">112</FONT>        case DTMFilter.SHOW_DOCUMENT | DTMFilter.SHOW_DOCUMENT_FRAGMENT :<a name="line.112"></a>
<FONT color="green">113</FONT>          m_targetString = PsuedoNames.PSEUDONAME_ROOT;<a name="line.113"></a>
<FONT color="green">114</FONT>          break;<a name="line.114"></a>
<FONT color="green">115</FONT>        case DTMFilter.SHOW_ELEMENT :<a name="line.115"></a>
<FONT color="green">116</FONT>          if (this.WILD == m_name)<a name="line.116"></a>
<FONT color="green">117</FONT>            m_targetString = PsuedoNames.PSEUDONAME_ANY;<a name="line.117"></a>
<FONT color="green">118</FONT>          else<a name="line.118"></a>
<FONT color="green">119</FONT>            m_targetString = m_name;<a name="line.119"></a>
<FONT color="green">120</FONT>          break;<a name="line.120"></a>
<FONT color="green">121</FONT>        default :<a name="line.121"></a>
<FONT color="green">122</FONT>          m_targetString = PsuedoNames.PSEUDONAME_ANY;<a name="line.122"></a>
<FONT color="green">123</FONT>          break;<a name="line.123"></a>
<FONT color="green">124</FONT>        }<a name="line.124"></a>
<FONT color="green">125</FONT>      }<a name="line.125"></a>
<FONT color="green">126</FONT>    <a name="line.126"></a>
<FONT color="green">127</FONT>      /**<a name="line.127"></a>
<FONT color="green">128</FONT>       * Get the local name or psuedo name of the node that this pattern will test,<a name="line.128"></a>
<FONT color="green">129</FONT>       * for hash table lookup optimization.<a name="line.129"></a>
<FONT color="green">130</FONT>       *<a name="line.130"></a>
<FONT color="green">131</FONT>       *<a name="line.131"></a>
<FONT color="green">132</FONT>       * @return local name or psuedo name of the node.<a name="line.132"></a>
<FONT color="green">133</FONT>       * @see org.apache.xpath.compiler.PsuedoNames<a name="line.133"></a>
<FONT color="green">134</FONT>       */<a name="line.134"></a>
<FONT color="green">135</FONT>      public String getTargetString()<a name="line.135"></a>
<FONT color="green">136</FONT>      {<a name="line.136"></a>
<FONT color="green">137</FONT>        return m_targetString;<a name="line.137"></a>
<FONT color="green">138</FONT>      }<a name="line.138"></a>
<FONT color="green">139</FONT>    <a name="line.139"></a>
<FONT color="green">140</FONT>      /**<a name="line.140"></a>
<FONT color="green">141</FONT>       * Reference to nodetest and predicate for<a name="line.141"></a>
<FONT color="green">142</FONT>       * parent or ancestor.<a name="line.142"></a>
<FONT color="green">143</FONT>       * @serial<a name="line.143"></a>
<FONT color="green">144</FONT>       */<a name="line.144"></a>
<FONT color="green">145</FONT>      StepPattern m_relativePathPattern;<a name="line.145"></a>
<FONT color="green">146</FONT>    <a name="line.146"></a>
<FONT color="green">147</FONT>      /**<a name="line.147"></a>
<FONT color="green">148</FONT>       * This function is used to fixup variables from QNames to stack frame<a name="line.148"></a>
<FONT color="green">149</FONT>       * indexes at stylesheet build time.<a name="line.149"></a>
<FONT color="green">150</FONT>       * @param vars List of QNames that correspond to variables.  This list<a name="line.150"></a>
<FONT color="green">151</FONT>       * should be searched backwards for the first qualified name that<a name="line.151"></a>
<FONT color="green">152</FONT>       * corresponds to the variable reference qname.  The position of the<a name="line.152"></a>
<FONT color="green">153</FONT>       * QName in the vector from the start of the vector will be its position<a name="line.153"></a>
<FONT color="green">154</FONT>       * in the stack frame (but variables above the globalsTop value will need<a name="line.154"></a>
<FONT color="green">155</FONT>       * to be offset to the current stack frame).<a name="line.155"></a>
<FONT color="green">156</FONT>       * @param globalsSize The number of variables in the global variable area.<a name="line.156"></a>
<FONT color="green">157</FONT>       */<a name="line.157"></a>
<FONT color="green">158</FONT>      public void fixupVariables(java.util.Vector vars, int globalsSize)<a name="line.158"></a>
<FONT color="green">159</FONT>      {<a name="line.159"></a>
<FONT color="green">160</FONT>    <a name="line.160"></a>
<FONT color="green">161</FONT>        super.fixupVariables(vars, globalsSize);<a name="line.161"></a>
<FONT color="green">162</FONT>    <a name="line.162"></a>
<FONT color="green">163</FONT>        if (null != m_predicates)<a name="line.163"></a>
<FONT color="green">164</FONT>        {<a name="line.164"></a>
<FONT color="green">165</FONT>          for (int i = 0; i &lt; m_predicates.length; i++)<a name="line.165"></a>
<FONT color="green">166</FONT>          {<a name="line.166"></a>
<FONT color="green">167</FONT>            m_predicates[i].fixupVariables(vars, globalsSize);<a name="line.167"></a>
<FONT color="green">168</FONT>          }<a name="line.168"></a>
<FONT color="green">169</FONT>        }<a name="line.169"></a>
<FONT color="green">170</FONT>    <a name="line.170"></a>
<FONT color="green">171</FONT>        if (null != m_relativePathPattern)<a name="line.171"></a>
<FONT color="green">172</FONT>        {<a name="line.172"></a>
<FONT color="green">173</FONT>          m_relativePathPattern.fixupVariables(vars, globalsSize);<a name="line.173"></a>
<FONT color="green">174</FONT>        }<a name="line.174"></a>
<FONT color="green">175</FONT>      }<a name="line.175"></a>
<FONT color="green">176</FONT>    <a name="line.176"></a>
<FONT color="green">177</FONT>      /**<a name="line.177"></a>
<FONT color="green">178</FONT>       * Set the reference to nodetest and predicate for<a name="line.178"></a>
<FONT color="green">179</FONT>       * parent or ancestor.<a name="line.179"></a>
<FONT color="green">180</FONT>       *<a name="line.180"></a>
<FONT color="green">181</FONT>       *<a name="line.181"></a>
<FONT color="green">182</FONT>       * @param expr The relative pattern expression.<a name="line.182"></a>
<FONT color="green">183</FONT>       */<a name="line.183"></a>
<FONT color="green">184</FONT>      public void setRelativePathPattern(StepPattern expr)<a name="line.184"></a>
<FONT color="green">185</FONT>      {<a name="line.185"></a>
<FONT color="green">186</FONT>    <a name="line.186"></a>
<FONT color="green">187</FONT>        m_relativePathPattern = expr;<a name="line.187"></a>
<FONT color="green">188</FONT>        expr.exprSetParent(this);<a name="line.188"></a>
<FONT color="green">189</FONT>    <a name="line.189"></a>
<FONT color="green">190</FONT>        calcScore();<a name="line.190"></a>
<FONT color="green">191</FONT>      }<a name="line.191"></a>
<FONT color="green">192</FONT>    <a name="line.192"></a>
<FONT color="green">193</FONT>      /**<a name="line.193"></a>
<FONT color="green">194</FONT>       * Get the reference to nodetest and predicate for<a name="line.194"></a>
<FONT color="green">195</FONT>       * parent or ancestor.<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>       * @return The relative pattern expression.<a name="line.198"></a>
<FONT color="green">199</FONT>       */<a name="line.199"></a>
<FONT color="green">200</FONT>      public StepPattern getRelativePathPattern()<a name="line.200"></a>
<FONT color="green">201</FONT>      {<a name="line.201"></a>
<FONT color="green">202</FONT>        return m_relativePathPattern;<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>      //  /**<a name="line.205"></a>
<FONT color="green">206</FONT>      //   * Set the list of predicate expressions for this pattern step.<a name="line.206"></a>
<FONT color="green">207</FONT>      //   * @param predicates List of expression objects.<a name="line.207"></a>
<FONT color="green">208</FONT>      //   */<a name="line.208"></a>
<FONT color="green">209</FONT>      //  public void setPredicates(Expression[] predicates)<a name="line.209"></a>
<FONT color="green">210</FONT>      //  {<a name="line.210"></a>
<FONT color="green">211</FONT>      //    m_predicates = predicates;<a name="line.211"></a>
<FONT color="green">212</FONT>      //  }<a name="line.212"></a>
<FONT color="green">213</FONT>    <a name="line.213"></a>
<FONT color="green">214</FONT>      /**<a name="line.214"></a>
<FONT color="green">215</FONT>       * Set the list of predicate expressions for this pattern step.<a name="line.215"></a>
<FONT color="green">216</FONT>       * @return List of expression objects.<a name="line.216"></a>
<FONT color="green">217</FONT>       */<a name="line.217"></a>
<FONT color="green">218</FONT>      public Expression[] getPredicates()<a name="line.218"></a>
<FONT color="green">219</FONT>      {<a name="line.219"></a>
<FONT color="green">220</FONT>        return m_predicates;<a name="line.220"></a>
<FONT color="green">221</FONT>      }<a name="line.221"></a>
<FONT color="green">222</FONT>    <a name="line.222"></a>
<FONT color="green">223</FONT>      /**<a name="line.223"></a>
<FONT color="green">224</FONT>       * The list of predicate expressions for this pattern step.<a name="line.224"></a>
<FONT color="green">225</FONT>       *  @serial<a name="line.225"></a>
<FONT color="green">226</FONT>       */<a name="line.226"></a>
<FONT color="green">227</FONT>      Expression[] m_predicates;<a name="line.227"></a>
<FONT color="green">228</FONT>    <a name="line.228"></a>
<FONT color="green">229</FONT>      /**<a name="line.229"></a>
<FONT color="green">230</FONT>       * Tell if this expression or it's subexpressions can traverse outside<a name="line.230"></a>
<FONT color="green">231</FONT>       * the current subtree.<a name="line.231"></a>
<FONT color="green">232</FONT>       *<a name="line.232"></a>
<FONT color="green">233</FONT>       * NOTE: Ancestors tests with predicates are problematic, and will require<a name="line.233"></a>
<FONT color="green">234</FONT>       * special treatment.<a name="line.234"></a>
<FONT color="green">235</FONT>       *<a name="line.235"></a>
<FONT color="green">236</FONT>       * @return true if traversal outside the context node's subtree can occur.<a name="line.236"></a>
<FONT color="green">237</FONT>       */<a name="line.237"></a>
<FONT color="green">238</FONT>      public boolean canTraverseOutsideSubtree()<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>        int n = getPredicateCount();<a name="line.241"></a>
<FONT color="green">242</FONT>    <a name="line.242"></a>
<FONT color="green">243</FONT>        for (int i = 0; i &lt; n; i++)<a name="line.243"></a>
<FONT color="green">244</FONT>        {<a name="line.244"></a>
<FONT color="green">245</FONT>          if (getPredicate(i).canTraverseOutsideSubtree())<a name="line.245"></a>
<FONT color="green">246</FONT>            return true;<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>        return false;<a name="line.249"></a>
<FONT color="green">250</FONT>      }<a name="line.250"></a>
<FONT color="green">251</FONT>    <a name="line.251"></a>
<FONT color="green">252</FONT>      /**<a name="line.252"></a>
<FONT color="green">253</FONT>       * Get a predicate expression.<a name="line.253"></a>
<FONT color="green">254</FONT>       *<a name="line.254"></a>
<FONT color="green">255</FONT>       *<a name="line.255"></a>
<FONT color="green">256</FONT>       * @param i The index of the predicate.<a name="line.256"></a>
<FONT color="green">257</FONT>       *<a name="line.257"></a>
<FONT color="green">258</FONT>       * @return A predicate expression.<a name="line.258"></a>
<FONT color="green">259</FONT>       */<a name="line.259"></a>
<FONT color="green">260</FONT>      public Expression getPredicate(int i)<a name="line.260"></a>
<FONT color="green">261</FONT>      {<a name="line.261"></a>
<FONT color="green">262</FONT>        return m_predicates[i];<a name="line.262"></a>
<FONT color="green">263</FONT>      }<a name="line.263"></a>
<FONT color="green">264</FONT>    <a name="line.264"></a>
<FONT color="green">265</FONT>      /**<a name="line.265"></a>
<FONT color="green">266</FONT>       * Get the number of predicates for this match pattern step.<a name="line.266"></a>
<FONT color="green">267</FONT>       *<a name="line.267"></a>
<FONT color="green">268</FONT>       *<a name="line.268"></a>
<FONT color="green">269</FONT>       * @return the number of predicates for this match pattern step.<a name="line.269"></a>
<FONT color="green">270</FONT>       */<a name="line.270"></a>
<FONT color="green">271</FONT>      public final int getPredicateCount()<a name="line.271"></a>
<FONT color="green">272</FONT>      {<a name="line.272"></a>
<FONT color="green">273</FONT>        return (null == m_predicates) ? 0 : m_predicates.length;<a name="line.273"></a>
<FONT color="green">274</FONT>      }<a name="line.274"></a>
<FONT color="green">275</FONT>    <a name="line.275"></a>
<FONT color="green">276</FONT>      /**<a name="line.276"></a>
<FONT color="green">277</FONT>       * Set the predicates for this match pattern step.<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>       * @param predicates An array of expressions that define predicates<a name="line.280"></a>
<FONT color="green">281</FONT>       *                   for this step.<a name="line.281"></a>
<FONT color="green">282</FONT>       */<a name="line.282"></a>
<FONT color="green">283</FONT>      public void setPredicates(Expression[] predicates)<a name="line.283"></a>
<FONT color="green">284</FONT>      {<a name="line.284"></a>
<FONT color="green">285</FONT>    <a name="line.285"></a>
<FONT color="green">286</FONT>        m_predicates = predicates;<a name="line.286"></a>
<FONT color="green">287</FONT>        if(null != predicates)<a name="line.287"></a>
<FONT color="green">288</FONT>        {<a name="line.288"></a>
<FONT color="green">289</FONT>            for(int i = 0; i &lt; predicates.length; i++)<a name="line.289"></a>
<FONT color="green">290</FONT>            {<a name="line.290"></a>
<FONT color="green">291</FONT>                    predicates[i].exprSetParent(this);<a name="line.291"></a>
<FONT color="green">292</FONT>            }<a name="line.292"></a>
<FONT color="green">293</FONT>        }<a name="line.293"></a>
<FONT color="green">294</FONT>    <a name="line.294"></a>
<FONT color="green">295</FONT>        calcScore();<a name="line.295"></a>
<FONT color="green">296</FONT>      }<a name="line.296"></a>
<FONT color="green">297</FONT>    <a name="line.297"></a>
<FONT color="green">298</FONT>      /**<a name="line.298"></a>
<FONT color="green">299</FONT>       * Static calc of match score.<a name="line.299"></a>
<FONT color="green">300</FONT>       */<a name="line.300"></a>
<FONT color="green">301</FONT>      public void calcScore()<a name="line.301"></a>
<FONT color="green">302</FONT>      {<a name="line.302"></a>
<FONT color="green">303</FONT>    <a name="line.303"></a>
<FONT color="green">304</FONT>        if ((getPredicateCount() &gt; 0) || (null != m_relativePathPattern))<a name="line.304"></a>
<FONT color="green">305</FONT>        {<a name="line.305"></a>
<FONT color="green">306</FONT>          m_score = SCORE_OTHER;<a name="line.306"></a>
<FONT color="green">307</FONT>        }<a name="line.307"></a>
<FONT color="green">308</FONT>        else<a name="line.308"></a>
<FONT color="green">309</FONT>          super.calcScore();<a name="line.309"></a>
<FONT color="green">310</FONT>    <a name="line.310"></a>
<FONT color="green">311</FONT>        if (null == m_targetString)<a name="line.311"></a>
<FONT color="green">312</FONT>          calcTargetString();<a name="line.312"></a>
<FONT color="green">313</FONT>      }<a name="line.313"></a>
<FONT color="green">314</FONT>    <a name="line.314"></a>
<FONT color="green">315</FONT>      /**<a name="line.315"></a>
<FONT color="green">316</FONT>       * Execute this pattern step, including predicates.<a name="line.316"></a>
<FONT color="green">317</FONT>       *<a name="line.317"></a>
<FONT color="green">318</FONT>       *<a name="line.318"></a>
<FONT color="green">319</FONT>       * @param xctxt XPath runtime context.<a name="line.319"></a>
<FONT color="green">320</FONT>       * @param currentNode The current node context.<a name="line.320"></a>
<FONT color="green">321</FONT>       *<a name="line.321"></a>
<FONT color="green">322</FONT>       * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},<a name="line.322"></a>
<FONT color="green">323</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},<a name="line.323"></a>
<FONT color="green">324</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},<a name="line.324"></a>
<FONT color="green">325</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or<a name="line.325"></a>
<FONT color="green">326</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.<a name="line.326"></a>
<FONT color="green">327</FONT>       *<a name="line.327"></a>
<FONT color="green">328</FONT>       * @throws javax.xml.transform.TransformerException<a name="line.328"></a>
<FONT color="green">329</FONT>       */<a name="line.329"></a>
<FONT color="green">330</FONT>      public XObject execute(XPathContext xctxt, int currentNode)<a name="line.330"></a>
<FONT color="green">331</FONT>              throws javax.xml.transform.TransformerException<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>        DTM dtm = xctxt.getDTM(currentNode);<a name="line.334"></a>
<FONT color="green">335</FONT>    <a name="line.335"></a>
<FONT color="green">336</FONT>        if (dtm != null)<a name="line.336"></a>
<FONT color="green">337</FONT>        {<a name="line.337"></a>
<FONT color="green">338</FONT>          int expType = dtm.getExpandedTypeID(currentNode);<a name="line.338"></a>
<FONT color="green">339</FONT>    <a name="line.339"></a>
<FONT color="green">340</FONT>          return execute(xctxt, currentNode, dtm, expType);<a name="line.340"></a>
<FONT color="green">341</FONT>        }<a name="line.341"></a>
<FONT color="green">342</FONT>    <a name="line.342"></a>
<FONT color="green">343</FONT>        return NodeTest.SCORE_NONE;<a name="line.343"></a>
<FONT color="green">344</FONT>      }<a name="line.344"></a>
<FONT color="green">345</FONT>    <a name="line.345"></a>
<FONT color="green">346</FONT>      /**<a name="line.346"></a>
<FONT color="green">347</FONT>       * Execute this pattern step, including predicates.<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>       * @param xctxt XPath runtime context.<a name="line.350"></a>
<FONT color="green">351</FONT>       *<a name="line.351"></a>
<FONT color="green">352</FONT>       * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},<a name="line.352"></a>
<FONT color="green">353</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},<a name="line.353"></a>
<FONT color="green">354</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},<a name="line.354"></a>
<FONT color="green">355</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or<a name="line.355"></a>
<FONT color="green">356</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.<a name="line.356"></a>
<FONT color="green">357</FONT>       *<a name="line.357"></a>
<FONT color="green">358</FONT>       * @throws javax.xml.transform.TransformerException<a name="line.358"></a>
<FONT color="green">359</FONT>       */<a name="line.359"></a>
<FONT color="green">360</FONT>      public XObject execute(XPathContext xctxt)<a name="line.360"></a>
<FONT color="green">361</FONT>              throws javax.xml.transform.TransformerException<a name="line.361"></a>
<FONT color="green">362</FONT>      {<a name="line.362"></a>
<FONT color="green">363</FONT>        return execute(xctxt, xctxt.getCurrentNode());<a name="line.363"></a>
<FONT color="green">364</FONT>      }<a name="line.364"></a>
<FONT color="green">365</FONT>    <a name="line.365"></a>
<FONT color="green">366</FONT>      /**<a name="line.366"></a>
<FONT color="green">367</FONT>       * Execute an expression in the XPath runtime context, and return the<a name="line.367"></a>
<FONT color="green">368</FONT>       * result of the expression.<a name="line.368"></a>
<FONT color="green">369</FONT>       *<a name="line.369"></a>
<FONT color="green">370</FONT>       *<a name="line.370"></a>
<FONT color="green">371</FONT>       * @param xctxt The XPath runtime context.<a name="line.371"></a>
<FONT color="green">372</FONT>       * @param currentNode The currentNode.<a name="line.372"></a>
<FONT color="green">373</FONT>       * @param dtm The DTM of the current node.<a name="line.373"></a>
<FONT color="green">374</FONT>       * @param expType The expanded type ID of the current node.<a name="line.374"></a>
<FONT color="green">375</FONT>       *<a name="line.375"></a>
<FONT color="green">376</FONT>       * @return The result of the expression in the form of a &lt;code&gt;XObject&lt;/code&gt;.<a name="line.376"></a>
<FONT color="green">377</FONT>       *<a name="line.377"></a>
<FONT color="green">378</FONT>       * @throws javax.xml.transform.TransformerException if a runtime exception<a name="line.378"></a>
<FONT color="green">379</FONT>       *         occurs.<a name="line.379"></a>
<FONT color="green">380</FONT>       */<a name="line.380"></a>
<FONT color="green">381</FONT>      public XObject execute(<a name="line.381"></a>
<FONT color="green">382</FONT>              XPathContext xctxt, int currentNode, DTM dtm, int expType)<a name="line.382"></a>
<FONT color="green">383</FONT>                throws javax.xml.transform.TransformerException<a name="line.383"></a>
<FONT color="green">384</FONT>      {<a name="line.384"></a>
<FONT color="green">385</FONT>    <a name="line.385"></a>
<FONT color="green">386</FONT>        if (m_whatToShow == NodeTest.SHOW_BYFUNCTION)<a name="line.386"></a>
<FONT color="green">387</FONT>        {<a name="line.387"></a>
<FONT color="green">388</FONT>          if (null != m_relativePathPattern)<a name="line.388"></a>
<FONT color="green">389</FONT>          {<a name="line.389"></a>
<FONT color="green">390</FONT>            return m_relativePathPattern.execute(xctxt);<a name="line.390"></a>
<FONT color="green">391</FONT>          }<a name="line.391"></a>
<FONT color="green">392</FONT>          else<a name="line.392"></a>
<FONT color="green">393</FONT>            return NodeTest.SCORE_NONE;<a name="line.393"></a>
<FONT color="green">394</FONT>        }<a name="line.394"></a>
<FONT color="green">395</FONT>    <a name="line.395"></a>
<FONT color="green">396</FONT>        XObject score;<a name="line.396"></a>
<FONT color="green">397</FONT>    <a name="line.397"></a>
<FONT color="green">398</FONT>        score = super.execute(xctxt, currentNode, dtm, expType);<a name="line.398"></a>
<FONT color="green">399</FONT>    <a name="line.399"></a>
<FONT color="green">400</FONT>        if (score == NodeTest.SCORE_NONE)<a name="line.400"></a>
<FONT color="green">401</FONT>          return NodeTest.SCORE_NONE;<a name="line.401"></a>
<FONT color="green">402</FONT>    <a name="line.402"></a>
<FONT color="green">403</FONT>        if (getPredicateCount() != 0)<a name="line.403"></a>
<FONT color="green">404</FONT>        {<a name="line.404"></a>
<FONT color="green">405</FONT>          if (!executePredicates(xctxt, dtm, currentNode))<a name="line.405"></a>
<FONT color="green">406</FONT>            return NodeTest.SCORE_NONE;<a name="line.406"></a>
<FONT color="green">407</FONT>        }<a name="line.407"></a>
<FONT color="green">408</FONT>    <a name="line.408"></a>
<FONT color="green">409</FONT>        if (null != m_relativePathPattern)<a name="line.409"></a>
<FONT color="green">410</FONT>          return m_relativePathPattern.executeRelativePathPattern(xctxt, dtm,<a name="line.410"></a>
<FONT color="green">411</FONT>                  currentNode);<a name="line.411"></a>
<FONT color="green">412</FONT>    <a name="line.412"></a>
<FONT color="green">413</FONT>        return score;<a name="line.413"></a>
<FONT color="green">414</FONT>      }<a name="line.414"></a>
<FONT color="green">415</FONT>    <a name="line.415"></a>
<FONT color="green">416</FONT>      /**<a name="line.416"></a>
<FONT color="green">417</FONT>       * New Method to check whether the current node satisfies a position predicate<a name="line.417"></a>
<FONT color="green">418</FONT>       *<a name="line.418"></a>
<FONT color="green">419</FONT>       * @param xctxt The XPath runtime context.<a name="line.419"></a>
<FONT color="green">420</FONT>       * @param predPos Which predicate we're evaluating of foo[1][2][3].<a name="line.420"></a>
<FONT color="green">421</FONT>       * @param dtm The DTM of the current node.<a name="line.421"></a>
<FONT color="green">422</FONT>       * @param context The currentNode.<a name="line.422"></a>
<FONT color="green">423</FONT>       * @param pos The position being requested, i.e. the value returned by <a name="line.423"></a>
<FONT color="green">424</FONT>       *            m_predicates[predPos].execute(xctxt).<a name="line.424"></a>
<FONT color="green">425</FONT>       *<a name="line.425"></a>
<FONT color="green">426</FONT>       * @return true of the position of the context matches pos, false otherwise.<a name="line.426"></a>
<FONT color="green">427</FONT>       */<a name="line.427"></a>
<FONT color="green">428</FONT>      private final boolean checkProximityPosition(XPathContext xctxt,<a name="line.428"></a>
<FONT color="green">429</FONT>              int predPos, DTM dtm, int context, int pos)<a name="line.429"></a>
<FONT color="green">430</FONT>      {<a name="line.430"></a>
<FONT color="green">431</FONT>    <a name="line.431"></a>
<FONT color="green">432</FONT>        try<a name="line.432"></a>
<FONT color="green">433</FONT>        {<a name="line.433"></a>
<FONT color="green">434</FONT>          DTMAxisTraverser traverser =<a name="line.434"></a>
<FONT color="green">435</FONT>            dtm.getAxisTraverser(Axis.PRECEDINGSIBLING);<a name="line.435"></a>
<FONT color="green">436</FONT>    <a name="line.436"></a>
<FONT color="green">437</FONT>          for (int child = traverser.first(context); DTM.NULL != child;<a name="line.437"></a>
<FONT color="green">438</FONT>                  child = traverser.next(context, child))<a name="line.438"></a>
<FONT color="green">439</FONT>          {<a name="line.439"></a>
<FONT color="green">440</FONT>            try<a name="line.440"></a>
<FONT color="green">441</FONT>            {<a name="line.441"></a>
<FONT color="green">442</FONT>              xctxt.pushCurrentNode(child);<a name="line.442"></a>
<FONT color="green">443</FONT>    <a name="line.443"></a>
<FONT color="green">444</FONT>              if (NodeTest.SCORE_NONE != super.execute(xctxt, child))<a name="line.444"></a>
<FONT color="green">445</FONT>              {<a name="line.445"></a>
<FONT color="green">446</FONT>                boolean pass = true;<a name="line.446"></a>
<FONT color="green">447</FONT>    <a name="line.447"></a>
<FONT color="green">448</FONT>                try<a name="line.448"></a>
<FONT color="green">449</FONT>                {<a name="line.449"></a>
<FONT color="green">450</FONT>                  xctxt.pushSubContextList(this);<a name="line.450"></a>
<FONT color="green">451</FONT>    <a name="line.451"></a>
<FONT color="green">452</FONT>                  for (int i = 0; i &lt; predPos; i++)<a name="line.452"></a>
<FONT color="green">453</FONT>                  {<a name="line.453"></a>
<FONT color="green">454</FONT>                    xctxt.pushPredicatePos(i);<a name="line.454"></a>
<FONT color="green">455</FONT>                    try<a name="line.455"></a>
<FONT color="green">456</FONT>                    {<a name="line.456"></a>
<FONT color="green">457</FONT>                      XObject pred = m_predicates[i].execute(xctxt);<a name="line.457"></a>
<FONT color="green">458</FONT>                      <a name="line.458"></a>
<FONT color="green">459</FONT>                      try<a name="line.459"></a>
<FONT color="green">460</FONT>                      {<a name="line.460"></a>
<FONT color="green">461</FONT>                        if (XObject.CLASS_NUMBER == pred.getType())<a name="line.461"></a>
<FONT color="green">462</FONT>                        {<a name="line.462"></a>
<FONT color="green">463</FONT>                          throw new Error("Why: Should never have been called");<a name="line.463"></a>
<FONT color="green">464</FONT>                        }<a name="line.464"></a>
<FONT color="green">465</FONT>                        else if (!pred.boolWithSideEffects())<a name="line.465"></a>
<FONT color="green">466</FONT>                        {<a name="line.466"></a>
<FONT color="green">467</FONT>                          pass = false;<a name="line.467"></a>
<FONT color="green">468</FONT>        <a name="line.468"></a>
<FONT color="green">469</FONT>                          break;<a name="line.469"></a>
<FONT color="green">470</FONT>                        }<a name="line.470"></a>
<FONT color="green">471</FONT>                      }<a name="line.471"></a>
<FONT color="green">472</FONT>                      finally<a name="line.472"></a>
<FONT color="green">473</FONT>                      {<a name="line.473"></a>
<FONT color="green">474</FONT>                        pred.detach();<a name="line.474"></a>
<FONT color="green">475</FONT>                      }<a name="line.475"></a>
<FONT color="green">476</FONT>                    }<a name="line.476"></a>
<FONT color="green">477</FONT>                    finally<a name="line.477"></a>
<FONT color="green">478</FONT>                    {<a name="line.478"></a>
<FONT color="green">479</FONT>                      xctxt.popPredicatePos();<a name="line.479"></a>
<FONT color="green">480</FONT>                    }<a name="line.480"></a>
<FONT color="green">481</FONT>                  }<a name="line.481"></a>
<FONT color="green">482</FONT>                }<a name="line.482"></a>
<FONT color="green">483</FONT>                finally<a name="line.483"></a>
<FONT color="green">484</FONT>                {<a name="line.484"></a>
<FONT color="green">485</FONT>                  xctxt.popSubContextList();<a name="line.485"></a>
<FONT color="green">486</FONT>                }<a name="line.486"></a>
<FONT color="green">487</FONT>    <a name="line.487"></a>
<FONT color="green">488</FONT>                if (pass)<a name="line.488"></a>
<FONT color="green">489</FONT>                  pos--;<a name="line.489"></a>
<FONT color="green">490</FONT>    <a name="line.490"></a>
<FONT color="green">491</FONT>                if (pos &lt; 1)<a name="line.491"></a>
<FONT color="green">492</FONT>                  return false;<a name="line.492"></a>
<FONT color="green">493</FONT>              }<a name="line.493"></a>
<FONT color="green">494</FONT>            }<a name="line.494"></a>
<FONT color="green">495</FONT>            finally<a name="line.495"></a>
<FONT color="green">496</FONT>            {<a name="line.496"></a>
<FONT color="green">497</FONT>              xctxt.popCurrentNode();<a name="line.497"></a>
<FONT color="green">498</FONT>            }<a name="line.498"></a>
<FONT color="green">499</FONT>          }<a name="line.499"></a>
<FONT color="green">500</FONT>        }<a name="line.500"></a>
<FONT color="green">501</FONT>        catch (javax.xml.transform.TransformerException se)<a name="line.501"></a>
<FONT color="green">502</FONT>        {<a name="line.502"></a>
<FONT color="green">503</FONT>    <a name="line.503"></a>
<FONT color="green">504</FONT>          // TODO: should keep throw sax exception...<a name="line.504"></a>
<FONT color="green">505</FONT>          throw new java.lang.RuntimeException(se.getMessage());<a name="line.505"></a>
<FONT color="green">506</FONT>        }<a name="line.506"></a>
<FONT color="green">507</FONT>    <a name="line.507"></a>
<FONT color="green">508</FONT>        return (pos == 1);<a name="line.508"></a>
<FONT color="green">509</FONT>      }<a name="line.509"></a>
<FONT color="green">510</FONT>    <a name="line.510"></a>
<FONT color="green">511</FONT>      /**<a name="line.511"></a>
<FONT color="green">512</FONT>       * Get the proximity position index of the current node based on this<a name="line.512"></a>
<FONT color="green">513</FONT>       * node test.<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>       * @param xctxt XPath runtime context.<a name="line.516"></a>
<FONT color="green">517</FONT>       * @param predPos Which predicate we're evaluating of foo[1][2][3].<a name="line.517"></a>
<FONT color="green">518</FONT>       * @param findLast If true, don't terminate when the context node is found.<a name="line.518"></a>
<FONT color="green">519</FONT>       *<a name="line.519"></a>
<FONT color="green">520</FONT>       * @return the proximity position index of the current node based on the<a name="line.520"></a>
<FONT color="green">521</FONT>       *         node test.<a name="line.521"></a>
<FONT color="green">522</FONT>       */<a name="line.522"></a>
<FONT color="green">523</FONT>      private final int getProximityPosition(XPathContext xctxt, int predPos, <a name="line.523"></a>
<FONT color="green">524</FONT>                        boolean findLast)<a name="line.524"></a>
<FONT color="green">525</FONT>      {<a name="line.525"></a>
<FONT color="green">526</FONT>    <a name="line.526"></a>
<FONT color="green">527</FONT>        int pos = 0;<a name="line.527"></a>
<FONT color="green">528</FONT>        int context = xctxt.getCurrentNode();<a name="line.528"></a>
<FONT color="green">529</FONT>        DTM dtm = xctxt.getDTM(context);<a name="line.529"></a>
<FONT color="green">530</FONT>        int parent = dtm.getParent(context);<a name="line.530"></a>
<FONT color="green">531</FONT>    <a name="line.531"></a>
<FONT color="green">532</FONT>        try<a name="line.532"></a>
<FONT color="green">533</FONT>        {<a name="line.533"></a>
<FONT color="green">534</FONT>          DTMAxisTraverser traverser = dtm.getAxisTraverser(Axis.CHILD);<a name="line.534"></a>
<FONT color="green">535</FONT>    <a name="line.535"></a>
<FONT color="green">536</FONT>          for (int child = traverser.first(parent); DTM.NULL != child;<a name="line.536"></a>
<FONT color="green">537</FONT>                  child = traverser.next(parent, child))<a name="line.537"></a>
<FONT color="green">538</FONT>          {<a name="line.538"></a>
<FONT color="green">539</FONT>            try<a name="line.539"></a>
<FONT color="green">540</FONT>            {<a name="line.540"></a>
<FONT color="green">541</FONT>              xctxt.pushCurrentNode(child);<a name="line.541"></a>
<FONT color="green">542</FONT>    <a name="line.542"></a>
<FONT color="green">543</FONT>              if (NodeTest.SCORE_NONE != super.execute(xctxt, child))<a name="line.543"></a>
<FONT color="green">544</FONT>              {<a name="line.544"></a>
<FONT color="green">545</FONT>                boolean pass = true;<a name="line.545"></a>
<FONT color="green">546</FONT>    <a name="line.546"></a>
<FONT color="green">547</FONT>                try<a name="line.547"></a>
<FONT color="green">548</FONT>                {<a name="line.548"></a>
<FONT color="green">549</FONT>                  xctxt.pushSubContextList(this);<a name="line.549"></a>
<FONT color="green">550</FONT>    <a name="line.550"></a>
<FONT color="green">551</FONT>                  for (int i = 0; i &lt; predPos; i++)<a name="line.551"></a>
<FONT color="green">552</FONT>                  {<a name="line.552"></a>
<FONT color="green">553</FONT>                    xctxt.pushPredicatePos(i);<a name="line.553"></a>
<FONT color="green">554</FONT>                    try<a name="line.554"></a>
<FONT color="green">555</FONT>                    {<a name="line.555"></a>
<FONT color="green">556</FONT>                      XObject pred = m_predicates[i].execute(xctxt);<a name="line.556"></a>
<FONT color="green">557</FONT>      <a name="line.557"></a>
<FONT color="green">558</FONT>                      try<a name="line.558"></a>
<FONT color="green">559</FONT>                      {<a name="line.559"></a>
<FONT color="green">560</FONT>                        if (XObject.CLASS_NUMBER == pred.getType())<a name="line.560"></a>
<FONT color="green">561</FONT>                        {<a name="line.561"></a>
<FONT color="green">562</FONT>                          if ((pos + 1) != (int) pred.numWithSideEffects())<a name="line.562"></a>
<FONT color="green">563</FONT>                          {<a name="line.563"></a>
<FONT color="green">564</FONT>                            pass = false;<a name="line.564"></a>
<FONT color="green">565</FONT>        <a name="line.565"></a>
<FONT color="green">566</FONT>                            break;<a name="line.566"></a>
<FONT color="green">567</FONT>                          }<a name="line.567"></a>
<FONT color="green">568</FONT>                        }<a name="line.568"></a>
<FONT color="green">569</FONT>                        else if (!pred.boolWithSideEffects())<a name="line.569"></a>
<FONT color="green">570</FONT>                        {<a name="line.570"></a>
<FONT color="green">571</FONT>                          pass = false;<a name="line.571"></a>
<FONT color="green">572</FONT>        <a name="line.572"></a>
<FONT color="green">573</FONT>                          break;<a name="line.573"></a>
<FONT color="green">574</FONT>                        }<a name="line.574"></a>
<FONT color="green">575</FONT>                      }<a name="line.575"></a>
<FONT color="green">576</FONT>                      finally<a name="line.576"></a>
<FONT color="green">577</FONT>                      {<a name="line.577"></a>
<FONT color="green">578</FONT>                        pred.detach();<a name="line.578"></a>
<FONT color="green">579</FONT>                      }<a name="line.579"></a>
<FONT color="green">580</FONT>                    }<a name="line.580"></a>
<FONT color="green">581</FONT>                    finally<a name="line.581"></a>
<FONT color="green">582</FONT>                    {<a name="line.582"></a>
<FONT color="green">583</FONT>                      xctxt.popPredicatePos();<a name="line.583"></a>
<FONT color="green">584</FONT>                    }<a name="line.584"></a>
<FONT color="green">585</FONT>                  }<a name="line.585"></a>
<FONT color="green">586</FONT>                }<a name="line.586"></a>
<FONT color="green">587</FONT>                finally<a name="line.587"></a>
<FONT color="green">588</FONT>                {<a name="line.588"></a>
<FONT color="green">589</FONT>                  xctxt.popSubContextList();<a name="line.589"></a>
<FONT color="green">590</FONT>                }<a name="line.590"></a>
<FONT color="green">591</FONT>    <a name="line.591"></a>
<FONT color="green">592</FONT>                if (pass)<a name="line.592"></a>
<FONT color="green">593</FONT>                  pos++;<a name="line.593"></a>
<FONT color="green">594</FONT>    <a name="line.594"></a>
<FONT color="green">595</FONT>                if (!findLast &amp;&amp; child == context)<a name="line.595"></a>
<FONT color="green">596</FONT>                {<a name="line.596"></a>
<FONT color="green">597</FONT>                  return pos;<a name="line.597"></a>
<FONT color="green">598</FONT>                }<a name="line.598"></a>
<FONT color="green">599</FONT>              }<a name="line.599"></a>
<FONT color="green">600</FONT>            }<a name="line.600"></a>
<FONT color="green">601</FONT>            finally<a name="line.601"></a>
<FONT color="green">602</FONT>            {<a name="line.602"></a>
<FONT color="green">603</FONT>              xctxt.popCurrentNode();<a name="line.603"></a>
<FONT color="green">604</FONT>            }<a name="line.604"></a>
<FONT color="green">605</FONT>          }<a name="line.605"></a>
<FONT color="green">606</FONT>        }<a name="line.606"></a>
<FONT color="green">607</FONT>        catch (javax.xml.transform.TransformerException se)<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>          // TODO: should keep throw sax exception...<a name="line.610"></a>
<FONT color="green">611</FONT>          throw new java.lang.RuntimeException(se.getMessage());<a name="line.611"></a>
<FONT color="green">612</FONT>        }<a name="line.612"></a>
<FONT color="green">613</FONT>    <a name="line.613"></a>
<FONT color="green">614</FONT>        return pos;<a name="line.614"></a>
<FONT color="green">615</FONT>      }<a name="line.615"></a>
<FONT color="green">616</FONT>    <a name="line.616"></a>
<FONT color="green">617</FONT>      /**<a name="line.617"></a>
<FONT color="green">618</FONT>       * Get the proximity position index of the current node based on this<a name="line.618"></a>
<FONT color="green">619</FONT>       * node test.<a name="line.619"></a>
<FONT color="green">620</FONT>       *<a name="line.620"></a>
<FONT color="green">621</FONT>       *<a name="line.621"></a>
<FONT color="green">622</FONT>       * @param xctxt XPath runtime context.<a name="line.622"></a>
<FONT color="green">623</FONT>       *<a name="line.623"></a>
<FONT color="green">624</FONT>       * @return the proximity position index of the current node based on the<a name="line.624"></a>
<FONT color="green">625</FONT>       *         node test.<a name="line.625"></a>
<FONT color="green">626</FONT>       */<a name="line.626"></a>
<FONT color="green">627</FONT>      public int getProximityPosition(XPathContext xctxt)<a name="line.627"></a>
<FONT color="green">628</FONT>      {<a name="line.628"></a>
<FONT color="green">629</FONT>        return getProximityPosition(xctxt, xctxt.getPredicatePos(), false);<a name="line.629"></a>
<FONT color="green">630</FONT>      }<a name="line.630"></a>
<FONT color="green">631</FONT>      <a name="line.631"></a>
<FONT color="green">632</FONT>      /**<a name="line.632"></a>
<FONT color="green">633</FONT>       * Get the count of the nodes that match the test, which is the proximity<a name="line.633"></a>
<FONT color="green">634</FONT>       * position of the last node that can pass this test in the sub context<a name="line.634"></a>
<FONT color="green">635</FONT>       * selection.  In XSLT 1-based indexing, this count is the index of the last<a name="line.635"></a>
<FONT color="green">636</FONT>       * node.<a name="line.636"></a>
<FONT color="green">637</FONT>       *<a name="line.637"></a>
<FONT color="green">638</FONT>       *<a name="line.638"></a>
<FONT color="green">639</FONT>       * @param xctxt XPath runtime context.<a name="line.639"></a>
<FONT color="green">640</FONT>       *<a name="line.640"></a>
<FONT color="green">641</FONT>       * @return the count of the nodes that match the test.<a name="line.641"></a>
<FONT color="green">642</FONT>       */<a name="line.642"></a>
<FONT color="green">643</FONT>      public int getLastPos(XPathContext xctxt)<a name="line.643"></a>
<FONT color="green">644</FONT>      {<a name="line.644"></a>
<FONT color="green">645</FONT>        return getProximityPosition(xctxt, xctxt.getPredicatePos(), true);<a name="line.645"></a>
<FONT color="green">646</FONT>      }<a name="line.646"></a>
<FONT color="green">647</FONT>    <a name="line.647"></a>
<FONT color="green">648</FONT>      /**<a name="line.648"></a>
<FONT color="green">649</FONT>       * Execute the match pattern step relative to another step.<a name="line.649"></a>
<FONT color="green">650</FONT>       *<a name="line.650"></a>
<FONT color="green">651</FONT>       *<a name="line.651"></a>
<FONT color="green">652</FONT>       * @param xctxt The XPath runtime context.<a name="line.652"></a>
<FONT color="green">653</FONT>       * @param dtm The DTM of the current node.<a name="line.653"></a>
<FONT color="green">654</FONT>       * @param currentNode The current node context.<a name="line.654"></a>
<FONT color="green">655</FONT>       *<a name="line.655"></a>
<FONT color="green">656</FONT>       * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},<a name="line.656"></a>
<FONT color="green">657</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},<a name="line.657"></a>
<FONT color="green">658</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},<a name="line.658"></a>
<FONT color="green">659</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or<a name="line.659"></a>
<FONT color="green">660</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.<a name="line.660"></a>
<FONT color="green">661</FONT>       *<a name="line.661"></a>
<FONT color="green">662</FONT>       * @throws javax.xml.transform.TransformerException<a name="line.662"></a>
<FONT color="green">663</FONT>       */<a name="line.663"></a>
<FONT color="green">664</FONT>      protected final XObject executeRelativePathPattern(<a name="line.664"></a>
<FONT color="green">665</FONT>              XPathContext xctxt, DTM dtm, int currentNode)<a name="line.665"></a>
<FONT color="green">666</FONT>                throws javax.xml.transform.TransformerException<a name="line.666"></a>
<FONT color="green">667</FONT>      {<a name="line.667"></a>
<FONT color="green">668</FONT>    <a name="line.668"></a>
<FONT color="green">669</FONT>        XObject score = NodeTest.SCORE_NONE;<a name="line.669"></a>
<FONT color="green">670</FONT>        int context = currentNode;<a name="line.670"></a>
<FONT color="green">671</FONT>        DTMAxisTraverser traverser;<a name="line.671"></a>
<FONT color="green">672</FONT>    <a name="line.672"></a>
<FONT color="green">673</FONT>        traverser = dtm.getAxisTraverser(m_axis);<a name="line.673"></a>
<FONT color="green">674</FONT>    <a name="line.674"></a>
<FONT color="green">675</FONT>        for (int relative = traverser.first(context); DTM.NULL != relative;<a name="line.675"></a>
<FONT color="green">676</FONT>                relative = traverser.next(context, relative))<a name="line.676"></a>
<FONT color="green">677</FONT>        {<a name="line.677"></a>
<FONT color="green">678</FONT>          try<a name="line.678"></a>
<FONT color="green">679</FONT>          {<a name="line.679"></a>
<FONT color="green">680</FONT>            xctxt.pushCurrentNode(relative);<a name="line.680"></a>
<FONT color="green">681</FONT>    <a name="line.681"></a>
<FONT color="green">682</FONT>            score = execute(xctxt);<a name="line.682"></a>
<FONT color="green">683</FONT>    <a name="line.683"></a>
<FONT color="green">684</FONT>            if (score != NodeTest.SCORE_NONE)<a name="line.684"></a>
<FONT color="green">685</FONT>              break;<a name="line.685"></a>
<FONT color="green">686</FONT>          }<a name="line.686"></a>
<FONT color="green">687</FONT>          finally<a name="line.687"></a>
<FONT color="green">688</FONT>          {<a name="line.688"></a>
<FONT color="green">689</FONT>            xctxt.popCurrentNode();<a name="line.689"></a>
<FONT color="green">690</FONT>          }<a name="line.690"></a>
<FONT color="green">691</FONT>        }<a name="line.691"></a>
<FONT color="green">692</FONT>    <a name="line.692"></a>
<FONT color="green">693</FONT>        return score;<a name="line.693"></a>
<FONT color="green">694</FONT>      }<a name="line.694"></a>
<FONT color="green">695</FONT>    <a name="line.695"></a>
<FONT color="green">696</FONT>      /**<a name="line.696"></a>
<FONT color="green">697</FONT>       * Execute the predicates on this step to determine if the current node <a name="line.697"></a>
<FONT color="green">698</FONT>       * should be filtered or accepted.<a name="line.698"></a>
<FONT color="green">699</FONT>       *<a name="line.699"></a>
<FONT color="green">700</FONT>       * @param xctxt The XPath runtime context.<a name="line.700"></a>
<FONT color="green">701</FONT>       * @param dtm The DTM of the current node.<a name="line.701"></a>
<FONT color="green">702</FONT>       * @param currentNode The current node context.<a name="line.702"></a>
<FONT color="green">703</FONT>       *<a name="line.703"></a>
<FONT color="green">704</FONT>       * @return true if the node should be accepted, false otherwise.<a name="line.704"></a>
<FONT color="green">705</FONT>       *<a name="line.705"></a>
<FONT color="green">706</FONT>       * @throws javax.xml.transform.TransformerException<a name="line.706"></a>
<FONT color="green">707</FONT>       */<a name="line.707"></a>
<FONT color="green">708</FONT>      protected final boolean executePredicates(<a name="line.708"></a>
<FONT color="green">709</FONT>              XPathContext xctxt, DTM dtm, int currentNode)<a name="line.709"></a>
<FONT color="green">710</FONT>                throws javax.xml.transform.TransformerException<a name="line.710"></a>
<FONT color="green">711</FONT>      {<a name="line.711"></a>
<FONT color="green">712</FONT>    <a name="line.712"></a>
<FONT color="green">713</FONT>        boolean result = true;<a name="line.713"></a>
<FONT color="green">714</FONT>        boolean positionAlreadySeen = false;<a name="line.714"></a>
<FONT color="green">715</FONT>        int n = getPredicateCount();<a name="line.715"></a>
<FONT color="green">716</FONT>    <a name="line.716"></a>
<FONT color="green">717</FONT>        try<a name="line.717"></a>
<FONT color="green">718</FONT>        {<a name="line.718"></a>
<FONT color="green">719</FONT>          xctxt.pushSubContextList(this);<a name="line.719"></a>
<FONT color="green">720</FONT>    <a name="line.720"></a>
<FONT color="green">721</FONT>          for (int i = 0; i &lt; n; i++)<a name="line.721"></a>
<FONT color="green">722</FONT>          {<a name="line.722"></a>
<FONT color="green">723</FONT>            xctxt.pushPredicatePos(i);<a name="line.723"></a>
<FONT color="green">724</FONT>    <a name="line.724"></a>
<FONT color="green">725</FONT>            try<a name="line.725"></a>
<FONT color="green">726</FONT>            {<a name="line.726"></a>
<FONT color="green">727</FONT>              XObject pred = m_predicates[i].execute(xctxt);<a name="line.727"></a>
<FONT color="green">728</FONT>    <a name="line.728"></a>
<FONT color="green">729</FONT>              try<a name="line.729"></a>
<FONT color="green">730</FONT>              {<a name="line.730"></a>
<FONT color="green">731</FONT>                if (XObject.CLASS_NUMBER == pred.getType())<a name="line.731"></a>
<FONT color="green">732</FONT>                {<a name="line.732"></a>
<FONT color="green">733</FONT>                  int pos = (int) pred.num();<a name="line.733"></a>
<FONT color="green">734</FONT>      <a name="line.734"></a>
<FONT color="green">735</FONT>                  if (positionAlreadySeen)<a name="line.735"></a>
<FONT color="green">736</FONT>                  {<a name="line.736"></a>
<FONT color="green">737</FONT>                    result = (pos == 1);<a name="line.737"></a>
<FONT color="green">738</FONT>      <a name="line.738"></a>
<FONT color="green">739</FONT>                    break;<a name="line.739"></a>
<FONT color="green">740</FONT>                  }<a name="line.740"></a>
<FONT color="green">741</FONT>                  else<a name="line.741"></a>
<FONT color="green">742</FONT>                  {<a name="line.742"></a>
<FONT color="green">743</FONT>                    positionAlreadySeen = true;<a name="line.743"></a>
<FONT color="green">744</FONT>      <a name="line.744"></a>
<FONT color="green">745</FONT>                    if (!checkProximityPosition(xctxt, i, dtm, currentNode, pos))<a name="line.745"></a>
<FONT color="green">746</FONT>                    {<a name="line.746"></a>
<FONT color="green">747</FONT>                      result = false;<a name="line.747"></a>
<FONT color="green">748</FONT>      <a name="line.748"></a>
<FONT color="green">749</FONT>                      break;<a name="line.749"></a>
<FONT color="green">750</FONT>                    }<a name="line.750"></a>
<FONT color="green">751</FONT>                  }<a name="line.751"></a>
<FONT color="green">752</FONT>                <a name="line.752"></a>
<FONT color="green">753</FONT>                }<a name="line.753"></a>
<FONT color="green">754</FONT>                else if (!pred.boolWithSideEffects())<a name="line.754"></a>
<FONT color="green">755</FONT>                {<a name="line.755"></a>
<FONT color="green">756</FONT>                  result = false;<a name="line.756"></a>
<FONT color="green">757</FONT>      <a name="line.757"></a>
<FONT color="green">758</FONT>                  break;<a name="line.758"></a>
<FONT color="green">759</FONT>                }<a name="line.759"></a>
<FONT color="green">760</FONT>              }<a name="line.760"></a>
<FONT color="green">761</FONT>              finally<a name="line.761"></a>
<FONT color="green">762</FONT>              {<a name="line.762"></a>
<FONT color="green">763</FONT>                pred.detach();<a name="line.763"></a>
<FONT color="green">764</FONT>              }<a name="line.764"></a>
<FONT color="green">765</FONT>            }<a name="line.765"></a>
<FONT color="green">766</FONT>            finally<a name="line.766"></a>
<FONT color="green">767</FONT>            {<a name="line.767"></a>
<FONT color="green">768</FONT>              xctxt.popPredicatePos();<a name="line.768"></a>
<FONT color="green">769</FONT>            }<a name="line.769"></a>
<FONT color="green">770</FONT>          }<a name="line.770"></a>
<FONT color="green">771</FONT>        }<a name="line.771"></a>
<FONT color="green">772</FONT>        finally<a name="line.772"></a>
<FONT color="green">773</FONT>        {<a name="line.773"></a>
<FONT color="green">774</FONT>          xctxt.popSubContextList();<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>        return result;<a name="line.777"></a>
<FONT color="green">778</FONT>      }<a name="line.778"></a>
<FONT color="green">779</FONT>    <a name="line.779"></a>
<FONT color="green">780</FONT>      /**<a name="line.780"></a>
<FONT color="green">781</FONT>       * Get the string represenentation of this step for diagnostic purposes.<a name="line.781"></a>
<FONT color="green">782</FONT>       *<a name="line.782"></a>
<FONT color="green">783</FONT>       *<a name="line.783"></a>
<FONT color="green">784</FONT>       * @return A string representation of this step, built by reverse-engineering <a name="line.784"></a>
<FONT color="green">785</FONT>       * the contained info.<a name="line.785"></a>
<FONT color="green">786</FONT>       */<a name="line.786"></a>
<FONT color="green">787</FONT>      public String toString()<a name="line.787"></a>
<FONT color="green">788</FONT>      {<a name="line.788"></a>
<FONT color="green">789</FONT>    <a name="line.789"></a>
<FONT color="green">790</FONT>        StringBuffer buf = new StringBuffer();<a name="line.790"></a>
<FONT color="green">791</FONT>    <a name="line.791"></a>
<FONT color="green">792</FONT>        for (StepPattern pat = this; pat != null; pat = pat.m_relativePathPattern)<a name="line.792"></a>
<FONT color="green">793</FONT>        {<a name="line.793"></a>
<FONT color="green">794</FONT>          if (pat != this)<a name="line.794"></a>
<FONT color="green">795</FONT>            buf.append("/");<a name="line.795"></a>
<FONT color="green">796</FONT>    <a name="line.796"></a>
<FONT color="green">797</FONT>          buf.append(Axis.getNames(pat.m_axis));<a name="line.797"></a>
<FONT color="green">798</FONT>          buf.append("::");<a name="line.798"></a>
<FONT color="green">799</FONT>    <a name="line.799"></a>
<FONT color="green">800</FONT>          if (0x000005000 == pat.m_whatToShow)<a name="line.800"></a>
<FONT color="green">801</FONT>          {<a name="line.801"></a>
<FONT color="green">802</FONT>            buf.append("doc()");<a name="line.802"></a>
<FONT color="green">803</FONT>          }<a name="line.803"></a>
<FONT color="green">804</FONT>          else if (DTMFilter.SHOW_BYFUNCTION == pat.m_whatToShow)<a name="line.804"></a>
<FONT color="green">805</FONT>          {<a name="line.805"></a>
<FONT color="green">806</FONT>            buf.append("function()");<a name="line.806"></a>
<FONT color="green">807</FONT>          }<a name="line.807"></a>
<FONT color="green">808</FONT>          else if (DTMFilter.SHOW_ALL == pat.m_whatToShow)<a name="line.808"></a>
<FONT color="green">809</FONT>          {<a name="line.809"></a>
<FONT color="green">810</FONT>            buf.append("node()");<a name="line.810"></a>
<FONT color="green">811</FONT>          }<a name="line.811"></a>
<FONT color="green">812</FONT>          else if (DTMFilter.SHOW_TEXT == pat.m_whatToShow)<a name="line.812"></a>
<FONT color="green">813</FONT>          {<a name="line.813"></a>
<FONT color="green">814</FONT>            buf.append("text()");<a name="line.814"></a>
<FONT color="green">815</FONT>          }<a name="line.815"></a>
<FONT color="green">816</FONT>          else if (DTMFilter.SHOW_PROCESSING_INSTRUCTION == pat.m_whatToShow)<a name="line.816"></a>
<FONT color="green">817</FONT>          {<a name="line.817"></a>
<FONT color="green">818</FONT>            buf.append("processing-instruction(");<a name="line.818"></a>
<FONT color="green">819</FONT>    <a name="line.819"></a>
<FONT color="green">820</FONT>            if (null != pat.m_name)<a name="line.820"></a>
<FONT color="green">821</FONT>            {<a name="line.821"></a>
<FONT color="green">822</FONT>              buf.append(pat.m_name);<a name="line.822"></a>
<FONT color="green">823</FONT>            }<a name="line.823"></a>
<FONT color="green">824</FONT>    <a name="line.824"></a>
<FONT color="green">825</FONT>            buf.append(")");<a name="line.825"></a>
<FONT color="green">826</FONT>          }<a name="line.826"></a>
<FONT color="green">827</FONT>          else if (DTMFilter.SHOW_COMMENT == pat.m_whatToShow)<a name="line.827"></a>
<FONT color="green">828</FONT>          {<a name="line.828"></a>
<FONT color="green">829</FONT>            buf.append("comment()");<a name="line.829"></a>
<FONT color="green">830</FONT>          }<a name="line.830"></a>
<FONT color="green">831</FONT>          else if (null != pat.m_name)<a name="line.831"></a>
<FONT color="green">832</FONT>          {<a name="line.832"></a>
<FONT color="green">833</FONT>            if (DTMFilter.SHOW_ATTRIBUTE == pat.m_whatToShow)<a name="line.833"></a>
<FONT color="green">834</FONT>            {<a name="line.834"></a>
<FONT color="green">835</FONT>              buf.append("@");<a name="line.835"></a>
<FONT color="green">836</FONT>            }<a name="line.836"></a>
<FONT color="green">837</FONT>    <a name="line.837"></a>
<FONT color="green">838</FONT>            if (null != pat.m_namespace)<a name="line.838"></a>
<FONT color="green">839</FONT>            {<a name="line.839"></a>
<FONT color="green">840</FONT>              buf.append("{");<a name="line.840"></a>
<FONT color="green">841</FONT>              buf.append(pat.m_namespace);<a name="line.841"></a>
<FONT color="green">842</FONT>              buf.append("}");<a name="line.842"></a>
<FONT color="green">843</FONT>            }<a name="line.843"></a>
<FONT color="green">844</FONT>    <a name="line.844"></a>
<FONT color="green">845</FONT>            buf.append(pat.m_name);<a name="line.845"></a>
<FONT color="green">846</FONT>          }<a name="line.846"></a>
<FONT color="green">847</FONT>          else if (DTMFilter.SHOW_ATTRIBUTE == pat.m_whatToShow)<a name="line.847"></a>
<FONT color="green">848</FONT>          {<a name="line.848"></a>
<FONT color="green">849</FONT>            buf.append("@");<a name="line.849"></a>
<FONT color="green">850</FONT>          }<a name="line.850"></a>
<FONT color="green">851</FONT>          else if ((DTMFilter.SHOW_DOCUMENT | DTMFilter.SHOW_DOCUMENT_FRAGMENT)<a name="line.851"></a>
<FONT color="green">852</FONT>                   == pat.m_whatToShow)<a name="line.852"></a>
<FONT color="green">853</FONT>          {<a name="line.853"></a>
<FONT color="green">854</FONT>            buf.append("doc-root()");<a name="line.854"></a>
<FONT color="green">855</FONT>          }<a name="line.855"></a>
<FONT color="green">856</FONT>          else<a name="line.856"></a>
<FONT color="green">857</FONT>          {<a name="line.857"></a>
<FONT color="green">858</FONT>            buf.append("?" + Integer.toHexString(pat.m_whatToShow));<a name="line.858"></a>
<FONT color="green">859</FONT>          }<a name="line.859"></a>
<FONT color="green">860</FONT>    <a name="line.860"></a>
<FONT color="green">861</FONT>          if (null != pat.m_predicates)<a name="line.861"></a>
<FONT color="green">862</FONT>          {<a name="line.862"></a>
<FONT color="green">863</FONT>            for (int i = 0; i &lt; pat.m_predicates.length; i++)<a name="line.863"></a>
<FONT color="green">864</FONT>            {<a name="line.864"></a>
<FONT color="green">865</FONT>              buf.append("[");<a name="line.865"></a>
<FONT color="green">866</FONT>              buf.append(pat.m_predicates[i]);<a name="line.866"></a>
<FONT color="green">867</FONT>              buf.append("]");<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>    <a name="line.871"></a>
<FONT color="green">872</FONT>        return buf.toString();<a name="line.872"></a>
<FONT color="green">873</FONT>      }<a name="line.873"></a>
<FONT color="green">874</FONT>    <a name="line.874"></a>
<FONT color="green">875</FONT>      /** Set to true to send diagnostics about pattern matches to the consol. */<a name="line.875"></a>
<FONT color="green">876</FONT>      private static final boolean DEBUG_MATCHES = false;<a name="line.876"></a>
<FONT color="green">877</FONT>    <a name="line.877"></a>
<FONT color="green">878</FONT>      /**<a name="line.878"></a>
<FONT color="green">879</FONT>       * Get the match score of the given node.<a name="line.879"></a>
<FONT color="green">880</FONT>       *<a name="line.880"></a>
<FONT color="green">881</FONT>       * @param xctxt The XPath runtime context.<a name="line.881"></a>
<FONT color="green">882</FONT>       * @param context The node to be tested.<a name="line.882"></a>
<FONT color="green">883</FONT>       *<a name="line.883"></a>
<FONT color="green">884</FONT>       * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},<a name="line.884"></a>
<FONT color="green">885</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},<a name="line.885"></a>
<FONT color="green">886</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},<a name="line.886"></a>
<FONT color="green">887</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or<a name="line.887"></a>
<FONT color="green">888</FONT>       *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.<a name="line.888"></a>
<FONT color="green">889</FONT>       *<a name="line.889"></a>
<FONT color="green">890</FONT>       * @throws javax.xml.transform.TransformerException<a name="line.890"></a>
<FONT color="green">891</FONT>       */<a name="line.891"></a>
<FONT color="green">892</FONT>      public double getMatchScore(XPathContext xctxt, int context)<a name="line.892"></a>
<FONT color="green">893</FONT>              throws javax.xml.transform.TransformerException<a name="line.893"></a>
<FONT color="green">894</FONT>      {<a name="line.894"></a>
<FONT color="green">895</FONT>    <a name="line.895"></a>
<FONT color="green">896</FONT>        xctxt.pushCurrentNode(context);<a name="line.896"></a>
<FONT color="green">897</FONT>        xctxt.pushCurrentExpressionNode(context);<a name="line.897"></a>
<FONT color="green">898</FONT>    <a name="line.898"></a>
<FONT color="green">899</FONT>        try<a name="line.899"></a>
<FONT color="green">900</FONT>        {<a name="line.900"></a>
<FONT color="green">901</FONT>          XObject score = execute(xctxt);<a name="line.901"></a>
<FONT color="green">902</FONT>    <a name="line.902"></a>
<FONT color="green">903</FONT>          return score.num();<a name="line.903"></a>
<FONT color="green">904</FONT>        }<a name="line.904"></a>
<FONT color="green">905</FONT>        finally<a name="line.905"></a>
<FONT color="green">906</FONT>        {<a name="line.906"></a>
<FONT color="green">907</FONT>          xctxt.popCurrentNode();<a name="line.907"></a>
<FONT color="green">908</FONT>          xctxt.popCurrentExpressionNode();<a name="line.908"></a>
<FONT color="green">909</FONT>        }<a name="line.909"></a>
<FONT color="green">910</FONT>    <a name="line.910"></a>
<FONT color="green">911</FONT>        // return XPath.MATCH_SCORE_NONE;<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>      /**<a name="line.914"></a>
<FONT color="green">915</FONT>       * Set the axis that this step should follow. <a name="line.915"></a>
<FONT color="green">916</FONT>       *<a name="line.916"></a>
<FONT color="green">917</FONT>       *<a name="line.917"></a>
<FONT color="green">918</FONT>       * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.<a name="line.918"></a>
<FONT color="green">919</FONT>       */<a name="line.919"></a>
<FONT color="green">920</FONT>      public void setAxis(int axis)<a name="line.920"></a>
<FONT color="green">921</FONT>      {<a name="line.921"></a>
<FONT color="green">922</FONT>        m_axis = axis;<a name="line.922"></a>
<FONT color="green">923</FONT>      }<a name="line.923"></a>
<FONT color="green">924</FONT>    <a name="line.924"></a>
<FONT color="green">925</FONT>      /**<a name="line.925"></a>
<FONT color="green">926</FONT>       * Get the axis that this step follows. <a name="line.926"></a>
<FONT color="green">927</FONT>       *<a name="line.927"></a>
<FONT color="green">928</FONT>       *<a name="line.928"></a>
<FONT color="green">929</FONT>       * @return The Axis for this test, one of of Axes.ANCESTORORSELF, etc.<a name="line.929"></a>
<FONT color="green">930</FONT>       */<a name="line.930"></a>
<FONT color="green">931</FONT>      public int getAxis()<a name="line.931"></a>
<FONT color="green">932</FONT>      {<a name="line.932"></a>
<FONT color="green">933</FONT>        return m_axis;<a name="line.933"></a>
<FONT color="green">934</FONT>      }<a name="line.934"></a>
<FONT color="green">935</FONT>      <a name="line.935"></a>
<FONT color="green">936</FONT>      class PredOwner implements ExpressionOwner<a name="line.936"></a>
<FONT color="green">937</FONT>      {<a name="line.937"></a>
<FONT color="green">938</FONT>            int m_index;<a name="line.938"></a>
<FONT color="green">939</FONT>            <a name="line.939"></a>
<FONT color="green">940</FONT>            PredOwner(int index)<a name="line.940"></a>
<FONT color="green">941</FONT>            {<a name="line.941"></a>
<FONT color="green">942</FONT>                    m_index = index;<a name="line.942"></a>
<FONT color="green">943</FONT>            }<a name="line.943"></a>
<FONT color="green">944</FONT>            <a name="line.944"></a>
<FONT color="green">945</FONT>        /**<a name="line.945"></a>
<FONT color="green">946</FONT>         * @see ExpressionOwner#getExpression()<a name="line.946"></a>
<FONT color="green">947</FONT>         */<a name="line.947"></a>
<FONT color="green">948</FONT>        public Expression getExpression()<a name="line.948"></a>
<FONT color="green">949</FONT>        {<a name="line.949"></a>
<FONT color="green">950</FONT>          return m_predicates[m_index];<a name="line.950"></a>
<FONT color="green">951</FONT>        }<a name="line.951"></a>
<FONT color="green">952</FONT>    <a name="line.952"></a>
<FONT color="green">953</FONT>    <a name="line.953"></a>
<FONT color="green">954</FONT>        /**<a name="line.954"></a>
<FONT color="green">955</FONT>         * @see ExpressionOwner#setExpression(Expression)<a name="line.955"></a>
<FONT color="green">956</FONT>         */<a name="line.956"></a>
<FONT color="green">957</FONT>        public void setExpression(Expression exp)<a name="line.957"></a>
<FONT color="green">958</FONT>        {<a name="line.958"></a>
<FONT color="green">959</FONT>            exp.exprSetParent(StepPattern.this);<a name="line.959"></a>
<FONT color="green">960</FONT>            m_predicates[m_index] = exp;<a name="line.960"></a>
<FONT color="green">961</FONT>        }<a name="line.961"></a>
<FONT color="green">962</FONT>      }<a name="line.962"></a>
<FONT color="green">963</FONT>      <a name="line.963"></a>
<FONT color="green">964</FONT>      /**<a name="line.964"></a>
<FONT color="green">965</FONT>       * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)<a name="line.965"></a>
<FONT color="green">966</FONT>       */<a name="line.966"></a>
<FONT color="green">967</FONT>      public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)<a name="line.967"></a>
<FONT color="green">968</FONT>      {<a name="line.968"></a>
<FONT color="green">969</FONT>                    if(visitor.visitMatchPattern(owner, this))<a name="line.969"></a>
<FONT color="green">970</FONT>                    {<a name="line.970"></a>
<FONT color="green">971</FONT>                            callSubtreeVisitors(visitor);<a name="line.971"></a>
<FONT color="green">972</FONT>                    }<a name="line.972"></a>
<FONT color="green">973</FONT>      }<a name="line.973"></a>
<FONT color="green">974</FONT>    <a name="line.974"></a>
<FONT color="green">975</FONT>      /**<a name="line.975"></a>
<FONT color="green">976</FONT>       * Call the visitors on the subtree.  Factored out from callVisitors <a name="line.976"></a>
<FONT color="green">977</FONT>       * so it may be called by derived classes.<a name="line.977"></a>
<FONT color="green">978</FONT>       */<a name="line.978"></a>
<FONT color="green">979</FONT>      protected void callSubtreeVisitors(XPathVisitor visitor)<a name="line.979"></a>
<FONT color="green">980</FONT>      {<a name="line.980"></a>
<FONT color="green">981</FONT>        if (null != m_predicates)<a name="line.981"></a>
<FONT color="green">982</FONT>        {<a name="line.982"></a>
<FONT color="green">983</FONT>          int n = m_predicates.length;<a name="line.983"></a>
<FONT color="green">984</FONT>          for (int i = 0; i &lt; n; i++)<a name="line.984"></a>
<FONT color="green">985</FONT>          {<a name="line.985"></a>
<FONT color="green">986</FONT>            ExpressionOwner predOwner = new PredOwner(i);<a name="line.986"></a>
<FONT color="green">987</FONT>            if (visitor.visitPredicate(predOwner, m_predicates[i]))<a name="line.987"></a>
<FONT color="green">988</FONT>            {<a name="line.988"></a>
<FONT color="green">989</FONT>              m_predicates[i].callVisitors(predOwner, visitor);<a name="line.989"></a>
<FONT color="green">990</FONT>            }<a name="line.990"></a>
<FONT color="green">991</FONT>          }<a name="line.991"></a>
<FONT color="green">992</FONT>        }<a name="line.992"></a>
<FONT color="green">993</FONT>        if (null != m_relativePathPattern)<a name="line.993"></a>
<FONT color="green">994</FONT>        {<a name="line.994"></a>
<FONT color="green">995</FONT>          m_relativePathPattern.callVisitors(this, visitor);<a name="line.995"></a>
<FONT color="green">996</FONT>        }<a name="line.996"></a>
<FONT color="green">997</FONT>      }<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>       * @see ExpressionOwner#getExpression()<a name="line.1001"></a>
<FONT color="green">1002</FONT>       */<a name="line.1002"></a>
<FONT color="green">1003</FONT>      public Expression getExpression()<a name="line.1003"></a>
<FONT color="green">1004</FONT>      {<a name="line.1004"></a>
<FONT color="green">1005</FONT>        return m_relativePathPattern;<a name="line.1005"></a>
<FONT color="green">1006</FONT>      }<a name="line.1006"></a>
<FONT color="green">1007</FONT>    <a name="line.1007"></a>
<FONT color="green">1008</FONT>      /**<a name="line.1008"></a>
<FONT color="green">1009</FONT>       * @see ExpressionOwner#setExpression(Expression)<a name="line.1009"></a>
<FONT color="green">1010</FONT>       */<a name="line.1010"></a>
<FONT color="green">1011</FONT>      public void setExpression(Expression exp)<a name="line.1011"></a>
<FONT color="green">1012</FONT>      {<a name="line.1012"></a>
<FONT color="green">1013</FONT>        exp.exprSetParent(this);<a name="line.1013"></a>
<FONT color="green">1014</FONT>            m_relativePathPattern = (StepPattern)exp;<a name="line.1014"></a>
<FONT color="green">1015</FONT>      }<a name="line.1015"></a>
<FONT color="green">1016</FONT>      <a name="line.1016"></a>
<FONT color="green">1017</FONT>      /**<a name="line.1017"></a>
<FONT color="green">1018</FONT>       * @see Expression#deepEquals(Expression)<a name="line.1018"></a>
<FONT color="green">1019</FONT>       */<a name="line.1019"></a>
<FONT color="green">1020</FONT>      public boolean deepEquals(Expression expr)<a name="line.1020"></a>
<FONT color="green">1021</FONT>      {<a name="line.1021"></a>
<FONT color="green">1022</FONT>            if(!super.deepEquals(expr))<a name="line.1022"></a>
<FONT color="green">1023</FONT>                    return false;<a name="line.1023"></a>
<FONT color="green">1024</FONT>                    <a name="line.1024"></a>
<FONT color="green">1025</FONT>            StepPattern sp = (StepPattern)expr;<a name="line.1025"></a>
<FONT color="green">1026</FONT>            <a name="line.1026"></a>
<FONT color="green">1027</FONT>        if (null != m_predicates)<a name="line.1027"></a>
<FONT color="green">1028</FONT>        {<a name="line.1028"></a>
<FONT color="green">1029</FONT>            int n = m_predicates.length;<a name="line.1029"></a>
<FONT color="green">1030</FONT>            if ((null == sp.m_predicates) || (sp.m_predicates.length != n))<a name="line.1030"></a>
<FONT color="green">1031</FONT>                  return false;<a name="line.1031"></a>
<FONT color="green">1032</FONT>            for (int i = 0; i &lt; n; i++)<a name="line.1032"></a>
<FONT color="green">1033</FONT>            {<a name="line.1033"></a>
<FONT color="green">1034</FONT>              if (!m_predicates[i].deepEquals(sp.m_predicates[i]))<a name="line.1034"></a>
<FONT color="green">1035</FONT>                    return false; <a name="line.1035"></a>
<FONT color="green">1036</FONT>            }<a name="line.1036"></a>
<FONT color="green">1037</FONT>        }<a name="line.1037"></a>
<FONT color="green">1038</FONT>        else if (null != sp.m_predicates)<a name="line.1038"></a>
<FONT color="green">1039</FONT>            return false;<a name="line.1039"></a>
<FONT color="green">1040</FONT>                    <a name="line.1040"></a>
<FONT color="green">1041</FONT>            if(null != m_relativePathPattern)<a name="line.1041"></a>
<FONT color="green">1042</FONT>            {<a name="line.1042"></a>
<FONT color="green">1043</FONT>                    if(!m_relativePathPattern.deepEquals(sp.m_relativePathPattern))<a name="line.1043"></a>
<FONT color="green">1044</FONT>                            return false;<a name="line.1044"></a>
<FONT color="green">1045</FONT>            }<a name="line.1045"></a>
<FONT color="green">1046</FONT>            else if(sp.m_relativePathPattern != null)<a name="line.1046"></a>
<FONT color="green">1047</FONT>                    return false;<a name="line.1047"></a>
<FONT color="green">1048</FONT>                    <a name="line.1048"></a>
<FONT color="green">1049</FONT>            return true;<a name="line.1049"></a>
<FONT color="green">1050</FONT>      }<a name="line.1050"></a>
<FONT color="green">1051</FONT>    <a name="line.1051"></a>
<FONT color="green">1052</FONT>    <a name="line.1052"></a>
<FONT color="green">1053</FONT>    }<a name="line.1053"></a>




























































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