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




























































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