<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: XString.java 570108 2007-08-27 13:30:57Z zongaro $<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    package org.apache.xpath.objects;<a name="line.21"></a>
<FONT color="green">022</FONT>    <a name="line.22"></a>
<FONT color="green">023</FONT>    import java.util.Locale;<a name="line.23"></a>
<FONT color="green">024</FONT>    <a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.xml.dtm.DTM;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.xml.utils.XMLCharacterRecognizer;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.xml.utils.XMLString;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.xml.utils.XMLStringFactory;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.xpath.ExpressionOwner;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.xpath.XPathContext;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.xpath.XPathVisitor;<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 represents an XPath string object, and is capable of<a name="line.34"></a>
<FONT color="green">035</FONT>     * converting the string to other types, such as a number.<a name="line.35"></a>
<FONT color="green">036</FONT>     * @xsl.usage general<a name="line.36"></a>
<FONT color="green">037</FONT>     */<a name="line.37"></a>
<FONT color="green">038</FONT>    public class XString extends XObject implements XMLString<a name="line.38"></a>
<FONT color="green">039</FONT>    {<a name="line.39"></a>
<FONT color="green">040</FONT>        static final long serialVersionUID = 2020470518395094525L;<a name="line.40"></a>
<FONT color="green">041</FONT>    <a name="line.41"></a>
<FONT color="green">042</FONT>      /** Empty string XString object */<a name="line.42"></a>
<FONT color="green">043</FONT>      public static final XString EMPTYSTRING = new XString("");<a name="line.43"></a>
<FONT color="green">044</FONT>    <a name="line.44"></a>
<FONT color="green">045</FONT>      /**<a name="line.45"></a>
<FONT color="green">046</FONT>       * Construct a XString object.  This constructor exists for derived classes.<a name="line.46"></a>
<FONT color="green">047</FONT>       *<a name="line.47"></a>
<FONT color="green">048</FONT>       * @param val String object this will wrap.<a name="line.48"></a>
<FONT color="green">049</FONT>       */<a name="line.49"></a>
<FONT color="green">050</FONT>      protected XString(Object val)<a name="line.50"></a>
<FONT color="green">051</FONT>      {<a name="line.51"></a>
<FONT color="green">052</FONT>        super(val);<a name="line.52"></a>
<FONT color="green">053</FONT>      }<a name="line.53"></a>
<FONT color="green">054</FONT>    <a name="line.54"></a>
<FONT color="green">055</FONT>      /**<a name="line.55"></a>
<FONT color="green">056</FONT>       * Construct a XNodeSet object.<a name="line.56"></a>
<FONT color="green">057</FONT>       *<a name="line.57"></a>
<FONT color="green">058</FONT>       * @param val String object this will wrap.<a name="line.58"></a>
<FONT color="green">059</FONT>       */<a name="line.59"></a>
<FONT color="green">060</FONT>      public XString(String val)<a name="line.60"></a>
<FONT color="green">061</FONT>      {<a name="line.61"></a>
<FONT color="green">062</FONT>        super(val);<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>       * Tell that this is a CLASS_STRING.<a name="line.66"></a>
<FONT color="green">067</FONT>       *<a name="line.67"></a>
<FONT color="green">068</FONT>       * @return type CLASS_STRING<a name="line.68"></a>
<FONT color="green">069</FONT>       */<a name="line.69"></a>
<FONT color="green">070</FONT>      public int getType()<a name="line.70"></a>
<FONT color="green">071</FONT>      {<a name="line.71"></a>
<FONT color="green">072</FONT>        return CLASS_STRING;<a name="line.72"></a>
<FONT color="green">073</FONT>      }<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>       * Given a request type, return the equivalent string.<a name="line.76"></a>
<FONT color="green">077</FONT>       * For diagnostic purposes.<a name="line.77"></a>
<FONT color="green">078</FONT>       *<a name="line.78"></a>
<FONT color="green">079</FONT>       * @return type string "#STRING"<a name="line.79"></a>
<FONT color="green">080</FONT>       */<a name="line.80"></a>
<FONT color="green">081</FONT>      public String getTypeString()<a name="line.81"></a>
<FONT color="green">082</FONT>      {<a name="line.82"></a>
<FONT color="green">083</FONT>        return "#STRING";<a name="line.83"></a>
<FONT color="green">084</FONT>      }<a name="line.84"></a>
<FONT color="green">085</FONT>    <a name="line.85"></a>
<FONT color="green">086</FONT>      /**<a name="line.86"></a>
<FONT color="green">087</FONT>       * Tell if this object contains a java String object.<a name="line.87"></a>
<FONT color="green">088</FONT>       *<a name="line.88"></a>
<FONT color="green">089</FONT>       * @return true if this XMLString can return a string without creating one.<a name="line.89"></a>
<FONT color="green">090</FONT>       */<a name="line.90"></a>
<FONT color="green">091</FONT>      public boolean hasString()<a name="line.91"></a>
<FONT color="green">092</FONT>      {<a name="line.92"></a>
<FONT color="green">093</FONT>        return true;<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>      /**<a name="line.96"></a>
<FONT color="green">097</FONT>       * Cast result object to a number.<a name="line.97"></a>
<FONT color="green">098</FONT>       *<a name="line.98"></a>
<FONT color="green">099</FONT>       * @return 0.0 if this string is null, numeric value of this string<a name="line.99"></a>
<FONT color="green">100</FONT>       * or NaN<a name="line.100"></a>
<FONT color="green">101</FONT>       */<a name="line.101"></a>
<FONT color="green">102</FONT>      public double num()<a name="line.102"></a>
<FONT color="green">103</FONT>      {<a name="line.103"></a>
<FONT color="green">104</FONT>        return toDouble();<a name="line.104"></a>
<FONT color="green">105</FONT>      }<a name="line.105"></a>
<FONT color="green">106</FONT>    <a name="line.106"></a>
<FONT color="green">107</FONT>      /**<a name="line.107"></a>
<FONT color="green">108</FONT>       * Convert a string to a double -- Allowed input is in fixed<a name="line.108"></a>
<FONT color="green">109</FONT>       * notation ddd.fff.<a name="line.109"></a>
<FONT color="green">110</FONT>       *<a name="line.110"></a>
<FONT color="green">111</FONT>       * @return A double value representation of the string, or return Double.NaN<a name="line.111"></a>
<FONT color="green">112</FONT>       * if the string can not be converted.<a name="line.112"></a>
<FONT color="green">113</FONT>       */<a name="line.113"></a>
<FONT color="green">114</FONT>      public double toDouble()<a name="line.114"></a>
<FONT color="green">115</FONT>      {<a name="line.115"></a>
<FONT color="green">116</FONT>        /* XMLCharacterRecognizer.isWhiteSpace(char c) methods treats the following <a name="line.116"></a>
<FONT color="green">117</FONT>         * characters as white space characters.<a name="line.117"></a>
<FONT color="green">118</FONT>         * ht - horizontal tab, nl - newline , cr - carriage return and sp - space<a name="line.118"></a>
<FONT color="green">119</FONT>         * trim() methods by default also takes care of these white space characters<a name="line.119"></a>
<FONT color="green">120</FONT>         * So trim() method is used to remove leading and trailing white spaces.<a name="line.120"></a>
<FONT color="green">121</FONT>         */<a name="line.121"></a>
<FONT color="green">122</FONT>            XMLString s = trim();<a name="line.122"></a>
<FONT color="green">123</FONT>            double result = Double.NaN;<a name="line.123"></a>
<FONT color="green">124</FONT>            for (int i = 0; i &lt; s.length(); i++)<a name="line.124"></a>
<FONT color="green">125</FONT>            {<a name="line.125"></a>
<FONT color="green">126</FONT>                    char c = s.charAt(i);<a name="line.126"></a>
<FONT color="green">127</FONT>        if (c != '-' &amp;&amp; c != '.' &amp;&amp; ( c &lt; 0X30 || c &gt; 0x39)) {<a name="line.127"></a>
<FONT color="green">128</FONT>                // The character is not a '-' or a '.' or a digit<a name="line.128"></a>
<FONT color="green">129</FONT>                // then return NaN because something is wrong.<a name="line.129"></a>
<FONT color="green">130</FONT>                            return result;<a name="line.130"></a>
<FONT color="green">131</FONT>            }<a name="line.131"></a>
<FONT color="green">132</FONT>            }<a name="line.132"></a>
<FONT color="green">133</FONT>            try<a name="line.133"></a>
<FONT color="green">134</FONT>            {<a name="line.134"></a>
<FONT color="green">135</FONT>                    result = Double.parseDouble(s.toString());<a name="line.135"></a>
<FONT color="green">136</FONT>            } catch (NumberFormatException e){}<a name="line.136"></a>
<FONT color="green">137</FONT>    <a name="line.137"></a>
<FONT color="green">138</FONT>            return result;<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>      /**<a name="line.141"></a>
<FONT color="green">142</FONT>       * Cast result object to a boolean.<a name="line.142"></a>
<FONT color="green">143</FONT>       *<a name="line.143"></a>
<FONT color="green">144</FONT>       * @return True if the length of this string object is greater<a name="line.144"></a>
<FONT color="green">145</FONT>       * than 0.<a name="line.145"></a>
<FONT color="green">146</FONT>       */<a name="line.146"></a>
<FONT color="green">147</FONT>      public boolean bool()<a name="line.147"></a>
<FONT color="green">148</FONT>      {<a name="line.148"></a>
<FONT color="green">149</FONT>        return str().length() &gt; 0;<a name="line.149"></a>
<FONT color="green">150</FONT>      }<a name="line.150"></a>
<FONT color="green">151</FONT>    <a name="line.151"></a>
<FONT color="green">152</FONT>      /**<a name="line.152"></a>
<FONT color="green">153</FONT>       * Cast result object to a string.<a name="line.153"></a>
<FONT color="green">154</FONT>       *<a name="line.154"></a>
<FONT color="green">155</FONT>       * @return The string this wraps or the empty string if null<a name="line.155"></a>
<FONT color="green">156</FONT>       */<a name="line.156"></a>
<FONT color="green">157</FONT>      public XMLString xstr()<a name="line.157"></a>
<FONT color="green">158</FONT>      {<a name="line.158"></a>
<FONT color="green">159</FONT>        return this;<a name="line.159"></a>
<FONT color="green">160</FONT>      }<a name="line.160"></a>
<FONT color="green">161</FONT>    <a name="line.161"></a>
<FONT color="green">162</FONT>      /**<a name="line.162"></a>
<FONT color="green">163</FONT>       * Cast result object to a string.<a name="line.163"></a>
<FONT color="green">164</FONT>       *<a name="line.164"></a>
<FONT color="green">165</FONT>       * @return The string this wraps or the empty string if null<a name="line.165"></a>
<FONT color="green">166</FONT>       */<a name="line.166"></a>
<FONT color="green">167</FONT>      public String str()<a name="line.167"></a>
<FONT color="green">168</FONT>      {<a name="line.168"></a>
<FONT color="green">169</FONT>        return (null != m_obj) ? ((String) m_obj) : "";<a name="line.169"></a>
<FONT color="green">170</FONT>      }<a name="line.170"></a>
<FONT color="green">171</FONT>    <a name="line.171"></a>
<FONT color="green">172</FONT>      /**<a name="line.172"></a>
<FONT color="green">173</FONT>       * Cast result object to a result tree fragment.<a name="line.173"></a>
<FONT color="green">174</FONT>       *<a name="line.174"></a>
<FONT color="green">175</FONT>       * @param support Xpath context to use for the conversion<a name="line.175"></a>
<FONT color="green">176</FONT>       *<a name="line.176"></a>
<FONT color="green">177</FONT>       * @return A document fragment with this string as a child node<a name="line.177"></a>
<FONT color="green">178</FONT>       */<a name="line.178"></a>
<FONT color="green">179</FONT>      public int rtf(XPathContext support)<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>        DTM frag = support.createDocumentFragment();<a name="line.182"></a>
<FONT color="green">183</FONT>    <a name="line.183"></a>
<FONT color="green">184</FONT>        frag.appendTextChild(str());<a name="line.184"></a>
<FONT color="green">185</FONT>    <a name="line.185"></a>
<FONT color="green">186</FONT>        return frag.getDocument();<a name="line.186"></a>
<FONT color="green">187</FONT>      }<a name="line.187"></a>
<FONT color="green">188</FONT>    <a name="line.188"></a>
<FONT color="green">189</FONT>      /**<a name="line.189"></a>
<FONT color="green">190</FONT>       * Directly call the<a name="line.190"></a>
<FONT color="green">191</FONT>       * characters method on the passed ContentHandler for the<a name="line.191"></a>
<FONT color="green">192</FONT>       * string-value. Multiple calls to the<a name="line.192"></a>
<FONT color="green">193</FONT>       * ContentHandler's characters methods may well occur for a single call to<a name="line.193"></a>
<FONT color="green">194</FONT>       * this method.<a name="line.194"></a>
<FONT color="green">195</FONT>       *<a name="line.195"></a>
<FONT color="green">196</FONT>       * @param ch A non-null reference to a ContentHandler.<a name="line.196"></a>
<FONT color="green">197</FONT>       *<a name="line.197"></a>
<FONT color="green">198</FONT>       * @throws org.xml.sax.SAXException<a name="line.198"></a>
<FONT color="green">199</FONT>       */<a name="line.199"></a>
<FONT color="green">200</FONT>      public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)<a name="line.200"></a>
<FONT color="green">201</FONT>              throws org.xml.sax.SAXException<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>        String str = str();<a name="line.204"></a>
<FONT color="green">205</FONT>    <a name="line.205"></a>
<FONT color="green">206</FONT>        ch.characters(str.toCharArray(), 0, str.length());<a name="line.206"></a>
<FONT color="green">207</FONT>      }<a name="line.207"></a>
<FONT color="green">208</FONT>    <a name="line.208"></a>
<FONT color="green">209</FONT>      /**<a name="line.209"></a>
<FONT color="green">210</FONT>       * Directly call the<a name="line.210"></a>
<FONT color="green">211</FONT>       * comment method on the passed LexicalHandler for the<a name="line.211"></a>
<FONT color="green">212</FONT>       * string-value.<a name="line.212"></a>
<FONT color="green">213</FONT>       *<a name="line.213"></a>
<FONT color="green">214</FONT>       * @param lh A non-null reference to a LexicalHandler.<a name="line.214"></a>
<FONT color="green">215</FONT>       *<a name="line.215"></a>
<FONT color="green">216</FONT>       * @throws org.xml.sax.SAXException<a name="line.216"></a>
<FONT color="green">217</FONT>       */<a name="line.217"></a>
<FONT color="green">218</FONT>      public void dispatchAsComment(org.xml.sax.ext.LexicalHandler lh)<a name="line.218"></a>
<FONT color="green">219</FONT>              throws org.xml.sax.SAXException<a name="line.219"></a>
<FONT color="green">220</FONT>      {<a name="line.220"></a>
<FONT color="green">221</FONT>    <a name="line.221"></a>
<FONT color="green">222</FONT>        String str = str();<a name="line.222"></a>
<FONT color="green">223</FONT>    <a name="line.223"></a>
<FONT color="green">224</FONT>        lh.comment(str.toCharArray(), 0, str.length());<a name="line.224"></a>
<FONT color="green">225</FONT>      }<a name="line.225"></a>
<FONT color="green">226</FONT>    <a name="line.226"></a>
<FONT color="green">227</FONT>      /**<a name="line.227"></a>
<FONT color="green">228</FONT>       * Returns the length of this string.<a name="line.228"></a>
<FONT color="green">229</FONT>       *<a name="line.229"></a>
<FONT color="green">230</FONT>       * @return  the length of the sequence of characters represented by this<a name="line.230"></a>
<FONT color="green">231</FONT>       *          object.<a name="line.231"></a>
<FONT color="green">232</FONT>       */<a name="line.232"></a>
<FONT color="green">233</FONT>      public int length()<a name="line.233"></a>
<FONT color="green">234</FONT>      {<a name="line.234"></a>
<FONT color="green">235</FONT>        return str().length();<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>      /**<a name="line.238"></a>
<FONT color="green">239</FONT>       * Returns the character at the specified index. An index ranges<a name="line.239"></a>
<FONT color="green">240</FONT>       * from &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;length() - 1&lt;/code&gt;. The first character<a name="line.240"></a>
<FONT color="green">241</FONT>       * of the sequence is at index &lt;code&gt;0&lt;/code&gt;, the next at index<a name="line.241"></a>
<FONT color="green">242</FONT>       * &lt;code&gt;1&lt;/code&gt;, and so on, as for array indexing.<a name="line.242"></a>
<FONT color="green">243</FONT>       *<a name="line.243"></a>
<FONT color="green">244</FONT>       * @param      index   the index of the character.<a name="line.244"></a>
<FONT color="green">245</FONT>       * @return     the character at the specified index of this string.<a name="line.245"></a>
<FONT color="green">246</FONT>       *             The first character is at index &lt;code&gt;0&lt;/code&gt;.<a name="line.246"></a>
<FONT color="green">247</FONT>       * @exception  IndexOutOfBoundsException  if the &lt;code&gt;index&lt;/code&gt;<a name="line.247"></a>
<FONT color="green">248</FONT>       *             argument is negative or not less than the length of this<a name="line.248"></a>
<FONT color="green">249</FONT>       *             string.<a name="line.249"></a>
<FONT color="green">250</FONT>       */<a name="line.250"></a>
<FONT color="green">251</FONT>      public char charAt(int index)<a name="line.251"></a>
<FONT color="green">252</FONT>      {<a name="line.252"></a>
<FONT color="green">253</FONT>        return str().charAt(index);<a name="line.253"></a>
<FONT color="green">254</FONT>      }<a name="line.254"></a>
<FONT color="green">255</FONT>    <a name="line.255"></a>
<FONT color="green">256</FONT>      /**<a name="line.256"></a>
<FONT color="green">257</FONT>       * Copies characters from this string into the destination character<a name="line.257"></a>
<FONT color="green">258</FONT>       * array.<a name="line.258"></a>
<FONT color="green">259</FONT>       *<a name="line.259"></a>
<FONT color="green">260</FONT>       * @param      srcBegin   index of the first character in the string<a name="line.260"></a>
<FONT color="green">261</FONT>       *                        to copy.<a name="line.261"></a>
<FONT color="green">262</FONT>       * @param      srcEnd     index after the last character in the string<a name="line.262"></a>
<FONT color="green">263</FONT>       *                        to copy.<a name="line.263"></a>
<FONT color="green">264</FONT>       * @param      dst        the destination array.<a name="line.264"></a>
<FONT color="green">265</FONT>       * @param      dstBegin   the start offset in the destination array.<a name="line.265"></a>
<FONT color="green">266</FONT>       * @exception IndexOutOfBoundsException If any of the following<a name="line.266"></a>
<FONT color="green">267</FONT>       *            is true:<a name="line.267"></a>
<FONT color="green">268</FONT>       *            &lt;ul&gt;&lt;li&gt;&lt;code&gt;srcBegin&lt;/code&gt; is negative.<a name="line.268"></a>
<FONT color="green">269</FONT>       *            &lt;li&gt;&lt;code&gt;srcBegin&lt;/code&gt; is greater than &lt;code&gt;srcEnd&lt;/code&gt;<a name="line.269"></a>
<FONT color="green">270</FONT>       *            &lt;li&gt;&lt;code&gt;srcEnd&lt;/code&gt; is greater than the length of this<a name="line.270"></a>
<FONT color="green">271</FONT>       *                string<a name="line.271"></a>
<FONT color="green">272</FONT>       *            &lt;li&gt;&lt;code&gt;dstBegin&lt;/code&gt; is negative<a name="line.272"></a>
<FONT color="green">273</FONT>       *            &lt;li&gt;&lt;code&gt;dstBegin+(srcEnd-srcBegin)&lt;/code&gt; is larger than<a name="line.273"></a>
<FONT color="green">274</FONT>       *                &lt;code&gt;dst.length&lt;/code&gt;&lt;/ul&gt;<a name="line.274"></a>
<FONT color="green">275</FONT>       * @exception NullPointerException if &lt;code&gt;dst&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt;<a name="line.275"></a>
<FONT color="green">276</FONT>       */<a name="line.276"></a>
<FONT color="green">277</FONT>      public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)<a name="line.277"></a>
<FONT color="green">278</FONT>      {<a name="line.278"></a>
<FONT color="green">279</FONT>        str().getChars(srcBegin, srcEnd, dst, dstBegin);<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>      /**<a name="line.282"></a>
<FONT color="green">283</FONT>       * Tell if two objects are functionally equal.<a name="line.283"></a>
<FONT color="green">284</FONT>       *<a name="line.284"></a>
<FONT color="green">285</FONT>       * @param obj2 Object to compare this to<a name="line.285"></a>
<FONT color="green">286</FONT>       *<a name="line.286"></a>
<FONT color="green">287</FONT>       * @return true if the two objects are equal<a name="line.287"></a>
<FONT color="green">288</FONT>       *<a name="line.288"></a>
<FONT color="green">289</FONT>       * @throws javax.xml.transform.TransformerException<a name="line.289"></a>
<FONT color="green">290</FONT>       */<a name="line.290"></a>
<FONT color="green">291</FONT>      public boolean equals(XObject obj2)<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>        // In order to handle the 'all' semantics of <a name="line.294"></a>
<FONT color="green">295</FONT>        // nodeset comparisons, we always call the <a name="line.295"></a>
<FONT color="green">296</FONT>        // nodeset function.<a name="line.296"></a>
<FONT color="green">297</FONT>        int t = obj2.getType();<a name="line.297"></a>
<FONT color="green">298</FONT>        try<a name="line.298"></a>
<FONT color="green">299</FONT>        {<a name="line.299"></a>
<FONT color="green">300</FONT>                if (XObject.CLASS_NODESET == t)<a name="line.300"></a>
<FONT color="green">301</FONT>                  return obj2.equals(this);<a name="line.301"></a>
<FONT color="green">302</FONT>                // If at least one object to be compared is a boolean, then each object <a name="line.302"></a>
<FONT color="green">303</FONT>                // to be compared is converted to a boolean as if by applying the <a name="line.303"></a>
<FONT color="green">304</FONT>                // boolean function. <a name="line.304"></a>
<FONT color="green">305</FONT>                else if(XObject.CLASS_BOOLEAN == t)<a name="line.305"></a>
<FONT color="green">306</FONT>                    return obj2.bool() == bool();<a name="line.306"></a>
<FONT color="green">307</FONT>                // Otherwise, if at least one object to be compared is a number, then each object <a name="line.307"></a>
<FONT color="green">308</FONT>                // to be compared is converted to a number as if by applying the number function. <a name="line.308"></a>
<FONT color="green">309</FONT>                else if(XObject.CLASS_NUMBER == t)<a name="line.309"></a>
<FONT color="green">310</FONT>                    return obj2.num() == num();<a name="line.310"></a>
<FONT color="green">311</FONT>        }<a name="line.311"></a>
<FONT color="green">312</FONT>        catch(javax.xml.transform.TransformerException te)<a name="line.312"></a>
<FONT color="green">313</FONT>        {<a name="line.313"></a>
<FONT color="green">314</FONT>            throw new org.apache.xml.utils.WrappedRuntimeException(te);<a name="line.314"></a>
<FONT color="green">315</FONT>        }<a name="line.315"></a>
<FONT color="green">316</FONT>    <a name="line.316"></a>
<FONT color="green">317</FONT>        // Otherwise, both objects to be compared are converted to strings as <a name="line.317"></a>
<FONT color="green">318</FONT>        // if by applying the string function. <a name="line.318"></a>
<FONT color="green">319</FONT>        return xstr().equals(obj2.xstr());<a name="line.319"></a>
<FONT color="green">320</FONT>      }<a name="line.320"></a>
<FONT color="green">321</FONT>    <a name="line.321"></a>
<FONT color="green">322</FONT>      /**<a name="line.322"></a>
<FONT color="green">323</FONT>       * Compares this string to the specified &lt;code&gt;String&lt;/code&gt;.<a name="line.323"></a>
<FONT color="green">324</FONT>       * The result is &lt;code&gt;true&lt;/code&gt; if and only if the argument is not<a name="line.324"></a>
<FONT color="green">325</FONT>       * &lt;code&gt;null&lt;/code&gt; and is a &lt;code&gt;String&lt;/code&gt; object that represents<a name="line.325"></a>
<FONT color="green">326</FONT>       * the same sequence of characters as this object.<a name="line.326"></a>
<FONT color="green">327</FONT>       *<a name="line.327"></a>
<FONT color="green">328</FONT>       * @param   obj2   the object to compare this &lt;code&gt;String&lt;/code&gt; against.<a name="line.328"></a>
<FONT color="green">329</FONT>       * @return  &lt;code&gt;true&lt;/code&gt; if the &lt;code&gt;String&lt;/code&gt;s are equal;<a name="line.329"></a>
<FONT color="green">330</FONT>       *          &lt;code&gt;false&lt;/code&gt; otherwise.<a name="line.330"></a>
<FONT color="green">331</FONT>       * @see     java.lang.String#compareTo(java.lang.String)<a name="line.331"></a>
<FONT color="green">332</FONT>       * @see     java.lang.String#equalsIgnoreCase(java.lang.String)<a name="line.332"></a>
<FONT color="green">333</FONT>       */<a name="line.333"></a>
<FONT color="green">334</FONT>      public boolean equals(String obj2) {<a name="line.334"></a>
<FONT color="green">335</FONT>        return str().equals(obj2);<a name="line.335"></a>
<FONT color="green">336</FONT>      }<a name="line.336"></a>
<FONT color="green">337</FONT>    <a name="line.337"></a>
<FONT color="green">338</FONT>      /**<a name="line.338"></a>
<FONT color="green">339</FONT>       * Compares this string to the specified object.<a name="line.339"></a>
<FONT color="green">340</FONT>       * The result is &lt;code&gt;true&lt;/code&gt; if and only if the argument is not<a name="line.340"></a>
<FONT color="green">341</FONT>       * &lt;code&gt;null&lt;/code&gt; and is a &lt;code&gt;String&lt;/code&gt; object that represents<a name="line.341"></a>
<FONT color="green">342</FONT>       * the same sequence of characters as this object.<a name="line.342"></a>
<FONT color="green">343</FONT>       *<a name="line.343"></a>
<FONT color="green">344</FONT>       * @param obj2   the object to compare this &lt;code&gt;String&lt;/code&gt;<a name="line.344"></a>
<FONT color="green">345</FONT>       *                     against.<a name="line.345"></a>
<FONT color="green">346</FONT>       * @return  &lt;code&gt;true&lt;/code&gt; if the &lt;code&gt;String &lt;/code&gt;are equal;<a name="line.346"></a>
<FONT color="green">347</FONT>       *          &lt;code&gt;false&lt;/code&gt; otherwise.<a name="line.347"></a>
<FONT color="green">348</FONT>       * @see     java.lang.String#compareTo(java.lang.String)<a name="line.348"></a>
<FONT color="green">349</FONT>       * @see     java.lang.String#equalsIgnoreCase(java.lang.String)<a name="line.349"></a>
<FONT color="green">350</FONT>       */<a name="line.350"></a>
<FONT color="green">351</FONT>      public boolean equals(XMLString obj2)<a name="line.351"></a>
<FONT color="green">352</FONT>      {<a name="line.352"></a>
<FONT color="green">353</FONT>        if (obj2 != null) {<a name="line.353"></a>
<FONT color="green">354</FONT>          if (!obj2.hasString()) {<a name="line.354"></a>
<FONT color="green">355</FONT>            return obj2.equals(str());<a name="line.355"></a>
<FONT color="green">356</FONT>          } else {<a name="line.356"></a>
<FONT color="green">357</FONT>            return str().equals(obj2.toString());<a name="line.357"></a>
<FONT color="green">358</FONT>          }<a name="line.358"></a>
<FONT color="green">359</FONT>        }<a name="line.359"></a>
<FONT color="green">360</FONT>        return false;<a name="line.360"></a>
<FONT color="green">361</FONT>      }<a name="line.361"></a>
<FONT color="green">362</FONT>    <a name="line.362"></a>
<FONT color="green">363</FONT>      /**<a name="line.363"></a>
<FONT color="green">364</FONT>       * Compares this string to the specified object.<a name="line.364"></a>
<FONT color="green">365</FONT>       * The result is &lt;code&gt;true&lt;/code&gt; if and only if the argument is not<a name="line.365"></a>
<FONT color="green">366</FONT>       * &lt;code&gt;null&lt;/code&gt; and is a &lt;code&gt;String&lt;/code&gt; object that represents<a name="line.366"></a>
<FONT color="green">367</FONT>       * the same sequence of characters as this object.<a name="line.367"></a>
<FONT color="green">368</FONT>       *<a name="line.368"></a>
<FONT color="green">369</FONT>       * @param   obj2       the object to compare this &lt;code&gt;String&lt;/code&gt;<a name="line.369"></a>
<FONT color="green">370</FONT>       *                     against.<a name="line.370"></a>
<FONT color="green">371</FONT>       * @return  &lt;code&gt;true&lt;/code&gt; if the &lt;code&gt;String &lt;/code&gt;are equal;<a name="line.371"></a>
<FONT color="green">372</FONT>       *          &lt;code&gt;false&lt;/code&gt; otherwise.<a name="line.372"></a>
<FONT color="green">373</FONT>       * @see     java.lang.String#compareTo(java.lang.String)<a name="line.373"></a>
<FONT color="green">374</FONT>       * @see     java.lang.String#equalsIgnoreCase(java.lang.String)<a name="line.374"></a>
<FONT color="green">375</FONT>       */<a name="line.375"></a>
<FONT color="green">376</FONT>      public boolean equals(Object obj2)<a name="line.376"></a>
<FONT color="green">377</FONT>      {<a name="line.377"></a>
<FONT color="green">378</FONT>    <a name="line.378"></a>
<FONT color="green">379</FONT>        if (null == obj2)<a name="line.379"></a>
<FONT color="green">380</FONT>          return false;<a name="line.380"></a>
<FONT color="green">381</FONT>    <a name="line.381"></a>
<FONT color="green">382</FONT>          // In order to handle the 'all' semantics of <a name="line.382"></a>
<FONT color="green">383</FONT>          // nodeset comparisons, we always call the <a name="line.383"></a>
<FONT color="green">384</FONT>          // nodeset function.<a name="line.384"></a>
<FONT color="green">385</FONT>        else if (obj2 instanceof XNodeSet)<a name="line.385"></a>
<FONT color="green">386</FONT>          return obj2.equals(this);<a name="line.386"></a>
<FONT color="green">387</FONT>        else if(obj2 instanceof XNumber)<a name="line.387"></a>
<FONT color="green">388</FONT>            return obj2.equals(this);<a name="line.388"></a>
<FONT color="green">389</FONT>        else<a name="line.389"></a>
<FONT color="green">390</FONT>          return str().equals(obj2.toString());<a name="line.390"></a>
<FONT color="green">391</FONT>      }<a name="line.391"></a>
<FONT color="green">392</FONT>    <a name="line.392"></a>
<FONT color="green">393</FONT>      /**<a name="line.393"></a>
<FONT color="green">394</FONT>       * Compares this &lt;code&gt;String&lt;/code&gt; to another &lt;code&gt;String&lt;/code&gt;,<a name="line.394"></a>
<FONT color="green">395</FONT>       * ignoring case considerations.  Two strings are considered equal<a name="line.395"></a>
<FONT color="green">396</FONT>       * ignoring case if they are of the same length, and corresponding<a name="line.396"></a>
<FONT color="green">397</FONT>       * characters in the two strings are equal ignoring case.<a name="line.397"></a>
<FONT color="green">398</FONT>       *<a name="line.398"></a>
<FONT color="green">399</FONT>       * @param   anotherString   the &lt;code&gt;String&lt;/code&gt; to compare this<a name="line.399"></a>
<FONT color="green">400</FONT>       *                          &lt;code&gt;String&lt;/code&gt; against.<a name="line.400"></a>
<FONT color="green">401</FONT>       * @return  &lt;code&gt;true&lt;/code&gt; if the argument is not &lt;code&gt;null&lt;/code&gt;<a name="line.401"></a>
<FONT color="green">402</FONT>       *          and the &lt;code&gt;String&lt;/code&gt;s are equal,<a name="line.402"></a>
<FONT color="green">403</FONT>       *          ignoring case; &lt;code&gt;false&lt;/code&gt; otherwise.<a name="line.403"></a>
<FONT color="green">404</FONT>       * @see     #equals(Object)<a name="line.404"></a>
<FONT color="green">405</FONT>       * @see     java.lang.Character#toLowerCase(char)<a name="line.405"></a>
<FONT color="green">406</FONT>       * @see java.lang.Character#toUpperCase(char)<a name="line.406"></a>
<FONT color="green">407</FONT>       */<a name="line.407"></a>
<FONT color="green">408</FONT>      public boolean equalsIgnoreCase(String anotherString)<a name="line.408"></a>
<FONT color="green">409</FONT>      {<a name="line.409"></a>
<FONT color="green">410</FONT>        return str().equalsIgnoreCase(anotherString);<a name="line.410"></a>
<FONT color="green">411</FONT>      }<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>       * Compares two strings lexicographically.<a name="line.414"></a>
<FONT color="green">415</FONT>       *<a name="line.415"></a>
<FONT color="green">416</FONT>       * @param   xstr   the &lt;code&gt;String&lt;/code&gt; to be compared.<a name="line.416"></a>
<FONT color="green">417</FONT>       *<a name="line.417"></a>
<FONT color="green">418</FONT>       * @return  the value &lt;code&gt;0&lt;/code&gt; if the argument string is equal to<a name="line.418"></a>
<FONT color="green">419</FONT>       *          this string; a value less than &lt;code&gt;0&lt;/code&gt; if this string<a name="line.419"></a>
<FONT color="green">420</FONT>       *          is lexicographically less than the string argument; and a<a name="line.420"></a>
<FONT color="green">421</FONT>       *          value greater than &lt;code&gt;0&lt;/code&gt; if this string is<a name="line.421"></a>
<FONT color="green">422</FONT>       *          lexicographically greater than the string argument.<a name="line.422"></a>
<FONT color="green">423</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;anotherString&lt;/code&gt;<a name="line.423"></a>
<FONT color="green">424</FONT>       *          is &lt;code&gt;null&lt;/code&gt;.<a name="line.424"></a>
<FONT color="green">425</FONT>       */<a name="line.425"></a>
<FONT color="green">426</FONT>      public int compareTo(XMLString xstr)<a name="line.426"></a>
<FONT color="green">427</FONT>      {<a name="line.427"></a>
<FONT color="green">428</FONT>    <a name="line.428"></a>
<FONT color="green">429</FONT>        int len1 = this.length();<a name="line.429"></a>
<FONT color="green">430</FONT>        int len2 = xstr.length();<a name="line.430"></a>
<FONT color="green">431</FONT>        int n = Math.min(len1, len2);<a name="line.431"></a>
<FONT color="green">432</FONT>        int i = 0;<a name="line.432"></a>
<FONT color="green">433</FONT>        int j = 0;<a name="line.433"></a>
<FONT color="green">434</FONT>    <a name="line.434"></a>
<FONT color="green">435</FONT>        while (n-- != 0)<a name="line.435"></a>
<FONT color="green">436</FONT>        {<a name="line.436"></a>
<FONT color="green">437</FONT>          char c1 = this.charAt(i);<a name="line.437"></a>
<FONT color="green">438</FONT>          char c2 = xstr.charAt(j);<a name="line.438"></a>
<FONT color="green">439</FONT>    <a name="line.439"></a>
<FONT color="green">440</FONT>          if (c1 != c2)<a name="line.440"></a>
<FONT color="green">441</FONT>          {<a name="line.441"></a>
<FONT color="green">442</FONT>            return c1 - c2;<a name="line.442"></a>
<FONT color="green">443</FONT>          }<a name="line.443"></a>
<FONT color="green">444</FONT>    <a name="line.444"></a>
<FONT color="green">445</FONT>          i++;<a name="line.445"></a>
<FONT color="green">446</FONT>          j++;<a name="line.446"></a>
<FONT color="green">447</FONT>        }<a name="line.447"></a>
<FONT color="green">448</FONT>    <a name="line.448"></a>
<FONT color="green">449</FONT>        return len1 - len2;<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>       * Compares two strings lexicographically, ignoring case considerations.<a name="line.453"></a>
<FONT color="green">454</FONT>       * This method returns an integer whose sign is that of<a name="line.454"></a>
<FONT color="green">455</FONT>       * &lt;code&gt;this.toUpperCase().toLowerCase().compareTo(<a name="line.455"></a>
<FONT color="green">456</FONT>       * str.toUpperCase().toLowerCase())&lt;/code&gt;.<a name="line.456"></a>
<FONT color="green">457</FONT>       * &lt;p&gt;<a name="line.457"></a>
<FONT color="green">458</FONT>       * Note that this method does &lt;em&gt;not&lt;/em&gt; take locale into account,<a name="line.458"></a>
<FONT color="green">459</FONT>       * and will result in an unsatisfactory ordering for certain locales.<a name="line.459"></a>
<FONT color="green">460</FONT>       * The java.text package provides &lt;em&gt;collators&lt;/em&gt; to allow<a name="line.460"></a>
<FONT color="green">461</FONT>       * locale-sensitive ordering.<a name="line.461"></a>
<FONT color="green">462</FONT>       *<a name="line.462"></a>
<FONT color="green">463</FONT>       * @param   str   the &lt;code&gt;String&lt;/code&gt; to be compared.<a name="line.463"></a>
<FONT color="green">464</FONT>       * @return  a negative integer, zero, or a positive integer as the<a name="line.464"></a>
<FONT color="green">465</FONT>       *          the specified String is greater than, equal to, or less<a name="line.465"></a>
<FONT color="green">466</FONT>       *          than this String, ignoring case considerations.<a name="line.466"></a>
<FONT color="green">467</FONT>       * @see     java.text.Collator#compare(String, String)<a name="line.467"></a>
<FONT color="green">468</FONT>       * @since   1.2<a name="line.468"></a>
<FONT color="green">469</FONT>       */<a name="line.469"></a>
<FONT color="green">470</FONT>      public int compareToIgnoreCase(XMLString str)<a name="line.470"></a>
<FONT color="green">471</FONT>      {<a name="line.471"></a>
<FONT color="green">472</FONT>        // %REVIEW%  Like it says, @since 1.2. Doesn't exist in earlier<a name="line.472"></a>
<FONT color="green">473</FONT>        // versions of Java, hence we can't yet shell out to it. We can implement<a name="line.473"></a>
<FONT color="green">474</FONT>        // it as character-by-character compare, but doing so efficiently<a name="line.474"></a>
<FONT color="green">475</FONT>        // is likely to be (ahem) interesting.<a name="line.475"></a>
<FONT color="green">476</FONT>        //  <a name="line.476"></a>
<FONT color="green">477</FONT>        // However, since nobody is actually _using_ this method yet:<a name="line.477"></a>
<FONT color="green">478</FONT>        //    return str().compareToIgnoreCase(str.toString());<a name="line.478"></a>
<FONT color="green">479</FONT>        <a name="line.479"></a>
<FONT color="green">480</FONT>        throw new org.apache.xml.utils.WrappedRuntimeException(<a name="line.480"></a>
<FONT color="green">481</FONT>          new java.lang.NoSuchMethodException(<a name="line.481"></a>
<FONT color="green">482</FONT>            "Java 1.2 method, not yet implemented"));<a name="line.482"></a>
<FONT color="green">483</FONT>      }<a name="line.483"></a>
<FONT color="green">484</FONT>    <a name="line.484"></a>
<FONT color="green">485</FONT>      /**<a name="line.485"></a>
<FONT color="green">486</FONT>       * Tests if this string starts with the specified prefix beginning<a name="line.486"></a>
<FONT color="green">487</FONT>       * a specified index.<a name="line.487"></a>
<FONT color="green">488</FONT>       *<a name="line.488"></a>
<FONT color="green">489</FONT>       * @param   prefix    the prefix.<a name="line.489"></a>
<FONT color="green">490</FONT>       * @param   toffset   where to begin looking in the string.<a name="line.490"></a>
<FONT color="green">491</FONT>       * @return  &lt;code&gt;true&lt;/code&gt; if the character sequence represented by the<a name="line.491"></a>
<FONT color="green">492</FONT>       *          argument is a prefix of the substring of this object starting<a name="line.492"></a>
<FONT color="green">493</FONT>       *          at index &lt;code&gt;toffset&lt;/code&gt;; &lt;code&gt;false&lt;/code&gt; otherwise.<a name="line.493"></a>
<FONT color="green">494</FONT>       *          The result is &lt;code&gt;false&lt;/code&gt; if &lt;code&gt;toffset&lt;/code&gt; is<a name="line.494"></a>
<FONT color="green">495</FONT>       *          negative or greater than the length of this<a name="line.495"></a>
<FONT color="green">496</FONT>       *          &lt;code&gt;String&lt;/code&gt; object; otherwise the result is the same<a name="line.496"></a>
<FONT color="green">497</FONT>       *          as the result of the expression<a name="line.497"></a>
<FONT color="green">498</FONT>       *          &lt;pre&gt;<a name="line.498"></a>
<FONT color="green">499</FONT>       *          this.subString(toffset).startsWith(prefix)<a name="line.499"></a>
<FONT color="green">500</FONT>       *          &lt;/pre&gt;<a name="line.500"></a>
<FONT color="green">501</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;prefix&lt;/code&gt; is<a name="line.501"></a>
<FONT color="green">502</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.502"></a>
<FONT color="green">503</FONT>       */<a name="line.503"></a>
<FONT color="green">504</FONT>      public boolean startsWith(String prefix, int toffset)<a name="line.504"></a>
<FONT color="green">505</FONT>      {<a name="line.505"></a>
<FONT color="green">506</FONT>        return str().startsWith(prefix, toffset);<a name="line.506"></a>
<FONT color="green">507</FONT>      }<a name="line.507"></a>
<FONT color="green">508</FONT>    <a name="line.508"></a>
<FONT color="green">509</FONT>      /**<a name="line.509"></a>
<FONT color="green">510</FONT>       * Tests if this string starts with the specified prefix.<a name="line.510"></a>
<FONT color="green">511</FONT>       *<a name="line.511"></a>
<FONT color="green">512</FONT>       * @param   prefix   the prefix.<a name="line.512"></a>
<FONT color="green">513</FONT>       * @return  &lt;code&gt;true&lt;/code&gt; if the character sequence represented by the<a name="line.513"></a>
<FONT color="green">514</FONT>       *          argument is a prefix of the character sequence represented by<a name="line.514"></a>
<FONT color="green">515</FONT>       *          this string; &lt;code&gt;false&lt;/code&gt; otherwise.<a name="line.515"></a>
<FONT color="green">516</FONT>       *          Note also that &lt;code&gt;true&lt;/code&gt; will be returned if the<a name="line.516"></a>
<FONT color="green">517</FONT>       *          argument is an empty string or is equal to this<a name="line.517"></a>
<FONT color="green">518</FONT>       *          &lt;code&gt;String&lt;/code&gt; object as determined by the<a name="line.518"></a>
<FONT color="green">519</FONT>       *          {@link #equals(Object)} method.<a name="line.519"></a>
<FONT color="green">520</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;prefix&lt;/code&gt; is<a name="line.520"></a>
<FONT color="green">521</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.521"></a>
<FONT color="green">522</FONT>       */<a name="line.522"></a>
<FONT color="green">523</FONT>      public boolean startsWith(String prefix)<a name="line.523"></a>
<FONT color="green">524</FONT>      {<a name="line.524"></a>
<FONT color="green">525</FONT>        return startsWith(prefix, 0);<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>      /**<a name="line.528"></a>
<FONT color="green">529</FONT>       * Tests if this string starts with the specified prefix beginning<a name="line.529"></a>
<FONT color="green">530</FONT>       * a specified index.<a name="line.530"></a>
<FONT color="green">531</FONT>       *<a name="line.531"></a>
<FONT color="green">532</FONT>       * @param   prefix    the prefix.<a name="line.532"></a>
<FONT color="green">533</FONT>       * @param   toffset   where to begin looking in the string.<a name="line.533"></a>
<FONT color="green">534</FONT>       * @return  &lt;code&gt;true&lt;/code&gt; if the character sequence represented by the<a name="line.534"></a>
<FONT color="green">535</FONT>       *          argument is a prefix of the substring of this object starting<a name="line.535"></a>
<FONT color="green">536</FONT>       *          at index &lt;code&gt;toffset&lt;/code&gt;; &lt;code&gt;false&lt;/code&gt; otherwise.<a name="line.536"></a>
<FONT color="green">537</FONT>       *          The result is &lt;code&gt;false&lt;/code&gt; if &lt;code&gt;toffset&lt;/code&gt; is<a name="line.537"></a>
<FONT color="green">538</FONT>       *          negative or greater than the length of this<a name="line.538"></a>
<FONT color="green">539</FONT>       *          &lt;code&gt;String&lt;/code&gt; object; otherwise the result is the same<a name="line.539"></a>
<FONT color="green">540</FONT>       *          as the result of the expression<a name="line.540"></a>
<FONT color="green">541</FONT>       *          &lt;pre&gt;<a name="line.541"></a>
<FONT color="green">542</FONT>       *          this.subString(toffset).startsWith(prefix)<a name="line.542"></a>
<FONT color="green">543</FONT>       *          &lt;/pre&gt;<a name="line.543"></a>
<FONT color="green">544</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;prefix&lt;/code&gt; is<a name="line.544"></a>
<FONT color="green">545</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.545"></a>
<FONT color="green">546</FONT>       */<a name="line.546"></a>
<FONT color="green">547</FONT>      public boolean startsWith(XMLString prefix, int toffset)<a name="line.547"></a>
<FONT color="green">548</FONT>      {<a name="line.548"></a>
<FONT color="green">549</FONT>    <a name="line.549"></a>
<FONT color="green">550</FONT>        int to = toffset;<a name="line.550"></a>
<FONT color="green">551</FONT>        int tlim = this.length();<a name="line.551"></a>
<FONT color="green">552</FONT>        int po = 0;<a name="line.552"></a>
<FONT color="green">553</FONT>        int pc = prefix.length();<a name="line.553"></a>
<FONT color="green">554</FONT>    <a name="line.554"></a>
<FONT color="green">555</FONT>        // Note: toffset might be near -1&gt;&gt;&gt;1.<a name="line.555"></a>
<FONT color="green">556</FONT>        if ((toffset &lt; 0) || (toffset &gt; tlim - pc))<a name="line.556"></a>
<FONT color="green">557</FONT>        {<a name="line.557"></a>
<FONT color="green">558</FONT>          return false;<a name="line.558"></a>
<FONT color="green">559</FONT>        }<a name="line.559"></a>
<FONT color="green">560</FONT>    <a name="line.560"></a>
<FONT color="green">561</FONT>        while (--pc &gt;= 0)<a name="line.561"></a>
<FONT color="green">562</FONT>        {<a name="line.562"></a>
<FONT color="green">563</FONT>          if (this.charAt(to) != prefix.charAt(po))<a name="line.563"></a>
<FONT color="green">564</FONT>          {<a name="line.564"></a>
<FONT color="green">565</FONT>            return false;<a name="line.565"></a>
<FONT color="green">566</FONT>          }<a name="line.566"></a>
<FONT color="green">567</FONT>    <a name="line.567"></a>
<FONT color="green">568</FONT>          to++;<a name="line.568"></a>
<FONT color="green">569</FONT>          po++;<a name="line.569"></a>
<FONT color="green">570</FONT>        }<a name="line.570"></a>
<FONT color="green">571</FONT>    <a name="line.571"></a>
<FONT color="green">572</FONT>        return true;<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>      /**<a name="line.575"></a>
<FONT color="green">576</FONT>       * Tests if this string starts with the specified prefix.<a name="line.576"></a>
<FONT color="green">577</FONT>       *<a name="line.577"></a>
<FONT color="green">578</FONT>       * @param   prefix   the prefix.<a name="line.578"></a>
<FONT color="green">579</FONT>       * @return  &lt;code&gt;true&lt;/code&gt; if the character sequence represented by the<a name="line.579"></a>
<FONT color="green">580</FONT>       *          argument is a prefix of the character sequence represented by<a name="line.580"></a>
<FONT color="green">581</FONT>       *          this string; &lt;code&gt;false&lt;/code&gt; otherwise.<a name="line.581"></a>
<FONT color="green">582</FONT>       *          Note also that &lt;code&gt;true&lt;/code&gt; will be returned if the<a name="line.582"></a>
<FONT color="green">583</FONT>       *          argument is an empty string or is equal to this<a name="line.583"></a>
<FONT color="green">584</FONT>       *          &lt;code&gt;String&lt;/code&gt; object as determined by the<a name="line.584"></a>
<FONT color="green">585</FONT>       *          {@link #equals(Object)} method.<a name="line.585"></a>
<FONT color="green">586</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;prefix&lt;/code&gt; is<a name="line.586"></a>
<FONT color="green">587</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.587"></a>
<FONT color="green">588</FONT>       */<a name="line.588"></a>
<FONT color="green">589</FONT>      public boolean startsWith(XMLString prefix)<a name="line.589"></a>
<FONT color="green">590</FONT>      {<a name="line.590"></a>
<FONT color="green">591</FONT>        return startsWith(prefix, 0);<a name="line.591"></a>
<FONT color="green">592</FONT>      }<a name="line.592"></a>
<FONT color="green">593</FONT>    <a name="line.593"></a>
<FONT color="green">594</FONT>      /**<a name="line.594"></a>
<FONT color="green">595</FONT>       * Tests if this string ends with the specified suffix.<a name="line.595"></a>
<FONT color="green">596</FONT>       *<a name="line.596"></a>
<FONT color="green">597</FONT>       * @param   suffix   the suffix.<a name="line.597"></a>
<FONT color="green">598</FONT>       * @return  &lt;code&gt;true&lt;/code&gt; if the character sequence represented by the<a name="line.598"></a>
<FONT color="green">599</FONT>       *          argument is a suffix of the character sequence represented by<a name="line.599"></a>
<FONT color="green">600</FONT>       *          this object; &lt;code&gt;false&lt;/code&gt; otherwise. Note that the<a name="line.600"></a>
<FONT color="green">601</FONT>       *          result will be &lt;code&gt;true&lt;/code&gt; if the argument is the<a name="line.601"></a>
<FONT color="green">602</FONT>       *          empty string or is equal to this &lt;code&gt;String&lt;/code&gt; object<a name="line.602"></a>
<FONT color="green">603</FONT>       *          as determined by the {@link #equals(Object)} method.<a name="line.603"></a>
<FONT color="green">604</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;suffix&lt;/code&gt; is<a name="line.604"></a>
<FONT color="green">605</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.605"></a>
<FONT color="green">606</FONT>       */<a name="line.606"></a>
<FONT color="green">607</FONT>      public boolean endsWith(String suffix)<a name="line.607"></a>
<FONT color="green">608</FONT>      {<a name="line.608"></a>
<FONT color="green">609</FONT>        return str().endsWith(suffix);<a name="line.609"></a>
<FONT color="green">610</FONT>      }<a name="line.610"></a>
<FONT color="green">611</FONT>    <a name="line.611"></a>
<FONT color="green">612</FONT>      /**<a name="line.612"></a>
<FONT color="green">613</FONT>       * Returns a hashcode for this string. The hashcode for a<a name="line.613"></a>
<FONT color="green">614</FONT>       * &lt;code&gt;String&lt;/code&gt; object is computed as<a name="line.614"></a>
<FONT color="green">615</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.615"></a>
<FONT color="green">616</FONT>       * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]<a name="line.616"></a>
<FONT color="green">617</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.617"></a>
<FONT color="green">618</FONT>       * using &lt;code&gt;int&lt;/code&gt; arithmetic, where &lt;code&gt;s[i]&lt;/code&gt; is the<a name="line.618"></a>
<FONT color="green">619</FONT>       * &lt;i&gt;i&lt;/i&gt;th character of the string, &lt;code&gt;n&lt;/code&gt; is the length of<a name="line.619"></a>
<FONT color="green">620</FONT>       * the string, and &lt;code&gt;^&lt;/code&gt; indicates exponentiation.<a name="line.620"></a>
<FONT color="green">621</FONT>       * (The hash value of the empty string is zero.)<a name="line.621"></a>
<FONT color="green">622</FONT>       *<a name="line.622"></a>
<FONT color="green">623</FONT>       * @return  a hash code value for this object.<a name="line.623"></a>
<FONT color="green">624</FONT>       */<a name="line.624"></a>
<FONT color="green">625</FONT>      public int hashCode()<a name="line.625"></a>
<FONT color="green">626</FONT>      {<a name="line.626"></a>
<FONT color="green">627</FONT>        return str().hashCode();<a name="line.627"></a>
<FONT color="green">628</FONT>      }<a name="line.628"></a>
<FONT color="green">629</FONT>    <a name="line.629"></a>
<FONT color="green">630</FONT>      /**<a name="line.630"></a>
<FONT color="green">631</FONT>       * Returns the index within this string of the first occurrence of the<a name="line.631"></a>
<FONT color="green">632</FONT>       * specified character. If a character with value &lt;code&gt;ch&lt;/code&gt; occurs<a name="line.632"></a>
<FONT color="green">633</FONT>       * in the character sequence represented by this &lt;code&gt;String&lt;/code&gt;<a name="line.633"></a>
<FONT color="green">634</FONT>       * object, then the index of the first such occurrence is returned --<a name="line.634"></a>
<FONT color="green">635</FONT>       * that is, the smallest value &lt;i&gt;k&lt;/i&gt; such that:<a name="line.635"></a>
<FONT color="green">636</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.636"></a>
<FONT color="green">637</FONT>       * this.charAt(&lt;i&gt;k&lt;/i&gt;) == ch<a name="line.637"></a>
<FONT color="green">638</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.638"></a>
<FONT color="green">639</FONT>       * is &lt;code&gt;true&lt;/code&gt;. If no such character occurs in this string,<a name="line.639"></a>
<FONT color="green">640</FONT>       * then &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.640"></a>
<FONT color="green">641</FONT>       *<a name="line.641"></a>
<FONT color="green">642</FONT>       * @param   ch   a character.<a name="line.642"></a>
<FONT color="green">643</FONT>       * @return  the index of the first occurrence of the character in the<a name="line.643"></a>
<FONT color="green">644</FONT>       *          character sequence represented by this object, or<a name="line.644"></a>
<FONT color="green">645</FONT>       *          &lt;code&gt;-1&lt;/code&gt; if the character does not occur.<a name="line.645"></a>
<FONT color="green">646</FONT>       */<a name="line.646"></a>
<FONT color="green">647</FONT>      public int indexOf(int ch)<a name="line.647"></a>
<FONT color="green">648</FONT>      {<a name="line.648"></a>
<FONT color="green">649</FONT>        return str().indexOf(ch);<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>      /**<a name="line.652"></a>
<FONT color="green">653</FONT>       * Returns the index within this string of the first occurrence of the<a name="line.653"></a>
<FONT color="green">654</FONT>       * specified character, starting the search at the specified index.<a name="line.654"></a>
<FONT color="green">655</FONT>       * &lt;p&gt;<a name="line.655"></a>
<FONT color="green">656</FONT>       * If a character with value &lt;code&gt;ch&lt;/code&gt; occurs in the character<a name="line.656"></a>
<FONT color="green">657</FONT>       * sequence represented by this &lt;code&gt;String&lt;/code&gt; object at an index<a name="line.657"></a>
<FONT color="green">658</FONT>       * no smaller than &lt;code&gt;fromIndex&lt;/code&gt;, then the index of the first<a name="line.658"></a>
<FONT color="green">659</FONT>       * such occurrence is returned--that is, the smallest value &lt;i&gt;k&lt;/i&gt;<a name="line.659"></a>
<FONT color="green">660</FONT>       * such that:<a name="line.660"></a>
<FONT color="green">661</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.661"></a>
<FONT color="green">662</FONT>       * (this.charAt(&lt;i&gt;k&lt;/i&gt;) == ch) &amp;&amp; (&lt;i&gt;k&lt;/i&gt; &gt;= fromIndex)<a name="line.662"></a>
<FONT color="green">663</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.663"></a>
<FONT color="green">664</FONT>       * is true. If no such character occurs in this string at or after<a name="line.664"></a>
<FONT color="green">665</FONT>       * position &lt;code&gt;fromIndex&lt;/code&gt;, then &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.665"></a>
<FONT color="green">666</FONT>       * &lt;p&gt;<a name="line.666"></a>
<FONT color="green">667</FONT>       * There is no restriction on the value of &lt;code&gt;fromIndex&lt;/code&gt;. If it<a name="line.667"></a>
<FONT color="green">668</FONT>       * is negative, it has the same effect as if it were zero: this entire<a name="line.668"></a>
<FONT color="green">669</FONT>       * string may be searched. If it is greater than the length of this<a name="line.669"></a>
<FONT color="green">670</FONT>       * string, it has the same effect as if it were equal to the length of<a name="line.670"></a>
<FONT color="green">671</FONT>       * this string: &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.671"></a>
<FONT color="green">672</FONT>       *<a name="line.672"></a>
<FONT color="green">673</FONT>       * @param   ch          a character.<a name="line.673"></a>
<FONT color="green">674</FONT>       * @param   fromIndex   the index to start the search from.<a name="line.674"></a>
<FONT color="green">675</FONT>       * @return  the index of the first occurrence of the character in the<a name="line.675"></a>
<FONT color="green">676</FONT>       *          character sequence represented by this object that is greater<a name="line.676"></a>
<FONT color="green">677</FONT>       *          than or equal to &lt;code&gt;fromIndex&lt;/code&gt;, or &lt;code&gt;-1&lt;/code&gt;<a name="line.677"></a>
<FONT color="green">678</FONT>       *          if the character does not occur.<a name="line.678"></a>
<FONT color="green">679</FONT>       */<a name="line.679"></a>
<FONT color="green">680</FONT>      public int indexOf(int ch, int fromIndex)<a name="line.680"></a>
<FONT color="green">681</FONT>      {<a name="line.681"></a>
<FONT color="green">682</FONT>        return str().indexOf(ch, fromIndex);<a name="line.682"></a>
<FONT color="green">683</FONT>      }<a name="line.683"></a>
<FONT color="green">684</FONT>    <a name="line.684"></a>
<FONT color="green">685</FONT>      /**<a name="line.685"></a>
<FONT color="green">686</FONT>       * Returns the index within this string of the last occurrence of the<a name="line.686"></a>
<FONT color="green">687</FONT>       * specified character. That is, the index returned is the largest<a name="line.687"></a>
<FONT color="green">688</FONT>       * value &lt;i&gt;k&lt;/i&gt; such that:<a name="line.688"></a>
<FONT color="green">689</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.689"></a>
<FONT color="green">690</FONT>       * this.charAt(&lt;i&gt;k&lt;/i&gt;) == ch<a name="line.690"></a>
<FONT color="green">691</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.691"></a>
<FONT color="green">692</FONT>       * is true.<a name="line.692"></a>
<FONT color="green">693</FONT>       * The String is searched backwards starting at the last character.<a name="line.693"></a>
<FONT color="green">694</FONT>       *<a name="line.694"></a>
<FONT color="green">695</FONT>       * @param   ch   a character.<a name="line.695"></a>
<FONT color="green">696</FONT>       * @return  the index of the last occurrence of the character in the<a name="line.696"></a>
<FONT color="green">697</FONT>       *          character sequence represented by this object, or<a name="line.697"></a>
<FONT color="green">698</FONT>       *          &lt;code&gt;-1&lt;/code&gt; if the character does not occur.<a name="line.698"></a>
<FONT color="green">699</FONT>       */<a name="line.699"></a>
<FONT color="green">700</FONT>      public int lastIndexOf(int ch)<a name="line.700"></a>
<FONT color="green">701</FONT>      {<a name="line.701"></a>
<FONT color="green">702</FONT>        return str().lastIndexOf(ch);<a name="line.702"></a>
<FONT color="green">703</FONT>      }<a name="line.703"></a>
<FONT color="green">704</FONT>    <a name="line.704"></a>
<FONT color="green">705</FONT>      /**<a name="line.705"></a>
<FONT color="green">706</FONT>       * Returns the index within this string of the last occurrence of the<a name="line.706"></a>
<FONT color="green">707</FONT>       * specified character, searching backward starting at the specified<a name="line.707"></a>
<FONT color="green">708</FONT>       * index. That is, the index returned is the largest value &lt;i&gt;k&lt;/i&gt;<a name="line.708"></a>
<FONT color="green">709</FONT>       * such that:<a name="line.709"></a>
<FONT color="green">710</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.710"></a>
<FONT color="green">711</FONT>       * this.charAt(k) == ch) &amp;&amp; (k &lt;= fromIndex)<a name="line.711"></a>
<FONT color="green">712</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.712"></a>
<FONT color="green">713</FONT>       * is true.<a name="line.713"></a>
<FONT color="green">714</FONT>       *<a name="line.714"></a>
<FONT color="green">715</FONT>       * @param   ch          a character.<a name="line.715"></a>
<FONT color="green">716</FONT>       * @param   fromIndex   the index to start the search from. There is no<a name="line.716"></a>
<FONT color="green">717</FONT>       *          restriction on the value of &lt;code&gt;fromIndex&lt;/code&gt;. If it is<a name="line.717"></a>
<FONT color="green">718</FONT>       *          greater than or equal to the length of this string, it has<a name="line.718"></a>
<FONT color="green">719</FONT>       *          the same effect as if it were equal to one less than the<a name="line.719"></a>
<FONT color="green">720</FONT>       *          length of this string: this entire string may be searched.<a name="line.720"></a>
<FONT color="green">721</FONT>       *          If it is negative, it has the same effect as if it were -1:<a name="line.721"></a>
<FONT color="green">722</FONT>       *          -1 is returned.<a name="line.722"></a>
<FONT color="green">723</FONT>       * @return  the index of the last occurrence of the character in the<a name="line.723"></a>
<FONT color="green">724</FONT>       *          character sequence represented by this object that is less<a name="line.724"></a>
<FONT color="green">725</FONT>       *          than or equal to &lt;code&gt;fromIndex&lt;/code&gt;, or &lt;code&gt;-1&lt;/code&gt;<a name="line.725"></a>
<FONT color="green">726</FONT>       *          if the character does not occur before that point.<a name="line.726"></a>
<FONT color="green">727</FONT>       */<a name="line.727"></a>
<FONT color="green">728</FONT>      public int lastIndexOf(int ch, int fromIndex)<a name="line.728"></a>
<FONT color="green">729</FONT>      {<a name="line.729"></a>
<FONT color="green">730</FONT>        return str().lastIndexOf(ch, fromIndex);<a name="line.730"></a>
<FONT color="green">731</FONT>      }<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>       * Returns the index within this string of the first occurrence of the<a name="line.734"></a>
<FONT color="green">735</FONT>       * specified substring. The integer returned is the smallest value<a name="line.735"></a>
<FONT color="green">736</FONT>       * &lt;i&gt;k&lt;/i&gt; such that:<a name="line.736"></a>
<FONT color="green">737</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.737"></a>
<FONT color="green">738</FONT>       * this.startsWith(str, &lt;i&gt;k&lt;/i&gt;)<a name="line.738"></a>
<FONT color="green">739</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.739"></a>
<FONT color="green">740</FONT>       * is &lt;code&gt;true&lt;/code&gt;.<a name="line.740"></a>
<FONT color="green">741</FONT>       *<a name="line.741"></a>
<FONT color="green">742</FONT>       * @param   str   any string.<a name="line.742"></a>
<FONT color="green">743</FONT>       * @return  if the string argument occurs as a substring within this<a name="line.743"></a>
<FONT color="green">744</FONT>       *          object, then the index of the first character of the first<a name="line.744"></a>
<FONT color="green">745</FONT>       *          such substring is returned; if it does not occur as a<a name="line.745"></a>
<FONT color="green">746</FONT>       *          substring, &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.746"></a>
<FONT color="green">747</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;str&lt;/code&gt; is<a name="line.747"></a>
<FONT color="green">748</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.748"></a>
<FONT color="green">749</FONT>       */<a name="line.749"></a>
<FONT color="green">750</FONT>      public int indexOf(String str)<a name="line.750"></a>
<FONT color="green">751</FONT>      {<a name="line.751"></a>
<FONT color="green">752</FONT>        return str().indexOf(str);<a name="line.752"></a>
<FONT color="green">753</FONT>      }<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>       * Returns the index within this string of the first occurrence of the<a name="line.756"></a>
<FONT color="green">757</FONT>       * specified substring. The integer returned is the smallest value<a name="line.757"></a>
<FONT color="green">758</FONT>       * &lt;i&gt;k&lt;/i&gt; such that:<a name="line.758"></a>
<FONT color="green">759</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.759"></a>
<FONT color="green">760</FONT>       * this.startsWith(str, &lt;i&gt;k&lt;/i&gt;)<a name="line.760"></a>
<FONT color="green">761</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.761"></a>
<FONT color="green">762</FONT>       * is &lt;code&gt;true&lt;/code&gt;.<a name="line.762"></a>
<FONT color="green">763</FONT>       *<a name="line.763"></a>
<FONT color="green">764</FONT>       * @param   str   any string.<a name="line.764"></a>
<FONT color="green">765</FONT>       * @return  if the string argument occurs as a substring within this<a name="line.765"></a>
<FONT color="green">766</FONT>       *          object, then the index of the first character of the first<a name="line.766"></a>
<FONT color="green">767</FONT>       *          such substring is returned; if it does not occur as a<a name="line.767"></a>
<FONT color="green">768</FONT>       *          substring, &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.768"></a>
<FONT color="green">769</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;str&lt;/code&gt; is<a name="line.769"></a>
<FONT color="green">770</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.770"></a>
<FONT color="green">771</FONT>       */<a name="line.771"></a>
<FONT color="green">772</FONT>      public int indexOf(XMLString str)<a name="line.772"></a>
<FONT color="green">773</FONT>      {<a name="line.773"></a>
<FONT color="green">774</FONT>        return str().indexOf(str.toString());<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>       * Returns the index within this string of the first occurrence of the<a name="line.778"></a>
<FONT color="green">779</FONT>       * specified substring, starting at the specified index. The integer<a name="line.779"></a>
<FONT color="green">780</FONT>       * returned is the smallest value &lt;i&gt;k&lt;/i&gt; such that:<a name="line.780"></a>
<FONT color="green">781</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.781"></a>
<FONT color="green">782</FONT>       * this.startsWith(str, &lt;i&gt;k&lt;/i&gt;) &amp;&amp; (&lt;i&gt;k&lt;/i&gt; &gt;= fromIndex)<a name="line.782"></a>
<FONT color="green">783</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.783"></a>
<FONT color="green">784</FONT>       * is &lt;code&gt;true&lt;/code&gt;.<a name="line.784"></a>
<FONT color="green">785</FONT>       * &lt;p&gt;<a name="line.785"></a>
<FONT color="green">786</FONT>       * There is no restriction on the value of &lt;code&gt;fromIndex&lt;/code&gt;. If<a name="line.786"></a>
<FONT color="green">787</FONT>       * it is negative, it has the same effect as if it were zero: this entire<a name="line.787"></a>
<FONT color="green">788</FONT>       * string may be searched. If it is greater than the length of this<a name="line.788"></a>
<FONT color="green">789</FONT>       * string, it has the same effect as if it were equal to the length of<a name="line.789"></a>
<FONT color="green">790</FONT>       * this string: &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.790"></a>
<FONT color="green">791</FONT>       *<a name="line.791"></a>
<FONT color="green">792</FONT>       * @param   str         the substring to search for.<a name="line.792"></a>
<FONT color="green">793</FONT>       * @param   fromIndex   the index to start the search from.<a name="line.793"></a>
<FONT color="green">794</FONT>       * @return  If the string argument occurs as a substring within this<a name="line.794"></a>
<FONT color="green">795</FONT>       *          object at a starting index no smaller than<a name="line.795"></a>
<FONT color="green">796</FONT>       *          &lt;code&gt;fromIndex&lt;/code&gt;, then the index of the first character<a name="line.796"></a>
<FONT color="green">797</FONT>       *          of the first such substring is returned. If it does not occur<a name="line.797"></a>
<FONT color="green">798</FONT>       *          as a substring starting at &lt;code&gt;fromIndex&lt;/code&gt; or beyond,<a name="line.798"></a>
<FONT color="green">799</FONT>       *          &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.799"></a>
<FONT color="green">800</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;str&lt;/code&gt; is<a name="line.800"></a>
<FONT color="green">801</FONT>       *          &lt;code&gt;null&lt;/code&gt;<a name="line.801"></a>
<FONT color="green">802</FONT>       */<a name="line.802"></a>
<FONT color="green">803</FONT>      public int indexOf(String str, int fromIndex)<a name="line.803"></a>
<FONT color="green">804</FONT>      {<a name="line.804"></a>
<FONT color="green">805</FONT>        return str().indexOf(str, fromIndex);<a name="line.805"></a>
<FONT color="green">806</FONT>      }<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>       * Returns the index within this string of the rightmost occurrence<a name="line.809"></a>
<FONT color="green">810</FONT>       * of the specified substring.  The rightmost empty string "" is<a name="line.810"></a>
<FONT color="green">811</FONT>       * considered to occur at the index value &lt;code&gt;this.length()&lt;/code&gt;.<a name="line.811"></a>
<FONT color="green">812</FONT>       * The returned index is the largest value &lt;i&gt;k&lt;/i&gt; such that<a name="line.812"></a>
<FONT color="green">813</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.813"></a>
<FONT color="green">814</FONT>       * this.startsWith(str, k)<a name="line.814"></a>
<FONT color="green">815</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.815"></a>
<FONT color="green">816</FONT>       * is true.<a name="line.816"></a>
<FONT color="green">817</FONT>       *<a name="line.817"></a>
<FONT color="green">818</FONT>       * @param   str   the substring to search for.<a name="line.818"></a>
<FONT color="green">819</FONT>       * @return  if the string argument occurs one or more times as a substring<a name="line.819"></a>
<FONT color="green">820</FONT>       *          within this object, then the index of the first character of<a name="line.820"></a>
<FONT color="green">821</FONT>       *          the last such substring is returned. If it does not occur as<a name="line.821"></a>
<FONT color="green">822</FONT>       *          a substring, &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.822"></a>
<FONT color="green">823</FONT>       * @exception java.lang.NullPointerException  if &lt;code&gt;str&lt;/code&gt; is<a name="line.823"></a>
<FONT color="green">824</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.824"></a>
<FONT color="green">825</FONT>       */<a name="line.825"></a>
<FONT color="green">826</FONT>      public int lastIndexOf(String str)<a name="line.826"></a>
<FONT color="green">827</FONT>      {<a name="line.827"></a>
<FONT color="green">828</FONT>        return str().lastIndexOf(str);<a name="line.828"></a>
<FONT color="green">829</FONT>      }<a name="line.829"></a>
<FONT color="green">830</FONT>    <a name="line.830"></a>
<FONT color="green">831</FONT>      /**<a name="line.831"></a>
<FONT color="green">832</FONT>       * Returns the index within this string of the last occurrence of<a name="line.832"></a>
<FONT color="green">833</FONT>       * the specified substring.<a name="line.833"></a>
<FONT color="green">834</FONT>       *<a name="line.834"></a>
<FONT color="green">835</FONT>       * @param   str         the substring to search for.<a name="line.835"></a>
<FONT color="green">836</FONT>       * @param   fromIndex   the index to start the search from. There is no<a name="line.836"></a>
<FONT color="green">837</FONT>       *          restriction on the value of fromIndex. If it is greater than<a name="line.837"></a>
<FONT color="green">838</FONT>       *          the length of this string, it has the same effect as if it<a name="line.838"></a>
<FONT color="green">839</FONT>       *          were equal to the length of this string: this entire string<a name="line.839"></a>
<FONT color="green">840</FONT>       *          may be searched. If it is negative, it has the same effect<a name="line.840"></a>
<FONT color="green">841</FONT>       *          as if it were -1: -1 is returned.<a name="line.841"></a>
<FONT color="green">842</FONT>       * @return  If the string argument occurs one or more times as a substring<a name="line.842"></a>
<FONT color="green">843</FONT>       *          within this object at a starting index no greater than<a name="line.843"></a>
<FONT color="green">844</FONT>       *          &lt;code&gt;fromIndex&lt;/code&gt;, then the index of the first character of<a name="line.844"></a>
<FONT color="green">845</FONT>       *          the last such substring is returned. If it does not occur as a<a name="line.845"></a>
<FONT color="green">846</FONT>       *          substring starting at &lt;code&gt;fromIndex&lt;/code&gt; or earlier,<a name="line.846"></a>
<FONT color="green">847</FONT>       *          &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.847"></a>
<FONT color="green">848</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;str&lt;/code&gt; is<a name="line.848"></a>
<FONT color="green">849</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.849"></a>
<FONT color="green">850</FONT>       */<a name="line.850"></a>
<FONT color="green">851</FONT>      public int lastIndexOf(String str, int fromIndex)<a name="line.851"></a>
<FONT color="green">852</FONT>      {<a name="line.852"></a>
<FONT color="green">853</FONT>        return str().lastIndexOf(str, fromIndex);<a name="line.853"></a>
<FONT color="green">854</FONT>      }<a name="line.854"></a>
<FONT color="green">855</FONT>    <a name="line.855"></a>
<FONT color="green">856</FONT>      /**<a name="line.856"></a>
<FONT color="green">857</FONT>       * Returns a new string that is a substring of this string. The<a name="line.857"></a>
<FONT color="green">858</FONT>       * substring begins with the character at the specified index and<a name="line.858"></a>
<FONT color="green">859</FONT>       * extends to the end of this string. &lt;p&gt;<a name="line.859"></a>
<FONT color="green">860</FONT>       * Examples:<a name="line.860"></a>
<FONT color="green">861</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.861"></a>
<FONT color="green">862</FONT>       * "unhappy".substring(2) returns "happy"<a name="line.862"></a>
<FONT color="green">863</FONT>       * "Harbison".substring(3) returns "bison"<a name="line.863"></a>
<FONT color="green">864</FONT>       * "emptiness".substring(9) returns "" (an empty string)<a name="line.864"></a>
<FONT color="green">865</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.865"></a>
<FONT color="green">866</FONT>       *<a name="line.866"></a>
<FONT color="green">867</FONT>       * @param      beginIndex   the beginning index, inclusive.<a name="line.867"></a>
<FONT color="green">868</FONT>       * @return     the specified substring.<a name="line.868"></a>
<FONT color="green">869</FONT>       * @exception  IndexOutOfBoundsException  if<a name="line.869"></a>
<FONT color="green">870</FONT>       *             &lt;code&gt;beginIndex&lt;/code&gt; is negative or larger than the<a name="line.870"></a>
<FONT color="green">871</FONT>       *             length of this &lt;code&gt;String&lt;/code&gt; object.<a name="line.871"></a>
<FONT color="green">872</FONT>       */<a name="line.872"></a>
<FONT color="green">873</FONT>      public XMLString substring(int beginIndex)<a name="line.873"></a>
<FONT color="green">874</FONT>      {<a name="line.874"></a>
<FONT color="green">875</FONT>        return new XString(str().substring(beginIndex));<a name="line.875"></a>
<FONT color="green">876</FONT>      }<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>       * Returns a new string that is a substring of this string. The<a name="line.879"></a>
<FONT color="green">880</FONT>       * substring begins at the specified &lt;code&gt;beginIndex&lt;/code&gt; and<a name="line.880"></a>
<FONT color="green">881</FONT>       * extends to the character at index &lt;code&gt;endIndex - 1&lt;/code&gt;.<a name="line.881"></a>
<FONT color="green">882</FONT>       * Thus the length of the substring is &lt;code&gt;endIndex-beginIndex&lt;/code&gt;.<a name="line.882"></a>
<FONT color="green">883</FONT>       *<a name="line.883"></a>
<FONT color="green">884</FONT>       * @param      beginIndex   the beginning index, inclusive.<a name="line.884"></a>
<FONT color="green">885</FONT>       * @param      endIndex     the ending index, exclusive.<a name="line.885"></a>
<FONT color="green">886</FONT>       * @return     the specified substring.<a name="line.886"></a>
<FONT color="green">887</FONT>       * @exception  IndexOutOfBoundsException  if the<a name="line.887"></a>
<FONT color="green">888</FONT>       *             &lt;code&gt;beginIndex&lt;/code&gt; is negative, or<a name="line.888"></a>
<FONT color="green">889</FONT>       *             &lt;code&gt;endIndex&lt;/code&gt; is larger than the length of<a name="line.889"></a>
<FONT color="green">890</FONT>       *             this &lt;code&gt;String&lt;/code&gt; object, or<a name="line.890"></a>
<FONT color="green">891</FONT>       *             &lt;code&gt;beginIndex&lt;/code&gt; is larger than<a name="line.891"></a>
<FONT color="green">892</FONT>       *             &lt;code&gt;endIndex&lt;/code&gt;.<a name="line.892"></a>
<FONT color="green">893</FONT>       */<a name="line.893"></a>
<FONT color="green">894</FONT>      public XMLString substring(int beginIndex, int endIndex)<a name="line.894"></a>
<FONT color="green">895</FONT>      {<a name="line.895"></a>
<FONT color="green">896</FONT>        return new XString(str().substring(beginIndex, endIndex));<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>       * Concatenates the specified string to the end of this string.<a name="line.900"></a>
<FONT color="green">901</FONT>       *<a name="line.901"></a>
<FONT color="green">902</FONT>       * @param   str   the &lt;code&gt;String&lt;/code&gt; that is concatenated to the end<a name="line.902"></a>
<FONT color="green">903</FONT>       *                of this &lt;code&gt;String&lt;/code&gt;.<a name="line.903"></a>
<FONT color="green">904</FONT>       * @return  a string that represents the concatenation of this object's<a name="line.904"></a>
<FONT color="green">905</FONT>       *          characters followed by the string argument's characters.<a name="line.905"></a>
<FONT color="green">906</FONT>       * @exception java.lang.NullPointerException if &lt;code&gt;str&lt;/code&gt; is<a name="line.906"></a>
<FONT color="green">907</FONT>       *          &lt;code&gt;null&lt;/code&gt;.<a name="line.907"></a>
<FONT color="green">908</FONT>       */<a name="line.908"></a>
<FONT color="green">909</FONT>      public XMLString concat(String str)<a name="line.909"></a>
<FONT color="green">910</FONT>      {<a name="line.910"></a>
<FONT color="green">911</FONT>    <a name="line.911"></a>
<FONT color="green">912</FONT>        // %REVIEW% Make an FSB here?<a name="line.912"></a>
<FONT color="green">913</FONT>        return new XString(str().concat(str));<a name="line.913"></a>
<FONT color="green">914</FONT>      }<a name="line.914"></a>
<FONT color="green">915</FONT>    <a name="line.915"></a>
<FONT color="green">916</FONT>      /**<a name="line.916"></a>
<FONT color="green">917</FONT>       * Converts all of the characters in this &lt;code&gt;String&lt;/code&gt; to lower<a name="line.917"></a>
<FONT color="green">918</FONT>       * case using the rules of the given &lt;code&gt;Locale&lt;/code&gt;.<a name="line.918"></a>
<FONT color="green">919</FONT>       *<a name="line.919"></a>
<FONT color="green">920</FONT>       * @param locale use the case transformation rules for this locale<a name="line.920"></a>
<FONT color="green">921</FONT>       * @return the String, converted to lowercase.<a name="line.921"></a>
<FONT color="green">922</FONT>       * @see     java.lang.Character#toLowerCase(char)<a name="line.922"></a>
<FONT color="green">923</FONT>       * @see     java.lang.String#toUpperCase(Locale)<a name="line.923"></a>
<FONT color="green">924</FONT>       */<a name="line.924"></a>
<FONT color="green">925</FONT>      public XMLString toLowerCase(Locale locale)<a name="line.925"></a>
<FONT color="green">926</FONT>      {<a name="line.926"></a>
<FONT color="green">927</FONT>        return new XString(str().toLowerCase(locale));<a name="line.927"></a>
<FONT color="green">928</FONT>      }<a name="line.928"></a>
<FONT color="green">929</FONT>    <a name="line.929"></a>
<FONT color="green">930</FONT>      /**<a name="line.930"></a>
<FONT color="green">931</FONT>       * Converts all of the characters in this &lt;code&gt;String&lt;/code&gt; to lower<a name="line.931"></a>
<FONT color="green">932</FONT>       * case using the rules of the default locale, which is returned<a name="line.932"></a>
<FONT color="green">933</FONT>       * by &lt;code&gt;Locale.getDefault&lt;/code&gt;.<a name="line.933"></a>
<FONT color="green">934</FONT>       * &lt;p&gt;<a name="line.934"></a>
<FONT color="green">935</FONT>       *<a name="line.935"></a>
<FONT color="green">936</FONT>       * @return  the string, converted to lowercase.<a name="line.936"></a>
<FONT color="green">937</FONT>       * @see     java.lang.Character#toLowerCase(char)<a name="line.937"></a>
<FONT color="green">938</FONT>       * @see     java.lang.String#toLowerCase(Locale)<a name="line.938"></a>
<FONT color="green">939</FONT>       */<a name="line.939"></a>
<FONT color="green">940</FONT>      public XMLString toLowerCase()<a name="line.940"></a>
<FONT color="green">941</FONT>      {<a name="line.941"></a>
<FONT color="green">942</FONT>        return new XString(str().toLowerCase());<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>       * Converts all of the characters in this &lt;code&gt;String&lt;/code&gt; to upper<a name="line.946"></a>
<FONT color="green">947</FONT>       * case using the rules of the given locale.<a name="line.947"></a>
<FONT color="green">948</FONT>       * @param locale use the case transformation rules for this locale<a name="line.948"></a>
<FONT color="green">949</FONT>       * @return the String, converted to uppercase.<a name="line.949"></a>
<FONT color="green">950</FONT>       * @see     java.lang.Character#toUpperCase(char)<a name="line.950"></a>
<FONT color="green">951</FONT>       * @see     java.lang.String#toLowerCase(Locale)<a name="line.951"></a>
<FONT color="green">952</FONT>       */<a name="line.952"></a>
<FONT color="green">953</FONT>      public XMLString toUpperCase(Locale locale)<a name="line.953"></a>
<FONT color="green">954</FONT>      {<a name="line.954"></a>
<FONT color="green">955</FONT>        return new XString(str().toUpperCase(locale));<a name="line.955"></a>
<FONT color="green">956</FONT>      }<a name="line.956"></a>
<FONT color="green">957</FONT>    <a name="line.957"></a>
<FONT color="green">958</FONT>      /**<a name="line.958"></a>
<FONT color="green">959</FONT>       * Converts all of the characters in this &lt;code&gt;String&lt;/code&gt; to upper<a name="line.959"></a>
<FONT color="green">960</FONT>       * case using the rules of the default locale, which is returned<a name="line.960"></a>
<FONT color="green">961</FONT>       * by &lt;code&gt;Locale.getDefault&lt;/code&gt;.<a name="line.961"></a>
<FONT color="green">962</FONT>       *<a name="line.962"></a>
<FONT color="green">963</FONT>       * &lt;p&gt;<a name="line.963"></a>
<FONT color="green">964</FONT>       * If no character in this string has a different uppercase version,<a name="line.964"></a>
<FONT color="green">965</FONT>       * based on calling the &lt;code&gt;toUpperCase&lt;/code&gt; method defined by<a name="line.965"></a>
<FONT color="green">966</FONT>       * &lt;code&gt;Character&lt;/code&gt;, then the original string is returned.<a name="line.966"></a>
<FONT color="green">967</FONT>       * &lt;p&gt;<a name="line.967"></a>
<FONT color="green">968</FONT>       * Otherwise, this method creates a new &lt;code&gt;String&lt;/code&gt; object<a name="line.968"></a>
<FONT color="green">969</FONT>       * representing a character sequence identical in length to the<a name="line.969"></a>
<FONT color="green">970</FONT>       * character sequence represented by this &lt;code&gt;String&lt;/code&gt; object and<a name="line.970"></a>
<FONT color="green">971</FONT>       * with every character equal to the result of applying the method<a name="line.971"></a>
<FONT color="green">972</FONT>       * &lt;code&gt;Character.toUpperCase&lt;/code&gt; to the corresponding character of<a name="line.972"></a>
<FONT color="green">973</FONT>       * this &lt;code&gt;String&lt;/code&gt; object. &lt;p&gt;<a name="line.973"></a>
<FONT color="green">974</FONT>       * Examples:<a name="line.974"></a>
<FONT color="green">975</FONT>       * &lt;blockquote&gt;&lt;pre&gt;<a name="line.975"></a>
<FONT color="green">976</FONT>       * "Fahrvergn&amp;uuml;gen".toUpperCase() returns "FAHRVERGN&amp;Uuml;GEN"<a name="line.976"></a>
<FONT color="green">977</FONT>       * "Visit Ljubinje!".toUpperCase() returns "VISIT LJUBINJE!"<a name="line.977"></a>
<FONT color="green">978</FONT>       * &lt;/pre&gt;&lt;/blockquote&gt;<a name="line.978"></a>
<FONT color="green">979</FONT>       *<a name="line.979"></a>
<FONT color="green">980</FONT>       * @return  the string, converted to uppercase.<a name="line.980"></a>
<FONT color="green">981</FONT>       * @see     java.lang.Character#toUpperCase(char)<a name="line.981"></a>
<FONT color="green">982</FONT>       * @see     java.lang.String#toUpperCase(Locale)<a name="line.982"></a>
<FONT color="green">983</FONT>       */<a name="line.983"></a>
<FONT color="green">984</FONT>      public XMLString toUpperCase()<a name="line.984"></a>
<FONT color="green">985</FONT>      {<a name="line.985"></a>
<FONT color="green">986</FONT>        return new XString(str().toUpperCase());<a name="line.986"></a>
<FONT color="green">987</FONT>      }<a name="line.987"></a>
<FONT color="green">988</FONT>    <a name="line.988"></a>
<FONT color="green">989</FONT>      /**<a name="line.989"></a>
<FONT color="green">990</FONT>       * Removes white space from both ends of this string.<a name="line.990"></a>
<FONT color="green">991</FONT>       *<a name="line.991"></a>
<FONT color="green">992</FONT>       * @return  this string, with white space removed from the front and end.<a name="line.992"></a>
<FONT color="green">993</FONT>       */<a name="line.993"></a>
<FONT color="green">994</FONT>      public XMLString trim()<a name="line.994"></a>
<FONT color="green">995</FONT>      {<a name="line.995"></a>
<FONT color="green">996</FONT>        return new XString(str().trim());<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>       * Returns whether the specified &lt;var&gt;ch&lt;/var&gt; conforms to the XML 1.0 definition<a name="line.1000"></a>
<FONT color="green">1001</FONT>       * of whitespace.  Refer to &lt;A href="http://www.w3.org/TR/1998/REC-xml-19980210#NT-S"&gt;<a name="line.1001"></a>
<FONT color="green">1002</FONT>       * the definition of &lt;CODE&gt;S&lt;/CODE&gt;&lt;/A&gt; for details.<a name="line.1002"></a>
<FONT color="green">1003</FONT>       * @param   ch      Character to check as XML whitespace.<a name="line.1003"></a>
<FONT color="green">1004</FONT>       * @return          =true if &lt;var&gt;ch&lt;/var&gt; is XML whitespace; otherwise =false.<a name="line.1004"></a>
<FONT color="green">1005</FONT>       */<a name="line.1005"></a>
<FONT color="green">1006</FONT>      private static boolean isSpace(char ch)<a name="line.1006"></a>
<FONT color="green">1007</FONT>      {<a name="line.1007"></a>
<FONT color="green">1008</FONT>        return XMLCharacterRecognizer.isWhiteSpace(ch);  // Take the easy way out for now.<a name="line.1008"></a>
<FONT color="green">1009</FONT>      }<a name="line.1009"></a>
<FONT color="green">1010</FONT>    <a name="line.1010"></a>
<FONT color="green">1011</FONT>      /**<a name="line.1011"></a>
<FONT color="green">1012</FONT>       * Conditionally trim all leading and trailing whitespace in the specified String.<a name="line.1012"></a>
<FONT color="green">1013</FONT>       * All strings of white space are<a name="line.1013"></a>
<FONT color="green">1014</FONT>       * replaced by a single space character (#x20), except spaces after punctuation which<a name="line.1014"></a>
<FONT color="green">1015</FONT>       * receive double spaces if doublePunctuationSpaces is true.<a name="line.1015"></a>
<FONT color="green">1016</FONT>       * This function may be useful to a formatter, but to get first class<a name="line.1016"></a>
<FONT color="green">1017</FONT>       * results, the formatter should probably do it's own white space handling<a name="line.1017"></a>
<FONT color="green">1018</FONT>       * based on the semantics of the formatting object.<a name="line.1018"></a>
<FONT color="green">1019</FONT>       *<a name="line.1019"></a>
<FONT color="green">1020</FONT>       * @param   trimHead    Trim leading whitespace?<a name="line.1020"></a>
<FONT color="green">1021</FONT>       * @param   trimTail    Trim trailing whitespace?<a name="line.1021"></a>
<FONT color="green">1022</FONT>       * @param   doublePunctuationSpaces    Use double spaces for punctuation?<a name="line.1022"></a>
<FONT color="green">1023</FONT>       * @return              The trimmed string.<a name="line.1023"></a>
<FONT color="green">1024</FONT>       */<a name="line.1024"></a>
<FONT color="green">1025</FONT>      public XMLString fixWhiteSpace(boolean trimHead, boolean trimTail,<a name="line.1025"></a>
<FONT color="green">1026</FONT>                                     boolean doublePunctuationSpaces)<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>        // %OPT% !!!!!!!<a name="line.1029"></a>
<FONT color="green">1030</FONT>        int len = this.length();<a name="line.1030"></a>
<FONT color="green">1031</FONT>        char[] buf = new char[len];<a name="line.1031"></a>
<FONT color="green">1032</FONT>    <a name="line.1032"></a>
<FONT color="green">1033</FONT>        this.getChars(0, len, buf, 0);<a name="line.1033"></a>
<FONT color="green">1034</FONT>    <a name="line.1034"></a>
<FONT color="green">1035</FONT>        boolean edit = false;<a name="line.1035"></a>
<FONT color="green">1036</FONT>        int s;<a name="line.1036"></a>
<FONT color="green">1037</FONT>    <a name="line.1037"></a>
<FONT color="green">1038</FONT>        for (s = 0; s &lt; len; s++)<a name="line.1038"></a>
<FONT color="green">1039</FONT>        {<a name="line.1039"></a>
<FONT color="green">1040</FONT>          if (isSpace(buf[s]))<a name="line.1040"></a>
<FONT color="green">1041</FONT>          {<a name="line.1041"></a>
<FONT color="green">1042</FONT>            break;<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>        /* replace S to ' '. and ' '+ -&gt; single ' '. */<a name="line.1046"></a>
<FONT color="green">1047</FONT>        int d = s;<a name="line.1047"></a>
<FONT color="green">1048</FONT>        boolean pres = false;<a name="line.1048"></a>
<FONT color="green">1049</FONT>    <a name="line.1049"></a>
<FONT color="green">1050</FONT>        for (; s &lt; len; s++)<a name="line.1050"></a>
<FONT color="green">1051</FONT>        {<a name="line.1051"></a>
<FONT color="green">1052</FONT>          char c = buf[s];<a name="line.1052"></a>
<FONT color="green">1053</FONT>    <a name="line.1053"></a>
<FONT color="green">1054</FONT>          if (isSpace(c))<a name="line.1054"></a>
<FONT color="green">1055</FONT>          {<a name="line.1055"></a>
<FONT color="green">1056</FONT>            if (!pres)<a name="line.1056"></a>
<FONT color="green">1057</FONT>            {<a name="line.1057"></a>
<FONT color="green">1058</FONT>              if (' ' != c)<a name="line.1058"></a>
<FONT color="green">1059</FONT>              {<a name="line.1059"></a>
<FONT color="green">1060</FONT>                edit = true;<a name="line.1060"></a>
<FONT color="green">1061</FONT>              }<a name="line.1061"></a>
<FONT color="green">1062</FONT>    <a name="line.1062"></a>
<FONT color="green">1063</FONT>              buf[d++] = ' ';<a name="line.1063"></a>
<FONT color="green">1064</FONT>    <a name="line.1064"></a>
<FONT color="green">1065</FONT>              if (doublePunctuationSpaces &amp;&amp; (s != 0))<a name="line.1065"></a>
<FONT color="green">1066</FONT>              {<a name="line.1066"></a>
<FONT color="green">1067</FONT>                char prevChar = buf[s - 1];<a name="line.1067"></a>
<FONT color="green">1068</FONT>    <a name="line.1068"></a>
<FONT color="green">1069</FONT>                if (!((prevChar == '.') || (prevChar == '!')<a name="line.1069"></a>
<FONT color="green">1070</FONT>                      || (prevChar == '?')))<a name="line.1070"></a>
<FONT color="green">1071</FONT>                {<a name="line.1071"></a>
<FONT color="green">1072</FONT>                  pres = true;<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>              else<a name="line.1075"></a>
<FONT color="green">1076</FONT>              {<a name="line.1076"></a>
<FONT color="green">1077</FONT>                pres = true;<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>            else<a name="line.1080"></a>
<FONT color="green">1081</FONT>            {<a name="line.1081"></a>
<FONT color="green">1082</FONT>              edit = true;<a name="line.1082"></a>
<FONT color="green">1083</FONT>              pres = true;<a name="line.1083"></a>
<FONT color="green">1084</FONT>            }<a name="line.1084"></a>
<FONT color="green">1085</FONT>          }<a name="line.1085"></a>
<FONT color="green">1086</FONT>          else<a name="line.1086"></a>
<FONT color="green">1087</FONT>          {<a name="line.1087"></a>
<FONT color="green">1088</FONT>            buf[d++] = c;<a name="line.1088"></a>
<FONT color="green">1089</FONT>            pres = false;<a name="line.1089"></a>
<FONT color="green">1090</FONT>          }<a name="line.1090"></a>
<FONT color="green">1091</FONT>        }<a name="line.1091"></a>
<FONT color="green">1092</FONT>    <a name="line.1092"></a>
<FONT color="green">1093</FONT>        if (trimTail &amp;&amp; 1 &lt;= d &amp;&amp; ' ' == buf[d - 1])<a name="line.1093"></a>
<FONT color="green">1094</FONT>        {<a name="line.1094"></a>
<FONT color="green">1095</FONT>          edit = true;<a name="line.1095"></a>
<FONT color="green">1096</FONT>    <a name="line.1096"></a>
<FONT color="green">1097</FONT>          d--;<a name="line.1097"></a>
<FONT color="green">1098</FONT>        }<a name="line.1098"></a>
<FONT color="green">1099</FONT>    <a name="line.1099"></a>
<FONT color="green">1100</FONT>        int start = 0;<a name="line.1100"></a>
<FONT color="green">1101</FONT>    <a name="line.1101"></a>
<FONT color="green">1102</FONT>        if (trimHead &amp;&amp; 0 &lt; d &amp;&amp; ' ' == buf[0])<a name="line.1102"></a>
<FONT color="green">1103</FONT>        {<a name="line.1103"></a>
<FONT color="green">1104</FONT>          edit = true;<a name="line.1104"></a>
<FONT color="green">1105</FONT>    <a name="line.1105"></a>
<FONT color="green">1106</FONT>          start++;<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>        XMLStringFactory xsf = XMLStringFactoryImpl.getFactory();<a name="line.1109"></a>
<FONT color="green">1110</FONT>    <a name="line.1110"></a>
<FONT color="green">1111</FONT>        return edit ? xsf.newstr(new String(buf, start, d - start)) : this;<a name="line.1111"></a>
<FONT color="green">1112</FONT>      }<a name="line.1112"></a>
<FONT color="green">1113</FONT>      <a name="line.1113"></a>
<FONT color="green">1114</FONT>      /**<a name="line.1114"></a>
<FONT color="green">1115</FONT>       * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)<a name="line.1115"></a>
<FONT color="green">1116</FONT>       */<a name="line.1116"></a>
<FONT color="green">1117</FONT>      public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)<a name="line.1117"></a>
<FONT color="green">1118</FONT>      {<a name="line.1118"></a>
<FONT color="green">1119</FONT>            visitor.visitStringLiteral(owner, this);<a name="line.1119"></a>
<FONT color="green">1120</FONT>      }<a name="line.1120"></a>
<FONT color="green">1121</FONT>    <a name="line.1121"></a>
<FONT color="green">1122</FONT>    }<a name="line.1122"></a>




























































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