<!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.core.impl;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import java.util.ArrayList;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.util.Collection;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.util.HashMap;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.util.List;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.util.Map;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.util.ServiceLoader;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.concurrent.ConcurrentLinkedDeque;<a name="line.25"></a>
<span class="sourceLineNo">026</span><a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.logging.log4j.Logger;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.apache.logging.log4j.ThreadContext;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.apache.logging.log4j.core.ContextDataInjector;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.apache.logging.log4j.core.config.Property;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.logging.log4j.core.util.ContextDataProvider;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.logging.log4j.status.StatusLogger;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.logging.log4j.util.LoaderUtil;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.logging.log4j.util.ReadOnlyStringMap;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.logging.log4j.util.StringMap;<a name="line.36"></a>
<span class="sourceLineNo">037</span><a name="line.37"></a>
<span class="sourceLineNo">038</span>/**<a name="line.38"></a>
<span class="sourceLineNo">039</span> * {@code ThreadContextDataInjector} contains a number of strategies for copying key-value pairs from the various<a name="line.39"></a>
<span class="sourceLineNo">040</span> * {@code ThreadContext} map implementations into a {@code StringMap}. In the case of duplicate keys,<a name="line.40"></a>
<span class="sourceLineNo">041</span> * thread context values overwrite configuration {@code Property} values.<a name="line.41"></a>
<span class="sourceLineNo">042</span> * &lt;p&gt;<a name="line.42"></a>
<span class="sourceLineNo">043</span> * These are the default {@code ContextDataInjector} objects returned by the {@link ContextDataInjectorFactory}.<a name="line.43"></a>
<span class="sourceLineNo">044</span> * &lt;/p&gt;<a name="line.44"></a>
<span class="sourceLineNo">045</span> *<a name="line.45"></a>
<span class="sourceLineNo">046</span> * @see org.apache.logging.log4j.ThreadContext<a name="line.46"></a>
<span class="sourceLineNo">047</span> * @see Property<a name="line.47"></a>
<span class="sourceLineNo">048</span> * @see ReadOnlyStringMap<a name="line.48"></a>
<span class="sourceLineNo">049</span> * @see ContextDataInjector<a name="line.49"></a>
<span class="sourceLineNo">050</span> * @see ContextDataInjectorFactory<a name="line.50"></a>
<span class="sourceLineNo">051</span> * @since 2.7<a name="line.51"></a>
<span class="sourceLineNo">052</span> */<a name="line.52"></a>
<span class="sourceLineNo">053</span>public class ThreadContextDataInjector {<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>    private static Logger LOGGER = StatusLogger.getLogger();<a name="line.55"></a>
<span class="sourceLineNo">056</span><a name="line.56"></a>
<span class="sourceLineNo">057</span>    /**<a name="line.57"></a>
<span class="sourceLineNo">058</span>     * ContextDataProviders loaded via OSGi.<a name="line.58"></a>
<span class="sourceLineNo">059</span>     */<a name="line.59"></a>
<span class="sourceLineNo">060</span>    public static Collection&lt;ContextDataProvider&gt; contextDataProviders =<a name="line.60"></a>
<span class="sourceLineNo">061</span>            new ConcurrentLinkedDeque&lt;&gt;();<a name="line.61"></a>
<span class="sourceLineNo">062</span><a name="line.62"></a>
<span class="sourceLineNo">063</span>    /**<a name="line.63"></a>
<span class="sourceLineNo">064</span>     * Default {@code ContextDataInjector} for the legacy {@code Map&lt;String, String&gt;}-based ThreadContext (which is<a name="line.64"></a>
<span class="sourceLineNo">065</span>     * also the ThreadContext implementation used for web applications).<a name="line.65"></a>
<span class="sourceLineNo">066</span>     * &lt;p&gt;<a name="line.66"></a>
<span class="sourceLineNo">067</span>     * This injector always puts key-value pairs into the specified reusable StringMap.<a name="line.67"></a>
<span class="sourceLineNo">068</span>     */<a name="line.68"></a>
<span class="sourceLineNo">069</span>    public static class ForDefaultThreadContextMap implements ContextDataInjector {<a name="line.69"></a>
<span class="sourceLineNo">070</span><a name="line.70"></a>
<span class="sourceLineNo">071</span>        private final List&lt;ContextDataProvider&gt; providers;<a name="line.71"></a>
<span class="sourceLineNo">072</span><a name="line.72"></a>
<span class="sourceLineNo">073</span>        public ForDefaultThreadContextMap() {<a name="line.73"></a>
<span class="sourceLineNo">074</span>            providers = getProviders();<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>         * Puts key-value pairs from both the specified list of properties as well as the thread context into the<a name="line.78"></a>
<span class="sourceLineNo">079</span>         * specified reusable StringMap.<a name="line.79"></a>
<span class="sourceLineNo">080</span>         *<a name="line.80"></a>
<span class="sourceLineNo">081</span>         * @param props list of configuration properties, may be {@code null}<a name="line.81"></a>
<span class="sourceLineNo">082</span>         * @param contextData a {@code StringMap} instance from the log event<a name="line.82"></a>
<span class="sourceLineNo">083</span>         * @return a {@code StringMap} combining configuration properties with thread context data<a name="line.83"></a>
<span class="sourceLineNo">084</span>         */<a name="line.84"></a>
<span class="sourceLineNo">085</span>        @Override<a name="line.85"></a>
<span class="sourceLineNo">086</span>        public StringMap injectContextData(final List&lt;Property&gt; props, final StringMap contextData) {<a name="line.86"></a>
<span class="sourceLineNo">087</span><a name="line.87"></a>
<span class="sourceLineNo">088</span>            final Map&lt;String, String&gt; copy;<a name="line.88"></a>
<span class="sourceLineNo">089</span><a name="line.89"></a>
<span class="sourceLineNo">090</span>            if (providers.size() == 1) {<a name="line.90"></a>
<span class="sourceLineNo">091</span>                copy = providers.get(0).supplyContextData();<a name="line.91"></a>
<span class="sourceLineNo">092</span>            } else {<a name="line.92"></a>
<span class="sourceLineNo">093</span>                copy = new HashMap&lt;&gt;();<a name="line.93"></a>
<span class="sourceLineNo">094</span>                for (ContextDataProvider provider : providers) {<a name="line.94"></a>
<span class="sourceLineNo">095</span>                    copy.putAll(provider.supplyContextData());<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>            // The DefaultThreadContextMap stores context data in a Map&lt;String, String&gt;.<a name="line.99"></a>
<span class="sourceLineNo">100</span>            // This is a copy-on-write data structure so we are sure ThreadContext changes will not affect our copy.<a name="line.100"></a>
<span class="sourceLineNo">101</span>            // If there are no configuration properties or providers returning a thin wrapper around the copy<a name="line.101"></a>
<span class="sourceLineNo">102</span>            // is faster than copying the elements into the LogEvent's reusable StringMap.<a name="line.102"></a>
<span class="sourceLineNo">103</span>            if ((props == null || props.isEmpty())) {<a name="line.103"></a>
<span class="sourceLineNo">104</span>                // this will replace the LogEvent's context data with the returned instance.<a name="line.104"></a>
<span class="sourceLineNo">105</span>                // NOTE: must mark as frozen or downstream components may attempt to modify (UnsupportedOperationEx)<a name="line.105"></a>
<span class="sourceLineNo">106</span>                return copy.isEmpty() ? ContextDataFactory.emptyFrozenContextData() : frozenStringMap(copy);<a name="line.106"></a>
<span class="sourceLineNo">107</span>            }<a name="line.107"></a>
<span class="sourceLineNo">108</span>            // If the list of Properties is non-empty we need to combine the properties and the ThreadContext<a name="line.108"></a>
<span class="sourceLineNo">109</span>            // data. Note that we cannot reuse the specified StringMap: some Loggers may have properties defined<a name="line.109"></a>
<span class="sourceLineNo">110</span>            // and others not, so the LogEvent's context data may have been replaced with an immutable copy from<a name="line.110"></a>
<span class="sourceLineNo">111</span>            // the ThreadContext - this will throw an UnsupportedOperationException if we try to modify it.<a name="line.111"></a>
<span class="sourceLineNo">112</span>            final StringMap result = new JdkMapAdapterStringMap(new HashMap&lt;&gt;(copy));<a name="line.112"></a>
<span class="sourceLineNo">113</span>            for (int i = 0; i &lt; props.size(); i++) {<a name="line.113"></a>
<span class="sourceLineNo">114</span>                final Property prop = props.get(i);<a name="line.114"></a>
<span class="sourceLineNo">115</span>                if (!copy.containsKey(prop.getName())) {<a name="line.115"></a>
<span class="sourceLineNo">116</span>                    result.putValue(prop.getName(), prop.getValue());<a name="line.116"></a>
<span class="sourceLineNo">117</span>                }<a name="line.117"></a>
<span class="sourceLineNo">118</span>            }<a name="line.118"></a>
<span class="sourceLineNo">119</span>            result.freeze();<a name="line.119"></a>
<span class="sourceLineNo">120</span>            return result;<a name="line.120"></a>
<span class="sourceLineNo">121</span>        }<a name="line.121"></a>
<span class="sourceLineNo">122</span><a name="line.122"></a>
<span class="sourceLineNo">123</span>        private static JdkMapAdapterStringMap frozenStringMap(final Map&lt;String, String&gt; copy) {<a name="line.123"></a>
<span class="sourceLineNo">124</span>            final JdkMapAdapterStringMap result = new JdkMapAdapterStringMap(copy);<a name="line.124"></a>
<span class="sourceLineNo">125</span>            result.freeze();<a name="line.125"></a>
<span class="sourceLineNo">126</span>            return result;<a name="line.126"></a>
<span class="sourceLineNo">127</span>        }<a name="line.127"></a>
<span class="sourceLineNo">128</span><a name="line.128"></a>
<span class="sourceLineNo">129</span>        @Override<a name="line.129"></a>
<span class="sourceLineNo">130</span>        public ReadOnlyStringMap rawContextData() {<a name="line.130"></a>
<span class="sourceLineNo">131</span>            final ReadOnlyThreadContextMap map = ThreadContext.getThreadContextMap();<a name="line.131"></a>
<span class="sourceLineNo">132</span>            if (map instanceof ReadOnlyStringMap) {<a name="line.132"></a>
<span class="sourceLineNo">133</span>                return (ReadOnlyStringMap) map;<a name="line.133"></a>
<span class="sourceLineNo">134</span>            }<a name="line.134"></a>
<span class="sourceLineNo">135</span>            // note: default ThreadContextMap is null<a name="line.135"></a>
<span class="sourceLineNo">136</span>            final Map&lt;String, String&gt; copy = ThreadContext.getImmutableContext();<a name="line.136"></a>
<span class="sourceLineNo">137</span>            return copy.isEmpty() ? ContextDataFactory.emptyFrozenContextData() : new JdkMapAdapterStringMap(copy);<a name="line.137"></a>
<span class="sourceLineNo">138</span>        }<a name="line.138"></a>
<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
<span class="sourceLineNo">140</span><a name="line.140"></a>
<span class="sourceLineNo">141</span>    /**<a name="line.141"></a>
<span class="sourceLineNo">142</span>     * The {@code ContextDataInjector} used when the ThreadContextMap implementation is a garbage-free<a name="line.142"></a>
<span class="sourceLineNo">143</span>     * StringMap-based data structure.<a name="line.143"></a>
<span class="sourceLineNo">144</span>     * &lt;p&gt;<a name="line.144"></a>
<span class="sourceLineNo">145</span>     * This injector always puts key-value pairs into the specified reusable StringMap.<a name="line.145"></a>
<span class="sourceLineNo">146</span>     */<a name="line.146"></a>
<span class="sourceLineNo">147</span>    public static class ForGarbageFreeThreadContextMap implements ContextDataInjector {<a name="line.147"></a>
<span class="sourceLineNo">148</span>        private final List&lt;ContextDataProvider&gt; providers;<a name="line.148"></a>
<span class="sourceLineNo">149</span><a name="line.149"></a>
<span class="sourceLineNo">150</span>        public ForGarbageFreeThreadContextMap() {<a name="line.150"></a>
<span class="sourceLineNo">151</span>            this.providers = getProviders();<a name="line.151"></a>
<span class="sourceLineNo">152</span>        }<a name="line.152"></a>
<span class="sourceLineNo">153</span><a name="line.153"></a>
<span class="sourceLineNo">154</span>        /**<a name="line.154"></a>
<span class="sourceLineNo">155</span>         * Puts key-value pairs from both the specified list of properties as well as the thread context into the<a name="line.155"></a>
<span class="sourceLineNo">156</span>         * specified reusable StringMap.<a name="line.156"></a>
<span class="sourceLineNo">157</span>         *<a name="line.157"></a>
<span class="sourceLineNo">158</span>         * @param props list of configuration properties, may be {@code null}<a name="line.158"></a>
<span class="sourceLineNo">159</span>         * @param reusable a {@code StringMap} instance that may be reused to avoid creating temporary objects<a name="line.159"></a>
<span class="sourceLineNo">160</span>         * @return a {@code StringMap} combining configuration properties with thread context data<a name="line.160"></a>
<span class="sourceLineNo">161</span>         */<a name="line.161"></a>
<span class="sourceLineNo">162</span>        @Override<a name="line.162"></a>
<span class="sourceLineNo">163</span>        public StringMap injectContextData(final List&lt;Property&gt; props, final StringMap reusable) {<a name="line.163"></a>
<span class="sourceLineNo">164</span>            // When the ThreadContext is garbage-free, we must copy its key-value pairs into the specified reusable<a name="line.164"></a>
<span class="sourceLineNo">165</span>            // StringMap. We cannot return the ThreadContext's internal data structure because it may be modified later<a name="line.165"></a>
<span class="sourceLineNo">166</span>            // and such modifications should not be reflected in the log event.<a name="line.166"></a>
<span class="sourceLineNo">167</span>            copyProperties(props, reusable);<a name="line.167"></a>
<span class="sourceLineNo">168</span>            for (int i = 0; i &lt; providers.size(); ++i) {<a name="line.168"></a>
<span class="sourceLineNo">169</span>                reusable.putAll(providers.get(i).supplyStringMap());<a name="line.169"></a>
<span class="sourceLineNo">170</span>            }<a name="line.170"></a>
<span class="sourceLineNo">171</span>            return reusable;<a name="line.171"></a>
<span class="sourceLineNo">172</span>        }<a name="line.172"></a>
<span class="sourceLineNo">173</span><a name="line.173"></a>
<span class="sourceLineNo">174</span>        @Override<a name="line.174"></a>
<span class="sourceLineNo">175</span>        public ReadOnlyStringMap rawContextData() {<a name="line.175"></a>
<span class="sourceLineNo">176</span>            return ThreadContext.getThreadContextMap().getReadOnlyContextData();<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><a name="line.179"></a>
<span class="sourceLineNo">180</span>    /**<a name="line.180"></a>
<span class="sourceLineNo">181</span>     * The {@code ContextDataInjector} used when the ThreadContextMap implementation is a copy-on-write<a name="line.181"></a>
<span class="sourceLineNo">182</span>     * StringMap-based data structure.<a name="line.182"></a>
<span class="sourceLineNo">183</span>     * &lt;p&gt;<a name="line.183"></a>
<span class="sourceLineNo">184</span>     * If there are no configuration properties, this injector will return the thread context's internal data<a name="line.184"></a>
<span class="sourceLineNo">185</span>     * structure. Otherwise the configuration properties are combined with the thread context key-value pairs into the<a name="line.185"></a>
<span class="sourceLineNo">186</span>     * specified reusable StringMap.<a name="line.186"></a>
<span class="sourceLineNo">187</span>     */<a name="line.187"></a>
<span class="sourceLineNo">188</span>    public static class ForCopyOnWriteThreadContextMap implements ContextDataInjector {<a name="line.188"></a>
<span class="sourceLineNo">189</span>        private final List&lt;ContextDataProvider&gt; providers;<a name="line.189"></a>
<span class="sourceLineNo">190</span><a name="line.190"></a>
<span class="sourceLineNo">191</span>        public ForCopyOnWriteThreadContextMap() {<a name="line.191"></a>
<span class="sourceLineNo">192</span>            this.providers = getProviders();<a name="line.192"></a>
<span class="sourceLineNo">193</span>        }<a name="line.193"></a>
<span class="sourceLineNo">194</span>        /**<a name="line.194"></a>
<span class="sourceLineNo">195</span>         * If there are no configuration properties, this injector will return the thread context's internal data<a name="line.195"></a>
<span class="sourceLineNo">196</span>         * structure. Otherwise the configuration properties are combined with the thread context key-value pairs into the<a name="line.196"></a>
<span class="sourceLineNo">197</span>         * specified reusable StringMap.<a name="line.197"></a>
<span class="sourceLineNo">198</span>         *<a name="line.198"></a>
<span class="sourceLineNo">199</span>         * @param props list of configuration properties, may be {@code null}<a name="line.199"></a>
<span class="sourceLineNo">200</span>         * @param ignore a {@code StringMap} instance from the log event<a name="line.200"></a>
<span class="sourceLineNo">201</span>         * @return a {@code StringMap} combining configuration properties with thread context data<a name="line.201"></a>
<span class="sourceLineNo">202</span>         */<a name="line.202"></a>
<span class="sourceLineNo">203</span>        @Override<a name="line.203"></a>
<span class="sourceLineNo">204</span>        public StringMap injectContextData(final List&lt;Property&gt; props, final StringMap ignore) {<a name="line.204"></a>
<span class="sourceLineNo">205</span>            // If there are no configuration properties we want to just return the ThreadContext's StringMap:<a name="line.205"></a>
<span class="sourceLineNo">206</span>            // it is a copy-on-write data structure so we are sure ThreadContext changes will not affect our copy.<a name="line.206"></a>
<span class="sourceLineNo">207</span>            if (providers.size() == 1 &amp;&amp; (props == null || props.isEmpty())) {<a name="line.207"></a>
<span class="sourceLineNo">208</span>                // this will replace the LogEvent's context data with the returned instance<a name="line.208"></a>
<span class="sourceLineNo">209</span>                return providers.get(0).supplyStringMap();<a name="line.209"></a>
<span class="sourceLineNo">210</span>            }<a name="line.210"></a>
<span class="sourceLineNo">211</span>            int count = props == null ? 0 : props.size();<a name="line.211"></a>
<span class="sourceLineNo">212</span>            StringMap[] maps = new StringMap[providers.size()];<a name="line.212"></a>
<span class="sourceLineNo">213</span>            for (int i = 0; i &lt; providers.size(); ++i) {<a name="line.213"></a>
<span class="sourceLineNo">214</span>                maps[i] = providers.get(i).supplyStringMap();<a name="line.214"></a>
<span class="sourceLineNo">215</span>                count += maps[i].size();<a name="line.215"></a>
<span class="sourceLineNo">216</span>            }<a name="line.216"></a>
<span class="sourceLineNo">217</span>            // However, if the list of Properties is non-empty we need to combine the properties and the ThreadContext<a name="line.217"></a>
<span class="sourceLineNo">218</span>            // data. Note that we cannot reuse the specified StringMap: some Loggers may have properties defined<a name="line.218"></a>
<span class="sourceLineNo">219</span>            // and others not, so the LogEvent's context data may have been replaced with an immutable copy from<a name="line.219"></a>
<span class="sourceLineNo">220</span>            // the ThreadContext - this will throw an UnsupportedOperationException if we try to modify it.<a name="line.220"></a>
<span class="sourceLineNo">221</span>            final StringMap result = ContextDataFactory.createContextData(count);<a name="line.221"></a>
<span class="sourceLineNo">222</span>            copyProperties(props, result);<a name="line.222"></a>
<span class="sourceLineNo">223</span>            for (StringMap map : maps) {<a name="line.223"></a>
<span class="sourceLineNo">224</span>                result.putAll(map);<a name="line.224"></a>
<span class="sourceLineNo">225</span>            }<a name="line.225"></a>
<span class="sourceLineNo">226</span>            return result;<a name="line.226"></a>
<span class="sourceLineNo">227</span>        }<a name="line.227"></a>
<span class="sourceLineNo">228</span><a name="line.228"></a>
<span class="sourceLineNo">229</span>        @Override<a name="line.229"></a>
<span class="sourceLineNo">230</span>        public ReadOnlyStringMap rawContextData() {<a name="line.230"></a>
<span class="sourceLineNo">231</span>            return ThreadContext.getThreadContextMap().getReadOnlyContextData();<a name="line.231"></a>
<span class="sourceLineNo">232</span>        }<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>     * Copies key-value pairs from the specified property list into the specified {@code StringMap}.<a name="line.236"></a>
<span class="sourceLineNo">237</span>     *<a name="line.237"></a>
<span class="sourceLineNo">238</span>     * @param properties list of configuration properties, may be {@code null}<a name="line.238"></a>
<span class="sourceLineNo">239</span>     * @param result the {@code StringMap} object to add the key-values to. Must be non-{@code null}.<a name="line.239"></a>
<span class="sourceLineNo">240</span>     */<a name="line.240"></a>
<span class="sourceLineNo">241</span>    public static void copyProperties(final List&lt;Property&gt; properties, final StringMap result) {<a name="line.241"></a>
<span class="sourceLineNo">242</span>        if (properties != null) {<a name="line.242"></a>
<span class="sourceLineNo">243</span>            for (int i = 0; i &lt; properties.size(); i++) {<a name="line.243"></a>
<span class="sourceLineNo">244</span>                final Property prop = properties.get(i);<a name="line.244"></a>
<span class="sourceLineNo">245</span>                result.putValue(prop.getName(), prop.getValue());<a name="line.245"></a>
<span class="sourceLineNo">246</span>            }<a name="line.246"></a>
<span class="sourceLineNo">247</span>        }<a name="line.247"></a>
<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
<span class="sourceLineNo">249</span><a name="line.249"></a>
<span class="sourceLineNo">250</span>    private static List&lt;ContextDataProvider&gt; getProviders() {<a name="line.250"></a>
<span class="sourceLineNo">251</span>        final List&lt;ContextDataProvider&gt; providers = new ArrayList&lt;&gt;(contextDataProviders);<a name="line.251"></a>
<span class="sourceLineNo">252</span>        for (final ClassLoader classLoader : LoaderUtil.getClassLoaders()) {<a name="line.252"></a>
<span class="sourceLineNo">253</span>            try {<a name="line.253"></a>
<span class="sourceLineNo">254</span>                for (final ContextDataProvider provider : ServiceLoader.load(ContextDataProvider.class, classLoader)) {<a name="line.254"></a>
<span class="sourceLineNo">255</span>                    if (providers.stream().noneMatch((p) -&gt; p.getClass().isAssignableFrom(provider.getClass()))) {<a name="line.255"></a>
<span class="sourceLineNo">256</span>                        providers.add(provider);<a name="line.256"></a>
<span class="sourceLineNo">257</span>                    }<a name="line.257"></a>
<span class="sourceLineNo">258</span>                }<a name="line.258"></a>
<span class="sourceLineNo">259</span>            } catch (final Throwable ex) {<a name="line.259"></a>
<span class="sourceLineNo">260</span>                LOGGER.debug("Unable to access Context Data Providers {}", ex.getMessage());<a name="line.260"></a>
<span class="sourceLineNo">261</span>            }<a name="line.261"></a>
<span class="sourceLineNo">262</span>        }<a name="line.262"></a>
<span class="sourceLineNo">263</span>        return providers;<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>




























































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