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;

Reply via email to