<!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.HashMap;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.util.List;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.util.Map;<a name="line.21"></a>
<span class="sourceLineNo">022</span><a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.logging.log4j.ThreadContext;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.logging.log4j.core.ContextDataInjector;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.logging.log4j.core.config.Property;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.logging.log4j.util.ReadOnlyStringMap;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.apache.logging.log4j.util.StringMap;<a name="line.28"></a>
<span class="sourceLineNo">029</span><a name="line.29"></a>
<span class="sourceLineNo">030</span>/**<a name="line.30"></a>
<span class="sourceLineNo">031</span> * {@code ThreadContextDataInjector} contains a number of strategies for copying key-value pairs from the various<a name="line.31"></a>
<span class="sourceLineNo">032</span> * {@code ThreadContext} map implementations into a {@code StringMap}. In the case of duplicate keys,<a name="line.32"></a>
<span class="sourceLineNo">033</span> * thread context values overwrite configuration {@code Property} values.<a name="line.33"></a>
<span class="sourceLineNo">034</span> * &lt;p&gt;<a name="line.34"></a>
<span class="sourceLineNo">035</span> * These are the default {@code ContextDataInjector} objects returned by the {@link ContextDataInjectorFactory}.<a name="line.35"></a>
<span class="sourceLineNo">036</span> * &lt;/p&gt;<a name="line.36"></a>
<span class="sourceLineNo">037</span> *<a name="line.37"></a>
<span class="sourceLineNo">038</span> * @see org.apache.logging.log4j.ThreadContext<a name="line.38"></a>
<span class="sourceLineNo">039</span> * @see Property<a name="line.39"></a>
<span class="sourceLineNo">040</span> * @see ReadOnlyStringMap<a name="line.40"></a>
<span class="sourceLineNo">041</span> * @see ContextDataInjector<a name="line.41"></a>
<span class="sourceLineNo">042</span> * @see ContextDataInjectorFactory<a name="line.42"></a>
<span class="sourceLineNo">043</span> * @since 2.7<a name="line.43"></a>
<span class="sourceLineNo">044</span> */<a name="line.44"></a>
<span class="sourceLineNo">045</span>public class ThreadContextDataInjector {<a name="line.45"></a>
<span class="sourceLineNo">046</span><a name="line.46"></a>
<span class="sourceLineNo">047</span>    /**<a name="line.47"></a>
<span class="sourceLineNo">048</span>     * Default {@code ContextDataInjector} for the legacy {@code Map&lt;String, String&gt;}-based ThreadContext (which is<a name="line.48"></a>
<span class="sourceLineNo">049</span>     * also the ThreadContext implementation used for web applications).<a name="line.49"></a>
<span class="sourceLineNo">050</span>     * &lt;p&gt;<a name="line.50"></a>
<span class="sourceLineNo">051</span>     * This injector always puts key-value pairs into the specified reusable StringMap.<a name="line.51"></a>
<span class="sourceLineNo">052</span>     */<a name="line.52"></a>
<span class="sourceLineNo">053</span>    public static class ForDefaultThreadContextMap implements ContextDataInjector {<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>        /**<a name="line.55"></a>
<span class="sourceLineNo">056</span>         * Puts key-value pairs from both the specified list of properties as well as the thread context into the<a name="line.56"></a>
<span class="sourceLineNo">057</span>         * specified reusable StringMap.<a name="line.57"></a>
<span class="sourceLineNo">058</span>         *<a name="line.58"></a>
<span class="sourceLineNo">059</span>         * @param props list of configuration properties, may be {@code null}<a name="line.59"></a>
<span class="sourceLineNo">060</span>         * @param ignore a {@code StringMap} instance from the log event<a name="line.60"></a>
<span class="sourceLineNo">061</span>         * @return a {@code StringMap} combining configuration properties with thread context data<a name="line.61"></a>
<span class="sourceLineNo">062</span>         */<a name="line.62"></a>
<span class="sourceLineNo">063</span>        @Override<a name="line.63"></a>
<span class="sourceLineNo">064</span>        public StringMap injectContextData(final List&lt;Property&gt; props, final StringMap ignore) {<a name="line.64"></a>
<span class="sourceLineNo">065</span><a name="line.65"></a>
<span class="sourceLineNo">066</span>            final Map&lt;String, String&gt; copy = ThreadContext.getImmutableContext();<a name="line.66"></a>
<span class="sourceLineNo">067</span><a name="line.67"></a>
<span class="sourceLineNo">068</span>            // The DefaultThreadContextMap stores context data in a Map&lt;String, String&gt;.<a name="line.68"></a>
<span class="sourceLineNo">069</span>            // This is a copy-on-write data structure so we are sure ThreadContext changes will not affect our copy.<a name="line.69"></a>
<span class="sourceLineNo">070</span>            // If there are no configuration properties returning a thin wrapper around the copy<a name="line.70"></a>
<span class="sourceLineNo">071</span>            // is faster than copying the elements into the LogEvent's reusable StringMap.<a name="line.71"></a>
<span class="sourceLineNo">072</span>            if (props == null || props.isEmpty()) {<a name="line.72"></a>
<span class="sourceLineNo">073</span>                // this will replace the LogEvent's context data with the returned instance.<a name="line.73"></a>
<span class="sourceLineNo">074</span>                // NOTE: must mark as frozen or downstream components may attempt to modify (UnsupportedOperationEx)<a name="line.74"></a>
<span class="sourceLineNo">075</span>                return copy.isEmpty() ? ContextDataFactory.emptyFrozenContextData() : frozenStringMap(copy);<a name="line.75"></a>
<span class="sourceLineNo">076</span>            }<a name="line.76"></a>
<span class="sourceLineNo">077</span>            // If the list of Properties is non-empty we need to combine the properties and the ThreadContext<a name="line.77"></a>
<span class="sourceLineNo">078</span>            // data. Note that we cannot reuse the specified StringMap: some Loggers may have properties defined<a name="line.78"></a>
<span class="sourceLineNo">079</span>            // and others not, so the LogEvent's context data may have been replaced with an immutable copy from<a name="line.79"></a>
<span class="sourceLineNo">080</span>            // the ThreadContext - this will throw an UnsupportedOperationException if we try to modify it.<a name="line.80"></a>
<span class="sourceLineNo">081</span>            final StringMap result = new JdkMapAdapterStringMap(new HashMap&lt;&gt;(copy));<a name="line.81"></a>
<span class="sourceLineNo">082</span>            for (int i = 0; i &lt; props.size(); i++) {<a name="line.82"></a>
<span class="sourceLineNo">083</span>                final Property prop = props.get(i);<a name="line.83"></a>
<span class="sourceLineNo">084</span>                if (!copy.containsKey(prop.getName())) {<a name="line.84"></a>
<span class="sourceLineNo">085</span>                    result.putValue(prop.getName(), prop.getValue());<a name="line.85"></a>
<span class="sourceLineNo">086</span>                }<a name="line.86"></a>
<span class="sourceLineNo">087</span>            }<a name="line.87"></a>
<span class="sourceLineNo">088</span>            result.freeze();<a name="line.88"></a>
<span class="sourceLineNo">089</span>            return result;<a name="line.89"></a>
<span class="sourceLineNo">090</span>        }<a name="line.90"></a>
<span class="sourceLineNo">091</span><a name="line.91"></a>
<span class="sourceLineNo">092</span>        private static JdkMapAdapterStringMap frozenStringMap(final Map&lt;String, String&gt; copy) {<a name="line.92"></a>
<span class="sourceLineNo">093</span>            final JdkMapAdapterStringMap result = new JdkMapAdapterStringMap(copy);<a name="line.93"></a>
<span class="sourceLineNo">094</span>            result.freeze();<a name="line.94"></a>
<span class="sourceLineNo">095</span>            return result;<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>        @Override<a name="line.98"></a>
<span class="sourceLineNo">099</span>        public ReadOnlyStringMap rawContextData() {<a name="line.99"></a>
<span class="sourceLineNo">100</span>            final ReadOnlyThreadContextMap map = ThreadContext.getThreadContextMap();<a name="line.100"></a>
<span class="sourceLineNo">101</span>            if (map instanceof ReadOnlyStringMap) {<a name="line.101"></a>
<span class="sourceLineNo">102</span>                return (ReadOnlyStringMap) map;<a name="line.102"></a>
<span class="sourceLineNo">103</span>            }<a name="line.103"></a>
<span class="sourceLineNo">104</span>            // note: default ThreadContextMap is null<a name="line.104"></a>
<span class="sourceLineNo">105</span>            final Map&lt;String, String&gt; copy = ThreadContext.getImmutableContext();<a name="line.105"></a>
<span class="sourceLineNo">106</span>            return copy.isEmpty() ? ContextDataFactory.emptyFrozenContextData() : new JdkMapAdapterStringMap(copy);<a name="line.106"></a>
<span class="sourceLineNo">107</span>        }<a name="line.107"></a>
<span class="sourceLineNo">108</span>    }<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>     * The {@code ContextDataInjector} used when the ThreadContextMap implementation is a garbage-free<a name="line.111"></a>
<span class="sourceLineNo">112</span>     * StringMap-based data structure.<a name="line.112"></a>
<span class="sourceLineNo">113</span>     * &lt;p&gt;<a name="line.113"></a>
<span class="sourceLineNo">114</span>     * This injector always puts key-value pairs into the specified reusable StringMap.<a name="line.114"></a>
<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
<span class="sourceLineNo">116</span>    public static class ForGarbageFreeThreadContextMap implements ContextDataInjector {<a name="line.116"></a>
<span class="sourceLineNo">117</span>        /**<a name="line.117"></a>
<span class="sourceLineNo">118</span>         * Puts key-value pairs from both the specified list of properties as well as the thread context into the<a name="line.118"></a>
<span class="sourceLineNo">119</span>         * specified reusable StringMap.<a name="line.119"></a>
<span class="sourceLineNo">120</span>         *<a name="line.120"></a>
<span class="sourceLineNo">121</span>         * @param props list of configuration properties, may be {@code null}<a name="line.121"></a>
<span class="sourceLineNo">122</span>         * @param reusable a {@code StringMap} instance that may be reused to avoid creating temporary objects<a name="line.122"></a>
<span class="sourceLineNo">123</span>         * @return a {@code StringMap} combining configuration properties with thread context data<a name="line.123"></a>
<span class="sourceLineNo">124</span>         */<a name="line.124"></a>
<span class="sourceLineNo">125</span>        @Override<a name="line.125"></a>
<span class="sourceLineNo">126</span>        public StringMap injectContextData(final List&lt;Property&gt; props, final StringMap reusable) {<a name="line.126"></a>
<span class="sourceLineNo">127</span>            // When the ThreadContext is garbage-free, we must copy its key-value pairs into the specified reusable<a name="line.127"></a>
<span class="sourceLineNo">128</span>            // StringMap. We cannot return the ThreadContext's internal data structure because it may be modified later<a name="line.128"></a>
<span class="sourceLineNo">129</span>            // and such modifications should not be reflected in the log event.<a name="line.129"></a>
<span class="sourceLineNo">130</span>            copyProperties(props, reusable);<a name="line.130"></a>
<span class="sourceLineNo">131</span><a name="line.131"></a>
<span class="sourceLineNo">132</span>            final ReadOnlyStringMap immutableCopy = ThreadContext.getThreadContextMap().getReadOnlyContextData();<a name="line.132"></a>
<span class="sourceLineNo">133</span>            reusable.putAll(immutableCopy);<a name="line.133"></a>
<span class="sourceLineNo">134</span>            return reusable;<a name="line.134"></a>
<span class="sourceLineNo">135</span>        }<a name="line.135"></a>
<span class="sourceLineNo">136</span><a name="line.136"></a>
<span class="sourceLineNo">137</span>        @Override<a name="line.137"></a>
<span class="sourceLineNo">138</span>        public ReadOnlyStringMap rawContextData() {<a name="line.138"></a>
<span class="sourceLineNo">139</span>            return ThreadContext.getThreadContextMap().getReadOnlyContextData();<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><a name="line.142"></a>
<span class="sourceLineNo">143</span>    /**<a name="line.143"></a>
<span class="sourceLineNo">144</span>     * The {@code ContextDataInjector} used when the ThreadContextMap implementation is a copy-on-write<a name="line.144"></a>
<span class="sourceLineNo">145</span>     * StringMap-based data structure.<a name="line.145"></a>
<span class="sourceLineNo">146</span>     * &lt;p&gt;<a name="line.146"></a>
<span class="sourceLineNo">147</span>     * If there are no configuration properties, this injector will return the thread context's internal data<a name="line.147"></a>
<span class="sourceLineNo">148</span>     * structure. Otherwise the configuration properties are combined with the thread context key-value pairs into the<a name="line.148"></a>
<span class="sourceLineNo">149</span>     * specified reusable StringMap.<a name="line.149"></a>
<span class="sourceLineNo">150</span>     */<a name="line.150"></a>
<span class="sourceLineNo">151</span>    public static class ForCopyOnWriteThreadContextMap implements ContextDataInjector {<a name="line.151"></a>
<span class="sourceLineNo">152</span>        /**<a name="line.152"></a>
<span class="sourceLineNo">153</span>         * If there are no configuration properties, this injector will return the thread context's internal data<a name="line.153"></a>
<span class="sourceLineNo">154</span>         * structure. Otherwise the configuration properties are combined with the thread context key-value pairs into the<a name="line.154"></a>
<span class="sourceLineNo">155</span>         * specified reusable StringMap.<a name="line.155"></a>
<span class="sourceLineNo">156</span>         *<a name="line.156"></a>
<span class="sourceLineNo">157</span>         * @param props list of configuration properties, may be {@code null}<a name="line.157"></a>
<span class="sourceLineNo">158</span>         * @param ignore a {@code StringMap} instance from the log event<a name="line.158"></a>
<span class="sourceLineNo">159</span>         * @return a {@code StringMap} combining configuration properties with thread context data<a name="line.159"></a>
<span class="sourceLineNo">160</span>         */<a name="line.160"></a>
<span class="sourceLineNo">161</span>        @Override<a name="line.161"></a>
<span class="sourceLineNo">162</span>        public StringMap injectContextData(final List&lt;Property&gt; props, final StringMap ignore) {<a name="line.162"></a>
<span class="sourceLineNo">163</span>            // If there are no configuration properties we want to just return the ThreadContext's StringMap:<a name="line.163"></a>
<span class="sourceLineNo">164</span>            // it is a copy-on-write data structure so we are sure ThreadContext changes will not affect our copy.<a name="line.164"></a>
<span class="sourceLineNo">165</span>            final StringMap immutableCopy = ThreadContext.getThreadContextMap().getReadOnlyContextData();<a name="line.165"></a>
<span class="sourceLineNo">166</span>            if (props == null || props.isEmpty()) {<a name="line.166"></a>
<span class="sourceLineNo">167</span>                return immutableCopy; // this will replace the LogEvent's context data with the returned instance<a name="line.167"></a>
<span class="sourceLineNo">168</span>            }<a name="line.168"></a>
<span class="sourceLineNo">169</span>            // However, if the list of Properties is non-empty we need to combine the properties and the ThreadContext<a name="line.169"></a>
<span class="sourceLineNo">170</span>            // data. Note that we cannot reuse the specified StringMap: some Loggers may have properties defined<a name="line.170"></a>
<span class="sourceLineNo">171</span>            // and others not, so the LogEvent's context data may have been replaced with an immutable copy from<a name="line.171"></a>
<span class="sourceLineNo">172</span>            // the ThreadContext - this will throw an UnsupportedOperationException if we try to modify it.<a name="line.172"></a>
<span class="sourceLineNo">173</span>            final StringMap result = ContextDataFactory.createContextData(props.size() + immutableCopy.size());<a name="line.173"></a>
<span class="sourceLineNo">174</span>            copyProperties(props, result);<a name="line.174"></a>
<span class="sourceLineNo">175</span>            result.putAll(immutableCopy);<a name="line.175"></a>
<span class="sourceLineNo">176</span>            return result;<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>        @Override<a name="line.179"></a>
<span class="sourceLineNo">180</span>        public ReadOnlyStringMap rawContextData() {<a name="line.180"></a>
<span class="sourceLineNo">181</span>            return ThreadContext.getThreadContextMap().getReadOnlyContextData();<a name="line.181"></a>
<span class="sourceLineNo">182</span>        }<a name="line.182"></a>
<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
<span class="sourceLineNo">184</span><a name="line.184"></a>
<span class="sourceLineNo">185</span>    /**<a name="line.185"></a>
<span class="sourceLineNo">186</span>     * Copies key-value pairs from the specified property list into the specified {@code StringMap}.<a name="line.186"></a>
<span class="sourceLineNo">187</span>     *<a name="line.187"></a>
<span class="sourceLineNo">188</span>     * @param properties list of configuration properties, may be {@code null}<a name="line.188"></a>
<span class="sourceLineNo">189</span>     * @param result the {@code StringMap} object to add the key-values to. Must be non-{@code null}.<a name="line.189"></a>
<span class="sourceLineNo">190</span>     */<a name="line.190"></a>
<span class="sourceLineNo">191</span>    public static void copyProperties(final List&lt;Property&gt; properties, final StringMap result) {<a name="line.191"></a>
<span class="sourceLineNo">192</span>        if (properties != null) {<a name="line.192"></a>
<span class="sourceLineNo">193</span>            for (int i = 0; i &lt; properties.size(); i++) {<a name="line.193"></a>
<span class="sourceLineNo">194</span>                final Property prop = properties.get(i);<a name="line.194"></a>
<span class="sourceLineNo">195</span>                result.putValue(prop.getName(), prop.getValue());<a name="line.195"></a>
<span class="sourceLineNo">196</span>            }<a name="line.196"></a>
<span class="sourceLineNo">197</span>        }<a name="line.197"></a>
<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
<span class="sourceLineNo">199</span>}<a name="line.199"></a>




























































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