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/03 08:52:43 UTC

[isis] branch v2 updated: ISIS-2158: have IsisSystemEnvironment cleanup Isis' _Context

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 2e77b77  ISIS-2158: have IsisSystemEnvironment cleanup Isis' _Context
2e77b77 is described below

commit 2e77b77f3cceee8515e2ea42e21d10c685a3f4b7
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Oct 3 10:52:31 2019 +0200

    ISIS-2158: have IsisSystemEnvironment cleanup Isis' _Context
    
    - also tries to ensure, there can be only one IsisSystemEnvironment
    instance at any time
    - moving IsisSystemEnvironment one up in package hierarchy
    - we hook into the Spring context's life-cycle and call _Context.clear()
    when Spring is about to start the @PostConstuct phase
    - also fixes a concurrent testing issue
---
 .../{plugins => }/environment/DeploymentType.java  |  2 +-
 .../environment/IsisSystemEnvironment.java         | 49 +++++++++++++++++-----
 .../org/apache/isis/config/IsisConfigModule.java   |  2 +-
 .../isis/config/IsisConfigurationLegacy.java       |  2 +-
 .../metamodel/specloader/IntrospectionMode.java    |  4 +-
 .../isis/metamodel/ServiceRegistry_forTesting.java | 14 ++++---
 .../action/ActionAnnotationFacetFactory.java       |  2 +-
 .../PrototypeFacetForActionAnnotation.java         |  2 +-
 .../actions/prototype/PrototypeFacetAbstract.java  |  2 +-
 .../param/DeriveFacetsPostProcessor.java           |  2 +-
 .../services/grid/GridLoaderServiceDefault.java    |  2 +-
 .../services/grid/GridSystemServiceAbstract.java   |  2 +-
 .../isis/metamodel/spec/feature/ObjectAction.java  |  2 +-
 .../specloader/SpecificationLoaderDefault.java     |  2 +-
 .../prototype/PrototypeFacetAbstractTest.java      |  2 +-
 .../SpecificationLoaderTestAbstract.java           |  2 +-
 .../confmenu/ConfigurationViewServiceDefault.java  |  2 +-
 .../services/i18n/po/TranslationServicePo.java     |  2 +-
 .../menubars/MenuBarsLoaderServiceDefault.java     |  2 +-
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |  2 +-
 .../modules/h2console/WebModuleH2Console.java      |  2 +-
 .../fixtures/LogonFixtureAuthenticator.java        |  2 +-
 .../jmocking/JUnitRuleMockery2.java                |  2 +-
 .../rendering/util/JsonWriterUtil.java             |  2 +-
 .../wicket/viewer/IsisWicketApplication.java       |  3 +-
 .../isis/viewer/wicket/viewer/WebModuleWicket.java |  2 +-
 .../collection/AssociatedWithActionsHelper.java    |  2 +-
 .../ajaxtable/PrototypingMessageProvider.java      |  2 +-
 .../DomainModelTest_usingBadDomain.java            |  2 +-
 .../domainmodel/SpecloaderPerformanceTest.java     | 31 ++++++++++----
 .../bootstrapping/builtin-singleton.list           |  4 +-
 .../fixtures/FixturesLifecyleService.java          |  2 +-
 32 files changed, 103 insertions(+), 54 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/plugins/environment/DeploymentType.java b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/DeploymentType.java
similarity index 94%
rename from core/commons/src/main/java/org/apache/isis/commons/internal/plugins/environment/DeploymentType.java
rename to core/commons/src/main/java/org/apache/isis/commons/internal/environment/DeploymentType.java
index 7e7e911..f65bc85 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/plugins/environment/DeploymentType.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/DeploymentType.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.internal.plugins.environment;
+package org.apache.isis.commons.internal.environment;
 
 /**
  * 
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/plugins/environment/IsisSystemEnvironment.java b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
similarity index 68%
rename from core/commons/src/main/java/org/apache/isis/commons/internal/plugins/environment/IsisSystemEnvironment.java
rename to core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
index b84015e..d5aa65f 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/plugins/environment/IsisSystemEnvironment.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
@@ -16,15 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.internal.plugins.environment;
+package org.apache.isis.commons.internal.environment;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Singleton;
 
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
+import org.springframework.context.event.ContextClosedEvent;
+import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.commons.internal.base._Lazy;
+import org.apache.isis.commons.internal.context._Context;
+
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Represents configuration, that is available in an early phase of bootstrapping. 
@@ -32,22 +36,47 @@ import org.apache.isis.commons.internal.base._Lazy;
  * 
  * @since 2.0
  */
