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 2025/02/21 05:56:38 UTC

(causeway) branch main updated: CAUSEWAY-3859: Java record refactoring (part 31)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new a9c05eb0782 CAUSEWAY-3859: Java record refactoring (part 31)
a9c05eb0782 is described below

commit a9c05eb07828c5a3d8f8a40b2ae02d8edbc5d902
Author: andi-huber <ah...@apache.org>
AuthorDate: Fri Feb 21 06:56:32 2025 +0100

    CAUSEWAY-3859: Java record refactoring (part 31)
---
 .../commons/internal/ioc/_IocContainer_Spring.java |  2 +-
 .../internal/ioc/_SingletonBeanProvider.java       | 53 +++++++++++++---------
 .../_testing/MetaModelContext_forTesting.java      |  2 +-
 .../_testing/ServiceRegistry_forTesting.java       |  4 +-
 .../context/MetaModelContext_usingSpring.java      |  2 +-
 .../services/registry/ServiceRegistryDefault.java  |  4 +-
 .../title/TitlesAndTranslationsValidator.java      | 10 ++--
 .../menubars/bootstrap/MenuBarsServiceBSTest.java  |  2 +-
 .../SpringServiceProvisioningTest.java             | 18 ++++----
 9 files changed, 53 insertions(+), 44 deletions(-)

diff --git a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_IocContainer_Spring.java b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_IocContainer_Spring.java
index dd984a84b2e..41716dd386e 100644
--- a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_IocContainer_Spring.java
+++ b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_IocContainer_Spring.java
@@ -61,7 +61,7 @@ public Stream<_SingletonBeanProvider> streamAllBeans() {
         return Stream.of(springContext.getBeanDefinitionNames())
                 .map(name->{
                     var type = ClassUtils.getUserClass(springContext.getType(name));
-                    var beanAdapter = _SingletonBeanProvider.of(name, type, ()->springContext.getBean(name));
+                    var beanAdapter = new _SingletonBeanProvider(name, type, ()->springContext.getBean(name));
                     return beanAdapter;
                 });
     }
diff --git a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_SingletonBeanProvider.java b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_SingletonBeanProvider.java
index a4463867264..829d21f1f5e 100644
--- a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_SingletonBeanProvider.java
+++ b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_SingletonBeanProvider.java
@@ -18,53 +18,46 @@
  */
 package org.apache.causeway.commons.internal.ioc;
 
+import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
 
+import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 
-import lombok.EqualsAndHashCode;
-import org.jspecify.annotations.NonNull;
-import lombok.ToString;
-import lombok.Value;
-
 /**
  * @since 2.0
  */
