This is an automated email from the ASF dual-hosted git repository. mattsicker pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 94ce85247bce44a8f0f60bd355bb4d64b32346b1 Author: Matt Sicker <[email protected]> AuthorDate: Tue Jan 2 16:29:15 2024 -0600 Clean up some nullability and update syntax --- .../config/ConfigurationAwarePostProcessor.java | 7 ++++-- .../config/LoggerContextAwarePostProcessor.java | 6 +++-- .../plugins/di/ConfigurableInstanceFactory.java | 2 +- .../log4j/plugins/di/DefaultInstanceFactory.java | 26 ++++++++++++++++------ .../log4j/plugins/di/spi/DependencyChains.java | 11 ++++++--- .../log4j/plugins/di/spi/ReflectionAgent.java | 17 ++++++++------ .../log4j/plugins/di/spi/ResolvableKey.java | 4 +++- .../logging/log4j/plugins/di/spi/package-info.java | 2 ++ 8 files changed, 52 insertions(+), 23 deletions(-) diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationAwarePostProcessor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationAwarePostProcessor.java index 2eda892e30..5df8196d09 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationAwarePostProcessor.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationAwarePostProcessor.java @@ -17,9 +17,12 @@ package org.apache.logging.log4j.core.config; import java.util.function.Supplier; + +import org.apache.logging.log4j.lang.NullMarked; import org.apache.logging.log4j.plugins.di.spi.InstancePostProcessor; import org.apache.logging.log4j.plugins.di.spi.ResolvableKey; +@NullMarked public class ConfigurationAwarePostProcessor implements InstancePostProcessor { private final Supplier<? extends Configuration> configurationSupplier; @@ -29,8 +32,8 @@ public class ConfigurationAwarePostProcessor implements InstancePostProcessor { @Override public <T> T postProcessBeforeInitialization(final ResolvableKey<T> resolvableKey, final T instance) { - if (instance instanceof ConfigurationAware) { - ((ConfigurationAware) instance).setConfiguration(configurationSupplier.get()); + if (instance instanceof ConfigurationAware aware) { + aware.setConfiguration(configurationSupplier.get()); } return instance; } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerContextAwarePostProcessor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerContextAwarePostProcessor.java index c5976edb5d..b2dfbcd0e4 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerContextAwarePostProcessor.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerContextAwarePostProcessor.java @@ -18,9 +18,11 @@ package org.apache.logging.log4j.core.config; import java.lang.ref.WeakReference; import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.lang.NullMarked; import org.apache.logging.log4j.plugins.di.spi.InstancePostProcessor; import org.apache.logging.log4j.plugins.di.spi.ResolvableKey; +@NullMarked public class LoggerContextAwarePostProcessor implements InstancePostProcessor { private final WeakReference<LoggerContext> loggerContextRef; @@ -30,9 +32,9 @@ public class LoggerContextAwarePostProcessor implements InstancePostProcessor { @Override public <T> T postProcessBeforeInitialization(final ResolvableKey<T> resolvableKey, final T instance) { - if (instance instanceof LoggerContextAware) { + if (instance instanceof LoggerContextAware aware) { final LoggerContext loggerContext = loggerContextRef.get(); - ((LoggerContextAware) instance).setLoggerContext(loggerContext); + aware.setLoggerContext(loggerContext); } return instance; } diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactory.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactory.java index a1e3079a79..da7f8bb4ba 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactory.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactory.java @@ -156,7 +156,7 @@ public interface ConfigurableInstanceFactory extends InstanceFactory { * @param value value to validate * @throws ConstraintValidationException if validation fails */ - default void validate(final AnnotatedElement element, final String name, final Object value) { + default void validate(final AnnotatedElement element, final String name, final @Nullable Object value) { // TODO(ms): can maybe move logic into a post processor final long errors = AnnotationUtil.findAnnotatedAnnotations(element, Constraint.class) .map(this::initialize) diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInstanceFactory.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInstanceFactory.java index 25c6490b2b..e9d409b737 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInstanceFactory.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInstanceFactory.java @@ -133,7 +133,11 @@ public class DefaultInstanceFactory implements ConfigurableInstanceFactory { throw new NotInjectableException(resolvableKey); } return () -> { - var instance = getInjectableInstance(resolvableKey); + @Nullable T instance = getInjectableInstance(resolvableKey); + // TODO(ms): consider throwing exception here + if (instance == null) { + return null; + } instance = postProcessBeforeInitialization(resolvableKey, instance); injectMembers(key, instance, resolvableKey.getDependencyChain()); instance = postProcessAfterInitialization(resolvableKey, instance); @@ -145,7 +149,7 @@ public class DefaultInstanceFactory implements ConfigurableInstanceFactory { }; } - protected <T> T getInjectableInstance(final ResolvableKey<T> resolvableKey) { + protected <T> @Nullable T getInjectableInstance(final ResolvableKey<T> resolvableKey) { final Class<T> rawType = resolvableKey.getRawType(); validate(rawType, resolvableKey.getName(), rawType); final Executable factory = BeanUtils.getInjectableFactory(resolvableKey); @@ -173,9 +177,11 @@ public class DefaultInstanceFactory implements ConfigurableInstanceFactory { return value; } - protected <T> T invokeFactory(final Executable factory, final Object... arguments) { - if (factory instanceof Method) { - return Cast.cast(agent.invokeMethod((Method) factory, null, arguments)); + protected <T> @Nullable T invokeFactory(final Executable factory, final Object... arguments) { + if (factory instanceof Method method) { + final Object result = agent.invokeMethod(method, null, arguments); + // TODO(ms): if null, consider throwing exception here + return Cast.cast(result); } else { return agent.newInstance(Cast.cast(factory), arguments); } @@ -248,7 +254,7 @@ public class DefaultInstanceFactory implements ConfigurableInstanceFactory { .map(Conditional::value) .collect(Collectors.toSet()); final List<? extends Condition> globalConditions = - conditionalClasses.stream().map(this::getInstance).collect(Collectors.toList()); + conditionalClasses.stream().map(this::getInstance).toList(); final ConditionContext context = ConditionContext.of(this); final List<Method> factoryMethods = new ArrayList<>(); for (final Method method : AnnotationUtil.getDeclaredMethodsMetaAnnotatedWith(bundleClass, FactoryType.class)) { @@ -285,7 +291,12 @@ public class DefaultInstanceFactory implements ConfigurableInstanceFactory { final Supplier<T> unscoped = () -> { final Object[] arguments = argumentFactories.stream().map(Supplier::get).toArray(); - T instance = Cast.cast(agent.invokeMethod(method, bundleInstance, arguments)); + final Object result = agent.invokeMethod(method, bundleInstance, arguments); + if (result == null) { + // TODO(ms): if null, consider throwing exception here + return null; + } + T instance = Cast.cast(result); instance = postProcessBeforeInitialization(resolvableKey, instance); injectMembers(primaryKey, instance, DependencyChain.empty()); return postProcessAfterInitialization(resolvableKey, instance); @@ -370,6 +381,7 @@ public class DefaultInstanceFactory implements ConfigurableInstanceFactory { final ResolvableKey<T> resolvableKey = ResolvableKey.of(point.getKey(), point.getAliases()); try { final T value = getInstance(resolvableKey); + // TODO(ms): if null, consider throwing exception here if (value != null) { agent.setFieldValue(field, instance, value); } diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/DependencyChains.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/DependencyChains.java index ae791ade80..4b83289bc7 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/DependencyChains.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/DependencyChains.java @@ -18,8 +18,10 @@ package org.apache.logging.log4j.plugins.di.spi; import java.util.Collections; import java.util.Iterator; +import java.util.NoSuchElementException; import java.util.Objects; import java.util.StringJoiner; +import org.apache.logging.log4j.lang.Nullable; import org.apache.logging.log4j.plugins.di.Key; class DependencyChains { @@ -68,13 +70,13 @@ class DependencyChains { private static final class LinkedChain implements DependencyChain { private final Key<?> head; - private final LinkedChain tail; + private final @Nullable LinkedChain tail; private LinkedChain(final Key<?> head) { this(head, null); } - private LinkedChain(final Key<?> head, final LinkedChain tail) { + private LinkedChain(final Key<?> head, final @Nullable LinkedChain tail) { this.head = head; this.tail = tail; } @@ -126,7 +128,7 @@ class DependencyChains { } private static final class Iter implements Iterator<Key<?>> { - private LinkedChain current; + private @Nullable LinkedChain current; private Iter(final LinkedChain current) { this.current = current; @@ -139,6 +141,9 @@ class DependencyChains { @Override public Key<?> next() { + if (current == null) { + throw new NoSuchElementException(); + } final Key<?> head = current.head; current = current.tail; return head; diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/ReflectionAgent.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/ReflectionAgent.java index 5e5500d1d8..33be6f2140 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/ReflectionAgent.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/ReflectionAgent.java @@ -25,12 +25,15 @@ import java.lang.reflect.Member; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Objects; +import org.apache.logging.log4j.lang.NonNull; +import org.apache.logging.log4j.lang.NullUnmarked; /** * Provides reflection operations using the calling context of another class. This is useful for centralizing * which module to open oneself to instead of this Log4j Plugins module. */ @FunctionalInterface +@NullUnmarked public interface ReflectionAgent { /** @@ -41,7 +44,7 @@ public interface ReflectionAgent { * @throws InaccessibleObjectException if this cannot access the provided object * @throws SecurityException if the request is denied by the security manager */ - void makeAccessible(final AccessibleObject object); + void makeAccessible(final @NonNull AccessibleObject object); private <M extends AccessibleObject & Member> void makeAccessible(final M member, final Object instance) { Objects.requireNonNull(member, "member cannot be null"); @@ -55,7 +58,7 @@ public interface ReflectionAgent { } } - default Object getFieldValue(final Field field, final Object instance) { + default Object getFieldValue(final @NonNull Field field, final Object instance) { makeAccessible(field, instance); try { return field.get(instance); @@ -64,7 +67,7 @@ public interface ReflectionAgent { } } - default void setFieldValue(final Field field, final Object instance, final Object value) { + default void setFieldValue(final @NonNull Field field, final Object instance, final Object value) { makeAccessible(field, instance); try { field.set(instance, value); @@ -73,7 +76,7 @@ public interface ReflectionAgent { } } - default Object invokeMethod(final Method method, final Object instance, final Object... args) { + default Object invokeMethod(final @NonNull Method method, final Object instance, final Object... args) { makeAccessible(method, instance); try { return method.invoke(instance, args); @@ -84,7 +87,7 @@ public interface ReflectionAgent { } } - default <T> T newInstance(final Constructor<T> constructor, final Object... args) { + default <T> @NonNull T newInstance(final @NonNull Constructor<T> constructor, final Object... args) { makeAccessible(constructor, null); try { return constructor.newInstance(args); @@ -95,11 +98,11 @@ public interface ReflectionAgent { } } - default <T> T newInstance(final Class<T> clazz) { + default <T> @NonNull T newInstance(final @NonNull Class<T> clazz) { return newInstance(getDefaultConstructor(clazz)); } - private <T> Constructor<T> getDefaultConstructor(final Class<T> clazz) { + private <T> @NonNull Constructor<T> getDefaultConstructor(final @NonNull Class<T> clazz) { try { return clazz.getDeclaredConstructor(); } catch (final NoSuchMethodException | SecurityException e) { diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/ResolvableKey.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/ResolvableKey.java index f4f25a2c20..1cbf4d8d25 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/ResolvableKey.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/ResolvableKey.java @@ -20,6 +20,8 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.Collection; import java.util.List; + +import org.apache.logging.log4j.lang.Nullable; import org.apache.logging.log4j.plugins.di.Key; public class ResolvableKey<T> { @@ -53,7 +55,7 @@ public class ResolvableKey<T> { return key.getNamespace(); } - public Class<? extends Annotation> getQualifierType() { + public @Nullable Class<? extends Annotation> getQualifierType() { return key.getQualifierType(); } diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/package-info.java index 2a0acc66dc..e9b9e83d3d 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/package-info.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/package-info.java @@ -20,7 +20,9 @@ */ @Export @Version("1.0.0") +@NullMarked package org.apache.logging.log4j.plugins.di.spi; +import org.apache.logging.log4j.lang.NullMarked; import org.osgi.annotation.bundle.Export; import org.osgi.annotation.versioning.Version;
