<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.selector;<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 java.util.List;<a name="line.21"></a>
<FONT color="green">022</FONT>    <a name="line.22"></a>
<FONT color="green">023</FONT>    /**<a name="line.23"></a>
<FONT color="green">024</FONT>     * Interface used to locate a LoggerContext.<a name="line.24"></a>
<FONT color="green">025</FONT>     */<a name="line.25"></a>
<FONT color="green">026</FONT>    public interface ContextSelector {<a name="line.26"></a>
<FONT color="green">027</FONT>    <a name="line.27"></a>
<FONT color="green">028</FONT>        /**<a name="line.28"></a>
<FONT color="green">029</FONT>         * Return the LoggerContext.<a name="line.29"></a>
<FONT color="green">030</FONT>         * @param fqcn The fully qualified class name of the caller.<a name="line.30"></a>
<FONT color="green">031</FONT>         * @param currentContext If true returns the current Context, if false returns the Context appropriate<a name="line.31"></a>
<FONT color="green">032</FONT>         * for the caller if a more appropriate Context can be determined.<a name="line.32"></a>
<FONT color="green">033</FONT>         * @return The LoggerContext.<a name="line.33"></a>
<FONT color="green">034</FONT>         */<a name="line.34"></a>
<FONT color="green">035</FONT>        LoggerContext getContext(String fqcn, boolean currentContext);<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>         * Return a List of all the available LoggerContexts.<a name="line.38"></a>
<FONT color="green">039</FONT>         * @return The List of LoggerContexts.<a name="line.39"></a>
<FONT color="green">040</FONT>         */<a name="line.40"></a>
<FONT color="green">041</FONT>        List&lt;LoggerContext&gt; getLoggerContexts();<a name="line.41"></a>
<FONT color="green">042</FONT>    }<a name="line.42"></a>




























































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