1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.logging.log4j.core.net;
19
20 import java.util.Properties;
21 import java.util.concurrent.TimeUnit;
22
23 import javax.naming.Context;
24 import javax.naming.InitialContext;
25 import javax.naming.NamingException;
26
27 import org.apache.logging.log4j.core.appender.AbstractManager;
28 import org.apache.logging.log4j.core.appender.ManagerFactory;
29 import org.apache.logging.log4j.core.util.JndiCloser;
30
31
32
33
34
35
36 public class JndiManager extends AbstractManager {
37
38 private static final JndiManagerFactory FACTORY = new JndiManagerFactory();
39
40 private final Context context;
41
42 private JndiManager(final String name, final Context context) {
43 super(null, name);
44 this.context = context;
45 }
46
47
48
49
50
51
52 public static JndiManager getDefaultManager() {
53 return getManager(JndiManager.class.getName(), FACTORY, null);
54 }
55
56
57
58
59
60
61
62 public static JndiManager getDefaultManager(final String name) {
63 return getManager(name, FACTORY, null);
64 }
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 public static JndiManager getJndiManager(final String initialContextFactoryName,
80 final String providerURL,
81 final String urlPkgPrefixes,
82 final String securityPrincipal,
83 final String securityCredentials,
84 final Properties additionalProperties) {
85 final Properties properties = createProperties(initialContextFactoryName, providerURL, urlPkgPrefixes,
86 securityPrincipal, securityCredentials, additionalProperties);
87 return getManager(createManagerName(), FACTORY, properties);
88 }
89
90
91
92
93
94
95
96
97
98 public static JndiManager getJndiManager(final Properties properties) {
99 return getManager(createManagerName(), FACTORY, properties);
100 }
101
102 private static String createManagerName() {
103 return JndiManager.class.getName() + '@' + JndiManager.class.hashCode();
104 }
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 public static Properties createProperties(final String initialContextFactoryName, final String providerURL,
126 final String urlPkgPrefixes, final String securityPrincipal, final String securityCredentials,
127 final Properties additionalProperties) {
128 if (initialContextFactoryName == null) {
129 return null;
130 }
131 final Properties properties = new Properties();
132 properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, initialContextFactoryName);
133 if (providerURL != null) {
134 properties.setProperty(Context.PROVIDER_URL, providerURL);
135 } else {
136 LOGGER.warn("The JNDI InitialContextFactory class name [{}] was provided, but there was no associated "
137 + "provider URL. This is likely to cause problems.", initialContextFactoryName);
138 }
139 if (urlPkgPrefixes != null) {
140 properties.setProperty(Context.URL_PKG_PREFIXES, urlPkgPrefixes);
141 }
142 if (securityPrincipal != null) {
143 properties.setProperty(Context.SECURITY_PRINCIPAL, securityPrincipal);
144 if (securityCredentials != null) {
145 properties.setProperty(Context.SECURITY_CREDENTIALS, securityCredentials);
146 } else {
147 LOGGER.warn("A security principal [{}] was provided, but with no corresponding security credentials.",
148 securityPrincipal);
149 }
150 }
151 if (additionalProperties != null) {
152 properties.putAll(additionalProperties);
153 }
154 return properties;
155 }
156
157 @Override
158 protected boolean releaseSub(final long timeout, final TimeUnit timeUnit) {
159 return JndiCloser.closeSilently(this.context);
160 }
161
162
163
164
165
166
167
168
169
170 @SuppressWarnings("unchecked")
171 public <T> T lookup(final String name) throws NamingException {
172 return (T) this.context.lookup(name);
173 }
174
175 private static class JndiManagerFactory implements ManagerFactory<JndiManager, Properties> {
176
177 @Override
178 public JndiManager createManager(final String name, final Properties data) {
179 try {
180 return new JndiManager(name, new InitialContext(data));
181 } catch (final NamingException e) {
182 LOGGER.error("Error creating JNDI InitialContext.", e);
183 return null;
184 }
185 }
186 }
187
188 @Override
189 public String toString() {
190 return "JndiManager [context=" + context + ", count=" + count + "]";
191 }
192
193 }