<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: ObjectFactory.java 1225583 2011-12-29 16:08:00Z mrglavas $<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    <a name="line.21"></a>
<FONT color="green">022</FONT>    package org.apache.xalan.xsltc.runtime;<a name="line.22"></a>
<FONT color="green">023</FONT>    <a name="line.23"></a>
<FONT color="green">024</FONT>    import java.io.InputStream;<a name="line.24"></a>
<FONT color="green">025</FONT>    import java.io.IOException;<a name="line.25"></a>
<FONT color="green">026</FONT>    import java.io.File;<a name="line.26"></a>
<FONT color="green">027</FONT>    import java.io.FileInputStream;<a name="line.27"></a>
<FONT color="green">028</FONT>    <a name="line.28"></a>
<FONT color="green">029</FONT>    import java.util.Properties;<a name="line.29"></a>
<FONT color="green">030</FONT>    import java.io.BufferedReader;<a name="line.30"></a>
<FONT color="green">031</FONT>    import java.io.InputStreamReader;<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 is duplicated for each JAXP subpackage so keep it in sync.<a name="line.34"></a>
<FONT color="green">035</FONT>     * It is package private and therefore is not exposed as part of the JAXP<a name="line.35"></a>
<FONT color="green">036</FONT>     * API.<a name="line.36"></a>
<FONT color="green">037</FONT>     * &lt;p&gt;<a name="line.37"></a>
<FONT color="green">038</FONT>     * This code is designed to implement the JAXP 1.1 spec pluggability<a name="line.38"></a>
<FONT color="green">039</FONT>     * feature and is designed to run on JDK version 1.1 and<a name="line.39"></a>
<FONT color="green">040</FONT>     * later, and to compile on JDK 1.2 and onward.  <a name="line.40"></a>
<FONT color="green">041</FONT>     * The code also runs both as part of an unbundled jar file and<a name="line.41"></a>
<FONT color="green">042</FONT>     * when bundled as part of the JDK.<a name="line.42"></a>
<FONT color="green">043</FONT>     * &lt;p&gt;<a name="line.43"></a>
<FONT color="green">044</FONT>     * This class was moved from the &lt;code&gt;javax.xml.parsers.ObjectFactory&lt;/code&gt;<a name="line.44"></a>
<FONT color="green">045</FONT>     * class and modified to be used as a general utility for creating objects <a name="line.45"></a>
<FONT color="green">046</FONT>     * dynamically.<a name="line.46"></a>
<FONT color="green">047</FONT>     *<a name="line.47"></a>
<FONT color="green">048</FONT>     * @version $Id: ObjectFactory.java 1225583 2011-12-29 16:08:00Z mrglavas $<a name="line.48"></a>
<FONT color="green">049</FONT>     */<a name="line.49"></a>
<FONT color="green">050</FONT>    final class ObjectFactory {<a name="line.50"></a>
<FONT color="green">051</FONT>    <a name="line.51"></a>
<FONT color="green">052</FONT>        //<a name="line.52"></a>
<FONT color="green">053</FONT>        // Constants<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>        // name of default properties file to look for in JDK's jre/lib directory<a name="line.56"></a>
<FONT color="green">057</FONT>        private static final String DEFAULT_PROPERTIES_FILENAME =<a name="line.57"></a>
<FONT color="green">058</FONT>                                                         "xalan.properties";<a name="line.58"></a>
<FONT color="green">059</FONT>    <a name="line.59"></a>
<FONT color="green">060</FONT>        private static final String SERVICES_PATH = "META-INF/services/";<a name="line.60"></a>
<FONT color="green">061</FONT>    <a name="line.61"></a>
<FONT color="green">062</FONT>        /** Set to true for debugging */<a name="line.62"></a>
<FONT color="green">063</FONT>        private static final boolean DEBUG = false;<a name="line.63"></a>
<FONT color="green">064</FONT>    <a name="line.64"></a>
<FONT color="green">065</FONT>        /** cache the contents of the xalan.properties file.<a name="line.65"></a>
<FONT color="green">066</FONT>         *  Until an attempt has been made to read this file, this will<a name="line.66"></a>
<FONT color="green">067</FONT>         * be null; if the file does not exist or we encounter some other error<a name="line.67"></a>
<FONT color="green">068</FONT>         * during the read, this will be empty.<a name="line.68"></a>
<FONT color="green">069</FONT>         */<a name="line.69"></a>
<FONT color="green">070</FONT>        private static Properties fXalanProperties = null;<a name="line.70"></a>
<FONT color="green">071</FONT>    <a name="line.71"></a>
<FONT color="green">072</FONT>        /***<a name="line.72"></a>
<FONT color="green">073</FONT>         * Cache the time stamp of the xalan.properties file so<a name="line.73"></a>
<FONT color="green">074</FONT>         * that we know if it's been modified and can invalidate<a name="line.74"></a>
<FONT color="green">075</FONT>         * the cache when necessary.<a name="line.75"></a>
<FONT color="green">076</FONT>         */<a name="line.76"></a>
<FONT color="green">077</FONT>        private static long fLastModified = -1;<a name="line.77"></a>
<FONT color="green">078</FONT>    <a name="line.78"></a>
<FONT color="green">079</FONT>        //<a name="line.79"></a>
<FONT color="green">080</FONT>        // Public static methods<a name="line.80"></a>
<FONT color="green">081</FONT>        //<a name="line.81"></a>
<FONT color="green">082</FONT>    <a name="line.82"></a>
<FONT color="green">083</FONT>        /**<a name="line.83"></a>
<FONT color="green">084</FONT>         * Finds the implementation Class object in the specified order.  The<a name="line.84"></a>
<FONT color="green">085</FONT>         * specified order is the following:<a name="line.85"></a>
<FONT color="green">086</FONT>         * &lt;ol&gt;<a name="line.86"></a>
<FONT color="green">087</FONT>         *  &lt;li&gt;query the system property using &lt;code&gt;System.getProperty&lt;/code&gt;<a name="line.87"></a>
<FONT color="green">088</FONT>         *  &lt;li&gt;read &lt;code&gt;META-INF/services/&lt;i&gt;factoryId&lt;/i&gt;&lt;/code&gt; file<a name="line.88"></a>
<FONT color="green">089</FONT>         *  &lt;li&gt;use fallback classname<a name="line.89"></a>
<FONT color="green">090</FONT>         * &lt;/ol&gt;<a name="line.90"></a>
<FONT color="green">091</FONT>         *<a name="line.91"></a>
<FONT color="green">092</FONT>         * @return instance of factory, never null<a name="line.92"></a>
<FONT color="green">093</FONT>         *<a name="line.93"></a>
<FONT color="green">094</FONT>         * @param factoryId             Name of the factory to find, same as<a name="line.94"></a>
<FONT color="green">095</FONT>         *                              a property name<a name="line.95"></a>
<FONT color="green">096</FONT>         * @param fallbackClassName     Implementation class name, if nothing else<a name="line.96"></a>
<FONT color="green">097</FONT>         *                              is found.  Use null to mean no fallback.<a name="line.97"></a>
<FONT color="green">098</FONT>         *<a name="line.98"></a>
<FONT color="green">099</FONT>         * @exception ObjectFactory.ConfigurationError<a name="line.99"></a>
<FONT color="green">100</FONT>         */<a name="line.100"></a>
<FONT color="green">101</FONT>        static Object createObject(String factoryId, String fallbackClassName)<a name="line.101"></a>
<FONT color="green">102</FONT>            throws ConfigurationError {<a name="line.102"></a>
<FONT color="green">103</FONT>            return createObject(factoryId, null, fallbackClassName);<a name="line.103"></a>
<FONT color="green">104</FONT>        } // createObject(String,String):Object<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>         * Finds the implementation Class object in the specified order.  The<a name="line.107"></a>
<FONT color="green">108</FONT>         * specified order is the following:<a name="line.108"></a>
<FONT color="green">109</FONT>         * &lt;ol&gt;<a name="line.109"></a>
<FONT color="green">110</FONT>         *  &lt;li&gt;query the system property using &lt;code&gt;System.getProperty&lt;/code&gt;<a name="line.110"></a>
<FONT color="green">111</FONT>         *  &lt;li&gt;read &lt;code&gt;$java.home/lib/&lt;i&gt;propertiesFilename&lt;/i&gt;&lt;/code&gt; file<a name="line.111"></a>
<FONT color="green">112</FONT>         *  &lt;li&gt;read &lt;code&gt;META-INF/services/&lt;i&gt;factoryId&lt;/i&gt;&lt;/code&gt; file<a name="line.112"></a>
<FONT color="green">113</FONT>         *  &lt;li&gt;use fallback classname<a name="line.113"></a>
<FONT color="green">114</FONT>         * &lt;/ol&gt;<a name="line.114"></a>
<FONT color="green">115</FONT>         *<a name="line.115"></a>
<FONT color="green">116</FONT>         * @return instance of factory, never null<a name="line.116"></a>
<FONT color="green">117</FONT>         *<a name="line.117"></a>
<FONT color="green">118</FONT>         * @param factoryId             Name of the factory to find, same as<a name="line.118"></a>
<FONT color="green">119</FONT>         *                              a property name<a name="line.119"></a>
<FONT color="green">120</FONT>         * @param propertiesFilename The filename in the $java.home/lib directory<a name="line.120"></a>
<FONT color="green">121</FONT>         *                           of the properties file.  If none specified,<a name="line.121"></a>
<FONT color="green">122</FONT>         *                           ${java.home}/lib/xalan.properties will be used.<a name="line.122"></a>
<FONT color="green">123</FONT>         * @param fallbackClassName     Implementation class name, if nothing else<a name="line.123"></a>
<FONT color="green">124</FONT>         *                              is found.  Use null to mean no fallback.<a name="line.124"></a>
<FONT color="green">125</FONT>         *<a name="line.125"></a>
<FONT color="green">126</FONT>         * @exception ObjectFactory.ConfigurationError<a name="line.126"></a>
<FONT color="green">127</FONT>         */<a name="line.127"></a>
<FONT color="green">128</FONT>        static Object createObject(String factoryId, <a name="line.128"></a>
<FONT color="green">129</FONT>                                          String propertiesFilename,<a name="line.129"></a>
<FONT color="green">130</FONT>                                          String fallbackClassName)<a name="line.130"></a>
<FONT color="green">131</FONT>            throws ConfigurationError<a name="line.131"></a>
<FONT color="green">132</FONT>        {<a name="line.132"></a>
<FONT color="green">133</FONT>            Class factoryClass = lookUpFactoryClass(factoryId,<a name="line.133"></a>
<FONT color="green">134</FONT>                                                    propertiesFilename,<a name="line.134"></a>
<FONT color="green">135</FONT>                                                    fallbackClassName);<a name="line.135"></a>
<FONT color="green">136</FONT>    <a name="line.136"></a>
<FONT color="green">137</FONT>            if (factoryClass == null) {<a name="line.137"></a>
<FONT color="green">138</FONT>                throw new ConfigurationError(<a name="line.138"></a>
<FONT color="green">139</FONT>                    "Provider for " + factoryId + " cannot be found", null);<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>            try{<a name="line.142"></a>
<FONT color="green">143</FONT>                Object instance = factoryClass.newInstance();<a name="line.143"></a>
<FONT color="green">144</FONT>                debugPrintln("created new instance of factory " + factoryId);<a name="line.144"></a>
<FONT color="green">145</FONT>                return instance;<a name="line.145"></a>
<FONT color="green">146</FONT>            } catch (Exception x) {<a name="line.146"></a>
<FONT color="green">147</FONT>                throw new ConfigurationError(<a name="line.147"></a>
<FONT color="green">148</FONT>                    "Provider for factory " + factoryId<a name="line.148"></a>
<FONT color="green">149</FONT>                        + " could not be instantiated: " + x, x);<a name="line.149"></a>
<FONT color="green">150</FONT>            }<a name="line.150"></a>
<FONT color="green">151</FONT>        } // createObject(String,String,String):Object<a name="line.151"></a>
<FONT color="green">152</FONT>    <a name="line.152"></a>
<FONT color="green">153</FONT>        /**<a name="line.153"></a>
<FONT color="green">154</FONT>         * Finds the implementation Class object in the specified order.  The<a name="line.154"></a>
<FONT color="green">155</FONT>         * specified order is the following:<a name="line.155"></a>
<FONT color="green">156</FONT>         * &lt;ol&gt;<a name="line.156"></a>
<FONT color="green">157</FONT>         *  &lt;li&gt;query the system property using &lt;code&gt;System.getProperty&lt;/code&gt;<a name="line.157"></a>
<FONT color="green">158</FONT>         *  &lt;li&gt;read &lt;code&gt;$java.home/lib/&lt;i&gt;propertiesFilename&lt;/i&gt;&lt;/code&gt; file<a name="line.158"></a>
<FONT color="green">159</FONT>         *  &lt;li&gt;read &lt;code&gt;META-INF/services/&lt;i&gt;factoryId&lt;/i&gt;&lt;/code&gt; file<a name="line.159"></a>
<FONT color="green">160</FONT>         *  &lt;li&gt;use fallback classname<a name="line.160"></a>
<FONT color="green">161</FONT>         * &lt;/ol&gt;<a name="line.161"></a>
<FONT color="green">162</FONT>         *<a name="line.162"></a>
<FONT color="green">163</FONT>         * @return Class object of factory, never null<a name="line.163"></a>
<FONT color="green">164</FONT>         *<a name="line.164"></a>
<FONT color="green">165</FONT>         * @param factoryId             Name of the factory to find, same as<a name="line.165"></a>
<FONT color="green">166</FONT>         *                              a property name<a name="line.166"></a>
<FONT color="green">167</FONT>         * @param propertiesFilename The filename in the $java.home/lib directory<a name="line.167"></a>
<FONT color="green">168</FONT>         *                           of the properties file.  If none specified,<a name="line.168"></a>
<FONT color="green">169</FONT>         *                           ${java.home}/lib/xalan.properties will be used.<a name="line.169"></a>
<FONT color="green">170</FONT>         * @param fallbackClassName     Implementation class name, if nothing else<a name="line.170"></a>
<FONT color="green">171</FONT>         *                              is found.  Use null to mean no fallback.<a name="line.171"></a>
<FONT color="green">172</FONT>         *<a name="line.172"></a>
<FONT color="green">173</FONT>         * @exception ObjectFactory.ConfigurationError<a name="line.173"></a>
<FONT color="green">174</FONT>         */<a name="line.174"></a>
<FONT color="green">175</FONT>        static Class lookUpFactoryClass(String factoryId) <a name="line.175"></a>
<FONT color="green">176</FONT>            throws ConfigurationError<a name="line.176"></a>
<FONT color="green">177</FONT>        {<a name="line.177"></a>
<FONT color="green">178</FONT>            return lookUpFactoryClass(factoryId, null, null);<a name="line.178"></a>
<FONT color="green">179</FONT>        } // lookUpFactoryClass(String):Class<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>         * Finds the implementation Class object in the specified order.  The<a name="line.182"></a>
<FONT color="green">183</FONT>         * specified order is the following:<a name="line.183"></a>
<FONT color="green">184</FONT>         * &lt;ol&gt;<a name="line.184"></a>
<FONT color="green">185</FONT>         *  &lt;li&gt;query the system property using &lt;code&gt;System.getProperty&lt;/code&gt;<a name="line.185"></a>
<FONT color="green">186</FONT>         *  &lt;li&gt;read &lt;code&gt;$java.home/lib/&lt;i&gt;propertiesFilename&lt;/i&gt;&lt;/code&gt; file<a name="line.186"></a>
<FONT color="green">187</FONT>         *  &lt;li&gt;read &lt;code&gt;META-INF/services/&lt;i&gt;factoryId&lt;/i&gt;&lt;/code&gt; file<a name="line.187"></a>
<FONT color="green">188</FONT>         *  &lt;li&gt;use fallback classname<a name="line.188"></a>
<FONT color="green">189</FONT>         * &lt;/ol&gt;<a name="line.189"></a>
<FONT color="green">190</FONT>         *<a name="line.190"></a>
<FONT color="green">191</FONT>         * @return Class object that provides factory service, never null<a name="line.191"></a>
<FONT color="green">192</FONT>         *<a name="line.192"></a>
<FONT color="green">193</FONT>         * @param factoryId             Name of the factory to find, same as<a name="line.193"></a>
<FONT color="green">194</FONT>         *                              a property name<a name="line.194"></a>
<FONT color="green">195</FONT>         * @param propertiesFilename The filename in the $java.home/lib directory<a name="line.195"></a>
<FONT color="green">196</FONT>         *                           of the properties file.  If none specified,<a name="line.196"></a>
<FONT color="green">197</FONT>         *                           ${java.home}/lib/xalan.properties will be used.<a name="line.197"></a>
<FONT color="green">198</FONT>         * @param fallbackClassName     Implementation class name, if nothing else<a name="line.198"></a>
<FONT color="green">199</FONT>         *                              is found.  Use null to mean no fallback.<a name="line.199"></a>
<FONT color="green">200</FONT>         *<a name="line.200"></a>
<FONT color="green">201</FONT>         * @exception ObjectFactory.ConfigurationError<a name="line.201"></a>
<FONT color="green">202</FONT>         */<a name="line.202"></a>
<FONT color="green">203</FONT>        static Class lookUpFactoryClass(String factoryId,<a name="line.203"></a>
<FONT color="green">204</FONT>                                               String propertiesFilename,<a name="line.204"></a>
<FONT color="green">205</FONT>                                               String fallbackClassName)<a name="line.205"></a>
<FONT color="green">206</FONT>            throws ConfigurationError<a name="line.206"></a>
<FONT color="green">207</FONT>        {<a name="line.207"></a>
<FONT color="green">208</FONT>            String factoryClassName = lookUpFactoryClassName(factoryId,<a name="line.208"></a>
<FONT color="green">209</FONT>                                                             propertiesFilename,<a name="line.209"></a>
<FONT color="green">210</FONT>                                                             fallbackClassName);<a name="line.210"></a>
<FONT color="green">211</FONT>            ClassLoader cl = findClassLoader();<a name="line.211"></a>
<FONT color="green">212</FONT>    <a name="line.212"></a>
<FONT color="green">213</FONT>            if (factoryClassName == null) {<a name="line.213"></a>
<FONT color="green">214</FONT>                factoryClassName = fallbackClassName;<a name="line.214"></a>
<FONT color="green">215</FONT>            }<a name="line.215"></a>
<FONT color="green">216</FONT>    <a name="line.216"></a>
<FONT color="green">217</FONT>            // assert(className != null);<a name="line.217"></a>
<FONT color="green">218</FONT>            try{<a name="line.218"></a>
<FONT color="green">219</FONT>                Class providerClass = findProviderClass(factoryClassName,<a name="line.219"></a>
<FONT color="green">220</FONT>                                                        cl,<a name="line.220"></a>
<FONT color="green">221</FONT>                                                        true);<a name="line.221"></a>
<FONT color="green">222</FONT>                debugPrintln("created new instance of " + providerClass +<a name="line.222"></a>
<FONT color="green">223</FONT>                       " using ClassLoader: " + cl);<a name="line.223"></a>
<FONT color="green">224</FONT>                return providerClass;<a name="line.224"></a>
<FONT color="green">225</FONT>            } catch (ClassNotFoundException x) {<a name="line.225"></a>
<FONT color="green">226</FONT>                throw new ConfigurationError(<a name="line.226"></a>
<FONT color="green">227</FONT>                    "Provider " + factoryClassName + " not found", x);<a name="line.227"></a>
<FONT color="green">228</FONT>            } catch (Exception x) {<a name="line.228"></a>
<FONT color="green">229</FONT>                throw new ConfigurationError(<a name="line.229"></a>
<FONT color="green">230</FONT>                    "Provider "+factoryClassName+" could not be instantiated: "+x,<a name="line.230"></a>
<FONT color="green">231</FONT>                    x);<a name="line.231"></a>
<FONT color="green">232</FONT>            }<a name="line.232"></a>
<FONT color="green">233</FONT>        } // lookUpFactoryClass(String,String,String):Class<a name="line.233"></a>
<FONT color="green">234</FONT>    <a name="line.234"></a>
<FONT color="green">235</FONT>        /**<a name="line.235"></a>
<FONT color="green">236</FONT>         * Finds the name of the required implementation class in the specified<a name="line.236"></a>
<FONT color="green">237</FONT>         * order.  The specified order is the following:<a name="line.237"></a>
<FONT color="green">238</FONT>         * &lt;ol&gt;<a name="line.238"></a>
<FONT color="green">239</FONT>         *  &lt;li&gt;query the system property using &lt;code&gt;System.getProperty&lt;/code&gt;<a name="line.239"></a>
<FONT color="green">240</FONT>         *  &lt;li&gt;read &lt;code&gt;$java.home/lib/&lt;i&gt;propertiesFilename&lt;/i&gt;&lt;/code&gt; file<a name="line.240"></a>
<FONT color="green">241</FONT>         *  &lt;li&gt;read &lt;code&gt;META-INF/services/&lt;i&gt;factoryId&lt;/i&gt;&lt;/code&gt; file<a name="line.241"></a>
<FONT color="green">242</FONT>         *  &lt;li&gt;use fallback classname<a name="line.242"></a>
<FONT color="green">243</FONT>         * &lt;/ol&gt;<a name="line.243"></a>
<FONT color="green">244</FONT>         *<a name="line.244"></a>
<FONT color="green">245</FONT>         * @return name of class that provides factory service, never null<a name="line.245"></a>
<FONT color="green">246</FONT>         *<a name="line.246"></a>
<FONT color="green">247</FONT>         * @param factoryId             Name of the factory to find, same as<a name="line.247"></a>
<FONT color="green">248</FONT>         *                              a property name<a name="line.248"></a>
<FONT color="green">249</FONT>         * @param propertiesFilename The filename in the $java.home/lib directory<a name="line.249"></a>
<FONT color="green">250</FONT>         *                           of the properties file.  If none specified,<a name="line.250"></a>
<FONT color="green">251</FONT>         *                           ${java.home}/lib/xalan.properties will be used.<a name="line.251"></a>
<FONT color="green">252</FONT>         * @param fallbackClassName     Implementation class name, if nothing else<a name="line.252"></a>
<FONT color="green">253</FONT>         *                              is found.  Use null to mean no fallback.<a name="line.253"></a>
<FONT color="green">254</FONT>         *<a name="line.254"></a>
<FONT color="green">255</FONT>         * @exception ObjectFactory.ConfigurationError<a name="line.255"></a>
<FONT color="green">256</FONT>         */<a name="line.256"></a>
<FONT color="green">257</FONT>        static String lookUpFactoryClassName(String factoryId,<a name="line.257"></a>
<FONT color="green">258</FONT>                                                    String propertiesFilename,<a name="line.258"></a>
<FONT color="green">259</FONT>                                                    String fallbackClassName)<a name="line.259"></a>
<FONT color="green">260</FONT>        {<a name="line.260"></a>
<FONT color="green">261</FONT>            // Use the system property first<a name="line.261"></a>
<FONT color="green">262</FONT>            try {<a name="line.262"></a>
<FONT color="green">263</FONT>                String systemProp = SecuritySupport.getSystemProperty(factoryId);<a name="line.263"></a>
<FONT color="green">264</FONT>                if (systemProp != null) {<a name="line.264"></a>
<FONT color="green">265</FONT>                    debugPrintln("found system property, value=" + systemProp);<a name="line.265"></a>
<FONT color="green">266</FONT>                    return systemProp;<a name="line.266"></a>
<FONT color="green">267</FONT>                }<a name="line.267"></a>
<FONT color="green">268</FONT>            } catch (SecurityException se) {<a name="line.268"></a>
<FONT color="green">269</FONT>                // Ignore and continue w/ next location<a name="line.269"></a>
<FONT color="green">270</FONT>            }<a name="line.270"></a>
<FONT color="green">271</FONT>    <a name="line.271"></a>
<FONT color="green">272</FONT>            // Try to read from propertiesFilename, or<a name="line.272"></a>
<FONT color="green">273</FONT>            // $java.home/lib/xalan.properties<a name="line.273"></a>
<FONT color="green">274</FONT>            String factoryClassName = null;<a name="line.274"></a>
<FONT color="green">275</FONT>            // no properties file name specified; use<a name="line.275"></a>
<FONT color="green">276</FONT>            // $JAVA_HOME/lib/xalan.properties:<a name="line.276"></a>
<FONT color="green">277</FONT>            if (propertiesFilename == null) {<a name="line.277"></a>
<FONT color="green">278</FONT>                File propertiesFile = null;<a name="line.278"></a>
<FONT color="green">279</FONT>                boolean propertiesFileExists = false;<a name="line.279"></a>
<FONT color="green">280</FONT>                try {<a name="line.280"></a>
<FONT color="green">281</FONT>                    String javah = SecuritySupport.getSystemProperty("java.home");<a name="line.281"></a>
<FONT color="green">282</FONT>                    propertiesFilename = javah + File.separator +<a name="line.282"></a>
<FONT color="green">283</FONT>                        "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME;<a name="line.283"></a>
<FONT color="green">284</FONT>                    propertiesFile = new File(propertiesFilename);<a name="line.284"></a>
<FONT color="green">285</FONT>                    propertiesFileExists = SecuritySupport.getFileExists(propertiesFile);<a name="line.285"></a>
<FONT color="green">286</FONT>                } catch (SecurityException e) {<a name="line.286"></a>
<FONT color="green">287</FONT>                    // try again...<a name="line.287"></a>
<FONT color="green">288</FONT>                    fLastModified = -1;<a name="line.288"></a>
<FONT color="green">289</FONT>                    fXalanProperties = null;<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>                synchronized (ObjectFactory.class) {<a name="line.292"></a>
<FONT color="green">293</FONT>                    boolean loadProperties = false;<a name="line.293"></a>
<FONT color="green">294</FONT>                    FileInputStream fis = null;<a name="line.294"></a>
<FONT color="green">295</FONT>                    try {<a name="line.295"></a>
<FONT color="green">296</FONT>                        // file existed last time<a name="line.296"></a>
<FONT color="green">297</FONT>                        if(fLastModified &gt;= 0) {<a name="line.297"></a>
<FONT color="green">298</FONT>                            if(propertiesFileExists &amp;&amp;<a name="line.298"></a>
<FONT color="green">299</FONT>                                    (fLastModified &lt; (fLastModified = SecuritySupport.getLastModified(propertiesFile)))) {<a name="line.299"></a>
<FONT color="green">300</FONT>                                loadProperties = true;<a name="line.300"></a>
<FONT color="green">301</FONT>                            } else {<a name="line.301"></a>
<FONT color="green">302</FONT>                                // file has stopped existing...<a name="line.302"></a>
<FONT color="green">303</FONT>                                if(!propertiesFileExists) {<a name="line.303"></a>
<FONT color="green">304</FONT>                                    fLastModified = -1;<a name="line.304"></a>
<FONT color="green">305</FONT>                                    fXalanProperties = null;<a name="line.305"></a>
<FONT color="green">306</FONT>                                } // else, file wasn't modified!<a name="line.306"></a>
<FONT color="green">307</FONT>                            }<a name="line.307"></a>
<FONT color="green">308</FONT>                        } else {<a name="line.308"></a>
<FONT color="green">309</FONT>                            // file has started to exist:<a name="line.309"></a>
<FONT color="green">310</FONT>                            if(propertiesFileExists) {<a name="line.310"></a>
<FONT color="green">311</FONT>                                loadProperties = true;<a name="line.311"></a>
<FONT color="green">312</FONT>                                fLastModified = SecuritySupport.getLastModified(propertiesFile);<a name="line.312"></a>
<FONT color="green">313</FONT>                            } // else, nothing's changed<a name="line.313"></a>
<FONT color="green">314</FONT>                        }<a name="line.314"></a>
<FONT color="green">315</FONT>                        if(loadProperties) {<a name="line.315"></a>
<FONT color="green">316</FONT>                            // must never have attempted to read xalan.properties<a name="line.316"></a>
<FONT color="green">317</FONT>                            // before (or it's outdeated)<a name="line.317"></a>
<FONT color="green">318</FONT>                            fXalanProperties = new Properties();<a name="line.318"></a>
<FONT color="green">319</FONT>                            fis = SecuritySupport.getFileInputStream(propertiesFile);<a name="line.319"></a>
<FONT color="green">320</FONT>                            fXalanProperties.load(fis);<a name="line.320"></a>
<FONT color="green">321</FONT>                        }<a name="line.321"></a>
<FONT color="green">322</FONT>                    } catch (Exception x) {<a name="line.322"></a>
<FONT color="green">323</FONT>                        fXalanProperties = null;<a name="line.323"></a>
<FONT color="green">324</FONT>                        fLastModified = -1;<a name="line.324"></a>
<FONT color="green">325</FONT>                        // assert(x instanceof FileNotFoundException<a name="line.325"></a>
<FONT color="green">326</FONT>                        //        || x instanceof SecurityException)<a name="line.326"></a>
<FONT color="green">327</FONT>                        // In both cases, ignore and continue w/ next location<a name="line.327"></a>
<FONT color="green">328</FONT>                    }<a name="line.328"></a>
<FONT color="green">329</FONT>                    finally {<a name="line.329"></a>
<FONT color="green">330</FONT>                        // try to close the input stream if one was opened.<a name="line.330"></a>
<FONT color="green">331</FONT>                        if (fis != null) {<a name="line.331"></a>
<FONT color="green">332</FONT>                            try {<a name="line.332"></a>
<FONT color="green">333</FONT>                                fis.close();<a name="line.333"></a>
<FONT color="green">334</FONT>                            }<a name="line.334"></a>
<FONT color="green">335</FONT>                            // Ignore the exception.<a name="line.335"></a>
<FONT color="green">336</FONT>                            catch (IOException exc) {}<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>                }<a name="line.339"></a>
<FONT color="green">340</FONT>                if(fXalanProperties != null) {<a name="line.340"></a>
<FONT color="green">341</FONT>                    factoryClassName = fXalanProperties.getProperty(factoryId);<a name="line.341"></a>
<FONT color="green">342</FONT>                }<a name="line.342"></a>
<FONT color="green">343</FONT>            } else {<a name="line.343"></a>
<FONT color="green">344</FONT>                FileInputStream fis = null;<a name="line.344"></a>
<FONT color="green">345</FONT>                try {<a name="line.345"></a>
<FONT color="green">346</FONT>                    fis = SecuritySupport.getFileInputStream(new File(propertiesFilename));<a name="line.346"></a>
<FONT color="green">347</FONT>                    Properties props = new Properties();<a name="line.347"></a>
<FONT color="green">348</FONT>                    props.load(fis);<a name="line.348"></a>
<FONT color="green">349</FONT>                    factoryClassName = props.getProperty(factoryId);<a name="line.349"></a>
<FONT color="green">350</FONT>                } catch (Exception x) {<a name="line.350"></a>
<FONT color="green">351</FONT>                    // assert(x instanceof FileNotFoundException<a name="line.351"></a>
<FONT color="green">352</FONT>                    //        || x instanceof SecurityException)<a name="line.352"></a>
<FONT color="green">353</FONT>                    // In both cases, ignore and continue w/ next location<a name="line.353"></a>
<FONT color="green">354</FONT>                }<a name="line.354"></a>
<FONT color="green">355</FONT>                finally {<a name="line.355"></a>
<FONT color="green">356</FONT>                    // try to close the input stream if one was opened.<a name="line.356"></a>
<FONT color="green">357</FONT>                    if (fis != null) {<a name="line.357"></a>
<FONT color="green">358</FONT>                        try {<a name="line.358"></a>
<FONT color="green">359</FONT>                            fis.close();<a name="line.359"></a>
<FONT color="green">360</FONT>                        }<a name="line.360"></a>
<FONT color="green">361</FONT>                        // Ignore the exception.<a name="line.361"></a>
<FONT color="green">362</FONT>                        catch (IOException exc) {}<a name="line.362"></a>
<FONT color="green">363</FONT>                    }<a name="line.363"></a>
<FONT color="green">364</FONT>                }               <a name="line.364"></a>
<FONT color="green">365</FONT>            }<a name="line.365"></a>
<FONT color="green">366</FONT>            if (factoryClassName != null) {<a name="line.366"></a>
<FONT color="green">367</FONT>                debugPrintln("found in " + propertiesFilename + ", value="<a name="line.367"></a>
<FONT color="green">368</FONT>                              + factoryClassName);<a name="line.368"></a>
<FONT color="green">369</FONT>                return factoryClassName;<a name="line.369"></a>
<FONT color="green">370</FONT>            }<a name="line.370"></a>
<FONT color="green">371</FONT>    <a name="line.371"></a>
<FONT color="green">372</FONT>            // Try Jar Service Provider Mechanism<a name="line.372"></a>
<FONT color="green">373</FONT>            return findJarServiceProviderName(factoryId);<a name="line.373"></a>
<FONT color="green">374</FONT>        } // lookUpFactoryClass(String,String):String<a name="line.374"></a>
<FONT color="green">375</FONT>    <a name="line.375"></a>
<FONT color="green">376</FONT>        //<a name="line.376"></a>
<FONT color="green">377</FONT>        // Private static methods<a name="line.377"></a>
<FONT color="green">378</FONT>        //<a name="line.378"></a>
<FONT color="green">379</FONT>    <a name="line.379"></a>
<FONT color="green">380</FONT>        /** Prints a message to standard error if debugging is enabled. */<a name="line.380"></a>
<FONT color="green">381</FONT>        private static void debugPrintln(String msg) {<a name="line.381"></a>
<FONT color="green">382</FONT>            if (DEBUG) {<a name="line.382"></a>
<FONT color="green">383</FONT>                System.err.println("JAXP: " + msg);<a name="line.383"></a>
<FONT color="green">384</FONT>            }<a name="line.384"></a>
<FONT color="green">385</FONT>        } // debugPrintln(String)<a name="line.385"></a>
<FONT color="green">386</FONT>    <a name="line.386"></a>
<FONT color="green">387</FONT>        /**<a name="line.387"></a>
<FONT color="green">388</FONT>         * Figure out which ClassLoader to use.  For JDK 1.2 and later use<a name="line.388"></a>
<FONT color="green">389</FONT>         * the context ClassLoader.<a name="line.389"></a>
<FONT color="green">390</FONT>         */<a name="line.390"></a>
<FONT color="green">391</FONT>        static ClassLoader findClassLoader()<a name="line.391"></a>
<FONT color="green">392</FONT>            throws ConfigurationError<a name="line.392"></a>
<FONT color="green">393</FONT>        { <a name="line.393"></a>
<FONT color="green">394</FONT>            // Figure out which ClassLoader to use for loading the provider<a name="line.394"></a>
<FONT color="green">395</FONT>            // class.  If there is a Context ClassLoader then use it.<a name="line.395"></a>
<FONT color="green">396</FONT>            ClassLoader context = SecuritySupport.getContextClassLoader();<a name="line.396"></a>
<FONT color="green">397</FONT>            ClassLoader system = SecuritySupport.getSystemClassLoader();<a name="line.397"></a>
<FONT color="green">398</FONT>    <a name="line.398"></a>
<FONT color="green">399</FONT>            ClassLoader chain = system;<a name="line.399"></a>
<FONT color="green">400</FONT>            while (true) {<a name="line.400"></a>
<FONT color="green">401</FONT>                if (context == chain) {<a name="line.401"></a>
<FONT color="green">402</FONT>                    // Assert: we are on JDK 1.1 or we have no Context ClassLoader<a name="line.402"></a>
<FONT color="green">403</FONT>                    // or any Context ClassLoader in chain of system classloader<a name="line.403"></a>
<FONT color="green">404</FONT>                    // (including extension ClassLoader) so extend to widest<a name="line.404"></a>
<FONT color="green">405</FONT>                    // ClassLoader (always look in system ClassLoader if Xalan<a name="line.405"></a>
<FONT color="green">406</FONT>                    // is in boot/extension/system classpath and in current<a name="line.406"></a>
<FONT color="green">407</FONT>                    // ClassLoader otherwise); normal classloaders delegate<a name="line.407"></a>
<FONT color="green">408</FONT>                    // back to system ClassLoader first so this widening doesn't<a name="line.408"></a>
<FONT color="green">409</FONT>                    // change the fact that context ClassLoader will be consulted<a name="line.409"></a>
<FONT color="green">410</FONT>                    ClassLoader current = ObjectFactory.class.getClassLoader();<a name="line.410"></a>
<FONT color="green">411</FONT>    <a name="line.411"></a>
<FONT color="green">412</FONT>                    chain = system;<a name="line.412"></a>
<FONT color="green">413</FONT>                    while (true) {<a name="line.413"></a>
<FONT color="green">414</FONT>                        if (current == chain) {<a name="line.414"></a>
<FONT color="green">415</FONT>                            // Assert: Current ClassLoader in chain of<a name="line.415"></a>
<FONT color="green">416</FONT>                            // boot/extension/system ClassLoaders<a name="line.416"></a>
<FONT color="green">417</FONT>                            return system;<a name="line.417"></a>
<FONT color="green">418</FONT>                        }<a name="line.418"></a>
<FONT color="green">419</FONT>                        if (chain == null) {<a name="line.419"></a>
<FONT color="green">420</FONT>                            break;<a name="line.420"></a>
<FONT color="green">421</FONT>                        }<a name="line.421"></a>
<FONT color="green">422</FONT>                        chain = SecuritySupport.getParentClassLoader(chain);<a name="line.422"></a>
<FONT color="green">423</FONT>                    }<a name="line.423"></a>
<FONT color="green">424</FONT>    <a name="line.424"></a>
<FONT color="green">425</FONT>                    // Assert: Current ClassLoader not in chain of<a name="line.425"></a>
<FONT color="green">426</FONT>                    // boot/extension/system ClassLoaders<a name="line.426"></a>
<FONT color="green">427</FONT>                    return current;<a name="line.427"></a>
<FONT color="green">428</FONT>                }<a name="line.428"></a>
<FONT color="green">429</FONT>    <a name="line.429"></a>
<FONT color="green">430</FONT>                if (chain == null) {<a name="line.430"></a>
<FONT color="green">431</FONT>                    // boot ClassLoader reached<a name="line.431"></a>
<FONT color="green">432</FONT>                    break;<a name="line.432"></a>
<FONT color="green">433</FONT>                }<a name="line.433"></a>
<FONT color="green">434</FONT>    <a name="line.434"></a>
<FONT color="green">435</FONT>                // Check for any extension ClassLoaders in chain up to<a name="line.435"></a>
<FONT color="green">436</FONT>                // boot ClassLoader<a name="line.436"></a>
<FONT color="green">437</FONT>                chain = SecuritySupport.getParentClassLoader(chain);<a name="line.437"></a>
<FONT color="green">438</FONT>            };<a name="line.438"></a>
<FONT color="green">439</FONT>    <a name="line.439"></a>
<FONT color="green">440</FONT>            // Assert: Context ClassLoader not in chain of<a name="line.440"></a>
<FONT color="green">441</FONT>            // boot/extension/system ClassLoaders<a name="line.441"></a>
<FONT color="green">442</FONT>            return context;<a name="line.442"></a>
<FONT color="green">443</FONT>        } // findClassLoader():ClassLoader<a name="line.443"></a>
<FONT color="green">444</FONT>    <a name="line.444"></a>
<FONT color="green">445</FONT>        /**<a name="line.445"></a>
<FONT color="green">446</FONT>         * Create an instance of a class using the specified ClassLoader<a name="line.446"></a>
<FONT color="green">447</FONT>         */ <a name="line.447"></a>
<FONT color="green">448</FONT>        static Object newInstance(String className, ClassLoader cl,<a name="line.448"></a>
<FONT color="green">449</FONT>                                          boolean doFallback)<a name="line.449"></a>
<FONT color="green">450</FONT>            throws ConfigurationError<a name="line.450"></a>
<FONT color="green">451</FONT>        {<a name="line.451"></a>
<FONT color="green">452</FONT>            // assert(className != null);<a name="line.452"></a>
<FONT color="green">453</FONT>            try{<a name="line.453"></a>
<FONT color="green">454</FONT>                Class providerClass = findProviderClass(className, cl, doFallback);<a name="line.454"></a>
<FONT color="green">455</FONT>                Object instance = providerClass.newInstance();<a name="line.455"></a>
<FONT color="green">456</FONT>                debugPrintln("created new instance of " + providerClass +<a name="line.456"></a>
<FONT color="green">457</FONT>                       " using ClassLoader: " + cl);<a name="line.457"></a>
<FONT color="green">458</FONT>                return instance;<a name="line.458"></a>
<FONT color="green">459</FONT>            } catch (ClassNotFoundException x) {<a name="line.459"></a>
<FONT color="green">460</FONT>                throw new ConfigurationError(<a name="line.460"></a>
<FONT color="green">461</FONT>                    "Provider " + className + " not found", x);<a name="line.461"></a>
<FONT color="green">462</FONT>            } catch (Exception x) {<a name="line.462"></a>
<FONT color="green">463</FONT>                throw new ConfigurationError(<a name="line.463"></a>
<FONT color="green">464</FONT>                    "Provider " + className + " could not be instantiated: " + x,<a name="line.464"></a>
<FONT color="green">465</FONT>                    x);<a name="line.465"></a>
<FONT color="green">466</FONT>            }<a name="line.466"></a>
<FONT color="green">467</FONT>        }<a name="line.467"></a>
<FONT color="green">468</FONT>    <a name="line.468"></a>
<FONT color="green">469</FONT>        /**<a name="line.469"></a>
<FONT color="green">470</FONT>         * Find a Class using the specified ClassLoader<a name="line.470"></a>
<FONT color="green">471</FONT>         */ <a name="line.471"></a>
<FONT color="green">472</FONT>        static Class findProviderClass(String className, ClassLoader cl,<a name="line.472"></a>
<FONT color="green">473</FONT>                                               boolean doFallback)<a name="line.473"></a>
<FONT color="green">474</FONT>            throws ClassNotFoundException, ConfigurationError<a name="line.474"></a>
<FONT color="green">475</FONT>        {   <a name="line.475"></a>
<FONT color="green">476</FONT>            //throw security exception if the calling thread is not allowed to access the<a name="line.476"></a>
<FONT color="green">477</FONT>            //class. Restrict the access to the package classes as specified in java.security policy.<a name="line.477"></a>
<FONT color="green">478</FONT>            SecurityManager security = System.getSecurityManager();<a name="line.478"></a>
<FONT color="green">479</FONT>            try{<a name="line.479"></a>
<FONT color="green">480</FONT>                    if (security != null){<a name="line.480"></a>
<FONT color="green">481</FONT>                        final int lastDot = className.lastIndexOf('.');<a name="line.481"></a>
<FONT color="green">482</FONT>                        String packageName = className;<a name="line.482"></a>
<FONT color="green">483</FONT>                        if (lastDot != -1) packageName = className.substring(0, lastDot);<a name="line.483"></a>
<FONT color="green">484</FONT>                        security.checkPackageAccess(packageName);<a name="line.484"></a>
<FONT color="green">485</FONT>                     }   <a name="line.485"></a>
<FONT color="green">486</FONT>            }catch(SecurityException e){<a name="line.486"></a>
<FONT color="green">487</FONT>                throw e;<a name="line.487"></a>
<FONT color="green">488</FONT>            }<a name="line.488"></a>
<FONT color="green">489</FONT>            <a name="line.489"></a>
<FONT color="green">490</FONT>            Class providerClass;<a name="line.490"></a>
<FONT color="green">491</FONT>            if (cl == null) {<a name="line.491"></a>
<FONT color="green">492</FONT>                // XXX Use the bootstrap ClassLoader.  There is no way to<a name="line.492"></a>
<FONT color="green">493</FONT>                // load a class using the bootstrap ClassLoader that works<a name="line.493"></a>
<FONT color="green">494</FONT>                // in both JDK 1.1 and Java 2.  However, this should still<a name="line.494"></a>
<FONT color="green">495</FONT>                // work b/c the following should be true:<a name="line.495"></a>
<FONT color="green">496</FONT>                //<a name="line.496"></a>
<FONT color="green">497</FONT>                // (cl == null) iff current ClassLoader == null<a name="line.497"></a>
<FONT color="green">498</FONT>                //<a name="line.498"></a>
<FONT color="green">499</FONT>                // Thus Class.forName(String) will use the current<a name="line.499"></a>
<FONT color="green">500</FONT>                // ClassLoader which will be the bootstrap ClassLoader.<a name="line.500"></a>
<FONT color="green">501</FONT>                providerClass = Class.forName(className);<a name="line.501"></a>
<FONT color="green">502</FONT>            } else {<a name="line.502"></a>
<FONT color="green">503</FONT>                try {<a name="line.503"></a>
<FONT color="green">504</FONT>                    providerClass = cl.loadClass(className);<a name="line.504"></a>
<FONT color="green">505</FONT>                } catch (ClassNotFoundException x) {<a name="line.505"></a>
<FONT color="green">506</FONT>                    if (doFallback) {<a name="line.506"></a>
<FONT color="green">507</FONT>                        // Fall back to current classloader<a name="line.507"></a>
<FONT color="green">508</FONT>                        ClassLoader current = ObjectFactory.class.getClassLoader();<a name="line.508"></a>
<FONT color="green">509</FONT>                        if (current == null) {<a name="line.509"></a>
<FONT color="green">510</FONT>                            providerClass = Class.forName(className);<a name="line.510"></a>
<FONT color="green">511</FONT>                        } else if (cl != current) {<a name="line.511"></a>
<FONT color="green">512</FONT>                            cl = current;<a name="line.512"></a>
<FONT color="green">513</FONT>                            providerClass = cl.loadClass(className);<a name="line.513"></a>
<FONT color="green">514</FONT>                        } else {<a name="line.514"></a>
<FONT color="green">515</FONT>                            throw x;<a name="line.515"></a>
<FONT color="green">516</FONT>                        }<a name="line.516"></a>
<FONT color="green">517</FONT>                    } else {<a name="line.517"></a>
<FONT color="green">518</FONT>                        throw x;<a name="line.518"></a>
<FONT color="green">519</FONT>                    }<a name="line.519"></a>
<FONT color="green">520</FONT>                }<a name="line.520"></a>
<FONT color="green">521</FONT>            }<a name="line.521"></a>
<FONT color="green">522</FONT>    <a name="line.522"></a>
<FONT color="green">523</FONT>            return providerClass;<a name="line.523"></a>
<FONT color="green">524</FONT>        }<a name="line.524"></a>
<FONT color="green">525</FONT>    <a name="line.525"></a>
<FONT color="green">526</FONT>        /**<a name="line.526"></a>
<FONT color="green">527</FONT>         * Find the name of service provider using Jar Service Provider Mechanism<a name="line.527"></a>
<FONT color="green">528</FONT>         *<a name="line.528"></a>
<FONT color="green">529</FONT>         * @return instance of provider class if found or null<a name="line.529"></a>
<FONT color="green">530</FONT>         */<a name="line.530"></a>
<FONT color="green">531</FONT>        private static String findJarServiceProviderName(String factoryId)<a name="line.531"></a>
<FONT color="green">532</FONT>        {<a name="line.532"></a>
<FONT color="green">533</FONT>            String serviceId = SERVICES_PATH + factoryId;<a name="line.533"></a>
<FONT color="green">534</FONT>            InputStream is = null;<a name="line.534"></a>
<FONT color="green">535</FONT>    <a name="line.535"></a>
<FONT color="green">536</FONT>            // First try the Context ClassLoader<a name="line.536"></a>
<FONT color="green">537</FONT>            ClassLoader cl = findClassLoader();<a name="line.537"></a>
<FONT color="green">538</FONT>    <a name="line.538"></a>
<FONT color="green">539</FONT>            is = SecuritySupport.getResourceAsStream(cl, serviceId);<a name="line.539"></a>
<FONT color="green">540</FONT>    <a name="line.540"></a>
<FONT color="green">541</FONT>            // If no provider found then try the current ClassLoader<a name="line.541"></a>
<FONT color="green">542</FONT>            if (is == null) {<a name="line.542"></a>
<FONT color="green">543</FONT>                ClassLoader current = ObjectFactory.class.getClassLoader();<a name="line.543"></a>
<FONT color="green">544</FONT>                if (cl != current) {<a name="line.544"></a>
<FONT color="green">545</FONT>                    cl = current;<a name="line.545"></a>
<FONT color="green">546</FONT>                    is = SecuritySupport.getResourceAsStream(cl, serviceId);<a name="line.546"></a>
<FONT color="green">547</FONT>                }<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>            if (is == null) {<a name="line.550"></a>
<FONT color="green">551</FONT>                // No provider found<a name="line.551"></a>
<FONT color="green">552</FONT>                return null;<a name="line.552"></a>
<FONT color="green">553</FONT>            }<a name="line.553"></a>
<FONT color="green">554</FONT>    <a name="line.554"></a>
<FONT color="green">555</FONT>            debugPrintln("found jar resource=" + serviceId +<a name="line.555"></a>
<FONT color="green">556</FONT>                   " using ClassLoader: " + cl);<a name="line.556"></a>
<FONT color="green">557</FONT>    <a name="line.557"></a>
<FONT color="green">558</FONT>            // Read the service provider name in UTF-8 as specified in<a name="line.558"></a>
<FONT color="green">559</FONT>            // the jar spec.  Unfortunately this fails in Microsoft<a name="line.559"></a>
<FONT color="green">560</FONT>            // VJ++, which does not implement the UTF-8<a name="line.560"></a>
<FONT color="green">561</FONT>            // encoding. Theoretically, we should simply let it fail in<a name="line.561"></a>
<FONT color="green">562</FONT>            // that case, since the JVM is obviously broken if it<a name="line.562"></a>
<FONT color="green">563</FONT>            // doesn't support such a basic standard.  But since there<a name="line.563"></a>
<FONT color="green">564</FONT>            // are still some users attempting to use VJ++ for<a name="line.564"></a>
<FONT color="green">565</FONT>            // development, we have dropped in a fallback which makes a<a name="line.565"></a>
<FONT color="green">566</FONT>            // second attempt using the platform's default encoding. In<a name="line.566"></a>
<FONT color="green">567</FONT>            // VJ++ this is apparently ASCII, which is a subset of<a name="line.567"></a>
<FONT color="green">568</FONT>            // UTF-8... and since the strings we'll be reading here are<a name="line.568"></a>
<FONT color="green">569</FONT>            // also primarily limited to the 7-bit ASCII range (at<a name="line.569"></a>
<FONT color="green">570</FONT>            // least, in English versions), this should work well<a name="line.570"></a>
<FONT color="green">571</FONT>            // enough to keep us on the air until we're ready to<a name="line.571"></a>
<FONT color="green">572</FONT>            // officially decommit from VJ++. [Edited comment from<a name="line.572"></a>
<FONT color="green">573</FONT>            // jkesselm]<a name="line.573"></a>
<FONT color="green">574</FONT>            BufferedReader rd;<a name="line.574"></a>
<FONT color="green">575</FONT>            try {<a name="line.575"></a>
<FONT color="green">576</FONT>                rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));<a name="line.576"></a>
<FONT color="green">577</FONT>            } catch (java.io.UnsupportedEncodingException e) {<a name="line.577"></a>
<FONT color="green">578</FONT>                rd = new BufferedReader(new InputStreamReader(is));<a name="line.578"></a>
<FONT color="green">579</FONT>            }<a name="line.579"></a>
<FONT color="green">580</FONT>            <a name="line.580"></a>
<FONT color="green">581</FONT>            String factoryClassName = null;<a name="line.581"></a>
<FONT color="green">582</FONT>            try {<a name="line.582"></a>
<FONT color="green">583</FONT>                // XXX Does not handle all possible input as specified by the<a name="line.583"></a>
<FONT color="green">584</FONT>                // Jar Service Provider specification<a name="line.584"></a>
<FONT color="green">585</FONT>                factoryClassName = rd.readLine();<a name="line.585"></a>
<FONT color="green">586</FONT>            } catch (IOException x) {<a name="line.586"></a>
<FONT color="green">587</FONT>                // No provider found<a name="line.587"></a>
<FONT color="green">588</FONT>                return null;<a name="line.588"></a>
<FONT color="green">589</FONT>            }<a name="line.589"></a>
<FONT color="green">590</FONT>            finally {<a name="line.590"></a>
<FONT color="green">591</FONT>                try {<a name="line.591"></a>
<FONT color="green">592</FONT>                    // try to close the reader.<a name="line.592"></a>
<FONT color="green">593</FONT>                    rd.close();<a name="line.593"></a>
<FONT color="green">594</FONT>                }<a name="line.594"></a>
<FONT color="green">595</FONT>                // Ignore the exception.<a name="line.595"></a>
<FONT color="green">596</FONT>                catch (IOException exc) {}<a name="line.596"></a>
<FONT color="green">597</FONT>            }          <a name="line.597"></a>
<FONT color="green">598</FONT>    <a name="line.598"></a>
<FONT color="green">599</FONT>            if (factoryClassName != null &amp;&amp;<a name="line.599"></a>
<FONT color="green">600</FONT>                ! "".equals(factoryClassName)) {<a name="line.600"></a>
<FONT color="green">601</FONT>                debugPrintln("found in resource, value="<a name="line.601"></a>
<FONT color="green">602</FONT>                       + factoryClassName);<a name="line.602"></a>
<FONT color="green">603</FONT>    <a name="line.603"></a>
<FONT color="green">604</FONT>                // Note: here we do not want to fall back to the current<a name="line.604"></a>
<FONT color="green">605</FONT>                // ClassLoader because we want to avoid the case where the<a name="line.605"></a>
<FONT color="green">606</FONT>                // resource file was found using one ClassLoader and the<a name="line.606"></a>
<FONT color="green">607</FONT>                // provider class was instantiated using a different one.<a name="line.607"></a>
<FONT color="green">608</FONT>                return factoryClassName;<a name="line.608"></a>
<FONT color="green">609</FONT>            }<a name="line.609"></a>
<FONT color="green">610</FONT>    <a name="line.610"></a>
<FONT color="green">611</FONT>            // No provider found<a name="line.611"></a>
<FONT color="green">612</FONT>            return null;<a name="line.612"></a>
<FONT color="green">613</FONT>        }<a name="line.613"></a>
<FONT color="green">614</FONT>    <a name="line.614"></a>
<FONT color="green">615</FONT>        //<a name="line.615"></a>
<FONT color="green">616</FONT>        // Classes<a name="line.616"></a>
<FONT color="green">617</FONT>        //<a name="line.617"></a>
<FONT color="green">618</FONT>    <a name="line.618"></a>
<FONT color="green">619</FONT>        /**<a name="line.619"></a>
<FONT color="green">620</FONT>         * A configuration error.<a name="line.620"></a>
<FONT color="green">621</FONT>         */<a name="line.621"></a>
<FONT color="green">622</FONT>        static class ConfigurationError <a name="line.622"></a>
<FONT color="green">623</FONT>            extends Error {<a name="line.623"></a>
<FONT color="green">624</FONT>                    static final long serialVersionUID = -2293620736651286953L;<a name="line.624"></a>
<FONT color="green">625</FONT>            //<a name="line.625"></a>
<FONT color="green">626</FONT>            // Data<a name="line.626"></a>
<FONT color="green">627</FONT>            //<a name="line.627"></a>
<FONT color="green">628</FONT>    <a name="line.628"></a>
<FONT color="green">629</FONT>            /** Exception. */<a name="line.629"></a>
<FONT color="green">630</FONT>            private Exception exception;<a name="line.630"></a>
<FONT color="green">631</FONT>    <a name="line.631"></a>
<FONT color="green">632</FONT>            //<a name="line.632"></a>
<FONT color="green">633</FONT>            // Constructors<a name="line.633"></a>
<FONT color="green">634</FONT>            //<a name="line.634"></a>
<FONT color="green">635</FONT>    <a name="line.635"></a>
<FONT color="green">636</FONT>            /**<a name="line.636"></a>
<FONT color="green">637</FONT>             * Construct a new instance with the specified detail string and<a name="line.637"></a>
<FONT color="green">638</FONT>             * exception.<a name="line.638"></a>
<FONT color="green">639</FONT>             */<a name="line.639"></a>
<FONT color="green">640</FONT>            ConfigurationError(String msg, Exception x) {<a name="line.640"></a>
<FONT color="green">641</FONT>                super(msg);<a name="line.641"></a>
<FONT color="green">642</FONT>                this.exception = x;<a name="line.642"></a>
<FONT color="green">643</FONT>            } // &lt;init&gt;(String,Exception)<a name="line.643"></a>
<FONT color="green">644</FONT>    <a name="line.644"></a>
<FONT color="green">645</FONT>            //<a name="line.645"></a>
<FONT color="green">646</FONT>            // Public methods<a name="line.646"></a>
<FONT color="green">647</FONT>            //<a name="line.647"></a>
<FONT color="green">648</FONT>    <a name="line.648"></a>
<FONT color="green">649</FONT>            /** Returns the exception associated to this error. */<a name="line.649"></a>
<FONT color="green">650</FONT>            Exception getException() {<a name="line.650"></a>
<FONT color="green">651</FONT>                return exception;<a name="line.651"></a>
<FONT color="green">652</FONT>            } // getException():Exception<a name="line.652"></a>
<FONT color="green">653</FONT>    <a name="line.653"></a>
<FONT color="green">654</FONT>        } // class ConfigurationError<a name="line.654"></a>
<FONT color="green">655</FONT>    <a name="line.655"></a>
<FONT color="green">656</FONT>    } // class ObjectFactory<a name="line.656"></a>




























































</PRE>
</BODY>
</HTML>
