<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: SystemIDResolver.java 468655 2006-10-28 07:12:06Z minchau $<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    package org.apache.xml.utils;<a name="line.21"></a>
<FONT color="green">022</FONT>    <a name="line.22"></a>
<FONT color="green">023</FONT>    import java.io.File;<a name="line.23"></a>
<FONT color="green">024</FONT>    <a name="line.24"></a>
<FONT color="green">025</FONT>    import javax.xml.transform.TransformerException;<a name="line.25"></a>
<FONT color="green">026</FONT>    <a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.xml.utils.URI.MalformedURIException;<a name="line.27"></a>
<FONT color="green">028</FONT>    <a name="line.28"></a>
<FONT color="green">029</FONT>    /**<a name="line.29"></a>
<FONT color="green">030</FONT>     * This class is used to resolve relative URIs and SystemID <a name="line.30"></a>
<FONT color="green">031</FONT>     * strings into absolute URIs.<a name="line.31"></a>
<FONT color="green">032</FONT>     *<a name="line.32"></a>
<FONT color="green">033</FONT>     * &lt;p&gt;This is a generic utility for resolving URIs, other than the <a name="line.33"></a>
<FONT color="green">034</FONT>     * fact that it's declared to throw TransformerException.  Please <a name="line.34"></a>
<FONT color="green">035</FONT>     * see code comments for details on how resolution is performed.&lt;/p&gt;<a name="line.35"></a>
<FONT color="green">036</FONT>     * @xsl.usage internal<a name="line.36"></a>
<FONT color="green">037</FONT>     */<a name="line.37"></a>
<FONT color="green">038</FONT>    public class SystemIDResolver<a name="line.38"></a>
<FONT color="green">039</FONT>    {<a name="line.39"></a>
<FONT color="green">040</FONT>    <a name="line.40"></a>
<FONT color="green">041</FONT>      /**<a name="line.41"></a>
<FONT color="green">042</FONT>       * Get an absolute URI from a given relative URI (local path). <a name="line.42"></a>
<FONT color="green">043</FONT>       * <a name="line.43"></a>
<FONT color="green">044</FONT>       * &lt;p&gt;The relative URI is a local filesystem path. The path can be<a name="line.44"></a>
<FONT color="green">045</FONT>       * absolute or relative. If it is a relative path, it is resolved relative <a name="line.45"></a>
<FONT color="green">046</FONT>       * to the system property "user.dir" if it is available; if not (i.e. in an <a name="line.46"></a>
<FONT color="green">047</FONT>       * Applet perhaps which throws SecurityException) then we just return the<a name="line.47"></a>
<FONT color="green">048</FONT>       * relative path. The space and backslash characters are also replaced to<a name="line.48"></a>
<FONT color="green">049</FONT>       * generate a good absolute URI.&lt;/p&gt;<a name="line.49"></a>
<FONT color="green">050</FONT>       *<a name="line.50"></a>
<FONT color="green">051</FONT>       * @param localPath The relative URI to resolve<a name="line.51"></a>
<FONT color="green">052</FONT>       *<a name="line.52"></a>
<FONT color="green">053</FONT>       * @return Resolved absolute URI<a name="line.53"></a>
<FONT color="green">054</FONT>       */<a name="line.54"></a>
<FONT color="green">055</FONT>      public static String getAbsoluteURIFromRelative(String localPath)<a name="line.55"></a>
<FONT color="green">056</FONT>      {<a name="line.56"></a>
<FONT color="green">057</FONT>        if (localPath == null || localPath.length() == 0)<a name="line.57"></a>
<FONT color="green">058</FONT>          return "";<a name="line.58"></a>
<FONT color="green">059</FONT>          <a name="line.59"></a>
<FONT color="green">060</FONT>        // If the local path is a relative path, then it is resolved against<a name="line.60"></a>
<FONT color="green">061</FONT>        // the "user.dir" system property.<a name="line.61"></a>
<FONT color="green">062</FONT>        String absolutePath = localPath;<a name="line.62"></a>
<FONT color="green">063</FONT>        if (!isAbsolutePath(localPath))<a name="line.63"></a>
<FONT color="green">064</FONT>        {<a name="line.64"></a>
<FONT color="green">065</FONT>          try <a name="line.65"></a>
<FONT color="green">066</FONT>          {<a name="line.66"></a>
<FONT color="green">067</FONT>            absolutePath = getAbsolutePathFromRelativePath(localPath);<a name="line.67"></a>
<FONT color="green">068</FONT>          }<a name="line.68"></a>
<FONT color="green">069</FONT>          // user.dir not accessible from applet<a name="line.69"></a>
<FONT color="green">070</FONT>          catch (SecurityException se) <a name="line.70"></a>
<FONT color="green">071</FONT>          {<a name="line.71"></a>
<FONT color="green">072</FONT>            return "file:" + localPath;<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>        String urlString;<a name="line.76"></a>
<FONT color="green">077</FONT>        if (null != absolutePath)<a name="line.77"></a>
<FONT color="green">078</FONT>        {<a name="line.78"></a>
<FONT color="green">079</FONT>          if (absolutePath.startsWith(File.separator))<a name="line.79"></a>
<FONT color="green">080</FONT>            urlString = "file://" + absolutePath;<a name="line.80"></a>
<FONT color="green">081</FONT>          else<a name="line.81"></a>
<FONT color="green">082</FONT>            urlString = "file:///" + absolutePath;        <a name="line.82"></a>
<FONT color="green">083</FONT>        }<a name="line.83"></a>
<FONT color="green">084</FONT>        else<a name="line.84"></a>
<FONT color="green">085</FONT>          urlString = "file:" + localPath;<a name="line.85"></a>
<FONT color="green">086</FONT>        <a name="line.86"></a>
<FONT color="green">087</FONT>        return replaceChars(urlString);<a name="line.87"></a>
<FONT color="green">088</FONT>      }<a name="line.88"></a>
<FONT color="green">089</FONT>      <a name="line.89"></a>
<FONT color="green">090</FONT>      /**<a name="line.90"></a>
<FONT color="green">091</FONT>       * Return an absolute path from a relative path.<a name="line.91"></a>
<FONT color="green">092</FONT>       *<a name="line.92"></a>
<FONT color="green">093</FONT>       * @param relativePath A relative path<a name="line.93"></a>
<FONT color="green">094</FONT>       * @return The absolute path<a name="line.94"></a>
<FONT color="green">095</FONT>       */<a name="line.95"></a>
<FONT color="green">096</FONT>      private static String getAbsolutePathFromRelativePath(String relativePath)<a name="line.96"></a>
<FONT color="green">097</FONT>      {<a name="line.97"></a>
<FONT color="green">098</FONT>        return new File(relativePath).getAbsolutePath();<a name="line.98"></a>
<FONT color="green">099</FONT>      }<a name="line.99"></a>
<FONT color="green">100</FONT>      <a name="line.100"></a>
<FONT color="green">101</FONT>      /**<a name="line.101"></a>
<FONT color="green">102</FONT>       * Return true if the systemId denotes an absolute URI .<a name="line.102"></a>
<FONT color="green">103</FONT>       *<a name="line.103"></a>
<FONT color="green">104</FONT>       * @param systemId The systemId string<a name="line.104"></a>
<FONT color="green">105</FONT>       * @return true if the systemId is an an absolute URI<a name="line.105"></a>
<FONT color="green">106</FONT>       */<a name="line.106"></a>
<FONT color="green">107</FONT>      public static boolean isAbsoluteURI(String systemId)<a name="line.107"></a>
<FONT color="green">108</FONT>      {<a name="line.108"></a>
<FONT color="green">109</FONT>         /** http://www.ietf.org/rfc/rfc2396.txt<a name="line.109"></a>
<FONT color="green">110</FONT>          *   Authors should be aware that a path segment which contains a colon<a name="line.110"></a>
<FONT color="green">111</FONT>          * character cannot be used as the first segment of a relative URI path<a name="line.111"></a>
<FONT color="green">112</FONT>          * (e.g., "this:that"), because it would be mistaken for a scheme name.<a name="line.112"></a>
<FONT color="green">113</FONT>         **/<a name="line.113"></a>
<FONT color="green">114</FONT>         /** <a name="line.114"></a>
<FONT color="green">115</FONT>          * %REVIEW% Can we assume here that systemId is a valid URI?<a name="line.115"></a>
<FONT color="green">116</FONT>          * It looks like we cannot ( See discussion of this common problem in <a name="line.116"></a>
<FONT color="green">117</FONT>          * Bugzilla Bug 22777 ). <a name="line.117"></a>
<FONT color="green">118</FONT>         **/<a name="line.118"></a>
<FONT color="green">119</FONT>         //"fix" for Bugzilla Bug 22777<a name="line.119"></a>
<FONT color="green">120</FONT>        if(isWindowsAbsolutePath(systemId)){<a name="line.120"></a>
<FONT color="green">121</FONT>            return false;<a name="line.121"></a>
<FONT color="green">122</FONT>         }<a name="line.122"></a>
<FONT color="green">123</FONT>        <a name="line.123"></a>
<FONT color="green">124</FONT>        final int fragmentIndex = systemId.indexOf('#');<a name="line.124"></a>
<FONT color="green">125</FONT>        final int queryIndex = systemId.indexOf('?');<a name="line.125"></a>
<FONT color="green">126</FONT>        final int slashIndex = systemId.indexOf('/');<a name="line.126"></a>
<FONT color="green">127</FONT>        final int colonIndex = systemId.indexOf(':');<a name="line.127"></a>
<FONT color="green">128</FONT>        <a name="line.128"></a>
<FONT color="green">129</FONT>        //finding substring  before '#', '?', and '/' <a name="line.129"></a>
<FONT color="green">130</FONT>        int index = systemId.length() -1;<a name="line.130"></a>
<FONT color="green">131</FONT>        if(fragmentIndex &gt; 0) <a name="line.131"></a>
<FONT color="green">132</FONT>            index = fragmentIndex;<a name="line.132"></a>
<FONT color="green">133</FONT>        if((queryIndex &gt; 0) &amp;&amp; (queryIndex &lt;index)) <a name="line.133"></a>
<FONT color="green">134</FONT>            index = queryIndex;<a name="line.134"></a>
<FONT color="green">135</FONT>        if((slashIndex &gt; 0) &amp;&amp; (slashIndex &lt;index))<a name="line.135"></a>
<FONT color="green">136</FONT>            index = slashIndex; <a name="line.136"></a>
<FONT color="green">137</FONT>        // return true if there is ':' before '#', '?', and '/'<a name="line.137"></a>
<FONT color="green">138</FONT>        return ((colonIndex &gt;0) &amp;&amp; (colonIndex&lt;index));<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>      /**<a name="line.142"></a>
<FONT color="green">143</FONT>       * Return true if the local path is an absolute path.<a name="line.143"></a>
<FONT color="green">144</FONT>       *<a name="line.144"></a>
<FONT color="green">145</FONT>       * @param systemId The path string<a name="line.145"></a>
<FONT color="green">146</FONT>       * @return true if the path is absolute<a name="line.146"></a>
<FONT color="green">147</FONT>       */<a name="line.147"></a>
<FONT color="green">148</FONT>      public static boolean isAbsolutePath(String systemId)<a name="line.148"></a>
<FONT color="green">149</FONT>      {<a name="line.149"></a>
<FONT color="green">150</FONT>        if(systemId == null)<a name="line.150"></a>
<FONT color="green">151</FONT>            return false;<a name="line.151"></a>
<FONT color="green">152</FONT>        final File file = new File(systemId);<a name="line.152"></a>
<FONT color="green">153</FONT>        return file.isAbsolute();<a name="line.153"></a>
<FONT color="green">154</FONT>        <a name="line.154"></a>
<FONT color="green">155</FONT>      }<a name="line.155"></a>
<FONT color="green">156</FONT>      <a name="line.156"></a>
<FONT color="green">157</FONT>       /**<a name="line.157"></a>
<FONT color="green">158</FONT>       * Return true if the local path is a Windows absolute path.<a name="line.158"></a>
<FONT color="green">159</FONT>       *<a name="line.159"></a>
<FONT color="green">160</FONT>       * @param systemId The path string<a name="line.160"></a>
<FONT color="green">161</FONT>       * @return true if the path is a Windows absolute path<a name="line.161"></a>
<FONT color="green">162</FONT>       */<a name="line.162"></a>
<FONT color="green">163</FONT>        private static boolean isWindowsAbsolutePath(String systemId)<a name="line.163"></a>
<FONT color="green">164</FONT>      {<a name="line.164"></a>
<FONT color="green">165</FONT>        if(!isAbsolutePath(systemId))<a name="line.165"></a>
<FONT color="green">166</FONT>          return false;<a name="line.166"></a>
<FONT color="green">167</FONT>        // On Windows, an absolute path starts with "[drive_letter]:\".<a name="line.167"></a>
<FONT color="green">168</FONT>        if (systemId.length() &gt; 2 <a name="line.168"></a>
<FONT color="green">169</FONT>            &amp;&amp; systemId.charAt(1) == ':'<a name="line.169"></a>
<FONT color="green">170</FONT>            &amp;&amp; Character.isLetter(systemId.charAt(0))<a name="line.170"></a>
<FONT color="green">171</FONT>            &amp;&amp; (systemId.charAt(2) == '\\' || systemId.charAt(2) == '/'))<a name="line.171"></a>
<FONT color="green">172</FONT>          return true;<a name="line.172"></a>
<FONT color="green">173</FONT>        else<a name="line.173"></a>
<FONT color="green">174</FONT>          return false;<a name="line.174"></a>
<FONT color="green">175</FONT>      }<a name="line.175"></a>
<FONT color="green">176</FONT>      <a name="line.176"></a>
<FONT color="green">177</FONT>      /**<a name="line.177"></a>
<FONT color="green">178</FONT>       * Replace spaces with "%20" and backslashes with forward slashes in <a name="line.178"></a>
<FONT color="green">179</FONT>       * the input string to generate a well-formed URI string.<a name="line.179"></a>
<FONT color="green">180</FONT>       *<a name="line.180"></a>
<FONT color="green">181</FONT>       * @param str The input string<a name="line.181"></a>
<FONT color="green">182</FONT>       * @return The string after conversion<a name="line.182"></a>
<FONT color="green">183</FONT>       */<a name="line.183"></a>
<FONT color="green">184</FONT>      private static String replaceChars(String str)<a name="line.184"></a>
<FONT color="green">185</FONT>      {<a name="line.185"></a>
<FONT color="green">186</FONT>        StringBuffer buf = new StringBuffer(str);<a name="line.186"></a>
<FONT color="green">187</FONT>        int length = buf.length();<a name="line.187"></a>
<FONT color="green">188</FONT>        for (int i = 0; i &lt; length; i++)<a name="line.188"></a>
<FONT color="green">189</FONT>        {<a name="line.189"></a>
<FONT color="green">190</FONT>          char currentChar = buf.charAt(i);<a name="line.190"></a>
<FONT color="green">191</FONT>          // Replace space with "%20"<a name="line.191"></a>
<FONT color="green">192</FONT>          if (currentChar == ' ')<a name="line.192"></a>
<FONT color="green">193</FONT>          {<a name="line.193"></a>
<FONT color="green">194</FONT>            buf.setCharAt(i, '%');<a name="line.194"></a>
<FONT color="green">195</FONT>            buf.insert(i+1, "20");<a name="line.195"></a>
<FONT color="green">196</FONT>            length = length + 2;<a name="line.196"></a>
<FONT color="green">197</FONT>            i = i + 2;<a name="line.197"></a>
<FONT color="green">198</FONT>          }<a name="line.198"></a>
<FONT color="green">199</FONT>          // Replace backslash with forward slash<a name="line.199"></a>
<FONT color="green">200</FONT>          else if (currentChar == '\\')<a name="line.200"></a>
<FONT color="green">201</FONT>          {<a name="line.201"></a>
<FONT color="green">202</FONT>            buf.setCharAt(i, '/');<a name="line.202"></a>
<FONT color="green">203</FONT>          }<a name="line.203"></a>
<FONT color="green">204</FONT>        }<a name="line.204"></a>
<FONT color="green">205</FONT>        <a name="line.205"></a>
<FONT color="green">206</FONT>        return buf.toString();<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>       * Take a SystemID string and try to turn it into a good absolute URI.<a name="line.210"></a>
<FONT color="green">211</FONT>       *<a name="line.211"></a>
<FONT color="green">212</FONT>       * @param systemId A URI string, which may be absolute or relative.<a name="line.212"></a>
<FONT color="green">213</FONT>       *<a name="line.213"></a>
<FONT color="green">214</FONT>       * @return The resolved absolute URI<a name="line.214"></a>
<FONT color="green">215</FONT>       */<a name="line.215"></a>
<FONT color="green">216</FONT>      public static String getAbsoluteURI(String systemId)<a name="line.216"></a>
<FONT color="green">217</FONT>      {<a name="line.217"></a>
<FONT color="green">218</FONT>        String absoluteURI = systemId;<a name="line.218"></a>
<FONT color="green">219</FONT>        if (isAbsoluteURI(systemId))<a name="line.219"></a>
<FONT color="green">220</FONT>        {<a name="line.220"></a>
<FONT color="green">221</FONT>          // Only process the systemId if it starts with "file:".<a name="line.221"></a>
<FONT color="green">222</FONT>          if (systemId.startsWith("file:"))<a name="line.222"></a>
<FONT color="green">223</FONT>          {<a name="line.223"></a>
<FONT color="green">224</FONT>            String str = systemId.substring(5);<a name="line.224"></a>
<FONT color="green">225</FONT>            <a name="line.225"></a>
<FONT color="green">226</FONT>            // Resolve the absolute path if the systemId starts with "file:///"<a name="line.226"></a>
<FONT color="green">227</FONT>            // or "file:/". Don't do anything if it only starts with "file://".<a name="line.227"></a>
<FONT color="green">228</FONT>            if (str != null &amp;&amp; str.startsWith("/"))<a name="line.228"></a>
<FONT color="green">229</FONT>            {<a name="line.229"></a>
<FONT color="green">230</FONT>              if (str.startsWith("///") || !str.startsWith("//"))<a name="line.230"></a>
<FONT color="green">231</FONT>              {<a name="line.231"></a>
<FONT color="green">232</FONT>                // A Windows path containing a drive letter can be relative.<a name="line.232"></a>
<FONT color="green">233</FONT>                // A Unix path starting with "file:/" is always absolute.<a name="line.233"></a>
<FONT color="green">234</FONT>                int secondColonIndex = systemId.indexOf(':', 5);<a name="line.234"></a>
<FONT color="green">235</FONT>                if (secondColonIndex &gt; 0)<a name="line.235"></a>
<FONT color="green">236</FONT>                {<a name="line.236"></a>
<FONT color="green">237</FONT>                  String localPath = systemId.substring(secondColonIndex-1);<a name="line.237"></a>
<FONT color="green">238</FONT>                  try {<a name="line.238"></a>
<FONT color="green">239</FONT>                    if (!isAbsolutePath(localPath))<a name="line.239"></a>
<FONT color="green">240</FONT>                      absoluteURI = systemId.substring(0, secondColonIndex-1) + <a name="line.240"></a>
<FONT color="green">241</FONT>                                    getAbsolutePathFromRelativePath(localPath);<a name="line.241"></a>
<FONT color="green">242</FONT>                  }<a name="line.242"></a>
<FONT color="green">243</FONT>                  catch (SecurityException se) {<a name="line.243"></a>
<FONT color="green">244</FONT>                    return systemId;<a name="line.244"></a>
<FONT color="green">245</FONT>                  }<a name="line.245"></a>
<FONT color="green">246</FONT>                }<a name="line.246"></a>
<FONT color="green">247</FONT>              }          <a name="line.247"></a>
<FONT color="green">248</FONT>            }<a name="line.248"></a>
<FONT color="green">249</FONT>            else<a name="line.249"></a>
<FONT color="green">250</FONT>            {<a name="line.250"></a>
<FONT color="green">251</FONT>              return getAbsoluteURIFromRelative(systemId.substring(5));<a name="line.251"></a>
<FONT color="green">252</FONT>            }<a name="line.252"></a>
<FONT color="green">253</FONT>                    <a name="line.253"></a>
<FONT color="green">254</FONT>            return replaceChars(absoluteURI);<a name="line.254"></a>
<FONT color="green">255</FONT>          }<a name="line.255"></a>
<FONT color="green">256</FONT>          else<a name="line.256"></a>
<FONT color="green">257</FONT>            return systemId;<a name="line.257"></a>
<FONT color="green">258</FONT>        }<a name="line.258"></a>
<FONT color="green">259</FONT>        else<a name="line.259"></a>
<FONT color="green">260</FONT>          return getAbsoluteURIFromRelative(systemId);<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>    <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>       * Take a SystemID string and try to turn it into a good absolute URI.<a name="line.266"></a>
<FONT color="green">267</FONT>       *<a name="line.267"></a>
<FONT color="green">268</FONT>       * @param urlString SystemID string<a name="line.268"></a>
<FONT color="green">269</FONT>       * @param base The URI string used as the base for resolving the systemID<a name="line.269"></a>
<FONT color="green">270</FONT>       *<a name="line.270"></a>
<FONT color="green">271</FONT>       * @return The resolved absolute URI<a name="line.271"></a>
<FONT color="green">272</FONT>       * @throws TransformerException thrown if the string can't be turned into a URI.<a name="line.272"></a>
<FONT color="green">273</FONT>       */<a name="line.273"></a>
<FONT color="green">274</FONT>      public static String getAbsoluteURI(String urlString, String base)<a name="line.274"></a>
<FONT color="green">275</FONT>              throws TransformerException<a name="line.275"></a>
<FONT color="green">276</FONT>      {    <a name="line.276"></a>
<FONT color="green">277</FONT>        if (base == null)<a name="line.277"></a>
<FONT color="green">278</FONT>          return getAbsoluteURI(urlString);<a name="line.278"></a>
<FONT color="green">279</FONT>        <a name="line.279"></a>
<FONT color="green">280</FONT>        String absoluteBase = getAbsoluteURI(base);<a name="line.280"></a>
<FONT color="green">281</FONT>        URI uri = null;<a name="line.281"></a>
<FONT color="green">282</FONT>        try <a name="line.282"></a>
<FONT color="green">283</FONT>        {<a name="line.283"></a>
<FONT color="green">284</FONT>          URI baseURI = new URI(absoluteBase);<a name="line.284"></a>
<FONT color="green">285</FONT>          uri = new URI(baseURI, urlString);<a name="line.285"></a>
<FONT color="green">286</FONT>        }<a name="line.286"></a>
<FONT color="green">287</FONT>        catch (MalformedURIException mue)<a name="line.287"></a>
<FONT color="green">288</FONT>        {<a name="line.288"></a>
<FONT color="green">289</FONT>          throw new TransformerException(mue);<a name="line.289"></a>
<FONT color="green">290</FONT>        }<a name="line.290"></a>
<FONT color="green">291</FONT>        <a name="line.291"></a>
<FONT color="green">292</FONT>        return replaceChars(uri.toString());<a name="line.292"></a>
<FONT color="green">293</FONT>      }<a name="line.293"></a>
<FONT color="green">294</FONT>      <a name="line.294"></a>
<FONT color="green">295</FONT>    }<a name="line.295"></a>




























































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