1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache license, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the license for the specific language governing permissions and 15 * limitations under the license. 16 */ 17 package org.apache.logging.log4j.spi; 18 19 import java.net.URI; 20 21 /** 22 * Implemented by factories that create {@link LoggerContext} objects. 23 */ 24 public interface LoggerContextFactory { 25 26 /** 27 * Shuts down the LoggerContext. 28 * @param fqcn The fully qualified class name of the caller. 29 * @param loader The ClassLoader to use or null. 30 * @param currentContext If true shuts down the current Context, if false shuts down the Context appropriate 31 * for the caller if a more appropriate Context can be determined. 32 * @param allContexts if true all LoggerContexts that can be located will be shutdown. 33 * @since 2.13.0 34 */ 35 default void shutdown(String fqcn, ClassLoader loader, boolean currentContext, boolean allContexts) { 36 if (hasContext(fqcn, loader, currentContext)) { 37 LoggerContext ctx = getContext(fqcn, loader, null, currentContext); 38 if (ctx instanceof Terminable) { 39 ((Terminable) ctx).terminate(); 40 } 41 } 42 } 43 44 /** 45 * Checks to see if a LoggerContext is installed. The default implementation returns false. 46 * @param fqcn The fully qualified class name of the caller. 47 * @param loader The ClassLoader to use or null. 48 * @param currentContext If true returns the current Context, if false returns the Context appropriate 49 * for the caller if a more appropriate Context can be determined. 50 * @return true if a LoggerContext has been installed, false otherwise. 51 * @since 2.13.0 52 */ 53 default boolean hasContext(String fqcn, ClassLoader loader, boolean currentContext) { 54 return false; 55 } 56 57 /** 58 * Creates a {@link LoggerContext}. 59 * 60 * @param fqcn The fully qualified class name of the caller. 61 * @param loader The ClassLoader to use or null. 62 * @param currentContext If true returns the current Context, if false returns the Context appropriate 63 * for the caller if a more appropriate Context can be determined. 64 * @param externalContext An external context (such as a ServletContext) to be associated with the LoggerContext. 65 * @return The LoggerContext. 66 */ 67 LoggerContext getContext(String fqcn, ClassLoader loader, Object externalContext, boolean currentContext); 68 69 /** 70 * Creates a {@link LoggerContext}. 71 * 72 * @param fqcn The fully qualified class name of the caller. 73 * @param loader The ClassLoader to use or null. 74 * @param currentContext If true returns the current Context, if false returns the Context appropriate 75 * for the caller if a more appropriate Context can be determined. 76 * @param configLocation The location of the configuration for the LoggerContext. 77 * @param externalContext An external context (such as a ServletContext) to be associated with the LoggerContext. 78 * @param name The name of the context or null. 79 * @return The LoggerContext. 80 */ 81 LoggerContext getContext(String fqcn, ClassLoader loader, Object externalContext, boolean currentContext, 82 URI configLocation, String name); 83 84 /** 85 * Removes knowledge of a LoggerContext. 86 * 87 * @param context The context to remove. 88 */ 89 void removeContext(LoggerContext context); 90 91 /** 92 * Determines whether or not this factory and perhaps the underlying 93 * ContextSelector behavior depend on the callers classloader. 94 * 95 * This method should be overridden by implementations, however a default method is provided which always 96 * returns {@code true} to preserve the old behavior. 97 * 98 * @since 2.15.0 99 */ 100 default boolean isClassLoaderDependent() { 101 return true; 102 } 103 }