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/10/13 08:06:15 UTC

[isis] branch v2 updated: ISIS-2158: intermediate commit, breaks some smoketests

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

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


The following commit(s) were added to refs/heads/v2 by this push:
     new ed7445c  ISIS-2158: intermediate commit, breaks some smoketests
ed7445c is described below

commit ed7445c9e7706237d40cded423b72aaf64890c1f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Oct 13 10:05:58 2019 +0200

    ISIS-2158: intermediate commit, breaks some smoketests
    
    - simplifies interaction between spec-loader and type-registry
    - speed up 'isManagedBean' check, by no longer using reflection, when we
    already can ask a fully populated hash-map
    - converts DefaultedFacet to use new 'IsisConfiguration'
---
 .../services/confview/ConfigurationMenu.java       |   1 -
 .../environment/IsisSystemEnvironment.java         |  19 ++++
 .../org/apache/isis/config/IsisConfigModule.java   |  17 +---
 .../IsisBeanFactoryPostProcessorForSpring.java     |   7 +-
 .../isis/config/registry/IsisBeanTypeRegistry.java | 101 ++++++++++++---------
 .../metamodel/MetaModelContext_forTesting.java     |  15 ++-
 .../object/defaults/DefaultsProviderUtil.java      |  46 +++++++---
 .../annotcfg/DefaultedFacetAnnotation.java         |  14 ++-
 ...tedFacetAnnotationElseConfigurationFactory.java |  16 ++--
 .../services/registry/ServiceRegistryDefault.java  |  17 ++--
 .../specloader/SpecificationLoaderDefault.java     |  24 ++---
 .../metamodel/facets/AbstractFacetFactoryTest.java |   1 +
 .../ServiceInjectorDefaultTest_usingFields.java    |   8 +-
 ...InjectorDefaultTest_validateServices_happy.java |   6 +-
 .../services/ServiceInjectorLegacyTest.java        |   8 +-
 .../SpecificationLoaderTestAbstract.java           |  10 ++
 .../isis/runtime/system/context/IsisContext.java   |  10 --
 .../wicket/viewer/IsisWicketApplication.java       |   8 +-
 .../bootstrapping/AutoConfigurationTest.java       |  15 +--
 .../domainmodel/SpecloaderPerformanceTest.java     |   3 +-
 .../bootstrapping/builtin-singleton.list           |   2 +-
 21 files changed, 208 insertions(+), 140 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java b/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
