You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/08/31 06:02:54 UTC

[isis] branch master updated: ISIS-3167: obj spec: fixes injectable flag

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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 3d7eef8bc7 ISIS-3167: obj spec: fixes injectable flag
3d7eef8bc7 is described below

commit 3d7eef8bc700940e9793a4f55ae2bc091fcba6f1
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Aug 31 08:02:47 2022 +0200

    ISIS-3167: obj spec: fixes injectable flag
---
 .../config/beans/IsisBeanFactoryPostProcessorForSpring.java  |  2 +-
 .../org/apache/isis/core/config/beans/IsisBeanMetaData.java  |  6 +++---
 .../core/config/beans/IsisBeanTypeClassifierDefault.java     |  6 +++++-
 .../core/config/beans/IsisComponentScanInterceptorImpl.java  |  2 +-
 .../apache/isis/core/config/beans/ScannedTypeMetaData.java   |  5 +++--
 .../specloader/specimpl/dflt/ObjectSpecificationDefault.java | 12 +++++++++++-
 .../core/runtimeservices/factory/FactoryServiceDefault.java  |  2 +-
 7 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanFactoryPostProcessorForSpring.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanFactoryPostProcessorForSpring.java
index f671ee72b2..cc5ebb5b8d 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanFactoryPostProcessorForSpring.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanFactoryPostProcessorForSpring.java
@@ -100,7 +100,7 @@ implements
 
             isisComponentScanInterceptor.intercept(typeMetaData);
 
-            if(typeMetaData.isInjectable()) {
+            if(!typeMetaData.isVetoedForInjection()) {
 
                 val beanNameOverride = typeMetaData.getBeanNameOverride();
                 if(_Strings.isNotEmpty(beanNameOverride)) {
diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanMetaData.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanMetaData.java
index 863f1028ee..868634c0bc 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanMetaData.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanMetaData.java
@@ -45,9 +45,9 @@ public class IsisBeanMetaData {
          * Whether Spring should make that underlying bean injectable.
          * @implNote if not managed by Isis, let ultimately Spring decide
          */
-        public boolean isInjectable() {
-            return !isIsis()
-                    && !isNone();
+        public boolean isVetoedForInjection() {
+            return isIsis()
+                    || isNone();
         }
         /**
          * Whether we interfere with Spring's naming strategy.
diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java
index fd4f858626..5a4cef0ace 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java
@@ -50,12 +50,16 @@ implements IsisBeanTypeClassifier {
     private final Can<String> activeProfiles;
     private final Can<IsisBeanTypeClassifier> classifierPlugins = IsisBeanTypeClassifier.get();
 
+    // handle arbitrary types ...
     @SuppressWarnings("deprecation")
     @Override
     public IsisBeanMetaData classify(
             final @NonNull Class<?> type) {
 
-        // handle arbitrary types ...
+        //debug
+//        _Debug.onClassSimpleNameMatch(type, "class of interest", ()->{
+//            System.err.printf("classifying %s%n", type);
+//        });
 
         if(ClassUtils.isPrimitiveOrWrapper(type)
                 || type.isEnum()) {
diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisComponentScanInterceptorImpl.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisComponentScanInterceptorImpl.java
index 8ab9564075..8c415bd420 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisComponentScanInterceptorImpl.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisComponentScanInterceptorImpl.java
@@ -80,7 +80,7 @@ implements IsisComponentScanInterceptor {
         val correspondingClass = classOrFailure.getValue().get();
         val typeMeta = isisBeanTypeClassifier.classify(correspondingClass);
 
-        scanMeta.setInjectable(typeMeta.getManagedBy().isInjectable());
+        scanMeta.setVetoedForInjection(typeMeta.getManagedBy().isVetoedForInjection());
         if(typeMeta.getManagedBy().isBeanNameOverride()) {
             scanMeta.setBeanNameOverride(typeMeta.getLogicalType().getLogicalTypeName());
         }
diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/ScannedTypeMetaData.java b/core/config/src/main/java/org/apache/isis/core/config/beans/ScannedTypeMetaData.java
index acd4b249d8..d98e3075b1 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/beans/ScannedTypeMetaData.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/beans/ScannedTypeMetaData.java
@@ -46,9 +46,10 @@ final class ScannedTypeMetaData {
     @Getter @Setter private String beanNameOverride;
 
     /**
-     * Whether this type should be made available to resolve injection points.
+     * Whether this type is vetoed for injection,
+     * otherwise is made available for Spring to decide whether to use for injection.
      */
-    @Getter @Setter private boolean injectable = true;
+    @Getter @Setter private boolean vetoedForInjection = false;
 
     @Getter(lazy=true)
     private final Try<Class<?>> underlyingClass = resolveClass();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 4e5a97a166..e7d6e74589 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -101,7 +101,17 @@ implements FacetHolder {
                 typeMeta.getLogicalType().getLogicalTypeSimpleName(),
                 typeMeta.getBeanSort(), facetProcessor, postProcessor);
 
-        this.injectable = typeMeta.getManagedBy().isInjectable();
+        this.injectable = !typeMeta.getManagedBy().isVetoedForInjection()
+                && !typeMeta.getBeanSort().isAbstract()
+                && !typeMeta.getBeanSort().isValue()
+                && !typeMeta.getBeanSort().isEntity()
+                && !typeMeta.getBeanSort().isViewModel()
+                && !typeMeta.getBeanSort().isMixin()
+                && (typeMeta.getBeanSort().isManagedBeanAny()
+                        || mmc.getServiceRegistry()
+                                .lookupRegisteredBeanById(typeMeta.getLogicalType().getLogicalTypeName())
+                                .isPresent());
+
         this.classSubstitutorRegistry = classSubstitutorRegistry;
 
         // must install EncapsulationFacet (if any) and MemberAnnotationPolicyFacet (if any)
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/factory/FactoryServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/factory/FactoryServiceDefault.java
index 9afe40a229..1869fc0131 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/factory/FactoryServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/factory/FactoryServiceDefault.java
@@ -75,7 +75,7 @@ public class FactoryServiceDefault implements FactoryService {
     public <T> T get(final @NonNull Class<T> requiredType) {
         return isisSystemEnvironment.getIocContainer()
                 .get(requiredType)
-                .orElseThrow(_Exceptions::noSuchElement);
+                .orElseThrow(()->_Exceptions.noSuchElement("no an injectable type %s", requiredType));
     }
 
     @Override