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/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new f4acce30ee CAUSEWAY-3687: unify managed-bean-adapter hierarchy into 
single class (_SingletonBeanProvider)
f4acce30ee is described below

commit f4acce30ee8feb715db096904b0901745d370f8e
Author: Andi Huber <[email protected]>
AuthorDate: Tue Feb 27 17:02:40 2024 +0100

    CAUSEWAY-3687: unify managed-bean-adapter hierarchy into single class
    (_SingletonBeanProvider)
    
    - also refer to service beans via name rather than required class
---
 .../applib/services/registry/ServiceRegistry.java  | 11 ++-
 .../commons/internal/ioc/_IocContainer.java        |  4 +-
 .../commons/internal/ioc/_IocContainer_Spring.java | 22 ++----
 .../commons/internal/ioc/_ManagedBeanAdapter.java  | 50 ------------
 .../internal/ioc/_ManagedBeanAdapter_Spring.java   | 49 ------------
 .../ioc/_ManagedBeanAdapter_forTestingLazy.java    | 44 -----------
 .../internal/ioc/_SingletonBeanProvider.java       | 90 ++++++++++++++++++++++
 .../_testing/MetaModelContext_forTesting.java      | 36 ++++-----
 .../_testing/ServiceRegistry_forTesting.java       | 18 ++---
 .../context/MetaModelContext_usingSpring.java      |  9 +--
 .../core/metamodel/objectmanager/ObjectLoader.java |  6 +-
 .../services/registry/ServiceRegistryDefault.java  | 12 +--
 .../title/TitlesAndTranslationsValidator.java      |  3 +-
 .../RuntimeServicesTestAbstract.java               |  8 +-
 .../SpringServiceProvisioningTest.java             |  6 +-
 15 files changed, 146 insertions(+), 222 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/registry/ServiceRegistry.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/registry/ServiceRegistry.java
index e20bda5add..bfc3a0d9b2 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/registry/ServiceRegistry.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/registry/ServiceRegistry.java
@@ -31,7 +31,7 @@ import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal._Constants;
 import org.apache.causeway.commons.internal.base._Reduction;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
-import org.apache.causeway.commons.internal.ioc._ManagedBeanAdapter;
+import org.apache.causeway.commons.internal.ioc._SingletonBeanProvider;
 
 import lombok.val;
 