index a3a6ae7..6fefb67 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
@@ -56,7 +56,6 @@ public class ConfigurationMenu {
             )
     @MemberOrder(sequence = "500.900.1")
     public Set<ConfigurationProperty> configuration(){
-        System.out.println("############## CALL");
         return configurationService.allProperties();
     }
 
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
index d5aa65f..9de0d2c 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
@@ -19,13 +19,17 @@
 package org.apache.isis.commons.internal.environment;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Singleton;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
 import org.springframework.context.event.ContextClosedEvent;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.ioc.spring._Spring;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -38,6 +42,9 @@ import lombok.extern.log4j.Log4j2;
  */
 @Service @Singleton @Log4j2
 public class IsisSystemEnvironment {
+    
+    @Autowired 
+    private ApplicationContext springContext;
 
     /**
      * @deprecated - this is provided only as a stepping stone for code that currently uses static method calls
@@ -52,6 +59,10 @@ public class IsisSystemEnvironment {
     
     @PostConstruct
     public void postConstruct() {
+        
+        
+        _Spring.reinit(springContext);
+        
         // when NOT bootstrapped with Spring, postConstruct() never gets called
         
         // when bootstrapped with Spring, postConstruct() must happen before any call to get() above,
@@ -64,6 +75,14 @@ public class IsisSystemEnvironment {
             this.setUnitTesting(primed.isUnitTesting());
         }
         _Context.putSingleton(IsisSystemEnvironment.class, this);
+        
+        System.err.println("####### IsisSystemEnvironment postconst " + this.hashCode());
+        
+    }
+    
+    @PreDestroy
+    public void preDestroy() {
+        System.err.println("####### IsisSystemEnvironment destroy " + this.hashCode());
     }
     
     @EventListener(ContextClosedEvent.class)
diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java b/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
index 34cf4b3..a577d4a 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
@@ -21,17 +21,14 @@ package org.apache.isis.config;
 import javax.inject.Singleton;
 
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 import org.springframework.core.env.ConfigurableEnvironment;
 
-import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.commons.internal.ioc.spring._Spring;
 import org.apache.isis.config.internal._Config;
-import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -50,28 +47,16 @@ public class IsisConfigModule {
     /** @deprecated this is just a historical workaround */
     @Bean @Singleton
     public IsisConfigurationLegacy getConfigurationLegacy(
-            ApplicationContext springContext,
             ConfigurableEnvironment configurableEnvironment,
             IsisSystemEnvironment isisSystemEnvironment) {
         
-        // ensures a well defined precondition
-        {
-            val beanTypeRegistry = _Context.getIfAny(IsisBeanTypeRegistry.class);
-            _Context.clear(); // special code in IsisBeanTypeRegistry.close() prevents auto-closing
-            if(beanTypeRegistry!=null) {
-                _Context.putSingleton(IsisBeanTypeRegistry.class, beanTypeRegistry);
-            } 
-        }
-
-        _Context.putSingleton(ApplicationContext.class, springContext);
+        _Config.clear();
         
         val rawKeyValueMap = _Spring.copySpringEnvironmentToMap(configurableEnvironment);
         _Config.putAll(rawKeyValueMap);
 
         log.info("Spring's context was passed over to Isis");
 
-       
-
         // dump config to log
         if(log.isInfoEnabled() && !isisSystemEnvironment.isUnitTesting()) {
             log.info("\n" + _Config.getConfiguration().toStringFormatted());
diff --git a/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
index bd18d1e..549391c 100644
--- a/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
+++ b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
@@ -59,7 +59,7 @@ public class IsisBeanFactoryPostProcessorForSpring implements BeanFactoryPostPro
         
         for (String beanDefinitionName : registry.getBeanDefinitionNames()) {
             
-            log.debug(()->"processing: " + beanDefinitionName);
+            log.debug("processing bean definition {}", beanDefinitionName);
             
             val beanDefinition = registry.containsBeanDefinition(beanDefinitionName) 
                     ? registry.getBeanDefinition(beanDefinitionName) 
@@ -79,12 +79,13 @@ public class IsisBeanFactoryPostProcessorForSpring implements BeanFactoryPostPro
                 if(beanNameOverride!=null) {
                     registry.removeBeanDefinition(beanDefinitionName);
                     registry.registerBeanDefinition(beanNameOverride, beanDefinition);
+                    log.debug("renaming bean {} -> {}", beanDefinitionName, beanNameOverride);
                 }
-                log.debug(()->String.format("renaming %s -> %s", beanDefinitionName, beanNameOverride));
+                
                 
             } else {
                 registry.removeBeanDefinition(beanDefinitionName);
-                log.debug(()->"removing: " + beanDefinitionName);
+                log.debug("vetoing bean {}", beanDefinitionName);
             }
             
         }
diff --git a/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
index fef6507..e68bcf9 100644
--- a/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
+++ b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import java.util.stream.Stream;
 
 import javax.enterprise.inject.Vetoed;
 
@@ -38,12 +37,12 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.ViewModel;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.components.ApplicationScopedComponent;
 import org.apache.isis.commons.internal.components.SessionScopedComponent;
 import org.apache.isis.commons.internal.components.TransactionScopedComponent;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.ioc.BeanSort;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
 import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.config.beans.IsisComponentScanInterceptor;
 
@@ -68,65 +67,88 @@ public final class IsisBeanTypeRegistry implements IsisComponentScanInterceptor,
     }
 
     /**
-     * inbox for introspection, as used by the spec loader
+     * Inbox for introspection, as used by the SpecificationLoader
      */
-    private final Map<Class<?>, BeanSort> inbox = new HashMap<>();
+    private final Map<Class<?>, BeanSort> introspectableTypes = new HashMap<>();
 
-    @Getter private final Set<Class<?>> beanTypes = new HashSet<>();
+    // -- DISTINCT CATEGORIES OF BEAN SORTS
+    
+    @Getter private final Set<Class<?>> managedBeanTypes = new HashSet<>();
     @Getter private final Set<Class<?>> entityTypes = new HashSet<>();
     @Getter private final Set<Class<?>> mixinTypes = new HashSet<>();
     @Getter private final Set<Class<?>> viewModelTypes = new HashSet<>();
+    @Getter private final Set<Class<?>> vetoedTypes = _Sets.newConcurrentHashSet();
     
-    private final List<Set<? extends Class<? extends Object>>> allTypeSets = _Lists.of(
-            beanTypes,
+    private final List<Set<? extends Class<? extends Object>>> allCategorySets = _Lists.of(
+            managedBeanTypes,
             entityTypes,
             mixinTypes,
-            viewModelTypes
+            viewModelTypes,
+            vetoedTypes
             );
 
     @Override
     public void close() {
 
-        if(!_Spring.isContextAvailable()) {
-            // this instance needs to survive a _Context.clear() call when Spring's context 
-            // gets passed over to Isis
-            return;
-        }
+//        if(!_Spring.isContextAvailable()) {
+//            // this instance needs to survive a _Context.clear() call when Spring's context 
+//            // gets passed over to Isis
+//            return;
+//        }
 
-        inbox.clear();
-        allTypeSets.forEach(Set::clear);
+        introspectableTypes.clear();
+        allCategorySets.forEach(Set::clear);
     }
 
     // -- INBOX
 
-    public void addToInbox(BeanSort sort, Class<?> type) {
-        synchronized (inbox) {
-            inbox.put(type, sort);
+    public void addIntrospectableType(BeanSort sort, Class<?> type) {
+        synchronized (introspectableTypes) {
+            introspectableTypes.put(type, sort);
+            
+            switch (sort) {
+            case MANAGED_BEAN:
+                managedBeanTypes.add(type);
+                return;
+            case MIXIN:
+                mixinTypes.add(type);
+                return;
+            case ENTITY:
+                entityTypes.add(type); //TODO redundant
+                return;
+            case VIEW_MODEL:
+                viewModelTypes.add(type);
+                return;
+            
+            //XXX skip introspection for these
+            case COLLECTION:
+            case VALUE:
+            case UNKNOWN:
+                break;
+            }
+            
         }
     }
 
-    public static boolean repeatedTesting = false;
-    
-    /**
-     * Implemented as a one-shot, that clears the inbox afterwards.
-     * @return
-     */
-    public Stream<Map.Entry<Class<?>, BeanSort>> streamAndClearInbox() {
+    public Map<Class<?>, BeanSort> snapshotIntrospectableTypes() {
 
         final Map<Class<?>, BeanSort> defensiveCopy;
 
-        synchronized (inbox) {
-            defensiveCopy = new HashMap<>(inbox);
-            if(!repeatedTesting) inbox.clear();
+        synchronized (introspectableTypes) {
+            defensiveCopy = new HashMap<>(introspectableTypes);
         }
 
         if(log.isDebugEnabled()) {
             defensiveCopy.forEach((k, v)->{
-                log.debug("to be specloaded: {} [{}]", k.getName(), v.name());
+                log.debug("to be introspected: {} [{}]", k.getName(), v.name());
             });
         }
 
-        return defensiveCopy.entrySet().stream();
+        return defensiveCopy;
+    }
+    
+    public void veto(Class<?> type) {
+        vetoedTypes.add(type);
     }
 
     // -- FILTER
@@ -164,30 +186,23 @@ public final class IsisBeanTypeRegistry implements IsisComponentScanInterceptor,
     
     @Override
     public boolean isManagedBean(Class<?> type) {
-        val beanSort = quickClassify(type);
-        return beanSort.isManagedBean();
+        if(vetoedTypes.contains(type)) { // vetos are coming from the spec-loader during init
+            return false;
+        }
+        return managedBeanTypes.contains(type);
     }
     
     // -- HELPER
     
-    // don't categorize this early, instead push candidate classes onto a queue for 
-    // later processing when the SpecLoader initializes.
     private void intercept(Class<?> type) {
 
         val beanSort = quickClassify(type);
 
-        if(beanSort.isEntity()) {
-            // event though passed to the inbox for introspection we populate this 
-            // for the persistence layer not having to wait on the spec -loader for 
-            // processing of the inbox
-            entityTypes.add(type); 
-        }
-
         val isToBeRegistered = beanSort.isManagedBean();
         val isToBeInspected = !beanSort.isUnknown();
 
         if(isToBeInspected) {
-            addToInbox(beanSort, type);
+            addIntrospectableType(beanSort, type);
         }
 
         if(log.isDebugEnabled()) {
@@ -297,4 +312,6 @@ public final class IsisBeanTypeRegistry implements IsisComponentScanInterceptor,
     }
 
 
+
+
 }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
index 3851d03..32ed533 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
@@ -22,6 +22,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Stream;
 
+import org.springframework.core.env.AbstractEnvironment;
+
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -67,7 +69,7 @@ final class MetaModelContext_forTesting implements MetaModelContext {
     .build();
     
     @Builder.Default
-    private IsisConfiguration configuration = new IsisConfiguration(); // just config defaults
+    private IsisConfiguration configuration = newIsisConfiguration(); // just config defaults
 
     private SpecificationLoader specificationLoader;
 
@@ -146,5 +148,16 @@ final class MetaModelContext_forTesting implements MetaModelContext {
         return Stream.concat(fields.stream(), getSingletons().stream())
                 .filter(_NullSafe::isPresent);
     }
+    
+    private static IsisConfiguration newIsisConfiguration() {
+        val config = new IsisConfiguration();
+        config.setEnvironment(new AbstractEnvironment() {
+            @Override
+            public String getProperty(String key) {
+                return _Config.getConfiguration().getString(key);
+            }
+        });
+        return config;
+    }
 
 }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultsProviderUtil.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultsProviderUtil.java
index 4f63145..19dbc10 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultsProviderUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultsProviderUtil.java
@@ -21,11 +21,12 @@ package org.apache.isis.metamodel.facets.object.defaults;
 
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.config.IsisConfigurationLegacy;
-import org.apache.isis.config.internal._Config;
+import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.commons.ClassUtil;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 
+import lombok.val;
+
 public final class DefaultsProviderUtil {
 
     private DefaultsProviderUtil() {
@@ -34,18 +35,41 @@ public final class DefaultsProviderUtil {
     public static final String DEFAULTS_PROVIDER_NAME_KEY_PREFIX = "isis.reflector.java.facets.defaulted.";
     public static final String DEFAULTS_PROVIDER_NAME_KEY_SUFFIX = ".providerName";
 
-    public static String defaultsProviderNameFromConfiguration(final Class<?> type) {
-
-        final IsisConfigurationLegacy configuration = _Config.getConfiguration();
+    public static String defaultsProviderNameFromConfiguration(
+            final IsisConfiguration configuration,
+            final Class<?> type) {
 
-        final String key = DEFAULTS_PROVIDER_NAME_KEY_PREFIX + type.getCanonicalName() + DEFAULTS_PROVIDER_NAME_KEY_SUFFIX;
-        final String defaultsProviderName = configuration.getString(key);
-        return !_Strings.isNullOrEmpty(defaultsProviderName) ? defaultsProviderName : null;
+        val key = DEFAULTS_PROVIDER_NAME_KEY_PREFIX + 
+                type.getCanonicalName() + 
+                DEFAULTS_PROVIDER_NAME_KEY_SUFFIX;
+        
+        val defaultsProviderName = configuration
+                .getEnvironment()
+                .getProperty(key);
+        
+        return !_Strings.isNullOrEmpty(defaultsProviderName) 
+                ? defaultsProviderName 
+                        : null;
     }
 
-    public static Class<?> defaultsProviderOrNull(final Class<?> candidateClass, final String classCandidateName) {
-        final Class<?> type = candidateClass != null ? ClassUtil.implementingClassOrNull(candidateClass.getName(), DefaultsProvider.class, FacetHolder.class) : null;
-        return type != null ? type : ClassUtil.implementingClassOrNull(classCandidateName, DefaultsProvider.class, FacetHolder.class);
+    public static Class<?> defaultsProviderOrNull(
+            final Class<?> candidateClass, 
+            final String classCandidateName) {
+        
+        val type = candidateClass != null 
+                ? ClassUtil.implementingClassOrNull(
+                        candidateClass.getName(), 
+                        DefaultsProvider.class, 
+                        FacetHolder.class) 
+                        
+                        : null;
+                        
+        return type != null 
+                ? type 
+                        : ClassUtil.implementingClassOrNull(
+                                classCandidateName, 
+                                DefaultsProvider.class, 
+                                FacetHolder.class);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java
index 88e1f7e..e99f755 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java
@@ -21,19 +21,21 @@ package org.apache.isis.metamodel.facets.object.defaults.annotcfg;
 
 import org.apache.isis.applib.annotation.Defaulted;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.object.defaults.DefaultedFacetAbstract;
 import org.apache.isis.metamodel.facets.object.defaults.DefaultsProviderUtil;
 
 public class DefaultedFacetAnnotation extends DefaultedFacetAbstract {
 
-    private static String providerName(final Class<?> annotatedClass) {
+    private static String providerName(final IsisConfiguration config, final Class<?> annotatedClass) {
+        
         final Defaulted annotation = annotatedClass.getAnnotation(Defaulted.class);
         final String providerName = annotation.defaultsProviderName();
         if (!_Strings.isNullOrEmpty(providerName)) {
             return providerName;
         }
-        return DefaultsProviderUtil.defaultsProviderNameFromConfiguration(annotatedClass);
+        return DefaultsProviderUtil.defaultsProviderNameFromConfiguration(config, annotatedClass);
     }
 
     private static Class<?> providerClass(final Class<?> annotatedClass) {
@@ -41,8 +43,12 @@ public class DefaultedFacetAnnotation extends DefaultedFacetAbstract {
         return annotation.defaultsProviderClass();
     }
 
-    public DefaultedFacetAnnotation(final Class<?> annotatedClass, final FacetHolder holder) {
-        this(providerName(annotatedClass), providerClass(annotatedClass), holder);
+    public DefaultedFacetAnnotation(
+            final IsisConfiguration config, 
+            final Class<?> annotatedClass, 
+            final FacetHolder holder) {
+        
+        this(providerName(config, annotatedClass), providerClass(annotatedClass), holder);
     }
 
     private DefaultedFacetAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
index fb9c96f..1e26690 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
@@ -29,6 +29,8 @@ import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.object.defaults.DefaultedFacetAbstract;
 import org.apache.isis.metamodel.facets.object.defaults.DefaultsProviderUtil;
 
+import lombok.val;
+
 public class DefaultedFacetAnnotationElseConfigurationFactory extends FacetFactoryAbstract {
 
 
@@ -42,18 +44,20 @@ public class DefaultedFacetAnnotationElseConfigurationFactory extends FacetFacto
     }
 
     private DefaultedFacetAbstract create(final Class<?> cls, final FacetHolder holder) {
-        final Defaulted annotation = Annotations.getAnnotation(cls, Defaulted.class);
 
+        val defaultedAnnot = Annotations.getAnnotation(cls, Defaulted.class);
+        val config = super.getConfiguration();
+        
         // create from annotation, if present
-        if (annotation != null) {
-            final DefaultedFacetAbstract facet = new DefaultedFacetAnnotation(cls, holder);
-            if (facet.isValid()) {
-                return facet;
+        if (defaultedAnnot != null) {
+            val defaultedFacet = new DefaultedFacetAnnotation(config, cls, holder);
+            if (defaultedFacet.isValid()) {
+                return defaultedFacet;
             }
         }
 
         // otherwise, try to create from configuration, if present
-        final String providerName = DefaultsProviderUtil.defaultsProviderNameFromConfiguration(cls);
+        val providerName = DefaultsProviderUtil.defaultsProviderNameFromConfiguration(config, cls);
         if (!_Strings.isNullOrEmpty(providerName)) {
             final DefaultedFacetFromConfiguration facet = new DefaultedFacetFromConfiguration(providerName, holder);
             if (facet.isValid()) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
index 1586955..e2ebe73 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
@@ -31,9 +31,10 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.commons.internal.debug._Probe;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.commons.internal.ioc.spring._Spring;
-import org.apache.isis.config.IsisConfigurationLegacy;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 
 import lombok.val;
@@ -45,8 +46,8 @@ import lombok.val;
 public final class ServiceRegistryDefault implements ServiceRegistry {
     
     //XXX to enforce provisioning order, this is a depends-on relationship! 
-    // keep as long as IsisConfigurationLegacy is used 
-    @Inject private IsisConfigurationLegacy isisConfigurationLegacy; 
+    @SuppressWarnings("unused")
+    @Inject private IsisSystemEnvironment isisSystemEnvironment; 
     
     @Override
     public Optional<ManagedBeanAdapter> lookupRegisteredBeanById(String id) {
@@ -64,20 +65,24 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
     private final _Lazy<Map<String, ManagedBeanAdapter>> managedBeansById = 
             _Lazy.threadSafe(this::enumerateManagedBeans);
 
+    private final static _Probe probe = _Probe.maxCallsThenIgnore(5).label("service reg");
+    
     private Map<String, ManagedBeanAdapter> enumerateManagedBeans() {
         
+        probe.println("#### enumerate");
+        
         val filter = IsisBeanTypeRegistry.current();
-        val map = _Maps.<String, ManagedBeanAdapter>newHashMap();
+        val managedBeanAdapterByName = _Maps.<String, ManagedBeanAdapter>newHashMap();
 
         _Spring.streamAllBeans()
         .filter(_NullSafe::isPresent)
         .filter(bean->filter.isManagedBean(bean.getBeanClass())) // do not register unknown sort
         .forEach(bean->{
             val id = bean.getId();
-            map.put(id, bean);
+            managedBeanAdapterByName.put(id, bean);
         });
 
-        return map;
+        return managedBeanAdapterByName;
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
index 6907435..35544c1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
@@ -32,6 +32,7 @@ import org.apache.isis.commons.internal.base._Blackhole;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._Timing;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
@@ -142,29 +143,26 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
         log.info(" - categorizing types from class-path scan");
         
-        typeRegistry.streamAndClearInbox().forEach(entry->{
+        typeRegistry.snapshotIntrospectableTypes().entrySet()
+        .forEach(entry->{
 
             val type = entry.getKey();
             val sort = entry.getValue(); 
 
             val spec = loadSpecification(type, IntrospectionState.NOT_INTROSPECTED);
-            if(spec!=null) scannedSpecs.add(spec);
+            if(spec!=null) {
+                scannedSpecs.add(spec);
+            } else {
+                typeRegistry.veto(type);
+            }
 
             switch (sort) {
             case MANAGED_BEAN:
-                typeRegistry.getBeanTypes().add(type);
                 domainServiceSpecs.add(spec);
                 return;
             case MIXIN:
-                typeRegistry.getMixinTypes().add(type);
-                domainObjectSpecs.add(spec);
-                return;
             case ENTITY:
-                typeRegistry.getEntityTypes().add(type);
-                domainObjectSpecs.add(spec);
-                return;
             case VIEW_MODEL:
-                typeRegistry.getViewModelTypes().add(type);
                 domainObjectSpecs.add(spec);
                 return;
 
@@ -317,6 +315,8 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
     }
 
     // -- HELPER
+    
+    private final static _Probe probe = _Probe.maxCallsThenIgnore(5).label("specloader"); 
 
     /**
      * Creates the appropriate type of {@link ObjectSpecification}.
@@ -331,10 +331,12 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
         } else {
 
-            final FacetedMethodsBuilderContext facetedMethodsBuilderContext =
+            val facetedMethodsBuilderContext =
                     new FacetedMethodsBuilderContext(
                             this, facetProcessor);
 
+            probe.println("#### check is managed");
+            
             val isManagedBean = IsisBeanTypeRegistry.current().isManagedBean(cls);
 
             objectSpec = new ObjectSpecificationDefault(
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java
index ae64349..f715811 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java
@@ -27,6 +27,7 @@ import org.junit.Rule;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_usingFields.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_usingFields.java
index 0409437..a128b77 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_usingFields.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_usingFields.java
@@ -28,11 +28,14 @@ import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
 import org.springframework.test.context.ActiveProfiles;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.config.IsisConfigModule;
+import org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring;
 import org.apache.isis.metamodel.services.registry.ServiceRegistryDefault;
 
 import static org.hamcrest.Matchers.any;
@@ -42,6 +45,7 @@ import lombok.Getter;
 
 @ActiveProfiles("test")
 @SpringBootTest(classes = {
+        IsisBeanFactoryPostProcessorForSpring.class,
         IsisConfigModule.class,
         ServiceInjectorDefault.class,
         ServiceRegistryDefault.class,
@@ -50,8 +54,8 @@ import lombok.Getter;
 },
 properties = {
         "isis.services.injector.setPrefix=true"
-}
-        )
+})
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
 class ServiceInjectorDefaultTest_usingFields {
 
     @Configuration
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java
index 33c3bad..4f497d5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java
@@ -26,6 +26,8 @@ import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
 import org.springframework.test.context.ActiveProfiles;
 
 import org.apache.isis.applib.annotation.DomainService;
@@ -46,8 +48,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 },
 properties = {
         "isis.services.injector.setPrefix=true"
-}
-        )
+})
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
 class ServiceInjectorDefaultTest_validateServices_happy {
 
     // -- SCENARIO
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorLegacyTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorLegacyTest.java
index 9151916..6f48e79 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorLegacyTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorLegacyTest.java
@@ -29,14 +29,16 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Profile;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
 import org.springframework.test.context.ActiveProfiles;
 
 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.commons.internal.ioc.spring._Spring;
 import org.apache.isis.config.IsisConfigModule;
 import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring;
 import org.apache.isis.metamodel.services.registry.ServiceRegistryDefault;
 import org.apache.isis.metamodel.spec.InjectorMethodEvaluator;
 import org.apache.isis.metamodel.specloader.InjectorMethodEvaluatorDefault;
@@ -49,6 +51,7 @@ import lombok.val;
 
 @ActiveProfiles("test")
 @SpringBootTest(classes = {
+        IsisBeanFactoryPostProcessorForSpring.class,
         IsisConfigModule.class,
         ServiceInjectorLegacy.class,
         ServiceRegistryDefault.class,
@@ -57,6 +60,7 @@ import lombok.val;
 properties = {
         "isis.services.injector.setPrefix=true"
 })
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
 class ServiceInjectorLegacyTest {
 
     // -- SPRING SETUP
@@ -128,7 +132,7 @@ class ServiceInjectorLegacyTest {
 
     @BeforeEach
     void setup() {
-        _Spring.reinit(applicationContext);    
+        //_Spring.reinit(applicationContext);    
     }
     
     @Test
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
index 683c7ba..c8c85de0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -23,6 +23,7 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
+import org.springframework.core.env.ConfigurableEnvironment;
 
 import org.apache.isis.applib.services.grid.GridService;
 import org.apache.isis.applib.services.i18n.TranslationService;
@@ -55,10 +56,19 @@ import lombok.val;
 abstract class SpecificationLoaderTestAbstract {
 
     static class Producers {
+
+        //@Produces
+        ConfigurableEnvironment newConfigurableEnvironment() {
+            val mock = Mockito.mock(ConfigurableEnvironment.class);
+            when(mock.getProperty("")).thenReturn("nop");
+            return mock;
+        }
+
         
         //@Produces
         IsisConfiguration newConfiguration() {
             val config = new IsisConfiguration(); // uses defaults!
+            config.setEnvironment(newConfigurableEnvironment());
             return config;
         }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/IsisContext.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/IsisContext.java
index 422566d..44cf5c1 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/IsisContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/IsisContext.java
@@ -90,16 +90,6 @@ public interface IsisContext {
         return CompletableFuture.supplyAsync(computation);
     }
 
-    // -- LIFE-CYCLING
-
-    /**
-     * Destroys this context and clears any state associated with it.
-     * It marks the end of IsisContext's life-cycle. Subsequent calls have no effect.
-     */
-    public static void clear() {
-        _Context.clear();
-    }
-
     // -- CONVENIENT SHORTCUTS
 
     /**
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index c90890e..8a6a0b9 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -26,10 +26,6 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.function.Function;
 
-import javax.inject.Inject;
-
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-
 import org.apache.wicket.Application;
 import org.apache.wicket.ConverterLocator;
 import org.apache.wicket.IConverterLocator;
@@ -62,9 +58,9 @@ import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
 import org.apache.wicket.util.time.Duration;
 import org.wicketstuff.select2.ApplicationSettings;
 
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.concurrent._ConcurrentContext;
 import org.apache.isis.commons.internal.concurrent._ConcurrentTaskList;
-import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.commons.internal.resources._Resources;
 import org.apache.isis.config.IsisConfiguration;
@@ -579,7 +575,6 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
                     //                isisSessionFactory.destroyServicesAndShutdown();
                     //            }
                     super.onDestroy();
-                    IsisContext.clear();
                 } catch(final RuntimeException ex) {
                     // symmetry with #init()
                     log.error("Failed to destroy", ex);
@@ -589,6 +584,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
 
             // //////////////////////////////////////
 
+            @SuppressWarnings("deprecation")
             @Override //[ahuber] final on purpose! to switch DeploymentType, do this consistent with IsisContext.
             public final RuntimeConfigurationType getConfigurationType() {
                 return IsisSystemEnvironment.get().isPrototyping()
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
index 28ca3da..8003f57 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
@@ -18,10 +18,6 @@
  */
 package org.apache.isis.testdomain.bootstrapping;
 
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -98,22 +94,13 @@ class AutoConfigurationTest {
     @Test
     void domainObjects_shouldBeDiscovered() {
 
-        //TODO  bad test, relying on implementation details
-        // clearly IsisBeanTypeRegistry needs refactoring!
         val registry = IsisBeanTypeRegistry.current();
-        
-        val discoveredTypes = registry.streamAndClearInbox()
-        .map(Map.Entry::getKey)
-        .collect(Collectors.toSet());
-        discoveredTypes.addAll((Set)registry.getEntityTypes());
-        discoveredTypes.addAll((Set)registry.getBeanTypes());
+        val discoveredTypes = registry.snapshotIntrospectableTypes().keySet();
         
         for(val cls : nonManaged()) {
             assertTrue(discoveredTypes.contains(cls));
         }
         
-        //TODO @DomainObject with NATURE_NOT_SPECIFIED is getting ignored, is this correct behavior?
-        
     }
 
     @Test
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java
index d427ebd..53fc52e 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java
@@ -29,7 +29,6 @@ import org.apache.isis.commons.internal.base._Timing;
 import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.IsisPresets;
-import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.testdomain.Incubating;
 import org.apache.isis.testdomain.Smoketest;
@@ -62,7 +61,7 @@ class SpecloaderPerformanceTest {
     
     @BeforeAll
     static void setup() {
-        IsisBeanTypeRegistry.repeatedTesting = true;
+        
     }
     
     static long ITERATIONS = 100; /* should typically run in ~10s */
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
index c524705..9a27420 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
@@ -83,7 +83,7 @@ org.apache.isis.runtime.system.session.IsisSessionFactoryDefault
 org.apache.isis.runtime.system.transaction.AuditingServiceInternal
 org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal
 org.apache.isis.runtime.system.transaction.PersistenceSessionServiceInternalDefault
-org.apache.isis.security.authentication.bypass.AuthenticatorBypass
+#org.apache.isis.security.authentication.bypass.AuthenticatorBypass
 org.apache.isis.security.authentication.manager.AuthorizationManagerStandard
 org.apache.isis.security.authentication.standard.AuthenticationManagerStandard
 #org.apache.isis.security.authorization.bypass.AuthorizorBypass