You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2019/10/02 08:54:25 UTC

[isis] branch ISIS-2163 created (now 1caca53)

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

danhaywood pushed a change to branch ISIS-2163
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at 1caca53  ISIS-2163: IsisSystemEnvironment is now a Spring-managed bean.

This branch includes the following new commits:

     new 1caca53  ISIS-2163: IsisSystemEnvironment is now a Spring-managed bean.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[isis] 01/01: ISIS-2163: IsisSystemEnvironment is now a Spring-managed bean.

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2163
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 1caca530e1eb1020cd8df31a343242bfd3059777
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Oct 2 09:17:06 2019 +0100

    ISIS-2163: IsisSystemEnvironment is now a Spring-managed bean.
    
    To ease migration, provides a static IsisSystemEnvironment#get()
---
 .../isis/commons/internal/context/_Context.java    | 22 +----
 .../plugins/environment/IsisSystemEnvironment.java | 95 +++++++++++-----------
 .../IsisSystemEnvironmentProvider.java}            | 26 ++++--
 .../org/apache/isis/config/IsisConfigModule.java   |  4 +-
 .../isis/config/IsisConfigurationLegacy.java       | 12 +--
 .../metamodel/specloader/IntrospectionMode.java    |  5 +-
 .../action/ActionAnnotationFacetFactory.java       |  3 +-
 .../param/DeriveFacetsPostProcessor.java           |  3 +-
 .../services/grid/GridLoaderServiceDefault.java    |  4 +-
 .../services/grid/GridSystemServiceAbstract.java   |  4 +-
 .../services/registry/ServiceRegistryDefault.java  |  5 +-
 .../isis/metamodel/spec/feature/ObjectAction.java  |  5 +-
 .../specloader/SpecificationLoaderDefault.java     | 10 ++-
 .../specimpl/ObjectSpecificationAbstract.java      |  2 +-
 .../confmenu/ConfigurationViewServiceDefault.java  | 13 ++-
 .../services/i18n/po/TranslationServicePo.java     |  4 +-
 .../menubars/MenuBarsLoaderServiceDefault.java     |  4 +-
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |  4 +-
 .../modules/h2console/WebModuleH2Console.java      |  5 +-
 .../fixtures/LogonFixtureAuthenticator.java        |  8 +-
 .../jmocking/JUnitRuleMockery2.java                |  4 +-
 .../rendering/util/JsonWriterUtil.java             |  7 +-
 .../wicket/viewer/IsisWicketApplication.java       | 49 ++++++-----
 .../isis/viewer/wicket/viewer/WebModuleWicket.java |  6 +-
 .../collection/AssociatedWithActionsHelper.java    |  3 +-
 .../ajaxtable/PrototypingMessageProvider.java      |  3 +-
 .../fixtures/FixturesLifecyleService.java          |  4 +-
 27 files changed, 169 insertions(+), 145 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/context/_Context.java b/core/commons/src/main/java/org/apache/isis/commons/internal/context/_Context.java
index ece5d05..acb3790 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/context/_Context.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/context/_Context.java
@@ -29,12 +29,9 @@ import java.util.function.Supplier;
 import org.apache.isis.commons.collections.Bin;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
