<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.javaee;<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.LoggerContext;<a name="line.19"></a>
<FONT color="green">020</FONT>    <a name="line.20"></a>
<FONT color="green">021</FONT>    import javax.servlet.ServletContext;<a name="line.21"></a>
<FONT color="green">022</FONT>    import javax.servlet.ServletContextEvent;<a name="line.22"></a>
<FONT color="green">023</FONT>    import javax.servlet.ServletContextListener;<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>     * Saves the LoggerContext into the ServletContext as an attribute.<a name="line.26"></a>
<FONT color="green">027</FONT>     */<a name="line.27"></a>
<FONT color="green">028</FONT>    public class ContextListener implements ServletContextListener {<a name="line.28"></a>
<FONT color="green">029</FONT>    <a name="line.29"></a>
<FONT color="green">030</FONT>        /**<a name="line.30"></a>
<FONT color="green">031</FONT>         * The name of the attribute to use to store the LoggerContext into the ServletContext.<a name="line.31"></a>
<FONT color="green">032</FONT>         */<a name="line.32"></a>
<FONT color="green">033</FONT>        public static final String LOG4J_CONTEXT_ATTRIBUTE = "Log4JContext";<a name="line.33"></a>
<FONT color="green">034</FONT>    <a name="line.34"></a>
<FONT color="green">035</FONT>        public void contextInitialized(ServletContextEvent event) {<a name="line.35"></a>
<FONT color="green">036</FONT>            ServletContext context = event.getServletContext();<a name="line.36"></a>
<FONT color="green">037</FONT>            LoggerContext ctx = new LoggerContext(context.getServletContextName(), context);<a name="line.37"></a>
<FONT color="green">038</FONT>            context.setAttribute(LOG4J_CONTEXT_ATTRIBUTE, ctx);<a name="line.38"></a>
<FONT color="green">039</FONT>        }<a name="line.39"></a>
<FONT color="green">040</FONT>    <a name="line.40"></a>
<FONT color="green">041</FONT>        public void contextDestroyed(ServletContextEvent event) {<a name="line.41"></a>
<FONT color="green">042</FONT>            ServletContext context = event.getServletContext();<a name="line.42"></a>
<FONT color="green">043</FONT>            LoggerContext ctx = (LoggerContext) context.getAttribute(LOG4J_CONTEXT_ATTRIBUTE);<a name="line.43"></a>
<FONT color="green">044</FONT>            if (ctx != null) {<a name="line.44"></a>
<FONT color="green">045</FONT>                context.removeAttribute(LOG4J_CONTEXT_ATTRIBUTE);<a name="line.45"></a>
<FONT color="green">046</FONT>                ctx.stop();<a name="line.46"></a>
<FONT color="green">047</FONT>            }<a name="line.47"></a>
<FONT color="green">048</FONT>        }<a name="line.48"></a>
<FONT color="green">049</FONT>    }<a name="line.49"></a>




























































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