You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2024/11/11 06:28:20 UTC

(causeway) 01/02: CAUSEWAY-2297: flattens CausewayBeanTypeRegistry

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

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

commit 7d4f5ea0ed17f1fa7b60a63e387b7efedb090a9a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Nov 11 06:36:41 2024 +0100

    CAUSEWAY-2297: flattens CausewayBeanTypeRegistry
---
 .../core/config/CausewayModuleCoreConfig.java      |   2 -
 .../CausewayBeanFactoryPostProcessorForSpring.java |   6 +-
 .../config/beans/CausewayBeanTypeRegistry.java     | 101 +++++++++++++---
 .../beans/CausewayBeanTypeRegistryDefault.java     | 128 ---------------------
 .../_testing/MetaModelContext_forTesting.java      |   3 +-
 .../bootstrapping/AutoConfigurationTest.java       |   2 -
 6 files changed, 89 insertions(+), 153 deletions(-)

diff --git a/core/config/src/main/java/org/apache/causeway/core/config/CausewayModuleCoreConfig.java b/core/config/src/main/java/org/apache/causeway/core/config/CausewayModuleCoreConfig.java
index 1c029f18f3f..cc418b57783 100644
--- a/core/config/src/main/java/org/apache/causeway/core/config/CausewayModuleCoreConfig.java
+++ b/core/config/src/main/java/org/apache/causeway/core/config/CausewayModuleCoreConfig.java
@@ -24,7 +24,6 @@ import org.springframework.context.annotation.Import;
 
 import org.apache.causeway.core.config.applib.RestfulPathProvider;
 import org.apache.causeway.core.config.beans.CausewayBeanFactoryPostProcessorForSpring;
-import org.apache.causeway.core.config.beans.CausewayBeanTypeRegistryDefault;
 import org.apache.causeway.core.config.converters.PatternsConverter;
 import org.apache.causeway.core.config.datasources.DataSourceIntrospectionService;
 import org.apache.causeway.core.config.environment.CausewayLocaleInitializer;
@@ -46,7 +45,6 @@ import org.apache.causeway.core.config.viewer.web.WebAppContextPath;
 
     // @Service
     DataSourceIntrospectionService.class,
-    CausewayBeanTypeRegistryDefault.class,
     CausewaySystemEnvironment.class,
     WebAppContextPath.class,
 })
diff --git a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanFactoryPostProcessorForSpring.java b/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanFactoryPostProcessorForSpring.java
index 991a7166795..5335565f307 100644
--- a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanFactoryPostProcessorForSpring.java
+++ b/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanFactoryPostProcessorForSpring.java
@@ -104,14 +104,14 @@ implements
                 : (causewayBeanTypeClassifier = CausewayBeanTypeClassifier.createInstance()); // JUnit support
     }
 
-    @Bean("causeway.bean-meta-data")
-    public Can<CausewayBeanMetaData> getComponentScanResult() {
+    @Bean
+    public CausewayBeanTypeRegistry getComponentScanResult() {
         if(log.isDebugEnabled()) {
             componentScanResult.forEach(type->{
                 log.debug("to be introspected: {}", type);
             });
         }
-        return componentScanResult;
+        return new CausewayBeanTypeRegistry(componentScanResult);
     }
 
 }
diff --git a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeRegistry.java b/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeRegistry.java
index d55365d3dc6..cfa13340905 100644
--- a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeRegistry.java
+++ b/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeRegistry.java
@@ -18,33 +18,67 @@
  */
 package org.apache.causeway.core.config.beans;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal.base._NullSafe;
+import org.apache.causeway.commons.internal.collections._Maps;
 
+import lombok.Getter;
 import lombok.NonNull;
 
 /**
  * Holds the set of domain services, persistent entities and fixture scripts etc., but not values.
  * @since 2.0
  */
