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/01/29 19:59:43 UTC

[logging-log4j2] branch master updated: Revert TypeConverterRegistry usage of BeanManager

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


The following commit(s) were added to refs/heads/master by this push:
     new 9c127e0  Revert TypeConverterRegistry usage of BeanManager
9c127e0 is described below

commit 9c127e097de8d12e66a016b485e82c2c787c8a2b
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Sat Jan 29 13:59:19 2022 -0600

    Revert TypeConverterRegistry usage of BeanManager
    
    This seems to be causing a race condition which causes a test failure.
    
    Signed-off-by: Matt Sicker <ma...@apache.org>
---
 .../plugins/convert/TypeConverterRegistry.java     | 52 +++++++---------------
 1 file changed, 16 insertions(+), 36 deletions(-)

diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
index c2ecd8e..d246727 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
@@ -17,26 +17,22 @@
 package org.apache.logging.log4j.plugins.convert;
 
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.plugins.di.model.PluginSource;
-import org.apache.logging.log4j.plugins.spi.Bean;
-import org.apache.logging.log4j.plugins.spi.BeanManager;
 import org.apache.logging.log4j.plugins.util.LazyValue;
-import org.apache.logging.log4j.plugins.util.PluginLoader;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.util.Value;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util.ReflectionUtil;
 
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Set;
 import java.util.UnknownFormatConversionException;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import java.util.stream.Collectors;
 
 /**
  * Registry for {@link TypeConverter} plugins.
@@ -46,7 +42,6 @@ import java.util.stream.Collectors;
 public class TypeConverterRegistry {
 
     private static final Logger LOGGER = StatusLogger.getLogger();
-    private static final String DEFAULT_CONVERTERS_PACKAGE = "org.apache.logging.log4j.core.config.plugins.convert";
     private static final Value<TypeConverterRegistry> INSTANCE = LazyValue.forSupplier(TypeConverterRegistry::new);
     private static final Object INSTANCE_LOCK = new Object();
 
@@ -105,37 +100,22 @@ public class TypeConverterRegistry {
 
     private TypeConverterRegistry() {
         LOGGER.trace("TypeConverterRegistry initializing.");
-        // TODO: this should eventually be refactored to load TypeConverter instances on demand via BeanManager
-        //  (can be done after AbstractConfigurationBinder is removed; can then combine TypeConverters with rest of beans)
-        loadKnownTypeConverters();
+        final PluginManager manager = new PluginManager(TypeConverters.CATEGORY);
+        manager.collectPlugins();
+        loadKnownTypeConverters(manager.getPlugins().values());
         registerPrimitiveTypes();
     }
 
-    private void loadKnownTypeConverters() {
-        final BeanManager beanManager = BeanManager.getInstance();
-        final Set<PluginSource> typeConverterPlugins = PluginLoader.loadPluginSourcesFromMainClassLoader()
-                .stream()
-                .filter(pluginSource -> pluginSource.getImplementedInterfaces().contains(TypeConverter.class))
-                .collect(Collectors.toSet());
-        final Collection<Bean<?>> typeConverterBeans;
-        if (typeConverterPlugins.isEmpty()) {
-            // retry with a classpath scan
-            LOGGER.warn("Unable to load PluginModule metadata; falling back to scan of classpath");
-            typeConverterBeans = beanManager.scanAndLoadBeans(LoaderUtil.getClassLoader(), DEFAULT_CONVERTERS_PACKAGE)
-                    .stream()
-                    .filter(bean -> bean.hasMatchingType(TypeConverter.class))
-                    .collect(Collectors.toSet());
-        } else {
-            typeConverterBeans = beanManager.loadBeansFromPluginSources(typeConverterPlugins);
-        }
-        beanManager.validateBeans(typeConverterBeans);
-        final var initializationContext = beanManager.createInitializationContext(null);
-        for (final Bean<?> typeConverterBean : typeConverterBeans) {
-            final Bean<TypeConverter<?>> bean = TypeUtil.cast(typeConverterBean);
-            final Class<? extends TypeConverter<?>> pluginClass = TypeUtil.cast(bean.getDeclaringClass());
-            final Type conversionType = getTypeConverterSupportedType(pluginClass);
-            final TypeConverter<?> converter = beanManager.getValue(bean, initializationContext);
-            registerConverter(conversionType, converter);
+    private void loadKnownTypeConverters(final Collection<PluginType<?>> knownTypes) {
+        for (final PluginType<?> knownType : knownTypes) {
+            final Class<?> clazz = knownType.getPluginClass();
+            if (TypeConverter.class.isAssignableFrom(clazz)) {
+                @SuppressWarnings("rawtypes") final Class<? extends TypeConverter> pluginClass =
+                        clazz.asSubclass(TypeConverter.class);
+                final Type conversionType = getTypeConverterSupportedType(pluginClass);
+                final TypeConverter<?> converter = ReflectionUtil.instantiate(pluginClass);
+                registerConverter(conversionType, converter);
+            }
         }
     }