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 2020/03/22 22:14:47 UTC

[logging-log4j2] 01/02: Split bean loading and validation

This is an automated email from the ASF dual-hosted git repository.

mattsicker pushed a commit to branch mean-bean-machine
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 5138f527eaee7fe34c7c2f1bbd1f479e276fcd4c
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Sun Mar 22 14:29:31 2020 -0500

    Split bean loading and validation
    
    Signed-off-by: Matt Sicker <bo...@gmail.com>
---
 .../plugins/defaults/bean/DefaultBeanManager.java  |  3 ++-
 .../log4j/plugins/spi/bean/BeanManager.java        | 26 +++++++++++++++-------
 .../log4j/plugins/test/BeanJUnit4Runner.java       |  6 ++---
 3 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanManager.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanManager.java
index 46afdbf..5de7ec8 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanManager.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanManager.java
@@ -231,7 +231,8 @@ public class DefaultBeanManager implements BeanManager {
         }
     }
 
-    private void validateInjectionPoint(final InjectionPoint point) {
+    @Override
+    public void validateInjectionPoint(final InjectionPoint point) {
         final MetaElement element = point.getElement();
         if (element.isAnnotationPresent(Produces.class)) {
             throw new DefinitionException("Cannot inject into a @Produces element: " + element);
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/BeanManager.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/BeanManager.java
index acd772e..9df22e7 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/BeanManager.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/BeanManager.java
@@ -30,8 +30,8 @@ import java.util.Optional;
 public interface BeanManager extends AutoCloseable {
 
     /**
-     * Loads beans from the given classes. This looks for injectable classes and producers, validates them, registers
-     * them in this manager, then returns the loaded beans.
+     * Loads beans from the given classes. This looks for injectable classes and producers in the provided classes,
+     * loads them into this manager, and returns the loaded beans.
      *
      * @param beanClasses classes to load beans from
      * @return beans loaded from the given classes
@@ -39,25 +39,35 @@ public interface BeanManager extends AutoCloseable {
     Collection<Bean<?>> loadBeans(final Collection<Class<?>> beanClasses);
 
     /**
-     * Loads beans from the given classes. This looks for injectable classes and producers, validates them, registers
-     * them in this manager, then returns the loaded beans.
+     * Loads beans from the given classes. This looks for injectable classes and producers, registers them in this
+     * manager, validates them, then returns the validated beans.
      *
      * @param beanClasses classes to load beans from
      * @return beans loaded from the given classes
+     * @throws ValidationException if any beans have validation errors
      */
-    default Collection<Bean<?>> loadBeans(final Class<?>... beanClasses) {
-        return loadBeans(Arrays.asList(beanClasses));
+    default Collection<Bean<?>> loadAndValidateBeans(final Class<?>... beanClasses) {
+        final Collection<Bean<?>> beans = loadBeans(Arrays.asList(beanClasses));
+        validateBeans(beans);
+        return beans;
     }
 
     /**
      * Validates beans and throws a {@link ValidationException} if there are any errors.
      *
      * @param beans beans to check for validation errors
+     * @throws ValidationException if any beans have validation errors
      */
     void validateBeans(final Iterable<Bean<?>> beans);
 
-    // TODO: re-add query methods for beans as needed
-//    Collection<Bean<?>> getBeans();
+    /**
+     * Validates the given injection point.
+     *
+     * @param point injection point to validate
+     * @throws org.apache.logging.log4j.plugins.spi.DefinitionException      if the injection point is improperly defined
+     * @throws org.apache.logging.log4j.plugins.spi.UnsatisfiedBeanException if no beans can satisfy the injection point
+     */
+    void validateInjectionPoint(InjectionPoint point);
 
     /**
      * Creates an InitializationContext for a given Bean instance for use in dependency injection SPIs.
diff --git a/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/test/BeanJUnit4Runner.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/test/BeanJUnit4Runner.java
index 7376ab7..b1a2eb7 100644
--- a/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/test/BeanJUnit4Runner.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/test/BeanJUnit4Runner.java
@@ -92,10 +92,10 @@ public class BeanJUnit4Runner extends BlockJUnit4ClassRunner {
         injector = new DefaultInjector(beanManager);
         final WithBeans testClassBeans = getTestClass().getAnnotation(WithBeans.class);
         if (testClassBeans != null) {
-            beanManager.loadBeans(testClassBeans.value());
+            beanManager.loadAndValidateBeans(testClassBeans.value());
         }
         final Class<T> testClass = TypeUtil.cast(getTestClass().getJavaClass());
-        final Optional<Bean<T>> testBean = beanManager.loadBeans(testClass).stream()
+        final Optional<Bean<T>> testBean = beanManager.loadAndValidateBeans(testClass).stream()
                 .filter(bean -> bean.hasMatchingType(testClass))
                 .findAny()
                 .map(TypeUtil::cast);
@@ -118,7 +118,7 @@ public class BeanJUnit4Runner extends BlockJUnit4ClassRunner {
                 try (final InitializationContext<T> context = beanManager.createInitializationContext(testClassBean)) {
                     final WithBeans methodBeans = method.getAnnotation(WithBeans.class);
                     if (methodBeans != null) {
-                        beanManager.loadBeans(methodBeans.value());
+                        beanManager.loadAndValidateBeans(methodBeans.value());
                     }
                     final Class<T> testClass = TypeUtil.cast(getTestClass().getJavaClass());
                     final MetaClass<T> metaClass = elementManager.getMetaClass(testClass);