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 }