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:54 UTC

[logging-log4j2] 01/03: Make TemplateResolverFactory/Interceptor 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 be85cee8cbaba96b4ce7bc261d8a87e7207667ac
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Wed Mar 30 00:14:23 2022 -0500

    Make TemplateResolverFactory/Interceptor injectable
    
    This updates JsonTemplateLayout to use DI for creating TemplateResolverFactory and TemplateResolverInterceptor plugins.
    
    Signed-off-by: Matt Sicker <ma...@apache.org>
---
 .../layout/template/json/JsonTemplateLayout.java   | 14 ++++++---
 .../json/resolver/EventResolverFactories.java      |  6 ++--
 .../json/resolver/EventResolverInterceptors.java   |  5 ++--
 .../json/resolver/TemplateResolverFactories.java   | 32 +++++++--------------
 .../json/resolver/TemplateResolverFactory.java     |  6 ++++
 .../json/resolver/TemplateResolverInterceptor.java |  6 ++++
 .../resolver/TemplateResolverInterceptors.java     | 33 ++++++++--------------
 7 files changed, 49 insertions(+), 53 deletions(-)

diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
index d3792fd..ffe037d 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
@@ -27,7 +27,14 @@ import org.apache.logging.log4j.core.layout.Encoder;
 import org.apache.logging.log4j.core.layout.TextEncoderHelper;
 import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.StringEncoder;
-import org.apache.logging.log4j.layout.template.json.resolver.*;
+import org.apache.logging.log4j.layout.template.json.resolver.EventResolverContext;
+import org.apache.logging.log4j.layout.template.json.resolver.EventResolverFactories;
+import org.apache.logging.log4j.layout.template.json.resolver.EventResolverFactory;
+import org.apache.logging.log4j.layout.template.json.resolver.EventResolverInterceptor;
+import org.apache.logging.log4j.layout.template.json.resolver.EventResolverInterceptors;
+import org.apache.logging.log4j.layout.template.json.resolver.EventResolverStringSubstitutor;
+import org.apache.logging.log4j.layout.template.json.resolver.TemplateResolver;
+import org.apache.logging.log4j.layout.template.json.resolver.TemplateResolvers;
 import org.apache.logging.log4j.layout.template.json.util.JsonWriter;
 import org.apache.logging.log4j.layout.template.json.util.Recycler;
 import org.apache.logging.log4j.layout.template.json.util.RecyclerFactory;
