<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.apache.logging.log4j.core.pattern;<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.core.LogEvent;<a name="line.19"></a>
<FONT color="green">020</FONT>    import org.apache.logging.log4j.core.config.plugins.Plugin;<a name="line.20"></a>
<FONT color="green">021</FONT>    <a name="line.21"></a>
<FONT color="green">022</FONT>    import java.io.PrintWriter;<a name="line.22"></a>
<FONT color="green">023</FONT>    import java.io.StringWriter;<a name="line.23"></a>
<FONT color="green">024</FONT>    <a name="line.24"></a>
<FONT color="green">025</FONT>    <a name="line.25"></a>
<FONT color="green">026</FONT>    /**<a name="line.26"></a>
<FONT color="green">027</FONT>     * Outputs the Throwable portion of the LoggingEvent as a full stacktrace<a name="line.27"></a>
<FONT color="green">028</FONT>     * unless this converter's option is 'short', where it just outputs the first line of the trace, or if<a name="line.28"></a>
<FONT color="green">029</FONT>     * the number of lines to print is explicitly specified.<a name="line.29"></a>
<FONT color="green">030</FONT>     */<a name="line.30"></a>
<FONT color="green">031</FONT>    @Plugin(name = "ThrowablePatternConverter", type = "Converter")<a name="line.31"></a>
<FONT color="green">032</FONT>    @ConverterKeys({"ex", "throwable", "exception" })<a name="line.32"></a>
<FONT color="green">033</FONT>    public class ThrowablePatternConverter extends LogEventPatternConverter {<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>         * Format the whole stack trace.<a name="line.36"></a>
<FONT color="green">037</FONT>         */<a name="line.37"></a>
<FONT color="green">038</FONT>        protected static final String FULL = "full";<a name="line.38"></a>
<FONT color="green">039</FONT>        /**<a name="line.39"></a>
<FONT color="green">040</FONT>         * Format only the first line of the throwable.<a name="line.40"></a>
<FONT color="green">041</FONT>         */<a name="line.41"></a>
<FONT color="green">042</FONT>        protected static final String SHORT = "short";<a name="line.42"></a>
<FONT color="green">043</FONT>        /**<a name="line.43"></a>
<FONT color="green">044</FONT>         * If "short", only first line of throwable report will be formatted.&lt;br&gt;<a name="line.44"></a>
<FONT color="green">045</FONT>         * If "full", the whole stack trace will be formatted.&lt;br&gt;<a name="line.45"></a>
<FONT color="green">046</FONT>         * If "numeric" the output will be limited to the specified number of lines.<a name="line.46"></a>
<FONT color="green">047</FONT>         */<a name="line.47"></a>
<FONT color="green">048</FONT>        protected final String option;<a name="line.48"></a>
<FONT color="green">049</FONT>    <a name="line.49"></a>
<FONT color="green">050</FONT>        /**<a name="line.50"></a>
<FONT color="green">051</FONT>         * The number of lines to write.<a name="line.51"></a>
<FONT color="green">052</FONT>         */<a name="line.52"></a>
<FONT color="green">053</FONT>        protected final int lines;<a name="line.53"></a>
<FONT color="green">054</FONT>    <a name="line.54"></a>
<FONT color="green">055</FONT>        /**<a name="line.55"></a>
<FONT color="green">056</FONT>         * Constructor.<a name="line.56"></a>
<FONT color="green">057</FONT>         * @param name Name of converter.<a name="line.57"></a>
<FONT color="green">058</FONT>         * @param style CSS style for output.<a name="line.58"></a>
<FONT color="green">059</FONT>         * @param options options, may be null.<a name="line.59"></a>
<FONT color="green">060</FONT>         */<a name="line.60"></a>
<FONT color="green">061</FONT>        protected ThrowablePatternConverter(String name, String style, final String[] options) {<a name="line.61"></a>
<FONT color="green">062</FONT>            super(name, style);<a name="line.62"></a>
<FONT color="green">063</FONT>            int count = 0;<a name="line.63"></a>
<FONT color="green">064</FONT>            if ((options != null) &amp;&amp; (options.length &gt; 0)) {<a name="line.64"></a>
<FONT color="green">065</FONT>                option = options[0];<a name="line.65"></a>
<FONT color="green">066</FONT>                if (option.equalsIgnoreCase(SHORT)) {<a name="line.66"></a>
<FONT color="green">067</FONT>                    count = 2;<a name="line.67"></a>
<FONT color="green">068</FONT>                } else if (!option.equalsIgnoreCase(FULL)) {<a name="line.68"></a>
<FONT color="green">069</FONT>                    count = Integer.parseInt(option);<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>            } else {<a name="line.72"></a>
<FONT color="green">073</FONT>                option = null;<a name="line.73"></a>
<FONT color="green">074</FONT>            }<a name="line.74"></a>
<FONT color="green">075</FONT>            lines = count;<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>         * Gets an instance of the class.<a name="line.79"></a>
<FONT color="green">080</FONT>         *<a name="line.80"></a>
<FONT color="green">081</FONT>         * @param options pattern options, may be null.  If first element is "short",<a name="line.81"></a>
<FONT color="green">082</FONT>         *                only the first line of the throwable will be formatted.<a name="line.82"></a>
<FONT color="green">083</FONT>         * @return instance of class.<a name="line.83"></a>
<FONT color="green">084</FONT>         */<a name="line.84"></a>
<FONT color="green">085</FONT>        public static ThrowablePatternConverter newInstance(<a name="line.85"></a>
<FONT color="green">086</FONT>            final String[] options) {<a name="line.86"></a>
<FONT color="green">087</FONT>            return new ThrowablePatternConverter("Throwable", "throwable", options);<a name="line.87"></a>
<FONT color="green">088</FONT>        }<a name="line.88"></a>
<FONT color="green">089</FONT>    <a name="line.89"></a>
<FONT color="green">090</FONT>        /**<a name="line.90"></a>
<FONT color="green">091</FONT>         * {@inheritDoc}<a name="line.91"></a>
<FONT color="green">092</FONT>         */<a name="line.92"></a>
<FONT color="green">093</FONT>        public void format(final LogEvent event, final StringBuilder toAppendTo) {<a name="line.93"></a>
<FONT color="green">094</FONT>            Throwable t = event.getThrown();<a name="line.94"></a>
<FONT color="green">095</FONT>    <a name="line.95"></a>
<FONT color="green">096</FONT>            if (t != null) {<a name="line.96"></a>
<FONT color="green">097</FONT>                StringWriter w = new StringWriter();<a name="line.97"></a>
<FONT color="green">098</FONT>                t.printStackTrace(new PrintWriter(w));<a name="line.98"></a>
<FONT color="green">099</FONT>                int len = toAppendTo.length();<a name="line.99"></a>
<FONT color="green">100</FONT>                if (len &gt; 0 &amp;&amp; !Character.isWhitespace(toAppendTo.charAt(len - 1))) {<a name="line.100"></a>
<FONT color="green">101</FONT>                    toAppendTo.append(" ");<a name="line.101"></a>
<FONT color="green">102</FONT>                }<a name="line.102"></a>
<FONT color="green">103</FONT>                if (lines &gt; 0) {<a name="line.103"></a>
<FONT color="green">104</FONT>                    StringBuilder sb = new StringBuilder();<a name="line.104"></a>
<FONT color="green">105</FONT>                    String[] array = w.toString().split("\n");<a name="line.105"></a>
<FONT color="green">106</FONT>                    for (int i = 0; i &lt; lines; ++i) {<a name="line.106"></a>
<FONT color="green">107</FONT>                        sb.append(array[i]).append("\n");<a name="line.107"></a>
<FONT color="green">108</FONT>                    }<a name="line.108"></a>
<FONT color="green">109</FONT>                    toAppendTo.append(sb.toString());<a name="line.109"></a>
<FONT color="green">110</FONT>    <a name="line.110"></a>
<FONT color="green">111</FONT>                } else {<a name="line.111"></a>
<FONT color="green">112</FONT>                    toAppendTo.append(w.toString());<a name="line.112"></a>
<FONT color="green">113</FONT>                }<a name="line.113"></a>
<FONT color="green">114</FONT>            }<a name="line.114"></a>
<FONT color="green">115</FONT>        }<a name="line.115"></a>
<FONT color="green">116</FONT>    <a name="line.116"></a>
<FONT color="green">117</FONT>        /**<a name="line.117"></a>
<FONT color="green">118</FONT>         * This converter obviously handles throwables.<a name="line.118"></a>
<FONT color="green">119</FONT>         *<a name="line.119"></a>
<FONT color="green">120</FONT>         * @return true.<a name="line.120"></a>
<FONT color="green">121</FONT>         */<a name="line.121"></a>
<FONT color="green">122</FONT>        public boolean handlesThrowable() {<a name="line.122"></a>
<FONT color="green">123</FONT>            return true;<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>




























































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