-@Value(staticConstructor = "of")
-public final class _SingletonBeanProvider {
+public record _SingletonBeanProvider(
+        /**
+         * Unique bean name (not an alias).
+         * Corresponds to the logical-type-name (Causeway semantics).
+         */
+        @NonNull String id,
+        @NonNull Class<?> beanClass,
+
+        //@ToString.Exclude @EqualsAndHashCode.Exclude
+        @NonNull Supplier<?> beanProvider) {
 
     // -- TEST FACTORIES
 
     public static <T> _SingletonBeanProvider forTestingLazy(
             final String logicalTypeName, final Class<T> beanClass, final Supplier<T> beanProvider) {
-        return _SingletonBeanProvider.of(logicalTypeName, beanClass, beanProvider);
+        return new _SingletonBeanProvider(logicalTypeName, beanClass, beanProvider);
     }
 
     public static <T> _SingletonBeanProvider forTestingLazy(
             final Class<T> beanClass, final Supplier<T> beanProvider) {
-        return _SingletonBeanProvider.of(beanClass.getName(), beanClass, beanProvider);
+        return new _SingletonBeanProvider(beanClass.getName(), beanClass, beanProvider);
     }
 
     public static <T> _SingletonBeanProvider forTesting(final T bean) {
-        return _SingletonBeanProvider.of(bean.getClass().getName(), bean.getClass(), ()->bean);
+        return new _SingletonBeanProvider(bean.getClass().getName(), bean.getClass(), ()->bean);
     }
 
-    // -- CONSTRUCTION
-
-    /**
-     * Unique bean name (not an alias).
-     * Corresponds to the logical-type-name (Causeway semantics).
-     */
-    private final @NonNull String id;
-    private final @NonNull Class<?> beanClass;
-
-    @ToString.Exclude @EqualsAndHashCode.Exclude
-    private final @NonNull Supplier<?> beanProvider;
-
     public Optional<?> lookupInstance() {
         return Optional.ofNullable(beanProvider.get());
     }
@@ -81,6 +74,22 @@ public boolean isCandidateFor(final @Nullable Class<?> requiredType) {
         return requiredType.isAssignableFrom(beanClass);
     }
 
+    @Override
+    public final boolean equals(final Object obj) {
+        return obj instanceof _SingletonBeanProvider other
+                ? Objects.equals(this.id(), other.id())
+                        && Objects.equals(this.beanClass(), other.beanClass())
+                : false;
+    }
+    @Override
+    public final int hashCode() {
+        return Objects.hash(id, beanClass);
+    }
+    @Override
+    public final String toString() {
+        return "SingletonBeanProvider[id=%s, beanClass=%s]".formatted(id, beanClass);
+    }
+
     // -- UTILITY
 
     public static Predicate<_SingletonBeanProvider> satisfying(final Class<?> requiredType) {
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 20cd7d57bf6..0ab8804d2e3 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
@@ -566,7 +566,7 @@ private final Map<String, ManagedObject> collectBeansOfKnownSort() {
     private Optional<ServiceInstance> toServiceInstance(final _SingletonBeanProvider managedBeanAdapter) {
         var servicePojo = managedBeanAdapter.getInstanceElseFail();
 
-        if(ProgrammingModelConstants.TypeVetoMarker.anyMatchOn(managedBeanAdapter.getBeanClass())) {
+        if(ProgrammingModelConstants.TypeVetoMarker.anyMatchOn(managedBeanAdapter.beanClass())) {
             return Optional.empty();
         }
         return getSpecificationLoader()
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/ServiceRegistry_forTesting.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/ServiceRegistry_forTesting.java
index a5c509d2687..8b1616bcb5c 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/ServiceRegistry_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/ServiceRegistry_forTesting.java
@@ -119,10 +119,10 @@ private Set<_SingletonBeanProvider> registeredBeans() {
             if(registeredBeans.isEmpty()) {
                 streamBeans()
                 .filter(_NullSafe::isPresent)
-                .peek(bean->_Assert.assertTrue(_Strings.isNotEmpty(bean.getId())))
+                .peek(bean->_Assert.assertTrue(_Strings.isNotEmpty(bean.id())))
                 .forEach(bean->{
                     registeredBeans.add(bean);
-                    registeredBeanById.put(bean.getId(), bean);
+                    registeredBeanById.put(bean.id(), bean);
                 });
                 triggerPostInit.set(true);
             }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/context/MetaModelContext_usingSpring.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/context/MetaModelContext_usingSpring.java
index 78422ec20ab..752b7f6fa8f 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/context/MetaModelContext_usingSpring.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/context/MetaModelContext_usingSpring.java
@@ -208,7 +208,7 @@ private ManagedObject toManagedObject(final _SingletonBeanProvider managedBeanAd
                 .map(serviceSpec->ManagedObject.service(serviceSpec, servicePojo))
                 .orElseThrow(()->_Exceptions.unrecoverable(
                         "Cannot wrap vetoed service of type '%s'",
-                        managedBeanAdapter.getBeanClass()));
+                        managedBeanAdapter.beanClass()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/registry/ServiceRegistryDefault.java
index 6e398fd8712..4b0a698a6e7 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/registry/ServiceRegistryDefault.java
@@ -96,14 +96,14 @@ private Map<String, _SingletonBeanProvider> enumerateContributingDomainServices(
         .streamAllBeans()
         .filter(contributes())
         .forEach(singletonProvider->
-            managedBeanAdapterByName.put(singletonProvider.getId(), singletonProvider));
+            managedBeanAdapterByName.put(singletonProvider.id(), singletonProvider));
 
         return managedBeanAdapterByName;
     }
 
     private Predicate<_SingletonBeanProvider> contributes() {
         return singletonProvider->singletonProvider!=null
-                ? causewayBeanTypeRegistry.containsManagedBeansContributing(singletonProvider.getBeanClass())
+                ? causewayBeanTypeRegistry.containsManagedBeansContributing(singletonProvider.beanClass())
                 // do not register unknown sort
                 : false;
     }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/title/TitlesAndTranslationsValidator.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/title/TitlesAndTranslationsValidator.java
index 2cafe91c980..02b332ccf27 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/title/TitlesAndTranslationsValidator.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/title/TitlesAndTranslationsValidator.java
@@ -60,19 +60,19 @@ private void validateServiceTitles() {
         .forEach(managedBeanAdapter->{
 
             var domainService = managedBeanAdapter.lookupInstance().orElse(null);
-            var logicalTypeName = managedBeanAdapter.getId();
+            var logicalTypeName = managedBeanAdapter.id();
 
             if(domainService == null) {
 
                 var deficiencyOrigin = Identifier.classIdentifier(
-                        LogicalType.eager(managedBeanAdapter.getBeanClass(), logicalTypeName));
+                        LogicalType.eager(managedBeanAdapter.beanClass(), logicalTypeName));
 
                 ValidationFailure.raise(
                         specificationLoader,
                         deficiencyOrigin,
                         String.format(
                                 "Failed to get instance of service bean %s",
-                                managedBeanAdapter.getId())
+                                managedBeanAdapter.id())
                         );
                 return; // next
             }
@@ -87,14 +87,14 @@ private void validateServiceTitles() {
                 e.printStackTrace();
 
                 var deficiencyOrigin = Identifier.classIdentifier(
-                        LogicalType.eager(managedBeanAdapter.getBeanClass(), logicalTypeName));
+                        LogicalType.eager(managedBeanAdapter.beanClass(), logicalTypeName));
 
                 ValidationFailure.raise(
                         specificationLoader,
                         deficiencyOrigin,
                         String.format(
                                 "Failed to get title for service bean %s",
-                                managedBeanAdapter.getId())
+                                managedBeanAdapter.id())
                         );
             }
 
diff --git a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/MenuBarsServiceBSTest.java b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/MenuBarsServiceBSTest.java
index 4846bc620ac..acc5a41512b 100644
--- a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/MenuBarsServiceBSTest.java
+++ b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/MenuBarsServiceBSTest.java
@@ -72,7 +72,7 @@ protected void afterSetUp() {
         assertNotNull(getSpecificationLoader().loadSpecification(Bar.class));
 
         assertTrue(getServiceRegistry().streamRegisteredBeans()
-                .anyMatch(bean->bean.getBeanClass().equals(Bar.class)));
+                .anyMatch(bean->bean.beanClass().equals(Bar.class)));
 
         assertTrue(getMetaModelContext().streamServiceAdapters()
                 .anyMatch(domainObject->domainObject.getSpecification().getCorrespondingClass().equals(Bar.class)));
diff --git a/regressiontests/bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/SpringServiceProvisioningTest.java b/regressiontests/bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/SpringServiceProvisioningTest.java
index 7ba442f6bc0..3a0d60a6d70 100644
--- a/regressiontests/bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/SpringServiceProvisioningTest.java
+++ b/regressiontests/bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/SpringServiceProvisioningTest.java
@@ -49,8 +49,8 @@
 //import org.apache.causeway.testdomain.Incubating;
 
 @SpringBootTest(
-        classes = { 
-                Configuration_headless.class, 
+        classes = {
+                Configuration_headless.class,
         },
         properties = {
                 // "causeway.core.meta-model.introspector.parallelize=false",
@@ -64,8 +64,8 @@
 })
 //@Incubating("with development work on 'v2' the reference list of services constantly changes")
 class SpringServiceProvisioningTest {
-    
-    @Inject private ServiceRegistry serviceRegistry; 
+
+    @Inject private ServiceRegistry serviceRegistry;
     @Inject private CausewaySystemEnvironment causewaySystemEnvironment;
 
     @BeforeEach
@@ -77,7 +77,7 @@ void beforeEach() {
     void dump_all() throws IOException {
 
         final List<String> beans = causewaySystemEnvironment.getIocContainer().streamAllBeans()
-                .map(_SingletonBeanProvider::getId)
+                .map(_SingletonBeanProvider::id)
                 .sorted()
                 .collect(Collectors.toList());
 
@@ -91,7 +91,7 @@ void dump_all() throws IOException {
     void builtInServices_shouldBeSetUp() throws IOException {
 
         var managedServices = serviceRegistry.streamRegisteredBeans()
-                .map(_SingletonBeanProvider::getBeanClass)
+                .map(_SingletonBeanProvider::beanClass)
                 .map(Class::getName)
                 .collect(Collectors.toCollection(TreeSet::new));
 
@@ -100,14 +100,14 @@ void builtInServices_shouldBeSetUp() throws IOException {
                 .filter(entry->!entry.startsWith("#"))
                 .filter(entry->!entry.startsWith("org.apache.causeway.testdomain."))
                 .collect(Collectors.toCollection(TreeSet::new));
-        
+
         assertFalse(expectedSingletons.isEmpty());
-        
+
         var servicesFound = toStringJoiningNewLine(managedServices);
         System.out.println("--- Services discovered by Causeway ---");
         System.out.println(servicesFound);
         System.out.println("--------------------------------");
-        
+
         // same as managedServices.containsAll(singletonSet) but more verbose in case of
         // failure
         assertEquals(toStringJoiningNewLine(expectedSingletons),