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 2019/05/11 07:41:56 UTC

[isis] branch 2112_SpringBoot updated: ISIS-2112: further fixing 'metamodel' tests

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

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


The following commit(s) were added to refs/heads/2112_SpringBoot by this push:
     new c4e03ee  ISIS-2112: further fixing 'metamodel' tests
c4e03ee is described below

commit c4e03eef567c7c38d084307a4b84552517fd459e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat May 11 09:41:47 2019 +0200

    ISIS-2112: further fixing 'metamodel' tests
    
    ... by provisioning a minimal MetaModelContext for testing
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2112
---
 .../isis/core/metamodel/MetaModelContext.java      |   7 +-
 .../metamodel/MetaModelContext_forTesting.java     | 120 +++++++
 .../core/metamodel/MetaModelContext_usingCDI.java  | 139 +++++++++
 .../metamodel/MetaModelContext_usingSpring.java    | 139 +++++++++
 .../isis/core/metamodel/MetaModelContexts.java     | 346 +--------------------
 ...esting.java => ServiceInjector_forTesting.java} |   7 +-
 ...esting.java => ServiceRegistry_forTesting.java} |  16 +-
 .../services/events/MetamodelEventService.java     |   5 +-
 .../metamodel/facets/AbstractFacetFactoryTest.java |   8 -
 .../ValueSemanticsProviderAbstractTestCase.java    |  22 +-
 .../SpecificationLoaderTestAbstract.java           |   4 -
 11 files changed, 430 insertions(+), 383 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java
index 01a5ee8..aa8c13a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java
@@ -29,8 +29,7 @@ import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.MetaModelContexts.MetaModelContextBean;
-import org.apache.isis.core.metamodel.MetaModelContexts.MetaModelContextBean.MetaModelContextBeanBuilder;
+import org.apache.isis.core.metamodel.MetaModelContext_forTesting.MetaModelContext_forTestingBuilder;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -95,8 +94,8 @@ public interface MetaModelContext {
         _Context.putSingleton(MetaModelContext.class, metaModelContext);
     }
     