@@ -68,8 +68,7 @@ public interface ServiceRegistry {
     /**
      * Streams all registered bean adapters implementing the requested type.
      */
-    default Stream<_ManagedBeanAdapter> streamRegisteredBeansOfType(final 
Class<?> requiredType) {
-
+    default Stream<_SingletonBeanProvider> streamRegisteredBeansOfType(final 
Class<?> requiredType) {
         return streamRegisteredBeans()
                 .filter(beanAdapter->beanAdapter.isCandidateFor(requiredType));
     }
@@ -77,21 +76,21 @@ public interface ServiceRegistry {
     /**
      * Returns all bean adapters that have been registered.
      */
-    Stream<_ManagedBeanAdapter> streamRegisteredBeans();
+    Stream<_SingletonBeanProvider> streamRegisteredBeans();
 
     /**
      * Returns a registered bean of given {@code name}.
      *
      * @param id - corresponds to the ObjectSpecificationId of the bean's type
      */
-    Optional<_ManagedBeanAdapter> lookupRegisteredBeanById(LogicalType id);
+    Optional<_SingletonBeanProvider> lookupRegisteredBeanById(LogicalType id);
 
     /**
      * Returns a registered bean of given {@code name}, or throws when no such 
bean.
      *
      * @param id - corresponds to the ObjectSpecificationId of the bean's type
      */
-    default _ManagedBeanAdapter lookupRegisteredBeanByIdElseFail(final 
LogicalType id) {
+    default _SingletonBeanProvider lookupRegisteredBeanByIdElseFail(final 
LogicalType id) {
         return lookupRegisteredBeanById(id).orElseThrow(
                 ()->_Exceptions.unrecoverable(
                         "Failed to lookup BeanAdapter by id '" + id + "'"));
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_IocContainer.java
 
b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_IocContainer.java
index 03be975ef6..0a82d254f7 100644
--- 
a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_IocContainer.java
+++ 
b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_IocContainer.java
@@ -44,7 +44,7 @@ import lombok.val;
  */
 public interface _IocContainer {
 
-    Stream<_ManagedBeanAdapter> streamAllBeans();
+    Stream<_SingletonBeanProvider> streamAllBeans();
 
     boolean containsBean(String id);
     Optional<?> lookupBean(String id);
@@ -79,7 +79,7 @@ public interface _IocContainer {
     <T> Can<T> select(Class<T> requiredType);
 
     /**
-     * Returns all available implementations of the service that matche the 
additional qualifiers, ordered by priority.
+     * Returns all available implementations of the service that match the 
additional qualifiers, ordered by priority.
      *
      * <p>
      *     If there is more than one implementation, then the one with the 
&quot;highest&quot;
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 d4e50903fe..aee1f1d3ad 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
@@ -28,8 +28,8 @@ import java.util.stream.Stream;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Primary;
-import org.springframework.core.ResolvableType;
 import org.springframework.lang.Nullable;
+import org.springframework.util.ClassUtils;
 
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._NullSafe;
@@ -61,23 +61,11 @@ final class _IocContainer_Spring implements _IocContainer {
     }
 
     @Override
-    public Stream<_ManagedBeanAdapter> streamAllBeans() {
-
-        val context = springContext;
-
-        return Stream.of(context.getBeanDefinitionNames())
+    public Stream<_SingletonBeanProvider> streamAllBeans() {
+        return Stream.of(springContext.getBeanDefinitionNames())
                 .map(name->{
-
-                    val type = context.getType(name);
-                    val id = name; // just reuse the bean's name
-
-                    //val scope = 
beanFactory.getBeanDefinition(name).getScope();
-
-                    val resolvableType = ResolvableType.forClass(type);
-                    val bean = context.getBeanProvider(resolvableType);
-
-                    val beanAdapter = _ManagedBeanAdapter_Spring.of(id, type, 
bean);
-
+                    val type = 
ClassUtils.getUserClass(springContext.getType(name));
+                    val beanAdapter = _SingletonBeanProvider.of(name, type, 
()->springContext.getBean(name));
                     return beanAdapter;
                 });
     }
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_ManagedBeanAdapter.java
 
b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_ManagedBeanAdapter.java
deleted file mode 100644
index c40eaf7a06..0000000000
--- 
a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_ManagedBeanAdapter.java
+++ /dev/null
@@ -1,50 +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.commons.internal.ioc;
-
-import java.util.function.Supplier;
-
-import org.apache.causeway.commons.collections.Can;
-
-/**
- * @since 2.0
- */
-public interface _ManagedBeanAdapter {
-
-    String getId();
-    Can<?> getInstance();
-    Class<?> getBeanClass();
-
-    boolean isCandidateFor(Class<?> requiredType);
-
-    // -- TEST FACTORIES
-
-    public static <T> _ManagedBeanAdapter forTestingLazy(final String 
logicalTypeName, final Class<T> beanClass, final Supplier<T> beanProvider) {
-        return _ManagedBeanAdapter_forTestingLazy.of(logicalTypeName, 
beanClass, beanProvider);
-    }
-
-    public static <T> _ManagedBeanAdapter forTestingLazy(final Class<T> 
beanClass, final Supplier<T> beanProvider) {
-        return _ManagedBeanAdapter_forTestingLazy.of(beanClass.getName(), 
beanClass, beanProvider);
-    }
-
-    public static <T> _ManagedBeanAdapter forTesting(final T bean) {
-        return 
_ManagedBeanAdapter_forTestingLazy.of(bean.getClass().getName(), 
bean.getClass(), ()->bean);
-    }
-
-}
\ No newline at end of file
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_ManagedBeanAdapter_Spring.java
 
b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_ManagedBeanAdapter_Spring.java
deleted file mode 100644
index 9038a485d3..0000000000
--- 
a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_ManagedBeanAdapter_Spring.java
+++ /dev/null
@@ -1,49 +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.commons.internal.ioc;
-
-import org.springframework.beans.factory.ObjectProvider;
-
-import org.apache.causeway.commons.collections.Can;
-
-import lombok.Value;
-import lombok.val;
-
-@Value(staticConstructor="of")
-final class _ManagedBeanAdapter_Spring implements _ManagedBeanAdapter {
-
-    private final String id;
-    private final Class<?> beanClass;
-    private final ObjectProvider<?> beanProvider;
-
-    @Override
-    public Can<?> getInstance() {
-        val allMatchingBeans = beanProvider.stream()
-                .collect(Can.toCan());
-        return allMatchingBeans;
-    }
-
-    @Override
-    public boolean isCandidateFor(Class<?> requiredType) {
-        return beanProvider.stream()
-                .map(Object::getClass)
-                .anyMatch(requiredType::isAssignableFrom);
-    }
-
-}
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_ManagedBeanAdapter_forTestingLazy.java
 
b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_ManagedBeanAdapter_forTestingLazy.java
deleted file mode 100644
index 7a0587fcee..0000000000
--- 
a/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_ManagedBeanAdapter_forTestingLazy.java
+++ /dev/null
@@ -1,44 +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.commons.internal.ioc;
-
-import java.util.function.Supplier;
-
-import org.apache.causeway.commons.collections.Can;
-
-import lombok.Value;
-
-@Value(staticConstructor="of")
-final class _ManagedBeanAdapter_forTestingLazy implements _ManagedBeanAdapter {
-
-    private final String id;
-    private final Class<?> beanClass;
-    private final Supplier<?> beanProvider;
-
-    @Override
-    public boolean isCandidateFor(Class<?> requiredType) {
-        return requiredType.isAssignableFrom(beanClass);
-    }
-
-    @Override
-    public Can<?> getInstance() {
-        return Can.ofSingleton(beanProvider.get());
-    }
-
-}
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
new file mode 100644
index 0000000000..6dfe2ead0e
--- /dev/null
+++ 
b/commons/src/main/java/org/apache/causeway/commons/internal/ioc/_SingletonBeanProvider.java
@@ -0,0 +1,90 @@
+/*
+ *  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.commons.internal.ioc;
+
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
+import org.springframework.lang.Nullable;
+
+import org.apache.causeway.commons.internal.exceptions._Exceptions;
+
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import lombok.ToString;
+import lombok.Value;
+
+/**
+ * @since 2.0
+ */
+@Value(staticConstructor = "of")
+public final class _SingletonBeanProvider {
+
+    // -- TEST FACTORIES
+
+    public static <T> _SingletonBeanProvider forTestingLazy(
+            final String logicalTypeName, final Class<T> beanClass, final 
Supplier<T> beanProvider) {
+        return _SingletonBeanProvider.of(logicalTypeName, beanClass, 
beanProvider);
+    }
+
+    public static <T> _SingletonBeanProvider forTestingLazy(
+            final Class<T> beanClass, final Supplier<T> beanProvider) {
+        return _SingletonBeanProvider.of(beanClass.getName(), beanClass, 
beanProvider);
+    }
+
+    public static <T> _SingletonBeanProvider forTesting(final T bean) {
+        return _SingletonBeanProvider.of(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());
+    }
+
+    public Object getInstanceElseFail() {
+        return lookupInstance().orElseThrow(
+                ()->_Exceptions.noSuchElement("Cannot create bean instance for 
name '%s' (with required type %s)",
+                        id,
+                        beanClass.getName()));
+    }
+
+    public boolean isCandidateFor(final @Nullable Class<?> requiredType) {
+        if(requiredType==null) return false;
+        return requiredType.isAssignableFrom(beanClass);
+    }
+
+    // -- UTILITY
+
+    public static Predicate<_SingletonBeanProvider> satisfying(final Class<?> 
requiredType) {
+        return 
singletonProvider->singletonProvider.isCandidateFor(requiredType);
+    }
+
+}
\ No newline at end of file
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 2dcc829958..4e8709f0c4 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
@@ -60,8 +60,7 @@ import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.collections._Maps;
 import org.apache.causeway.commons.internal.collections._Sets;
 import org.apache.causeway.commons.internal.collections._Streams;
-import org.apache.causeway.commons.internal.exceptions._Exceptions;
-import org.apache.causeway.commons.internal.ioc._ManagedBeanAdapter;
+import org.apache.causeway.commons.internal.ioc._SingletonBeanProvider;
 import org.apache.causeway.core.config.CausewayConfiguration;
 import 
org.apache.causeway.core.config.beans.CausewayBeanFactoryPostProcessorForSpring;
 import org.apache.causeway.core.config.beans.CausewayBeanTypeClassifier;
@@ -203,7 +202,7 @@ extends MetaModelContext {
     private List<ValueSemanticsProvider<?>> valueSemantics;
 
     @Singular
-    private List<_ManagedBeanAdapter> singletonProviders;
+    private List<_SingletonBeanProvider> singletonProviders;
 
     // -- SERVICE SUPPORT
 
@@ -256,19 +255,19 @@ extends MetaModelContext {
                 .filter(_NullSafe::isPresent);
     }
 
-    Stream<_ManagedBeanAdapter> streamBeanAdapters() {
+    Stream<_SingletonBeanProvider> streamBeanAdapters() {
         return _Streams.concat(
-                streamSingletons().map(_ManagedBeanAdapter::forTesting),
+                streamSingletons().map(_SingletonBeanProvider::forTesting),
                 singletonProviders.stream(),
                 discoveredServices.stream(),
                 Stream.of(
                     // support for lazy bean providers,
-                    
_ManagedBeanAdapter.forTestingLazy(GridLoaderService.class, 
this::getGridLoaderService),
-                    _ManagedBeanAdapter.forTestingLazy(GridService.class, 
this::getGridService),
-                    _ManagedBeanAdapter.forTestingLazy(JaxbService.class, 
this::getJaxbService),
-                    _ManagedBeanAdapter.forTestingLazy(MenuBarsService.class, 
this::getMenuBarsService),
-                    _ManagedBeanAdapter.forTestingLazy(LayoutService.class, 
this::getLayoutService),
-                    
_ManagedBeanAdapter.forTestingLazy(SpecificationLoader.class, 
this::getSpecificationLoader)
+                    
_SingletonBeanProvider.forTestingLazy(GridLoaderService.class, 
this::getGridLoaderService),
+                    _SingletonBeanProvider.forTestingLazy(GridService.class, 
this::getGridService),
+                    _SingletonBeanProvider.forTestingLazy(JaxbService.class, 
this::getJaxbService),
+                    
_SingletonBeanProvider.forTestingLazy(MenuBarsService.class, 
this::getMenuBarsService),
+                    _SingletonBeanProvider.forTestingLazy(LayoutService.class, 
this::getLayoutService),
+                    
_SingletonBeanProvider.forTestingLazy(SpecificationLoader.class, 
this::getSpecificationLoader)
                 )
                 );
     }
@@ -447,9 +446,9 @@ extends MetaModelContext {
     private final MenuBarsService menuBarsService = createMenuBarsService();
     private final MenuBarsService createMenuBarsService() {
         return getSingletonProviders().stream()
-                
.filter(provider->provider.isCandidateFor(MenuBarsService.class))
+                
.filter(_SingletonBeanProvider.satisfying(MenuBarsService.class))
                 .findFirst()
-                
.map(provider->(MenuBarsService)provider.getInstance().getFirstElseFail())
+                .map(provider->(MenuBarsService)provider.getInstanceElseFail())
                 .orElseGet(MenuBarsService::forTesting);
     }
 
@@ -512,12 +511,12 @@ extends MetaModelContext {
     }
 
     @Builder.Default
-    private final Set<_ManagedBeanAdapter> discoveredServices = 
_Sets.newHashSet();
+    private final Set<_SingletonBeanProvider> discoveredServices = 
_Sets.newHashSet();
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
     private void registerAsService(final ServiceInstance serviceInstance) {
         val spec = serviceInstance.getSpecification();
-        discoveredServices.add(_ManagedBeanAdapter.forTestingLazy(
+        discoveredServices.add(_SingletonBeanProvider.forTestingLazy(
                 spec.getLogicalTypeName(),
                 (Class)spec.getCorrespondingClass(),
                 serviceInstance::getPojo));
@@ -547,11 +546,8 @@ extends MetaModelContext {
         return map;
     }
 
-    private Optional<ServiceInstance> toServiceInstance(final 
_ManagedBeanAdapter managedBeanAdapter) {
-        val servicePojo = managedBeanAdapter.getInstance().getFirst()
-                .orElseThrow(()->_Exceptions.unrecoverable(
-                        "Cannot get service instance of type '%s'",
-                        managedBeanAdapter.getBeanClass()));
+    private Optional<ServiceInstance> toServiceInstance(final 
_SingletonBeanProvider managedBeanAdapter) {
+        val servicePojo = managedBeanAdapter.getInstanceElseFail();
 
         
if(ProgrammingModelConstants.TypeExcludeMarker.anyMatchOn(managedBeanAdapter.getBeanClass()))
 {
             return Optional.empty();
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 b229b47389..be0180dfc0 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
@@ -37,7 +37,7 @@ import org.apache.causeway.commons.internal.collections._Sets;
 import org.apache.causeway.commons.internal.context._Context;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.commons.internal.ioc._IocContainer;
-import org.apache.causeway.commons.internal.ioc._ManagedBeanAdapter;
+import org.apache.causeway.commons.internal.ioc._SingletonBeanProvider;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 
 import lombok.Getter;
@@ -52,7 +52,7 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
     @NonNull private final MetaModelContext metaModelContext;
 
     @Getter @Setter private _IocContainer iocContainer;
-    private final Set<_ManagedBeanAdapter> registeredBeans = 
_Sets.newHashSet();
+    private final Set<_SingletonBeanProvider> registeredBeans = 
_Sets.newHashSet();
 
     @Override
     public <T> Can<T> select(final Class<T> type, final Annotation[] 
qualifiers) {
@@ -67,8 +67,8 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
 //        }
 
         Optional<T> match = streamBeans()
-                
.filter(beanAdapter->type.isAssignableFrom(beanAdapter.getBeanClass()))
-                .map(beanAdapter->beanAdapter.getInstance().getFirstElseFail())
+                .filter(_SingletonBeanProvider.satisfying(type))
+                .map(_SingletonBeanProvider::getInstanceElseFail)
                 .map(_Casts::<T>uncheckedCast)
                 .findFirst();
 
@@ -86,15 +86,15 @@ class ServiceRegistry_forTesting implements ServiceRegistry 
{
         return Can.empty();
     }
 
-    private final Map<String, _ManagedBeanAdapter> registeredBeanById = 
_Maps.newHashMap();
+    private final Map<String, _SingletonBeanProvider> registeredBeanById = 
_Maps.newHashMap();
 
     @Override
-    public Stream<_ManagedBeanAdapter> streamRegisteredBeans() {
+    public Stream<_SingletonBeanProvider> streamRegisteredBeans() {
         return registeredBeans().stream();
     }
 
     @Override
-    public Optional<_ManagedBeanAdapter> lookupRegisteredBeanById(final 
LogicalType id) {
+    public Optional<_SingletonBeanProvider> lookupRegisteredBeanById(final 
LogicalType id) {
         return 
Optional.ofNullable(registeredBeanById.get(id.getLogicalTypeName()));
     }
 
@@ -112,7 +112,7 @@ class ServiceRegistry_forTesting implements ServiceRegistry 
{
 
     // -- HELPER
 
-    private Set<_ManagedBeanAdapter> registeredBeans() {
+    private Set<_SingletonBeanProvider> registeredBeans() {
 
         AtomicBoolean triggerPostInit = new AtomicBoolean(false);
 
@@ -136,7 +136,7 @@ class ServiceRegistry_forTesting implements ServiceRegistry 
{
         return registeredBeans;
     }
 
-    private Stream<_ManagedBeanAdapter> streamBeans() {
+    private Stream<_SingletonBeanProvider> streamBeans() {
         // lookup the MetaModelContextBean's list of singletons
         val mmc = metaModelContext;
         if(mmc instanceof MetaModelContext_forTesting) {
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 71d45e0d49..b02949fab1 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
@@ -40,7 +40,7 @@ import 
org.apache.causeway.applib.services.xactn.TransactionService;
 import org.apache.causeway.commons.internal.base._Lazy;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.commons.internal.ioc._IocContainer;
-import org.apache.causeway.commons.internal.ioc._ManagedBeanAdapter;
+import org.apache.causeway.commons.internal.ioc._SingletonBeanProvider;
 import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.config.environment.CausewaySystemEnvironment;
 import org.apache.causeway.core.config.viewer.web.WebAppContextPath;
@@ -203,11 +203,8 @@ class MetaModelContext_usingSpring extends 
MetaModelContext {
                         LinkedHashMap::new));
     }
 
-    private ManagedObject toManagedObject(final _ManagedBeanAdapter 
managedBeanAdapter) {
-        val servicePojo = managedBeanAdapter.getInstance().getFirst()
-                .orElseThrow(()->_Exceptions.unrecoverable(
-                        "Cannot get service instance of type '%s'",
-                        managedBeanAdapter.getBeanClass()));
+    private ManagedObject toManagedObject(final _SingletonBeanProvider 
managedBeanAdapter) {
+        val servicePojo = managedBeanAdapter.getInstanceElseFail();
         return getSpecificationLoader()
                 .specForType(servicePojo.getClass())
                 .map(serviceSpec->ManagedObject.service(serviceSpec, 
servicePojo))
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/ObjectLoader.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/ObjectLoader.java
index 41d0ecd97a..ed6b67541f 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/ObjectLoader.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/ObjectLoader.java
@@ -22,10 +22,9 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 
-import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.handler.ChainOfResponsibility;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
-import org.apache.causeway.commons.internal.ioc._ManagedBeanAdapter;
+import org.apache.causeway.commons.internal.ioc._SingletonBeanProvider;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import 
org.apache.causeway.core.metamodel.facets.object.value.ValueSerializer.Format;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
@@ -75,8 +74,7 @@ public interface ObjectLoader {
                 val logicalType = spec.getLogicalType();
                 val servicePojo = spec.getServiceRegistry()
                     .lookupRegisteredBeanById(logicalType)
-                    .map(_ManagedBeanAdapter::getInstance)
-                    .flatMap(Can::getFirst)
+                    .flatMap(_SingletonBeanProvider::lookupInstance)
                     .orElseThrow(()->_Exceptions.noSuchElement(
                             "loader: %s loading logicalType %s",
                             this.getClass().getName(), logicalType));
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 e57726e387..e7a1fff85b 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
@@ -37,7 +37,7 @@ import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Lazy;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.collections._Maps;
-import org.apache.causeway.commons.internal.ioc._ManagedBeanAdapter;
+import org.apache.causeway.commons.internal.ioc._SingletonBeanProvider;
 import org.apache.causeway.core.config.beans.CausewayBeanTypeRegistry;
 import org.apache.causeway.core.config.environment.CausewaySystemEnvironment;
 import org.apache.causeway.core.metamodel.CausewayModuleCoreMetamodel;
@@ -55,7 +55,7 @@ public final class ServiceRegistryDefault implements 
ServiceRegistry {
     @Inject private CausewayBeanTypeRegistry causewayBeanTypeRegistry;
 
     @Override
-    public Optional<_ManagedBeanAdapter> lookupRegisteredBeanById(final 
LogicalType id) {
+    public Optional<_SingletonBeanProvider> lookupRegisteredBeanById(final 
LogicalType id) {
         return 
Optional.ofNullable(contributingDomainServicesById.get().get(id.getLogicalTypeName()));
     }
 
@@ -65,7 +65,7 @@ public final class ServiceRegistryDefault implements 
ServiceRegistry {
     }
 
     @Override
-    public Stream<_ManagedBeanAdapter> streamRegisteredBeans() {
+    public Stream<_SingletonBeanProvider> streamRegisteredBeans() {
         return contributingDomainServicesById.get().values().stream();
     }
 
@@ -83,11 +83,11 @@ public final class ServiceRegistryDefault implements 
ServiceRegistry {
 
     // -- HELPER
 
-    private final _Lazy<Map<String, _ManagedBeanAdapter>> 
contributingDomainServicesById =
+    private final _Lazy<Map<String, _SingletonBeanProvider>> 
contributingDomainServicesById =
             _Lazy.threadSafe(this::enumerateContributingDomainServices);
 
-    private Map<String, _ManagedBeanAdapter> 
enumerateContributingDomainServices() {
-        val managedBeanAdapterByName = _Maps.<String, 
_ManagedBeanAdapter>newHashMap();
+    private Map<String, _SingletonBeanProvider> 
enumerateContributingDomainServices() {
+        val managedBeanAdapterByName = _Maps.<String, 
_SingletonBeanProvider>newHashMap();
         val managedBeansContributing = 
causewayBeanTypeRegistry.getManagedBeansContributing().keySet();
 
         causewaySystemEnvironment.getIocContainer()
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 995cef4bf8..04e66f4e70 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
@@ -61,8 +61,7 @@ extends MetaModelValidatorAbstract {
         serviceRegistry.streamRegisteredBeans()
         .forEach(managedBeanAdapter->{
 
-            val serviceInstanceIfAny = 
managedBeanAdapter.getInstance().getFirst();
-            val domainService = serviceInstanceIfAny.orElse(null);
+            val domainService = 
managedBeanAdapter.lookupInstance().orElse(null);
             val logicalTypeName = managedBeanAdapter.getId();
 
             if(domainService == null) {
diff --git 
a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/RuntimeServicesTestAbstract.java
 
b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/RuntimeServicesTestAbstract.java
index d97a839dfa..8cbfe40393 100644
--- 
a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/RuntimeServicesTestAbstract.java
+++ 
b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/RuntimeServicesTestAbstract.java
@@ -32,7 +32,7 @@ import 
org.apache.causeway.applib.services.menu.MenuBarsMarshallerService;
 import org.apache.causeway.applib.services.menu.MenuBarsService;
 import org.apache.causeway.applib.services.message.MessageService;
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
-import org.apache.causeway.commons.internal.ioc._ManagedBeanAdapter;
+import org.apache.causeway.commons.internal.ioc._SingletonBeanProvider;
 import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting;
 import 
org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting.MetaModelContext_forTestingBuilder;
 import org.apache.causeway.core.metamodel.context.HasMetaModelContext;
@@ -71,7 +71,7 @@ implements HasMetaModelContext {
         onSetUp(mmcBuilder);
 
         mmcBuilder.singletonProvider(
-                _ManagedBeanAdapter
+                _SingletonBeanProvider
                 .forTestingLazy(MenuBarsMarshallerService.class, ()->{
                     val jaxbService = 
getServiceRegistry().lookupServiceElseFail(JaxbService.class);
                     return new MenuBarsMarshallerServiceBootstrap(
@@ -80,7 +80,7 @@ implements HasMetaModelContext {
 
 
         mmcBuilder.singletonProvider(
-                _ManagedBeanAdapter
+                _SingletonBeanProvider
                 .forTestingLazy(MenuBarsLoaderService.class, ()->{
                     return new MenuBarsLoaderServiceDefault(
                             menubarsLayoutXmlResourceRef,
@@ -88,7 +88,7 @@ implements HasMetaModelContext {
                 }));
 
         mmcBuilder.singletonProvider(
-                _ManagedBeanAdapter
+                _SingletonBeanProvider
                 .forTestingLazy(MenuBarsService.class, ()->{
 
                     val messageService = 
getServiceRegistry().lookupServiceElseFail(MessageService.class);
diff --git 
a/regressiontests/stable-bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/SpringServiceProvisioningTest.java
 
b/regressiontests/stable-bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/SpringServiceProvisioningTest.java
index 064521ba5c..efc3ccd2ae 100644
--- 
a/regressiontests/stable-bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/SpringServiceProvisioningTest.java
+++ 
b/regressiontests/stable-bootstrapping/src/test/java/org/apache/causeway/testdomain/bootstrapping/SpringServiceProvisioningTest.java
@@ -36,7 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 
 import org.apache.causeway.applib.services.registry.ServiceRegistry;
 import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.commons.internal.ioc._ManagedBeanAdapter;
+import org.apache.causeway.commons.internal.ioc._SingletonBeanProvider;
 import org.apache.causeway.commons.internal.resources._Resources;
 import org.apache.causeway.core.config.environment.CausewaySystemEnvironment;
 import org.apache.causeway.core.config.presets.CausewayPresets;
@@ -78,7 +78,7 @@ class SpringServiceProvisioningTest {
     void dump_all() throws IOException {
 
         final List<String> beans = 
causewaySystemEnvironment.getIocContainer().streamAllBeans()
-                .map(_ManagedBeanAdapter::getId)
+                .map(_SingletonBeanProvider::getId)
                 .sorted()
                 .collect(Collectors.toList());
 
@@ -92,7 +92,7 @@ class SpringServiceProvisioningTest {
     void builtInServices_shouldBeSetUp() throws IOException {
 
         val managedServices = serviceRegistry.streamRegisteredBeans()
-                .map(_ManagedBeanAdapter::getBeanClass)
+                .map(_SingletonBeanProvider::getBeanClass)
                 .map(Class::getName)
                 .collect(Collectors.toCollection(TreeSet::new));
 


Reply via email to