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/09 01:37:21 UTC

[logging-log4j2] branch mean-bean-machine updated (37e122b -> b72de60)

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

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


    from 37e122b  Simplify InjectionFactory into Injector
     new 4bcdc58  Update exceptions
     new b72de60  Simplify producer code and optimizations

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../plugins/defaults/bean/AbstractProducer.java    | 25 ++++++++++---------
 .../plugins/defaults/bean/DefaultBeanManager.java  | 28 ++++++++--------------
 .../bean/DefaultInitializationContext.java         |  2 +-
 .../plugins/defaults/bean/DefaultInjector.java     |  2 +-
 .../log4j/plugins/defaults/bean/FieldProducer.java | 18 +++++++-------
 .../plugins/defaults/bean/MethodProducer.java      | 25 ++++++++++---------
 .../log4j/plugins/spi/DefinitionException.java     | 12 ++++------
 .../log4j/plugins/spi/IllegalProductException.java |  4 ----
 .../log4j/plugins/spi/InitializationException.java |  4 ----
 .../log4j/plugins/spi/ResolutionException.java     |  4 ----
 .../plugins/spi/bean/InitializationContext.java    |  4 ++--
 .../logging/log4j/plugins/spi/bean/Injector.java   |  2 +-
 .../logging/log4j/plugins/spi/model/Variable.java  |  5 ++++
 13 files changed, 59 insertions(+), 76 deletions(-)
 copy log4j-1.2-api/src/main/java/org/apache/log4j/spi/OptionHandler.java => log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/DefinitionException.java (80%)


[logging-log4j2] 01/02: Update exceptions

Posted by ma...@apache.org.
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 4bcdc583400a484c831e5a70453c66ecd0548640
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Sun Mar 8 20:31:38 2020 -0500

    Update exceptions
    
    Signed-off-by: Matt Sicker <bo...@gmail.com>
---
 .../spi/{ResolutionException.java => DefinitionException.java}    | 8 ++------
 .../apache/logging/log4j/plugins/spi/IllegalProductException.java | 4 ----
 .../apache/logging/log4j/plugins/spi/InitializationException.java | 4 ----
 .../org/apache/logging/log4j/plugins/spi/ResolutionException.java | 4 ----
 4 files changed, 2 insertions(+), 18 deletions(-)

diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/ResolutionException.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/DefinitionException.java
similarity index 79%
copy from log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/ResolutionException.java
copy to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/DefinitionException.java
index 84617cb..3376a92 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/ResolutionException.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/DefinitionException.java
@@ -17,12 +17,8 @@
 
 package org.apache.logging.log4j.plugins.spi;
 
