<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
<FONT color="green">003</FONT>     * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
<FONT color="green">004</FONT>     * this work for additional information regarding copyright ownership.<a name="line.4"></a>
<FONT color="green">005</FONT>     * The ASF licenses this file to You under the Apache license, Version 2.0<a name="line.5"></a>
<FONT color="green">006</FONT>     * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
<FONT color="green">007</FONT>     * the License. You may obtain a copy of the License at<a name="line.7"></a>
<FONT color="green">008</FONT>     *<a name="line.8"></a>
<FONT color="green">009</FONT>     *      http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
<FONT color="green">010</FONT>     *<a name="line.10"></a>
<FONT color="green">011</FONT>     * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
<FONT color="green">012</FONT>     * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
<FONT color="green">013</FONT>     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
<FONT color="green">014</FONT>     * See the license for the specific language governing permissions and<a name="line.14"></a>
<FONT color="green">015</FONT>     * limitations under the license.<a name="line.15"></a>
<FONT color="green">016</FONT>     */<a name="line.16"></a>
<FONT color="green">017</FONT>    package org.slf4j.impl;<a name="line.17"></a>
<FONT color="green">018</FONT>    <a name="line.18"></a>
<FONT color="green">019</FONT>    import org.apache.logging.log4j.Level;<a name="line.19"></a>
<FONT color="green">020</FONT>    import org.apache.logging.log4j.LogManager;<a name="line.20"></a>
<FONT color="green">021</FONT>    import org.apache.logging.log4j.Logger;<a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.logging.log4j.message.Message;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.logging.log4j.message.ParameterizedMessage;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.logging.log4j.message.SimpleMessage;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.logging.log4j.message.StructuredDataMessage;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.logging.log4j.spi.AbstractLogger;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.logging.log4j.spi.AbstractLoggerWrapper;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.slf4j.Marker;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.slf4j.MarkerFactory;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.slf4j.ext.EventData;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.slf4j.spi.LocationAwareLogger;<a name="line.31"></a>
<FONT color="green">032</FONT>    <a name="line.32"></a>
<FONT color="green">033</FONT>    import java.util.Map;<a name="line.33"></a>
<FONT color="green">034</FONT>    <a name="line.34"></a>
<FONT color="green">035</FONT>    /**<a name="line.35"></a>
<FONT color="green">036</FONT>     *<a name="line.36"></a>
<FONT color="green">037</FONT>     */<a name="line.37"></a>
<FONT color="green">038</FONT>    public class SLF4JLogger implements LocationAwareLogger {<a name="line.38"></a>
<FONT color="green">039</FONT>    <a name="line.39"></a>
<FONT color="green">040</FONT>        private static final String FQCN = SLF4JLogger.class.getName();<a name="line.40"></a>
<FONT color="green">041</FONT>        private static final Marker EVENT_MARKER = MarkerFactory.getMarker("EVENT");<a name="line.41"></a>
<FONT color="green">042</FONT>        private final boolean eventLogger;<a name="line.42"></a>
<FONT color="green">043</FONT>        private final AbstractLoggerWrapper logger;<a name="line.43"></a>
<FONT color="green">044</FONT>        private final String name;<a name="line.44"></a>
<FONT color="green">045</FONT>    <a name="line.45"></a>
<FONT color="green">046</FONT>        public SLF4JLogger(AbstractLogger logger, String name) {<a name="line.46"></a>
<FONT color="green">047</FONT>            Logger l = LogManager.getLogger(name);<a name="line.47"></a>
<FONT color="green">048</FONT>            this.logger = new AbstractLoggerWrapper(logger, name);<a name="line.48"></a>
<FONT color="green">049</FONT>            eventLogger = "EventLogger".equals(name);<a name="line.49"></a>
<FONT color="green">050</FONT>            this.name = name;<a name="line.50"></a>
<FONT color="green">051</FONT>        }<a name="line.51"></a>
<FONT color="green">052</FONT>    <a name="line.52"></a>
<FONT color="green">053</FONT>        public void trace(String format) {<a name="line.53"></a>
<FONT color="green">054</FONT>            if (logger.isTraceEnabled()) {<a name="line.54"></a>
<FONT color="green">055</FONT>                logger.log(null, FQCN, Level.TRACE, new SimpleMessage(format), null);<a name="line.55"></a>
<FONT color="green">056</FONT>            }<a name="line.56"></a>
<FONT color="green">057</FONT>        }<a name="line.57"></a>
<FONT color="green">058</FONT>    <a name="line.58"></a>
<FONT color="green">059</FONT>        public void trace(String format, Object o) {<a name="line.59"></a>
<FONT color="green">060</FONT>            if (logger.isTraceEnabled()) {<a name="line.60"></a>
<FONT color="green">061</FONT>                logger.log(null, FQCN, Level.TRACE, new ParameterizedMessage(format, o), null);<a name="line.61"></a>
<FONT color="green">062</FONT>            }<a name="line.62"></a>
<FONT color="green">063</FONT>        }<a name="line.63"></a>
<FONT color="green">064</FONT>    <a name="line.64"></a>
<FONT color="green">065</FONT>        public void trace(String format, Object arg1, Object arg2) {<a name="line.65"></a>
<FONT color="green">066</FONT>            if (logger.isTraceEnabled()) {<a name="line.66"></a>
<FONT color="green">067</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);<a name="line.67"></a>
<FONT color="green">068</FONT>                logger.log(null, FQCN, Level.TRACE, msg, msg.getThrowable());<a name="line.68"></a>
<FONT color="green">069</FONT>            }<a name="line.69"></a>
<FONT color="green">070</FONT>        }<a name="line.70"></a>
<FONT color="green">071</FONT>    <a name="line.71"></a>
<FONT color="green">072</FONT>        public void trace(String format, Object[] args) {<a name="line.72"></a>
<FONT color="green">073</FONT>            if (logger.isTraceEnabled()) {<a name="line.73"></a>
<FONT color="green">074</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, args);<a name="line.74"></a>
<FONT color="green">075</FONT>                logger.log(null, FQCN, Level.TRACE, msg, msg.getThrowable());<a name="line.75"></a>
<FONT color="green">076</FONT>            }<a name="line.76"></a>
<FONT color="green">077</FONT>        }<a name="line.77"></a>
<FONT color="green">078</FONT>    <a name="line.78"></a>
<FONT color="green">079</FONT>        public void trace(String format, Throwable t) {<a name="line.79"></a>
<FONT color="green">080</FONT>            if (logger.isTraceEnabled()) {<a name="line.80"></a>
<FONT color="green">081</FONT>                logger.log(null, FQCN, Level.TRACE, new SimpleMessage(format), t);<a name="line.81"></a>
<FONT color="green">082</FONT>            }<a name="line.82"></a>
<FONT color="green">083</FONT>        }<a name="line.83"></a>
<FONT color="green">084</FONT>    <a name="line.84"></a>
<FONT color="green">085</FONT>        public boolean isTraceEnabled() {<a name="line.85"></a>
<FONT color="green">086</FONT>            return logger.isTraceEnabled();<a name="line.86"></a>
<FONT color="green">087</FONT>        }<a name="line.87"></a>
<FONT color="green">088</FONT>    <a name="line.88"></a>
<FONT color="green">089</FONT>        public boolean isTraceEnabled(Marker marker) {<a name="line.89"></a>
<FONT color="green">090</FONT>            return logger.isTraceEnabled((org.apache.logging.log4j.Marker) marker);<a name="line.90"></a>
<FONT color="green">091</FONT>        }<a name="line.91"></a>
<FONT color="green">092</FONT>    <a name="line.92"></a>
<FONT color="green">093</FONT>        public void trace(Marker marker, String s) {<a name="line.93"></a>
<FONT color="green">094</FONT>            if (isTraceEnabled(marker)) {<a name="line.94"></a>
<FONT color="green">095</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE, new SimpleMessage(s), null);<a name="line.95"></a>
<FONT color="green">096</FONT>            }<a name="line.96"></a>
<FONT color="green">097</FONT>        }<a name="line.97"></a>
<FONT color="green">098</FONT>    <a name="line.98"></a>
<FONT color="green">099</FONT>        public void trace(Marker marker, String s, Object o) {<a name="line.99"></a>
<FONT color="green">100</FONT>            if (isTraceEnabled(marker)) {<a name="line.100"></a>
<FONT color="green">101</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE,<a name="line.101"></a>
<FONT color="green">102</FONT>                    new ParameterizedMessage(s, o), null);<a name="line.102"></a>
<FONT color="green">103</FONT>            }<a name="line.103"></a>
<FONT color="green">104</FONT>        }<a name="line.104"></a>
<FONT color="green">105</FONT>    <a name="line.105"></a>
<FONT color="green">106</FONT>        public void trace(Marker marker, String s, Object o, Object o1) {<a name="line.106"></a>
<FONT color="green">107</FONT>            if (isTraceEnabled(marker)) {<a name="line.107"></a>
<FONT color="green">108</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);<a name="line.108"></a>
<FONT color="green">109</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE, msg, msg.getThrowable());<a name="line.109"></a>
<FONT color="green">110</FONT>            }<a name="line.110"></a>
<FONT color="green">111</FONT>        }<a name="line.111"></a>
<FONT color="green">112</FONT>    <a name="line.112"></a>
<FONT color="green">113</FONT>        public void trace(Marker marker, String s, Object[] objects) {<a name="line.113"></a>
<FONT color="green">114</FONT>            if (isTraceEnabled(marker)) {<a name="line.114"></a>
<FONT color="green">115</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, objects);<a name="line.115"></a>
<FONT color="green">116</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE, msg, msg.getThrowable());<a name="line.116"></a>
<FONT color="green">117</FONT>            }<a name="line.117"></a>
<FONT color="green">118</FONT>        }<a name="line.118"></a>
<FONT color="green">119</FONT>    <a name="line.119"></a>
<FONT color="green">120</FONT>        public void trace(Marker marker, String s, Throwable throwable) {<a name="line.120"></a>
<FONT color="green">121</FONT>            if (isTraceEnabled(marker)) {<a name="line.121"></a>
<FONT color="green">122</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE,<a name="line.122"></a>
<FONT color="green">123</FONT>                    new SimpleMessage(s), throwable);<a name="line.123"></a>
<FONT color="green">124</FONT>            }<a name="line.124"></a>
<FONT color="green">125</FONT>        }<a name="line.125"></a>
<FONT color="green">126</FONT>    <a name="line.126"></a>
<FONT color="green">127</FONT>        public void debug(String format) {<a name="line.127"></a>
<FONT color="green">128</FONT>            if (logger.isDebugEnabled()) {<a name="line.128"></a>
<FONT color="green">129</FONT>                logger.log(null, FQCN, Level.DEBUG, new SimpleMessage(format), null);<a name="line.129"></a>
<FONT color="green">130</FONT>            }<a name="line.130"></a>
<FONT color="green">131</FONT>        }<a name="line.131"></a>
<FONT color="green">132</FONT>    <a name="line.132"></a>
<FONT color="green">133</FONT>        public void debug(String format, Object o) {<a name="line.133"></a>
<FONT color="green">134</FONT>            if (logger.isDebugEnabled()) {<a name="line.134"></a>
<FONT color="green">135</FONT>                logger.log(null, FQCN, Level.DEBUG, new ParameterizedMessage(format, o), null);<a name="line.135"></a>
<FONT color="green">136</FONT>            }<a name="line.136"></a>
<FONT color="green">137</FONT>        }<a name="line.137"></a>
<FONT color="green">138</FONT>    <a name="line.138"></a>
<FONT color="green">139</FONT>        public void debug(String format, Object arg1, Object arg2) {<a name="line.139"></a>
<FONT color="green">140</FONT>            if (logger.isDebugEnabled()) {<a name="line.140"></a>
<FONT color="green">141</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);<a name="line.141"></a>
<FONT color="green">142</FONT>                logger.log(null, FQCN, Level.DEBUG, msg, msg.getThrowable());<a name="line.142"></a>
<FONT color="green">143</FONT>            }<a name="line.143"></a>
<FONT color="green">144</FONT>        }<a name="line.144"></a>
<FONT color="green">145</FONT>    <a name="line.145"></a>
<FONT color="green">146</FONT>        public void debug(String format, Object[] args) {<a name="line.146"></a>
<FONT color="green">147</FONT>            if (logger.isDebugEnabled()) {<a name="line.147"></a>
<FONT color="green">148</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, args);<a name="line.148"></a>
<FONT color="green">149</FONT>                logger.log(null, FQCN, Level.DEBUG, msg, msg.getThrowable());<a name="line.149"></a>
<FONT color="green">150</FONT>            }<a name="line.150"></a>
<FONT color="green">151</FONT>        }<a name="line.151"></a>
<FONT color="green">152</FONT>    <a name="line.152"></a>
<FONT color="green">153</FONT>        public void debug(String format, Throwable t) {<a name="line.153"></a>
<FONT color="green">154</FONT>            if (logger.isDebugEnabled()) {<a name="line.154"></a>
<FONT color="green">155</FONT>                logger.log(null, FQCN, Level.DEBUG, new SimpleMessage(format), t);<a name="line.155"></a>
<FONT color="green">156</FONT>            }<a name="line.156"></a>
<FONT color="green">157</FONT>        }<a name="line.157"></a>
<FONT color="green">158</FONT>    <a name="line.158"></a>
<FONT color="green">159</FONT>        public boolean isDebugEnabled() {<a name="line.159"></a>
<FONT color="green">160</FONT>            return logger.isDebugEnabled();<a name="line.160"></a>
<FONT color="green">161</FONT>        }<a name="line.161"></a>
<FONT color="green">162</FONT>    <a name="line.162"></a>
<FONT color="green">163</FONT>        public boolean isDebugEnabled(Marker marker) {<a name="line.163"></a>
<FONT color="green">164</FONT>            return logger.isDebugEnabled((org.apache.logging.log4j.Marker) marker);<a name="line.164"></a>
<FONT color="green">165</FONT>        }<a name="line.165"></a>
<FONT color="green">166</FONT>    <a name="line.166"></a>
<FONT color="green">167</FONT>        public void debug(Marker marker, String s) {<a name="line.167"></a>
<FONT color="green">168</FONT>            if (isDebugEnabled(marker)) {<a name="line.168"></a>
<FONT color="green">169</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG, new SimpleMessage(s), null);<a name="line.169"></a>
<FONT color="green">170</FONT>            }<a name="line.170"></a>
<FONT color="green">171</FONT>        }<a name="line.171"></a>
<FONT color="green">172</FONT>    <a name="line.172"></a>
<FONT color="green">173</FONT>        public void debug(Marker marker, String s, Object o) {<a name="line.173"></a>
<FONT color="green">174</FONT>            if (isDebugEnabled(marker)) {<a name="line.174"></a>
<FONT color="green">175</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG,<a name="line.175"></a>
<FONT color="green">176</FONT>                    new ParameterizedMessage(s, o), null);<a name="line.176"></a>
<FONT color="green">177</FONT>            }<a name="line.177"></a>
<FONT color="green">178</FONT>        }<a name="line.178"></a>
<FONT color="green">179</FONT>    <a name="line.179"></a>
<FONT color="green">180</FONT>        public void debug(Marker marker, String s, Object o, Object o1) {<a name="line.180"></a>
<FONT color="green">181</FONT>            if (isDebugEnabled(marker)) {<a name="line.181"></a>
<FONT color="green">182</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);<a name="line.182"></a>
<FONT color="green">183</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG, msg, msg.getThrowable());<a name="line.183"></a>
<FONT color="green">184</FONT>            }<a name="line.184"></a>
<FONT color="green">185</FONT>        }<a name="line.185"></a>
<FONT color="green">186</FONT>    <a name="line.186"></a>
<FONT color="green">187</FONT>        public void debug(Marker marker, String s, Object[] objects) {<a name="line.187"></a>
<FONT color="green">188</FONT>            if (isDebugEnabled(marker)) {<a name="line.188"></a>
<FONT color="green">189</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, objects);<a name="line.189"></a>
<FONT color="green">190</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG, msg, msg.getThrowable());<a name="line.190"></a>
<FONT color="green">191</FONT>            }<a name="line.191"></a>
<FONT color="green">192</FONT>        }<a name="line.192"></a>
<FONT color="green">193</FONT>    <a name="line.193"></a>
<FONT color="green">194</FONT>        public void debug(Marker marker, String s, Throwable throwable) {<a name="line.194"></a>
<FONT color="green">195</FONT>            if (isDebugEnabled(marker)) {<a name="line.195"></a>
<FONT color="green">196</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG,<a name="line.196"></a>
<FONT color="green">197</FONT>                    new SimpleMessage(s), throwable);<a name="line.197"></a>
<FONT color="green">198</FONT>            }<a name="line.198"></a>
<FONT color="green">199</FONT>        }<a name="line.199"></a>
<FONT color="green">200</FONT>    <a name="line.200"></a>
<FONT color="green">201</FONT>        public void info(String format) {<a name="line.201"></a>
<FONT color="green">202</FONT>            if (logger.isInfoEnabled()) {<a name="line.202"></a>
<FONT color="green">203</FONT>                logger.log(null, FQCN, Level.INFO, new SimpleMessage(format), null);<a name="line.203"></a>
<FONT color="green">204</FONT>            }<a name="line.204"></a>
<FONT color="green">205</FONT>        }<a name="line.205"></a>
<FONT color="green">206</FONT>    <a name="line.206"></a>
<FONT color="green">207</FONT>        public void info(String format, Object o) {<a name="line.207"></a>
<FONT color="green">208</FONT>            if (logger.isInfoEnabled()) {<a name="line.208"></a>
<FONT color="green">209</FONT>                logger.log(null, FQCN, Level.INFO, new ParameterizedMessage(format, o), null);<a name="line.209"></a>
<FONT color="green">210</FONT>            }<a name="line.210"></a>
<FONT color="green">211</FONT>        }<a name="line.211"></a>
<FONT color="green">212</FONT>    <a name="line.212"></a>
<FONT color="green">213</FONT>        public void info(String format, Object arg1, Object arg2) {<a name="line.213"></a>
<FONT color="green">214</FONT>            if (logger.isInfoEnabled()) {<a name="line.214"></a>
<FONT color="green">215</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);<a name="line.215"></a>
<FONT color="green">216</FONT>                logger.log(null, FQCN, Level.INFO, msg, msg.getThrowable());<a name="line.216"></a>
<FONT color="green">217</FONT>            }<a name="line.217"></a>
<FONT color="green">218</FONT>        }<a name="line.218"></a>
<FONT color="green">219</FONT>    <a name="line.219"></a>
<FONT color="green">220</FONT>        public void info(String format, Object[] args) {<a name="line.220"></a>
<FONT color="green">221</FONT>            if (logger.isInfoEnabled()) {<a name="line.221"></a>
<FONT color="green">222</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, args);<a name="line.222"></a>
<FONT color="green">223</FONT>                logger.log(null, FQCN, Level.INFO, msg, msg.getThrowable());<a name="line.223"></a>
<FONT color="green">224</FONT>            }<a name="line.224"></a>
<FONT color="green">225</FONT>        }<a name="line.225"></a>
<FONT color="green">226</FONT>    <a name="line.226"></a>
<FONT color="green">227</FONT>        public void info(String format, Throwable t) {<a name="line.227"></a>
<FONT color="green">228</FONT>            if (logger.isInfoEnabled()) {<a name="line.228"></a>
<FONT color="green">229</FONT>                logger.log(null, FQCN, Level.INFO, new SimpleMessage(format), t);<a name="line.229"></a>
<FONT color="green">230</FONT>            }<a name="line.230"></a>
<FONT color="green">231</FONT>        }<a name="line.231"></a>
<FONT color="green">232</FONT>    <a name="line.232"></a>
<FONT color="green">233</FONT>        public boolean isInfoEnabled() {<a name="line.233"></a>
<FONT color="green">234</FONT>            return logger.isInfoEnabled();<a name="line.234"></a>
<FONT color="green">235</FONT>        }<a name="line.235"></a>
<FONT color="green">236</FONT>    <a name="line.236"></a>
<FONT color="green">237</FONT>        public boolean isInfoEnabled(Marker marker) {<a name="line.237"></a>
<FONT color="green">238</FONT>            return logger.isInfoEnabled((org.apache.logging.log4j.Marker) marker);<a name="line.238"></a>
<FONT color="green">239</FONT>        }<a name="line.239"></a>
<FONT color="green">240</FONT>    <a name="line.240"></a>
<FONT color="green">241</FONT>        public void info(Marker marker, String s) {<a name="line.241"></a>
<FONT color="green">242</FONT>            if (isInfoEnabled(marker)) {<a name="line.242"></a>
<FONT color="green">243</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO, new SimpleMessage(s), null);<a name="line.243"></a>
<FONT color="green">244</FONT>            }<a name="line.244"></a>
<FONT color="green">245</FONT>        }<a name="line.245"></a>
<FONT color="green">246</FONT>    <a name="line.246"></a>
<FONT color="green">247</FONT>        public void info(Marker marker, String s, Object o) {<a name="line.247"></a>
<FONT color="green">248</FONT>            if (isInfoEnabled(marker)) {<a name="line.248"></a>
<FONT color="green">249</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO,<a name="line.249"></a>
<FONT color="green">250</FONT>                    new ParameterizedMessage(s, o), null);<a name="line.250"></a>
<FONT color="green">251</FONT>            }<a name="line.251"></a>
<FONT color="green">252</FONT>        }<a name="line.252"></a>
<FONT color="green">253</FONT>    <a name="line.253"></a>
<FONT color="green">254</FONT>        public void info(Marker marker, String s, Object o, Object o1) {<a name="line.254"></a>
<FONT color="green">255</FONT>            if (isInfoEnabled(marker)) {<a name="line.255"></a>
<FONT color="green">256</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);<a name="line.256"></a>
<FONT color="green">257</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO, msg, msg.getThrowable());<a name="line.257"></a>
<FONT color="green">258</FONT>            }<a name="line.258"></a>
<FONT color="green">259</FONT>        }<a name="line.259"></a>
<FONT color="green">260</FONT>    <a name="line.260"></a>
<FONT color="green">261</FONT>        public void info(Marker marker, String s, Object[] objects) {<a name="line.261"></a>
<FONT color="green">262</FONT>            if (isInfoEnabled(marker)) {<a name="line.262"></a>
<FONT color="green">263</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, objects);<a name="line.263"></a>
<FONT color="green">264</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO, msg, msg.getThrowable());<a name="line.264"></a>
<FONT color="green">265</FONT>            }<a name="line.265"></a>
<FONT color="green">266</FONT>        }<a name="line.266"></a>
<FONT color="green">267</FONT>    <a name="line.267"></a>
<FONT color="green">268</FONT>        public void info(Marker marker, String s, Throwable throwable) {<a name="line.268"></a>
<FONT color="green">269</FONT>            if (isInfoEnabled(marker)) {<a name="line.269"></a>
<FONT color="green">270</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO,<a name="line.270"></a>
<FONT color="green">271</FONT>                    new SimpleMessage(s), throwable);<a name="line.271"></a>
<FONT color="green">272</FONT>            }<a name="line.272"></a>
<FONT color="green">273</FONT>        }<a name="line.273"></a>
<FONT color="green">274</FONT>    <a name="line.274"></a>
<FONT color="green">275</FONT>        public void warn(String format) {<a name="line.275"></a>
<FONT color="green">276</FONT>            if (logger.isWarnEnabled()) {<a name="line.276"></a>
<FONT color="green">277</FONT>                logger.log(null, FQCN, Level.WARN, new SimpleMessage(format), null);<a name="line.277"></a>
<FONT color="green">278</FONT>            }<a name="line.278"></a>
<FONT color="green">279</FONT>        }<a name="line.279"></a>
<FONT color="green">280</FONT>    <a name="line.280"></a>
<FONT color="green">281</FONT>        public void warn(String format, Object o) {<a name="line.281"></a>
<FONT color="green">282</FONT>            if (logger.isWarnEnabled()) {<a name="line.282"></a>
<FONT color="green">283</FONT>                logger.log(null, FQCN, Level.WARN, new ParameterizedMessage(format, o), null);<a name="line.283"></a>
<FONT color="green">284</FONT>            }<a name="line.284"></a>
<FONT color="green">285</FONT>        }<a name="line.285"></a>
<FONT color="green">286</FONT>    <a name="line.286"></a>
<FONT color="green">287</FONT>        public void warn(String format, Object arg1, Object arg2) {<a name="line.287"></a>
<FONT color="green">288</FONT>            if (logger.isWarnEnabled()) {<a name="line.288"></a>
<FONT color="green">289</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);<a name="line.289"></a>
<FONT color="green">290</FONT>                logger.log(null, FQCN, Level.WARN, msg, msg.getThrowable());<a name="line.290"></a>
<FONT color="green">291</FONT>            }<a name="line.291"></a>
<FONT color="green">292</FONT>        }<a name="line.292"></a>
<FONT color="green">293</FONT>    <a name="line.293"></a>
<FONT color="green">294</FONT>        public void warn(String format, Object[] args) {<a name="line.294"></a>
<FONT color="green">295</FONT>            if (logger.isWarnEnabled()) {<a name="line.295"></a>
<FONT color="green">296</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, args);<a name="line.296"></a>
<FONT color="green">297</FONT>                logger.log(null, FQCN, Level.WARN, msg, msg.getThrowable());<a name="line.297"></a>
<FONT color="green">298</FONT>            }<a name="line.298"></a>
<FONT color="green">299</FONT>        }<a name="line.299"></a>
<FONT color="green">300</FONT>    <a name="line.300"></a>
<FONT color="green">301</FONT>        public void warn(String format, Throwable t) {<a name="line.301"></a>
<FONT color="green">302</FONT>            if (logger.isWarnEnabled()) {<a name="line.302"></a>
<FONT color="green">303</FONT>                logger.log(null, FQCN, Level.WARN, new SimpleMessage(format), t);<a name="line.303"></a>
<FONT color="green">304</FONT>            }<a name="line.304"></a>
<FONT color="green">305</FONT>        }<a name="line.305"></a>
<FONT color="green">306</FONT>    <a name="line.306"></a>
<FONT color="green">307</FONT>        public boolean isWarnEnabled() {<a name="line.307"></a>
<FONT color="green">308</FONT>            return logger.isWarnEnabled();<a name="line.308"></a>
<FONT color="green">309</FONT>        }<a name="line.309"></a>
<FONT color="green">310</FONT>    <a name="line.310"></a>
<FONT color="green">311</FONT>        public boolean isWarnEnabled(Marker marker) {<a name="line.311"></a>
<FONT color="green">312</FONT>            return logger.isWarnEnabled((org.apache.logging.log4j.Marker) marker);<a name="line.312"></a>
<FONT color="green">313</FONT>        }<a name="line.313"></a>
<FONT color="green">314</FONT>    <a name="line.314"></a>
<FONT color="green">315</FONT>        public void warn(Marker marker, String s) {<a name="line.315"></a>
<FONT color="green">316</FONT>            if (isWarnEnabled(marker)) {<a name="line.316"></a>
<FONT color="green">317</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN, new SimpleMessage(s), null);<a name="line.317"></a>
<FONT color="green">318</FONT>            }<a name="line.318"></a>
<FONT color="green">319</FONT>        }<a name="line.319"></a>
<FONT color="green">320</FONT>    <a name="line.320"></a>
<FONT color="green">321</FONT>        public void warn(Marker marker, String s, Object o) {<a name="line.321"></a>
<FONT color="green">322</FONT>            if (isWarnEnabled(marker)) {<a name="line.322"></a>
<FONT color="green">323</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN,<a name="line.323"></a>
<FONT color="green">324</FONT>                    new ParameterizedMessage(s, o), null);<a name="line.324"></a>
<FONT color="green">325</FONT>            }<a name="line.325"></a>
<FONT color="green">326</FONT>        }<a name="line.326"></a>
<FONT color="green">327</FONT>    <a name="line.327"></a>
<FONT color="green">328</FONT>        public void warn(Marker marker, String s, Object o, Object o1) {<a name="line.328"></a>
<FONT color="green">329</FONT>            if (isWarnEnabled(marker)) {<a name="line.329"></a>
<FONT color="green">330</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);<a name="line.330"></a>
<FONT color="green">331</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN, msg, msg.getThrowable());<a name="line.331"></a>
<FONT color="green">332</FONT>            }<a name="line.332"></a>
<FONT color="green">333</FONT>        }<a name="line.333"></a>
<FONT color="green">334</FONT>    <a name="line.334"></a>
<FONT color="green">335</FONT>        public void warn(Marker marker, String s, Object[] objects) {<a name="line.335"></a>
<FONT color="green">336</FONT>            if (isWarnEnabled(marker)) {<a name="line.336"></a>
<FONT color="green">337</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, objects);<a name="line.337"></a>
<FONT color="green">338</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN, msg, msg.getThrowable());<a name="line.338"></a>
<FONT color="green">339</FONT>            }<a name="line.339"></a>
<FONT color="green">340</FONT>        }<a name="line.340"></a>
<FONT color="green">341</FONT>    <a name="line.341"></a>
<FONT color="green">342</FONT>        public void warn(Marker marker, String s, Throwable throwable) {<a name="line.342"></a>
<FONT color="green">343</FONT>            if (isWarnEnabled(marker)) {<a name="line.343"></a>
<FONT color="green">344</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN,<a name="line.344"></a>
<FONT color="green">345</FONT>                    new SimpleMessage(s), throwable);<a name="line.345"></a>
<FONT color="green">346</FONT>            }<a name="line.346"></a>
<FONT color="green">347</FONT>        }<a name="line.347"></a>
<FONT color="green">348</FONT>    <a name="line.348"></a>
<FONT color="green">349</FONT>        public void error(String format) {<a name="line.349"></a>
<FONT color="green">350</FONT>            if (logger.isErrorEnabled()) {<a name="line.350"></a>
<FONT color="green">351</FONT>                logger.log(null, FQCN, Level.ERROR, new SimpleMessage(format), null);<a name="line.351"></a>
<FONT color="green">352</FONT>            }<a name="line.352"></a>
<FONT color="green">353</FONT>        }<a name="line.353"></a>
<FONT color="green">354</FONT>    <a name="line.354"></a>
<FONT color="green">355</FONT>        public void error(String format, Object o) {<a name="line.355"></a>
<FONT color="green">356</FONT>            if (logger.isErrorEnabled()) {<a name="line.356"></a>
<FONT color="green">357</FONT>                logger.log(null, FQCN, Level.ERROR, new ParameterizedMessage(format, o), null);<a name="line.357"></a>
<FONT color="green">358</FONT>            }<a name="line.358"></a>
<FONT color="green">359</FONT>        }<a name="line.359"></a>
<FONT color="green">360</FONT>    <a name="line.360"></a>
<FONT color="green">361</FONT>        public void error(String format, Object arg1, Object arg2) {<a name="line.361"></a>
<FONT color="green">362</FONT>            if (logger.isErrorEnabled()) {<a name="line.362"></a>
<FONT color="green">363</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, arg1, arg2);<a name="line.363"></a>
<FONT color="green">364</FONT>                logger.log(null, FQCN, Level.ERROR, msg, msg.getThrowable());<a name="line.364"></a>
<FONT color="green">365</FONT>            }<a name="line.365"></a>
<FONT color="green">366</FONT>        }<a name="line.366"></a>
<FONT color="green">367</FONT>    <a name="line.367"></a>
<FONT color="green">368</FONT>        public void error(String format, Object[] args) {<a name="line.368"></a>
<FONT color="green">369</FONT>            if (logger.isErrorEnabled()) {<a name="line.369"></a>
<FONT color="green">370</FONT>                ParameterizedMessage msg = new ParameterizedMessage(format, args);<a name="line.370"></a>
<FONT color="green">371</FONT>                logger.log(null, FQCN, Level.ERROR, msg, msg.getThrowable());<a name="line.371"></a>
<FONT color="green">372</FONT>            }<a name="line.372"></a>
<FONT color="green">373</FONT>        }<a name="line.373"></a>
<FONT color="green">374</FONT>    <a name="line.374"></a>
<FONT color="green">375</FONT>        public void error(String format, Throwable t) {<a name="line.375"></a>
<FONT color="green">376</FONT>            if (logger.isErrorEnabled()) {<a name="line.376"></a>
<FONT color="green">377</FONT>                logger.log(null, FQCN, Level.ERROR, new SimpleMessage(format), t);<a name="line.377"></a>
<FONT color="green">378</FONT>            }<a name="line.378"></a>
<FONT color="green">379</FONT>        }<a name="line.379"></a>
<FONT color="green">380</FONT>    <a name="line.380"></a>
<FONT color="green">381</FONT>        public boolean isErrorEnabled() {<a name="line.381"></a>
<FONT color="green">382</FONT>            return logger.isErrorEnabled();<a name="line.382"></a>
<FONT color="green">383</FONT>        }<a name="line.383"></a>
<FONT color="green">384</FONT>    <a name="line.384"></a>
<FONT color="green">385</FONT>        public boolean isErrorEnabled(Marker marker) {<a name="line.385"></a>
<FONT color="green">386</FONT>            return logger.isErrorEnabled((org.apache.logging.log4j.Marker) marker);<a name="line.386"></a>
<FONT color="green">387</FONT>        }<a name="line.387"></a>
<FONT color="green">388</FONT>    <a name="line.388"></a>
<FONT color="green">389</FONT>        public void error(Marker marker, String s) {<a name="line.389"></a>
<FONT color="green">390</FONT>            if (isErrorEnabled(marker)) {<a name="line.390"></a>
<FONT color="green">391</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR, new SimpleMessage(s), null);<a name="line.391"></a>
<FONT color="green">392</FONT>            }<a name="line.392"></a>
<FONT color="green">393</FONT>        }<a name="line.393"></a>
<FONT color="green">394</FONT>    <a name="line.394"></a>
<FONT color="green">395</FONT>        public void error(Marker marker, String s, Object o) {<a name="line.395"></a>
<FONT color="green">396</FONT>            if (isErrorEnabled(marker)) {<a name="line.396"></a>
<FONT color="green">397</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR,<a name="line.397"></a>
<FONT color="green">398</FONT>                    new ParameterizedMessage(s, o), null);<a name="line.398"></a>
<FONT color="green">399</FONT>            }<a name="line.399"></a>
<FONT color="green">400</FONT>        }<a name="line.400"></a>
<FONT color="green">401</FONT>    <a name="line.401"></a>
<FONT color="green">402</FONT>        public void error(Marker marker, String s, Object o, Object o1) {<a name="line.402"></a>
<FONT color="green">403</FONT>            if (isErrorEnabled(marker)) {<a name="line.403"></a>
<FONT color="green">404</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, o, o1);<a name="line.404"></a>
<FONT color="green">405</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR, msg, msg.getThrowable());<a name="line.405"></a>
<FONT color="green">406</FONT>            }<a name="line.406"></a>
<FONT color="green">407</FONT>        }<a name="line.407"></a>
<FONT color="green">408</FONT>    <a name="line.408"></a>
<FONT color="green">409</FONT>        public void error(Marker marker, String s, Object[] objects) {<a name="line.409"></a>
<FONT color="green">410</FONT>            if (isErrorEnabled(marker)) {<a name="line.410"></a>
<FONT color="green">411</FONT>                ParameterizedMessage msg = new ParameterizedMessage(s, objects);<a name="line.411"></a>
<FONT color="green">412</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR, msg, msg.getThrowable());<a name="line.412"></a>
<FONT color="green">413</FONT>            }<a name="line.413"></a>
<FONT color="green">414</FONT>        }<a name="line.414"></a>
<FONT color="green">415</FONT>    <a name="line.415"></a>
<FONT color="green">416</FONT>        public void error(Marker marker, String s, Throwable throwable) {<a name="line.416"></a>
<FONT color="green">417</FONT>            if (isErrorEnabled(marker)) {<a name="line.417"></a>
<FONT color="green">418</FONT>                logger.log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR,<a name="line.418"></a>
<FONT color="green">419</FONT>                    new SimpleMessage(s), throwable);<a name="line.419"></a>
<FONT color="green">420</FONT>            }<a name="line.420"></a>
<FONT color="green">421</FONT>        }<a name="line.421"></a>
<FONT color="green">422</FONT>    <a name="line.422"></a>
<FONT color="green">423</FONT>    <a name="line.423"></a>
<FONT color="green">424</FONT>        public void log(Marker marker, String fqcn, int i, String s1, Object[] objects, Throwable throwable) {<a name="line.424"></a>
<FONT color="green">425</FONT>            Message msg;<a name="line.425"></a>
<FONT color="green">426</FONT>            if (eventLogger &amp;&amp; marker != null &amp;&amp; marker.contains(EVENT_MARKER)) {<a name="line.426"></a>
<FONT color="green">427</FONT>                try {<a name="line.427"></a>
<FONT color="green">428</FONT>                    EventData data = (objects != null &amp;&amp; objects[0] instanceof EventData) ? (EventData) objects[0] :<a name="line.428"></a>
<FONT color="green">429</FONT>                        new EventData(s1);<a name="line.429"></a>
<FONT color="green">430</FONT>                    msg = new StructuredDataMessage(data.getEventId(), data.getMessage(), data.getEventType());<a name="line.430"></a>
<FONT color="green">431</FONT>                    for (Map.Entry entry : data.getEventMap().entrySet()) {<a name="line.431"></a>
<FONT color="green">432</FONT>                        String key = entry.getKey().toString();<a name="line.432"></a>
<FONT color="green">433</FONT>                        if (EventData.EVENT_TYPE.equals(key) || EventData.EVENT_ID.equals(key) ||<a name="line.433"></a>
<FONT color="green">434</FONT>                            EventData.EVENT_MESSAGE.equals(key)) {<a name="line.434"></a>
<FONT color="green">435</FONT>                            continue;<a name="line.435"></a>
<FONT color="green">436</FONT>                        }<a name="line.436"></a>
<FONT color="green">437</FONT>                        ((StructuredDataMessage) msg).put(entry.getKey().toString(), entry.getValue().toString());<a name="line.437"></a>
<FONT color="green">438</FONT>                    }<a name="line.438"></a>
<FONT color="green">439</FONT>                } catch (Exception ex) {<a name="line.439"></a>
<FONT color="green">440</FONT>                    msg = new ParameterizedMessage(s1, objects, throwable);<a name="line.440"></a>
<FONT color="green">441</FONT>                }<a name="line.441"></a>
<FONT color="green">442</FONT>    <a name="line.442"></a>
<FONT color="green">443</FONT>           } else if (objects == null) {<a name="line.443"></a>
<FONT color="green">444</FONT>                msg = new SimpleMessage(s1);<a name="line.444"></a>
<FONT color="green">445</FONT>            } else {<a name="line.445"></a>
<FONT color="green">446</FONT>                msg = new ParameterizedMessage(s1, objects, throwable);<a name="line.446"></a>
<FONT color="green">447</FONT>                if (throwable != null) {<a name="line.447"></a>
<FONT color="green">448</FONT>                    throwable = ((ParameterizedMessage) msg).getThrowable();<a name="line.448"></a>
<FONT color="green">449</FONT>                }<a name="line.449"></a>
<FONT color="green">450</FONT>            }<a name="line.450"></a>
<FONT color="green">451</FONT>            logger.log((org.apache.logging.log4j.Marker) marker, fqcn, getLevel(i), msg, throwable);<a name="line.451"></a>
<FONT color="green">452</FONT>        }<a name="line.452"></a>
<FONT color="green">453</FONT>    <a name="line.453"></a>
<FONT color="green">454</FONT>        public String getName() {<a name="line.454"></a>
<FONT color="green">455</FONT>            return name;<a name="line.455"></a>
<FONT color="green">456</FONT>        }<a name="line.456"></a>
<FONT color="green">457</FONT>    <a name="line.457"></a>
<FONT color="green">458</FONT>        private Level getLevel(int i) {<a name="line.458"></a>
<FONT color="green">459</FONT>    <a name="line.459"></a>
<FONT color="green">460</FONT>            switch (i) {<a name="line.460"></a>
<FONT color="green">461</FONT>                case TRACE_INT :<a name="line.461"></a>
<FONT color="green">462</FONT>                    return Level.TRACE;<a name="line.462"></a>
<FONT color="green">463</FONT>                case DEBUG_INT :<a name="line.463"></a>
<FONT color="green">464</FONT>                    return Level.DEBUG;<a name="line.464"></a>
<FONT color="green">465</FONT>                case INFO_INT :<a name="line.465"></a>
<FONT color="green">466</FONT>                    return Level.INFO;<a name="line.466"></a>
<FONT color="green">467</FONT>                case WARN_INT :<a name="line.467"></a>
<FONT color="green">468</FONT>                    return Level.WARN;<a name="line.468"></a>
<FONT color="green">469</FONT>                case ERROR_INT :<a name="line.469"></a>
<FONT color="green">470</FONT>                    return Level.ERROR;<a name="line.470"></a>
<FONT color="green">471</FONT>            }<a name="line.471"></a>
<FONT color="green">472</FONT>            return Level.ERROR;<a name="line.472"></a>
<FONT color="green">473</FONT>        }<a name="line.473"></a>
<FONT color="green">474</FONT>    }<a name="line.474"></a>




























































</PRE>
</BODY>
</HTML>
