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,