-    static MetaModelContextBeanBuilder builder() {
-        return MetaModelContextBean.builder();
+    static MetaModelContext_forTestingBuilder builder() {
+        return MetaModelContext_forTesting.builder();
     }
     
     // -- DELEGATION - FOR THOSE THAT IMPLEMENT THROUGH DELEGATION
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext_forTesting.java
new file mode 100644
index 0000000..3f38a9f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext_forTesting.java
@@ -0,0 +1,120 @@
+package org.apache.isis.core.metamodel;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.title.TitleService;
+import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.applib.services.xactn.TransactionState;
+import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.security.authentication.AuthenticationSession;
+import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
+import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+import lombok.val;
+
+@Builder @Getter
+final class MetaModelContext_forTesting implements MetaModelContext {
+	
+	private IsisConfiguration configuration;
+
+	private ObjectAdapterProvider objectAdapterProvider;
+
+	@Builder.Default
+	private ServiceInjector serviceInjector = new ServiceInjector_forTesting();
+
+	@Builder.Default
+	private ServiceRegistry serviceRegistry = new ServiceRegistry_forTesting();
+
+	@Builder.Default
+    private MetamodelEventService metamodelEventService = 
+        MetamodelEventService.builder()
+        .build();
+	
+	private SpecificationLoader specificationLoader;
+
+	private AuthenticationSessionProvider authenticationSessionProvider;
+
+	private TranslationService translationService;
+
+	private AuthenticationSession authenticationSession;
+
+	private AuthorizationManager authorizationManager;
+
+	private AuthenticationManager authenticationManager;
+
+	private TitleService titleService;
+
+	private RepositoryService repositoryService;
+
+	private TransactionService transactionService;
+
+	private TransactionState transactionState;
+
+	private Map<String, ObjectAdapter> serviceAdaptersById;
+	
+	@Singular
+	private List<Object> singletons;
+
+	@Override
+	public ObjectSpecification getSpecification(Class<?> type) {
+		return specificationLoader.loadSpecification(type);
+	}
+
+	@Override
+	public Stream<ObjectAdapter> streamServiceAdapters() {
+
+	    if(serviceAdaptersById==null) {
+			return Stream.empty();
+		}
+		return serviceAdaptersById.values().stream();
+	}
+
+	@Override
+	public ObjectAdapter lookupServiceAdapterById(String serviceId) {
+		if(serviceAdaptersById==null) {
+			return null;
+		}
+		return serviceAdaptersById.get(serviceId);
+	}
+	
+    public Stream<Object> streamSingletons() {
+        
+        val fields = _Lists.of(
+                configuration,
+                objectAdapterProvider,
+                serviceInjector,
+                serviceRegistry,
+                metamodelEventService,
+                specificationLoader,
+                authenticationSessionProvider,
+                translationService,
+                authenticationSession,
+                authorizationManager,
+                authenticationManager,
+                titleService,
+                repositoryService,
+                transactionService,
+                transactionState);
+        
+        return Stream.concat(fields.stream(), getSingletons().stream())
+                .filter(_NullSafe::isPresent);
+    }
+	
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext_usingCDI.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext_usingCDI.java
new file mode 100644
index 0000000..764f6f8
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext_usingCDI.java
@@ -0,0 +1,139 @@
+package org.apache.isis.core.metamodel;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.title.TitleService;
+import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.applib.services.xactn.TransactionState;
+import org.apache.isis.commons.internal.base._Lazy;
+import org.apache.isis.commons.internal.cdi._CDI;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.core.metamodel.services.ServiceUtil;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.security.authentication.AuthenticationSession;
+import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
+import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
+
+import lombok.Getter;
+import lombok.val;
+
+class MetaModelContext_usingCDI implements MetaModelContext {
+
+        @Getter(lazy=true) 
+        private final IsisConfiguration configuration = 
+                _Config.getConfiguration();
+
+        @Getter(lazy=true) 
+        private final ObjectAdapterProvider objectAdapterProvider =
+                _CDI.getSingletonElseFail(ObjectAdapterProvider.class);
+
+        @Getter(lazy=true) 
+        private final ServiceInjector serviceInjector =
+                _CDI.getSingletonElseFail(ServiceInjector.class);
+
+        @Getter(lazy=true) 
+        private final ServiceRegistry serviceRegistry =
+                _CDI.getSingletonElseFail(ServiceRegistry.class);
+
+        @Getter(lazy=true) 
+        private final SpecificationLoader specificationLoader = 
+                _CDI.getSingletonElseFail(SpecificationLoader.class);
+
+        @Getter(lazy=true) 
+        private final AuthenticationSessionProvider authenticationSessionProvider =
+                _CDI.getSingletonElseFail(AuthenticationSessionProvider.class);
+
+        @Getter(lazy=true) 
+        private final TranslationService translationService =
+                _CDI.getSingletonElseFail(TranslationService.class);
+
+        @Getter(lazy=true) 
+        private final AuthorizationManager authorizationManager =
+                _CDI.getSingletonElseFail(AuthorizationManager.class); 
+
+        @Getter(lazy=true) 
+        private final AuthenticationManager authenticationManager =
+                _CDI.getSingletonElseFail(AuthenticationManager.class);
+
+        @Getter(lazy=true) 
+        private final TitleService titleService =
+                _CDI.getSingletonElseFail(TitleService.class);
+
+//        @Getter(lazy=true) 
+//        private final ObjectAdapterService objectAdapterService =
+//        _CDI.getSingletonElseFail(ObjectAdapterService.class);
+
+        @Getter(lazy=true) 
+        private final RepositoryService repositoryService =
+                _CDI.getSingletonElseFail(RepositoryService.class);
+        
+        @Getter(lazy=true) 
+        private final TransactionService transactionService =
+                _CDI.getSingletonElseFail(TransactionService.class);
+        
+
+        @Override
+        public final AuthenticationSession getAuthenticationSession() {
+            return getAuthenticationSessionProvider().getAuthenticationSession();
+        }
+
+        @Override
+        public final ObjectSpecification getSpecification(final Class<?> type) {
+            return type != null ? getSpecificationLoader().loadSpecification(type) : null;
+        }
+
+        @Override
+        public final TransactionState getTransactionState() {
+            return getTransactionService().getTransactionState();
+        }
+        
+        // -- SERVICE SUPPORT
+        
+        @Override
+        public Stream<ObjectAdapter> streamServiceAdapters() {
+            return serviceAdapters.get().values().stream();
+        }
+        
+        @Override
+        public ObjectAdapter lookupServiceAdapterById(final String serviceId) {
+            return serviceAdapters.get().get(serviceId);
+        }
+        
+        
+        // -- HELPER
+        
+        private final _Lazy<Map<String, ObjectAdapter>> serviceAdapters = _Lazy.of(this::initServiceAdapters);
+        
+        private Map<String, ObjectAdapter> initServiceAdapters() {
+        	
+        	val objectAdapterProvider = getObjectAdapterProvider();
+        	
+            return getServiceRegistry().streamServices()
+            .map(objectAdapterProvider::adapterFor) 
+            .peek(serviceAdapter->{
+                val oid = serviceAdapter.getOid();
+                if(oid.isTransient()) {
+                    val msg = "ObjectAdapter for 'Bean' is expected not to be 'transient' " + oid;
+                    throw _Exceptions.unrecoverable(msg);
+                }
+            })
+            .collect(Collectors.toMap(ServiceUtil::idOfAdapter, v->v, (o,n)->n, LinkedHashMap::new));
+        }
+
+        // -------------------------------------------------------------------------------
+
+
+    }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext_usingSpring.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext_usingSpring.java
new file mode 100644
index 0000000..ffededf
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext_usingSpring.java
@@ -0,0 +1,139 @@
+package org.apache.isis.core.metamodel;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.title.TitleService;
+import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.applib.services.xactn.TransactionState;
+import org.apache.isis.commons.internal.base._Lazy;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.commons.internal.spring._Spring;
+import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.core.metamodel.services.ServiceUtil;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.security.authentication.AuthenticationSession;
+import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
+import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
+
+import lombok.Getter;
+import lombok.val;
+
+class MetaModelContext_usingSpring implements MetaModelContext {
+
+        @Getter(lazy=true) 
+        private final IsisConfiguration configuration = 
+                _Config.getConfiguration();
+
+        @Getter(lazy=true) 
+        private final ObjectAdapterProvider objectAdapterProvider =
+                _Spring.getSingletonElseFail(ObjectAdapterProvider.class);
+
+        @Getter(lazy=true) 
+        private final ServiceInjector serviceInjector =
+                _Spring.getSingletonElseFail(ServiceInjector.class);
+
+        @Getter(lazy=true) 
+        private final ServiceRegistry serviceRegistry =
+                _Spring.getSingletonElseFail(ServiceRegistry.class);
+
+        @Getter(lazy=true) 
+        private final SpecificationLoader specificationLoader = 
+                _Spring.getSingletonElseFail(SpecificationLoader.class);
+
+        @Getter(lazy=true) 
+        private final AuthenticationSessionProvider authenticationSessionProvider =
+                _Spring.getSingletonElseFail(AuthenticationSessionProvider.class);
+
+        @Getter(lazy=true) 
+        private final TranslationService translationService =
+                _Spring.getSingletonElseFail(TranslationService.class);
+
+        @Getter(lazy=true) 
+        private final AuthorizationManager authorizationManager =
+                _Spring.getSingletonElseFail(AuthorizationManager.class); 
+
+        @Getter(lazy=true) 
+        private final AuthenticationManager authenticationManager =
+                _Spring.getSingletonElseFail(AuthenticationManager.class);
+
+        @Getter(lazy=true) 
+        private final TitleService titleService =
+                _Spring.getSingletonElseFail(TitleService.class);
+
+//        @Getter(lazy=true) 
+//        private final ObjectAdapterService objectAdapterService =
+//        _CDI.getSingletonElseFail(ObjectAdapterService.class);
+
+        @Getter(lazy=true) 
+        private final RepositoryService repositoryService =
+                _Spring.getSingletonElseFail(RepositoryService.class);
+        
+        @Getter(lazy=true) 
+        private final TransactionService transactionService =
+                _Spring.getSingletonElseFail(TransactionService.class);
+        
+
+        @Override
+        public final AuthenticationSession getAuthenticationSession() {
+            return getAuthenticationSessionProvider().getAuthenticationSession();
+        }
+
+        @Override
+        public final ObjectSpecification getSpecification(final Class<?> type) {
+            return type != null ? getSpecificationLoader().loadSpecification(type) : null;
+        }
+
+        @Override
+        public final TransactionState getTransactionState() {
+            return getTransactionService().getTransactionState();
+        }
+        
+        // -- SERVICE SUPPORT
+        
+        @Override
+        public Stream<ObjectAdapter> streamServiceAdapters() {
+            return serviceAdapters.get().values().stream();
+        }
+        
+        @Override
+        public ObjectAdapter lookupServiceAdapterById(final String serviceId) {
+            return serviceAdapters.get().get(serviceId);
+        }
+        
+        
+        // -- HELPER
+        
+        private final _Lazy<Map<String, ObjectAdapter>> serviceAdapters = _Lazy.of(this::initServiceAdapters);
+        
+        private Map<String, ObjectAdapter> initServiceAdapters() {
+            
+            val objectAdapterProvider = getObjectAdapterProvider();
+            
+            return getServiceRegistry().streamServices()
+            .map(objectAdapterProvider::adapterFor) 
+            .peek(serviceAdapter->{
+                val oid = serviceAdapter.getOid();
+                if(oid.isTransient()) {
+                    val msg = "ObjectAdapter for 'Bean' is expected not to be 'transient' " + oid;
+                    throw _Exceptions.unrecoverable(msg);
+                }
+            })
+            .collect(Collectors.toMap(ServiceUtil::idOfAdapter, v->v, (o,n)->n, LinkedHashMap::new));
+        }
+
+        // -------------------------------------------------------------------------------
+
+
+    }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
index 0d67723..b152aff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
@@ -18,359 +18,19 @@
  */
 package org.apache.isis.core.metamodel;
 
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.applib.services.title.TitleService;
-import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.applib.services.xactn.TransactionState;
-import org.apache.isis.commons.internal.base._Lazy;
-import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.commons.internal.cdi._CDI;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.spring._Spring;
-import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.config.internal._Config;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.services.ServiceUtil;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
-import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
-
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Singular;
-import lombok.val;
-
 /**
  * 
- * @since 2.0.0-M3
+ * @since 2.0.0
  *
  */
 public final class MetaModelContexts {
 
-    static class MetaModelContextUsingCDI implements MetaModelContext {
-
-        @Getter(lazy=true) 
-        private final IsisConfiguration configuration = 
-                _Config.getConfiguration();
-
-        @Getter(lazy=true) 
-        private final ObjectAdapterProvider objectAdapterProvider =
-                _CDI.getSingletonElseFail(ObjectAdapterProvider.class);
-
-        @Getter(lazy=true) 
-        private final ServiceInjector serviceInjector =
-                _CDI.getSingletonElseFail(ServiceInjector.class);
-
-        @Getter(lazy=true) 
-        private final ServiceRegistry serviceRegistry =
-                _CDI.getSingletonElseFail(ServiceRegistry.class);
-
-        @Getter(lazy=true) 
-        private final SpecificationLoader specificationLoader = 
-                _CDI.getSingletonElseFail(SpecificationLoader.class);
-
-        @Getter(lazy=true) 
-        private final AuthenticationSessionProvider authenticationSessionProvider =
-                _CDI.getSingletonElseFail(AuthenticationSessionProvider.class);
-
-        @Getter(lazy=true) 
-        private final TranslationService translationService =
-                _CDI.getSingletonElseFail(TranslationService.class);
-
-        @Getter(lazy=true) 
-        private final AuthorizationManager authorizationManager =
-                _CDI.getSingletonElseFail(AuthorizationManager.class); 
-
-        @Getter(lazy=true) 
-        private final AuthenticationManager authenticationManager =
-                _CDI.getSingletonElseFail(AuthenticationManager.class);
-
-        @Getter(lazy=true) 
-        private final TitleService titleService =
-                _CDI.getSingletonElseFail(TitleService.class);
-
-//        @Getter(lazy=true) 
-//        private final ObjectAdapterService objectAdapterService =
-//        _CDI.getSingletonElseFail(ObjectAdapterService.class);
-
-        @Getter(lazy=true) 
-        private final RepositoryService repositoryService =
-                _CDI.getSingletonElseFail(RepositoryService.class);
-        
-        @Getter(lazy=true) 
-        private final TransactionService transactionService =
-                _CDI.getSingletonElseFail(TransactionService.class);
-        
-
-        @Override
-        public final AuthenticationSession getAuthenticationSession() {
-            return getAuthenticationSessionProvider().getAuthenticationSession();
-        }
-
-        @Override
-        public final ObjectSpecification getSpecification(final Class<?> type) {
-            return type != null ? getSpecificationLoader().loadSpecification(type) : null;
-        }
-
-        @Override
-        public final TransactionState getTransactionState() {
-            return getTransactionService().getTransactionState();
-        }
-        
-        // -- SERVICE SUPPORT
-        
-        @Override
-        public Stream<ObjectAdapter> streamServiceAdapters() {
-            return serviceAdapters.get().values().stream();
-        }
-        
-        @Override
-        public ObjectAdapter lookupServiceAdapterById(final String serviceId) {
-            return serviceAdapters.get().get(serviceId);
-        }
-        
-        
-        // -- HELPER
-        
-        private final _Lazy<Map<String, ObjectAdapter>> serviceAdapters = _Lazy.of(this::initServiceAdapters);
-        
-        private Map<String, ObjectAdapter> initServiceAdapters() {
-        	
-        	val objectAdapterProvider = getObjectAdapterProvider();
-        	
-            return getServiceRegistry().streamServices()
-            .map(objectAdapterProvider::adapterFor) 
-            .peek(serviceAdapter->{
-                val oid = serviceAdapter.getOid();
-                if(oid.isTransient()) {
-                    val msg = "ObjectAdapter for 'Bean' is expected not to be 'transient' " + oid;
-                    throw _Exceptions.unrecoverable(msg);
-                }
-            })
-            .collect(Collectors.toMap(ServiceUtil::idOfAdapter, v->v, (o,n)->n, LinkedHashMap::new));
-        }
-
-        // -------------------------------------------------------------------------------
-
-
-    }
-
     final static MetaModelContext usingCDI() {
-        return new MetaModelContextUsingCDI();
+        return new MetaModelContext_usingCDI();
     }
     
-    static class MetaModelContextUsingSpring implements MetaModelContext {
-
-        @Getter(lazy=true) 
-        private final IsisConfiguration configuration = 
-                _Config.getConfiguration();
-
-        @Getter(lazy=true) 
-        private final ObjectAdapterProvider objectAdapterProvider =
-                _Spring.getSingletonElseFail(ObjectAdapterProvider.class);
-
-        @Getter(lazy=true) 
-        private final ServiceInjector serviceInjector =
-                _Spring.getSingletonElseFail(ServiceInjector.class);
-
-        @Getter(lazy=true) 
-        private final ServiceRegistry serviceRegistry =
-                _Spring.getSingletonElseFail(ServiceRegistry.class);
-
-        @Getter(lazy=true) 
-        private final SpecificationLoader specificationLoader = 
-                _Spring.getSingletonElseFail(SpecificationLoader.class);
-
-        @Getter(lazy=true) 
-        private final AuthenticationSessionProvider authenticationSessionProvider =
-                _Spring.getSingletonElseFail(AuthenticationSessionProvider.class);
-
-        @Getter(lazy=true) 
-        private final TranslationService translationService =
-                _Spring.getSingletonElseFail(TranslationService.class);
-
-        @Getter(lazy=true) 
-        private final AuthorizationManager authorizationManager =
-                _Spring.getSingletonElseFail(AuthorizationManager.class); 
-
-        @Getter(lazy=true) 
-        private final AuthenticationManager authenticationManager =
-                _Spring.getSingletonElseFail(AuthenticationManager.class);
-
-        @Getter(lazy=true) 
-        private final TitleService titleService =
-                _Spring.getSingletonElseFail(TitleService.class);
-
-//        @Getter(lazy=true) 
-//        private final ObjectAdapterService objectAdapterService =
-//        _CDI.getSingletonElseFail(ObjectAdapterService.class);
-
-        @Getter(lazy=true) 
-        private final RepositoryService repositoryService =
-                _Spring.getSingletonElseFail(RepositoryService.class);
-        
-        @Getter(lazy=true) 
-        private final TransactionService transactionService =
-                _Spring.getSingletonElseFail(TransactionService.class);
-        
-
-        @Override
-        public final AuthenticationSession getAuthenticationSession() {
-            return getAuthenticationSessionProvider().getAuthenticationSession();
-        }
-
-        @Override
-        public final ObjectSpecification getSpecification(final Class<?> type) {
-            return type != null ? getSpecificationLoader().loadSpecification(type) : null;
-        }
-
-        @Override
-        public final TransactionState getTransactionState() {
-            return getTransactionService().getTransactionState();
-        }
-        
-        // -- SERVICE SUPPORT
-        
-        @Override
-        public Stream<ObjectAdapter> streamServiceAdapters() {
-            return serviceAdapters.get().values().stream();
-        }
-        
-        @Override
-        public ObjectAdapter lookupServiceAdapterById(final String serviceId) {
-            return serviceAdapters.get().get(serviceId);
-        }
-        
-        
-        // -- HELPER
-        
-        private final _Lazy<Map<String, ObjectAdapter>> serviceAdapters = _Lazy.of(this::initServiceAdapters);
-        
-        private Map<String, ObjectAdapter> initServiceAdapters() {
-            
-            val objectAdapterProvider = getObjectAdapterProvider();
-            
-            return getServiceRegistry().streamServices()
-            .map(objectAdapterProvider::adapterFor) 
-            .peek(serviceAdapter->{
-                val oid = serviceAdapter.getOid();
-                if(oid.isTransient()) {
-                    val msg = "ObjectAdapter for 'Bean' is expected not to be 'transient' " + oid;
-                    throw _Exceptions.unrecoverable(msg);
-                }
-            })
-            .collect(Collectors.toMap(ServiceUtil::idOfAdapter, v->v, (o,n)->n, LinkedHashMap::new));
-        }
-
-        // -------------------------------------------------------------------------------
-
-
-    }
-    
-    
     final static MetaModelContext usingSpring() {
-        return new MetaModelContextUsingSpring();
-    }
-    
-    // -- JUNIT TEST SUPPORT
-    
-    @Builder @Getter
-    public final static class MetaModelContextBean implements MetaModelContext {
-    	
-		private IsisConfiguration configuration;
-
-		private ObjectAdapterProvider objectAdapterProvider;
-
-		@Builder.Default
-		private ServiceInjector serviceInjector = new ServiceInjectorForTesting();
-
-		@Builder.Default
-		private ServiceRegistry serviceRegistry = new ServiceRegistryForTesting();
-
-		private SpecificationLoader specificationLoader;
-
-		private AuthenticationSessionProvider authenticationSessionProvider;
-
-		private TranslationService translationService;
-
-		private AuthenticationSession authenticationSession;
-
-		private AuthorizationManager authorizationManager;
-
-		private AuthenticationManager authenticationManager;
-
-		private TitleService titleService;
-
-		private RepositoryService repositoryService;
-
-		private TransactionService transactionService;
-
-		private TransactionState transactionState;
-
-		private Map<String, ObjectAdapter> serviceAdaptersById;
-		
-		@Singular
-		private List<Object> singletons;
-
-		@Override
-		public ObjectSpecification getSpecification(Class<?> type) {
-			return specificationLoader.loadSpecification(type);
-		}
-
-		@Override
-		public Stream<ObjectAdapter> streamServiceAdapters() {
-			if(serviceAdaptersById==null) {
-				return Stream.empty();
-			}
-			return serviceAdaptersById.values().stream();
-		}
-
-		@Override
-		public ObjectAdapter lookupServiceAdapterById(String serviceId) {
-			if(serviceAdaptersById==null) {
-				return null;
-			}
-			return serviceAdaptersById.get(serviceId);
-		}
-		
-        public Stream<Object> streamSingletons() {
-            
-            val fields = _Lists.of(
-                    configuration,
-                    objectAdapterProvider,
-                    serviceInjector,
-                    serviceRegistry,
-                    specificationLoader,
-                    authenticationSessionProvider,
-                    translationService,
-                    authenticationSession,
-                    authorizationManager,
-                    authenticationManager,
-                    titleService,
-                    repositoryService,
-                    transactionService,
-                    transactionState);
-            
-            return Stream.concat(fields.stream(), getSingletons().stream())
-                    .filter(_NullSafe::isPresent);
-        }
-    	
+        return new MetaModelContext_usingSpring();
     }
-
-   
     
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceInjectorForTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceInjector_forTesting.java
similarity index 88%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceInjectorForTesting.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceInjector_forTesting.java
index 33ffed4..72857c0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceInjectorForTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceInjector_forTesting.java
@@ -21,13 +21,12 @@ package org.apache.isis.core.metamodel;
 import static java.util.Objects.requireNonNull;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.core.metamodel.MetaModelContexts.MetaModelContextBean;
 import org.apache.isis.core.metamodel.services.ServiceInjectorDefault;
 import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
 
 import lombok.val;
 
-class ServiceInjectorForTesting implements ServiceInjector {
+class ServiceInjector_forTesting implements ServiceInjector {
     
     private ServiceInjector delegate;
 
@@ -38,11 +37,11 @@ class ServiceInjectorForTesting implements ServiceInjector {
             
             // lookup the MetaModelContextBean's list of singletons
             val mmc = MetaModelContext.current();
-            if(!(mmc instanceof MetaModelContextBean)) {
+            if(!(mmc instanceof MetaModelContext_forTesting)) {
                 return null;
             }
             
-            val mmcb = (MetaModelContextBean) mmc;
+            val mmcb = (MetaModelContext_forTesting) mmc;
             
             val configuration = requireNonNull(mmcb.getConfiguration());
             val serviceRegistry = requireNonNull(mmcb.getServiceRegistry());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceRegistryForTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceRegistry_forTesting.java
similarity index 89%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceRegistryForTesting.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceRegistry_forTesting.java
index 20f226d..fb6d108 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceRegistryForTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/ServiceRegistry_forTesting.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.core.metamodel;
 
+import java.lang.annotation.Annotation;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Stream;
@@ -31,23 +32,26 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.spring._Spring;
 import org.apache.isis.commons.ioc.BeanAdapter;
 import org.apache.isis.core.commons.collections.Bin;
-import org.apache.isis.core.metamodel.MetaModelContexts.MetaModelContextBean;
 import org.apache.isis.core.metamodel.services.registry.ServiceRegistryDefault;
 
 import lombok.Builder;
 import lombok.Value;
 import lombok.val;
 
-class ServiceRegistryForTesting implements ServiceRegistry {
+class ServiceRegistry_forTesting implements ServiceRegistry {
     
     private final Set<BeanAdapter> registeredBeans = _Sets.newHashSet();
     private final ServiceRegistry delegate = new ServiceRegistryDefault(); 
     
     @Override
-    public <T> Bin<T> select(Class<T> type) {
+    public <T> Bin<T> select(Class<T> type, Annotation[] qualifiers) {
         
         if(_Spring.isContextAvailable()) {
-            return ServiceRegistry.super.select(type);
+            return ServiceRegistry.super.select(type, qualifiers);
+        }
+        
+        if(qualifiers!=null && qualifiers.length>0) {
+            throw _Exceptions.notImplemented();
         }
 
         Optional<T> match = streamSingletons()
@@ -104,8 +108,8 @@ class ServiceRegistryForTesting implements ServiceRegistry {
     private Stream<Object> streamSingletons() {
         // lookup the MetaModelContextBean's list of singletons
         val mmc = MetaModelContext.current();
-        if(mmc instanceof MetaModelContextBean) {
-            val mmcb = (MetaModelContextBean) mmc;
+        if(mmc instanceof MetaModelContext_forTesting) {
+            val mmcb = (MetaModelContext_forTesting) mmc;
             return mmcb.streamSingletons();
         }
         return Stream.empty();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventService.java
index df2ff2e..ea6e7ed 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventService.java
@@ -12,12 +12,15 @@ import org.apache.isis.applib.events.ui.IconUiEvent;
 import org.apache.isis.applib.events.ui.LayoutUiEvent;
 import org.apache.isis.applib.events.ui.TitleUiEvent;
 
+import lombok.Builder;
+
 /**
  * 
  * @since 2.0.0-M3
  *
  */
-@Singleton
+@Singleton 
+@Builder //for JUnit Test support
 public class MetamodelEventService {
 
 	@Inject Event<CssClassUiEvent<Object>> cssClassUiEvents;
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
index 9399461..af29016 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
@@ -27,8 +27,6 @@ import org.junit.Rule;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.metamodel.MetaModelContext;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
@@ -64,8 +62,6 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
     }
 
     protected ObjectAdapterProvider mockObjectAdapterProvider;
-    protected ServiceRegistry mockServiceRegistry;
-    protected ServiceInjector mockServiceInjector;
     protected TranslationService mockTranslationService;
     protected AuthenticationSessionProvider mockAuthenticationSessionProvider;
     protected AuthenticationSession mockAuthenticationSession;
@@ -117,15 +113,11 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
 
         mockSpecificationLoader = context.mock(SpecificationLoader.class);
         
-        mockServiceRegistry = context.mock(ServiceRegistry.class);
-        mockServiceInjector = context.mock(ServiceInjector.class);
         mockObjectAdapterProvider = context.mock(ObjectAdapterProvider.class);
 
         MetaModelContext.preset(MetaModelContext.builder()
                 .configuration(_Config.getConfiguration())
                 .specificationLoader(mockSpecificationLoader)
-                .serviceInjector(mockServiceInjector)
-                .serviceRegistry(mockServiceRegistry)
                 .translationService(mockTranslationService)
                 .objectAdapterProvider(mockPersistenceSessionServiceInternal)
                 .authenticationSessionProvider(mockAuthenticationSessionProvider)
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
index 204bc4a..fc27351 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
@@ -31,6 +31,7 @@ import java.util.Locale;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.metamodel.MetaModelContext;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
@@ -63,10 +64,6 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     @Mock
     protected FacetHolder mockFacetHolder;
     @Mock
-    protected ServiceInjector mockServicesInjector;
-    @Mock
-    private ServiceRegistry mockServiceRegistry;
-    @Mock
     protected ObjectAdapterService mockSessionServiceInternal;
     @Mock
     protected SpecificationLoader mockSpecificationLoader;
@@ -81,20 +78,19 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
         _Config.clear();
         Locale.setDefault(Locale.UK);
         
+        MetaModelContext.preset(MetaModelContext.builder()
+                .configuration(_Config.getConfiguration())
+                .specificationLoader(mockSpecificationLoader)
+//                .translationService(mockTranslationService)
+//                .objectAdapterProvider(mockPersistenceSessionServiceInternal)
+                .authenticationSessionProvider(mockAuthenticationSessionProvider)
+                .build());
+        
         context.checking(new Expectations() {
             {
-
-//                allowing(mockServicesInjector).getAuthenticationSessionProvider();
-//                will(returnValue(mockAuthenticationSessionProvider));
-//
 //                allowing(mockServicesInjector).getPersistenceSessionServiceInternal();
 //                will(returnValue(mockSessionServiceInternal));
 
-                allowing(mockServiceRegistry).lookupService(AuthenticationSessionProvider.class);
-                will(returnValue(mockAuthenticationSessionProvider));
-
-                allowing(mockServicesInjector).injectServicesInto(with(any(Object.class)));
-
                 never(mockAuthenticationSessionProvider);
                 never(mockSessionServiceInternal);
             }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
index 50955cd..7e78e5a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -45,7 +45,6 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet;
 import org.apache.isis.core.metamodel.metamodelvalidator.dflt.MetaModelValidatorDefault;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModelAbstract.DeprecatedPolicy;
-import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.services.persistsession.ObjectAdapterService;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
@@ -123,11 +122,8 @@ abstract class SpecificationLoaderTestAbstract {
                 .authenticationSessionProvider(mockAuthenticationSessionProvider = producers.mockAuthenticationSessionProvider())
                 .singleton(mockMessageService = producers.mockMessageService())
                 .singleton(mockGridService = producers.mockGridService())
-                .singleton(new MetamodelEventService())
                 .build());
         
-
-        
 //        BeanTypeRegistry.instance().setDomainServiceTypes(_Sets.newHashSet());
 //        BeanTypeRegistry.instance().setFixtureScriptTypes(_Sets.newHashSet());
 //        BeanTypeRegistry.instance().setDomainObjectTypes(_Sets.newHashSet());