@@ -114,11 +121,10 @@ public class JsonTemplateLayout implements StringLayout {
             final JsonWriter jsonWriter) {
 
         // Inject resolver factory and interceptor plugins.
-        final List<String> pluginPackages = configuration.getPluginPackages();
         final Map<String, EventResolverFactory> resolverFactoryByName =
-                EventResolverFactories.populateResolverFactoryByName(pluginPackages);
+                EventResolverFactories.populateResolverFactoryByName(configuration);
         final List<EventResolverInterceptor> resolverInterceptors =
-                EventResolverInterceptors.populateInterceptors(pluginPackages);
+                EventResolverInterceptors.populateInterceptors(configuration);
         final EventResolverStringSubstitutor substitutor =
                 new EventResolverStringSubstitutor(configuration.getStrSubstitutor());
 
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactories.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactories.java
index b35cd22..35e075c 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactories.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactories.java
@@ -17,8 +17,8 @@
 package org.apache.logging.log4j.layout.template.json.resolver;
 
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Configuration;
 
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -29,9 +29,9 @@ public final class EventResolverFactories {
     private EventResolverFactories() {}
 
     public static Map<String, EventResolverFactory> populateResolverFactoryByName(
-            final List<String> pluginPackages) {
+            final Configuration configuration) {
         return TemplateResolverFactories.populateFactoryByName(
-                pluginPackages,
+                configuration,
                 LogEvent.class,
                 EventResolverContext.class);
     }
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptors.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptors.java
index 15b35f2..32c1004 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptors.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptors.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.layout.template.json.resolver;
 
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Configuration;
 
 import java.util.List;
 
@@ -28,9 +29,9 @@ public final class EventResolverInterceptors {
     private EventResolverInterceptors() {}
 
     public static List<EventResolverInterceptor> populateInterceptors(
-            final List<String> pluginPackages) {
+            final Configuration configuration) {
         return TemplateResolverInterceptors.populateInterceptors(
-                pluginPackages,
+                configuration,
                 LogEvent.class,
                 EventResolverContext.class);
     }
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverFactories.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverFactories.java
index 96ecd6e..2afa844 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverFactories.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverFactories.java
@@ -17,12 +17,12 @@
 package org.apache.logging.log4j.layout.template.json.resolver;
 
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.util.PluginType;
-import org.apache.logging.log4j.plugins.util.PluginUtil;
 import org.apache.logging.log4j.status.StatusLogger;
 
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -42,15 +42,13 @@ public final class TemplateResolverFactories {
      * respectively.
      */
     public static <V, C extends TemplateResolverContext<V, C>, F extends TemplateResolverFactory<V, C>> Map<String, F> populateFactoryByName(
-            final List<String> pluginPackages,
+            final Configuration configuration,
             final Class<V> valueClass,
             final Class<C> contextClass) {
 
         // Populate template resolver factories.
         final Map<String, PluginType<?>> pluginTypeByName =
-                PluginUtil.collectPluginsByCategoryAndPackage(
-                        TemplateResolverFactory.CATEGORY,
-                        pluginPackages);
+                configuration.getComponent(TemplateResolverFactory.PLUGIN_MANAGER_KEY).getPlugins();
         if (LOGGER.isDebugEnabled()) {
             LOGGER.debug(
                     "found {} plugins of category \"{}\": {}",
@@ -61,7 +59,7 @@ public final class TemplateResolverFactories {
 
         // Filter matching resolver factories.
         final Map<String, F> factoryByName =
-                populateFactoryByName(pluginTypeByName, valueClass, contextClass);
+                populateFactoryByName(pluginTypeByName, configuration, valueClass, contextClass);
         if (LOGGER.isDebugEnabled()) {
             LOGGER.debug(
                     "matched {} resolver factories out of {} for value class {} and context class {}: {}",
@@ -77,6 +75,7 @@ public final class TemplateResolverFactories {
 
     private static <V, C extends TemplateResolverContext<V, C>, F extends TemplateResolverFactory<V, C>> Map<String, F> populateFactoryByName(
             final Map<String, PluginType<?>> pluginTypeByName,
+            final Configuration configuration,
             final Class<V> valueClass,
             final Class<C> contextClass) {
         final Map<String, F> factoryByName = new LinkedHashMap<>();
@@ -87,8 +86,11 @@ public final class TemplateResolverFactories {
             final boolean pluginClassMatched =
                     TemplateResolverFactory.class.isAssignableFrom(pluginClass);
             if (pluginClassMatched) {
+                @SuppressWarnings("rawtypes")
+                final Class<? extends TemplateResolverFactory> factoryClass =
+                        pluginClass.asSubclass(TemplateResolverFactory.class);
                 final TemplateResolverFactory<?, ?> rawFactory =
-                        instantiateFactory(pluginName, pluginClass);
+                        configuration.getComponent(Key.forClass(factoryClass));
                 final F factory = castFactory(valueClass, contextClass, rawFactory);
                 if (factory != null) {
                     addFactory(factoryByName, factory);
@@ -98,20 +100,6 @@ public final class TemplateResolverFactories {
         return factoryByName;
     }
 
-    private static TemplateResolverFactory<?, ?> instantiateFactory(
-            final String pluginName,
-            final Class<?> pluginClass) {
-        try {
-            return (TemplateResolverFactory<?, ?>)
-                    PluginUtil.instantiatePlugin(pluginClass);
-        } catch (final Exception error) {
-            final String message = String.format(
-                    "failed instantiating resolver factory plugin %s of name %s",
-                    pluginClass, pluginName);
-            throw new RuntimeException(message, error);
-        }
-    }
-
     private static <V, C extends TemplateResolverContext<V, C>, F extends TemplateResolverFactory<V, C>> F castFactory(
             final Class<V> valueClass,
             final Class<C> contextClass,
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverFactory.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverFactory.java
index 93cf611..2553f07 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverFactory.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverFactory.java
@@ -16,6 +16,10 @@
  */
 package org.apache.logging.log4j.layout.template.json.resolver;
 
+import org.apache.logging.log4j.plugins.Named;
+import org.apache.logging.log4j.plugins.di.Key;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+
 /**
  * {@link TemplateResolver} factory.
  *
@@ -29,6 +33,8 @@ public interface TemplateResolverFactory<V, C extends TemplateResolverContext<V,
      */
     String CATEGORY = "JsonTemplateResolverFactory";
 
+    Key<PluginManager> PLUGIN_MANAGER_KEY = new @Named(CATEGORY) Key<>() {};
+
     /**
      * The targeted value class.
      */
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverInterceptor.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverInterceptor.java
index 0183aa9..d11178e 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverInterceptor.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverInterceptor.java
@@ -16,6 +16,10 @@
  */
 package org.apache.logging.log4j.layout.template.json.resolver;
 
+import org.apache.logging.log4j.plugins.Named;
+import org.apache.logging.log4j.plugins.di.Key;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+
 /**
  * Main {@link TemplateResolver} compilation interception interface.
  *
@@ -29,6 +33,8 @@ public interface TemplateResolverInterceptor<V, C extends TemplateResolverContex
      */
     String CATEGORY = "JsonTemplateResolverInterceptor";
 
+    Key<PluginManager> PLUGIN_MANAGER_KEY = new @Named(CATEGORY) Key<>() {};
+
     /**
      * The targeted value class.
      */
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverInterceptors.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverInterceptors.java
index ca3440d..340d3cd 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverInterceptors.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolverInterceptors.java
@@ -17,8 +17,9 @@
 package org.apache.logging.log4j.layout.template.json.resolver;
 
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.util.PluginType;
-import org.apache.logging.log4j.plugins.util.PluginUtil;
 import org.apache.logging.log4j.status.StatusLogger;
 
 import java.util.LinkedList;
@@ -42,26 +43,24 @@ public class TemplateResolverInterceptors {
      * respectively.
      */
     public static <V, C extends TemplateResolverContext<V, C>, I extends TemplateResolverInterceptor<V, C>> List<I> populateInterceptors(
-            final List<String> pluginPackages,
+            final Configuration configuration,
             final Class<V> valueClass,
             final Class<C> contextClass) {
 
         // Populate interceptors.
         final Map<String, PluginType<?>> pluginTypeByName =
-                PluginUtil.collectPluginsByCategoryAndPackage(
-                        TemplateResolverInterceptor.CATEGORY,
-                        pluginPackages);
+                configuration.getComponent(TemplateResolverInterceptor.PLUGIN_MANAGER_KEY).getPlugins();
         if (LOGGER.isDebugEnabled()) {
             LOGGER.debug(
                     "found {} plugins of category \"{}\": {}",
                     pluginTypeByName.size(),
-                    TemplateResolverFactory.CATEGORY,
+                    TemplateResolverInterceptor.CATEGORY,
                     pluginTypeByName.keySet());
         }
 
         // Filter matching interceptors.
         final List<I> interceptors =
-                populateInterceptors(pluginTypeByName, valueClass, contextClass);
+                populateInterceptors(pluginTypeByName, configuration, valueClass, contextClass);
         LOGGER.debug(
                 "{} interceptors matched out of {} for value class {} and context class {}",
                 interceptors.size(),
@@ -74,6 +73,7 @@ public class TemplateResolverInterceptors {
 
     private static <V, C extends TemplateResolverContext<V, C>, I extends TemplateResolverInterceptor<V, C>> List<I> populateInterceptors(
             final Map<String, PluginType<?>> pluginTypeByName,
+            final Configuration configuration,
             final Class<V> valueClass,
             final Class<C> contextClass) {
         final List<I> interceptors = new LinkedList<>();
@@ -84,8 +84,11 @@ public class TemplateResolverInterceptors {
             final boolean pluginClassMatched =
                     TemplateResolverInterceptor.class.isAssignableFrom(pluginClass);
             if (pluginClassMatched) {
+                @SuppressWarnings("rawtypes")
+                final Class<? extends TemplateResolverInterceptor> interceptorClass =
+                        pluginClass.asSubclass(TemplateResolverInterceptor.class);
                 final TemplateResolverInterceptor<?, ?> rawInterceptor =
-                        instantiateInterceptor(pluginName, pluginClass);
+                        configuration.getComponent(Key.forClass(interceptorClass));
                 final I interceptor =
                         castInterceptor(valueClass, contextClass, rawInterceptor);
                 if (interceptor != null) {
@@ -96,20 +99,6 @@ public class TemplateResolverInterceptors {
         return interceptors;
     }
 
-    private static TemplateResolverInterceptor<?, ?> instantiateInterceptor(
-            final String pluginName,
-            final Class<?> pluginClass) {
-        try {
-            return (TemplateResolverInterceptor<?, ?>)
-                    PluginUtil.instantiatePlugin(pluginClass);
-        } catch (final Exception error) {
-            final String message = String.format(
-                    "failed instantiating resolver interceptor plugin %s of name %s",
-                    pluginClass, pluginName);
-            throw new RuntimeException(message, error);
-        }
-    }
-
     private static <V, C extends TemplateResolverContext<V, C>, I extends TemplateResolverInterceptor<V, C>> I castInterceptor(
             final Class<V> valueClass,
             final Class<C> contextClass,