1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.selector;
18
19 import java.net.URI;
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.concurrent.ConcurrentHashMap;
25 import java.util.concurrent.ConcurrentMap;
26
27 import javax.naming.Context;
28 import javax.naming.InitialContext;
29 import javax.naming.NameNotFoundException;
30 import javax.naming.NamingException;
31
32 import org.apache.logging.log4j.core.LoggerContext;
33 import org.apache.logging.log4j.core.impl.ContextAnchor;
34 import org.apache.logging.log4j.core.util.Constants;
35 import org.apache.logging.log4j.core.util.JndiCloser;
36 import org.apache.logging.log4j.status.StatusLogger;
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 public class JndiContextSelector implements NamedContextSelector {
91
92 private static final LoggerContext CONTEXT = new LoggerContext("Default");
93
94 private static final ConcurrentMap<String, LoggerContext> CONTEXT_MAP =
95 new ConcurrentHashMap<String, LoggerContext>();
96
97 private static final StatusLogger LOGGER = StatusLogger.getLogger();
98
99 @Override
100 public LoggerContext getContext(final String fqcn, final ClassLoader loader, final boolean currentContext) {
101 return getContext(fqcn, loader, currentContext, null);
102 }
103
104 @Override
105 public LoggerContext getContext(final String fqcn, final ClassLoader loader, final boolean currentContext,
106 final URI configLocation) {
107
108 final LoggerContext lc = ContextAnchor.THREAD_CONTEXT.get();
109 if (lc != null) {
110 return lc;
111 }
112
113 String loggingContextName = null;
114
115 Context ctx = null;
116 try {
117 ctx = new InitialContext();
118 loggingContextName = (String) lookup(ctx, Constants.JNDI_CONTEXT_NAME);
119 } catch (final NamingException ne) {
120 LOGGER.error("Unable to lookup " + Constants.JNDI_CONTEXT_NAME, ne);
121 } finally {
122 JndiCloser.closeSilently(ctx);
123 }
124
125 return loggingContextName == null ? CONTEXT : locateContext(loggingContextName, null, configLocation);
126 }
127
128 @Override
129 public LoggerContext locateContext(final String name, final Object externalContext, final URI configLocation) {
130 if (name == null) {
131 LOGGER.error("A context name is required to locate a LoggerContext");
132 return null;
133 }
134 if (!CONTEXT_MAP.containsKey(name)) {
135 final LoggerContext ctx = new LoggerContext(name, externalContext, configLocation);
136 CONTEXT_MAP.putIfAbsent(name, ctx);
137 }
138 return CONTEXT_MAP.get(name);
139 }
140
141 @Override
142 public void removeContext(final LoggerContext context) {
143
144 for (final Map.Entry<String, LoggerContext> entry : CONTEXT_MAP.entrySet()) {
145 if (entry.getValue().equals(context)) {
146 CONTEXT_MAP.remove(entry.getKey());
147 }
148 }
149 }
150
151 @Override
152 public LoggerContext removeContext(final String name) {
153 return CONTEXT_MAP.remove(name);
154 }
155
156 @Override
157 public List<LoggerContext> getLoggerContexts() {
158 final List<LoggerContext> list = new ArrayList<LoggerContext>(CONTEXT_MAP.values());
159 return Collections.unmodifiableList(list);
160 }
161
162
163 protected static Object lookup(final Context ctx, final String name) throws NamingException {
164 if (ctx == null) {
165 return null;
166 }
167 try {
168 return ctx.lookup(name);
169 } catch (final NameNotFoundException e) {
170 LOGGER.error("Could not find name [" + name + "].");
171 throw e;
172 }
173 }
174 }