-import static org.apache.isis.commons.internal.base._With.ifPresentElseGet;
-import static org.apache.isis.commons.internal.base._With.ifPresentElseThrow;
-import static org.apache.isis.commons.internal.base._With.requires;
+import static org.apache.isis.commons.internal.base._With.*;
 
 /**
  * <h1>- internal use only -</h1>
@@ -353,23 +350,6 @@ public final class _Context {
         return Class.forName(className, true, getDefaultClassLoader());
     }
 
-    // -- ENVIRONMENT
-
-    /** framework internal, exposed by IsisContext */
-    public static IsisSystemEnvironment getEnvironment() {
-        return getOrElse(IsisSystemEnvironment.class, ()->IsisSystemEnvironment.DEFAULT); 
-    }
-
-    /** framework internal, shortcut for convenience */
-    public static boolean isPrototyping() {
-        return getEnvironment().getDeploymentType().isPrototyping();
-    }
-
-    /** framework internal, shortcut for convenience */
-    public static boolean isUnitTesting() {
-        return getEnvironment().isUnitTesting();
-    }
-
     // -- HELPER
 
     private static void tryClose(Object singleton) {
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/plugins/environment/IsisSystemEnvironment.java
index 8aa26d3..ba500d2 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/plugins/environment/IsisSystemEnvironment.java
@@ -19,6 +19,7 @@
 package org.apache.isis.commons.internal.plugins.environment;
 
 import org.apache.isis.commons.internal.base._Lazy;
+import org.springframework.stereotype.Service;
 
 /**
  * Represents configuration, that is available in an early phase of bootstrapping. 
@@ -26,17 +27,18 @@ import org.apache.isis.commons.internal.base._Lazy;
  * 
  * @since 2.0
  */
-public interface IsisSystemEnvironment {
+@Service
+public class IsisSystemEnvironment {
 
-    // -- INTERFACE
+    private static _Lazy<IsisSystemEnvironment> singleton = _Lazy.threadSafe(IsisSystemEnvironment::new);
 
-    public DeploymentType getDeploymentType();
-    public boolean isUnitTesting();
-
-    // -- FACTORIES
-
-    public static IsisSystemEnvironment getDefault() {
-        return DEFAULT;
+    /**
+     * @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();
     }
 
     // -- INIT
@@ -47,7 +49,7 @@ public interface IsisSystemEnvironment {
      * Must be set prior to configuration bootstrapping.
      * @param isUnitTesting
      */
-    public static void setUnitTesting(boolean isUnitTesting) {
+    public void setUnitTesting(boolean isUnitTesting) {
         System.setProperty("UNITTESTING", ""+isUnitTesting);
     }
 
@@ -56,65 +58,60 @@ public interface IsisSystemEnvironment {
      * Must be set prior to configuration bootstrapping.
      * @param isPrototyping
      */
-    public static void setPrototyping(boolean isPrototyping) {
+    public void setPrototyping(boolean isPrototyping) {
         System.setProperty("PROTOTYPING", ""+isPrototyping);
     }
 
-    // -- DEFAULT IMPLEMENTATION
-
-    public static final IsisSystemEnvironment DEFAULT = new IsisSystemEnvironment() {
 
-        @Override
-        public DeploymentType getDeploymentType() {
-            return deploymentType.get();
-        }
-
-        @Override
-        public boolean isUnitTesting() {
-            return "true".equalsIgnoreCase(System.getProperty("UNITTESTING"));
-        }
+    public DeploymentType getDeploymentType() {
+        return decideDeploymentType();
+    }
 
-        // -- HELPER
+    public boolean isUnitTesting() {
+        return "true".equalsIgnoreCase(System.getProperty("UNITTESTING"));
+    }
 
-        private _Lazy<DeploymentType> deploymentType = _Lazy.threadSafe(this::decideDeploymentType); 
+    public boolean isPrototyping() {
+        return getDeploymentType().isPrototyping();
+    }
 
-        private DeploymentType decideDeploymentType() {
-            boolean anyVoteForPrototyping = false;
-            boolean anyVoteForProduction = false;
+    // -- HELPER
 
-            // system environment priming (lowest prio)
+    private DeploymentType decideDeploymentType() {
+        boolean anyVoteForPrototyping = false;
+        boolean anyVoteForProduction = false;
 
-            anyVoteForPrototyping|=
-                    "true".equalsIgnoreCase(System.getenv("PROTOTYPING"));
+        // system environment priming (lowest prio)
 
-            // system property priming (medium prio)
+        anyVoteForPrototyping|=
+                "true".equalsIgnoreCase(System.getenv("PROTOTYPING"));
 
-            anyVoteForPrototyping|=
-                    "true".equalsIgnoreCase(System.getProperty("PROTOTYPING"));
+        // system property priming (medium prio)
 
-            anyVoteForPrototyping|=
-                    "PROTOTYPING".equalsIgnoreCase(System.getProperty("isis.deploymentType"));
+        anyVoteForPrototyping|=
+                "true".equalsIgnoreCase(System.getProperty("PROTOTYPING"));
 
-            // system property override (highest prio)
+        anyVoteForPrototyping|=
+                "PROTOTYPING".equalsIgnoreCase(System.getProperty("isis.deploymentType"));
 
-            anyVoteForProduction|=
-                    "false".equalsIgnoreCase(System.getProperty("PROTOTYPING"));
+        // system property override (highest prio)
 
-            anyVoteForProduction|=
-                    "PRODUCTION".equalsIgnoreCase(System.getProperty("isis.deploymentType"));
+        anyVoteForProduction|=
+                "false".equalsIgnoreCase(System.getProperty("PROTOTYPING"));
 
-            final boolean isPrototyping = anyVoteForPrototyping && !anyVoteForProduction;
+        anyVoteForProduction|=
+                "PRODUCTION".equalsIgnoreCase(System.getProperty("isis.deploymentType"));
 
-            final DeploymentType deploymentType =
-                    isPrototyping
-                    ? DeploymentType.PROTOTYPING
-                            : DeploymentType.PRODUCTION;
+        final boolean isPrototyping = anyVoteForPrototyping && !anyVoteForProduction;
 
-            return deploymentType;
-        }
+        final DeploymentType deploymentType =
+                isPrototyping
+                ? DeploymentType.PROTOTYPING
+                        : DeploymentType.PRODUCTION;
 
+        return deploymentType;
 
-    };
+    }
 
 
 }
diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java b/core/config/src/main/java/org/apache/isis/commons/internal/plugins/environment/IsisSystemEnvironmentProvider.java
similarity index 62%
copy from core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
copy to core/config/src/main/java/org/apache/isis/commons/internal/plugins/environment/IsisSystemEnvironmentProvider.java
index 18bbe2a..bdc469e 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
+++ b/core/config/src/main/java/org/apache/isis/commons/internal/plugins/environment/IsisSystemEnvironmentProvider.java
@@ -16,18 +16,26 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.config;
+package org.apache.isis.commons.internal.plugins.environment;
 
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import java.util.Set;
+
+import javax.inject.Singleton;
+
+import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 
+/**
+ * Simply responsible for instantiating the singleton {@link IsisSystemEnvironment} through its factory method.
+ */
 @Configuration
-@Import({
-    //IsisConfiguration.class // not required
-    IsisConfiguration.PatternsConverter.class
-})
-@EnableConfigurationProperties(IsisConfiguration.class)
-public class IsisConfigModule {
+public class IsisSystemEnvironmentProvider {
 
+    @Bean @Singleton
+    public IsisSystemEnvironment isisSystemEnvironment() {
+        return IsisSystemEnvironment.get();
+    }
 }
+
+
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 18bbe2a..802def9 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
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.config;
 
+import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironmentProvider;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
@@ -25,7 +26,8 @@ import org.springframework.context.annotation.Import;
 @Configuration
 @Import({
     //IsisConfiguration.class // not required
-    IsisConfiguration.PatternsConverter.class
+    IsisConfiguration.PatternsConverter.class,
+    IsisSystemEnvironmentProvider.class
 })
 @EnableConfigurationProperties(IsisConfiguration.class)
 public class IsisConfigModule {
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 a1976b8..2980256 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,6 @@ import java.util.Map;
 import java.util.TreeMap;
 
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 
 import lombok.val;
@@ -58,7 +57,7 @@ public interface IsisConfigurationLegacy {
 
     // -- VERSION
 
-    public static String getVersion() {
+    public default String getVersion() {
         return "2.0.0-M3";
     }
 
@@ -207,13 +206,6 @@ public interface IsisConfigurationLegacy {
      */
     Map<String, String> copyToMap();
 
-    /**
-     * pre-bootstrapping configuration
-     */
-    default public IsisSystemEnvironment getEnvironment() {
-        return _Context.getEnvironment();
-    }
-
     // -- TO STRING
 
     default public String toStringFormatted() {
@@ -225,7 +217,7 @@ public interface IsisConfigurationLegacy {
                 ConfigurationConstants.maskIfProtected(configuration.copyToMap(), TreeMap::new);
 
         String head = String.format("APACHE ISIS %s (%s) ", 
-                IsisConfigurationLegacy.getVersion(), getEnvironment().getDeploymentType().name());
+                getVersion(), IsisSystemEnvironment.get().getDeploymentType().name());
         final int fillCount = 46-head.length();
         final int fillLeft = fillCount/2;
         final int fillRight = fillCount-fillLeft;
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 e027eb7..569ea62 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
@@ -20,6 +20,7 @@ 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.config.IsisConfiguration;
 
 import lombok.val;
@@ -59,9 +60,9 @@ public enum IntrospectionMode {
 
     protected abstract boolean isFullIntrospect(final DeploymentType deploymentType);
 
-    public static boolean isFullIntrospect(IsisConfiguration configuration) {
+    public static boolean isFullIntrospect(IsisConfiguration configuration, IsisSystemEnvironment isisSystemEnvironment) {
         val introspectionMode = configuration.getReflector().getIntrospector().getMode();
-        return introspectionMode.isFullIntrospect(_Context.getEnvironment().getDeploymentType());
+        return introspectionMode.isFullIntrospect(isisSystemEnvironment.getDeploymentType());
     }
     
 }
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 52bfcac..53bb4b7 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,6 +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.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
@@ -174,7 +175,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         // search for @Action(restrictTo=...)
         final List<Action> actions = Annotations.getAnnotations(method, Action.class);
         PrototypeFacet facet = PrototypeFacetForActionAnnotation.create(actions, holder,
-                _Context.getEnvironment().getDeploymentType());
+                IsisSystemEnvironment.get().getDeploymentType());
 
         FacetUtil.addFacet(facet);
     }
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 24aa146..b5bec30 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,6 +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.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facets.Annotations;
@@ -605,7 +606,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
     private List<ActionType> inferActionTypes() {
         final List<ActionType> actionTypes = _Lists.newArrayList();
         actionTypes.add(ActionType.USER);
-        if (_Context.isPrototyping()) {
+        if (IsisSystemEnvironment.get().isPrototyping()) {
             actionTypes.add(ActionType.PROTOTYPE);
         }
         return actionTypes;
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 6933a9a..2ceca3a 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,6 +27,7 @@ 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;
@@ -116,7 +117,7 @@ public class GridLoaderServiceDefault implements GridLoaderService {
 
     @Override
     public boolean supportsReloading() {
-        return _Context.isPrototyping();
+        return isisSystemEnvironment.isPrototyping();
     }
 
     @Override
@@ -243,5 +244,6 @@ public class GridLoaderServiceDefault implements GridLoaderService {
 
     @Inject MessageService messageService;
     @Inject GridReaderUsingJaxb gridReader;
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
 
 }
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 ba19cd7..46e4569 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,6 +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.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
@@ -170,7 +171,7 @@ public abstract class GridSystemServiceAbstract<G extends org.apache.isis.applib
             }
         } else {
 
-            if(_Context.isPrototyping()) {
+            if(isisSystemEnvironment.isPrototyping()) {
                 messageService.warnUser("Grid metadata errors for " + grid.getDomainClass().getName() + "; check the error log");
             }
             log.error("Grid metadata errors:\n\n{}\n\n", jaxbService.toXml(grid));
@@ -693,5 +694,6 @@ public abstract class GridSystemServiceAbstract<G extends org.apache.isis.applib
     @Inject protected TranslationService translationService;
     @Inject protected JaxbService jaxbService;
     @Inject protected MessageService messageService;
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
 
 }
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 48c29b2..17b6613 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
@@ -23,8 +23,10 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
@@ -79,7 +81,7 @@ public final class ServiceRegistryDefault implements ServiceRegistry, Applicatio
         isisConfigurationLegacy = _Config.getConfiguration(); // finalize config
 
         // dump config to log
-        if(log.isInfoEnabled() && !isisConfigurationLegacy.getEnvironment().isUnitTesting()) {
+        if(log.isInfoEnabled() && !isisSystemEnvironment.isUnitTesting()) {
             log.info("\n" + _Config.getConfiguration().toStringFormatted());
         }    
 
@@ -152,5 +154,6 @@ public final class ServiceRegistryDefault implements ServiceRegistry, Applicatio
 
     }
 
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
 
 }
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 5a44e34..837b06c 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,6 +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.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
@@ -307,7 +308,7 @@ public interface ObjectAction extends ObjectMember {
             final List<ObjectAction> topLevelActions = _Lists.newArrayList();
 
             addTopLevelActions(adapter, ActionType.USER, topLevelActions);
-            if(_Context.isPrototyping()) {
+            if(IsisSystemEnvironment.get().isPrototyping()) {
                 addTopLevelActions(adapter, ActionType.PROTOTYPE, topLevelActions);
             }
             return topLevelActions;
@@ -342,7 +343,7 @@ public interface ObjectAction extends ObjectMember {
             final List<ObjectAction> associatedActions = _Lists.newArrayList();
 
             addActions(adapter, ActionType.USER, association, associatedActions);
-            if(_Context.isPrototyping()) {
+            if(IsisSystemEnvironment.get().isPrototyping()) {
                 addActions(adapter, ActionType.PROTOTYPE, association, associatedActions);
             }
 
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 6782b42..3cae6ba 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,6 +26,7 @@ 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;
@@ -103,7 +104,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
         val instance = new SpecificationLoaderDefault(); 
 
-        instance.configuration = configuration;
+        instance.isisConfiguration = configuration;
         instance.programmingModel = programmingModel;
         instance.metaModelValidator = metaModelValidator;
 
@@ -237,7 +238,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
      * deployment mode and configuration
      */
     private boolean isFullIntrospect() {
-        return IntrospectionMode.isFullIntrospect(configuration);
+        return IntrospectionMode.isFullIntrospect(isisConfiguration, isisSystemEnvironment);
     }
 
 
@@ -365,7 +366,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
             final Collection<ObjectSpecification> specs, 
             final IntrospectionState upTo) {
 
-        val isConcurrentFromConfig = configuration.getReflector().getIntrospector().isParallelize();
+        val isConcurrentFromConfig = isisConfiguration.getReflector().getIntrospector().isParallelize();
 
         val runSequential = !isConcurrentFromConfig;
         
@@ -402,7 +403,8 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
     @Inject private ProgrammingModelService programmingModelService;
     @Inject private MetaModelValidatorService metaModelValidatorService; 
-    @Inject private IsisConfiguration configuration;
+    @Inject private IsisConfiguration isisConfiguration;
+    @Inject private IsisSystemEnvironment isisSystemEnvironment;
 
     // -- DEPRECATED
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 41638b7..f16ba31 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -712,7 +712,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             return oa;
         }
         //TODO [2033] remove or replace        
-        //        if(_Context.isPrototyping()) {
+        //        if(IsisSystemEnvironment.get().isPrototyping()) {
         //            // automatically refresh if not in production
         //            // (better support for jrebel)
         //
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 77896f9..f6cca48 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
@@ -23,12 +23,15 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
+import javax.inject.Inject;
+
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 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.config.ConfigurationConstants;
 import org.apache.isis.config.IsisConfigurationLegacy;
 import org.apache.isis.config.internal._Config;
@@ -54,12 +57,12 @@ public class ConfigurationViewServiceDefault implements ConfigurationViewService
 
         final Map<String, ConfigurationProperty> map = new HashMap<>();
 
-        _Config.getConfiguration().copyToMap().forEach((k, v)->add(k, v, map));
+        isisConfigurationLegacy.copyToMap().forEach((k, v)->add(k, v, map));
 
         // for convenience add some additional info to the top ...
-        add("[ Isis Version ]", IsisConfigurationLegacy.getVersion(), map);
-        add("[ Deployment Type ]", _Context.getEnvironment().getDeploymentType().name(), map);
-        add("[ Unit Testing ]", ""+_Context.getEnvironment().isUnitTesting(), map);
+        add("[ Isis Version ]", isisConfigurationLegacy.getVersion(), map);
+        add("[ Deployment Type ]", isisSystemEnvironment.getDeploymentType().name(), map);
+        add("[ Unit Testing ]", ""+isisSystemEnvironment.isUnitTesting(), map);
 
         return map;
     }
@@ -71,4 +74,6 @@ public class ConfigurationViewServiceDefault implements ConfigurationViewService
         map.put(key, new ConfigurationProperty(key, value));
     }
 
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
+    @Inject IsisConfigurationLegacy isisConfigurationLegacy;
 }
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 d031b3a..736ebd1 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,6 +22,7 @@ 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;
@@ -84,7 +85,7 @@ public class TranslationServicePo implements TranslationService {
     }
 
     protected boolean isPrototypeOrTest() {
-        return _Context.isPrototyping();
+        return isisSystemEnvironment.isPrototyping();
     }
 
     @PreDestroy
@@ -173,5 +174,6 @@ public class TranslationServicePo implements TranslationService {
         return localeProviders.get();
     }
 
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
 
 }
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 e7be9b7..7074dbe 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,6 +23,7 @@ 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;
@@ -42,7 +43,7 @@ public class MenuBarsLoaderServiceDefault implements MenuBarsLoaderService {
 
     @Override
     public boolean supportsReloading() {
-        return _Context.isPrototyping();
+        return isisSystemEnvironment.isPrototyping();
     }
 
     @Override
@@ -111,5 +112,6 @@ public class MenuBarsLoaderServiceDefault implements MenuBarsLoaderService {
     @Inject JaxbService jaxbService;
     @Autowired(required = false) WebAppConfigBean webAppConfigBean;
 
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
 }
 
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 47b8e14..f002355 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,6 +27,7 @@ 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;
@@ -174,7 +175,7 @@ public class MenuBarsServiceBS3 implements MenuBarsService {
 
         menuBars.setMetadataError(
                 "Exactly one menu must have 'unreferencedActions' flag set; found " + size + " such menus");
-        if(_Context.isPrototyping()) {
+        if(isisSystemEnvironment.isPrototyping()) {
             messageService.warnUser("Menubars metadata errors; check the error log");
         }
         log.error("Menubar layout metadata errors:\n\n{}\n\n", jaxbService.toXml(menuBars));
@@ -393,6 +394,7 @@ public class MenuBarsServiceBS3 implements MenuBarsService {
     @Inject MenuBarsLoaderService menuBarsLoaderService;
     @Inject MessageService messageService;
     @Inject JaxbService jaxbService;
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
 
 }
 
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 d4ec2b1..93ff78c 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,6 +23,7 @@ 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;
@@ -40,7 +41,7 @@ import lombok.val;
 @Service @Order(0)
 public class WebModuleH2Console implements WebModule  {
 
-    @Inject private IsisConfigurationLegacy isisConfigurationLegacy;
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
     @Inject IsisConfiguration isisConfiguration;
 
 
@@ -85,7 +86,7 @@ public class WebModuleH2Console implements WebModule  {
 
     private boolean canEnable(WebModuleContext ctx) {
 
-        if(!isisConfigurationLegacy.getEnvironment().getDeploymentType().isPrototyping()) {
+        if(!isisSystemEnvironment.getDeploymentType().isPrototyping()) {
             return false;
         }
 
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 396cd4e..99dca52 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,10 +19,14 @@
 
 package org.apache.isis.security.authentication.fixtures;
 
-import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 import org.apache.isis.security.authentication.AuthenticationRequest;
 import org.apache.isis.security.authentication.standard.AuthenticatorAbstract;
 
+/**
+ * @deprecated - I suspect that this code is no longer used anywhere...
+ */
+@Deprecated
 public class LogonFixtureAuthenticator extends AuthenticatorAbstract {
 
     public LogonFixtureAuthenticator() {
@@ -39,7 +43,7 @@ public class LogonFixtureAuthenticator extends AuthenticatorAbstract {
 
     @Override
     protected final boolean isValid(final AuthenticationRequest request) {
-        return _Context.isPrototyping();
+        return IsisSystemEnvironment.get().isPrototyping();
     }
 
 
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 5ca80f4..cf6d048 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,6 +24,7 @@ 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;
@@ -36,7 +37,6 @@ import org.picocontainer.MutablePicoContainer;
 import org.picocontainer.PicoBuilder;
 
 import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.commons.internal.plugins.environment.IsisSystemEnvironment;
 
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
@@ -69,7 +69,7 @@ public class JUnitRuleMockery2 extends JUnit4Mockery implements MethodRule {
      * Factory method.
      */
     public static JUnitRuleMockery2 createFor(final Mode mode) {
-        IsisSystemEnvironment.setUnitTesting(true);
+        IsisSystemEnvironment.get().setUnitTesting(true);
         final JUnitRuleMockery2 jUnitRuleMockery2 = new JUnitRuleMockery2();
         if (mode == Mode.INTERFACES_AND_CLASSES) {
             jUnitRuleMockery2.setImposteriser(Imposterisers.getDefault());
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 b8f7548..dbc07c4 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,6 +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.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
@@ -38,12 +39,8 @@ public final class JsonWriterUtil {
         }
     }
 
-    static IsisSessionFactory getIsisSessionFactory() {
-        return IsisContext.getSessionFactory();
-    }
-
     private static JsonMapper.PrettyPrinting inferPrettyPrinting() {
-        return _Context.isPrototyping() 
+        return IsisSystemEnvironment.get().isPrototyping()
                 ? JsonMapper.PrettyPrinting.ENABLE 
                         : JsonMapper.PrettyPrinting.DISABLE;
     }
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 f64fea0..3d1263a 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
@@ -28,6 +28,8 @@ 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;
@@ -143,10 +145,15 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
         return (IsisWicketApplication) AuthenticatedWebApplication.get();
     }
 
-    @Inject private ComponentFactoryRegistry componentFactoryRegistry;
-    @Inject private PageClassRegistry pageClassRegistry;
-    @Inject private WicketViewerSettings settings;
+    private ServiceRegistry serviceRegistry;
+
+    // injected manually
+    private ComponentFactoryRegistry componentFactoryRegistry;
+    private PageClassRegistry pageClassRegistry;
+    private WicketViewerSettings settings;
+
     private IsisConfiguration configuration;
+    private IsisSystemEnvironment isisSystemEnvironment;
 
     //    @Inject private ImageResourceCache imageCache;
     //    @Inject private WicketViewerSettings wicketViewerSettings;
@@ -203,9 +210,21 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
     @Override
     protected void init() {
 
-        configuration = IsisContext.getConfiguration();
-        
-        val serviceRegistry = IsisContext.getServiceRegistry();
+        // resolve injection points 'manually', after first looking up the serviceRegistry from our IsisContext.
+
+        // XXX it would be nice to have Spring inject into this class instead.
+        this.serviceRegistry = IsisContext.getServiceRegistry();
+
+        //XXX don't rely on ServiceInjector, since it can run in different configurable modes. (Hmm... not sure what this means?)
+        //serviceInjector.injectServicesInto(this);
+        {
+            configuration = serviceRegistry.lookupServiceElseFail(IsisConfiguration.class);
+            componentFactoryRegistry = serviceRegistry.lookupServiceElseFail(ComponentFactoryRegistry.class);
+            pageClassRegistry = serviceRegistry.lookupServiceElseFail(PageClassRegistry.class);
+            settings = serviceRegistry.lookupServiceElseFail(WicketViewerSettings.class);
+            isisSystemEnvironment = serviceRegistry.lookupServiceElseFail(IsisSystemEnvironment.class);
+        }
+
         val backgroundInitializationTasks = createBackgroundInitializationTasks();
         
         try {
@@ -222,17 +241,9 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
             requestCycleListeners.add(new PageRequestHandlerTracker());
 
 
-            // Initialize Spring Dependency Injection
+            // Initialize Spring Dependency Injection (into Wicket components)
             getComponentInstantiationListeners().add(new SpringComponentInjector(this));
 
-            //XXX don't rely on ServiceInjector, since it can run in different configurable modes
-            //serviceInjector.injectServicesInto(this);
-
-            { // resolve injection points 'manually' 
-                componentFactoryRegistry = serviceRegistry.lookupServiceElseFail(ComponentFactoryRegistry.class);
-                pageClassRegistry = serviceRegistry.lookupServiceElseFail(PageClassRegistry.class);
-                settings = serviceRegistry.lookupServiceElseFail(WicketViewerSettings.class);
-            }
 
 
             if (requestCycleListenerForIsis instanceof WebRequestCycleForIsis) {
@@ -268,7 +279,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
                 log(metaModelDeficiencies.getValidationErrors());
             }
 
-            if(_Context.isPrototyping()) {
+            if(isisSystemEnvironment.isPrototyping()) {
                 DebugDiskDataStore.register(this);
                 log.debug("DebugDiskDataStore registered; access via ~/wicket/internal/debug/diskDataStore");
                 log.debug("DebugDiskDataStore: eg, http://localhost:8080/wicket/wicket/internal/debug/diskDataStore");
@@ -344,7 +355,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
      * app is restarted.
      */
     String defaultEncryptionKey() {
-        return _Context.isPrototyping()
+        return isisSystemEnvironment.isPrototyping()
                 ? "PrototypingEncryptionKey"
                         : UUID.randomUUID().toString();
     }
@@ -379,7 +390,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
     }
 
     protected void configureWicketSourcePlugin() {
-        if(_Context.isPrototyping()) {
+        if(isisSystemEnvironment.isPrototyping()) {
             WicketSource.configure(this);
         }
     }
@@ -579,7 +590,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
 
             @Override //[ahuber] final on purpose! to switch DeploymentType, do this consistent with IsisContext.
             public final RuntimeConfigurationType getConfigurationType() {
-                return _Context.isPrototyping()
+                return IsisSystemEnvironment.get().isPrototyping()
                         ? RuntimeConfigurationType.DEVELOPMENT
                                 : RuntimeConfigurationType.DEPLOYMENT;
             }
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 b4cddb3..c045a75 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
@@ -18,12 +18,14 @@
  */
 package org.apache.isis.viewer.wicket.viewer;
 
+import javax.inject.Inject;
 import javax.servlet.Filter;
 import javax.servlet.FilterRegistration.Dynamic;
 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;
 
@@ -56,6 +58,8 @@ public final class WebModuleWicket implements WebModule  {
     private String deploymentMode;
     private String appConfigValue;
 
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
+
     @Override
     public String getName() {
         return "Wicket";
@@ -72,7 +76,7 @@ public final class WebModuleWicket implements WebModule  {
         
         pathConfigValue = wicketConf.getBasePath();
 
-        deploymentMode = _Context.isPrototyping()
+        deploymentMode = isisSystemEnvironment.isPrototyping()
                 ? "development" 
                         : "deployment";
 
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 ba44ed7..0d0f02b 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,6 +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.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.spec.ActionType;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
@@ -75,7 +76,7 @@ public class AssociatedWithActionsHelper implements Serializable {
     private static List<ActionType> inferActionTypes() {
         final List<ActionType> actionTypes = _Lists.newArrayList();
         actionTypes.add(ActionType.USER);
-        if ( _Context.isPrototyping() ) {
+        if ( IsisSystemEnvironment.get().isPrototyping() ) {
             actionTypes.add(ActionType.PROTOTYPE);
         }
         return actionTypes;
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 d3dc7f0..17dc6d3 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,6 +20,7 @@ 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;
 
@@ -56,7 +57,7 @@ class PrototypingMessageProvider {
 
     private static String getTookTimingMessage() {
 
-        if(!_Context.isPrototyping()) {
+        if(!IsisSystemEnvironment.get().isPrototyping()) {
             return "";
         }
 
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 63b02bd..f027dca 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,6 +22,7 @@ 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;
@@ -33,6 +34,7 @@ import org.apache.isis.runtime.system.session.IsisSessionFactory;
 public class FixturesLifecyleService {
 
     @Inject IsisSessionFactory isisSessionFactory; // depends on  
+    @Inject IsisSystemEnvironment isisSystemEnvironment;
 
     @PostConstruct
     public void postConstruct() {
@@ -41,7 +43,7 @@ public class FixturesLifecyleService {
         // ValueSemanticsProvider for a date value type) needs to use the Clock singleton
         // we do this after loading the services to allow a service to prime a different clock
         // implementation (eg to use an NTP time service).
-        if (_Context.isPrototyping() && !Clock.isInitialized()) {
+        if (isisSystemEnvironment.isPrototyping() && !Clock.isInitialized()) {
             FixtureClock.initialize();
         }