<!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.pattern;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import org.apache.logging.log4j.util.PerformanceSensitive;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import org.apache.logging.log4j.util.ReadOnlyStringMap;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import org.apache.logging.log4j.core.LogEvent;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import org.apache.logging.log4j.core.config.plugins.Plugin;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.logging.log4j.util.TriConsumer;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.logging.log4j.util.StringBuilders;<a name="line.24"></a>
<span class="sourceLineNo">025</span><a name="line.25"></a>
<span class="sourceLineNo">026</span>/**<a name="line.26"></a>
<span class="sourceLineNo">027</span> * Able to handle the contents of the LogEvent's MDC and either<a name="line.27"></a>
<span class="sourceLineNo">028</span> * output the entire contents of the properties in a similar format to the<a name="line.28"></a>
<span class="sourceLineNo">029</span> * java.util.Hashtable.toString(), or to output the value of a specific key<a name="line.29"></a>
<span class="sourceLineNo">030</span> * within the property bundle<a name="line.30"></a>
<span class="sourceLineNo">031</span> * when this pattern converter has the option set.<a name="line.31"></a>
<span class="sourceLineNo">032</span> */<a name="line.32"></a>
<span class="sourceLineNo">033</span>@Plugin(name = "MdcPatternConverter", category = PatternConverter.CATEGORY)<a name="line.33"></a>
<span class="sourceLineNo">034</span>@ConverterKeys({ "X", "mdc", "MDC" })<a name="line.34"></a>
<span class="sourceLineNo">035</span>@PerformanceSensitive("allocation")<a name="line.35"></a>
<span class="sourceLineNo">036</span>public final class MdcPatternConverter extends LogEventPatternConverter {<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>     * Name of property to output.<a name="line.39"></a>
<span class="sourceLineNo">040</span>     */<a name="line.40"></a>
<span class="sourceLineNo">041</span>    private final String key;<a name="line.41"></a>
<span class="sourceLineNo">042</span>    private final String[] keys;<a name="line.42"></a>
<span class="sourceLineNo">043</span>    private final boolean full;<a name="line.43"></a>
<span class="sourceLineNo">044</span><a name="line.44"></a>
<span class="sourceLineNo">045</span>    /**<a name="line.45"></a>
<span class="sourceLineNo">046</span>     * Private constructor.<a name="line.46"></a>
<span class="sourceLineNo">047</span>     *<a name="line.47"></a>
<span class="sourceLineNo">048</span>     * @param options options, may be null.<a name="line.48"></a>
<span class="sourceLineNo">049</span>     */<a name="line.49"></a>
<span class="sourceLineNo">050</span>    private MdcPatternConverter(final String[] options) {<a name="line.50"></a>
<span class="sourceLineNo">051</span>        super(options != null &amp;&amp; options.length &gt; 0 ? "MDC{" + options[0] + '}' : "MDC", "mdc");<a name="line.51"></a>
<span class="sourceLineNo">052</span>        if (options != null &amp;&amp; options.length &gt; 0) {<a name="line.52"></a>
<span class="sourceLineNo">053</span>            full = false;<a name="line.53"></a>
<span class="sourceLineNo">054</span>            if (options[0].indexOf(',') &gt; 0) {<a name="line.54"></a>
<span class="sourceLineNo">055</span>                keys = options[0].split(",");<a name="line.55"></a>
<span class="sourceLineNo">056</span>                for (int i = 0; i &lt; keys.length; i++) {<a name="line.56"></a>
<span class="sourceLineNo">057</span>                    keys[i] = keys[i].trim();<a name="line.57"></a>
<span class="sourceLineNo">058</span>                }<a name="line.58"></a>
<span class="sourceLineNo">059</span>                key = null;<a name="line.59"></a>
<span class="sourceLineNo">060</span>            } else {<a name="line.60"></a>
<span class="sourceLineNo">061</span>                keys = null;<a name="line.61"></a>
<span class="sourceLineNo">062</span>                key = options[0];<a name="line.62"></a>
<span class="sourceLineNo">063</span>            }<a name="line.63"></a>
<span class="sourceLineNo">064</span>        } else {<a name="line.64"></a>
<span class="sourceLineNo">065</span>            full = true;<a name="line.65"></a>
<span class="sourceLineNo">066</span>            key = null;<a name="line.66"></a>
<span class="sourceLineNo">067</span>            keys = null;<a name="line.67"></a>
<span class="sourceLineNo">068</span>        }<a name="line.68"></a>
<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
<span class="sourceLineNo">070</span><a name="line.70"></a>
<span class="sourceLineNo">071</span>    /**<a name="line.71"></a>
<span class="sourceLineNo">072</span>     * Obtains an instance of PropertiesPatternConverter.<a name="line.72"></a>
<span class="sourceLineNo">073</span>     *<a name="line.73"></a>
<span class="sourceLineNo">074</span>     * @param options options, may be null or first element contains name of property to format.<a name="line.74"></a>
<span class="sourceLineNo">075</span>     * @return instance of PropertiesPatternConverter.<a name="line.75"></a>
<span class="sourceLineNo">076</span>     */<a name="line.76"></a>
<span class="sourceLineNo">077</span>    public static MdcPatternConverter newInstance(final String[] options) {<a name="line.77"></a>
<span class="sourceLineNo">078</span>        return new MdcPatternConverter(options);<a name="line.78"></a>
<span class="sourceLineNo">079</span>    }<a name="line.79"></a>
<span class="sourceLineNo">080</span><a name="line.80"></a>
<span class="sourceLineNo">081</span>    private static final TriConsumer&lt;String, Object, StringBuilder&gt; WRITE_KEY_VALUES_INTO = new TriConsumer&lt;String, Object, StringBuilder&gt;() {<a name="line.81"></a>
<span class="sourceLineNo">082</span>        @Override<a name="line.82"></a>
<span class="sourceLineNo">083</span>        public void accept(final String key, final Object value, final StringBuilder sb) {<a name="line.83"></a>
<span class="sourceLineNo">084</span>            sb.append(key).append('=');<a name="line.84"></a>
<span class="sourceLineNo">085</span>            StringBuilders.appendValue(sb, value);<a name="line.85"></a>
<span class="sourceLineNo">086</span>            sb.append(", ");<a name="line.86"></a>
<span class="sourceLineNo">087</span>        }<a name="line.87"></a>
<span class="sourceLineNo">088</span>    };<a name="line.88"></a>
<span class="sourceLineNo">089</span><a name="line.89"></a>
<span class="sourceLineNo">090</span>    /**<a name="line.90"></a>
<span class="sourceLineNo">091</span>     * {@inheritDoc}<a name="line.91"></a>
<span class="sourceLineNo">092</span>     */<a name="line.92"></a>
<span class="sourceLineNo">093</span>    @Override<a name="line.93"></a>
<span class="sourceLineNo">094</span>    public void format(final LogEvent event, final StringBuilder toAppendTo) {<a name="line.94"></a>
<span class="sourceLineNo">095</span>        final ReadOnlyStringMap contextData = event.getContextData();<a name="line.95"></a>
<span class="sourceLineNo">096</span>        // if there is no additional options, we output every single<a name="line.96"></a>
<span class="sourceLineNo">097</span>        // Key/Value pair for the MDC in a similar format to Hashtable.toString()<a name="line.97"></a>
<span class="sourceLineNo">098</span>        if (full) {<a name="line.98"></a>
<span class="sourceLineNo">099</span>            if (contextData == null || contextData.size() == 0) {<a name="line.99"></a>
<span class="sourceLineNo">100</span>                toAppendTo.append("{}");<a name="line.100"></a>
<span class="sourceLineNo">101</span>                return;<a name="line.101"></a>
<span class="sourceLineNo">102</span>            }<a name="line.102"></a>
<span class="sourceLineNo">103</span>            appendFully(contextData, toAppendTo);<a name="line.103"></a>
<span class="sourceLineNo">104</span>        } else {<a name="line.104"></a>
<span class="sourceLineNo">105</span>            if (keys != null) {<a name="line.105"></a>
<span class="sourceLineNo">106</span>                if (contextData == null || contextData.size() == 0) {<a name="line.106"></a>
<span class="sourceLineNo">107</span>                    toAppendTo.append("{}");<a name="line.107"></a>
<span class="sourceLineNo">108</span>                    return;<a name="line.108"></a>
<span class="sourceLineNo">109</span>                }<a name="line.109"></a>
<span class="sourceLineNo">110</span>                appendSelectedKeys(keys, contextData, toAppendTo);<a name="line.110"></a>
<span class="sourceLineNo">111</span>            } else if (contextData != null){<a name="line.111"></a>
<span class="sourceLineNo">112</span>                // otherwise they just want a single key output<a name="line.112"></a>
<span class="sourceLineNo">113</span>                final Object value = contextData.getValue(key);<a name="line.113"></a>
<span class="sourceLineNo">114</span>                if (value != null) {<a name="line.114"></a>
<span class="sourceLineNo">115</span>                    StringBuilders.appendValue(toAppendTo, value);<a name="line.115"></a>
<span class="sourceLineNo">116</span>                }<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>    }<a name="line.119"></a>
<span class="sourceLineNo">120</span><a name="line.120"></a>
<span class="sourceLineNo">121</span>    private static void appendFully(final ReadOnlyStringMap contextData, final StringBuilder toAppendTo) {<a name="line.121"></a>
<span class="sourceLineNo">122</span>        toAppendTo.append("{");<a name="line.122"></a>
<span class="sourceLineNo">123</span>        final int start = toAppendTo.length();<a name="line.123"></a>
<span class="sourceLineNo">124</span>        contextData.forEach(WRITE_KEY_VALUES_INTO, toAppendTo);<a name="line.124"></a>
<span class="sourceLineNo">125</span>        final int end = toAppendTo.length();<a name="line.125"></a>
<span class="sourceLineNo">126</span>        if (end &gt; start) {<a name="line.126"></a>
<span class="sourceLineNo">127</span>            toAppendTo.setCharAt(end - 2, '}');<a name="line.127"></a>
<span class="sourceLineNo">128</span>            toAppendTo.deleteCharAt(end - 1);<a name="line.128"></a>
<span class="sourceLineNo">129</span>        } else {<a name="line.129"></a>
<span class="sourceLineNo">130</span>            toAppendTo.append('}');<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>    private static void appendSelectedKeys(final String[] keys, final ReadOnlyStringMap contextData, final StringBuilder sb) {<a name="line.134"></a>
<span class="sourceLineNo">135</span>        // Print all the keys in the array that have a value.<a name="line.135"></a>
<span class="sourceLineNo">136</span>        final int start = sb.length();<a name="line.136"></a>
<span class="sourceLineNo">137</span>        sb.append('{');<a name="line.137"></a>
<span class="sourceLineNo">138</span>        for (int i = 0; i &lt; keys.length; i++) {<a name="line.138"></a>
<span class="sourceLineNo">139</span>            final String theKey = keys[i];<a name="line.139"></a>
<span class="sourceLineNo">140</span>            final Object value = contextData.getValue(theKey);<a name="line.140"></a>
<span class="sourceLineNo">141</span>            if (value != null) { // !contextData.containskey(theKey)<a name="line.141"></a>
<span class="sourceLineNo">142</span>                if (sb.length() - start &gt; 1) {<a name="line.142"></a>
<span class="sourceLineNo">143</span>                    sb.append(", ");<a name="line.143"></a>
<span class="sourceLineNo">144</span>                }<a name="line.144"></a>
<span class="sourceLineNo">145</span>                sb.append(theKey).append('=');<a name="line.145"></a>
<span class="sourceLineNo">146</span>                StringBuilders.appendValue(sb, value);<a name="line.146"></a>
<span class="sourceLineNo">147</span>            }<a name="line.147"></a>
<span class="sourceLineNo">148</span>        }<a name="line.148"></a>
<span class="sourceLineNo">149</span>        sb.append('}');<a name="line.149"></a>
<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
<span class="sourceLineNo">151</span>}<a name="line.151"></a>




























































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