-@Service @Singleton @Order(value = Ordered.LOWEST_PRECEDENCE)
+@Service @Singleton @Log4j2
 public class IsisSystemEnvironment {
 
-    private static _Lazy<IsisSystemEnvironment> singleton = _Lazy.threadSafe(IsisSystemEnvironment::new);
-
     /**
      * @deprecated - this is provided only as a stepping stone for code that currently uses static method calls
      *               rather than having this bean injected.
      */
     @Deprecated
     public static IsisSystemEnvironment get() {
-        return singleton.get();
+        return _Context.computeIfAbsent(IsisSystemEnvironment.class, IsisSystemEnvironment::new);
     }
 
-    // -- INIT
-
+    // -- LIFE-CYCLE
+    
+    @PostConstruct
+    public void postConstruct() {
+        // when NOT bootstrapped with Spring, postConstruct() never gets called
+        
+        // when bootstrapped with Spring, postConstruct() must happen before any call to get() above,
+        // otherwise we copy over settings from the primed instance already created with get() above,
+        // then on the _Context replace the primed with this one
+        val primed = _Context.getIfAny(IsisSystemEnvironment.class);
+        if(primed!=null) {
+            _Context.remove(IsisSystemEnvironment.class);
+            this.setPrototyping(primed.isPrototyping());
+            this.setUnitTesting(primed.isUnitTesting());
+        }
+        _Context.putSingleton(IsisSystemEnvironment.class, this);
+    }
+    
+    @EventListener(ContextClosedEvent.class)
+    public void onContextAboutToClose(ContextClosedEvent event) {
+        // happens before any @PostConstruct
+        // as a consequence, no managed bean should touch the _Context during its post-construct phase
+        // as it has already been cleared here
+        log.info("Context about to close.");
+        _Context.clear();
+    }
+    
+    // -- SETUP
+    
     /**
      * For framework internal unit tests.<p>
      * Let the framework know what context we are running on.
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 04d78e4..34cf4b3 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
@@ -28,8 +28,8 @@ 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.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 
diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfigurationLegacy.java b/core/config/src/main/java/org/apache/isis/config/IsisConfigurationLegacy.java
index 2980256..e9ee658 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfigurationLegacy.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfigurationLegacy.java
@@ -25,7 +25,7 @@ import java.util.Map;
 import java.util.TreeMap;
 
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 
 import lombok.val;
 
diff --git a/core/config/src/main/java/org/apache/isis/metamodel/specloader/IntrospectionMode.java b/core/config/src/main/java/org/apache/isis/metamodel/specloader/IntrospectionMode.java
index 569ea62..c29fe17 100644
--- a/core/config/src/main/java/org/apache/isis/metamodel/specloader/IntrospectionMode.java
+++ b/core/config/src/main/java/org/apache/isis/metamodel/specloader/IntrospectionMode.java
@@ -19,8 +19,8 @@
 package org.apache.isis.metamodel.specloader;
 
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.plugins.environment.DeploymentType;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.DeploymentType;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 
 import lombok.val;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
index 9c41fbe..8f54f1b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
@@ -87,14 +87,16 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
     // -- HELPER
 
     private Set<BeanAdapter> registeredBeans() {
-        if(registeredBeans.isEmpty()) {
+        synchronized(registeredBeans) {
+            if(registeredBeans.isEmpty()) {
 
-            val beanSortClassifier = IsisBeanTypeRegistry.current();
+                val beanSortClassifier = IsisBeanTypeRegistry.current();
 
-            streamSingletons()
-            .map(s->toBeanAdapter(s, beanSortClassifier))
-            .filter(_NullSafe::isPresent)
-            .forEach(registeredBeans::add);
+                streamSingletons()
+                .map(s->toBeanAdapter(s, beanSortClassifier))
+                .filter(_NullSafe::isPresent)
+                .forEach(registeredBeans::add);
+            }    
         }
         return registeredBeans;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 53bb4b7..9a883b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -28,7 +28,7 @@ import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java
index df1e492..38c1afe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java
@@ -23,7 +23,7 @@ import java.util.List;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.RestrictTo;
-import org.apache.isis.commons.internal.plugins.environment.DeploymentType;
+import org.apache.isis.commons.internal.environment.DeploymentType;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.actions.prototype.PrototypeFacet;
 import org.apache.isis.metamodel.facets.actions.prototype.PrototypeFacetAbstract;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java
index 0e98eee..01ec38e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstract.java
@@ -22,7 +22,7 @@ package org.apache.isis.metamodel.facets.actions.prototype;
 import java.util.Map;
 
 import org.apache.isis.applib.services.wrapper.events.VisibilityEvent;
-import org.apache.isis.commons.internal.plugins.environment.DeploymentType;
+import org.apache.isis.commons.internal.environment.DeploymentType;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.MarkerFacetAbstract;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
index b5bec30..e6782ae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
@@ -31,7 +31,7 @@ import org.apache.isis.applib.events.domain.CollectionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facets.Annotations;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
index 2ceca3a..a07f305 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
@@ -27,7 +27,6 @@ import java.util.Objects;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.layout.grid.Grid;
@@ -36,6 +35,7 @@ import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 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 lombok.extern.log4j.Log4j2;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridSystemServiceAbstract.java
index 46e4569..daf2886 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -55,7 +55,7 @@ import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectAction.java
index 837b06c..dd64fff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectAction.java
@@ -39,7 +39,7 @@ 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.context._Context;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
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 b5f6bb0..1c8089b 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
@@ -26,11 +26,11 @@ import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.base._Timing;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.metamodel.facetapi.Facet;
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java
index 6dbbaf4..4f17548 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java
@@ -22,7 +22,7 @@ import org.jmock.auto.Mock;
 import org.junit.Rule;
 import org.junit.Test;
 
-import org.apache.isis.commons.internal.plugins.environment.DeploymentType;
+import org.apache.isis.commons.internal.environment.DeploymentType;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.interactions.VisibilityContext;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
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 20333b1..0e051c7 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
@@ -30,7 +30,7 @@ import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.i18n.TranslationService.Mode;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.commons.internal.base._Timing;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.Facet;
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java
index f6cca48..0c16e74 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/confmenu/ConfigurationViewServiceDefault.java
@@ -31,7 +31,7 @@ import org.apache.isis.applib.services.confview.ConfigurationProperty;
 import org.apache.isis.applib.services.confview.ConfigurationViewService;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.ConfigurationConstants;
 import org.apache.isis.config.IsisConfigurationLegacy;
 import org.apache.isis.config.internal._Config;
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
index 736ebd1..5ff2d2d 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
@@ -22,7 +22,6 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.i18n.LocaleProvider;
@@ -31,6 +30,7 @@ import org.apache.isis.applib.services.i18n.TranslationsResolver;
 import org.apache.isis.commons.collections.Bin;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.runtime.system.context.IsisContext;
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
index 7074dbe..bb0216e 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
@@ -23,7 +23,6 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.AbstractResource;
 import org.springframework.stereotype.Service;
@@ -33,6 +32,7 @@ import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.menu.MenuBarsLoaderService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.beans.WebAppConfigBean;
 
 import lombok.val;
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
index f002355..ba9fb09 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
@@ -27,7 +27,6 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.DomainServiceLayout;
@@ -47,6 +46,7 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facets.actions.notinservicemenu.NotInServiceMenuFacet;
 import org.apache.isis.metamodel.facets.all.named.NamedFacet;
diff --git a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/h2console/WebModuleH2Console.java b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/h2console/WebModuleH2Console.java
index 93ff78c..5773dcc 100644
--- a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/h2console/WebModuleH2Console.java
+++ b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/h2console/WebModuleH2Console.java
@@ -23,7 +23,6 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
@@ -31,6 +30,7 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.value.LocalResourcePath;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfigurationLegacy;
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
diff --git a/core/security/api/src/main/java/org/apache/isis/security/authentication/fixtures/LogonFixtureAuthenticator.java b/core/security/api/src/main/java/org/apache/isis/security/authentication/fixtures/LogonFixtureAuthenticator.java
index 99dca52..ed9be90 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/authentication/fixtures/LogonFixtureAuthenticator.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/authentication/fixtures/LogonFixtureAuthenticator.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.security.authentication.fixtures;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.security.authentication.AuthenticationRequest;
 import org.apache.isis.security.authentication.standard.AuthenticatorAbstract;
 
diff --git a/core/testsupport/unittestsupport/src/main/java/org/apache/isis/unittestsupport/jmocking/JUnitRuleMockery2.java b/core/testsupport/unittestsupport/src/main/java/org/apache/isis/unittestsupport/jmocking/JUnitRuleMockery2.java
index cf6d048..beddfde 100644
--- a/core/testsupport/unittestsupport/src/main/java/org/apache/isis/unittestsupport/jmocking/JUnitRuleMockery2.java
+++ b/core/testsupport/unittestsupport/src/main/java/org/apache/isis/unittestsupport/jmocking/JUnitRuleMockery2.java
@@ -24,7 +24,6 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.util.List;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.jmock.integration.junit4.JUnit4Mockery;
@@ -37,6 +36,7 @@ import org.picocontainer.MutablePicoContainer;
 import org.picocontainer.PicoBuilder;
 
 import org.apache.isis.commons.internal.base._Casts;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
diff --git a/core/viewer-restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/JsonWriterUtil.java b/core/viewer-restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/JsonWriterUtil.java
index dbc07c4..86f4651 100644
--- a/core/viewer-restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/JsonWriterUtil.java
+++ b/core/viewer-restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/JsonWriterUtil.java
@@ -21,7 +21,7 @@ package org.apache.isis.viewer.restfulobjects.rendering.util;
 import java.io.IOException;
 
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
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 3d1263a..c90890e 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
@@ -29,7 +29,7 @@ import java.util.function.Function;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+
 import org.apache.wicket.Application;
 import org.apache.wicket.ConverterLocator;
 import org.apache.wicket.IConverterLocator;
@@ -65,6 +65,7 @@ import org.wicketstuff.select2.ApplicationSettings;
 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;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/WebModuleWicket.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/WebModuleWicket.java
index c045a75..2f85b54 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/WebModuleWicket.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/WebModuleWicket.java
@@ -25,11 +25,11 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
 
diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
index 0d0f02b..a511d4a 100644
--- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
+++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
@@ -26,7 +26,7 @@ import java.util.stream.Stream;
 
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.spec.ActionType;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/PrototypingMessageProvider.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/PrototypingMessageProvider.java
index 17dc6d3..6606924 100644
--- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/PrototypingMessageProvider.java
+++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/PrototypingMessageProvider.java
@@ -20,13 +20,13 @@ package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable
 
 import java.util.Locale;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
 import org.apache.isis.commons.internal.base._Timing;
 import org.apache.isis.commons.internal.base._Timing.StopWatch;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.runtime.system.context.IsisContext;
 
 /**
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
index 19986ff..74f4fd1 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
@@ -25,7 +25,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.context.ApplicationContext;
 import org.springframework.test.context.TestPropertySource;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.IsisPresets;
 import org.apache.isis.integtestsupport.validate.ValidateDomainModel;
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 157f477..9fd1e1b 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
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.testdomain.domainmodel;
 
+import java.time.Duration;
+
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.BeforeAll;
@@ -34,6 +36,10 @@ import org.apache.isis.testdomain.Smoketest;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.testdomain.model.good.Configuration_usingValidDomain;
 
+import static org.junit.jupiter.api.Assertions.assertTimeout;
+
+import lombok.val;
+
 @Smoketest
 @SpringBootTest(
         classes = { 
@@ -60,15 +66,26 @@ class SpecloaderPerformanceTest {
         IsisBeanTypeRegistry.repeatedTesting = true;
     }
     
-    @Test //under constr.
-    void repeatedSpecloading() {
+    static long ITERATIONS = 40; /* should typically run in ~10s */
+    static long EXPECTED_MILLIS_PER_ITERATION = 500;
+    
+    @Test 
+    void repeatedConcurrentSpecloading_shouldNotDeadlock() {
+        
+        config.getReflector().getIntrospector().setParallelize(true);
+        
+        val timeOutMillis = ITERATIONS * EXPECTED_MILLIS_PER_ITERATION;
+        
+        assertTimeout(Duration.ofMillis(timeOutMillis), ()->{
+        
+            for(int i=0; i<ITERATIONS; ++i) {
+                specificationLoader.shutdown();
+                specificationLoader.init();
+            }
+            
+        });
         
-        config.getReflector().getIntrospector().setParallelize(false);
         
-        for(int i=0; i<40; ++i) {
-            specificationLoader.shutdown();
-            specificationLoader.init();
-        }
     }
 
 
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 b353ffe..dae1651 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
@@ -16,7 +16,7 @@ org.apache.isis.applib.services.scratchpad.Scratchpad
 org.apache.isis.applib.services.swagger.SwaggerServiceMenu
 org.apache.isis.applib.services.tablecol.TableColumnOrderService$Default
 org.apache.isis.applib.services.urlencoding.UrlEncodingServiceWithCompression
-org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment
+org.apache.isis.commons.internal.environment.IsisSystemEnvironment
 org.apache.isis.config.IsisConfiguration$PatternsConverter
 org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring
 org.apache.isis.config.beans.WebAppConfigBean
@@ -87,6 +87,6 @@ org.apache.isis.runtime.system.transaction.PersistenceSessionServiceInternalDefa
 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
+#org.apache.isis.security.authorization.bypass.AuthorizorBypass
 org.apache.isis.testdomain.jdo.InventoryResource
 org.apache.isis.wrapper.WrapperFactoryDefault
\ No newline at end of file
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecyleService.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecyleService.java
index f027dca..5f23b49 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecyleService.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecyleService.java
@@ -22,11 +22,11 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.extensions.fixtures.legacy.FixtureClock;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;