<!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.io.InputStream;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.nio.charset.Charset;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.time.Duration;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.time.temporal.ChronoUnit;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.time.temporal.TemporalUnit;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.Collections;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.Properties;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.util.ResourceBundle;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import java.util.ServiceLoader;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.util.Set;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import java.util.TreeSet;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.34"></a>
<span class="sourceLineNo">035</span><a name="line.35"></a>
<span class="sourceLineNo">036</span>/**<a name="line.36"></a>
<span class="sourceLineNo">037</span> * &lt;em&gt;Consider this class private.&lt;/em&gt;<a name="line.37"></a>
<span class="sourceLineNo">038</span> * &lt;p&gt;<a name="line.38"></a>
<span class="sourceLineNo">039</span> * Provides utility methods for managing {@link Properties} instances as well as access to the global configuration<a name="line.39"></a>
<span class="sourceLineNo">040</span> * system. Properties by default are loaded from the system properties, system environment, and a classpath resource<a name="line.40"></a>
<span class="sourceLineNo">041</span> * file named {@value #LOG4J_PROPERTIES_FILE_NAME}. Additional properties can be loaded by implementing a custom<a name="line.41"></a>
<span class="sourceLineNo">042</span> * {@link PropertySource} service and specifying it via a {@link ServiceLoader} file called<a name="line.42"></a>
<span class="sourceLineNo">043</span> * {@code META-INF/services/org.apache.logging.log4j.util.PropertySource} with a list of fully qualified class names<a name="line.43"></a>
<span class="sourceLineNo">044</span> * implementing that interface.<a name="line.44"></a>
<span class="sourceLineNo">045</span> * &lt;/p&gt;<a name="line.45"></a>
<span class="sourceLineNo">046</span> *<a name="line.46"></a>
<span class="sourceLineNo">047</span> * @see PropertySource<a name="line.47"></a>
<span class="sourceLineNo">048</span> */<a name="line.48"></a>
<span class="sourceLineNo">049</span>public final class PropertiesUtil {<a name="line.49"></a>
<span class="sourceLineNo">050</span><a name="line.50"></a>
<span class="sourceLineNo">051</span>    private static final String LOG4J_PROPERTIES_FILE_NAME = "log4j2.component.properties";<a name="line.51"></a>
<span class="sourceLineNo">052</span>    private static final String LOG4J_SYSTEM_PROPERTIES_FILE_NAME = "log4j2.system.properties";<a name="line.52"></a>
<span class="sourceLineNo">053</span>    private static final String SYSTEM = "system:";<a name="line.53"></a>
<span class="sourceLineNo">054</span>    private static final PropertiesUtil LOG4J_PROPERTIES = new PropertiesUtil(LOG4J_PROPERTIES_FILE_NAME);<a name="line.54"></a>
<span class="sourceLineNo">055</span><a name="line.55"></a>
<span class="sourceLineNo">056</span>    private final Environment environment;<a name="line.56"></a>
<span class="sourceLineNo">057</span><a name="line.57"></a>
<span class="sourceLineNo">058</span>    /**<a name="line.58"></a>
<span class="sourceLineNo">059</span>     * Constructs a PropertiesUtil using a given Properties object as its source of defined properties.<a name="line.59"></a>
<span class="sourceLineNo">060</span>     *<a name="line.60"></a>
<span class="sourceLineNo">061</span>     * @param props the Properties to use by default<a name="line.61"></a>
<span class="sourceLineNo">062</span>     */<a name="line.62"></a>
<span class="sourceLineNo">063</span>    public PropertiesUtil(final Properties props) {<a name="line.63"></a>
<span class="sourceLineNo">064</span>        this.environment = new Environment(new PropertiesPropertySource(props));<a name="line.64"></a>
<span class="sourceLineNo">065</span>    }<a name="line.65"></a>
<span class="sourceLineNo">066</span><a name="line.66"></a>
<span class="sourceLineNo">067</span>    /**<a name="line.67"></a>
<span class="sourceLineNo">068</span>     * Constructs a PropertiesUtil for a given properties file name on the classpath. The properties specified in this<a name="line.68"></a>
<span class="sourceLineNo">069</span>     * file are used by default. If a property is not defined in this file, then the equivalent system property is used.<a name="line.69"></a>
<span class="sourceLineNo">070</span>     *<a name="line.70"></a>
<span class="sourceLineNo">071</span>     * @param propertiesFileName the location of properties file to load<a name="line.71"></a>
<span class="sourceLineNo">072</span>     */<a name="line.72"></a>
<span class="sourceLineNo">073</span>    public PropertiesUtil(final String propertiesFileName) {<a name="line.73"></a>
<span class="sourceLineNo">074</span>        this.environment = new Environment(new PropertyFilePropertySource(propertiesFileName));<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>    /**<a name="line.77"></a>
<span class="sourceLineNo">078</span>     * Loads and closes the given property input stream. If an error occurs, log to the status logger.<a name="line.78"></a>
<span class="sourceLineNo">079</span>     *<a name="line.79"></a>
<span class="sourceLineNo">080</span>     * @param in     a property input stream.<a name="line.80"></a>
<span class="sourceLineNo">081</span>     * @param source a source object describing the source, like a resource string or a URL.<a name="line.81"></a>
<span class="sourceLineNo">082</span>     * @return a new Properties object<a name="line.82"></a>
<span class="sourceLineNo">083</span>     */<a name="line.83"></a>
<span class="sourceLineNo">084</span>    static Properties loadClose(final InputStream in, final Object source) {<a name="line.84"></a>
<span class="sourceLineNo">085</span>        final Properties props = new Properties();<a name="line.85"></a>
<span class="sourceLineNo">086</span>        if (null != in) {<a name="line.86"></a>
<span class="sourceLineNo">087</span>            try {<a name="line.87"></a>
<span class="sourceLineNo">088</span>                props.load(in);<a name="line.88"></a>
<span class="sourceLineNo">089</span>            } catch (final IOException e) {<a name="line.89"></a>
<span class="sourceLineNo">090</span>                LowLevelLogUtil.logException("Unable to read " + source, e);<a name="line.90"></a>
<span class="sourceLineNo">091</span>            } finally {<a name="line.91"></a>
<span class="sourceLineNo">092</span>                try {<a name="line.92"></a>
<span class="sourceLineNo">093</span>                    in.close();<a name="line.93"></a>
<span class="sourceLineNo">094</span>                } catch (final IOException e) {<a name="line.94"></a>
<span class="sourceLineNo">095</span>                    LowLevelLogUtil.logException("Unable to close " + source, e);<a name="line.95"></a>
<span class="sourceLineNo">096</span>                }<a name="line.96"></a>
<span class="sourceLineNo">097</span>            }<a name="line.97"></a>
<span class="sourceLineNo">098</span>        }<a name="line.98"></a>
<span class="sourceLineNo">099</span>        return props;<a name="line.99"></a>
<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
<span class="sourceLineNo">101</span><a name="line.101"></a>
<span class="sourceLineNo">102</span>    /**<a name="line.102"></a>
<span class="sourceLineNo">103</span>     * Returns the PropertiesUtil used by Log4j.<a name="line.103"></a>
<span class="sourceLineNo">104</span>     *<a name="line.104"></a>
<span class="sourceLineNo">105</span>     * @return the main Log4j PropertiesUtil instance.<a name="line.105"></a>
<span class="sourceLineNo">106</span>     */<a name="line.106"></a>
<span class="sourceLineNo">107</span>    public static PropertiesUtil getProperties() {<a name="line.107"></a>
<span class="sourceLineNo">108</span>        return LOG4J_PROPERTIES;<a name="line.108"></a>
<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
<span class="sourceLineNo">110</span><a name="line.110"></a>
<span class="sourceLineNo">111</span>    /**<a name="line.111"></a>
<span class="sourceLineNo">112</span>     * Returns {@code true} if the specified property is defined, regardless of its value (it may not have a value).<a name="line.112"></a>
<span class="sourceLineNo">113</span>     *<a name="line.113"></a>
<span class="sourceLineNo">114</span>     * @param name the name of the property to verify<a name="line.114"></a>
<span class="sourceLineNo">115</span>     * @return {@code true} if the specified property is defined, regardless of its value<a name="line.115"></a>
<span class="sourceLineNo">116</span>     */<a name="line.116"></a>
<span class="sourceLineNo">117</span>    public boolean hasProperty(final String name) {<a name="line.117"></a>
<span class="sourceLineNo">118</span>        return environment.containsKey(name);<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>    /**<a name="line.121"></a>
<span class="sourceLineNo">122</span>     * Gets the named property as a boolean value. If the property matches the string {@code "true"} (case-insensitive),<a name="line.122"></a>
<span class="sourceLineNo">123</span>     * then it is returned as the boolean value {@code true}. Any other non-{@code null} text in the property is<a name="line.123"></a>
<span class="sourceLineNo">124</span>     * considered {@code false}.<a name="line.124"></a>
<span class="sourceLineNo">125</span>     *<a name="line.125"></a>
<span class="sourceLineNo">126</span>     * @param name the name of the property to look up<a name="line.126"></a>
<span class="sourceLineNo">127</span>     * @return the boolean value of the property or {@code false} if undefined.<a name="line.127"></a>
<span class="sourceLineNo">128</span>     */<a name="line.128"></a>
<span class="sourceLineNo">129</span>    public boolean getBooleanProperty(final String name) {<a name="line.129"></a>
<span class="sourceLineNo">130</span>        return getBooleanProperty(name, false);<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>     * Gets the named property as a boolean value.<a name="line.134"></a>
<span class="sourceLineNo">135</span>     *<a name="line.135"></a>
<span class="sourceLineNo">136</span>     * @param name         the name of the property to look up<a name="line.136"></a>
<span class="sourceLineNo">137</span>     * @param defaultValue the default value to use if the property is undefined<a name="line.137"></a>
<span class="sourceLineNo">138</span>     * @return the boolean value of the property or {@code defaultValue} if undefined.<a name="line.138"></a>
<span class="sourceLineNo">139</span>     */<a name="line.139"></a>
<span class="sourceLineNo">140</span>    public boolean getBooleanProperty(final String name, final boolean defaultValue) {<a name="line.140"></a>
<span class="sourceLineNo">141</span>        final String prop = getStringProperty(name);<a name="line.141"></a>
<span class="sourceLineNo">142</span>        return prop == null ? defaultValue : "true".equalsIgnoreCase(prop);<a name="line.142"></a>
<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
<span class="sourceLineNo">144</span><a name="line.144"></a>
<span class="sourceLineNo">145</span>    /**<a name="line.145"></a>
<span class="sourceLineNo">146</span>     * Gets the named property as a boolean value.<a name="line.146"></a>
<span class="sourceLineNo">147</span>     *<a name="line.147"></a>
<span class="sourceLineNo">148</span>     * @param name                  the name of the property to look up<a name="line.148"></a>
<span class="sourceLineNo">149</span>     * @param defaultValueIfAbsent  the default value to use if the property is undefined<a name="line.149"></a>
<span class="sourceLineNo">150</span>     * @param defaultValueIfPresent the default value to use if the property is defined but not assigned<a name="line.150"></a>
<span class="sourceLineNo">151</span>     * @return the boolean value of the property or {@code defaultValue} if undefined.<a name="line.151"></a>
<span class="sourceLineNo">152</span>     */<a name="line.152"></a>
<span class="sourceLineNo">153</span>    public boolean getBooleanProperty(final String name, final boolean defaultValueIfAbsent,<a name="line.153"></a>
<span class="sourceLineNo">154</span>                                      final boolean defaultValueIfPresent) {<a name="line.154"></a>
<span class="sourceLineNo">155</span>        final String prop = getStringProperty(name);<a name="line.155"></a>
<span class="sourceLineNo">156</span>        return prop == null ? defaultValueIfAbsent<a name="line.156"></a>
<span class="sourceLineNo">157</span>            : prop.isEmpty() ? defaultValueIfPresent : "true".equalsIgnoreCase(prop);<a name="line.157"></a>
<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
<span class="sourceLineNo">159</span><a name="line.159"></a>
<span class="sourceLineNo">160</span>    /**<a name="line.160"></a>
<span class="sourceLineNo">161</span>     * Retrieves a property that may be prefixed by more than one string.<a name="line.161"></a>
<span class="sourceLineNo">162</span>     * @param prefixes The array of prefixes.<a name="line.162"></a>
<span class="sourceLineNo">163</span>     * @param key The key to locate.<a name="line.163"></a>
<span class="sourceLineNo">164</span>     * @param supplier The method to call to derive the default value. If the value is null, null will be returned<a name="line.164"></a>
<span class="sourceLineNo">165</span>     * if no property is found.<a name="line.165"></a>
<span class="sourceLineNo">166</span>     * @return The value or null if it is not found.<a name="line.166"></a>
<span class="sourceLineNo">167</span>     * @since 2.13.0<a name="line.167"></a>
<span class="sourceLineNo">168</span>     */<a name="line.168"></a>
<span class="sourceLineNo">169</span>    public Boolean getBooleanProperty(final String[] prefixes, String key, Supplier&lt;Boolean&gt; supplier) {<a name="line.169"></a>
<span class="sourceLineNo">170</span>        for (String prefix : prefixes) {<a name="line.170"></a>
<span class="sourceLineNo">171</span>            if (hasProperty(prefix + key)) {<a name="line.171"></a>
<span class="sourceLineNo">172</span>                return getBooleanProperty(prefix + key);<a name="line.172"></a>
<span class="sourceLineNo">173</span>            }<a name="line.173"></a>
<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
<span class="sourceLineNo">175</span>        return supplier != null ? supplier.get() : null;<a name="line.175"></a>
<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
<span class="sourceLineNo">177</span><a name="line.177"></a>
<span class="sourceLineNo">178</span>    /**<a name="line.178"></a>
<span class="sourceLineNo">179</span>     * Gets the named property as a Charset value.<a name="line.179"></a>
<span class="sourceLineNo">180</span>     *<a name="line.180"></a>
<span class="sourceLineNo">181</span>     * @param name the name of the property to look up<a name="line.181"></a>
<span class="sourceLineNo">182</span>     * @return the Charset value of the property or {@link Charset#defaultCharset()} if undefined.<a name="line.182"></a>
<span class="sourceLineNo">183</span>     */<a name="line.183"></a>
<span class="sourceLineNo">184</span>    public Charset getCharsetProperty(final String name) {<a name="line.184"></a>
<span class="sourceLineNo">185</span>        return getCharsetProperty(name, Charset.defaultCharset());<a name="line.185"></a>
<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
<span class="sourceLineNo">187</span><a name="line.187"></a>
<span class="sourceLineNo">188</span>    /**<a name="line.188"></a>
<span class="sourceLineNo">189</span>     * Gets the named property as a Charset value. If we cannot find the named Charset, see if it is mapped in<a name="line.189"></a>
<span class="sourceLineNo">190</span>     * file {@code Log4j-charsets.properties} on the class path.<a name="line.190"></a>
<span class="sourceLineNo">191</span>     *<a name="line.191"></a>
<span class="sourceLineNo">192</span>     * @param name         the name of the property to look up<a name="line.192"></a>
<span class="sourceLineNo">193</span>     * @param defaultValue the default value to use if the property is undefined<a name="line.193"></a>
<span class="sourceLineNo">194</span>     * @return the Charset value of the property or {@code defaultValue} if undefined.<a name="line.194"></a>
<span class="sourceLineNo">195</span>     */<a name="line.195"></a>
<span class="sourceLineNo">196</span>    public Charset getCharsetProperty(final String name, final Charset defaultValue) {<a name="line.196"></a>
<span class="sourceLineNo">197</span>        final String charsetName = getStringProperty(name);<a name="line.197"></a>
<span class="sourceLineNo">198</span>        if (charsetName == null) {<a name="line.198"></a>
<span class="sourceLineNo">199</span>            return defaultValue;<a name="line.199"></a>
<span class="sourceLineNo">200</span>        }<a name="line.200"></a>
<span class="sourceLineNo">201</span>        if (Charset.isSupported(charsetName)) {<a name="line.201"></a>
<span class="sourceLineNo">202</span>            return Charset.forName(charsetName);<a name="line.202"></a>
<span class="sourceLineNo">203</span>        }<a name="line.203"></a>
<span class="sourceLineNo">204</span>        final ResourceBundle bundle = getCharsetsResourceBundle();<a name="line.204"></a>
<span class="sourceLineNo">205</span>        if (bundle.containsKey(name)) {<a name="line.205"></a>
<span class="sourceLineNo">206</span>            final String mapped = bundle.getString(name);<a name="line.206"></a>
<span class="sourceLineNo">207</span>            if (Charset.isSupported(mapped)) {<a name="line.207"></a>
<span class="sourceLineNo">208</span>                return Charset.forName(mapped);<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>        LowLevelLogUtil.log("Unable to get Charset '" + charsetName + "' for property '" + name + "', using default "<a name="line.211"></a>
<span class="sourceLineNo">212</span>            + defaultValue + " and continuing.");<a name="line.212"></a>
<span class="sourceLineNo">213</span>        return defaultValue;<a name="line.213"></a>
<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
<span class="sourceLineNo">215</span><a name="line.215"></a>
<span class="sourceLineNo">216</span>    /**<a name="line.216"></a>
<span class="sourceLineNo">217</span>     * Gets the named property as a double.<a name="line.217"></a>
<span class="sourceLineNo">218</span>     *<a name="line.218"></a>
<span class="sourceLineNo">219</span>     * @param name         the name of the property to look up<a name="line.219"></a>
<span class="sourceLineNo">220</span>     * @param defaultValue the default value to use if the property is undefined<a name="line.220"></a>
<span class="sourceLineNo">221</span>     * @return the parsed double value of the property or {@code defaultValue} if it was undefined or could not be parsed.<a name="line.221"></a>
<span class="sourceLineNo">222</span>     */<a name="line.222"></a>
<span class="sourceLineNo">223</span>    public double getDoubleProperty(final String name, final double defaultValue) {<a name="line.223"></a>
<span class="sourceLineNo">224</span>        final String prop = getStringProperty(name);<a name="line.224"></a>
<span class="sourceLineNo">225</span>        if (prop != null) {<a name="line.225"></a>
<span class="sourceLineNo">226</span>            try {<a name="line.226"></a>
<span class="sourceLineNo">227</span>                return Double.parseDouble(prop);<a name="line.227"></a>
<span class="sourceLineNo">228</span>            } catch (final Exception ignored) {<a name="line.228"></a>
<span class="sourceLineNo">229</span>                return defaultValue;<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>        return defaultValue;<a name="line.232"></a>
<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
<span class="sourceLineNo">234</span><a name="line.234"></a>
<span class="sourceLineNo">235</span>    /**<a name="line.235"></a>
<span class="sourceLineNo">236</span>     * Gets the named property as an integer.<a name="line.236"></a>
<span class="sourceLineNo">237</span>     *<a name="line.237"></a>
<span class="sourceLineNo">238</span>     * @param name         the name of the property to look up<a name="line.238"></a>
<span class="sourceLineNo">239</span>     * @param defaultValue the default value to use if the property is undefined<a name="line.239"></a>
<span class="sourceLineNo">240</span>     * @return the parsed integer value of the property or {@code defaultValue} if it was undefined or could not be<a name="line.240"></a>
<span class="sourceLineNo">241</span>     * parsed.<a name="line.241"></a>
<span class="sourceLineNo">242</span>     */<a name="line.242"></a>
<span class="sourceLineNo">243</span>    public int getIntegerProperty(final String name, final int defaultValue) {<a name="line.243"></a>
<span class="sourceLineNo">244</span>        final String prop = getStringProperty(name);<a name="line.244"></a>
<span class="sourceLineNo">245</span>        if (prop != null) {<a name="line.245"></a>
<span class="sourceLineNo">246</span>            try {<a name="line.246"></a>
<span class="sourceLineNo">247</span>                return Integer.parseInt(prop);<a name="line.247"></a>
<span class="sourceLineNo">248</span>            } catch (final Exception ignored) {<a name="line.248"></a>
<span class="sourceLineNo">249</span>                return defaultValue;<a name="line.249"></a>
<span class="sourceLineNo">250</span>            }<a name="line.250"></a>
<span class="sourceLineNo">251</span>        }<a name="line.251"></a>
<span class="sourceLineNo">252</span>        return defaultValue;<a name="line.252"></a>
<span class="sourceLineNo">253</span>    }<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>     * Retrieves a property that may be prefixed by more than one string.<a name="line.256"></a>
<span class="sourceLineNo">257</span>     * @param prefixes The array of prefixes.<a name="line.257"></a>
<span class="sourceLineNo">258</span>     * @param key The key to locate.<a name="line.258"></a>
<span class="sourceLineNo">259</span>     * @param supplier The method to call to derive the default value. If the value is null, null will be returned<a name="line.259"></a>
<span class="sourceLineNo">260</span>     * if no property is found.<a name="line.260"></a>
<span class="sourceLineNo">261</span>     * @return The value or null if it is not found.<a name="line.261"></a>
<span class="sourceLineNo">262</span>     * @since 2.13.0<a name="line.262"></a>
<span class="sourceLineNo">263</span>     */<a name="line.263"></a>
<span class="sourceLineNo">264</span>    public Integer getIntegerProperty(final String[] prefixes, String key, Supplier&lt;Integer&gt; supplier) {<a name="line.264"></a>
<span class="sourceLineNo">265</span>        for (String prefix : prefixes) {<a name="line.265"></a>
<span class="sourceLineNo">266</span>            if (hasProperty(prefix + key)) {<a name="line.266"></a>
<span class="sourceLineNo">267</span>                return getIntegerProperty(prefix + key, 0);<a name="line.267"></a>
<span class="sourceLineNo">268</span>            }<a name="line.268"></a>
<span class="sourceLineNo">269</span>        }<a name="line.269"></a>
<span class="sourceLineNo">270</span>        return supplier != null ? supplier.get() : null;<a name="line.270"></a>
<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
<span class="sourceLineNo">272</span><a name="line.272"></a>
<span class="sourceLineNo">273</span>    /**<a name="line.273"></a>
<span class="sourceLineNo">274</span>     * Gets the named property as a long.<a name="line.274"></a>
<span class="sourceLineNo">275</span>     *<a name="line.275"></a>
<span class="sourceLineNo">276</span>     * @param name         the name of the property to look up<a name="line.276"></a>
<span class="sourceLineNo">277</span>     * @param defaultValue the default value to use if the property is undefined<a name="line.277"></a>
<span class="sourceLineNo">278</span>     * @return the parsed long value of the property or {@code defaultValue} if it was undefined or could not be parsed.<a name="line.278"></a>
<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
<span class="sourceLineNo">280</span>    public long getLongProperty(final String name, final long defaultValue) {<a name="line.280"></a>
<span class="sourceLineNo">281</span>        final String prop = getStringProperty(name);<a name="line.281"></a>
<span class="sourceLineNo">282</span>        if (prop != null) {<a name="line.282"></a>
<span class="sourceLineNo">283</span>            try {<a name="line.283"></a>
<span class="sourceLineNo">284</span>                return Long.parseLong(prop);<a name="line.284"></a>
<span class="sourceLineNo">285</span>            } catch (final Exception ignored) {<a name="line.285"></a>
<span class="sourceLineNo">286</span>                return defaultValue;<a name="line.286"></a>
<span class="sourceLineNo">287</span>            }<a name="line.287"></a>
<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
<span class="sourceLineNo">289</span>        return defaultValue;<a name="line.289"></a>
<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
<span class="sourceLineNo">291</span><a name="line.291"></a>
<span class="sourceLineNo">292</span>    /**<a name="line.292"></a>
<span class="sourceLineNo">293</span>     * Retrieves a property that may be prefixed by more than one string.<a name="line.293"></a>
<span class="sourceLineNo">294</span>     * @param prefixes The array of prefixes.<a name="line.294"></a>
<span class="sourceLineNo">295</span>     * @param key The key to locate.<a name="line.295"></a>
<span class="sourceLineNo">296</span>     * @param supplier The method to call to derive the default value. If the value is null, null will be returned<a name="line.296"></a>
<span class="sourceLineNo">297</span>     * if no property is found.<a name="line.297"></a>
<span class="sourceLineNo">298</span>     * @return The value or null if it is not found.<a name="line.298"></a>
<span class="sourceLineNo">299</span>     * @since 2.13.0<a name="line.299"></a>
<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
<span class="sourceLineNo">301</span>    public Long getLongProperty(final String[] prefixes, String key, Supplier&lt;Long&gt; supplier) {<a name="line.301"></a>
<span class="sourceLineNo">302</span>        for (String prefix : prefixes) {<a name="line.302"></a>
<span class="sourceLineNo">303</span>            if (hasProperty(prefix + key)) {<a name="line.303"></a>
<span class="sourceLineNo">304</span>                return getLongProperty(prefix + key, 0);<a name="line.304"></a>
<span class="sourceLineNo">305</span>            }<a name="line.305"></a>
<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
<span class="sourceLineNo">307</span>        return supplier != null ? supplier.get() : null;<a name="line.307"></a>
<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
<span class="sourceLineNo">309</span><a name="line.309"></a>
<span class="sourceLineNo">310</span>    /**<a name="line.310"></a>
<span class="sourceLineNo">311</span>     * Retrieves a Duration where the String is of the format nnn[unit] where nnn represents an integer value<a name="line.311"></a>
<span class="sourceLineNo">312</span>     * and unit represents a time unit.<a name="line.312"></a>
<span class="sourceLineNo">313</span>     * @param name The property name.<a name="line.313"></a>
<span class="sourceLineNo">314</span>     * @param defaultValue The default value.<a name="line.314"></a>
<span class="sourceLineNo">315</span>     * @return The value of the String as a Duration or the default value, which may be null.<a name="line.315"></a>
<span class="sourceLineNo">316</span>     * @since 2.13.0<a name="line.316"></a>
<span class="sourceLineNo">317</span>     */<a name="line.317"></a>
<span class="sourceLineNo">318</span>    public Duration getDurationProperty(final String name, Duration defaultValue) {<a name="line.318"></a>
<span class="sourceLineNo">319</span>        final String prop = getStringProperty(name);<a name="line.319"></a>
<span class="sourceLineNo">320</span>        if (prop != null) {<a name="line.320"></a>
<span class="sourceLineNo">321</span>            return TimeUnit.getDuration(prop);<a name="line.321"></a>
<span class="sourceLineNo">322</span>        }<a name="line.322"></a>
<span class="sourceLineNo">323</span>        return defaultValue;<a name="line.323"></a>
<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
<span class="sourceLineNo">325</span><a name="line.325"></a>
<span class="sourceLineNo">326</span>    /**<a name="line.326"></a>
<span class="sourceLineNo">327</span>     * Retrieves a property that may be prefixed by more than one string.<a name="line.327"></a>
<span class="sourceLineNo">328</span>     * @param prefixes The array of prefixes.<a name="line.328"></a>
<span class="sourceLineNo">329</span>     * @param key The key to locate.<a name="line.329"></a>
<span class="sourceLineNo">330</span>     * @param supplier The method to call to derive the default value. If the value is null, null will be returned<a name="line.330"></a>
<span class="sourceLineNo">331</span>     * if no property is found.<a name="line.331"></a>
<span class="sourceLineNo">332</span>     * @return The value or null if it is not found.<a name="line.332"></a>
<span class="sourceLineNo">333</span>     * @since 2.13.0<a name="line.333"></a>
<span class="sourceLineNo">334</span>     */<a name="line.334"></a>
<span class="sourceLineNo">335</span>    public Duration getDurationProperty(final String[] prefixes, String key, Supplier&lt;Duration&gt; supplier) {<a name="line.335"></a>
<span class="sourceLineNo">336</span>        for (String prefix : prefixes) {<a name="line.336"></a>
<span class="sourceLineNo">337</span>            if (hasProperty(prefix + key)) {<a name="line.337"></a>
<span class="sourceLineNo">338</span>                return getDurationProperty(prefix + key, null);<a name="line.338"></a>
<span class="sourceLineNo">339</span>            }<a name="line.339"></a>
<span class="sourceLineNo">340</span>        }<a name="line.340"></a>
<span class="sourceLineNo">341</span>        return supplier != null ? supplier.get() : null;<a name="line.341"></a>
<span class="sourceLineNo">342</span>    }<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>     * Retrieves a property that may be prefixed by more than one string.<a name="line.345"></a>
<span class="sourceLineNo">346</span>     * @param prefixes The array of prefixes.<a name="line.346"></a>
<span class="sourceLineNo">347</span>     * @param key The key to locate.<a name="line.347"></a>
<span class="sourceLineNo">348</span>     * @param supplier The method to call to derive the default value. If the value is null, null will be returned<a name="line.348"></a>
<span class="sourceLineNo">349</span>     * if no property is found.<a name="line.349"></a>
<span class="sourceLineNo">350</span>     * @return The value or null if it is not found.<a name="line.350"></a>
<span class="sourceLineNo">351</span>     * @since 2.13.0<a name="line.351"></a>
<span class="sourceLineNo">352</span>     */<a name="line.352"></a>
<span class="sourceLineNo">353</span>    public String getStringProperty(final String[] prefixes, String key, Supplier&lt;String&gt; supplier) {<a name="line.353"></a>
<span class="sourceLineNo">354</span>        for (String prefix : prefixes) {<a name="line.354"></a>
<span class="sourceLineNo">355</span>            String result = getStringProperty(prefix + key);<a name="line.355"></a>
<span class="sourceLineNo">356</span>            if (result != null) {<a name="line.356"></a>
<span class="sourceLineNo">357</span>                return result;<a name="line.357"></a>
<span class="sourceLineNo">358</span>            }<a name="line.358"></a>
<span class="sourceLineNo">359</span>        }<a name="line.359"></a>
<span class="sourceLineNo">360</span>        return supplier != null ? supplier.get() : null;<a name="line.360"></a>
<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
<span class="sourceLineNo">362</span><a name="line.362"></a>
<span class="sourceLineNo">363</span>    /**<a name="line.363"></a>
<span class="sourceLineNo">364</span>     * Gets the named property as a String.<a name="line.364"></a>
<span class="sourceLineNo">365</span>     *<a name="line.365"></a>
<span class="sourceLineNo">366</span>     * @param name the name of the property to look up<a name="line.366"></a>
<span class="sourceLineNo">367</span>     * @return the String value of the property or {@code null} if undefined.<a name="line.367"></a>
<span class="sourceLineNo">368</span>     */<a name="line.368"></a>
<span class="sourceLineNo">369</span>    public String getStringProperty(final String name) {<a name="line.369"></a>
<span class="sourceLineNo">370</span>        return environment.get(name);<a name="line.370"></a>
<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
<span class="sourceLineNo">372</span><a name="line.372"></a>
<span class="sourceLineNo">373</span>    /**<a name="line.373"></a>
<span class="sourceLineNo">374</span>     * Gets the named property as a String.<a name="line.374"></a>
<span class="sourceLineNo">375</span>     *<a name="line.375"></a>
<span class="sourceLineNo">376</span>     * @param name         the name of the property to look up<a name="line.376"></a>
<span class="sourceLineNo">377</span>     * @param defaultValue the default value to use if the property is undefined<a name="line.377"></a>
<span class="sourceLineNo">378</span>     * @return the String value of the property or {@code defaultValue} if undefined.<a name="line.378"></a>
<span class="sourceLineNo">379</span>     */<a name="line.379"></a>
<span class="sourceLineNo">380</span>    public String getStringProperty(final String name, final String defaultValue) {<a name="line.380"></a>
<span class="sourceLineNo">381</span>        final String prop = getStringProperty(name);<a name="line.381"></a>
<span class="sourceLineNo">382</span>        return (prop == null) ? defaultValue : prop;<a name="line.382"></a>
<span class="sourceLineNo">383</span>    }<a name="line.383"></a>
<span class="sourceLineNo">384</span><a name="line.384"></a>
<span class="sourceLineNo">385</span>    /**<a name="line.385"></a>
<span class="sourceLineNo">386</span>     * Return the system properties or an empty Properties object if an error occurs.<a name="line.386"></a>
<span class="sourceLineNo">387</span>     *<a name="line.387"></a>
<span class="sourceLineNo">388</span>     * @return The system properties.<a name="line.388"></a>
<span class="sourceLineNo">389</span>     */<a name="line.389"></a>
<span class="sourceLineNo">390</span>    public static Properties getSystemProperties() {<a name="line.390"></a>
<span class="sourceLineNo">391</span>        try {<a name="line.391"></a>
<span class="sourceLineNo">392</span>            return new Properties(System.getProperties());<a name="line.392"></a>
<span class="sourceLineNo">393</span>        } catch (final SecurityException ex) {<a name="line.393"></a>
<span class="sourceLineNo">394</span>            LowLevelLogUtil.logException("Unable to access system properties.", ex);<a name="line.394"></a>
<span class="sourceLineNo">395</span>            // Sandboxed - can't read System Properties<a name="line.395"></a>
<span class="sourceLineNo">396</span>            return new Properties();<a name="line.396"></a>
<span class="sourceLineNo">397</span>        }<a name="line.397"></a>
<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
<span class="sourceLineNo">399</span><a name="line.399"></a>
<span class="sourceLineNo">400</span>    /**<a name="line.400"></a>
<span class="sourceLineNo">401</span>     * Reloads all properties. This is primarily useful for unit tests.<a name="line.401"></a>
<span class="sourceLineNo">402</span>     *<a name="line.402"></a>
<span class="sourceLineNo">403</span>     * @since 2.10.0<a name="line.403"></a>
<span class="sourceLineNo">404</span>     */<a name="line.404"></a>
<span class="sourceLineNo">405</span>    public void reload() {<a name="line.405"></a>
<span class="sourceLineNo">406</span>        environment.reload();<a name="line.406"></a>
<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
<span class="sourceLineNo">408</span><a name="line.408"></a>
<span class="sourceLineNo">409</span>    /**<a name="line.409"></a>
<span class="sourceLineNo">410</span>     * Provides support for looking up global configuration properties via environment variables, property files,<a name="line.410"></a>
<span class="sourceLineNo">411</span>     * and system properties, in three variations:<a name="line.411"></a>
<span class="sourceLineNo">412</span>     * &lt;p&gt;<a name="line.412"></a>
<span class="sourceLineNo">413</span>     * Normalized: all log4j-related prefixes removed, remaining property is camelCased with a log4j2 prefix for<a name="line.413"></a>
<span class="sourceLineNo">414</span>     * property files and system properties, or follows a LOG4J_FOO_BAR format for environment variables.<a name="line.414"></a>
<span class="sourceLineNo">415</span>     * &lt;p&gt;<a name="line.415"></a>
<span class="sourceLineNo">416</span>     * Legacy: the original property name as defined in the source pre-2.10.0.<a name="line.416"></a>
<span class="sourceLineNo">417</span>     * &lt;p&gt;<a name="line.417"></a>
<span class="sourceLineNo">418</span>     * Tokenized: loose matching based on word boundaries.<a name="line.418"></a>
<span class="sourceLineNo">419</span>     *<a name="line.419"></a>
<span class="sourceLineNo">420</span>     * @since 2.10.0<a name="line.420"></a>
<span class="sourceLineNo">421</span>     */<a name="line.421"></a>
<span class="sourceLineNo">422</span>    private static class Environment {<a name="line.422"></a>
<span class="sourceLineNo">423</span><a name="line.423"></a>
<span class="sourceLineNo">424</span>        private final Set&lt;PropertySource&gt; sources = new TreeSet&lt;&gt;(new PropertySource.Comparator());<a name="line.424"></a>
<span class="sourceLineNo">425</span>        private final Map&lt;CharSequence, String&gt; literal = new ConcurrentHashMap&lt;&gt;();<a name="line.425"></a>
<span class="sourceLineNo">426</span>        private final Map&lt;CharSequence, String&gt; normalized = new ConcurrentHashMap&lt;&gt;();<a name="line.426"></a>
<span class="sourceLineNo">427</span>        private final Map&lt;List&lt;CharSequence&gt;, String&gt; tokenized = new ConcurrentHashMap&lt;&gt;();<a name="line.427"></a>
<span class="sourceLineNo">428</span><a name="line.428"></a>
<span class="sourceLineNo">429</span>        private Environment(final PropertySource propertySource) {<a name="line.429"></a>
<span class="sourceLineNo">430</span>            PropertyFilePropertySource sysProps = new PropertyFilePropertySource(LOG4J_SYSTEM_PROPERTIES_FILE_NAME);<a name="line.430"></a>
<span class="sourceLineNo">431</span>            try {<a name="line.431"></a>
<span class="sourceLineNo">432</span>                sysProps.forEach(new BiConsumer&lt;String, String&gt;() {<a name="line.432"></a>
<span class="sourceLineNo">433</span>                    @Override<a name="line.433"></a>
<span class="sourceLineNo">434</span>                    public void accept(String key, String value) {<a name="line.434"></a>
<span class="sourceLineNo">435</span>                        if (System.getProperty(key) == null) {<a name="line.435"></a>
<span class="sourceLineNo">436</span>                            System.setProperty(key, value);<a name="line.436"></a>
<span class="sourceLineNo">437</span>                        }<a name="line.437"></a>
<span class="sourceLineNo">438</span>                    }<a name="line.438"></a>
<span class="sourceLineNo">439</span>                });<a name="line.439"></a>
<span class="sourceLineNo">440</span>            } catch (SecurityException ex) {<a name="line.440"></a>
<span class="sourceLineNo">441</span>                // Access to System Properties is restricted so just skip it.<a name="line.441"></a>
<span class="sourceLineNo">442</span>            }<a name="line.442"></a>
<span class="sourceLineNo">443</span>            sources.add(propertySource);<a name="line.443"></a>
<span class="sourceLineNo">444</span>                        for (final ClassLoader classLoader : LoaderUtil.getClassLoaders()) {<a name="line.444"></a>
<span class="sourceLineNo">445</span>                                try {<a name="line.445"></a>
<span class="sourceLineNo">446</span>                                        for (final PropertySource source : ServiceLoader.load(PropertySource.class, classLoader)) {<a name="line.446"></a>
<span class="sourceLineNo">447</span>                                                sources.add(source);<a name="line.447"></a>
<span class="sourceLineNo">448</span>                                        }<a name="line.448"></a>
<span class="sourceLineNo">449</span>                                } catch (final Throwable ex) {<a name="line.449"></a>
<span class="sourceLineNo">450</span>                                        /* Don't log anything to the console. It may not be a problem that a PropertySource<a name="line.450"></a>
<span class="sourceLineNo">451</span>                                         * isn't accessible.<a name="line.451"></a>
<span class="sourceLineNo">452</span>                                         */<a name="line.452"></a>
<span class="sourceLineNo">453</span>                                }<a name="line.453"></a>
<span class="sourceLineNo">454</span>                        }<a name="line.454"></a>
<span class="sourceLineNo">455</span><a name="line.455"></a>
<span class="sourceLineNo">456</span>            reload();<a name="line.456"></a>
<span class="sourceLineNo">457</span>        }<a name="line.457"></a>
<span class="sourceLineNo">458</span><a name="line.458"></a>
<span class="sourceLineNo">459</span>        private synchronized void reload() {<a name="line.459"></a>
<span class="sourceLineNo">460</span>            literal.clear();<a name="line.460"></a>
<span class="sourceLineNo">461</span>            normalized.clear();<a name="line.461"></a>
<span class="sourceLineNo">462</span>            tokenized.clear();<a name="line.462"></a>
<span class="sourceLineNo">463</span>            for (final PropertySource source : sources) {<a name="line.463"></a>
<span class="sourceLineNo">464</span>                source.forEach(new BiConsumer&lt;String, String&gt;() {<a name="line.464"></a>
<span class="sourceLineNo">465</span>                    @Override<a name="line.465"></a>
<span class="sourceLineNo">466</span>                    public void accept(final String key, final String value) {<a name="line.466"></a>
<span class="sourceLineNo">467</span>                        if (key != null &amp;&amp; value != null) {<a name="line.467"></a>
<span class="sourceLineNo">468</span>                            literal.put(key, value);<a name="line.468"></a>
<span class="sourceLineNo">469</span>                            final List&lt;CharSequence&gt; tokens = PropertySource.Util.tokenize(key);<a name="line.469"></a>
<span class="sourceLineNo">470</span>                            if (tokens.isEmpty()) {<a name="line.470"></a>
<span class="sourceLineNo">471</span>                                normalized.put(source.getNormalForm(Collections.singleton(key)), value);<a name="line.471"></a>
<span class="sourceLineNo">472</span>                            } else {<a name="line.472"></a>
<span class="sourceLineNo">473</span>                                normalized.put(source.getNormalForm(tokens), value);<a name="line.473"></a>
<span class="sourceLineNo">474</span>                                tokenized.put(tokens, value);<a name="line.474"></a>
<span class="sourceLineNo">475</span>                            }<a name="line.475"></a>
<span class="sourceLineNo">476</span>                        }<a name="line.476"></a>
<span class="sourceLineNo">477</span>                    }<a name="line.477"></a>
<span class="sourceLineNo">478</span>                });<a name="line.478"></a>
<span class="sourceLineNo">479</span>            }<a name="line.479"></a>
<span class="sourceLineNo">480</span>        }<a name="line.480"></a>
<span class="sourceLineNo">481</span><a name="line.481"></a>
<span class="sourceLineNo">482</span>        private static boolean hasSystemProperty(final String key) {<a name="line.482"></a>
<span class="sourceLineNo">483</span>            try {<a name="line.483"></a>
<span class="sourceLineNo">484</span>                return System.getProperties().containsKey(key);<a name="line.484"></a>
<span class="sourceLineNo">485</span>            } catch (final SecurityException ignored) {<a name="line.485"></a>
<span class="sourceLineNo">486</span>                return false;<a name="line.486"></a>
<span class="sourceLineNo">487</span>            }<a name="line.487"></a>
<span class="sourceLineNo">488</span>        }<a name="line.488"></a>
<span class="sourceLineNo">489</span><a name="line.489"></a>
<span class="sourceLineNo">490</span>        private String get(final String key) {<a name="line.490"></a>
<span class="sourceLineNo">491</span>            if (normalized.containsKey(key)) {<a name="line.491"></a>
<span class="sourceLineNo">492</span>                return normalized.get(key);<a name="line.492"></a>
<span class="sourceLineNo">493</span>            }<a name="line.493"></a>
<span class="sourceLineNo">494</span>            if (literal.containsKey(key)) {<a name="line.494"></a>
<span class="sourceLineNo">495</span>                return literal.get(key);<a name="line.495"></a>
<span class="sourceLineNo">496</span>            }<a name="line.496"></a>
<span class="sourceLineNo">497</span>            if (hasSystemProperty(key)) {<a name="line.497"></a>
<span class="sourceLineNo">498</span>                return System.getProperty(key);<a name="line.498"></a>
<span class="sourceLineNo">499</span>            }<a name="line.499"></a>
<span class="sourceLineNo">500</span>            for (final PropertySource source : sources) {<a name="line.500"></a>
<span class="sourceLineNo">501</span>                if (source.containsProperty(key)) {<a name="line.501"></a>
<span class="sourceLineNo">502</span>                    return source.getProperty(key);<a name="line.502"></a>
<span class="sourceLineNo">503</span>                }<a name="line.503"></a>
<span class="sourceLineNo">504</span>            }<a name="line.504"></a>
<span class="sourceLineNo">505</span>            return tokenized.get(PropertySource.Util.tokenize(key));<a name="line.505"></a>
<span class="sourceLineNo">506</span>        }<a name="line.506"></a>
<span class="sourceLineNo">507</span><a name="line.507"></a>
<span class="sourceLineNo">508</span>        private boolean containsKey(final String key) {<a name="line.508"></a>
<span class="sourceLineNo">509</span>            return normalized.containsKey(key) ||<a name="line.509"></a>
<span class="sourceLineNo">510</span>                literal.containsKey(key) ||<a name="line.510"></a>
<span class="sourceLineNo">511</span>                hasSystemProperty(key) ||<a name="line.511"></a>
<span class="sourceLineNo">512</span>                tokenized.containsKey(PropertySource.Util.tokenize(key));<a name="line.512"></a>
<span class="sourceLineNo">513</span>        }<a name="line.513"></a>
<span class="sourceLineNo">514</span>    }<a name="line.514"></a>
<span class="sourceLineNo">515</span><a name="line.515"></a>
<span class="sourceLineNo">516</span>    /**<a name="line.516"></a>
<span class="sourceLineNo">517</span>     * Extracts properties that start with or are equals to the specific prefix and returns them in a new Properties<a name="line.517"></a>
<span class="sourceLineNo">518</span>     * object with the prefix removed.<a name="line.518"></a>
<span class="sourceLineNo">519</span>     *<a name="line.519"></a>
<span class="sourceLineNo">520</span>     * @param properties The Properties to evaluate.<a name="line.520"></a>
<span class="sourceLineNo">521</span>     * @param prefix     The prefix to extract.<a name="line.521"></a>
<span class="sourceLineNo">522</span>     * @return The subset of properties.<a name="line.522"></a>
<span class="sourceLineNo">523</span>     */<a name="line.523"></a>
<span class="sourceLineNo">524</span>    public static Properties extractSubset(final Properties properties, final String prefix) {<a name="line.524"></a>
<span class="sourceLineNo">525</span>        final Properties subset = new Properties();<a name="line.525"></a>
<span class="sourceLineNo">526</span><a name="line.526"></a>
<span class="sourceLineNo">527</span>        if (prefix == null || prefix.length() == 0) {<a name="line.527"></a>
<span class="sourceLineNo">528</span>            return subset;<a name="line.528"></a>
<span class="sourceLineNo">529</span>        }<a name="line.529"></a>
<span class="sourceLineNo">530</span><a name="line.530"></a>
<span class="sourceLineNo">531</span>        final String prefixToMatch = prefix.charAt(prefix.length() - 1) != '.' ? prefix + '.' : prefix;<a name="line.531"></a>
<span class="sourceLineNo">532</span><a name="line.532"></a>
<span class="sourceLineNo">533</span>        final List&lt;String&gt; keys = new ArrayList&lt;&gt;();<a name="line.533"></a>
<span class="sourceLineNo">534</span><a name="line.534"></a>
<span class="sourceLineNo">535</span>        for (final String key : properties.stringPropertyNames()) {<a name="line.535"></a>
<span class="sourceLineNo">536</span>            if (key.startsWith(prefixToMatch)) {<a name="line.536"></a>
<span class="sourceLineNo">537</span>                subset.setProperty(key.substring(prefixToMatch.length()), properties.getProperty(key));<a name="line.537"></a>
<span class="sourceLineNo">538</span>                keys.add(key);<a name="line.538"></a>
<span class="sourceLineNo">539</span>            }<a name="line.539"></a>
<span class="sourceLineNo">540</span>        }<a name="line.540"></a>
<span class="sourceLineNo">541</span>        for (final String key : keys) {<a name="line.541"></a>
<span class="sourceLineNo">542</span>            properties.remove(key);<a name="line.542"></a>
<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
<span class="sourceLineNo">544</span><a name="line.544"></a>
<span class="sourceLineNo">545</span>        return subset;<a name="line.545"></a>
<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
<span class="sourceLineNo">547</span><a name="line.547"></a>
<span class="sourceLineNo">548</span>    static ResourceBundle getCharsetsResourceBundle() {<a name="line.548"></a>
<span class="sourceLineNo">549</span>        return ResourceBundle.getBundle("Log4j-charsets");<a name="line.549"></a>
<span class="sourceLineNo">550</span>    }<a name="line.550"></a>
<span class="sourceLineNo">551</span><a name="line.551"></a>
<span class="sourceLineNo">552</span>    /**<a name="line.552"></a>
<span class="sourceLineNo">553</span>     * Partitions a properties map based on common key prefixes up to the first period.<a name="line.553"></a>
<span class="sourceLineNo">554</span>     *<a name="line.554"></a>
<span class="sourceLineNo">555</span>     * @param properties properties to partition<a name="line.555"></a>
<span class="sourceLineNo">556</span>     * @return the partitioned properties where each key is the common prefix (minus the period) and the values are<a name="line.556"></a>
<span class="sourceLineNo">557</span>     * new property maps without the prefix and period in the key<a name="line.557"></a>
<span class="sourceLineNo">558</span>     * @since 2.6<a name="line.558"></a>
<span class="sourceLineNo">559</span>     */<a name="line.559"></a>
<span class="sourceLineNo">560</span>    public static Map&lt;String, Properties&gt; partitionOnCommonPrefixes(final Properties properties) {<a name="line.560"></a>
<span class="sourceLineNo">561</span>        final Map&lt;String, Properties&gt; parts = new ConcurrentHashMap&lt;&gt;();<a name="line.561"></a>
<span class="sourceLineNo">562</span>        for (final String key : properties.stringPropertyNames()) {<a name="line.562"></a>
<span class="sourceLineNo">563</span>            final String prefix = key.substring(0, key.indexOf('.'));<a name="line.563"></a>
<span class="sourceLineNo">564</span>            if (!parts.containsKey(prefix)) {<a name="line.564"></a>
<span class="sourceLineNo">565</span>                parts.put(prefix, new Properties());<a name="line.565"></a>
<span class="sourceLineNo">566</span>            }<a name="line.566"></a>
<span class="sourceLineNo">567</span>            parts.get(prefix).setProperty(key.substring(key.indexOf('.') + 1), properties.getProperty(key));<a name="line.567"></a>
<span class="sourceLineNo">568</span>        }<a name="line.568"></a>
<span class="sourceLineNo">569</span>        return parts;<a name="line.569"></a>
<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
<span class="sourceLineNo">571</span><a name="line.571"></a>
<span class="sourceLineNo">572</span>    /**<a name="line.572"></a>
<span class="sourceLineNo">573</span>     * Returns true if system properties tell us we are running on Windows.<a name="line.573"></a>
<span class="sourceLineNo">574</span>     *<a name="line.574"></a>
<span class="sourceLineNo">575</span>     * @return true if system properties tell us we are running on Windows.<a name="line.575"></a>
<span class="sourceLineNo">576</span>     */<a name="line.576"></a>
<span class="sourceLineNo">577</span>    public boolean isOsWindows() {<a name="line.577"></a>
<span class="sourceLineNo">578</span>        return getStringProperty("os.name", "").startsWith("Windows");<a name="line.578"></a>
<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
<span class="sourceLineNo">580</span><a name="line.580"></a>
<span class="sourceLineNo">581</span>    private enum TimeUnit {<a name="line.581"></a>
<span class="sourceLineNo">582</span>        NANOS("ns,nano,nanos,nanosecond,nanoseconds", ChronoUnit.NANOS),<a name="line.582"></a>
<span class="sourceLineNo">583</span>        MICROS("us,micro,micros,microsecond,microseconds", ChronoUnit.MICROS),<a name="line.583"></a>
<span class="sourceLineNo">584</span>        MILLIS("ms,milli,millis,millsecond,milliseconds", ChronoUnit.MILLIS),<a name="line.584"></a>
<span class="sourceLineNo">585</span>        SECONDS("s,second,seconds", ChronoUnit.SECONDS),<a name="line.585"></a>
<span class="sourceLineNo">586</span>        MINUTES("m,minute,minutes", ChronoUnit.MINUTES),<a name="line.586"></a>
<span class="sourceLineNo">587</span>        HOURS("h,hour,hours", ChronoUnit.HOURS),<a name="line.587"></a>
<span class="sourceLineNo">588</span>        DAYS("d,day,days", ChronoUnit.DAYS);<a name="line.588"></a>
<span class="sourceLineNo">589</span><a name="line.589"></a>
<span class="sourceLineNo">590</span>        private final String[] descriptions;<a name="line.590"></a>
<span class="sourceLineNo">591</span>        private final ChronoUnit timeUnit;<a name="line.591"></a>
<span class="sourceLineNo">592</span><a name="line.592"></a>
<span class="sourceLineNo">593</span>        TimeUnit(String descriptions, ChronoUnit timeUnit) {<a name="line.593"></a>
<span class="sourceLineNo">594</span>            this.descriptions = descriptions.split(",");<a name="line.594"></a>
<span class="sourceLineNo">595</span>            this.timeUnit = timeUnit;<a name="line.595"></a>
<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
<span class="sourceLineNo">597</span><a name="line.597"></a>
<span class="sourceLineNo">598</span>        ChronoUnit getTimeUnit() {<a name="line.598"></a>
<span class="sourceLineNo">599</span>            return this.timeUnit;<a name="line.599"></a>
<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
<span class="sourceLineNo">601</span><a name="line.601"></a>
<span class="sourceLineNo">602</span>        static Duration getDuration(String time) {<a name="line.602"></a>
<span class="sourceLineNo">603</span>            String value = time.trim();<a name="line.603"></a>
<span class="sourceLineNo">604</span>            TemporalUnit temporalUnit = ChronoUnit.MILLIS;<a name="line.604"></a>
<span class="sourceLineNo">605</span>            long timeVal = 0;<a name="line.605"></a>
<span class="sourceLineNo">606</span>            for (TimeUnit timeUnit : values()) {<a name="line.606"></a>
<span class="sourceLineNo">607</span>                for (String suffix : timeUnit.descriptions) {<a name="line.607"></a>
<span class="sourceLineNo">608</span>                    if (value.endsWith(suffix)) {<a name="line.608"></a>
<span class="sourceLineNo">609</span>                        temporalUnit = timeUnit.timeUnit;<a name="line.609"></a>
<span class="sourceLineNo">610</span>                        timeVal = Long.parseLong(value.substring(0, value.length() - suffix.length()));<a name="line.610"></a>
<span class="sourceLineNo">611</span>                    }<a name="line.611"></a>
<span class="sourceLineNo">612</span>                }<a name="line.612"></a>
<span class="sourceLineNo">613</span>            }<a name="line.613"></a>
<span class="sourceLineNo">614</span>            return Duration.of(timeVal, temporalUnit);<a name="line.614"></a>
<span class="sourceLineNo">615</span>        }<a name="line.615"></a>
<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
<span class="sourceLineNo">617</span>}<a name="line.617"></a>




























































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