<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
<span class="sourceLineNo">003</span> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
<span class="sourceLineNo">004</span> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
<span class="sourceLineNo">005</span> * The ASF licenses this file to You under the Apache license, Version 2.0<a name="line.5"></a>
<span class="sourceLineNo">006</span> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
<span class="sourceLineNo">007</span> * the License. You may obtain a copy of the License at<a name="line.7"></a>
<span class="sourceLineNo">008</span> *<a name="line.8"></a>
<span class="sourceLineNo">009</span> *      http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
<span class="sourceLineNo">010</span> *<a name="line.10"></a>
<span class="sourceLineNo">011</span> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
<span class="sourceLineNo">012</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
<span class="sourceLineNo">013</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
<span class="sourceLineNo">014</span> * See the license for the specific language governing permissions and<a name="line.14"></a>
<span class="sourceLineNo">015</span> * limitations under the license.<a name="line.15"></a>
<span class="sourceLineNo">016</span> */<a name="line.16"></a>
<span class="sourceLineNo">017</span>package org.apache.logging.log4j.util;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import java.io.IOException;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.lang.reflect.InvocationTargetException;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.net.URL;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.security.AccessController;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.security.PrivilegedAction;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.util.ArrayList;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.Collection;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.Enumeration;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.LinkedHashSet;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.Objects;<a name="line.29"></a>
<span class="sourceLineNo">030</span><a name="line.30"></a>
<span class="sourceLineNo">031</span>/**<a name="line.31"></a>
<span class="sourceLineNo">032</span> * &lt;em&gt;Consider this class private.&lt;/em&gt; Utility class for ClassLoaders.<a name="line.32"></a>
<span class="sourceLineNo">033</span> *<a name="line.33"></a>
<span class="sourceLineNo">034</span> * @see ClassLoader<a name="line.34"></a>
<span class="sourceLineNo">035</span> * @see RuntimePermission<a name="line.35"></a>
<span class="sourceLineNo">036</span> * @see Thread#getContextClassLoader()<a name="line.36"></a>
<span class="sourceLineNo">037</span> * @see ClassLoader#getSystemClassLoader()<a name="line.37"></a>
<span class="sourceLineNo">038</span> */<a name="line.38"></a>
<span class="sourceLineNo">039</span>public final class LoaderUtil {<a name="line.39"></a>
<span class="sourceLineNo">040</span><a name="line.40"></a>
<span class="sourceLineNo">041</span>    /**<a name="line.41"></a>
<span class="sourceLineNo">042</span>     * System property to set to ignore the thread context ClassLoader.<a name="line.42"></a>
<span class="sourceLineNo">043</span>     *<a name="line.43"></a>
<span class="sourceLineNo">044</span>     * @since 2.1<a name="line.44"></a>
<span class="sourceLineNo">045</span>     */<a name="line.45"></a>
<span class="sourceLineNo">046</span>    public static final String IGNORE_TCCL_PROPERTY = "log4j.ignoreTCL";<a name="line.46"></a>
<span class="sourceLineNo">047</span><a name="line.47"></a>
<span class="sourceLineNo">048</span>    private static final SecurityManager SECURITY_MANAGER = System.getSecurityManager();<a name="line.48"></a>
<span class="sourceLineNo">049</span><a name="line.49"></a>
<span class="sourceLineNo">050</span>    // this variable must be lazily loaded; otherwise, we get a nice circular class loading problem where LoaderUtil<a name="line.50"></a>
<span class="sourceLineNo">051</span>    // wants to use PropertiesUtil, but then PropertiesUtil wants to use LoaderUtil.<a name="line.51"></a>
<span class="sourceLineNo">052</span>    private static Boolean ignoreTCCL;<a name="line.52"></a>
<span class="sourceLineNo">053</span><a name="line.53"></a>
<span class="sourceLineNo">054</span>    private static final boolean GET_CLASS_LOADER_DISABLED;<a name="line.54"></a>
<span class="sourceLineNo">055</span><a name="line.55"></a>
<span class="sourceLineNo">056</span>    private static final PrivilegedAction&lt;ClassLoader&gt; TCCL_GETTER = new ThreadContextClassLoaderGetter();<a name="line.56"></a>
<span class="sourceLineNo">057</span><a name="line.57"></a>
<span class="sourceLineNo">058</span>    static {<a name="line.58"></a>
<span class="sourceLineNo">059</span>        if (SECURITY_MANAGER != null) {<a name="line.59"></a>
<span class="sourceLineNo">060</span>            boolean getClassLoaderDisabled;<a name="line.60"></a>
<span class="sourceLineNo">061</span>            try {<a name="line.61"></a>
<span class="sourceLineNo">062</span>                SECURITY_MANAGER.checkPermission(new RuntimePermission("getClassLoader"));<a name="line.62"></a>
<span class="sourceLineNo">063</span>                getClassLoaderDisabled = false;<a name="line.63"></a>
<span class="sourceLineNo">064</span>            } catch (final SecurityException ignored) {<a name="line.64"></a>
<span class="sourceLineNo">065</span>                getClassLoaderDisabled = true;<a name="line.65"></a>
<span class="sourceLineNo">066</span>            }<a name="line.66"></a>
<span class="sourceLineNo">067</span>            GET_CLASS_LOADER_DISABLED = getClassLoaderDisabled;<a name="line.67"></a>
<span class="sourceLineNo">068</span>        } else {<a name="line.68"></a>
<span class="sourceLineNo">069</span>            GET_CLASS_LOADER_DISABLED = false;<a name="line.69"></a>
<span class="sourceLineNo">070</span>        }<a name="line.70"></a>
<span class="sourceLineNo">071</span>    }<a name="line.71"></a>
<span class="sourceLineNo">072</span><a name="line.72"></a>
<span class="sourceLineNo">073</span>    private LoaderUtil() {<a name="line.73"></a>
<span class="sourceLineNo">074</span>    }<a name="line.74"></a>
<span class="sourceLineNo">075</span><a name="line.75"></a>
<span class="sourceLineNo">076</span>    /**<a name="line.76"></a>
<span class="sourceLineNo">077</span>     * Gets the current Thread ClassLoader. Returns the system ClassLoader if the TCCL is {@code null}. If the system<a name="line.77"></a>
<span class="sourceLineNo">078</span>     * ClassLoader is {@code null} as well, then the ClassLoader for this class is returned. If running with a<a name="line.78"></a>
<span class="sourceLineNo">079</span>     * {@link SecurityManager} that does not allow access to the Thread ClassLoader or system ClassLoader, then the<a name="line.79"></a>
<span class="sourceLineNo">080</span>     * ClassLoader for this class is returned.<a name="line.80"></a>
<span class="sourceLineNo">081</span>     *<a name="line.81"></a>
<span class="sourceLineNo">082</span>     * @return the current ThreadContextClassLoader.<a name="line.82"></a>
<span class="sourceLineNo">083</span>     */<a name="line.83"></a>
<span class="sourceLineNo">084</span>    public static ClassLoader getThreadContextClassLoader() {<a name="line.84"></a>
<span class="sourceLineNo">085</span>        if (GET_CLASS_LOADER_DISABLED) {<a name="line.85"></a>
<span class="sourceLineNo">086</span>            // we can at least get this class's ClassLoader regardless of security context<a name="line.86"></a>
<span class="sourceLineNo">087</span>            // however, if this is null, there's really no option left at this point<a name="line.87"></a>
<span class="sourceLineNo">088</span>            return LoaderUtil.class.getClassLoader();<a name="line.88"></a>
<span class="sourceLineNo">089</span>        }<a name="line.89"></a>
<span class="sourceLineNo">090</span>        return SECURITY_MANAGER == null ? TCCL_GETTER.run() : AccessController.doPrivileged(TCCL_GETTER);<a name="line.90"></a>
<span class="sourceLineNo">091</span>    }<a name="line.91"></a>
<span class="sourceLineNo">092</span><a name="line.92"></a>
<span class="sourceLineNo">093</span>    /**<a name="line.93"></a>
<span class="sourceLineNo">094</span>     *<a name="line.94"></a>
<span class="sourceLineNo">095</span>     */<a name="line.95"></a>
<span class="sourceLineNo">096</span>    private static class ThreadContextClassLoaderGetter implements PrivilegedAction&lt;ClassLoader&gt; {<a name="line.96"></a>
<span class="sourceLineNo">097</span>        @Override<a name="line.97"></a>
<span class="sourceLineNo">098</span>        public ClassLoader run() {<a name="line.98"></a>
<span class="sourceLineNo">099</span>            final ClassLoader cl = Thread.currentThread().getContextClassLoader();<a name="line.99"></a>
<span class="sourceLineNo">100</span>            if (cl != null) {<a name="line.100"></a>
<span class="sourceLineNo">101</span>                return cl;<a name="line.101"></a>
<span class="sourceLineNo">102</span>            }<a name="line.102"></a>
<span class="sourceLineNo">103</span>            final ClassLoader ccl = LoaderUtil.class.getClassLoader();<a name="line.103"></a>
<span class="sourceLineNo">104</span>            return ccl == null &amp;&amp; !GET_CLASS_LOADER_DISABLED ? ClassLoader.getSystemClassLoader() : ccl;<a name="line.104"></a>
<span class="sourceLineNo">105</span>        }<a name="line.105"></a>
<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
<span class="sourceLineNo">107</span><a name="line.107"></a>
<span class="sourceLineNo">108</span>    public static ClassLoader[] getClassLoaders() {<a name="line.108"></a>
<span class="sourceLineNo">109</span>        final List&lt;ClassLoader&gt; classLoaders = new ArrayList&lt;&gt;();<a name="line.109"></a>
<span class="sourceLineNo">110</span>        final ClassLoader tcl = getThreadContextClassLoader();<a name="line.110"></a>
<span class="sourceLineNo">111</span>        classLoaders.add(tcl);<a name="line.111"></a>
<span class="sourceLineNo">112</span>        // Some implementations may use null to represent the bootstrap class loader.<a name="line.112"></a>
<span class="sourceLineNo">113</span>        final ClassLoader current = LoaderUtil.class.getClassLoader();<a name="line.113"></a>
<span class="sourceLineNo">114</span>        if (current != null &amp;&amp; current != tcl) {<a name="line.114"></a>
<span class="sourceLineNo">115</span>            classLoaders.add(current);<a name="line.115"></a>
<span class="sourceLineNo">116</span>            final ClassLoader parent = current.getParent();<a name="line.116"></a>
<span class="sourceLineNo">117</span>            while (parent != null &amp;&amp; !classLoaders.contains(parent)) {<a name="line.117"></a>
<span class="sourceLineNo">118</span>                classLoaders.add(parent);<a name="line.118"></a>
<span class="sourceLineNo">119</span>            }<a name="line.119"></a>
<span class="sourceLineNo">120</span>        }<a name="line.120"></a>
<span class="sourceLineNo">121</span>        ClassLoader parent = tcl == null ? null : tcl.getParent();<a name="line.121"></a>
<span class="sourceLineNo">122</span>        while (parent != null &amp;&amp; !classLoaders.contains(parent)) {<a name="line.122"></a>
<span class="sourceLineNo">123</span>            classLoaders.add(parent);<a name="line.123"></a>
<span class="sourceLineNo">124</span>            parent = parent.getParent();<a name="line.124"></a>
<span class="sourceLineNo">125</span>        }<a name="line.125"></a>
<span class="sourceLineNo">126</span>        final ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();<a name="line.126"></a>
<span class="sourceLineNo">127</span>                if (!classLoaders.contains(systemClassLoader)) {<a name="line.127"></a>
<span class="sourceLineNo">128</span>            classLoaders.add(systemClassLoader);<a name="line.128"></a>
<span class="sourceLineNo">129</span>        }<a name="line.129"></a>
<span class="sourceLineNo">130</span>        return classLoaders.toArray(new ClassLoader[classLoaders.size()]);<a name="line.130"></a>
<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
<span class="sourceLineNo">132</span><a name="line.132"></a>
<span class="sourceLineNo">133</span>    /**<a name="line.133"></a>
<span class="sourceLineNo">134</span>     * Determines if a named Class can be loaded or not.<a name="line.134"></a>
<span class="sourceLineNo">135</span>     *<a name="line.135"></a>
<span class="sourceLineNo">136</span>     * @param className The class name.<a name="line.136"></a>
<span class="sourceLineNo">137</span>     * @return {@code true} if the class could be found or {@code false} otherwise.<a name="line.137"></a>
<span class="sourceLineNo">138</span>     * @since 2.7<a name="line.138"></a>
<span class="sourceLineNo">139</span>     */<a name="line.139"></a>
<span class="sourceLineNo">140</span>    public static boolean isClassAvailable(final String className) {<a name="line.140"></a>
<span class="sourceLineNo">141</span>        try {<a name="line.141"></a>
<span class="sourceLineNo">142</span>            final Class&lt;?&gt; clazz = loadClass(className);<a name="line.142"></a>
<span class="sourceLineNo">143</span>            return clazz != null;<a name="line.143"></a>
<span class="sourceLineNo">144</span>        } catch (final ClassNotFoundException | LinkageError e) {<a name="line.144"></a>
<span class="sourceLineNo">145</span>            return false;<a name="line.145"></a>
<span class="sourceLineNo">146</span>        } catch (final Throwable e) {<a name="line.146"></a>
<span class="sourceLineNo">147</span>            LowLevelLogUtil.logException("Unknown error checking for existence of class: " + className, e);<a name="line.147"></a>
<span class="sourceLineNo">148</span>            return false;<a name="line.148"></a>
<span class="sourceLineNo">149</span>        }<a name="line.149"></a>
<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
<span class="sourceLineNo">151</span><a name="line.151"></a>
<span class="sourceLineNo">152</span>    /**<a name="line.152"></a>
<span class="sourceLineNo">153</span>     * Loads a class by name. This method respects the {@link #IGNORE_TCCL_PROPERTY} Log4j property. If this property is<a name="line.153"></a>
<span class="sourceLineNo">154</span>     * specified and set to anything besides {@code false}, then the default ClassLoader will be used.<a name="line.154"></a>
<span class="sourceLineNo">155</span>     *<a name="line.155"></a>
<span class="sourceLineNo">156</span>     * @param className The class name.<a name="line.156"></a>
<span class="sourceLineNo">157</span>     * @return the Class for the given name.<a name="line.157"></a>
<span class="sourceLineNo">158</span>     * @throws ClassNotFoundException if the specified class name could not be found<a name="line.158"></a>
<span class="sourceLineNo">159</span>     * @since 2.1<a name="line.159"></a>
<span class="sourceLineNo">160</span>     */<a name="line.160"></a>
<span class="sourceLineNo">161</span>    public static Class&lt;?&gt; loadClass(final String className) throws ClassNotFoundException {<a name="line.161"></a>
<span class="sourceLineNo">162</span>        if (isIgnoreTccl()) {<a name="line.162"></a>
<span class="sourceLineNo">163</span>            return Class.forName(className);<a name="line.163"></a>
<span class="sourceLineNo">164</span>        }<a name="line.164"></a>
<span class="sourceLineNo">165</span>        try {<a name="line.165"></a>
<span class="sourceLineNo">166</span>            return getThreadContextClassLoader().loadClass(className);<a name="line.166"></a>
<span class="sourceLineNo">167</span>        } catch (final Throwable ignored) {<a name="line.167"></a>
<span class="sourceLineNo">168</span>            return Class.forName(className);<a name="line.168"></a>
<span class="sourceLineNo">169</span>        }<a name="line.169"></a>
<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
<span class="sourceLineNo">171</span><a name="line.171"></a>
<span class="sourceLineNo">172</span>    /**<a name="line.172"></a>
<span class="sourceLineNo">173</span>     * Loads and instantiates a Class using the default constructor.<a name="line.173"></a>
<span class="sourceLineNo">174</span>     *<a name="line.174"></a>
<span class="sourceLineNo">175</span>     * @param clazz The class.<a name="line.175"></a>
<span class="sourceLineNo">176</span>     * @return new instance of the class.<a name="line.176"></a>
<span class="sourceLineNo">177</span>     * @throws IllegalAccessException if the class can't be instantiated through a public constructor<a name="line.177"></a>
<span class="sourceLineNo">178</span>     * @throws InstantiationException if there was an exception whilst instantiating the class<a name="line.178"></a>
<span class="sourceLineNo">179</span>     * @throws InvocationTargetException if there was an exception whilst constructing the class<a name="line.179"></a>
<span class="sourceLineNo">180</span>     * @since 2.7<a name="line.180"></a>
<span class="sourceLineNo">181</span>     */<a name="line.181"></a>
<span class="sourceLineNo">182</span>    public static &lt;T&gt; T newInstanceOf(final Class&lt;T&gt; clazz)<a name="line.182"></a>
<span class="sourceLineNo">183</span>            throws InstantiationException, IllegalAccessException, InvocationTargetException {<a name="line.183"></a>
<span class="sourceLineNo">184</span>        try {<a name="line.184"></a>
<span class="sourceLineNo">185</span>            return clazz.getConstructor().newInstance();<a name="line.185"></a>
<span class="sourceLineNo">186</span>        } catch (final NoSuchMethodException ignored) {<a name="line.186"></a>
<span class="sourceLineNo">187</span>            // FIXME: looking at the code for Class.newInstance(), this seems to do the same thing as above<a name="line.187"></a>
<span class="sourceLineNo">188</span>            return clazz.newInstance();<a name="line.188"></a>
<span class="sourceLineNo">189</span>        }<a name="line.189"></a>
<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
<span class="sourceLineNo">191</span><a name="line.191"></a>
<span class="sourceLineNo">192</span>    /**<a name="line.192"></a>
<span class="sourceLineNo">193</span>     * Loads and instantiates a Class using the default constructor.<a name="line.193"></a>
<span class="sourceLineNo">194</span>     *<a name="line.194"></a>
<span class="sourceLineNo">195</span>     * @param className The class name.<a name="line.195"></a>
<span class="sourceLineNo">196</span>     * @return new instance of the class.<a name="line.196"></a>
<span class="sourceLineNo">197</span>     * @throws ClassNotFoundException if the class isn't available to the usual ClassLoaders<a name="line.197"></a>
<span class="sourceLineNo">198</span>     * @throws IllegalAccessException if the class can't be instantiated through a public constructor<a name="line.198"></a>
<span class="sourceLineNo">199</span>     * @throws InstantiationException if there was an exception whilst instantiating the class<a name="line.199"></a>
<span class="sourceLineNo">200</span>     * @throws NoSuchMethodException if there isn't a no-args constructor on the class<a name="line.200"></a>
<span class="sourceLineNo">201</span>     * @throws InvocationTargetException if there was an exception whilst constructing the class<a name="line.201"></a>
<span class="sourceLineNo">202</span>     * @since 2.1<a name="line.202"></a>
<span class="sourceLineNo">203</span>     */<a name="line.203"></a>
<span class="sourceLineNo">204</span>    @SuppressWarnings("unchecked")<a name="line.204"></a>
<span class="sourceLineNo">205</span>    public static &lt;T&gt; T newInstanceOf(final String className) throws ClassNotFoundException, IllegalAccessException,<a name="line.205"></a>
<span class="sourceLineNo">206</span>            InstantiationException, NoSuchMethodException, InvocationTargetException {<a name="line.206"></a>
<span class="sourceLineNo">207</span>        return newInstanceOf((Class&lt;T&gt;) loadClass(className));<a name="line.207"></a>
<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
<span class="sourceLineNo">209</span><a name="line.209"></a>
<span class="sourceLineNo">210</span>    /**<a name="line.210"></a>
<span class="sourceLineNo">211</span>     * Loads and instantiates a derived class using its default constructor.<a name="line.211"></a>
<span class="sourceLineNo">212</span>     *<a name="line.212"></a>
<span class="sourceLineNo">213</span>     * @param className The class name.<a name="line.213"></a>
<span class="sourceLineNo">214</span>     * @param clazz The class to cast it to.<a name="line.214"></a>
<span class="sourceLineNo">215</span>     * @param &lt;T&gt; The type of the class to check.<a name="line.215"></a>
<span class="sourceLineNo">216</span>     * @return new instance of the class cast to {@code T}<a name="line.216"></a>
<span class="sourceLineNo">217</span>     * @throws ClassNotFoundException if the class isn't available to the usual ClassLoaders<a name="line.217"></a>
<span class="sourceLineNo">218</span>     * @throws IllegalAccessException if the class can't be instantiated through a public constructor<a name="line.218"></a>
<span class="sourceLineNo">219</span>     * @throws InstantiationException if there was an exception whilst instantiating the class<a name="line.219"></a>
<span class="sourceLineNo">220</span>     * @throws NoSuchMethodException if there isn't a no-args constructor on the class<a name="line.220"></a>
<span class="sourceLineNo">221</span>     * @throws InvocationTargetException if there was an exception whilst constructing the class<a name="line.221"></a>
<span class="sourceLineNo">222</span>     * @throws ClassCastException if the constructed object isn't type compatible with {@code T}<a name="line.222"></a>
<span class="sourceLineNo">223</span>     * @since 2.1<a name="line.223"></a>
<span class="sourceLineNo">224</span>     */<a name="line.224"></a>
<span class="sourceLineNo">225</span>    public static &lt;T&gt; T newCheckedInstanceOf(final String className, final Class&lt;T&gt; clazz)<a name="line.225"></a>
<span class="sourceLineNo">226</span>            throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException,<a name="line.226"></a>
<span class="sourceLineNo">227</span>            IllegalAccessException {<a name="line.227"></a>
<span class="sourceLineNo">228</span>        return clazz.cast(newInstanceOf(className));<a name="line.228"></a>
<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
<span class="sourceLineNo">230</span><a name="line.230"></a>
<span class="sourceLineNo">231</span>    /**<a name="line.231"></a>
<span class="sourceLineNo">232</span>     * Loads and instantiates a class given by a property name.<a name="line.232"></a>
<span class="sourceLineNo">233</span>     *<a name="line.233"></a>
<span class="sourceLineNo">234</span>     * @param propertyName The property name to look up a class name for.<a name="line.234"></a>
<span class="sourceLineNo">235</span>     * @param clazz        The class to cast it to.<a name="line.235"></a>
<span class="sourceLineNo">236</span>     * @param &lt;T&gt;          The type to cast it to.<a name="line.236"></a>
<span class="sourceLineNo">237</span>     * @return new instance of the class given in the property or {@code null} if the property was unset.<a name="line.237"></a>
<span class="sourceLineNo">238</span>     * @throws ClassNotFoundException    if the class isn't available to the usual ClassLoaders<a name="line.238"></a>
<span class="sourceLineNo">239</span>     * @throws IllegalAccessException    if the class can't be instantiated through a public constructor<a name="line.239"></a>
<span class="sourceLineNo">240</span>     * @throws InstantiationException    if there was an exception whilst instantiating the class<a name="line.240"></a>
<span class="sourceLineNo">241</span>     * @throws NoSuchMethodException     if there isn't a no-args constructor on the class<a name="line.241"></a>
<span class="sourceLineNo">242</span>     * @throws InvocationTargetException if there was an exception whilst constructing the class<a name="line.242"></a>
<span class="sourceLineNo">243</span>     * @throws ClassCastException        if the constructed object isn't type compatible with {@code T}<a name="line.243"></a>
<span class="sourceLineNo">244</span>     * @since 2.5<a name="line.244"></a>
<span class="sourceLineNo">245</span>     */<a name="line.245"></a>
<span class="sourceLineNo">246</span>    public static &lt;T&gt; T newCheckedInstanceOfProperty(final String propertyName, final Class&lt;T&gt; clazz)<a name="line.246"></a>
<span class="sourceLineNo">247</span>        throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException,<a name="line.247"></a>
<span class="sourceLineNo">248</span>        IllegalAccessException {<a name="line.248"></a>
<span class="sourceLineNo">249</span>        final String className = PropertiesUtil.getProperties().getStringProperty(propertyName);<a name="line.249"></a>
<span class="sourceLineNo">250</span>        if (className == null) {<a name="line.250"></a>
<span class="sourceLineNo">251</span>            return null;<a name="line.251"></a>
<span class="sourceLineNo">252</span>        }<a name="line.252"></a>
<span class="sourceLineNo">253</span>        return newCheckedInstanceOf(className, clazz);<a name="line.253"></a>
<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
<span class="sourceLineNo">255</span><a name="line.255"></a>
<span class="sourceLineNo">256</span>    private static boolean isIgnoreTccl() {<a name="line.256"></a>
<span class="sourceLineNo">257</span>        // we need to lazily initialize this, but concurrent access is not an issue<a name="line.257"></a>
<span class="sourceLineNo">258</span>        if (ignoreTCCL == null) {<a name="line.258"></a>
<span class="sourceLineNo">259</span>            final String ignoreTccl = PropertiesUtil.getProperties().getStringProperty(IGNORE_TCCL_PROPERTY, null);<a name="line.259"></a>
<span class="sourceLineNo">260</span>            ignoreTCCL = ignoreTccl != null &amp;&amp; !"false".equalsIgnoreCase(ignoreTccl.trim());<a name="line.260"></a>
<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
<span class="sourceLineNo">262</span>        return ignoreTCCL;<a name="line.262"></a>
<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
<span class="sourceLineNo">264</span><a name="line.264"></a>
<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
<span class="sourceLineNo">266</span>     * Finds classpath {@linkplain URL resources}.<a name="line.266"></a>
<span class="sourceLineNo">267</span>     *<a name="line.267"></a>
<span class="sourceLineNo">268</span>     * @param resource the name of the resource to find.<a name="line.268"></a>
<span class="sourceLineNo">269</span>     * @return a Collection of URLs matching the resource name. If no resources could be found, then this will be empty.<a name="line.269"></a>
<span class="sourceLineNo">270</span>     * @since 2.1<a name="line.270"></a>
<span class="sourceLineNo">271</span>     */<a name="line.271"></a>
<span class="sourceLineNo">272</span>    public static Collection&lt;URL&gt; findResources(final String resource) {<a name="line.272"></a>
<span class="sourceLineNo">273</span>        final Collection&lt;UrlResource&gt; urlResources = findUrlResources(resource);<a name="line.273"></a>
<span class="sourceLineNo">274</span>        final Collection&lt;URL&gt; resources = new LinkedHashSet&lt;&gt;(urlResources.size());<a name="line.274"></a>
<span class="sourceLineNo">275</span>        for (final UrlResource urlResource : urlResources) {<a name="line.275"></a>
<span class="sourceLineNo">276</span>            resources.add(urlResource.getUrl());<a name="line.276"></a>
<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
<span class="sourceLineNo">278</span>        return resources;<a name="line.278"></a>
<span class="sourceLineNo">279</span>    }<a name="line.279"></a>
<span class="sourceLineNo">280</span><a name="line.280"></a>
<span class="sourceLineNo">281</span>    static Collection&lt;UrlResource&gt; findUrlResources(final String resource) {<a name="line.281"></a>
<span class="sourceLineNo">282</span>        // @formatter:off<a name="line.282"></a>
<span class="sourceLineNo">283</span>        final ClassLoader[] candidates = {<a name="line.283"></a>
<span class="sourceLineNo">284</span>                getThreadContextClassLoader(), <a name="line.284"></a>
<span class="sourceLineNo">285</span>                LoaderUtil.class.getClassLoader(),<a name="line.285"></a>
<span class="sourceLineNo">286</span>                GET_CLASS_LOADER_DISABLED ? null : ClassLoader.getSystemClassLoader()};<a name="line.286"></a>
<span class="sourceLineNo">287</span>        // @formatter:on<a name="line.287"></a>
<span class="sourceLineNo">288</span>        final Collection&lt;UrlResource&gt; resources = new LinkedHashSet&lt;&gt;();<a name="line.288"></a>
<span class="sourceLineNo">289</span>        for (final ClassLoader cl : candidates) {<a name="line.289"></a>
<span class="sourceLineNo">290</span>            if (cl != null) {<a name="line.290"></a>
<span class="sourceLineNo">291</span>                try {<a name="line.291"></a>
<span class="sourceLineNo">292</span>                    final Enumeration&lt;URL&gt; resourceEnum = cl.getResources(resource);<a name="line.292"></a>
<span class="sourceLineNo">293</span>                    while (resourceEnum.hasMoreElements()) {<a name="line.293"></a>
<span class="sourceLineNo">294</span>                        resources.add(new UrlResource(cl, resourceEnum.nextElement()));<a name="line.294"></a>
<span class="sourceLineNo">295</span>                    }<a name="line.295"></a>
<span class="sourceLineNo">296</span>                } catch (final IOException e) {<a name="line.296"></a>
<span class="sourceLineNo">297</span>                    LowLevelLogUtil.logException(e);<a name="line.297"></a>
<span class="sourceLineNo">298</span>                }<a name="line.298"></a>
<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
<span class="sourceLineNo">301</span>        return resources;<a name="line.301"></a>
<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
<span class="sourceLineNo">303</span><a name="line.303"></a>
<span class="sourceLineNo">304</span>    /**<a name="line.304"></a>
<span class="sourceLineNo">305</span>     * {@link URL} and {@link ClassLoader} pair.<a name="line.305"></a>
<span class="sourceLineNo">306</span>     */<a name="line.306"></a>
<span class="sourceLineNo">307</span>    static class UrlResource {<a name="line.307"></a>
<span class="sourceLineNo">308</span>        private final ClassLoader classLoader;<a name="line.308"></a>
<span class="sourceLineNo">309</span>        private final URL url;<a name="line.309"></a>
<span class="sourceLineNo">310</span><a name="line.310"></a>
<span class="sourceLineNo">311</span>        UrlResource(final ClassLoader classLoader, final URL url) {<a name="line.311"></a>
<span class="sourceLineNo">312</span>            this.classLoader = classLoader;<a name="line.312"></a>
<span class="sourceLineNo">313</span>            this.url = url;<a name="line.313"></a>
<span class="sourceLineNo">314</span>        }<a name="line.314"></a>
<span class="sourceLineNo">315</span><a name="line.315"></a>
<span class="sourceLineNo">316</span>        public ClassLoader getClassLoader() {<a name="line.316"></a>
<span class="sourceLineNo">317</span>            return classLoader;<a name="line.317"></a>
<span class="sourceLineNo">318</span>        }<a name="line.318"></a>
<span class="sourceLineNo">319</span><a name="line.319"></a>
<span class="sourceLineNo">320</span>        public URL getUrl() {<a name="line.320"></a>
<span class="sourceLineNo">321</span>            return url;<a name="line.321"></a>
<span class="sourceLineNo">322</span>        }<a name="line.322"></a>
<span class="sourceLineNo">323</span><a name="line.323"></a>
<span class="sourceLineNo">324</span>        @Override<a name="line.324"></a>
<span class="sourceLineNo">325</span>        public boolean equals(final Object o) {<a name="line.325"></a>
<span class="sourceLineNo">326</span>            if (this == o) {<a name="line.326"></a>
<span class="sourceLineNo">327</span>                return true;<a name="line.327"></a>
<span class="sourceLineNo">328</span>            }<a name="line.328"></a>
<span class="sourceLineNo">329</span>            if (o == null || getClass() != o.getClass()) {<a name="line.329"></a>
<span class="sourceLineNo">330</span>                return false;<a name="line.330"></a>
<span class="sourceLineNo">331</span>            }<a name="line.331"></a>
<span class="sourceLineNo">332</span><a name="line.332"></a>
<span class="sourceLineNo">333</span>            final UrlResource that = (UrlResource) o;<a name="line.333"></a>
<span class="sourceLineNo">334</span><a name="line.334"></a>
<span class="sourceLineNo">335</span>            if (classLoader != null ? !classLoader.equals(that.classLoader) : that.classLoader != null) {<a name="line.335"></a>
<span class="sourceLineNo">336</span>                return false;<a name="line.336"></a>
<span class="sourceLineNo">337</span>            }<a name="line.337"></a>
<span class="sourceLineNo">338</span>            if (url != null ? !url.equals(that.url) : that.url != null) {<a name="line.338"></a>
<span class="sourceLineNo">339</span>                return false;<a name="line.339"></a>
<span class="sourceLineNo">340</span>            }<a name="line.340"></a>
<span class="sourceLineNo">341</span><a name="line.341"></a>
<span class="sourceLineNo">342</span>            return true;<a name="line.342"></a>
<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
<span class="sourceLineNo">344</span><a name="line.344"></a>
<span class="sourceLineNo">345</span>        @Override<a name="line.345"></a>
<span class="sourceLineNo">346</span>        public int hashCode() {<a name="line.346"></a>
<span class="sourceLineNo">347</span>            return Objects.hashCode(classLoader) + Objects.hashCode(url);<a name="line.347"></a>
<span class="sourceLineNo">348</span>        }<a name="line.348"></a>
<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
<span class="sourceLineNo">350</span>}<a name="line.350"></a>




























































</pre>
</div>
</body>
</html>