-public interface CausewayBeanTypeRegistry {
+public class CausewayBeanTypeRegistry {
 
-    Optional<CausewayBeanMetaData> lookupIntrospectableType(Class<?> type);
-    Stream<CausewayBeanMetaData> streamIntrospectableTypes();
+    // -- CONSTRUCTOR
 
-    @NonNull Map<Class<?>, CausewayBeanMetaData> getManagedBeansContributing();
-    @NonNull Map<Class<?>, CausewayBeanMetaData> getEntityTypes();
-    @NonNull Map<Class<?>, CausewayBeanMetaData> getMixinTypes();
-    @NonNull Map<Class<?>, CausewayBeanMetaData> getViewModelTypes();
-    /** discovered per {@code @Value} annotation (vs. registered using a {@link ValueSemanticsProvider})*/
-    @NonNull Map<Class<?>, CausewayBeanMetaData> getDiscoveredValueTypes();
+    public CausewayBeanTypeRegistry(final @NonNull Can<CausewayBeanMetaData> introspectableTypes) {
+        this.introspectableTypes = introspectableTypes;
+
+        introspectableTypes.forEach(typeMeta->{
+
+            var cls = typeMeta.getCorrespondingClass();
+
+            introspectableTypesByClass.put(typeMeta.getCorrespondingClass(), typeMeta);
+
+            switch (typeMeta.getBeanSort()) {
+            case MANAGED_BEAN_CONTRIBUTING:
+                managedBeansContributing.put(cls, typeMeta);
+                return;
+            case MIXIN:
+                mixinTypes.put(cls, typeMeta);
+                return;
+            case ENTITY:
+                entityTypes.put(cls, typeMeta);
+                return;
+            case VIEW_MODEL:
+                viewModelTypes.put(cls, typeMeta);
+                return;
+            case VALUE:
+                discoveredValueTypes.put(cls, typeMeta);
+                return;
+
+            // skip introspection for these
+            case MANAGED_BEAN_NOT_CONTRIBUTING:
+            case COLLECTION:
+            case ABSTRACT: // <-- unexpected code reach
+            case VETOED:
+            case UNKNOWN:
+                return;
+            }
+        });
+
+    }
 
     // -- SHORTCUTS
 
-    default Stream<Class<?>> streamMixinTypes() {
+    public Stream<Class<?>> streamMixinTypes() {
         return getMixinTypes().keySet().stream();
     }
 
@@ -54,10 +88,8 @@ public interface CausewayBeanTypeRegistry {
      * If given type is part of the meta-model and is available for injection,
      * returns the <em>Managed Bean's</em> name (id) as
      * recognized by the IoC container.
-     *
-     * @param type
      */
-    default Optional<String> lookupManagedBeanNameForType(final Class<?> type) {
+    public Optional<String> lookupManagedBeanNameForType(final Class<?> type) {
         return Optional.ofNullable(getManagedBeansContributing().get(type))
                 .map(CausewayBeanMetaData::getBeanName);
     }
@@ -67,7 +99,7 @@ public interface CausewayBeanTypeRegistry {
      * If no (concrete) entity type is found, returns 'UNSPECIFIED'.
      * @implNote assumes that there can be only one persistence stack
      */
-    default PersistenceStack determineCurrentPersistenceStack() {
+    public PersistenceStack determineCurrentPersistenceStack() {
         return getEntityTypes().values().stream()
             .map(meta->meta.getPersistenceStack())
             .filter(Optional::isPresent)
@@ -77,4 +109,41 @@ public interface CausewayBeanTypeRegistry {
             .orElse(PersistenceStack.UNSPECIFIED);
     }
 
-}
\ No newline at end of file
+
+    /**
+     * (immutable) scan result, as used by the SpecificationLoader for introspection
+     */
+    private final Can<CausewayBeanMetaData> introspectableTypes;
+
+    private final Map<Class<?>, CausewayBeanMetaData> introspectableTypesByClass = _Maps.newHashMap();
+
+    // -- DISTINCT CATEGORIES OF BEAN SORTS
+
+    @Getter
+    private final Map<Class<?>, CausewayBeanMetaData> managedBeansContributing = new HashMap<>();
+
+    @Getter
+    private final Map<Class<?>, CausewayBeanMetaData> entityTypes = new HashMap<>();
+
+    @Getter
+    private final Map<Class<?>, CausewayBeanMetaData> mixinTypes = new HashMap<>();
+
+    @Getter
+    private final Map<Class<?>, CausewayBeanMetaData> viewModelTypes = new HashMap<>();
+
+    @Getter
+    private final Map<Class<?>, CausewayBeanMetaData> discoveredValueTypes = new HashMap<>();
+
+    // -- LOOKUPS
+
+    public Optional<CausewayBeanMetaData> lookupIntrospectableType(final Class<?> type) {
+        return Optional.ofNullable(introspectableTypesByClass.get(type));
+    }
+
+    // -- ITERATORS
+
+    public Stream<CausewayBeanMetaData> streamIntrospectableTypes() {
+        return _NullSafe.stream(introspectableTypes);
+    }
+
+}
diff --git a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeRegistryDefault.java b/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeRegistryDefault.java
deleted file mode 100644
index 8eb5076be5d..00000000000
--- a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeRegistryDefault.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.core.config.beans;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-import jakarta.annotation.Priority;
-import jakarta.inject.Inject;
-import jakarta.inject.Named;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Service;
-
-import org.apache.causeway.applib.annotation.PriorityPrecedence;
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.base._NullSafe;
-import org.apache.causeway.commons.internal.collections._Maps;
-import org.apache.causeway.core.config.CausewayModuleCoreConfig;
-
-import lombok.Getter;
-import lombok.NonNull;
-
-@Service
-@Named(CausewayModuleCoreConfig.NAMESPACE + "..CausewayBeanTypeRegistryImpl")
-@Priority(PriorityPrecedence.EARLY)
-@Qualifier("Default")
-public class CausewayBeanTypeRegistryDefault
-implements CausewayBeanTypeRegistry {
-
-    /**
-     * (immutable) scan result, as used by the SpecificationLoader for introspection
-     */
-    private final Can<CausewayBeanMetaData> introspectableTypes;
-
-    private final Map<Class<?>, CausewayBeanMetaData> introspectableTypesByClass = _Maps.newHashMap();
-
-    // -- DISTINCT CATEGORIES OF BEAN SORTS
-
-    @Getter(onMethod_ = {@Override})
-    private final Map<Class<?>, CausewayBeanMetaData> managedBeansContributing = new HashMap<>();
-
-    @Getter(onMethod_ = {@Override})
-    private final Map<Class<?>, CausewayBeanMetaData> entityTypes = new HashMap<>();
-
-    @Getter(onMethod_ = {@Override})
-    private final Map<Class<?>, CausewayBeanMetaData> mixinTypes = new HashMap<>();
-
-    @Getter(onMethod_ = {@Override})
-    private final Map<Class<?>, CausewayBeanMetaData> viewModelTypes = new HashMap<>();
-
-    @Getter(onMethod_ = {@Override})
-    private final Map<Class<?>, CausewayBeanMetaData> discoveredValueTypes = new HashMap<>();
-
-    // -- LOOKUPS
-
-    @Override
-    public Optional<CausewayBeanMetaData> lookupIntrospectableType(final Class<?> type) {
-        return Optional.ofNullable(introspectableTypesByClass.get(type));
-    }
-
-    // -- ITERATORS
-
-    @Override
-    public Stream<CausewayBeanMetaData> streamIntrospectableTypes() {
-        return _NullSafe.stream(introspectableTypes);
-    }
-
-    // -- CONSTRUCTOR
-
-    @Inject @Named("causeway.bean-meta-data")
-    public CausewayBeanTypeRegistryDefault(final @NonNull Can<CausewayBeanMetaData> introspectableTypes) {
-        this.introspectableTypes = introspectableTypes;
-
-        introspectableTypes.forEach(typeMeta->{
-
-            var cls = typeMeta.getCorrespondingClass();
-
-            introspectableTypesByClass.put(typeMeta.getCorrespondingClass(), typeMeta);
-
-            switch (typeMeta.getBeanSort()) {
-            case MANAGED_BEAN_CONTRIBUTING:
-                managedBeansContributing.put(cls, typeMeta);
-                return;
-            case MIXIN:
-                mixinTypes.put(cls, typeMeta);
-                return;
-            case ENTITY:
-                entityTypes.put(cls, typeMeta);
-                return;
-            case VIEW_MODEL:
-                viewModelTypes.put(cls, typeMeta);
-                return;
-            case VALUE:
-                discoveredValueTypes.put(cls, typeMeta);
-                return;
-
-            // skip introspection for these
-            case MANAGED_BEAN_NOT_CONTRIBUTING:
-            case COLLECTION:
-            case ABSTRACT: // <-- unexpected code reach
-            case VETOED:
-            case UNKNOWN:
-                return;
-            }
-        });
-
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
index e627750eb7f..7cca0dc74a6 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
@@ -66,7 +66,6 @@ import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.config.beans.CausewayBeanFactoryPostProcessorForSpring;
 import org.apache.causeway.core.config.beans.CausewayBeanTypeClassifier;
 import org.apache.causeway.core.config.beans.CausewayBeanTypeRegistry;
-import org.apache.causeway.core.config.beans.CausewayBeanTypeRegistryDefault;
 import org.apache.causeway.core.config.environment.CausewaySystemEnvironment;
 import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants;
 import org.apache.causeway.core.config.viewer.web.WebAppContextPath;
@@ -352,7 +351,7 @@ extends MetaModelContext {
 
     public CausewayBeanTypeRegistry getCausewayBeanTypeRegistry() {
         if(causewayBeanTypeRegistry==null) {
-            causewayBeanTypeRegistry = new CausewayBeanTypeRegistryDefault(Can.empty());
+            causewayBeanTypeRegistry = new CausewayBeanTypeRegistry(Can.empty());
         }
         return causewayBeanTypeRegistry;
     }
diff --git a/regressiontests/bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/AutoConfigurationTest.java b/regressiontests/bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/AutoConfigurationTest.java
index a1f8bad160f..ac6bd3820ce 100644
--- a/regressiontests/bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/AutoConfigurationTest.java
+++ b/regressiontests/bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/AutoConfigurationTest.java
@@ -37,7 +37,6 @@ import org.springframework.test.context.TestPropertySource;
 import org.apache.causeway.applib.services.registry.ServiceRegistry;
 import org.apache.causeway.core.config.beans.CausewayBeanFactoryPostProcessorForSpring;
 import org.apache.causeway.core.config.beans.CausewayBeanTypeRegistry;
-import org.apache.causeway.core.config.beans.CausewayBeanTypeRegistryDefault;
 import org.apache.causeway.core.config.environment.CausewaySystemEnvironment;
 import org.apache.causeway.core.config.presets.CausewayPresets;
 import org.apache.causeway.core.metamodel.context.MetaModelContextFactory;
@@ -53,7 +52,6 @@ import org.apache.causeway.testdomain.model.stereotypes.MyView;
                 CausewaySystemEnvironment.class,
                 MetaModelContextFactory.class,
                 CausewayBeanFactoryPostProcessorForSpring.class,
-                CausewayBeanTypeRegistryDefault.class,
                 Configuration_usingStereotypes.class,
                 ServiceRegistryDefault.class
         },