You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by vy...@apache.org on 2023/12/06 13:51:29 UTC

(logging-log4j2) 01/03: Upgrade to Spring Boot 3

This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch main-spring-cloud-revamp
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 43703e482d204c0a347efc522d5c1090fba9c58c
Author: Volkan Yazıcı <vo...@yazi.ci>
AuthorDate: Wed Dec 6 11:28:24 2023 +0100

    Upgrade to Spring Boot 3
---
 .github/dependabot.yaml                            |  9 ---
 .../log4j/jdbc/appender/internal/JndiUtil.java     | 10 ++-
 .../AbstractJdbcAppenderDataSourceTest.java        |  6 +-
 .../appender/DataSourceConnectionSourceTest.java   |  4 +-
 .../JdbcAppenderMapMessageDataSourceTest.java      |  6 +-
 log4j-jndi-test/pom.xml                            |  7 +-
 .../logging/log4j/jndi/test/junit/JndiRule.java    | 89 +++++++++++++++++++---
 .../routing/RoutingAppenderWithJndiTest.java       |  5 +-
 .../org/apache/logging/log4j/jndi/JndiManager.java |  9 +++
 log4j-parent/pom.xml                               | 26 -------
 log4j-spring-cloud-config-client/pom.xml           | 13 ++++
 11 files changed, 129 insertions(+), 55 deletions(-)

diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml
index fb02e7e425..0f80d895ea 100644
--- a/.github/dependabot.yaml
+++ b/.github/dependabot.yaml
@@ -115,15 +115,6 @@ updates:
     # EclipseLink 3.x is Jakarta EE 9
     - dependency-name: "org.eclipse.persistence:*"
       update-types: ["version-update:semver-major"]
-    # Spring 6.x is Jakarta EE 9
-    - dependency-name: "org.springframework:*"
-      update-types: ["version-update:semver-major"]
-    # Spring Boot 3.x is Jakarta EE 9
-    - dependency-name: "org.springframework.boot:*"
-      update-types: ["version-update:semver-major"]
-    # Spring Cloud 2022.x is Jakarta EE 9
-    - dependency-name: "org.springframework.cloud:*"
-      update-types: ["version-update:semver-major"]
     # Keep Logback version 1.2.x
     - dependency-name: "ch.qos.logback:*"
       update-types: ["version-update:semver-major", "version-update:semver-minor"]