-public class ResolutionException extends InjectionException {
-    public ResolutionException(final String message) {
+public class DefinitionException extends InjectionException {
+    public DefinitionException(final String message) {
         super(message);
     }
-
-    public ResolutionException(final String message, final Throwable cause) {
-        super(message, cause);
-    }
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/IllegalProductException.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/IllegalProductException.java
index 8d1fc7d3..5a12068 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/IllegalProductException.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/IllegalProductException.java
@@ -21,8 +21,4 @@ public class IllegalProductException extends InjectionException {
     public IllegalProductException(final String message) {
         super(message);
     }
-
-    public IllegalProductException(final String message, final Throwable cause) {
-        super(message, cause);
-    }
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/InitializationException.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/InitializationException.java
index 8c11613..d547f8d 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/InitializationException.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/InitializationException.java
@@ -18,10 +18,6 @@
 package org.apache.logging.log4j.plugins.spi;
 
 public class InitializationException extends InjectionException {
-    public InitializationException(final String message) {
-        super(message);
-    }
-
     public InitializationException(final String message, final Throwable cause) {
         super(message, cause);
     }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/ResolutionException.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/ResolutionException.java
index 84617cb..1158d23 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/ResolutionException.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/ResolutionException.java
@@ -21,8 +21,4 @@ public class ResolutionException extends InjectionException {
     public ResolutionException(final String message) {
         super(message);
     }
-
-    public ResolutionException(final String message, final Throwable cause) {
-        super(message, cause);
-    }
 }


[logging-log4j2] 02/02: Simplify producer code and optimizations

Posted by ma...@apache.org.
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 b72de60cbd84fb259840ae1877016f435d11cba2
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Sun Mar 8 20:32:45 2020 -0500

    Simplify producer code and optimizations
    
    Signed-off-by: Matt Sicker <bo...@gmail.com>
---
 .../plugins/defaults/bean/AbstractProducer.java    | 25 ++++++++++---------
 .../plugins/defaults/bean/DefaultBeanManager.java  | 28 ++++++++--------------
 .../bean/DefaultInitializationContext.java         |  2 +-
 .../plugins/defaults/bean/DefaultInjector.java     |  2 +-
 .../log4j/plugins/defaults/bean/FieldProducer.java | 18 +++++++-------
 .../plugins/defaults/bean/MethodProducer.java      | 25 ++++++++++---------
 .../plugins/spi/bean/InitializationContext.java    |  4 ++--
 .../logging/log4j/plugins/spi/bean/Injector.java   |  2 +-
 .../logging/log4j/plugins/spi/model/Variable.java  |  5 ++++
 9 files changed, 54 insertions(+), 57 deletions(-)

diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducer.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducer.java
index 9882f9e..5781a2b 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducer.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducer.java
@@ -29,31 +29,30 @@ import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Objects;
 
-abstract class AbstractProducer<D, T> implements Producer<T> {
+abstract class AbstractProducer<P, T> implements Producer<T> {
     private final BeanManager beanManager;
-
-    private final Bean<D> declaringBean;
-    private final MetaMethod<D, ?> disposerMethod;
+    private final Bean<P> producerBean;
+    private final MetaMethod<P, ?> disposerMethod;
     private final Collection<InjectionPoint<?>> disposerInjectionPoints;
     final Injector injector;
 
-    AbstractProducer(final BeanManager beanManager, final Bean<D> declaringBean, final MetaMethod<D, ?> disposerMethod,
+    AbstractProducer(final BeanManager beanManager, final Bean<P> producerBean, final MetaMethod<P, ?> disposerMethod,
                      final Collection<InjectionPoint<?>> disposerInjectionPoints) {
         this.beanManager = beanManager;
-        this.declaringBean = declaringBean;
+        this.producerBean = producerBean;
         this.disposerMethod = disposerMethod;
         this.disposerInjectionPoints = Objects.requireNonNull(disposerInjectionPoints);
         this.injector = new DefaultInjector(beanManager);
     }
 
     // context is managed separately as the declaring instance is only used for producing the object and is not a dependent of the bean
-    InitializationContext<D> createContext() {
-        return beanManager.createInitializationContext(declaringBean);
+    InitializationContext<P> createContext() {
+        return beanManager.createInitializationContext(producerBean);
     }
 
-    D getDeclaringInstance(final InitializationContext<D> context) {
-        return context.getIncompleteInstance(declaringBean).orElseGet(() ->
-                beanManager.getValue(declaringBean, context.createIndependentContext(declaringBean)));
+    P getProducerInstance(final InitializationContext<P> context) {
+        return context.getIncompleteInstance(producerBean).orElseGet(() ->
+                beanManager.getValue(producerBean, context.createProducerContext(producerBean)));
     }
 
     abstract Type getType();
@@ -66,8 +65,8 @@ abstract class AbstractProducer<D, T> implements Producer<T> {
     public void dispose(final T instance) {
         if (hasDisposerMethod()) {
             // as producer and disposer bean is unrelated to this bean, we need to recreate it on demand
-            try (final InitializationContext<D> context = createContext()) {
-                final D declaringInstance = disposerMethod.isStatic() ? null : getDeclaringInstance(context);
+            try (final InitializationContext<P> context = createContext()) {
+                final P declaringInstance = disposerMethod.isStatic() ? null : getProducerInstance(context);
                 injector.dispose(declaringInstance, disposerMethod, disposerInjectionPoints, instance, context);
             }
         }
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 d759f72..d59a176 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
@@ -381,7 +381,7 @@ public class DefaultBeanManager implements BeanManager {
                 .orElseThrow(() -> new UnsatisfiedBeanException(point));
         final Optional<T> existingValue = point.getBean()
                 .filter(bean -> !bean.equals(resolvedBean))
-                .flatMap(bean -> getExistingInjectableValue(resolvedBean, bean, parentContext));
+                .flatMap(bean -> getExistingValue(resolvedBean, bean, parentContext));
         if (existingValue.isPresent()) {
             return existingValue;
         }
@@ -390,25 +390,17 @@ public class DefaultBeanManager implements BeanManager {
         return Optional.of(getValue(resolvedBean, context));
     }
 
-    private <T> Optional<T> getExistingInjectableValue(final Bean<T> resolvedBean, final Bean<?> pointBean,
-                                                       final InitializationContext<?> parentContext) {
-        if (resolvedBean.getScopeType() != Singleton.class) {
-            return Optional.empty();
-        }
-        final Optional<Bean<?>> bean;
-        if (pointBean.isDependentScoped() && !resolvedBean.isDependentScoped()) {
-            bean = parentContext.getNonDependentScopedDependent();
+    private <T> Optional<T> getExistingValue(final Bean<T> resolvedBean, final Bean<?> pointBean,
+                                             final InitializationContext<?> parentContext) {
+        if (!pointBean.isDependentScoped() || parentContext.getNonDependentScopedDependent().isPresent()) {
+            final Optional<T> incompleteInstance = parentContext.getIncompleteInstance(resolvedBean);
+            if (incompleteInstance.isPresent()) {
+                return incompleteInstance;
+            }
+            return getScopeContext(resolvedBean.getScopeType()).getIfExists(resolvedBean);
         } else {
-            bean = Optional.of(pointBean);
+            return Optional.empty();
         }
-        return bean.filter(b -> Singleton.class == b.getScopeType())
-                .flatMap(b -> {
-                    final Optional<T> incompleteInstance = parentContext.getIncompleteInstance(resolvedBean);
-                    if (incompleteInstance.isPresent()) {
-                        return incompleteInstance;
-                    }
-                    return getScopeContext(resolvedBean.getScopeType()).getIfExists(resolvedBean);
-                });
     }
 
     @Override
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java
index 962c61c..3ed8893 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java
@@ -89,7 +89,7 @@ public class DefaultInitializationContext<T> implements InitializationContext<T>
     }
 
     @Override
-    public <S> InitializationContext<S> createIndependentContext(final Bean<S> bean) {
+    public <S> InitializationContext<S> createProducerContext(final Bean<S> bean) {
         return new DefaultInitializationContext<>(bean, incompleteInstances == null ? null : new ConcurrentHashMap<>(incompleteInstances));
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjector.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjector.java
index 0c9a2e6..0d12b6f 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjector.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjector.java
@@ -57,7 +57,7 @@ public class DefaultInjector implements Injector {
 
     @Override
     public <D, T> T produce(final D producerInstance, final MetaMethod<D, T> producerMethod,
-                            final Collection<InjectionPoint<?>> points, final InitializationContext<T> context) {
+                            final Collection<InjectionPoint<?>> points, final InitializationContext<D> context) {
         return producerMethod.invoke(producerInstance, createArguments(producerMethod.getParameters(), points, context, null));
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducer.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducer.java
index 2555e50..9424eb2 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducer.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducer.java
@@ -28,12 +28,12 @@ import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Collections;
 
-class FieldProducer<D, T> extends AbstractProducer<D, T> {
-    private final MetaField<D, T> field;
+class FieldProducer<P, T> extends AbstractProducer<P, T> {
+    private final MetaField<P, T> field;
 
-    FieldProducer(final BeanManager beanManager, final Bean<D> declaringBean, final MetaField<D, T> field,
-                  final MetaMethod<D, ?> disposerMethod, final Collection<InjectionPoint<?>> disposerInjectionPoints) {
-        super(beanManager, declaringBean, disposerMethod, disposerInjectionPoints);
+    FieldProducer(final BeanManager beanManager, final Bean<P> producerBean, final MetaField<P, T> field,
+                  final MetaMethod<P, ?> disposerMethod, final Collection<InjectionPoint<?>> disposerInjectionPoints) {
+        super(beanManager, producerBean, disposerMethod, disposerInjectionPoints);
         this.field = field;
     }
 
@@ -44,9 +44,11 @@ class FieldProducer<D, T> extends AbstractProducer<D, T> {
 
     @Override
     public T produce(final InitializationContext<T> context) {
-        try (final InitializationContext<D> parentContext = createContext()) {
-            final D declaringInstance = field.isStatic() ? null : getDeclaringInstance(parentContext);
-            return field.get(declaringInstance);
+        if (field.isStatic()) {
+            return field.get(null);
+        }
+        try (final InitializationContext<P> parentContext = createContext()) {
+            return field.get(getProducerInstance(parentContext));
         }
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducer.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducer.java
index 4261951..1d13338 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducer.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducer.java
@@ -17,7 +17,7 @@
 
 package org.apache.logging.log4j.plugins.defaults.bean;
 
-import org.apache.logging.log4j.plugins.spi.InjectionException;
+import org.apache.logging.log4j.plugins.spi.DefinitionException;
 import org.apache.logging.log4j.plugins.spi.bean.Bean;
 import org.apache.logging.log4j.plugins.spi.bean.BeanManager;
 import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
@@ -27,17 +27,16 @@ import org.apache.logging.log4j.plugins.spi.model.MetaMethod;
 import java.lang.reflect.Type;
 import java.util.Collection;
 
-class MethodProducer<D, T> extends AbstractProducer<D, T> {
-    private final MetaMethod<D, T> producerMethod;
+class MethodProducer<P, T> extends AbstractProducer<P, T> {
+    private final MetaMethod<P, T> producerMethod;
     private final Collection<InjectionPoint<?>> producerInjectionPoints;
 
-    MethodProducer(final BeanManager beanManager, final Bean<D> declaringBean,
-                   final MetaMethod<D, T> producerMethod, final Collection<InjectionPoint<?>> producerInjectionPoints,
-                   final MetaMethod<D, ?> disposerMethod, final Collection<InjectionPoint<?>> disposerInjectionPoints) {
-        super(beanManager, declaringBean, disposerMethod, disposerInjectionPoints);
-        if (!producerMethod.isStatic() && declaringBean == null) {
-            // TODO: more informative error message
-            throw new InjectionException("Instance method annotated @Produces must be associated with a declaring bean");
+    MethodProducer(final BeanManager beanManager, final Bean<P> producerBean,
+                   final MetaMethod<P, T> producerMethod, final Collection<InjectionPoint<?>> producerInjectionPoints,
+                   final MetaMethod<P, ?> disposerMethod, final Collection<InjectionPoint<?>> disposerInjectionPoints) {
+        super(beanManager, producerBean, disposerMethod, disposerInjectionPoints);
+        if (!producerMethod.isStatic() && producerBean == null) {
+            throw new DefinitionException("Producer instance method must be in a bean");
         }
         this.producerMethod = producerMethod;
         this.producerInjectionPoints = producerInjectionPoints;
@@ -50,9 +49,9 @@ class MethodProducer<D, T> extends AbstractProducer<D, T> {
 
     @Override
     public T produce(final InitializationContext<T> context) {
-        try (final InitializationContext<D> parentContext = createContext()) {
-            final D declaringInstance = producerMethod.isStatic() ? null : getDeclaringInstance(parentContext);
-            return injector.produce(declaringInstance, producerMethod, producerInjectionPoints, context);
+        try (final InitializationContext<P> parentContext = createContext()) {
+            final P declaringInstance = producerMethod.isStatic() ? null : getProducerInstance(parentContext);
+            return injector.produce(declaringInstance, producerMethod, producerInjectionPoints, parentContext);
         }
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/InitializationContext.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/InitializationContext.java
index b13b849..aae4dda 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/InitializationContext.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/InitializationContext.java
@@ -41,10 +41,10 @@ public interface InitializationContext<T> extends AutoCloseable {
     <S> Optional<S> getIncompleteInstance(Bean<S> bean);
 
     // dependent contexts share the same incomplete instances
-    <S> InitializationContext<S> createDependentContext(Bean<S> bean);
+    <D> InitializationContext<D> createDependentContext(Bean<D> bean);
 
     // independent contexts are used by producers to get their declaring bean separately
-    <S> InitializationContext<S> createIndependentContext(Bean<S> bean);
+    <P> InitializationContext<P> createProducerContext(Bean<P> bean);
 
     /**
      * Destroys all dependent objects by propagating them to {@link Bean#destroy(Object, InitializationContext)}.
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Injector.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Injector.java
index 0d86baf..a2c0c4f 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Injector.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Injector.java
@@ -29,7 +29,7 @@ public interface Injector {
                     final InitializationContext<T> context);
 
     <D, T> T produce(final D producerInstance, final MetaMethod<D, T> producerMethod,
-                     final Collection<InjectionPoint<?>> points, final InitializationContext<T> context);
+                     final Collection<InjectionPoint<?>> points, final InitializationContext<D> context);
 
     <T> void dispose(final T disposerInstance, final MetaMethod<T, ?> disposerMethod,
                      final Collection<InjectionPoint<?>> points, final Object instance,
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/Variable.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/Variable.java
index c11748d..1cc9186 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/Variable.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/Variable.java
@@ -18,6 +18,7 @@
 package org.apache.logging.log4j.plugins.spi.model;
 
 import org.apache.logging.log4j.plugins.api.Dependent;
+import org.apache.logging.log4j.plugins.api.Singleton;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 
 import java.lang.annotation.Annotation;
@@ -43,4 +44,8 @@ public interface Variable<T> {
     default boolean isDependentScoped() {
         return getScopeType() == Dependent.class;
     }
+
+    default boolean isSingletonScoped() {
+        return getScopeType() == Singleton.class;
+    }
 }