This is an automated email from the ASF dual-hosted git repository. mattsicker pushed a commit to branch feature/3.x/name-alias-provider in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 579716c3b8b604d6afe8e9edfa6c9da0e3cf66f0 Author: Matt Sicker <[email protected]> AuthorDate: Thu Aug 7 17:14:05 2025 -0500 Remove protected Key constructor --- .../validators/ValidHostValidatorTest.java | 4 +-- .../validators/ValidPortValidatorTest.java | 4 +-- .../logging/log4j/core/ContextDataInjector.java | 2 +- .../java/org/apache/logging/log4j/core/Core.java | 4 +-- .../action/CompressActionFactoryProvider.java | 8 ++++++ .../CompositeCompressActionFactoryProvider.java | 4 +-- .../log4j/core/config/AbstractConfiguration.java | 4 ++- .../logging/log4j/core/config/Configuration.java | 2 +- .../log4j/core/config/ConfigurationFactory.java | 6 ++-- .../log4j/core/config/composite/MergeStrategy.java | 2 +- .../logging/log4j/core/impl/LogEventFactory.java | 2 +- .../logging/log4j/core/lookup/StrLookup.java | 4 +-- .../logging/log4j/core/script/ScriptManager.java | 2 +- .../log4j/core/selector/ContextSelector.java | 2 +- .../org/apache/logging/log4j/core/time/Clock.java | 2 +- .../apache/logging/log4j/core/time/NanoClock.java | 2 +- .../layout/template/json/JsonTemplateLayout.java | 7 ++--- .../json/resolver/EventResolverFactory.java | 11 +++++++- .../json/resolver/EventResolverInterceptor.java | 10 ++++++- .../di/ConfigurableInstanceFactoryTest.java | 13 +++++++-- .../apache/logging/log4j/plugins/di/KeysTest.java | 6 ---- .../org/apache/logging/log4j/plugins/Node.java | 3 +- .../org/apache/logging/log4j/plugins/di/Key.java | 25 ---------------- .../log4j/plugins/di/spi/InjectionPoint.java | 2 +- .../log4j/plugins/di/spi/StringValueResolver.java | 2 +- .../logging/log4j/plugins/util/TypeUtil.java | 33 ++++++++++++++++++++++ 26 files changed, 99 insertions(+), 67 deletions(-) diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java index 256f3aaf7d..86aaab96de 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java @@ -21,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.logging.log4j.core.config.ConfigurationProcessor; -import org.apache.logging.log4j.plugins.Namespace; import org.apache.logging.log4j.plugins.Node; import org.apache.logging.log4j.plugins.di.ConfigurableInstanceFactory; import org.apache.logging.log4j.plugins.di.DI; @@ -42,7 +41,8 @@ public class ValidHostValidatorTest { @BeforeEach public void setUp() throws Exception { - final PluginNamespace category = instanceFactory.getInstance(new @Namespace("Test") Key<>() {}); + final var key = Key.builder(PluginNamespace.class).setNamespace("Test").get(); + final PluginNamespace category = instanceFactory.getInstance(key); PluginType<?> plugin = category.get("HostAndPort"); assertNotNull(plugin, "Rebuild this module to ensure annotation processing has been done."); node = new Node(null, "HostAndPort", plugin); diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java index 56b65dc422..e80f036fb7 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java @@ -20,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import org.apache.logging.log4j.core.config.ConfigurationProcessor; -import org.apache.logging.log4j.plugins.Namespace; import org.apache.logging.log4j.plugins.Node; import org.apache.logging.log4j.plugins.di.ConfigurableInstanceFactory; import org.apache.logging.log4j.plugins.di.DI; @@ -39,7 +38,8 @@ public class ValidPortValidatorTest { @BeforeEach public void setUp() throws Exception { - final PluginNamespace category = instanceFactory.getInstance(new @Namespace("Test") Key<>() {}); + final var key = Key.builder(PluginNamespace.class).setNamespace("Test").get(); + final PluginNamespace category = instanceFactory.getInstance(key); final PluginType<?> plugin = category.get("HostAndPort"); assertNotNull(plugin, "Rebuild this module to ensure annotation processing has been done."); node = new Node(null, "HostAndPort", plugin); diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java index bc1a28100f..33160f88fb 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java @@ -55,7 +55,7 @@ import org.apache.logging.log4j.util.StringMap; * @since 2.7 */ public interface ContextDataInjector { - Key<ContextDataInjector> KEY = new Key<>() {}; + Key<ContextDataInjector> KEY = Key.builder(ContextDataInjector.class).get(); /** * Returns a {@code StringMap} object initialized with the specified properties and the appropriate diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Core.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/Core.java index 850257f7f1..a1602b088c 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Core.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Core.java @@ -16,7 +16,6 @@ */ package org.apache.logging.log4j.core; -import org.apache.logging.log4j.plugins.Namespace; import org.apache.logging.log4j.plugins.Node; import org.apache.logging.log4j.plugins.di.Key; import org.apache.logging.log4j.plugins.model.PluginNamespace; @@ -26,5 +25,6 @@ public class Core { @Deprecated public static final String CATEGORY_NAME = Node.CORE_NAMESPACE; - public static final Key<PluginNamespace> PLUGIN_NAMESPACE_KEY = new @Namespace(Node.CORE_NAMESPACE) Key<>() {}; + public static final Key<PluginNamespace> PLUGIN_NAMESPACE_KEY = + Key.builder(PluginNamespace.class).setNamespace(Node.CORE_NAMESPACE).get(); } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CompressActionFactoryProvider.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CompressActionFactoryProvider.java index d8118b586c..cceb860d85 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CompressActionFactoryProvider.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CompressActionFactoryProvider.java @@ -16,8 +16,11 @@ */ package org.apache.logging.log4j.core.appender.rolling.action; +import java.util.List; import org.apache.logging.log4j.core.appender.rolling.action.internal.CompositeCompressActionFactoryProvider; import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.plugins.di.Key; +import org.apache.logging.log4j.plugins.util.TypeUtil; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -31,6 +34,11 @@ public interface CompressActionFactoryProvider { String NAMESPACE = "compress"; + Key<List<CompressActionFactoryProvider>> KEY = Key.<List<CompressActionFactoryProvider>>builder( + TypeUtil.createParameterizedType(List.class, CompressActionFactoryProvider.class)) + .setNamespace(NAMESPACE) + .get(); + /** * Creates the appropriate {@link CompressActionFactory} for the given compression algorithm. * <p> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/internal/CompositeCompressActionFactoryProvider.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/internal/CompositeCompressActionFactoryProvider.java index ec4e758906..0e65803816 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/internal/CompositeCompressActionFactoryProvider.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/internal/CompositeCompressActionFactoryProvider.java @@ -21,8 +21,6 @@ import java.util.Objects; import org.apache.logging.log4j.core.appender.rolling.action.CompressActionFactory; import org.apache.logging.log4j.core.appender.rolling.action.CompressActionFactoryProvider; import org.apache.logging.log4j.core.config.Configuration; -import org.apache.logging.log4j.plugins.Namespace; -import org.apache.logging.log4j.plugins.di.Key; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -33,7 +31,7 @@ public class CompositeCompressActionFactoryProvider implements CompressActionFac public CompositeCompressActionFactoryProvider(final @Nullable Configuration configuration) { if (configuration != null) { - delegates = configuration.getComponent(new @Namespace(CompressActionFactoryProvider.NAMESPACE) Key<>() {}); + delegates = configuration.getComponent(CompressActionFactoryProvider.KEY); } else { delegates = List.of(new JreCompressActionFactoryProvider()); } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java index 4c332e5239..d89585f43b 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java @@ -279,7 +279,9 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement initializeScriptManager(); // TODO(ms): this should use injectMembers() corePlugins = instanceFactory.getInstance(Core.PLUGIN_NAMESPACE_KEY); - final PluginNamespace levelPlugins = instanceFactory.getInstance(new @Namespace(Level.CATEGORY) Key<>() {}); + final var levelPluginsKey = + Key.builder(PluginNamespace.class).setNamespace(Level.CATEGORY).get(); + final PluginNamespace levelPlugins = instanceFactory.getInstance(levelPluginsKey); levelPlugins.forEach(type -> { final Class<?> pluginClass = type.getPluginClass(); try { diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java index b00280d4f3..f996f784f1 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java @@ -51,7 +51,7 @@ import org.apache.logging.log4j.plugins.di.Key; public interface Configuration extends Filterable { /** Injection key for the current Configuration. */ - Key<Configuration> KEY = new Key<>() {}; + Key<Configuration> KEY = Key.forClass(Configuration.class); /** Key for storing the Context properties. */ String CONTEXT_PROPERTIES = "ContextProperties"; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java index f9713667ff..25ab99e079 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java @@ -24,7 +24,6 @@ import org.apache.logging.log4j.core.impl.CoreProperties.AuthenticationPropertie import org.apache.logging.log4j.core.util.AuthorizationProvider; import org.apache.logging.log4j.kit.env.PropertyEnvironment; import org.apache.logging.log4j.kit.env.internal.PropertiesUtilPropertyEnvironment; -import org.apache.logging.log4j.plugins.Namespace; import org.apache.logging.log4j.plugins.di.ConfigurableInstanceFactory; import org.apache.logging.log4j.plugins.di.Key; import org.apache.logging.log4j.plugins.model.PluginNamespace; @@ -62,9 +61,10 @@ public abstract class ConfigurationFactory extends ConfigurationBuilderFactory i */ public static final String NAMESPACE = "ConfigurationFactory"; - public static final Key<ConfigurationFactory> KEY = new Key<>() {}; + public static final Key<ConfigurationFactory> KEY = Key.forClass(ConfigurationFactory.class); - public static final Key<PluginNamespace> PLUGIN_NAMESPACE_KEY = new @Namespace(NAMESPACE) Key<>() {}; + public static final Key<PluginNamespace> PLUGIN_NAMESPACE_KEY = + Key.builder(PluginNamespace.class).setNamespace(NAMESPACE).get(); /** * Allows subclasses access to the status logger without creating another instance. diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java index 85becc2480..b0642b5fc9 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java @@ -26,7 +26,7 @@ import org.apache.logging.log4j.plugins.model.PluginNamespace; */ public interface MergeStrategy { - Key<MergeStrategy> KEY = new Key<>() {}; + Key<MergeStrategy> KEY = Key.forClass(MergeStrategy.class); /** * Merge the root node properties into the configuration. diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java index 310e4d4c39..4a83005f57 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java @@ -28,7 +28,7 @@ import org.apache.logging.log4j.plugins.di.Key; * */ public interface LogEventFactory { - Key<LogEventFactory> KEY = new Key<>() {}; + Key<LogEventFactory> KEY = Key.forClass(LogEventFactory.class); LogEvent createEvent( String loggerName, diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java index 45f27f1967..108df3b5c2 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java @@ -17,7 +17,6 @@ package org.apache.logging.log4j.core.lookup; import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.plugins.Namespace; import org.apache.logging.log4j.plugins.di.Key; import org.apache.logging.log4j.plugins.model.PluginNamespace; @@ -42,7 +41,8 @@ public interface StrLookup { */ String CATEGORY = "Lookup"; - Key<PluginNamespace> PLUGIN_CATEGORY_KEY = new @Namespace(CATEGORY) Key<>() {}; + Key<PluginNamespace> PLUGIN_CATEGORY_KEY = + Key.builder(PluginNamespace.class).setNamespace(CATEGORY).get(); /** * Looks up a String key to a String value. diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java index 3a1ef00e1f..2731396bf5 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java @@ -24,7 +24,7 @@ import org.apache.logging.log4j.plugins.di.Key; * Script Manager. */ public interface ScriptManager { - Key<ScriptManager> KEY = new Key<>() {}; + Key<ScriptManager> KEY = Key.forClass(ScriptManager.class); /** * Add scripts defined in the configuration. diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ContextSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ContextSelector.java index 8f313a8c91..789ef4322c 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ContextSelector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ContextSelector.java @@ -32,7 +32,7 @@ public interface ContextSelector { long DEFAULT_STOP_TIMEOUT = 50; - Key<ContextSelector> KEY = new Key<>() {}; + Key<ContextSelector> KEY = Key.forClass(ContextSelector.class); /** * Shuts down the LoggerContext. diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java index 3965ae5201..15bc96e5cf 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java @@ -24,7 +24,7 @@ import org.apache.logging.log4j.plugins.di.Key; * @since 2.11 */ public interface Clock { - Key<Clock> KEY = new Key<>() {}; + Key<Clock> KEY = Key.forClass(Clock.class); /** * Returns the time in milliseconds since the epoch. diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java index df6db03e61..6ceb9bc5bc 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java @@ -25,7 +25,7 @@ import org.apache.logging.log4j.plugins.di.Key; * @since 2.11 */ public interface NanoClock { - Key<NanoClock> KEY = new Key<>() {}; + Key<NanoClock> KEY = Key.forClass(NanoClock.class); /** * Returns the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds. 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 128b619128..bc6b474c75 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 @@ -44,11 +44,9 @@ import org.apache.logging.log4j.layout.template.json.util.JsonWriter; import org.apache.logging.log4j.layout.template.json.util.Uris; import org.apache.logging.log4j.plugins.Configurable; import org.apache.logging.log4j.plugins.Factory; -import org.apache.logging.log4j.plugins.Namespace; import org.apache.logging.log4j.plugins.Plugin; import org.apache.logging.log4j.plugins.PluginBuilderAttribute; import org.apache.logging.log4j.plugins.PluginElement; -import org.apache.logging.log4j.plugins.di.Key; import org.apache.logging.log4j.util.Strings; @Configurable(elementType = Layout.ELEMENT_TYPE) @@ -105,8 +103,7 @@ public class JsonTemplateLayout implements StringLayout { final JsonWriter jsonWriter) { // Inject resolver factory and interceptor plugins. - final List<EventResolverFactory> resolverFactories = - configuration.getComponent(new @Namespace(EventResolverFactory.CATEGORY) Key<>() {}); + final List<EventResolverFactory> resolverFactories = configuration.getComponent(EventResolverFactory.KEY); final Map<String, EventResolverFactory> resolverFactoryByName = resolverFactories.stream() .collect(Collectors.toMap( EventResolverFactory::getName, @@ -119,7 +116,7 @@ public class JsonTemplateLayout implements StringLayout { }, LinkedHashMap::new)); final List<EventResolverInterceptor> resolverInterceptors = - configuration.getComponent(new @Namespace(EventResolverInterceptor.CATEGORY) Key<>() {}); + configuration.getComponent(EventResolverInterceptor.KEY); 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/EventResolverFactory.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactory.java index 53edf09c52..51a76ac029 100644 --- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactory.java +++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactory.java @@ -16,7 +16,10 @@ */ package org.apache.logging.log4j.layout.template.json.resolver; +import java.util.List; import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.plugins.di.Key; +import org.apache.logging.log4j.plugins.util.TypeUtil; /** * {@link TemplateResolverFactory} specialized for {@link LogEvent}s. @@ -24,4 +27,10 @@ import org.apache.logging.log4j.core.LogEvent; * @see EventResolver * @see EventResolverContext */ -public interface EventResolverFactory extends TemplateResolverFactory<LogEvent, EventResolverContext> {} +public interface EventResolverFactory extends TemplateResolverFactory<LogEvent, EventResolverContext> { + + Key<List<EventResolverFactory>> KEY = Key.<List<EventResolverFactory>>builder( + TypeUtil.createParameterizedType(List.class, EventResolverFactory.class)) + .setNamespace(CATEGORY) + .get(); +} diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptor.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptor.java index 57c318eaf2..3fe873a359 100644 --- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptor.java +++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptor.java @@ -16,9 +16,17 @@ */ package org.apache.logging.log4j.layout.template.json.resolver; +import java.util.List; import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.plugins.di.Key; +import org.apache.logging.log4j.plugins.util.TypeUtil; /** * {@link TemplateResolverInterceptor} specialized for {@link LogEvent}s. */ -public interface EventResolverInterceptor extends TemplateResolverInterceptor<LogEvent, EventResolverContext> {} +public interface EventResolverInterceptor extends TemplateResolverInterceptor<LogEvent, EventResolverContext> { + Key<List<EventResolverInterceptor>> KEY = Key.<List<EventResolverInterceptor>>builder( + TypeUtil.createParameterizedType(List.class, EventResolverInterceptor.class)) + .setNamespace(CATEGORY) + .get(); +} diff --git a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactoryTest.java b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactoryTest.java index 390958198f..c9af60fb9a 100644 --- a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactoryTest.java +++ b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactoryTest.java @@ -19,6 +19,7 @@ package org.apache.logging.log4j.plugins.di; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.lang.reflect.Type; import java.util.Collection; import java.util.List; import java.util.Map; @@ -38,6 +39,7 @@ import org.apache.logging.log4j.plugins.test.validation.di.BaseBean; import org.apache.logging.log4j.plugins.test.validation.di.BetaBean; import org.apache.logging.log4j.plugins.test.validation.di.GammaBean; import org.apache.logging.log4j.plugins.test.validation.di.PrototypeBean; +import org.apache.logging.log4j.plugins.util.TypeUtil; import org.apache.logging.log4j.plugins.validation.constraints.Required; import org.junit.jupiter.api.Test; @@ -73,14 +75,16 @@ class ConfigurableInstanceFactoryTest { @Test void unknownInstanceError() { - final Key<UnknownInstance> key = new Key<>() {}; + final Key<UnknownInstance> key = Key.forClass(UnknownInstance.class); assertThatThrownBy(() -> DI.createInitializedFactory().getInstance(key)) .hasMessage("No @Inject constructor or default constructor found for " + key); } @Test void optionalUnknownInstance() { - final Key<Optional<UnknownInstance>> key = new Key<>() {}; + final Type type = TypeUtil.createParameterizedType(Optional.class, UnknownInstance.class); + final Key<Optional<UnknownInstance>> key = + Key.<Optional<UnknownInstance>>builder(type).get(); assertThat(DI.createInitializedFactory().getInstance(key)).isEmpty(); } @@ -208,7 +212,10 @@ class ConfigurableInstanceFactoryTest { @Test void injectionPointValidationPartial() { final ConfigurableInstanceFactory instanceFactory = DI.builder() - .addInitialBindingFrom(new @Named("foo") Key<String>() {}) + .addInitialBindingFrom(Key.builder(String.class) + .setName("foo") + .setQualifierType(Named.class) + .get()) .toInstance("hello") .build(); assertThatThrownBy(() -> instanceFactory.getInstance(ValidatedInjectionPoints.class)) diff --git a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/KeysTest.java b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/KeysTest.java index 30428b11b2..3e6d1308a2 100644 --- a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/KeysTest.java +++ b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/KeysTest.java @@ -28,12 +28,6 @@ import org.junit.jupiter.api.Test; class KeysTest { - @Test - void configurableNamespace() { - final Key<String> key = new @Configurable Key<>() {}; - assertEquals(Node.CORE_NAMESPACE, key.getNamespace()); - } - static class ConfigurableField { @Configurable String field; diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java index 2f8fb16b6f..a028c80fa0 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java @@ -52,7 +52,8 @@ public class Node { /** * Key describing the current node being configured. */ - public static final Key<Node> CURRENT_NODE = new @PluginNode Key<>() {}; + public static final Key<Node> CURRENT_NODE = + Key.builder(Node.class).setQualifierType(PluginNode.class).get(); private Node parent; private final String name; diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java index e2dd4910d7..57e5db538c 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java @@ -19,7 +19,6 @@ package org.apache.logging.log4j.plugins.di; import com.google.errorprone.annotations.concurrent.LazyInit; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.AnnotatedType; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Parameter; @@ -64,30 +63,6 @@ public class Key<T> implements StringBuilderFormattable, Comparable<Key<T>> { @LazyInit private @Nullable String toString; - /** - * Anonymous subclasses override this constructor to instantiate this Key based on the type given. - * For example, to represent the equivalent of an annotated field {@code @Named("abc") Map<String, List<String>> field}, - * this constructor would be used like so: - * - * <pre>{@code - * Key<Map<String, List<String>>> key = new @Named("abc") Key<>() {}; - * // or equivalently - * var key = new @Named("abc") Key<Map<String, List<String>>>() {}; - * }</pre> - */ - protected Key() { - type = TypeUtil.getSuperclassTypeParameter(getClass()); - rawType = TypeUtil.getRawType(type); - final AnnotatedType superclass = getClass().getAnnotatedSuperclass(); - final Annotation qualifier = - AnnotationUtil.getElementAnnotationHavingMetaAnnotation(superclass, QualifierType.class); - qualifierType = qualifier != null ? qualifier.annotationType() : null; - name = Strings.EMPTY; - namespace = Keys.getNamespace(superclass); - order = AnnotationUtil.getOrder(superclass); - hashCode = Objects.hash(type, qualifierType, name.toLowerCase(Locale.ROOT), namespace.toLowerCase(Locale.ROOT)); - } - private Key( final Type type, final Class<T> rawType, diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/InjectionPoint.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/InjectionPoint.java index a47cc872f7..9da2fea958 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/InjectionPoint.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/InjectionPoint.java @@ -29,7 +29,7 @@ import org.apache.logging.log4j.plugins.di.Keys; public record InjectionPoint<T>(Key<T> key, Collection<String> aliases, AnnotatedElement element) { - public static final Key<InjectionPoint<?>> CURRENT_INJECTION_POINT = new Key<>() {}; + public static final Key<InjectionPoint> CURRENT_INJECTION_POINT = Key.forClass(InjectionPoint.class); public static <T> InjectionPoint<T> forField(final Field field) { final Key<T> key = Key.forField(field); diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/StringValueResolver.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/StringValueResolver.java index 119874990d..bf2c2ce964 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/StringValueResolver.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/StringValueResolver.java @@ -29,7 +29,7 @@ import org.apache.logging.log4j.plugins.di.Key; */ @FunctionalInterface public interface StringValueResolver { - Key<StringValueResolver> KEY = new Key<>() {}; + Key<StringValueResolver> KEY = Key.forClass(StringValueResolver.class); StringValueResolver NOOP = s -> s; diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java index 43ef3d6289..0a792a7e3d 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java @@ -26,6 +26,8 @@ import java.util.Arrays; import java.util.Map; import java.util.Objects; import org.apache.logging.log4j.util.Cast; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; /** * Utility class for working with Java {@link Type}s and derivatives. This class is adapted heavily from the @@ -315,4 +317,35 @@ public final class TypeUtil { } return false; } + + public static ParameterizedType createParameterizedType(final Type rawType, final Type... actualTypeArguments) { + return new SyntheticParameterizedType(rawType, actualTypeArguments, null); + } + + @NullMarked + private record SyntheticParameterizedType(Type rawType, Type[] actualTypeArguments, @Nullable Type ownerType) + implements ParameterizedType { + @Override + public Type[] getActualTypeArguments() { + return actualTypeArguments.clone(); + } + + @Override + public Type getRawType() { + return rawType; + } + + @Override + public @Nullable Type getOwnerType() { + return ownerType; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ParameterizedType type + && Objects.equals(rawType, type.getRawType()) + && Objects.equals(ownerType, type.getOwnerType()) + && Arrays.equals(actualTypeArguments, type.getActualTypeArguments()); + } + } }
