<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: Extensions.java 468639 2006-10-28 06:52:33Z minchau $<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    package org.apache.xalan.lib;<a name="line.21"></a>
<FONT color="green">022</FONT>    <a name="line.22"></a>
<FONT color="green">023</FONT>    import java.util.Hashtable;<a name="line.23"></a>
<FONT color="green">024</FONT>    import java.util.StringTokenizer;<a name="line.24"></a>
<FONT color="green">025</FONT>    <a name="line.25"></a>
<FONT color="green">026</FONT>    import javax.xml.parsers.DocumentBuilder;<a name="line.26"></a>
<FONT color="green">027</FONT>    import javax.xml.parsers.DocumentBuilderFactory;<a name="line.27"></a>
<FONT color="green">028</FONT>    import javax.xml.parsers.ParserConfigurationException;<a name="line.28"></a>
<FONT color="green">029</FONT>    <a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.xalan.extensions.ExpressionContext;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.xalan.xslt.EnvironmentCheck;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.xpath.NodeSet;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.xpath.objects.XBoolean;<a name="line.33"></a>
<FONT color="green">034</FONT>    import org.apache.xpath.objects.XNumber;<a name="line.34"></a>
<FONT color="green">035</FONT>    import org.apache.xpath.objects.XObject;<a name="line.35"></a>
<FONT color="green">036</FONT>    <a name="line.36"></a>
<FONT color="green">037</FONT>    import org.w3c.dom.Document;<a name="line.37"></a>
<FONT color="green">038</FONT>    import org.w3c.dom.DocumentFragment;<a name="line.38"></a>
<FONT color="green">039</FONT>    import org.w3c.dom.Node;<a name="line.39"></a>
<FONT color="green">040</FONT>    import org.w3c.dom.NodeList;<a name="line.40"></a>
<FONT color="green">041</FONT>    import org.w3c.dom.Text;<a name="line.41"></a>
<FONT color="green">042</FONT>    import org.w3c.dom.traversal.NodeIterator;<a name="line.42"></a>
<FONT color="green">043</FONT>    <a name="line.43"></a>
<FONT color="green">044</FONT>    import org.xml.sax.SAXNotSupportedException;<a name="line.44"></a>
<FONT color="green">045</FONT>    <a name="line.45"></a>
<FONT color="green">046</FONT>    /**<a name="line.46"></a>
<FONT color="green">047</FONT>     * This class contains many of the Xalan-supplied extensions.<a name="line.47"></a>
<FONT color="green">048</FONT>     * It is accessed by specifying a namespace URI as follows:<a name="line.48"></a>
<FONT color="green">049</FONT>     * &lt;pre&gt;<a name="line.49"></a>
<FONT color="green">050</FONT>     *    xmlns:xalan="http://xml.apache.org/xalan"<a name="line.50"></a>
<FONT color="green">051</FONT>     * &lt;/pre&gt;<a name="line.51"></a>
<FONT color="green">052</FONT>     * @xsl.usage general<a name="line.52"></a>
<FONT color="green">053</FONT>     */<a name="line.53"></a>
<FONT color="green">054</FONT>    public class Extensions<a name="line.54"></a>
<FONT color="green">055</FONT>    {<a name="line.55"></a>
<FONT color="green">056</FONT>      /**<a name="line.56"></a>
<FONT color="green">057</FONT>       * Constructor Extensions<a name="line.57"></a>
<FONT color="green">058</FONT>       *<a name="line.58"></a>
<FONT color="green">059</FONT>       */<a name="line.59"></a>
<FONT color="green">060</FONT>      private Extensions(){}  // Make sure class cannot be instantiated<a name="line.60"></a>
<FONT color="green">061</FONT>    <a name="line.61"></a>
<FONT color="green">062</FONT>      /**<a name="line.62"></a>
<FONT color="green">063</FONT>       * This method is an extension that implements as a Xalan extension<a name="line.63"></a>
<FONT color="green">064</FONT>       * the node-set function also found in xt and saxon.<a name="line.64"></a>
<FONT color="green">065</FONT>       * If the argument is a Result Tree Fragment, then &lt;code&gt;nodeset&lt;/code&gt;<a name="line.65"></a>
<FONT color="green">066</FONT>       * returns a node-set consisting of a single root node as described in<a name="line.66"></a>
<FONT color="green">067</FONT>       * section 11.1 of the XSLT 1.0 Recommendation.  If the argument is a<a name="line.67"></a>
<FONT color="green">068</FONT>       * node-set, &lt;code&gt;nodeset&lt;/code&gt; returns a node-set.  If the argument<a name="line.68"></a>
<FONT color="green">069</FONT>       * is a string, number, or boolean, then &lt;code&gt;nodeset&lt;/code&gt; returns<a name="line.69"></a>
<FONT color="green">070</FONT>       * a node-set consisting of a single root node with a single text node<a name="line.70"></a>
<FONT color="green">071</FONT>       * child that is the result of calling the XPath string() function on the<a name="line.71"></a>
<FONT color="green">072</FONT>       * passed parameter.  If the argument is anything else, then a node-set<a name="line.72"></a>
<FONT color="green">073</FONT>       * is returned consisting of a single root node with a single text node<a name="line.73"></a>
<FONT color="green">074</FONT>       * child that is the result of calling the java &lt;code&gt;toString()&lt;/code&gt;<a name="line.74"></a>
<FONT color="green">075</FONT>       * method on the passed argument.<a name="line.75"></a>
<FONT color="green">076</FONT>       * Most of the<a name="line.76"></a>
<FONT color="green">077</FONT>       * actual work here is done in &lt;code&gt;MethodResolver&lt;/code&gt; and<a name="line.77"></a>
<FONT color="green">078</FONT>       * &lt;code&gt;XRTreeFrag&lt;/code&gt;.<a name="line.78"></a>
<FONT color="green">079</FONT>       * @param myProcessor Context passed by the extension processor<a name="line.79"></a>
<FONT color="green">080</FONT>       * @param rtf Argument in the stylesheet to the nodeset extension function<a name="line.80"></a>
<FONT color="green">081</FONT>       *<a name="line.81"></a>
<FONT color="green">082</FONT>       * NEEDSDOC ($objectName$) @return<a name="line.82"></a>
<FONT color="green">083</FONT>       */<a name="line.83"></a>
<FONT color="green">084</FONT>      public static NodeSet nodeset(ExpressionContext myProcessor, Object rtf)<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>        String textNodeValue;<a name="line.87"></a>
<FONT color="green">088</FONT>    <a name="line.88"></a>
<FONT color="green">089</FONT>        if (rtf instanceof NodeIterator)<a name="line.89"></a>
<FONT color="green">090</FONT>        {<a name="line.90"></a>
<FONT color="green">091</FONT>          return new NodeSet((NodeIterator) rtf);<a name="line.91"></a>
<FONT color="green">092</FONT>        }<a name="line.92"></a>
<FONT color="green">093</FONT>        else<a name="line.93"></a>
<FONT color="green">094</FONT>        {<a name="line.94"></a>
<FONT color="green">095</FONT>          if (rtf instanceof String)<a name="line.95"></a>
<FONT color="green">096</FONT>          {<a name="line.96"></a>
<FONT color="green">097</FONT>            textNodeValue = (String) rtf;<a name="line.97"></a>
<FONT color="green">098</FONT>          }<a name="line.98"></a>
<FONT color="green">099</FONT>          else if (rtf instanceof Boolean)<a name="line.99"></a>
<FONT color="green">100</FONT>          {<a name="line.100"></a>
<FONT color="green">101</FONT>            textNodeValue = new XBoolean(((Boolean) rtf).booleanValue()).str();<a name="line.101"></a>
<FONT color="green">102</FONT>          }<a name="line.102"></a>
<FONT color="green">103</FONT>          else if (rtf instanceof Double)<a name="line.103"></a>
<FONT color="green">104</FONT>          {<a name="line.104"></a>
<FONT color="green">105</FONT>            textNodeValue = new XNumber(((Double) rtf).doubleValue()).str();<a name="line.105"></a>
<FONT color="green">106</FONT>          }<a name="line.106"></a>
<FONT color="green">107</FONT>          else<a name="line.107"></a>
<FONT color="green">108</FONT>          {<a name="line.108"></a>
<FONT color="green">109</FONT>            textNodeValue = rtf.toString();<a name="line.109"></a>
<FONT color="green">110</FONT>          }<a name="line.110"></a>
<FONT color="green">111</FONT>    <a name="line.111"></a>
<FONT color="green">112</FONT>          // This no longer will work right since the DTM.<a name="line.112"></a>
<FONT color="green">113</FONT>          // Document myDoc = myProcessor.getContextNode().getOwnerDocument();<a name="line.113"></a>
<FONT color="green">114</FONT>          try<a name="line.114"></a>
<FONT color="green">115</FONT>          {<a name="line.115"></a>
<FONT color="green">116</FONT>            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();<a name="line.116"></a>
<FONT color="green">117</FONT>            DocumentBuilder db = dbf.newDocumentBuilder();<a name="line.117"></a>
<FONT color="green">118</FONT>            Document myDoc = db.newDocument();<a name="line.118"></a>
<FONT color="green">119</FONT>            <a name="line.119"></a>
<FONT color="green">120</FONT>            Text textNode = myDoc.createTextNode(textNodeValue);<a name="line.120"></a>
<FONT color="green">121</FONT>            DocumentFragment docFrag = myDoc.createDocumentFragment();<a name="line.121"></a>
<FONT color="green">122</FONT>      <a name="line.122"></a>
<FONT color="green">123</FONT>            docFrag.appendChild(textNode);<a name="line.123"></a>
<FONT color="green">124</FONT>      <a name="line.124"></a>
<FONT color="green">125</FONT>            return new NodeSet(docFrag);<a name="line.125"></a>
<FONT color="green">126</FONT>          }<a name="line.126"></a>
<FONT color="green">127</FONT>          catch(ParserConfigurationException pce)<a name="line.127"></a>
<FONT color="green">128</FONT>          {<a name="line.128"></a>
<FONT color="green">129</FONT>            throw new org.apache.xml.utils.WrappedRuntimeException(pce);<a name="line.129"></a>
<FONT color="green">130</FONT>          }<a name="line.130"></a>
<FONT color="green">131</FONT>        }<a name="line.131"></a>
<FONT color="green">132</FONT>      }<a name="line.132"></a>
<FONT color="green">133</FONT>    <a name="line.133"></a>
<FONT color="green">134</FONT>      /**<a name="line.134"></a>
<FONT color="green">135</FONT>       * Returns the intersection of two node-sets.<a name="line.135"></a>
<FONT color="green">136</FONT>       * <a name="line.136"></a>
<FONT color="green">137</FONT>       * @param nl1 NodeList for first node-set<a name="line.137"></a>
<FONT color="green">138</FONT>       * @param nl2 NodeList for second node-set<a name="line.138"></a>
<FONT color="green">139</FONT>       * @return a NodeList containing the nodes in nl1 that are also in nl2<a name="line.139"></a>
<FONT color="green">140</FONT>       *<a name="line.140"></a>
<FONT color="green">141</FONT>       * Note: The usage of this extension function in the xalan namespace <a name="line.141"></a>
<FONT color="green">142</FONT>       * is deprecated. Please use the same function in the EXSLT sets extension<a name="line.142"></a>
<FONT color="green">143</FONT>       * (http://exslt.org/sets).<a name="line.143"></a>
<FONT color="green">144</FONT>       */<a name="line.144"></a>
<FONT color="green">145</FONT>      public static NodeList intersection(NodeList nl1, NodeList nl2)<a name="line.145"></a>
<FONT color="green">146</FONT>      {<a name="line.146"></a>
<FONT color="green">147</FONT>        return ExsltSets.intersection(nl1, nl2);<a name="line.147"></a>
<FONT color="green">148</FONT>      }<a name="line.148"></a>
<FONT color="green">149</FONT>    <a name="line.149"></a>
<FONT color="green">150</FONT>      /**<a name="line.150"></a>
<FONT color="green">151</FONT>       * Returns the difference between two node-sets.<a name="line.151"></a>
<FONT color="green">152</FONT>       * <a name="line.152"></a>
<FONT color="green">153</FONT>       * @param nl1 NodeList for first node-set<a name="line.153"></a>
<FONT color="green">154</FONT>       * @param nl2 NodeList for second node-set<a name="line.154"></a>
<FONT color="green">155</FONT>       * @return a NodeList containing the nodes in nl1 that are not in nl2<a name="line.155"></a>
<FONT color="green">156</FONT>       * <a name="line.156"></a>
<FONT color="green">157</FONT>       * Note: The usage of this extension function in the xalan namespace <a name="line.157"></a>
<FONT color="green">158</FONT>       * is deprecated. Please use the same function in the EXSLT sets extension<a name="line.158"></a>
<FONT color="green">159</FONT>       * (http://exslt.org/sets).<a name="line.159"></a>
<FONT color="green">160</FONT>       */<a name="line.160"></a>
<FONT color="green">161</FONT>      public static NodeList difference(NodeList nl1, NodeList nl2)<a name="line.161"></a>
<FONT color="green">162</FONT>      {<a name="line.162"></a>
<FONT color="green">163</FONT>        return ExsltSets.difference(nl1, nl2);<a name="line.163"></a>
<FONT color="green">164</FONT>      }<a name="line.164"></a>
<FONT color="green">165</FONT>    <a name="line.165"></a>
<FONT color="green">166</FONT>      /**<a name="line.166"></a>
<FONT color="green">167</FONT>       * Returns node-set containing distinct string values.<a name="line.167"></a>
<FONT color="green">168</FONT>       *<a name="line.168"></a>
<FONT color="green">169</FONT>       * @param nl NodeList for node-set<a name="line.169"></a>
<FONT color="green">170</FONT>       * @return a NodeList with nodes from nl containing distinct string values.<a name="line.170"></a>
<FONT color="green">171</FONT>       * In other words, if more than one node in nl contains the same string value,<a name="line.171"></a>
<FONT color="green">172</FONT>       * only include the first such node found.<a name="line.172"></a>
<FONT color="green">173</FONT>       *<a name="line.173"></a>
<FONT color="green">174</FONT>       * Note: The usage of this extension function in the xalan namespace <a name="line.174"></a>
<FONT color="green">175</FONT>       * is deprecated. Please use the same function in the EXSLT sets extension<a name="line.175"></a>
<FONT color="green">176</FONT>       * (http://exslt.org/sets).<a name="line.176"></a>
<FONT color="green">177</FONT>       */<a name="line.177"></a>
<FONT color="green">178</FONT>      public static NodeList distinct(NodeList nl)<a name="line.178"></a>
<FONT color="green">179</FONT>      {<a name="line.179"></a>
<FONT color="green">180</FONT>        return ExsltSets.distinct(nl);<a name="line.180"></a>
<FONT color="green">181</FONT>      }<a name="line.181"></a>
<FONT color="green">182</FONT>    <a name="line.182"></a>
<FONT color="green">183</FONT>      /**<a name="line.183"></a>
<FONT color="green">184</FONT>       * Returns true if both node-sets contain the same set of nodes.<a name="line.184"></a>
<FONT color="green">185</FONT>       *<a name="line.185"></a>
<FONT color="green">186</FONT>       * @param nl1 NodeList for first node-set<a name="line.186"></a>
<FONT color="green">187</FONT>       * @param nl2 NodeList for second node-set<a name="line.187"></a>
<FONT color="green">188</FONT>       * @return true if nl1 and nl2 contain exactly the same set of nodes.<a name="line.188"></a>
<FONT color="green">189</FONT>       */<a name="line.189"></a>
<FONT color="green">190</FONT>      public static boolean hasSameNodes(NodeList nl1, NodeList nl2)<a name="line.190"></a>
<FONT color="green">191</FONT>      {<a name="line.191"></a>
<FONT color="green">192</FONT>    <a name="line.192"></a>
<FONT color="green">193</FONT>        NodeSet ns1 = new NodeSet(nl1);<a name="line.193"></a>
<FONT color="green">194</FONT>        NodeSet ns2 = new NodeSet(nl2);<a name="line.194"></a>
<FONT color="green">195</FONT>    <a name="line.195"></a>
<FONT color="green">196</FONT>        if (ns1.getLength() != ns2.getLength())<a name="line.196"></a>
<FONT color="green">197</FONT>          return false;<a name="line.197"></a>
<FONT color="green">198</FONT>    <a name="line.198"></a>
<FONT color="green">199</FONT>        for (int i = 0; i &lt; ns1.getLength(); i++)<a name="line.199"></a>
<FONT color="green">200</FONT>        {<a name="line.200"></a>
<FONT color="green">201</FONT>          Node n = ns1.elementAt(i);<a name="line.201"></a>
<FONT color="green">202</FONT>    <a name="line.202"></a>
<FONT color="green">203</FONT>          if (!ns2.contains(n))<a name="line.203"></a>
<FONT color="green">204</FONT>            return false;<a name="line.204"></a>
<FONT color="green">205</FONT>        }<a name="line.205"></a>
<FONT color="green">206</FONT>    <a name="line.206"></a>
<FONT color="green">207</FONT>        return true;<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>      /**<a name="line.210"></a>
<FONT color="green">211</FONT>       * Returns the result of evaluating the argument as a string containing<a name="line.211"></a>
<FONT color="green">212</FONT>       * an XPath expression.  Used where the XPath expression is not known until<a name="line.212"></a>
<FONT color="green">213</FONT>       * run-time.  The expression is evaluated as if the run-time value of the<a name="line.213"></a>
<FONT color="green">214</FONT>       * argument appeared in place of the evaluate function call at compile time.<a name="line.214"></a>
<FONT color="green">215</FONT>       *<a name="line.215"></a>
<FONT color="green">216</FONT>       * @param myContext an &lt;code&gt;ExpressionContext&lt;/code&gt; passed in by the<a name="line.216"></a>
<FONT color="green">217</FONT>       *                  extension mechanism.  This must be an XPathContext.<a name="line.217"></a>
<FONT color="green">218</FONT>       * @param xpathExpr The XPath expression to be evaluated.<a name="line.218"></a>
<FONT color="green">219</FONT>       * @return the XObject resulting from evaluating the XPath<a name="line.219"></a>
<FONT color="green">220</FONT>       *<a name="line.220"></a>
<FONT color="green">221</FONT>       * @throws SAXNotSupportedException<a name="line.221"></a>
<FONT color="green">222</FONT>       *<a name="line.222"></a>
<FONT color="green">223</FONT>       * Note: The usage of this extension function in the xalan namespace <a name="line.223"></a>
<FONT color="green">224</FONT>       * is deprecated. Please use the same function in the EXSLT dynamic extension<a name="line.224"></a>
<FONT color="green">225</FONT>       * (http://exslt.org/dynamic).<a name="line.225"></a>
<FONT color="green">226</FONT>       */<a name="line.226"></a>
<FONT color="green">227</FONT>      public static XObject evaluate(ExpressionContext myContext, String xpathExpr)<a name="line.227"></a>
<FONT color="green">228</FONT>             throws SAXNotSupportedException<a name="line.228"></a>
<FONT color="green">229</FONT>      {<a name="line.229"></a>
<FONT color="green">230</FONT>        return ExsltDynamic.evaluate(myContext, xpathExpr);<a name="line.230"></a>
<FONT color="green">231</FONT>      }<a name="line.231"></a>
<FONT color="green">232</FONT>    <a name="line.232"></a>
<FONT color="green">233</FONT>      /**<a name="line.233"></a>
<FONT color="green">234</FONT>       * Returns a NodeSet containing one text node for each token in the first argument.<a name="line.234"></a>
<FONT color="green">235</FONT>       * Delimiters are specified in the second argument.<a name="line.235"></a>
<FONT color="green">236</FONT>       * Tokens are determined by a call to &lt;code&gt;StringTokenizer&lt;/code&gt;.<a name="line.236"></a>
<FONT color="green">237</FONT>       * If the first argument is an empty string or contains only delimiters, the result<a name="line.237"></a>
<FONT color="green">238</FONT>       * will be an empty NodeSet.<a name="line.238"></a>
<FONT color="green">239</FONT>       *<a name="line.239"></a>
<FONT color="green">240</FONT>       * Contributed to XalanJ1 by &lt;a href="mailto:benoit.cerrina@writeme.com"&gt;Benoit Cerrina&lt;/a&gt;.<a name="line.240"></a>
<FONT color="green">241</FONT>       * <a name="line.241"></a>
<FONT color="green">242</FONT>       * @param toTokenize The string to be split into text tokens.<a name="line.242"></a>
<FONT color="green">243</FONT>       * @param delims The delimiters to use.<a name="line.243"></a>
<FONT color="green">244</FONT>       * @return a NodeSet as described above.<a name="line.244"></a>
<FONT color="green">245</FONT>       */<a name="line.245"></a>
<FONT color="green">246</FONT>      public static NodeList tokenize(String toTokenize, String delims)<a name="line.246"></a>
<FONT color="green">247</FONT>      {<a name="line.247"></a>
<FONT color="green">248</FONT>    <a name="line.248"></a>
<FONT color="green">249</FONT>        Document doc = DocumentHolder.m_doc;<a name="line.249"></a>
<FONT color="green">250</FONT>    <a name="line.250"></a>
<FONT color="green">251</FONT>    <a name="line.251"></a>
<FONT color="green">252</FONT>        StringTokenizer lTokenizer = new StringTokenizer(toTokenize, delims);<a name="line.252"></a>
<FONT color="green">253</FONT>        NodeSet resultSet = new NodeSet();<a name="line.253"></a>
<FONT color="green">254</FONT>    <a name="line.254"></a>
<FONT color="green">255</FONT>        synchronized (doc)<a name="line.255"></a>
<FONT color="green">256</FONT>        {<a name="line.256"></a>
<FONT color="green">257</FONT>          while (lTokenizer.hasMoreTokens())<a name="line.257"></a>
<FONT color="green">258</FONT>          {<a name="line.258"></a>
<FONT color="green">259</FONT>            resultSet.addNode(doc.createTextNode(lTokenizer.nextToken()));<a name="line.259"></a>
<FONT color="green">260</FONT>          }<a name="line.260"></a>
<FONT color="green">261</FONT>        }<a name="line.261"></a>
<FONT color="green">262</FONT>    <a name="line.262"></a>
<FONT color="green">263</FONT>        return resultSet;<a name="line.263"></a>
<FONT color="green">264</FONT>      }<a name="line.264"></a>
<FONT color="green">265</FONT>    <a name="line.265"></a>
<FONT color="green">266</FONT>      /**<a name="line.266"></a>
<FONT color="green">267</FONT>       * Returns a NodeSet containing one text node for each token in the first argument.<a name="line.267"></a>
<FONT color="green">268</FONT>       * Delimiters are whitespace.  That is, the delimiters that are used are tab (&amp;#x09),<a name="line.268"></a>
<FONT color="green">269</FONT>       * linefeed (&amp;#x0A), return (&amp;#x0D), and space (&amp;#x20).<a name="line.269"></a>
<FONT color="green">270</FONT>       * Tokens are determined by a call to &lt;code&gt;StringTokenizer&lt;/code&gt;.<a name="line.270"></a>
<FONT color="green">271</FONT>       * If the first argument is an empty string or contains only delimiters, the result<a name="line.271"></a>
<FONT color="green">272</FONT>       * will be an empty NodeSet.<a name="line.272"></a>
<FONT color="green">273</FONT>       *<a name="line.273"></a>
<FONT color="green">274</FONT>       * Contributed to XalanJ1 by &lt;a href="mailto:benoit.cerrina@writeme.com"&gt;Benoit Cerrina&lt;/a&gt;.<a name="line.274"></a>
<FONT color="green">275</FONT>       * <a name="line.275"></a>
<FONT color="green">276</FONT>       * @param toTokenize The string to be split into text tokens.<a name="line.276"></a>
<FONT color="green">277</FONT>       * @return a NodeSet as described above.<a name="line.277"></a>
<FONT color="green">278</FONT>       */<a name="line.278"></a>
<FONT color="green">279</FONT>      public static NodeList tokenize(String toTokenize)<a name="line.279"></a>
<FONT color="green">280</FONT>      {<a name="line.280"></a>
<FONT color="green">281</FONT>        return tokenize(toTokenize, " \t\n\r");<a name="line.281"></a>
<FONT color="green">282</FONT>      }<a name="line.282"></a>
<FONT color="green">283</FONT>    <a name="line.283"></a>
<FONT color="green">284</FONT>      /**<a name="line.284"></a>
<FONT color="green">285</FONT>       * Return a Node of basic debugging information from the <a name="line.285"></a>
<FONT color="green">286</FONT>       * EnvironmentCheck utility about the Java environment.<a name="line.286"></a>
<FONT color="green">287</FONT>       *<a name="line.287"></a>
<FONT color="green">288</FONT>       * &lt;p&gt;Simply calls the {@link org.apache.xalan.xslt.EnvironmentCheck}<a name="line.288"></a>
<FONT color="green">289</FONT>       * utility to grab info about the Java environment and CLASSPATH, <a name="line.289"></a>
<FONT color="green">290</FONT>       * etc., and then returns the resulting Node.  Stylesheets can <a name="line.290"></a>
<FONT color="green">291</FONT>       * then maniuplate this data or simply xsl:copy-of the Node.  Note <a name="line.291"></a>
<FONT color="green">292</FONT>       * that we first attempt to load the more advanced <a name="line.292"></a>
<FONT color="green">293</FONT>       * org.apache.env.Which utility by reflection; only if that fails <a name="line.293"></a>
<FONT color="green">294</FONT>       * to we still use the internal version.  Which is available from <a name="line.294"></a>
<FONT color="green">295</FONT>       * &lt;a href="http://xml.apache.org/commons/"&gt;http://xml.apache.org/commons/&lt;/a&gt;.&lt;/p&gt;<a name="line.295"></a>
<FONT color="green">296</FONT>       *<a name="line.296"></a>
<FONT color="green">297</FONT>       * &lt;p&gt;We throw a WrappedRuntimeException in the unlikely case <a name="line.297"></a>
<FONT color="green">298</FONT>       * that reading information from the environment throws us an <a name="line.298"></a>
<FONT color="green">299</FONT>       * exception. (Is this really the best thing to do?)&lt;/p&gt;<a name="line.299"></a>
<FONT color="green">300</FONT>       *<a name="line.300"></a>
<FONT color="green">301</FONT>       * @param myContext an &lt;code&gt;ExpressionContext&lt;/code&gt; passed in by the<a name="line.301"></a>
<FONT color="green">302</FONT>       *                  extension mechanism.  This must be an XPathContext.<a name="line.302"></a>
<FONT color="green">303</FONT>       * @return a Node as described above.<a name="line.303"></a>
<FONT color="green">304</FONT>       */<a name="line.304"></a>
<FONT color="green">305</FONT>      public static Node checkEnvironment(ExpressionContext myContext)<a name="line.305"></a>
<FONT color="green">306</FONT>      {<a name="line.306"></a>
<FONT color="green">307</FONT>    <a name="line.307"></a>
<FONT color="green">308</FONT>        Document factoryDocument;<a name="line.308"></a>
<FONT color="green">309</FONT>        try<a name="line.309"></a>
<FONT color="green">310</FONT>        {<a name="line.310"></a>
<FONT color="green">311</FONT>          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();<a name="line.311"></a>
<FONT color="green">312</FONT>          DocumentBuilder db = dbf.newDocumentBuilder();<a name="line.312"></a>
<FONT color="green">313</FONT>          factoryDocument = db.newDocument();<a name="line.313"></a>
<FONT color="green">314</FONT>        }<a name="line.314"></a>
<FONT color="green">315</FONT>        catch(ParserConfigurationException pce)<a name="line.315"></a>
<FONT color="green">316</FONT>        {<a name="line.316"></a>
<FONT color="green">317</FONT>          throw new org.apache.xml.utils.WrappedRuntimeException(pce);<a name="line.317"></a>
<FONT color="green">318</FONT>        }<a name="line.318"></a>
<FONT color="green">319</FONT>    <a name="line.319"></a>
<FONT color="green">320</FONT>        Node resultNode = null;<a name="line.320"></a>
<FONT color="green">321</FONT>        try<a name="line.321"></a>
<FONT color="green">322</FONT>        {<a name="line.322"></a>
<FONT color="green">323</FONT>          // First use reflection to try to load Which, which is a <a name="line.323"></a>
<FONT color="green">324</FONT>          //  better version of EnvironmentCheck<a name="line.324"></a>
<FONT color="green">325</FONT>          resultNode = checkEnvironmentUsingWhich(myContext, factoryDocument);<a name="line.325"></a>
<FONT color="green">326</FONT>    <a name="line.326"></a>
<FONT color="green">327</FONT>          if (null != resultNode)<a name="line.327"></a>
<FONT color="green">328</FONT>            return resultNode;<a name="line.328"></a>
<FONT color="green">329</FONT>    <a name="line.329"></a>
<FONT color="green">330</FONT>          // If reflection failed, fallback to our internal EnvironmentCheck<a name="line.330"></a>
<FONT color="green">331</FONT>          EnvironmentCheck envChecker = new EnvironmentCheck();<a name="line.331"></a>
<FONT color="green">332</FONT>          Hashtable h = envChecker.getEnvironmentHash();<a name="line.332"></a>
<FONT color="green">333</FONT>          resultNode = factoryDocument.createElement("checkEnvironmentExtension");<a name="line.333"></a>
<FONT color="green">334</FONT>          envChecker.appendEnvironmentReport(resultNode, factoryDocument, h);<a name="line.334"></a>
<FONT color="green">335</FONT>          envChecker = null;<a name="line.335"></a>
<FONT color="green">336</FONT>        }<a name="line.336"></a>
<FONT color="green">337</FONT>        catch(Exception e)<a name="line.337"></a>
<FONT color="green">338</FONT>        {<a name="line.338"></a>
<FONT color="green">339</FONT>          throw new org.apache.xml.utils.WrappedRuntimeException(e);<a name="line.339"></a>
<FONT color="green">340</FONT>        }<a name="line.340"></a>
<FONT color="green">341</FONT>    <a name="line.341"></a>
<FONT color="green">342</FONT>        return resultNode;<a name="line.342"></a>
<FONT color="green">343</FONT>      }<a name="line.343"></a>
<FONT color="green">344</FONT>    <a name="line.344"></a>
<FONT color="green">345</FONT>      /**<a name="line.345"></a>
<FONT color="green">346</FONT>       * Private worker method to attempt to use org.apache.env.Which.<a name="line.346"></a>
<FONT color="green">347</FONT>       *<a name="line.347"></a>
<FONT color="green">348</FONT>       * @param myContext an &lt;code&gt;ExpressionContext&lt;/code&gt; passed in by the<a name="line.348"></a>
<FONT color="green">349</FONT>       *                  extension mechanism.  This must be an XPathContext.<a name="line.349"></a>
<FONT color="green">350</FONT>       * @param factoryDocument providing createElement services, etc.<a name="line.350"></a>
<FONT color="green">351</FONT>       * @return a Node with environment info; null if any error<a name="line.351"></a>
<FONT color="green">352</FONT>       */<a name="line.352"></a>
<FONT color="green">353</FONT>      private static Node checkEnvironmentUsingWhich(ExpressionContext myContext, <a name="line.353"></a>
<FONT color="green">354</FONT>            Document factoryDocument)<a name="line.354"></a>
<FONT color="green">355</FONT>      {<a name="line.355"></a>
<FONT color="green">356</FONT>        final String WHICH_CLASSNAME = "org.apache.env.Which";<a name="line.356"></a>
<FONT color="green">357</FONT>        final String WHICH_METHODNAME = "which";<a name="line.357"></a>
<FONT color="green">358</FONT>        final Class WHICH_METHOD_ARGS[] = { java.util.Hashtable.class,<a name="line.358"></a>
<FONT color="green">359</FONT>                                            java.lang.String.class,<a name="line.359"></a>
<FONT color="green">360</FONT>                                            java.lang.String.class };<a name="line.360"></a>
<FONT color="green">361</FONT>        try<a name="line.361"></a>
<FONT color="green">362</FONT>        {<a name="line.362"></a>
<FONT color="green">363</FONT>          // Use reflection to try to find xml-commons utility 'Which'<a name="line.363"></a>
<FONT color="green">364</FONT>          Class clazz = ObjectFactory.findProviderClass(<a name="line.364"></a>
<FONT color="green">365</FONT>            WHICH_CLASSNAME, ObjectFactory.findClassLoader(), true);<a name="line.365"></a>
<FONT color="green">366</FONT>          if (null == clazz)<a name="line.366"></a>
<FONT color="green">367</FONT>            return null;<a name="line.367"></a>
<FONT color="green">368</FONT>            <a name="line.368"></a>
<FONT color="green">369</FONT>          // Fully qualify names since this is the only method they're used in<a name="line.369"></a>
<FONT color="green">370</FONT>          java.lang.reflect.Method method = clazz.getMethod(WHICH_METHODNAME, WHICH_METHOD_ARGS);<a name="line.370"></a>
<FONT color="green">371</FONT>          Hashtable report = new Hashtable();<a name="line.371"></a>
<FONT color="green">372</FONT>    <a name="line.372"></a>
<FONT color="green">373</FONT>          // Call the method with our Hashtable, common options, and ignore return value<a name="line.373"></a>
<FONT color="green">374</FONT>          Object[] methodArgs = { report, "XmlCommons;Xalan;Xerces;Crimson;Ant", "" };<a name="line.374"></a>
<FONT color="green">375</FONT>          Object returnValue = method.invoke(null, methodArgs);<a name="line.375"></a>
<FONT color="green">376</FONT>    <a name="line.376"></a>
<FONT color="green">377</FONT>          // Create a parent to hold the report and append hash to it<a name="line.377"></a>
<FONT color="green">378</FONT>          Node resultNode = factoryDocument.createElement("checkEnvironmentExtension");<a name="line.378"></a>
<FONT color="green">379</FONT>          org.apache.xml.utils.Hashtree2Node.appendHashToNode(report, "whichReport", <a name="line.379"></a>
<FONT color="green">380</FONT>                resultNode, factoryDocument);<a name="line.380"></a>
<FONT color="green">381</FONT>    <a name="line.381"></a>
<FONT color="green">382</FONT>          return resultNode;<a name="line.382"></a>
<FONT color="green">383</FONT>        }<a name="line.383"></a>
<FONT color="green">384</FONT>        catch (Throwable t)<a name="line.384"></a>
<FONT color="green">385</FONT>        {<a name="line.385"></a>
<FONT color="green">386</FONT>          // Simply return null; no need to report error<a name="line.386"></a>
<FONT color="green">387</FONT>          return null;<a name="line.387"></a>
<FONT color="green">388</FONT>        }<a name="line.388"></a>
<FONT color="green">389</FONT>      }<a name="line.389"></a>
<FONT color="green">390</FONT>      <a name="line.390"></a>
<FONT color="green">391</FONT>        /**<a name="line.391"></a>
<FONT color="green">392</FONT>         * This class is not loaded until first referenced (see Java Language<a name="line.392"></a>
<FONT color="green">393</FONT>         * Specification by Gosling/Joy/Steele, section 12.4.1)<a name="line.393"></a>
<FONT color="green">394</FONT>         *<a name="line.394"></a>
<FONT color="green">395</FONT>         * The static members are created when this class is first referenced, as a<a name="line.395"></a>
<FONT color="green">396</FONT>         * lazy initialization not needing checking against null or any<a name="line.396"></a>
<FONT color="green">397</FONT>         * synchronization.<a name="line.397"></a>
<FONT color="green">398</FONT>         *<a name="line.398"></a>
<FONT color="green">399</FONT>         */<a name="line.399"></a>
<FONT color="green">400</FONT>        private static class DocumentHolder<a name="line.400"></a>
<FONT color="green">401</FONT>        {<a name="line.401"></a>
<FONT color="green">402</FONT>            // Reuse the Document object to reduce memory usage.<a name="line.402"></a>
<FONT color="green">403</FONT>            private static final Document m_doc;<a name="line.403"></a>
<FONT color="green">404</FONT>            static <a name="line.404"></a>
<FONT color="green">405</FONT>            {<a name="line.405"></a>
<FONT color="green">406</FONT>                try<a name="line.406"></a>
<FONT color="green">407</FONT>                {<a name="line.407"></a>
<FONT color="green">408</FONT>                    m_doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();<a name="line.408"></a>
<FONT color="green">409</FONT>                }<a name="line.409"></a>
<FONT color="green">410</FONT>    <a name="line.410"></a>
<FONT color="green">411</FONT>                catch(ParserConfigurationException pce)<a name="line.411"></a>
<FONT color="green">412</FONT>                {<a name="line.412"></a>
<FONT color="green">413</FONT>                      throw new org.apache.xml.utils.WrappedRuntimeException(pce);<a name="line.413"></a>
<FONT color="green">414</FONT>                }<a name="line.414"></a>
<FONT color="green">415</FONT>    <a name="line.415"></a>
<FONT color="green">416</FONT>            }<a name="line.416"></a>
<FONT color="green">417</FONT>        }  <a name="line.417"></a>
<FONT color="green">418</FONT>    }<a name="line.418"></a>




























































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