diff --git a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/internal/JndiUtil.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/internal/JndiUtil.java
index ebfaa4693b..97213bc45e 100644
--- a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/internal/JndiUtil.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/internal/JndiUtil.java
@@ -29,13 +29,17 @@ import org.apache.logging.log4j.status.StatusLogger;
 public final class JndiUtil {
     private static final Logger LOGGER = StatusLogger.getLogger();
 
+    /**
+     * Manager name used for accessing the {@link JndiManager} instance.
+     */
+    public static final String JNDI_MANAGER_NAME = DataSourceConnectionSource.class.getCanonicalName();
+
     private JndiUtil() {}
 
     public static DataSource getDataSource(final String jndiName) {
         try {
-            final DataSource dataSource = JndiManager.getDefaultManager(
-                            DataSourceConnectionSource.class.getCanonicalName())
-                    .lookup(jndiName);
+            final DataSource dataSource =
+                    JndiManager.getDefaultManager(JNDI_MANAGER_NAME).lookup(jndiName);
             if (dataSource == null) {
                 LOGGER.error("No data source found with JNDI name [" + jndiName + "].");
                 return null;
diff --git a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderDataSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderDataSourceTest.java
index 8b404fa453..e3709bd68f 100644
--- a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderDataSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderDataSourceTest.java
@@ -31,6 +31,7 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
 import org.apache.logging.log4j.core.util.Throwables;
+import org.apache.logging.log4j.jdbc.appender.internal.JndiUtil;
 import org.apache.logging.log4j.jndi.test.junit.JndiRule;
 import org.h2.util.IOUtils;
 import org.junit.BeforeClass;
@@ -57,7 +58,10 @@ public abstract class AbstractJdbcAppenderDataSourceTest {
 
     protected AbstractJdbcAppenderDataSourceTest(final JdbcRule jdbcRule) {
         this.rules = RuleChain.emptyRuleChain()
-                .around(new JndiRule("java:/comp/env/jdbc/TestDataSourceAppender", createMockDataSource()))
+                .around(new JndiRule(
+                        JndiUtil.JNDI_MANAGER_NAME,
+                        "java:/comp/env/jdbc/TestDataSourceAppender",
+                        createMockDataSource()))
                 .around(jdbcRule)
                 .around(new LoggerContextRule("org/apache/logging/log4j/jdbc/appender/log4j2-data-source.xml"));
         this.jdbcRule = jdbcRule;
diff --git a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSourceTest.java
index 8868984b0a..25dc8a603c 100644
--- a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSourceTest.java
@@ -27,6 +27,7 @@ import java.sql.Connection;
 import java.sql.SQLException;
 import javax.sql.DataSource;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
+import org.apache.logging.log4j.jdbc.appender.internal.JndiUtil;
 import org.apache.logging.log4j.jndi.test.junit.JndiRule;
 import org.junit.Rule;
 import org.junit.Test;
@@ -52,7 +53,8 @@ public class DataSourceConnectionSourceTest {
     private final String jndiURL;
 
     public DataSourceConnectionSourceTest(final String jndiURL) {
-        this.rules = RuleChain.outerRule(new JndiRule(jndiURL, dataSource)).around(new LoggerContextRule(CONFIG));
+        this.rules = RuleChain.outerRule(new JndiRule(JndiUtil.JNDI_MANAGER_NAME, jndiURL, dataSource))
+                .around(new LoggerContextRule(CONFIG));
         this.jndiURL = jndiURL;
     }
 
diff --git a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderMapMessageDataSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderMapMessageDataSourceTest.java
index 46224ba2b3..45c9a201db 100644
--- a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderMapMessageDataSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderMapMessageDataSourceTest.java
@@ -33,6 +33,7 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
 import org.apache.logging.log4j.core.util.Throwables;
+import org.apache.logging.log4j.jdbc.appender.internal.JndiUtil;
 import org.apache.logging.log4j.jndi.test.junit.JndiRule;
 import org.apache.logging.log4j.message.MapMessage;
 import org.junit.Assert;
@@ -70,7 +71,10 @@ public class JdbcAppenderMapMessageDataSourceTest {
     protected JdbcAppenderMapMessageDataSourceTest(final JdbcRule jdbcRule) {
         // @formatter:off
         this.rules = RuleChain.emptyRuleChain()
-                .around(new JndiRule("java:/comp/env/jdbc/TestDataSourceAppender", createMockDataSource()))
+                .around(new JndiRule(
+                        JndiUtil.JNDI_MANAGER_NAME,
+                        "java:/comp/env/jdbc/TestDataSourceAppender",
+                        createMockDataSource()))
                 .around(jdbcRule)
                 .around(new LoggerContextRule(
                         "org/apache/logging/log4j/jdbc/appender/log4j2-data-source-map-message.xml"));
diff --git a/log4j-jndi-test/pom.xml b/log4j-jndi-test/pom.xml
index a8a610db70..e5cd9cef2b 100644
--- a/log4j-jndi-test/pom.xml
+++ b/log4j-jndi-test/pom.xml
@@ -31,6 +31,7 @@
   <properties>
     <log4jParentDir>${basedir}/..</log4jParentDir>
     <module.name>org.apache.logging.log4j.jndi.test</module.name>
+    <simple-jndi.version>0.23.0</simple-jndi.version>
   </properties>
   <dependencies>
     <dependency>
@@ -53,10 +54,10 @@
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
     </dependency>
-    <!-- `org.springframework:spring-test` is required for `org.springframework.mock.jndi.SimpleNamingContextBuilder`: -->
     <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-test</artifactId>
+      <groupId>com.github.h-thurow</groupId>
+      <artifactId>simple-jndi</artifactId>
+      <version>${simple-jndi.version}</version>
     </dependency>
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
diff --git a/log4j-jndi-test/src/main/java/org/apache/logging/log4j/jndi/test/junit/JndiRule.java b/log4j-jndi-test/src/main/java/org/apache/logging/log4j/jndi/test/junit/JndiRule.java
index 04a8b5c71e..2918914475 100644
--- a/log4j-jndi-test/src/main/java/org/apache/logging/log4j/jndi/test/junit/JndiRule.java
+++ b/log4j-jndi-test/src/main/java/org/apache/logging/log4j/jndi/test/junit/JndiRule.java
@@ -16,29 +16,66 @@
  */
 package org.apache.logging.log4j.jndi.test.junit;
 
+import static java.util.Objects.requireNonNull;
+import static org.junit.Assert.assertNotNull;
+
 import java.util.Collections;
+import java.util.Hashtable;
 import java.util.Map;
+import java.util.Set;
+import java.util.Spliterators;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+import javax.annotation.Nullable;
 import javax.naming.Context;
+import javax.naming.NameClassPair;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactoryBuilder;
+import javax.naming.spi.NamingManager;
+import org.apache.logging.log4j.jndi.JndiManager;
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
-import org.springframework.mock.jndi.SimpleNamingContextBuilder;
+import org.osjava.sj.jndi.MemoryContext;
 
 /**
  * JUnit rule to create a mock {@link Context} and bind an object to a name.
  *
  * @since 2.8
  */
+@SuppressWarnings("BanJNDI")
 public class JndiRule implements TestRule {
 
-    private final Map<String, Object> initialBindings;
+    static {
+        final InitialContextFactoryBuilder factoryBuilder =
+                factoryBuilderEnv -> factoryEnv -> new MemoryContext(new Hashtable<>()) {};
+        try {
+            NamingManager.setInitialContextFactoryBuilder(factoryBuilder);
+        } catch (final NamingException error) {
+            throw new RuntimeException(error);
+        }
+    }
+
+    @Nullable
+    private final String managerName;
+
+    private final Map<String, Object> bindings;
 
     public JndiRule(final String name, final Object value) {
-        this.initialBindings = Collections.singletonMap(name, value);
+        this(null, Collections.singletonMap(name, value));
     }
 
-    public JndiRule(final Map<String, Object> initialBindings) {
-        this.initialBindings = initialBindings;
+    public JndiRule(@Nullable final String managerName, final String name, final Object value) {
+        this(managerName, Collections.singletonMap(name, value));
+    }
+
+    public JndiRule(final Map<String, Object> bindings) {
+        this(null, bindings);
+    }
+
+    public JndiRule(@Nullable final String managerName, final Map<String, Object> bindings) {
+        this.managerName = managerName;
+        this.bindings = requireNonNull(bindings, "bindings");
     }
 
     @Override
@@ -46,12 +83,46 @@ public class JndiRule implements TestRule {
         return new Statement() {
             @Override
             public void evaluate() throws Throwable {
-                final SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
-                for (final Map.Entry<String, Object> entry : initialBindings.entrySet()) {
-                    builder.bind(entry.getKey(), entry.getValue());
-                }
+                resetJndiManager();
                 base.evaluate();
             }
         };
     }
+
+    private void resetJndiManager() throws NamingException {
+        if (JndiManager.isJndiEnabled()) {
+            final Context context = getContext();
+            clearBindings(context);
+            addBindings(context);
+        }
+    }
+
+    private Context getContext() {
+        final JndiManager manager =
+                managerName == null ? JndiManager.getDefaultManager() : JndiManager.getDefaultManager(managerName);
+        @Nullable final Context context = manager.getContext();
+        assertNotNull(context);
+        return context;
+    }
+
+    private static void clearBindings(final Context context) throws NamingException {
+        final Set<NameClassPair> existingBindings = StreamSupport.stream(
+                        Spliterators.spliteratorUnknownSize(context.list("").asIterator(), 0), false)
+                .collect(Collectors.toSet());
+        existingBindings.forEach(binding -> {
+            try {
+                context.unbind(binding.getName());
+            } catch (NamingException error) {
+                throw new RuntimeException(error);
+            }
+        });
+    }
+
+    private void addBindings(Context context) throws NamingException {
+        for (final Map.Entry<String, Object> entry : bindings.entrySet()) {
+            final String name = entry.getKey();
+            final Object object = entry.getValue();
+            context.bind(name, object);
+        }
+    }
 }
diff --git a/log4j-jndi-test/src/test/java/org/apache/logging/log4j/jndi/appender/routing/RoutingAppenderWithJndiTest.java b/log4j-jndi-test/src/test/java/org/apache/logging/log4j/jndi/appender/routing/RoutingAppenderWithJndiTest.java
index 1b426904e1..09dc7cff11 100644
--- a/log4j-jndi-test/src/test/java/org/apache/logging/log4j/jndi/appender/routing/RoutingAppenderWithJndiTest.java
+++ b/log4j-jndi-test/src/test/java/org/apache/logging/log4j/jndi/appender/routing/RoutingAppenderWithJndiTest.java
@@ -21,11 +21,11 @@ import static org.junit.Assert.*;
 import java.io.File;
 import java.util.Collections;
 import javax.naming.Context;
-import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import org.apache.logging.log4j.EventLogger;
 import org.apache.logging.log4j.core.test.appender.ListAppender;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
+import org.apache.logging.log4j.jndi.JndiManager;
 import org.apache.logging.log4j.jndi.test.junit.JndiRule;
 import org.apache.logging.log4j.message.StructuredDataMessage;
 import org.junit.After;
@@ -77,7 +77,8 @@ public class RoutingAppenderWithJndiTest {
         assertTrue("The default log file was not created", defaultLogFile.exists());
 
         // now set jndi resource to Application1
-        final Context context = new InitialContext();
+        final Context context = JndiManager.getDefaultManager().getContext();
+        assertNotNull(context);
         context.bind(JNDI_CONTEXT_NAME, "Application1");
 
         msg = new StructuredDataMessage("Test", "This is a message from Application1", "Context");
diff --git a/log4j-jndi/src/main/java/org/apache/logging/log4j/jndi/JndiManager.java b/log4j-jndi/src/main/java/org/apache/logging/log4j/jndi/JndiManager.java
index 83248679f9..81e5d3feb6 100644
--- a/log4j-jndi/src/main/java/org/apache/logging/log4j/jndi/JndiManager.java
+++ b/log4j-jndi/src/main/java/org/apache/logging/log4j/jndi/JndiManager.java
@@ -21,6 +21,7 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.Nullable;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
@@ -194,6 +195,14 @@ public class JndiManager extends AbstractManager {
         return JndiCloser.closeSilently(this.context);
     }
 
+    /**
+     * @return the active context
+     */
+    @Nullable
+    public Context getContext() {
+        return context;
+    }
+
     /**
      * Looks up a named object through this JNDI context.
      *
diff --git a/log4j-parent/pom.xml b/log4j-parent/pom.xml
index fc4130524d..1656cde8f0 100644
--- a/log4j-parent/pom.xml
+++ b/log4j-parent/pom.xml
@@ -152,8 +152,6 @@
     <slf4j.version>2.0.9</slf4j.version>
     <!-- Last version before a breaking change -->
     <slf4j-ext.version>1.7.25</slf4j-ext.version>
-    <spring-boot.version>2.7.18</spring-boot.version>
-    <spring-framework.version>5.3.31</spring-framework.version>
     <system-stubs.version>2.1.5</system-stubs.version>
     <tomcat-juli.version>10.1.16</tomcat-juli.version>
     <velocity.version>1.7</velocity.version>
@@ -820,30 +818,6 @@
         <version>${slf4j-ext.version}</version>
       </dependency>
 
-      <dependency>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot</artifactId>
-        <version>${spring-boot.version}</version>
-      </dependency>
-
-      <dependency>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-starter-test</artifactId>
-        <version>${spring-boot.version}</version>
-        <exclusions>
-          <exclusion>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-logging</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-
-      <dependency>
-        <groupId>org.springframework</groupId>
-        <artifactId>spring-test</artifactId>
-        <version>${spring-framework.version}</version>
-      </dependency>
-
       <dependency>
         <groupId>uk.org.webcompere</groupId>
         <artifactId>system-stubs-core</artifactId>
diff --git a/log4j-spring-cloud-config-client/pom.xml b/log4j-spring-cloud-config-client/pom.xml
index 12c74caca6..bfdcca6b32 100644
--- a/log4j-spring-cloud-config-client/pom.xml
+++ b/log4j-spring-cloud-config-client/pom.xml
@@ -45,6 +45,7 @@
     <Fragment-Host>org.apache.logging.log4j.core</Fragment-Host>
 
     <!-- dependency versions -->
+    <spring-boot.version>3.2.0</spring-boot.version>
     <spring-cloud.version>2021.0.8</spring-cloud.version>
 
   </properties>
@@ -68,6 +69,18 @@
         <scope>import</scope>
       </dependency>
 
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-test</artifactId>
+        <version>${spring-boot.version}</version>
+        <exclusions>
+          <exclusion>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-logging</artifactId>
+          </exclusion>
+        </exclusions>
+      </dependency>
+
     </dependencies>
   </dependencyManagement>