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 <[email protected]> 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 <[email protected]> --- .../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,
