Skip to content

Commit 6c31f1b

Browse files
committed
Remove JndiManager#getContext method
1 parent a6954de commit 6c31f1b

File tree

3 files changed

+35
-45
lines changed

3 files changed

+35
-45
lines changed

log4j-jndi-test/src/main/java/org/apache/logging/log4j/jndi/test/junit/JndiRule.java

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,13 @@
1717
package org.apache.logging.log4j.jndi.test.junit;
1818

1919
import static java.util.Objects.requireNonNull;
20-
import static org.junit.Assert.assertNotNull;
2120

2221
import java.util.Collections;
2322
import java.util.Hashtable;
2423
import java.util.Map;
25-
import java.util.Set;
26-
import java.util.Spliterators;
27-
import java.util.stream.Collectors;
28-
import java.util.stream.StreamSupport;
2924
import javax.annotation.Nullable;
3025
import javax.naming.Context;
31-
import javax.naming.NameClassPair;
26+
import javax.naming.Name;
3227
import javax.naming.NamingException;
3328
import javax.naming.spi.InitialContextFactoryBuilder;
3429
import javax.naming.spi.NamingManager;
@@ -46,9 +41,11 @@
4641
@SuppressWarnings("BanJNDI")
4742
public class JndiRule implements TestRule {
4843

44+
private static final Hashtable<String, Object> ENV = new Hashtable<>(Map.of(MemoryContext.IGNORE_CLOSE, "true"));
45+
private static final Context CONTEXT = new MemoryContext(ENV);
46+
4947
static {
50-
final InitialContextFactoryBuilder factoryBuilder =
51-
factoryBuilderEnv -> factoryEnv -> new MemoryContext(new Hashtable<>()) {};
48+
final InitialContextFactoryBuilder factoryBuilder = factoryBuilderEnv -> factoryEnv -> CONTEXT;
5249
try {
5350
NamingManager.setInitialContextFactoryBuilder(factoryBuilder);
5451
} catch (final NamingException error) {
@@ -91,38 +88,44 @@ public void evaluate() throws Throwable {
9188

9289
private void resetJndiManager() throws NamingException {
9390
if (JndiManager.isJndiEnabled()) {
94-
final Context context = getContext();
95-
clearBindings(context);
96-
addBindings(context);
91+
clearBindings();
92+
addBindings();
9793
}
9894
}
9995

100-
private Context getContext() {
101-
final JndiManager manager =
102-
managerName == null ? JndiManager.getDefaultManager() : JndiManager.getDefaultManager(managerName);
103-
@Nullable final Context context = manager.getContext();
104-
assertNotNull(context);
105-
return context;
106-
}
107-
108-
private static void clearBindings(final Context context) throws NamingException {
109-
final Set<NameClassPair> existingBindings = StreamSupport.stream(
110-
Spliterators.spliteratorUnknownSize(context.list("").asIterator(), 0), false)
111-
.collect(Collectors.toSet());
112-
existingBindings.forEach(binding -> {
96+
private static void clearBindings() throws NamingException {
97+
Collections.list(CONTEXT.list("")).forEach(binding -> {
11398
try {
114-
context.unbind(binding.getName());
99+
CONTEXT.unbind(binding.getName());
115100
} catch (NamingException error) {
116101
throw new RuntimeException(error);
117102
}
118103
});
119104
}
120105

121-
private void addBindings(final Context context) throws NamingException {
106+
private void addBindings() throws NamingException {
122107
for (final Map.Entry<String, Object> entry : bindings.entrySet()) {
123-
final String name = entry.getKey();
108+
final String key = entry.getKey();
124109
final Object object = entry.getValue();
125-
context.bind(name, object);
110+
recursiveBind(key, object);
111+
}
112+
}
113+
114+
public static void recursiveBind(final String key, final Object value) throws NamingException {
115+
final Name name = CONTEXT.getNameParser((Name) null).parse(key);
116+
Context currentContext = CONTEXT;
117+
final int lastIndex = name.size() - 1;
118+
for (int i = 0; i < lastIndex; i++) {
119+
try {
120+
currentContext = (Context) currentContext.lookup(name.get(i));
121+
} catch (NamingException ignored) {
122+
currentContext = currentContext.createSubcontext(name.get(i));
123+
}
126124
}
125+
currentContext.bind(name.get(lastIndex), value);
126+
}
127+
128+
public static void rebind(final String key, final Object value) throws NamingException {
129+
CONTEXT.rebind(key, value);
127130
}
128131
}

log4j-jndi-test/src/test/java/org/apache/logging/log4j/jndi/appender/routing/RoutingAppenderWithJndiTest.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,10 @@
2020

2121
import java.io.File;
2222
import java.util.Collections;
23-
import javax.naming.Context;
2423
import javax.naming.NamingException;
2524
import org.apache.logging.log4j.EventLogger;
2625
import org.apache.logging.log4j.core.test.appender.ListAppender;
2726
import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
28-
import org.apache.logging.log4j.jndi.JndiManager;
2927
import org.apache.logging.log4j.jndi.test.junit.JndiRule;
3028
import org.apache.logging.log4j.message.StructuredDataMessage;
3129
import org.junit.After;
@@ -77,9 +75,7 @@ public void routingTest() throws NamingException {
7775
assertTrue("The default log file was not created", defaultLogFile.exists());
7876

7977
// now set jndi resource to Application1
80-
final Context context = JndiManager.getDefaultManager().getContext();
81-
assertNotNull(context);
82-
context.bind(JNDI_CONTEXT_NAME, "Application1");
78+
JndiRule.recursiveBind(JNDI_CONTEXT_NAME, "Application1");
8379

8480
msg = new StructuredDataMessage("Test", "This is a message from Application1", "Context");
8581
EventLogger.logEvent(msg);
@@ -90,7 +86,7 @@ public void routingTest() throws NamingException {
9086
listAppender1.getEvents().size() == 1);
9187

9288
// now set jndi resource to Application2
93-
context.rebind(JNDI_CONTEXT_NAME, "Application2");
89+
JndiRule.rebind(JNDI_CONTEXT_NAME, "Application2");
9490

9591
msg = new StructuredDataMessage("Test", "This is a message from Application2", "Context");
9692
EventLogger.logEvent(msg);
@@ -118,15 +114,15 @@ public void routingTest() throws NamingException {
118114

119115
// now set jndi resource to Application3.
120116
// The context name, 'Application3', will be used as log file name by the default route.
121-
context.rebind("java:comp/env/logging/context-name", "Application3");
117+
JndiRule.rebind(JNDI_CONTEXT_NAME, "Application3");
122118
msg = new StructuredDataMessage("Test", "This is a message from Application3", "Context");
123119
EventLogger.logEvent(msg);
124120
final File application3LogFile = new File("target/routingbyjndi/routingbyjnditest-Application3.log");
125121
assertTrue("The Application3 log file was not created", application3LogFile.exists());
126122

127123
// now set jndi resource to Application4
128124
// The context name, 'Application4', will be used as log file name by the default route.
129-
context.rebind("java:comp/env/logging/context-name", "Application4");
125+
JndiRule.rebind(JNDI_CONTEXT_NAME, "Application4");
130126
msg = new StructuredDataMessage("Test", "This is a message from Application4", "Context");
131127
EventLogger.logEvent(msg);
132128
final File application4LogFile = new File("target/routingbyjndi/routingbyjnditest-Application4.log");

log4j-jndi/src/main/java/org/apache/logging/log4j/jndi/JndiManager.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import java.net.URISyntaxException;
2222
import java.util.Properties;
2323
import java.util.concurrent.TimeUnit;
24-
import javax.annotation.Nullable;
2524
import javax.naming.Context;
2625
import javax.naming.InitialContext;
2726
import javax.naming.NamingException;
@@ -195,14 +194,6 @@ protected boolean releaseSub(final long timeout, final TimeUnit timeUnit) {
195194
return JndiCloser.closeSilently(this.context);
196195
}
197196

198-
/**
199-
* @return the active context
200-
*/
201-
@Nullable
202-
public Context getContext() {
203-
return context;
204-
}
205-
206197
/**
207198
* Looks up a named object through this JNDI context.
208199
*

0 commit comments

Comments
 (0)