Skip to content

Commit a6954de

Browse files
authored
Upgrade to Spring Boot 3 (#2072)
1 parent e5e1e0c commit a6954de

File tree

14 files changed

+151
-90
lines changed

14 files changed

+151
-90
lines changed

.github/dependabot.yaml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,6 @@ updates:
115115
# EclipseLink 3.x is Jakarta EE 9
116116
- dependency-name: "org.eclipse.persistence:*"
117117
update-types: ["version-update:semver-major"]
118-
# Spring 6.x is Jakarta EE 9
119-
- dependency-name: "org.springframework:*"
120-
update-types: ["version-update:semver-major"]
121-
# Spring Boot 3.x is Jakarta EE 9
122-
- dependency-name: "org.springframework.boot:*"
123-
update-types: ["version-update:semver-major"]
124-
# Spring Cloud 2022.x is Jakarta EE 9
125-
- dependency-name: "org.springframework.cloud:*"
126-
update-types: ["version-update:semver-major"]
127118
# Keep Logback version 1.2.x
128119
- dependency-name: "ch.qos.logback:*"
129120
update-types: ["version-update:semver-major", "version-update:semver-minor"]

log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ protected boolean isActive() {
121121
return true;
122122
}
123123

124+
@Deprecated(since = "3.0.0", forRemoval = true)
125+
public static ConfigurationFactory getInstance() {
126+
return LoggerContext.getContext(false).getInstanceFactory().getInstance(KEY);
127+
}
128+
124129
/**
125130
* Required for Spring Boot.
126131
* @param props PropertiesUtil.

log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,17 @@ public class UrlConnectionFactory {
5656
private static final String NO_PROTOCOLS = "_none";
5757
public static final String ALLOWED_PROTOCOLS = "log4j2.Configuration.allowedProtocols";
5858

59+
@Deprecated(since = "3.0.0", forRemoval = true)
60+
public static <T extends URLConnection> T createConnection(
61+
final URL url,
62+
final long lastModifiedMillis,
63+
final SslConfiguration sslConfiguration,
64+
final AuthorizationProvider authorizationProvider)
65+
throws IOException {
66+
return createConnection(
67+
url, lastModifiedMillis, sslConfiguration, authorizationProvider, PropertiesUtil.getProperties());
68+
}
69+
5970
@SuppressFBWarnings(
6071
value = "URLCONNECTION_SSRF_FD",
6172
justification = "The URL parameter originates only from secure sources.")

log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/internal/JndiUtil.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,17 @@
2929
public final class JndiUtil {
3030
private static final Logger LOGGER = StatusLogger.getLogger();
3131

32+
/**
33+
* Manager name used for accessing the {@link JndiManager} instance.
34+
*/
35+
public static final String JNDI_MANAGER_NAME = DataSourceConnectionSource.class.getCanonicalName();
36+
3237
private JndiUtil() {}
3338

3439
public static DataSource getDataSource(final String jndiName) {
3540
try {
36-
final DataSource dataSource = JndiManager.getDefaultManager(
37-
DataSourceConnectionSource.class.getCanonicalName())
38-
.lookup(jndiName);
41+
final DataSource dataSource =
42+
JndiManager.getDefaultManager(JNDI_MANAGER_NAME).lookup(jndiName);
3943
if (dataSource == null) {
4044
LOGGER.error("No data source found with JNDI name [" + jndiName + "].");
4145
return null;

log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderDataSourceTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.logging.log4j.Logger;
3232
import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
3333
import org.apache.logging.log4j.core.util.Throwables;
34+
import org.apache.logging.log4j.jdbc.appender.internal.JndiUtil;
3435
import org.apache.logging.log4j.jndi.test.junit.JndiRule;
3536
import org.h2.util.IOUtils;
3637
import org.junit.BeforeClass;
@@ -57,7 +58,10 @@ public static void beforeClass() {
5758

5859
protected AbstractJdbcAppenderDataSourceTest(final JdbcRule jdbcRule) {
5960
this.rules = RuleChain.emptyRuleChain()
60-
.around(new JndiRule("java:/comp/env/jdbc/TestDataSourceAppender", createMockDataSource()))
61+
.around(new JndiRule(
62+
JndiUtil.JNDI_MANAGER_NAME,
63+
"java:/comp/env/jdbc/TestDataSourceAppender",
64+
createMockDataSource()))
6165
.around(jdbcRule)
6266
.around(new LoggerContextRule("org/apache/logging/log4j/jdbc/appender/log4j2-data-source.xml"));
6367
this.jdbcRule = jdbcRule;

log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSourceTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.sql.SQLException;
2828
import javax.sql.DataSource;
2929
import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
30+
import org.apache.logging.log4j.jdbc.appender.internal.JndiUtil;
3031
import org.apache.logging.log4j.jndi.test.junit.JndiRule;
3132
import org.junit.Rule;
3233
import org.junit.Test;
@@ -52,7 +53,8 @@ public static Object[][] data() {
5253
private final String jndiURL;
5354

5455
public DataSourceConnectionSourceTest(final String jndiURL) {
55-
this.rules = RuleChain.outerRule(new JndiRule(jndiURL, dataSource)).around(new LoggerContextRule(CONFIG));
56+
this.rules = RuleChain.outerRule(new JndiRule(JndiUtil.JNDI_MANAGER_NAME, jndiURL, dataSource))
57+
.around(new LoggerContextRule(CONFIG));
5658
this.jndiURL = jndiURL;
5759
}
5860

log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderMapMessageDataSourceTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.logging.log4j.Logger;
3434
import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
3535
import org.apache.logging.log4j.core.util.Throwables;
36+
import org.apache.logging.log4j.jdbc.appender.internal.JndiUtil;
3637
import org.apache.logging.log4j.jndi.test.junit.JndiRule;
3738
import org.apache.logging.log4j.message.MapMessage;
3839
import org.junit.Assert;
@@ -70,7 +71,10 @@ public JdbcAppenderMapMessageDataSourceTest() {
7071
protected JdbcAppenderMapMessageDataSourceTest(final JdbcRule jdbcRule) {
7172
// @formatter:off
7273
this.rules = RuleChain.emptyRuleChain()
73-
.around(new JndiRule("java:/comp/env/jdbc/TestDataSourceAppender", createMockDataSource()))
74+
.around(new JndiRule(
75+
JndiUtil.JNDI_MANAGER_NAME,
76+
"java:/comp/env/jdbc/TestDataSourceAppender",
77+
createMockDataSource()))
7478
.around(jdbcRule)
7579
.around(new LoggerContextRule(
7680
"org/apache/logging/log4j/jdbc/appender/log4j2-data-source-map-message.xml"));

log4j-jndi-test/pom.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
<properties>
3232
<log4jParentDir>${basedir}/..</log4jParentDir>
3333
<module.name>org.apache.logging.log4j.jndi.test</module.name>
34+
<simple-jndi.version>0.23.0</simple-jndi.version>
3435
</properties>
3536
<dependencies>
3637
<dependency>
@@ -53,10 +54,10 @@
5354
<groupId>junit</groupId>
5455
<artifactId>junit</artifactId>
5556
</dependency>
56-
<!-- `org.springframework:spring-test` is required for `org.springframework.mock.jndi.SimpleNamingContextBuilder`: -->
5757
<dependency>
58-
<groupId>org.springframework</groupId>
59-
<artifactId>spring-test</artifactId>
58+
<groupId>com.github.h-thurow</groupId>
59+
<artifactId>simple-jndi</artifactId>
60+
<version>${simple-jndi.version}</version>
6061
</dependency>
6162
<dependency>
6263
<groupId>org.apache.logging.log4j</groupId>

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

Lines changed: 80 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,42 +16,113 @@
1616
*/
1717
package org.apache.logging.log4j.jndi.test.junit;
1818

19+
import static java.util.Objects.requireNonNull;
20+
import static org.junit.Assert.assertNotNull;
21+
1922
import java.util.Collections;
23+
import java.util.Hashtable;
2024
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;
29+
import javax.annotation.Nullable;
2130
import javax.naming.Context;
31+
import javax.naming.NameClassPair;
32+
import javax.naming.NamingException;
33+
import javax.naming.spi.InitialContextFactoryBuilder;
34+
import javax.naming.spi.NamingManager;
35+
import org.apache.logging.log4j.jndi.JndiManager;
2236
import org.junit.rules.TestRule;
2337
import org.junit.runner.Description;
2438
import org.junit.runners.model.Statement;
25-
import org.springframework.mock.jndi.SimpleNamingContextBuilder;
39+
import org.osjava.sj.jndi.MemoryContext;
2640

2741
/**
2842
* JUnit rule to create a mock {@link Context} and bind an object to a name.
2943
*
3044
* @since 2.8
3145
*/
46+
@SuppressWarnings("BanJNDI")
3247
public class JndiRule implements TestRule {
3348

34-
private final Map<String, Object> initialBindings;
49+
static {
50+
final InitialContextFactoryBuilder factoryBuilder =
51+
factoryBuilderEnv -> factoryEnv -> new MemoryContext(new Hashtable<>()) {};
52+
try {
53+
NamingManager.setInitialContextFactoryBuilder(factoryBuilder);
54+
} catch (final NamingException error) {
55+
throw new RuntimeException(error);
56+
}
57+
}
58+
59+
@Nullable
60+
private final String managerName;
61+
62+
private final Map<String, Object> bindings;
3563

3664
public JndiRule(final String name, final Object value) {
37-
this.initialBindings = Collections.singletonMap(name, value);
65+
this(null, Collections.singletonMap(name, value));
3866
}
3967

40-
public JndiRule(final Map<String, Object> initialBindings) {
41-
this.initialBindings = initialBindings;
68+
public JndiRule(@Nullable final String managerName, final String name, final Object value) {
69+
this(managerName, Collections.singletonMap(name, value));
70+
}
71+
72+
public JndiRule(final Map<String, Object> bindings) {
73+
this(null, bindings);
74+
}
75+
76+
public JndiRule(@Nullable final String managerName, final Map<String, Object> bindings) {
77+
this.managerName = managerName;
78+
this.bindings = requireNonNull(bindings, "bindings");
4279
}
4380

4481
@Override
4582
public Statement apply(final Statement base, final Description description) {
4683
return new Statement() {
4784
@Override
4885
public void evaluate() throws Throwable {
49-
final SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
50-
for (final Map.Entry<String, Object> entry : initialBindings.entrySet()) {
51-
builder.bind(entry.getKey(), entry.getValue());
52-
}
86+
resetJndiManager();
5387
base.evaluate();
5488
}
5589
};
5690
}
91+
92+
private void resetJndiManager() throws NamingException {
93+
if (JndiManager.isJndiEnabled()) {
94+
final Context context = getContext();
95+
clearBindings(context);
96+
addBindings(context);
97+
}
98+
}
99+
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 -> {
113+
try {
114+
context.unbind(binding.getName());
115+
} catch (NamingException error) {
116+
throw new RuntimeException(error);
117+
}
118+
});
119+
}
120+
121+
private void addBindings(final Context context) throws NamingException {
122+
for (final Map.Entry<String, Object> entry : bindings.entrySet()) {
123+
final String name = entry.getKey();
124+
final Object object = entry.getValue();
125+
context.bind(name, object);
126+
}
127+
}
57128
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
import java.io.File;
2222
import java.util.Collections;
2323
import javax.naming.Context;
24-
import javax.naming.InitialContext;
2524
import javax.naming.NamingException;
2625
import org.apache.logging.log4j.EventLogger;
2726
import org.apache.logging.log4j.core.test.appender.ListAppender;
2827
import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
28+
import org.apache.logging.log4j.jndi.JndiManager;
2929
import org.apache.logging.log4j.jndi.test.junit.JndiRule;
3030
import org.apache.logging.log4j.message.StructuredDataMessage;
3131
import org.junit.After;
@@ -77,7 +77,8 @@ public void routingTest() throws NamingException {
7777
assertTrue("The default log file was not created", defaultLogFile.exists());
7878

7979
// now set jndi resource to Application1
80-
final Context context = new InitialContext();
80+
final Context context = JndiManager.getDefaultManager().getContext();
81+
assertNotNull(context);
8182
context.bind(JNDI_CONTEXT_NAME, "Application1");
8283

8384
msg = new StructuredDataMessage("Test", "This is a message from Application1", "Context");

0 commit comments

Comments
 (0)