You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/03/24 11:17:24 UTC

[isis] 01/02: ISIS-2586: in ServiceInjector#injectServicesInto(T domainObject) make domainObject nullable

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

danhaywood pushed a commit to branch release-2.0.0-M5-RC2
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 534d9b4b4e0de992754dfcbd146e8f86b00e74b9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 24 09:13:03 2021 +0100

    ISIS-2586: in ServiceInjector#injectServicesInto(T domainObject) make
    domainObject nullable
    
    (cherry picked from commit aa8afaf88195089e7707636cb1d1cf1f90126be3)
---
 .../applib/services/inject/ServiceInjector.java    | 39 +++-------------------
 .../metamodel/_testing/ServiceInjectorLegacy.java  | 15 +++++++--
 .../_testing/ServiceInjector_forTesting.java       |  6 +---
 .../metamodel/services/ServiceInjectorDefault.java | 34 ++++++++-----------
 4 files changed, 32 insertions(+), 62 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/inject/ServiceInjector.java b/api/applib/src/main/java/org/apache/isis/applib/services/inject/ServiceInjector.java
index ebd6107..6f9a305 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/inject/ServiceInjector.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/inject/ServiceInjector.java
@@ -18,12 +18,7 @@
  */
 package org.apache.isis.applib.services.inject;
 
-import java.util.NoSuchElementException;
-import java.util.function.Consumer;
-
-import org.springframework.beans.factory.InjectionPoint;
-
-import lombok.val;
+import javax.annotation.Nullable;
 
 /**
  * Resolves injection points using the
@@ -36,39 +31,13 @@ import lombok.val;
 public interface ServiceInjector {
 
     /**
-     * Injects domain services into the object, and calls the provided
-     * {@link Consumer} for any non-resolvable injection points.
-     *
-     * @param domainObject
-     * @param onNotResolvable
-     * @param <T>
-     * @return
-     */
-    <T> T injectServicesInto(final T domainObject, Consumer<InjectionPoint> onNotResolvable);
-
-    /**
-     * Injecs domain services into the object, and throws a
-     * {@link NoSuchElementException} for any injection points that cannot be resolved.
+     * Injects domain services into the object.
      *
      * @param domainObject
      * @param <T>
-     * @return
+     * @return domainObject with injection points resolved
      */
-    default <T> T injectServicesInto(final T domainObject) {
-
-        return injectServicesInto(domainObject, injectionPoint->{
-
-            val injectionPointName = injectionPoint.toString();
-            val requiredType = injectionPoint.getDeclaredType();
-            val msg = String
-                    .format("Could not resolve injection point [%s] in target '%s' of required type '%s'",
-                            injectionPointName,
-                            domainObject.getClass().getName(),
-                            requiredType);
-            throw new NoSuchElementException(msg);
-        });
+    <T> @Nullable T injectServicesInto(final @Nullable T domainObject);
 
-        // ...
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceInjectorLegacy.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceInjectorLegacy.java
index 418fada..3a7471d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceInjectorLegacy.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceInjectorLegacy.java
@@ -24,6 +24,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Map;
+import java.util.NoSuchElementException;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 
@@ -61,8 +62,18 @@ public class ServiceInjectorLegacy implements ServiceInjector {
     private final Map<Class<?>, Field[]> fieldsByClassCache = _Maps.newConcurrentHashMap();
 
     @Override
-    public <T> T injectServicesInto(T domainObject, Consumer<InjectionPoint> onNotResolvable) {
-        injectServices(domainObject, onNotResolvable);
+    public <T> T injectServicesInto(T domainObject) {
+        injectServices(domainObject, injectionPoint->{
+
+            val injectionPointName = injectionPoint.toString();
+            val requiredType = injectionPoint.getDeclaredType();
+            val msg = String
+                    .format("Could not resolve injection point [%s] in target '%s' of required type '%s'",
+                            injectionPointName,
+                            domainObject.getClass().getName(),
+                            requiredType);
+            throw new NoSuchElementException(msg);
+        });
         return domainObject;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceInjector_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceInjector_forTesting.java
index 902a15e..f2a0ed5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceInjector_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceInjector_forTesting.java
@@ -18,12 +18,8 @@
  */
 package org.apache.isis.core.metamodel._testing;
 
-import java.util.function.Consumer;
-
 import static java.util.Objects.requireNonNull;
 
-import org.springframework.beans.factory.InjectionPoint;
-
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
@@ -40,7 +36,7 @@ class ServiceInjector_forTesting implements ServiceInjector {
     private ServiceInjector delegate;
 
     @Override
-    public <T> T injectServicesInto(T domainObject, Consumer<InjectionPoint> onNotResolvable) {
+    public <T> T injectServicesInto(T domainObject) {
 
         if(delegate==null) {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceInjectorDefault.java
index 7b86b98..1ad3e78 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceInjectorDefault.java
@@ -18,12 +18,10 @@
  */
 package org.apache.isis.core.metamodel.services;
 
-import java.util.function.Consumer;
-
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.springframework.beans.factory.InjectionPoint;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
 import org.springframework.context.annotation.Primary;
@@ -33,6 +31,8 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 
+import lombok.RequiredArgsConstructor;
+
 /**
  * 
  * @since 2.0
@@ -43,29 +43,23 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 @Order(OrderPrecedence.EARLY)
 @Primary
 @Qualifier("Default")
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class ServiceInjectorDefault implements ServiceInjector {
 
     private final AutowireCapableBeanFactory autowireCapableBeanFactory;
 
-    @Inject
-    public ServiceInjectorDefault(AutowireCapableBeanFactory autowireCapableBeanFactory) {
-        this.autowireCapableBeanFactory = autowireCapableBeanFactory;
-    }
-
     @Override
-    public <T> T injectServicesInto(T domainObject, Consumer<InjectionPoint> onNotResolvable) {
-        injectServices(domainObject, onNotResolvable);
-        return domainObject;
-    }
-
-    // -- HELPERS
-
-    private void injectServices(final Object targetPojo, Consumer<InjectionPoint> onNotResolvable) {
-
-        autowireCapableBeanFactory.autowireBeanProperties(
-                targetPojo,
-                AutowireCapableBeanFactory.AUTOWIRE_NO, false);
+    public <T> @Nullable T injectServicesInto(final @Nullable T domainObject) {
         
+        if(domainObject!=null) {
+            
+            autowireCapableBeanFactory.autowireBeanProperties(
+                    domainObject,
+                    AutowireCapableBeanFactory.AUTOWIRE_NO, 
+                    /*dependencyCheck*/ false);    
+        }
+        
+        return domainObject;
     }