1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.taglib;
18
19 import java.util.WeakHashMap;
20
21 import javax.servlet.ServletContext;
22
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.message.MessageFactory;
25 import org.apache.logging.log4j.spi.AbstractLogger;
26 import org.apache.logging.log4j.spi.ExtendedLogger;
27 import org.apache.logging.log4j.spi.LoggerContext;
28 import org.apache.logging.log4j.spi.LoggerContextKey;
29
30
31
32
33
34
35
36 final class Log4jTaglibLoggerContext implements LoggerContext {
37
38
39 private static final WeakHashMap<ServletContext, Log4jTaglibLoggerContext> CONTEXTS =
40 new WeakHashMap<>();
41
42 private final WeakHashMap<String, Log4jTaglibLogger> loggers =
43 new WeakHashMap<>();
44
45 private final ServletContext servletContext;
46
47 private Log4jTaglibLoggerContext(final ServletContext servletContext) {
48 this.servletContext = servletContext;
49 }
50
51 @Override
52 public Object getExternalContext() {
53 return this.servletContext;
54 }
55
56 @Override
57 public Log4jTaglibLogger getLogger(final String name) {
58 return this.getLogger(name, null);
59 }
60
61 @Override
62 public Log4jTaglibLogger getLogger(final String name, final MessageFactory messageFactory) {
63
64
65 String key = LoggerContextKey.create(name, messageFactory);
66 Log4jTaglibLogger logger = this.loggers.get(key);
67 if (logger != null) {
68 AbstractLogger.checkMessageFactory(logger, messageFactory);
69 return logger;
70 }
71
72 synchronized (this.loggers) {
73 logger = this.loggers.get(key);
74 if (logger == null) {
75 final LoggerContext context = LogManager.getContext(false);
76 final ExtendedLogger original = messageFactory == null ?
77 context.getLogger(name) : context.getLogger(name, messageFactory);
78
79 logger = new Log4jTaglibLogger(original, name, original.getMessageFactory());
80 key = LoggerContextKey.create(name, original.getMessageFactory());
81 this.loggers.put(key, logger);
82 }
83 }
84
85 return logger;
86 }
87
88 @Override
89 public boolean hasLogger(final String name) {
90 return loggers.containsKey(LoggerContextKey.create(name));
91 }
92
93 @Override
94 public boolean hasLogger(String name, MessageFactory messageFactory) {
95 return loggers.containsKey(LoggerContextKey.create(name, messageFactory));
96 }
97
98 @Override
99 public boolean hasLogger(String name, Class<? extends MessageFactory> messageFactoryClass) {
100 return loggers.containsKey(LoggerContextKey.create(name, messageFactoryClass));
101 }
102
103 static synchronized Log4jTaglibLoggerContext getInstance(final ServletContext servletContext) {
104 Log4jTaglibLoggerContext loggerContext = CONTEXTS.get(servletContext);
105 if (loggerContext != null) {
106 return loggerContext;
107 }
108
109 synchronized (CONTEXTS) {
110 loggerContext = CONTEXTS.get(servletContext);
111 if (loggerContext == null) {
112 loggerContext = new Log4jTaglibLoggerContext(servletContext);
113 CONTEXTS.put(servletContext, loggerContext);
114 }
115 }
116
117 return loggerContext;
118 }
119 }