You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2022/03/30 05:16:55 UTC

[logging-log4j2] 02/03: Make Log4j Builder plugins injectable

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

mattsicker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 74922b37772e6e5f0228517ecdbb944debf2ffea
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Wed Mar 30 00:15:18 2022 -0500

    Make Log4j Builder plugins injectable
    
    This updates Log4j1 builder plugins to use DI.
    
    Signed-off-by: Matt Sicker <ma...@apache.org>
---
 .../org/apache/log4j/builders/BuilderManager.java  | 64 ++++++++++------------
 .../apache/log4j/config/Log4j1Configuration.java   |  3 +-
 2 files changed, 30 insertions(+), 37 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
index c331c46..6672c8e 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
@@ -16,11 +16,6 @@
  */
 package org.apache.log4j.builders;
 
-import java.lang.reflect.Constructor;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Properties;
-
 import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.builders.appender.AppenderBuilder;
@@ -32,36 +27,43 @@ import org.apache.log4j.rewrite.RewritePolicy;
 import org.apache.log4j.spi.Filter;
 import org.apache.log4j.xml.XmlConfiguration;
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.plugins.Named;
+import org.apache.logging.log4j.plugins.di.Injector;
+import org.apache.logging.log4j.plugins.di.Key;
+import org.apache.logging.log4j.plugins.util.PluginManager;
 import org.apache.logging.log4j.plugins.util.PluginType;
-import org.apache.logging.log4j.plugins.util.PluginUtil;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.LoaderUtil;
 import org.w3c.dom.Element;
 
+import java.lang.reflect.Constructor;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+
 /**
  *
  */
 public class BuilderManager {
 
     public static final String CATEGORY = "Log4j Builder";
+    public static final Key<PluginManager> PLUGIN_MANAGER_KEY = new @Named(CATEGORY) Key<>() {};
     private static final Logger LOGGER = StatusLogger.getLogger();
     private static final Class<?>[] CONSTRUCTOR_PARAMS = new Class[] { String.class, Properties.class };
+    private final Injector injector;
     private final Map<String, PluginType<?>> plugins;
 
-    public BuilderManager() {
-        plugins = PluginUtil.collectPluginsByCategory(CATEGORY);
+    public BuilderManager(final Injector injector) {
+        this.injector = injector;
+        plugins = injector.getInstance(PLUGIN_MANAGER_KEY).getPlugins();
     }
 
     public Appender parseAppender(String className, Element appenderElement, XmlConfiguration config) {
         PluginType<?> plugin = plugins.get(className.toLowerCase());
         if (plugin != null) {
-            try {
-                @SuppressWarnings("unchecked")
-                AppenderBuilder builder = (AppenderBuilder) LoaderUtil.newInstanceOf(plugin.getPluginClass());
-                return builder.parseAppender(appenderElement, config);
-            } catch (ReflectiveOperationException ex) {
-                LOGGER.warn("Unable to load plugin: {} due to: {}", plugin.getKey(), ex.getMessage());
-            }
+            final Class<? extends AppenderBuilder> pluginClass = plugin.getPluginClass().asSubclass(AppenderBuilder.class);
+            final AppenderBuilder builder = injector.getInstance(pluginClass);
+            return builder.parseAppender(appenderElement, config);
         }
         return null;
     }
@@ -83,13 +85,9 @@ public class BuilderManager {
     public Filter parseFilter(String className, Element filterElement, XmlConfiguration config) {
         PluginType<?> plugin = plugins.get(className.toLowerCase());
         if (plugin != null) {
-            try {
-                @SuppressWarnings("unchecked")
-                FilterBuilder builder = (FilterBuilder) LoaderUtil.newInstanceOf(plugin.getPluginClass());
-                return builder.parseFilter(filterElement, config);
-            } catch (ReflectiveOperationException ex) {
-                LOGGER.warn("Unable to load plugin: {} due to: {}", plugin.getKey(), ex.getMessage());
-            }
+            final Class<? extends FilterBuilder> pluginClass = plugin.getPluginClass().asSubclass(FilterBuilder.class);
+            final FilterBuilder builder = injector.getInstance(pluginClass);
+            return builder.parseFilter(filterElement, config);
         }
         return null;
     }
@@ -108,16 +106,13 @@ public class BuilderManager {
     public Layout parseLayout(String className, Element layoutElement, XmlConfiguration config) {
         PluginType<?> plugin = plugins.get(className.toLowerCase());
         if (plugin != null) {
-            try {
-                @SuppressWarnings("unchecked")
-                LayoutBuilder builder = (LayoutBuilder) LoaderUtil.newInstanceOf(plugin.getPluginClass());
-                return builder.parseLayout(layoutElement, config);
-            } catch (ReflectiveOperationException ex) {
-                LOGGER.warn("Unable to load plugin: {} due to: {}", plugin.getKey(), ex.getMessage());
-            }
+            final Class<? extends LayoutBuilder> pluginClass = plugin.getPluginClass().asSubclass(LayoutBuilder.class);
+            final LayoutBuilder builder = injector.getInstance(pluginClass);
+            return builder.parseLayout(layoutElement, config);
         }
         return null;
     }
+
     public Layout parseLayout(String className, String layoutPrefix, Properties props, PropertiesConfiguration config) {
         PluginType<?> plugin = plugins.get(className.toLowerCase());
         if (plugin != null) {
@@ -132,16 +127,13 @@ public class BuilderManager {
     public RewritePolicy parseRewritePolicy(String className, Element rewriteElement, XmlConfiguration config) {
         PluginType<?> plugin = plugins.get(className.toLowerCase());
         if (plugin != null) {
-            try {
-                @SuppressWarnings("unchecked")
-                RewritePolicyBuilder builder = (RewritePolicyBuilder) LoaderUtil.newInstanceOf(plugin.getPluginClass());
-                return builder.parseRewritePolicy(rewriteElement, config);
-            } catch (ReflectiveOperationException ex) {
-                LOGGER.warn("Unable to load plugin: {} due to: {}", plugin.getKey(), ex.getMessage());
-            }
+            final Class<? extends RewritePolicyBuilder> pluginClass = plugin.getPluginClass().asSubclass(RewritePolicyBuilder.class);
+            final RewritePolicyBuilder builder = injector.getInstance(pluginClass);
+            return builder.parseRewritePolicy(rewriteElement, config);
         }
         return null;
     }
+
     public RewritePolicy parseRewritePolicy(String className, String policyPrefix, Properties props, PropertiesConfiguration config) {
         PluginType<?> plugin = plugins.get(className.toLowerCase());
         if (plugin != null) {
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1Configuration.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1Configuration.java
index d97ff90..7d999bd 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1Configuration.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1Configuration.java
@@ -36,12 +36,13 @@ public class Log4j1Configuration extends AbstractConfiguration implements Reconf
 
     public static final String NULL = "null";
 
-    protected final BuilderManager manager = new BuilderManager();
+    protected final BuilderManager manager;
 
     public Log4j1Configuration(final LoggerContext loggerContext, final ConfigurationSource configurationSource,
             int monitorIntervalSeconds) {
         super(loggerContext, configurationSource);
         initializeWatchers(this, configurationSource, monitorIntervalSeconds);
+        manager = new BuilderManager(injector);
     }
 
     public BuilderManager getBuilderManager() {