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 2018/11/25 16:04:47 UTC

[isis] branch 2039-Redesign_of_Config updated: ISIS-2039: on web-context: move the config bootstrapping from wicket module to the main ServletContextListener

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

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


The following commit(s) were added to refs/heads/2039-Redesign_of_Config by this push:
     new d95dc8a  ISIS-2039: on web-context: move the config bootstrapping from wicket module to the main ServletContextListener
d95dc8a is described below

commit d95dc8a07351770bd74165c5d918e2d8ead5c289
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Nov 25 17:04:42 2018 +0100

    ISIS-2039: on web-context: move the config bootstrapping from wicket
    module to the main ServletContextListener
    
    such that the wicket module is no longer responsible for initiating the
    framework
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2039
---
 .../java/org/apache/isis/applib/AppManifest.java   |   1 -
 core/config/pom.xml                                |   8 +
 .../core/commons/config/IsisConfiguration.java     |   7 -
 .../isis/core/commons/config}/WebAppConstants.java |   3 +-
 .../IsisConfigurationBuilderDefault.java           |  27 +--
 .../configbuilder/IsisConfigurationDefault.java    |   6 +-
 .../commons/configbuilder/ModulePackageHelper.java |   6 +-
 .../configbuilder/PrimerForServletContext.java}    |  78 +++++----
 .../IsisSystemEnvironmentPluginForTesting.java     |  45 -----
 .../core/metamodel/progmodel/FacetFactorySet.java  |  23 ---
 .../runtime/headless/IsisSystemBootstrapper.java   |  30 ----
 .../services/ServicesInstallerFromAnnotation.java  |   2 +-
 .../core/runtime/system/context/IsisContext.java   | 104 ++++++------
 .../IsisComponentProvider.java                     | 188 ---------------------
 .../isis/core/webapp/IsisWebAppBootstrapper.java   | 100 -----------
 .../core/webapp/IsisWebAppContextListener.java     |  10 +-
 .../auth/AuthenticationSessionStrategyDefault.java |   2 +-
 .../apache/isis/core/webapp/modules/WebModule.java |   4 +-
 .../isis/core/webapp/modules/WebModuleContext.java |  28 +--
 .../modules/WebModule_FallbackBootstrapper.java    |  50 ------
 .../core/webapp/modules/WebModule_RestEasy.java    |   5 +-
 .../isis/core/webapp/modules/WebModule_Wicket.java |   7 +-
 .../wicket/viewer/IsisWicketApplication.java       |  49 ------
 .../viewer/integration/isis/IsisInjectModule.java  |   9 +-
 .../services/TranslationsResolverWicket.java       |   3 +-
 25 files changed, 160 insertions(+), 635 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
index 972f5c0..a30dc03 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
@@ -339,7 +339,6 @@ public interface AppManifest {
             // automatically install any fixtures that might have been registered
             map.put(ISIS_PERSISTOR_DATANUCLEUS + "install-fixtures", "true");
             map.put(ISIS_PERSISTOR + "enforceSafeSemantics", "false");
-            map.put("isis.deploymentType", "server_prototype");
             map.put("isis.services.eventbus.allowLateRegistration", "true");
 
             return map;
diff --git a/core/config/pom.xml b/core/config/pom.xml
index f7b2241..415e0cd 100644
--- a/core/config/pom.xml
+++ b/core/config/pom.xml
@@ -72,6 +72,13 @@
         	<version>${jdo-api.version}</version>
         	<scope>provided</scope>
         </dependency>
+        
+        <!-- [2039] only to configure log4j from servlet context resources -->
+		<dependency>
+        	<groupId>org.apache.isis.core</groupId>
+        	<artifactId>isis-core-log4j</artifactId>
+        	<scope>provided</scope>
+        </dependency>
     
         <!-- TESTS -->
         <dependency>
@@ -97,6 +104,7 @@
         	<type>test-jar</type>
         </dependency>
 
+
     </dependencies>
 
     <profiles>
diff --git a/core/config/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
index f63b470..0afd092 100644
--- a/core/config/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
@@ -108,13 +108,6 @@ public interface IsisConfiguration {
     public AppManifest2 getAppManifest();
 
     /**
-     * @since 2.0.0-M2
-     * @deprecated [2039] only used to trigger type discovery with registration 
-     */
-    public void triggerTypeDiscovery();
-    
-
-    /**
      * Creates a new IsisConfiguration containing the properties starting with
      * the specified prefix. The names of the new properties will have the
      * prefixed stripped. This is similar to the {@link #getProperties(String)}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/WebAppConstants.java b/core/config/src/main/java/org/apache/isis/core/commons/config/WebAppConstants.java
similarity index 95%
rename from core/runtime/src/main/java/org/apache/isis/core/webapp/WebAppConstants.java
rename to core/config/src/main/java/org/apache/isis/core/commons/config/WebAppConstants.java
index f3bf67b..1de4c3b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/WebAppConstants.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/config/WebAppConstants.java
@@ -17,10 +17,9 @@
  *  under the License.
  */
 
-package org.apache.isis.core.webapp;
+package org.apache.isis.core.commons.config;
 
 import org.apache.isis.applib.fixtures.LogonFixture;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
 
 public final class WebAppConstants {
 
diff --git a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java
index b346843..50c9b02 100644
--- a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java
@@ -151,6 +151,7 @@ final class IsisConfigurationBuilderDefault implements IsisConfigurationBuilder
         primeWith(new PrimerForSystemProperties());
         primeWith(new PrimerForEnvironmentVariablesIsisPrefix());
         primeWith(new PrimerForEnvironmentVariableISIS_OPTS());
+        primeWith(new PrimerForServletContext());
     }
 
     // -- addResourceStreamSource, addResourceStreamSources
@@ -324,19 +325,15 @@ final class IsisConfigurationBuilderDefault implements IsisConfigurationBuilder
 
     @Override
     public IsisConfiguration build() {
+
+        configuration.triggerTypeDiscovery();
         
         if (LOG.isDebugEnabled()) {
             dumpResourcesToLog();    
         }
 
         final IsisConfigurationDefault ref = configuration;
-
-//TODO[2039] no need to copy        
-//        final IsisConfigurationDefault copy = new IsisConfigurationDefault(resourceStreamSourceChain);
-//        final Properties props = new Properties();
-//        props.putAll(configuration.asMap());
-//        copy.add(props, ContainsPolicy.OVERWRITE);
-
+        
         configuration = null; // once built this builder is no longer usable
         
         return ref;
@@ -359,16 +356,10 @@ final class IsisConfigurationBuilderDefault implements IsisConfigurationBuilder
         }
     }
 
-    //TODO[2039]
-    //    private final static ToString<IsisConfigurationBuilder> toString =
-    //            ToString.<IsisConfigurationBuilder>
-    //    toString("resourceStream", x->x.resourceStreamSourceChain)
-    //    .thenToString("configResources", x->x.configurationResourcesFound)
-    //    ;
-    //
-    //    @Override
-    //    public String toString() {
-    //        return toString.toString(this);
-    //    }
+    @Override
+    public String toString() {
+        return String.format("IsisConfigurationBuilder {resourceStream=%s, configResources=%s}", 
+                resourceStreamSourceChain, configurationResourcesFound);
+    }
 
 }
diff --git a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationDefault.java b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationDefault.java
index a5e8ff6..25c20f98 100644
--- a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationDefault.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationDefault.java
@@ -94,17 +94,15 @@ class IsisConfigurationDefault implements IsisConfiguration {
     }
     
     // ////////////////////////////////////////////////
-    // Module Package Names
+    // Type Discovery
     // ////////////////////////////////////////////////
     
-    _Lazy<Integer> typeDiscovery = _Lazy.threadSafe(ModulePackageHelper::triggerTypeDiscovery);
+    _Lazy<Integer> typeDiscovery = _Lazy.threadSafe(()->ModulePackageHelper.runTypeDiscovery(this.getAppManifest()));
     
-    @Override
     public void triggerTypeDiscovery() {
         typeDiscovery.get();
     }
     
-    
     // ////////////////////////////////////////////////
     // ResourceStreamSource
     // ////////////////////////////////////////////////
diff --git a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/ModulePackageHelper.java b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/ModulePackageHelper.java
index 6c47d39..53a391b 100644
--- a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/ModulePackageHelper.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/ModulePackageHelper.java
@@ -25,7 +25,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlElement;
 
 import org.apache.isis.applib.AppManifest;
@@ -43,7 +42,6 @@ import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.reflection._Reflect;
-import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.plugins.classdiscovery.ClassDiscovery;
 import org.apache.isis.core.plugins.classdiscovery.ClassDiscoveryPlugin;
 
@@ -52,10 +50,10 @@ import org.apache.isis.core.plugins.classdiscovery.ClassDiscoveryPlugin;
  */
 class ModulePackageHelper {
 
-    public static int triggerTypeDiscovery() {
+    public static int runTypeDiscovery(final AppManifest appManifest) {
         
         final List<String> moduleAndFrameworkPackages = 
-                findAndRegisterTypes(_Config.getConfiguration().getAppManifest());
+                findAndRegisterTypes(appManifest);
         
         return moduleAndFrameworkPackages.size();
         
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigHelper.java b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/PrimerForServletContext.java
similarity index 55%
rename from core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigHelper.java
rename to core/config/src/main/java/org/apache/isis/core/commons/configbuilder/PrimerForServletContext.java
index 048c7de..9b1a1e2 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigHelper.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/PrimerForServletContext.java
@@ -16,56 +16,77 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.webapp;
+package org.apache.isis.core.commons.configbuilder;
+
+import java.util.Enumeration;
+import java.util.Map;
 
 import javax.servlet.ServletContext;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.isis.config.internal._Config;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
+import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.core.commons.config.WebAppConstants;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceCurrentClassClassPath;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceForWebInf;
-import org.apache.isis.core.runtime.runner.opts.OptionHandlerInitParameters;
+import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
 
-/**
- *  
- * @since 2.0.0-M2
- */
-public final class IsisWebAppConfigHelper {
+import static org.apache.isis.commons.internal.base._With.ifPresentElseGet;
+
+class PrimerForServletContext implements IsisConfigurationBuilder.Primer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PrimerForServletContext.class);
     
-    private static final Logger LOG = LoggerFactory.getLogger(IsisWebAppConfigHelper.class);
-    private IsisWebAppConfigHelper() {}
     
-    /**
-     * Initializes the IsisConfiguration subsystem with all currently available configuration values. 
-     * @param servletContext
-     * @return
-     */
-    public static void initConfigurationFrom(final ServletContext servletContext) {
-        _Config.acceptBuilder(builder->{
-            builder.primeWith(new OptionHandlerInitParameters(servletContext));
-//            additionalConfig.forEach((k, v)->builder.put(k, v));
-            addServletContextConstants(servletContext, builder);
-            addResourceStreamSources(servletContext, builder);
-            builder.addDefaultConfigurationResourcesAndPrimers();
-        });
-    }
+    @Override
+    public void prime(final IsisConfigurationBuilder builder) {
+        final ServletContext servletContext  = _Context.getIfAny(ServletContext.class);
+        if(servletContext==null) {
+            return;
+        }
+        
+        asMap(servletContext).forEach((k, v)->builder.put(k, v));
+        addServletContextConstants(servletContext, builder);
+        addResourceStreamSources(servletContext, builder);
+        builder.addDefaultConfigurationResourcesAndPrimers();
+        
+        final String loggingPropertiesDir = 
+                ifPresentElseGet(
+                        servletContext.getInitParameter("isis.config.dir"),
+                        ()->servletContext.getRealPath("/WEB-INF"));
     
-  
+        final IsisLoggingConfigurer loggingConfigurer = new IsisLoggingConfigurer();
+        loggingConfigurer.configureLogging(loggingPropertiesDir, new String[0]);
+
+    }
+
     // -- HELPER
 
+    private static Map<String, String> asMap(ServletContext servletContext) {
+        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
+        final Map<String,String> map = _Maps.newTreeMap();
+        while(initParameterNames.hasMoreElements()) {
+            final String initParameterName = initParameterNames.nextElement();
+            final String initParameterValue = servletContext.getInitParameter(initParameterName);
+            if (initParameterName.startsWith("isis.")) {
+                map.put(initParameterName, initParameterValue);
+            }
+        }
+        return map;
+    }
+    
     private static void addServletContextConstants(
             final ServletContext servletContext,
             final IsisConfigurationBuilder isisConfigurationBuilder) {
-        
+
         final String webappDir = servletContext.getRealPath("/");
         isisConfigurationBuilder.add(WebAppConstants.WEB_APP_DIR, webappDir);
     }
-    
+
     private static void addResourceStreamSources(
             final ServletContext servletContext,
             final IsisConfigurationBuilder builder) {
@@ -84,5 +105,4 @@ public final class IsisWebAppConfigHelper {
         }
     }
 
-    
 }
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/IsisSystemEnvironmentPluginForTesting.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/IsisSystemEnvironmentPluginForTesting.java
deleted file mode 100644
index 7241f24..0000000
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/components/IsisSystemEnvironmentPluginForTesting.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.apache.isis.core.integtestsupport.components;
-
-import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.plugins.environment.DeploymentType;
-import org.apache.isis.core.plugins.environment.IsisSystemEnvironment;
-import org.apache.isis.core.plugins.environment.IsisSystemEnvironmentPlugin;
-
-/**
- * To enable this plugin add a META-INF entry to your application as specified by the 
- * Java 7 ServiceLoader mechanism.
- *  
- * @since 2.0.0-M2
- * @deprecated [2039] experimental
- */
-public class IsisSystemEnvironmentPluginForTesting implements IsisSystemEnvironmentPlugin {
-
-    @Override
-    public IsisSystemEnvironment getIsisSystemEnvironment() {
-        
-        final IsisConfiguration config = getConfiguration();
-        
-        final String deploymentTypeLiteral = config.getString("isis.deploymentType");
-        if(_Strings.isNullOrEmpty(deploymentTypeLiteral)) {
-            return IsisSystemEnvironment.getDefault();
-        }
-        
-        // at this point, the deploymentType seem explicitly set via config, so we override any 
-        // environment variables that might be present
-        
-        // throws if type can not be parsed
-        final DeploymentType deploymentType = DeploymentType.valueOf(deploymentTypeLiteral);
-        
-        return IsisSystemEnvironment.of(deploymentType);
-        
-    }
-    
-    // HELPER
-
-    private IsisConfiguration getConfiguration() {
-        IsisConfiguration configuration = IsisConfiguration.loadDefault();
-        return configuration;
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/FacetFactorySet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/FacetFactorySet.java
index 6a9a994..0f8a38c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/FacetFactorySet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/FacetFactorySet.java
@@ -66,29 +66,6 @@ public interface FacetFactorySet {
     class Util {
         private Util(){}
 
-//[2039]        
-//        public static void includeFacetFactories(final FacetFactorySet programmingModel) {
-//            
-//            final String[] facetFactoriesIncludeClassNames = configurationBuilder.peekAtList(ReflectorConstants.FACET_FACTORY_INCLUDE_CLASS_NAME_LIST);
-//            if (facetFactoriesIncludeClassNames != null) {
-//                for (final String facetFactoryClassName : facetFactoriesIncludeClassNames) {
-//                    final Class<? extends FacetFactory> facetFactory = InstanceUtil.loadClass(facetFactoryClassName, FacetFactory.class);
-//                    programmingModel.addFactory(facetFactory);
-//                }
-//            }
-//        }
-//
-//        public static void excludeFacetFactories(
-//                final IsisConfigurationBuilder configurationBuilder, 
-//                final FacetFactorySet programmingModel) {
-//            
-//            final String[] facetFactoriesExcludeClassNames = configurationBuilder.peekAtList(ReflectorConstants.FACET_FACTORY_EXCLUDE_CLASS_NAME_LIST);
-//            for (final String facetFactoryClassName : facetFactoriesExcludeClassNames) {
-//                final Class<? extends FacetFactory> facetFactory = InstanceUtil.loadClass(facetFactoryClassName, FacetFactory.class);
-//                programmingModel.removeFactory(facetFactory);
-//            }
-//        }
-        
         public static void includeFacetFactories(final IsisConfiguration configuration, final FacetFactorySet programmingModel) {
             final String[] facetFactoriesIncludeClassNames = configuration.getList(ReflectorConstants.FACET_FACTORY_INCLUDE_CLASS_NAME_LIST);
             if (facetFactoriesIncludeClassNames != null) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
index 983e4d2..4bc5ef7 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
@@ -50,28 +50,12 @@ public class IsisSystemBootstrapper {
     private static ThreadLocal<AppManifest2> isftAppManifest = new ThreadLocal<>();
 
     private final IsisConfiguration isisConfiguration;
-//    private final AppManifest2 appManifest2;
     private final LeveledLogger logger;
     
     public static IsisSystemBootstrapper of(LogConfig logConfig, IsisConfiguration isisConfiguration) {
         return new IsisSystemBootstrapper(logConfig, isisConfiguration);
     }
     
-//[2039]
-//    public IsisSystemBootstrapper(
-//            final LogConfig logConfig,
-//            final Module module) {
-//        this(logConfig, AppManifestAbstract2.Builder.forModule(module).build());
-//    }
-//
-//    public IsisSystemBootstrapper(
-//            final LogConfig logConfig,
-//            final AppManifest2 appManifest2) {
-//
-//        this.appManifest2 = appManifest2;
-//        this.logger = new LeveledLogger(LOG, logConfig.getTestLoggingLevel());
-//    }
-
     private IsisSystemBootstrapper(
             final LogConfig logConfig,
             final IsisConfiguration isisConfiguration) {
@@ -79,23 +63,9 @@ public class IsisSystemBootstrapper {
         Ensure.ensure("Should have an IsisConfiguration!", isisConfiguration!=null);
         Ensure.ensure("Should have an AppManifest!", isisConfiguration.getAppManifest()!=null);
 
-//        this.appManifest2 = isisConfiguration.getAppManifest();
         this.isisConfiguration = isisConfiguration;
         this.logger = new LeveledLogger(LOG, logConfig.getTestLoggingLevel());
     }
-    
-//    
-//    public AppManifest2 getAppManifest2() {
-//        return appManifest2;
-//    }
-//
-//    /**
-//     * Corresponding to {@link AppManifest2} provided in {@link #IsisSystemBootstrapper(LogConfig, AppManifest2)}, or
-//     * (equivalently) the {@link Module} provided directly in {@link #IsisSystemBootstrapper(LogConfig, Module)}.
-//     */
-//    public Module getModule() {
-//        return appManifest2.getModule();
-//    }
 
     public IsisSystem bootstrapIfRequired() {
         bootstrapUsingConfig();
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
index ee65e58..5a3570a 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
@@ -75,7 +75,7 @@ public class ServicesInstallerFromAnnotation extends ServicesInstallerAbstract {
 
         try {
            
-            _Config.getConfiguration().triggerTypeDiscovery(); // registers types in registry
+//            _Config.getConfiguration().triggerTypeDiscovery(); // registers types in registry
 
         } finally {
             initialized = true;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
index 85c7c39..a79c0ae 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
@@ -28,13 +28,10 @@ import java.util.function.Supplier;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
-import org.apache.isis.core.plugins.environment.DeploymentType;
 import org.apache.isis.core.plugins.environment.IsisSystemEnvironment;
-import org.apache.isis.core.plugins.environment.IsisSystemEnvironmentPlugin;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSession;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
@@ -96,56 +93,57 @@ public interface IsisContext {
         return _Context.getEnvironment();
     }
 
-    /**
-     * @deprecated use the {@link IsisSystemEnvironmentPlugin} SPI instead
-     */
-    @Deprecated
-    public static class EnvironmentPrimer {
-
-        /**
-         * For integration testing allows to prime the environment via provided parameters. Will not override
-         * any IsisSystemEnvironment instance, that is already registered with the current context, because the 
-         * IsisSystemEnvironment is expected to be an immutable singleton within an application's life-cycle.
-         * @deprecated use the {@link IsisSystemEnvironmentPlugin} SPI instead
-         */
-        @Deprecated
-        public static void primeEnvironment(DeploymentType deploymentType) {
-            _Context.computeIfAbsent(IsisSystemEnvironment.class, __->IsisSystemEnvironment.of(deploymentType));
-        }
-        
-        @Deprecated
-        public static void primeEnvironment(IsisConfigurationBuilder configurationBuilder) {
-            
-            final String deploymentTypeLiteral = configurationBuilder.peekAtString("isis.deploymentType");
-            if(_Strings.isNullOrEmpty(deploymentTypeLiteral)) {
-                return; // do nothing
-            }
-            
-            // at this point, the deploymentType seems explicitly set via config
-            
-            // throws if type can not be parsed
-            final DeploymentType deploymentType = 
-                    parseDeploymentType(deploymentTypeLiteral.toLowerCase());
-            primeEnvironment(deploymentType);
-        }
-
-        private static DeploymentType parseDeploymentType(String deploymentTypeLiteral) {
-            
-            switch(deploymentTypeLiteral) {
-            case "server_prototype":
-            case "prototyping":
-                return DeploymentType.PROTOTYPING;
-            case "server":
-            case "production":
-                return DeploymentType.PROTOTYPING;
-            default:
-                throw new IllegalArgumentException(
-                        String.format("unknown deployment type '%s' in config property '%s'", 
-                                deploymentTypeLiteral, "isis.deploymentType"));
-            }
-
-        }
-    }
+//[2039]    
+//    /**
+//     * @deprecated use the {@link IsisSystemEnvironmentPlugin} SPI instead
+//     */
+//    @Deprecated
+//    public static class EnvironmentPrimer {
+//
+//        /**
+//         * For integration testing allows to prime the environment via provided parameters. Will not override
+//         * any IsisSystemEnvironment instance, that is already registered with the current context, because the 
+//         * IsisSystemEnvironment is expected to be an immutable singleton within an application's life-cycle.
+//         * @deprecated use the {@link IsisSystemEnvironmentPlugin} SPI instead
+//         */
+//        @Deprecated
+//        public static void primeEnvironment(DeploymentType deploymentType) {
+//            _Context.computeIfAbsent(IsisSystemEnvironment.class, __->IsisSystemEnvironment.of(deploymentType));
+//        }
+//        
+//        @Deprecated
+//        public static void primeEnvironment(IsisConfigurationBuilder configurationBuilder) {
+//            
+//            final String deploymentTypeLiteral = configurationBuilder.peekAtString("isis.deploymentType");
+//            if(_Strings.isNullOrEmpty(deploymentTypeLiteral)) {
+//                return; // do nothing
+//            }
+//            
+//            // at this point, the deploymentType seems explicitly set via config
+//            
+//            // throws if type can not be parsed
+//            final DeploymentType deploymentType = 
+//                    parseDeploymentType(deploymentTypeLiteral.toLowerCase());
+//            primeEnvironment(deploymentType);
+//        }
+//
+//        private static DeploymentType parseDeploymentType(String deploymentTypeLiteral) {
+//            
+//            switch(deploymentTypeLiteral) {
+//            case "server_prototype":
+//            case "prototyping":
+//                return DeploymentType.PROTOTYPING;
+//            case "server":
+//            case "production":
+//                return DeploymentType.PROTOTYPING;
+//            default:
+//                throw new IllegalArgumentException(
+//                        String.format("unknown deployment type '%s' in config property '%s'", 
+//                                deploymentTypeLiteral, "isis.deploymentType"));
+//            }
+//
+//        }
+//    }
 
     
     // -- LIFE-CYCLING
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
index 3393fb9..f1bcc24 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
@@ -80,18 +80,9 @@ public final class IsisComponentProvider {
             final AuthorizationManager authorizationManager) {
 
         this.appManifest = requires(appManifest, "appManifest");
-        
-//[2039]        putAppManifestKey(appManifest);
-//        findAndRegisterTypes(appManifest);
-//        specifyServicesAndRegisteredEntitiesUsing(appManifest);
-//        addToConfigurationUsing(appManifest);
 
         this.services = new ServicesInstallerFromConfigurationAndAnnotation().getServices();
 
-        //[2039]using configuration directly instead
-        //final String fixtureClassNamesCsv = classNamesFrom(getAppManifest().getFixtures());
-        //_Config.put(FixturesInstallerFromConfiguration.FIXTURES, fixtureClassNamesCsv);
-
         this.authenticationManager = authenticationManager;
         this.authorizationManager = authorizationManager;
     }
@@ -100,185 +91,6 @@ public final class IsisComponentProvider {
         return appManifest;
     }
 
-    // -- helpers (appManifest)
-//[2039] moved to config module
-//    private void putAppManifestKey(final AppManifest appManifest) {
-//        // required to prevent RegisterEntities validation from complaining
-//        // if it can't find any @PersistenceCapable entities in a module
-//        // that contains only services.
-//        _Config.put(ConfigurationConstants.APP_MANIFEST_KEY, appManifest.getClass().getName() );
-//    }
-//
-//    private void findAndRegisterTypes(final AppManifest appManifest) {
-//        final Stream<String> modulePackages = modulePackageNamesFrom(appManifest);
-//        final AppManifest.Registry registry = AppManifest.Registry.instance();
-//
-//        final List<String> moduleAndFrameworkPackages = _Lists.newArrayList();
-//        moduleAndFrameworkPackages.addAll(AppManifest.Registry.FRAMEWORK_PROVIDED_SERVICES);
-//        
-//        modulePackages.forEach(moduleAndFrameworkPackages::add);
-//
-//        final ClassDiscovery discovery = ClassDiscoveryPlugin.get().discover(moduleAndFrameworkPackages);
-//
-//        final Set<Class<?>> domainServiceTypes = _Sets.newLinkedHashSet();
-//        domainServiceTypes.addAll(discovery.getTypesAnnotatedWith(DomainService.class));
-//        domainServiceTypes.addAll(discovery.getTypesAnnotatedWith(DomainServiceLayout.class));
-//
-//        final Set<Class<?>> persistenceCapableTypes = PersistenceCapableTypeFinder.find(discovery);
-//
-//        final Set<Class<? extends FixtureScript>> fixtureScriptTypes = discovery.getSubTypesOf(FixtureScript.class)
-//                .stream()
-//                .filter(aClass -> {
-//                    // the fixtureScript types are introspected just to provide a drop-down when running fixture scripts
-//                    // in prototyping mode (though they may be introspected lazily if actually run).
-//                    // we therefore try to limit the set of fixture types eagerly introspected at startup
-//                    //
-//                    // specifically, we ignore as a fixture script if annotated with @Programmatic
-//                    // (though directly implementing DiscoverableFixtureScript takes precedence and will NOT ignore)
-//                    return DiscoverableFixtureScript.class.isAssignableFrom(aClass) ||
-//                            Annotations.getAnnotation(aClass, Programmatic.class) == null;
-//                })
-//                .collect(Collectors.toSet());
-//
-//        final Set<Class<?>> domainObjectTypes = _Sets.newLinkedHashSet();
-//        domainObjectTypes.addAll(discovery.getTypesAnnotatedWith(DomainObject.class));
-//        domainObjectTypes.addAll(discovery.getTypesAnnotatedWith(DomainObjectLayout.class));
-//
-//        final Set<Class<?>> mixinTypes = _Sets.newHashSet();
-//        mixinTypes.addAll(discovery.getTypesAnnotatedWith(Mixin.class));
-//        domainObjectTypes.stream()
-//        .filter(input -> {
-//            final DomainObject annotation = input.getAnnotation(DomainObject.class);
-//            return annotation != null && annotation.nature() == Nature.MIXIN;
-//        })
-//        .forEach(mixinTypes::add);
-//
-//        final Set<Class<?>> viewModelTypes = _Sets.newLinkedHashSet();
-//        viewModelTypes.addAll(discovery.getTypesAnnotatedWith(ViewModel.class));
-//        viewModelTypes.addAll(discovery.getTypesAnnotatedWith(ViewModelLayout.class));
-//
-//        final Set<Class<?>> xmlElementTypes = _Sets.newLinkedHashSet();
-//        xmlElementTypes.addAll(discovery.getTypesAnnotatedWith(XmlElement.class));
-//
-//        // add in any explicitly registered services...
-//        domainServiceTypes.addAll(appManifest.getAdditionalServices());
-//
-//        // Reflections seems to have a bug whereby it will return some classes outside the
-//        // set of packages that we want (think this is to do with the fact that it matches based on
-//        // the prefix and gets it wrong); so we double check and filter out types outside our
-//        // required set of packages.
-//
-//        // for a tiny bit of efficiency, we append a '.' to each package name here, outside the loops
-//        List<String> packagesWithDotSuffix =
-//                _Lists.map(moduleAndFrameworkPackages, (@Nullable final String s) -> {
-//                        return s != null ? s + "." : null;
-//                });
-//
-//        registry.setDomainServiceTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, domainServiceTypes));
-//        registry.setPersistenceCapableTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, persistenceCapableTypes));
-//        registry.setFixtureScriptTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, fixtureScriptTypes));
-//        registry.setMixinTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, mixinTypes));
-//        registry.setDomainObjectTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, domainObjectTypes));
-//        registry.setViewModelTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, viewModelTypes));
-//        registry.setXmlElementTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, xmlElementTypes));
-//    }
-//
-//    static <T> Set<Class<? extends T>> withinPackageAndNotAnonymous(
-//            final List<String> packagesWithDotSuffix,
-//            final Set<Class<? extends T>> classes) {
-//        Set<Class<? extends T>> classesWithin = _Sets.newLinkedHashSet();
-//        for (Class<? extends T> clz : classes) {
-//            final String className = clz.getName();
-//            if(containedWithin(packagesWithDotSuffix, className) && notAnonymous(clz)) {
-//                classesWithin.add(clz);
-//            }
-//        }
-//        return classesWithin;
-//    }
-//
-//    static private boolean containedWithin(final List<String> packagesWithDotSuffix, final String className) {
-//        for (String packageWithDotSuffix : packagesWithDotSuffix) {
-//            if (className.startsWith(packageWithDotSuffix)) {
-//                return true;
-//            }
-//        }
-//        return false;
-//    }
-//
-//    private static <T> boolean notAnonymous(final Class<? extends T> clz) {
-//        try {
-//            return !clz.isAnonymousClass();
-//        } catch(NoClassDefFoundError error) {
-//            return false; // ignore, assume anonymous
-//        }
-//    }
-//
-//
-//    private void specifyServicesAndRegisteredEntitiesUsing(final AppManifest appManifest) {
-//        final Stream<String> packageNames = modulePackageNamesFrom(appManifest);
-//        final String packageNamesCsv = packageNames.collect(Collectors.joining(","));
-//
-//        final List<Class<?>> additionalServices = appManifest.getAdditionalServices();
-//        if(additionalServices != null) {
-//            final String additionalServicesCsv = classNamesFrom(additionalServices);
-//            appendToPropertyCsvValue(ServicesInstallerFromConfiguration.SERVICES_KEY, additionalServicesCsv);
-//        }
-//    }
-//
-//    private void appendToPropertyCsvValue(final String servicesKey, final String additionalServicesCsv) {
-//        final String existingServicesCsv = _Config.peekAtString(servicesKey);
-//        final String servicesCsv = join(existingServicesCsv, additionalServicesCsv);
-//        _Config.put(servicesKey, servicesCsv);
-//    }
-//
-//    private static String join(final String csv1, final String csv2) {
-//        if (csv1 == null) {
-//            return csv2;
-//        }
-//        if (csv2 == null) {
-//            return csv1;
-//        }
-//        return csv1 + "," + csv2;
-//    }
-//
-//    protected String classNamesFrom(final List<?> objectsOrClasses) {
-//        if (objectsOrClasses == null) {
-//            return null;
-//        }
-//        
-//        final Stream<String> fixtureClassNames = _NullSafe.stream(objectsOrClasses)
-//                .map(classNameOf());
-//                
-//        return fixtureClassNames.collect(Collectors.joining(","));
-//                
-//    }
-//
-//    private static Function<Object, String> classNameOf() {
-//        return new Function<Object, String>() {
-//            @Nullable @Override
-//            public String apply(final Object input) {
-//                Class<?> aClass = input instanceof Class ? (Class<?>) input : input.getClass();
-//                return aClass.getName();
-//            }
-//        };
-//    }
-//
-//    private void addToConfigurationUsing(final AppManifest appManifest) {
-//        final Map<String, String> configurationProperties = appManifest.getConfigurationProperties();
-//        
-//        if (configurationProperties == null) {
-//            return;
-//        }
-//        
-//        acceptBuilder(builder->{
-//        
-//            for (Map.Entry<String, String> configProp : configurationProperties.entrySet()) {
-//                builder.add(configProp.getKey(), configProp.getValue());
-//            }
-//        
-//        });
-//    }
-
     // -- provideAuth*
 
     public AuthenticationManager provideAuthenticationManager() {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
deleted file mode 100644
index 478fb52..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.webapp;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.config.internal._Config;
-import org.apache.isis.core.commons.config.IsisConfiguration.ContainsPolicy;
-import org.apache.isis.core.commons.config.NotFoundPolicy;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
-import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
-
-import static org.apache.isis.commons.internal._Constants.emptyStringArray;
-
-/**
- * Initialize the {@link IsisSessionFactoryBuilder} when the web application starts, and
- * destroys it when it ends.
- * <p>
- * Implementation note: we use a number of helper builders to keep this class as
- * small and focused as possible. The builders are available for reuse by other
- * bootstrappers.
- *
- * TODO: this is now defunct, I think ... replaced by IsisWebAppContextListener, which is always used.  Note that _ugbtb_web-xml.adoc also needs to be updated.
- */
-public final class IsisWebAppBootstrapper implements ServletContextListener {
-
-    private static final Logger LOG = LoggerFactory.getLogger(IsisWebAppBootstrapper.class);
-
-    private final IsisLoggingConfigurer loggingConfigurer = new IsisLoggingConfigurer();
-
-    // /////////////////////////////////////////////////////
-    // Initialization
-    // /////////////////////////////////////////////////////
-
-    @Override
-    public void contextInitialized(final ServletContextEvent servletContextEvent) {
-        try {
-            final ServletContext servletContext = servletContextEvent.getServletContext();
-
-            final String webInfDir = servletContext.getRealPath("/WEB-INF");
-            loggingConfigurer.configureLogging(webInfDir, emptyStringArray);
-
-            IsisWebAppConfigHelper.initConfigurationFrom(servletContext);
-            _Config.acceptBuilder(this::addConfigurationResourcesForDeploymentType);
-
-        } catch (final RuntimeException e) {
-            LOG.error("startup failed", e);
-            throw e;
-        }
-        LOG.info("server started");
-    }
-
-    protected void addConfigurationResourcesForDeploymentType(
-            final IsisConfigurationBuilder isisConfigurationBuilder) {
-        final String resourceName =
-                IsisContext.getEnvironment().getDeploymentType().name().toLowerCase() + ".properties";
-        isisConfigurationBuilder.addConfigurationResource(resourceName, NotFoundPolicy.CONTINUE, ContainsPolicy.IGNORE);
-    }
-
-
-    // /////////////////////////////////////////////////////
-    // Destroy
-    // /////////////////////////////////////////////////////
-
-    @Override
-    public void contextDestroyed(final ServletContextEvent ev) {
-        LOG.info("server shutting down");
-        try {
-            _Context.clear();
-        } finally {
-            LOG.info("server shut down");
-        }
-    }
-
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
index 0b2f222..5d42dff 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
@@ -31,7 +31,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.commons.config.AppConfigLocator;
+import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfiguration.ContainsPolicy;
 import org.apache.isis.core.commons.config.NotFoundPolicy;
 import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
@@ -76,10 +77,13 @@ public class IsisWebAppContextListener implements ServletContextListener {
         // IsisWicketApplication#init() or others that better know what ClassLoader to use as application default.
         _Context.setDefaultClassLoader(Thread.currentThread().getContextClassLoader(), false);
         
+        _Context.putSingleton(ServletContext.class, servletContext);
+        
         putContextPathIfPresent(servletContext.getContextPath());
         
-        IsisWebAppConfigHelper.initConfigurationFrom(servletContext);
-        _Config.acceptBuilder(IsisContext.EnvironmentPrimer::primeEnvironment);
+        IsisConfiguration isisConfiguration = AppConfigLocator.getAppConfig().isisConfiguration();
+        
+        //[2039]_Config.acceptBuilder(IsisContext.EnvironmentPrimer::primeEnvironment);
 
         final WebModuleContext webModuleContext = new WebModuleContext(servletContext);
         
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/auth/AuthenticationSessionStrategyDefault.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/auth/AuthenticationSessionStrategyDefault.java
index 5b24925..9a64826 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/auth/AuthenticationSessionStrategyDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/auth/AuthenticationSessionStrategyDefault.java
@@ -25,11 +25,11 @@ import javax.servlet.http.HttpSession;
 
 import org.apache.isis.applib.fixtures.LogonFixture;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.config.WebAppConstants;
 import org.apache.isis.core.runtime.authentication.AuthenticationManager;
 import org.apache.isis.core.runtime.fixtures.authentication.AuthenticationRequestLogonFixture;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.core.webapp.WebAppConstants;
 
 /**
  * Returns a valid {@link AuthenticationSession} through a number of mechanisms;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java
index 231930e..6c1e703 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java
@@ -79,7 +79,8 @@ public interface WebModule {
     static Stream<WebModule> discoverWebModules() {
         
         //TODO [ahuber] instead of providing a static list of modules, modules could be discovered on 
-        // the class-path (in case we have plugins that provide such modules).
+        // the class-path (in case we have plugins that provide such modules). 
+        // We could use the AppManifest instead.
         // We need yet to decide a mechanism, that enforces a certain ordering of these modules, since
         // this influences the order in which filters are processed.
         
@@ -87,7 +88,6 @@ public interface WebModule {
                 new WebModule_Shiro(), // filters before all others
                 new WebModule_StaticResources(),
                 new WebModule_Wicket(),
-                new WebModule_FallbackBootstrapper(), // not required if the Wicket module is in use
                 new WebModule_RestEasy(), // default REST provider
                 new WebModule_LogOnExceptionLogger() // log any logon exceptions, filters after all others
                 );
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java
index b41d116..0c2e4ec 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java
@@ -24,6 +24,7 @@ import javax.servlet.ServletContext;
 
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.commons.config.IsisConfiguration;
 
 /**
  * 
@@ -32,26 +33,32 @@ import org.apache.isis.config.internal._Config;
  */
 public class WebModuleContext {
 
-    /**
-     * This key was deprecated from config, but we still use it for reference. It is auto-populated 
-     * such that it can be looked up, to see what viewers have been discovered by the framework.
-     */
-    private final static String ISIS_VIEWERS = "isis.viewers";
-    private final static String ISIS_PROTECTED = "isis.protected";
+//    /**
+//     * This key was deprecated from config, but we still use it for reference. It is auto-populated 
+//     * such that it can be looked up, to see what viewers have been discovered by the framework.
+//     */
+//    private final static String ISIS_VIEWERS = "isis.viewers";
+//    private final static String ISIS_PROTECTED = "isis.protected";
     
     private boolean hasBootstrapper = false;
     private final StringBuilder viewers = new StringBuilder();
     private final StringBuilder protectedPath = new StringBuilder();
     
     private final ServletContext servletContext;
+    private final IsisConfiguration isisConfiguration;
     
     public WebModuleContext(ServletContext servletContext) {
         this.servletContext = servletContext;
+        this.isisConfiguration = _Config.getConfiguration();
     }
     
     public ServletContext getServletContext() {
         return servletContext;
     }
+    
+    public IsisConfiguration getConfiguration() {
+        return isisConfiguration;
+    }
 
     /**
      * Tell other modules that a bootstrapper is present.
@@ -102,10 +109,11 @@ public class WebModuleContext {
      * Commits all properties to current life-cycle's config.
      */
     public void commit() {
-        _Config.acceptBuilder(builder->{
-            builder.add(ISIS_VIEWERS, viewers.toString());
-            builder.add(ISIS_PROTECTED, protectedPath.toString());
-        });
+//[2039] can no longer write to config        
+//        _Config.acceptBuilder(builder->{
+//            builder.add(ISIS_VIEWERS, viewers.toString());
+//            builder.add(ISIS_PROTECTED, protectedPath.toString());
+//        });
     }
     
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java
deleted file mode 100644
index dc925b7..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.webapp.modules;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletException;
-
-import org.apache.isis.core.webapp.IsisWebAppBootstrapper;
-
-/**
- * Package private mixin for WebModule implementing WebModule.
- * @since 2.0.0
- */
-final class WebModule_FallbackBootstrapper implements WebModule  {
-    
-    @Override
-    public String getName() {
-        return "Fallback Bootstrapper";
-    }
-
-    @Override
-    public ServletContextListener init(ServletContext ctx) throws ServletException {
-        return ctx.createListener(IsisWebAppBootstrapper.class);
-    }
-
-    @Override
-    public boolean isApplicable(WebModuleContext ctx) {
-        // not required if another bootstrapper module is on the context 
-        // e.g. the Wicket module
-        return !ctx.hasBootstrapper();
-    }
-    
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java
index 4926ca1..4436f77 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java
@@ -23,7 +23,6 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
-import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.webapp.IsisSessionFilter;
 
 import static java.util.Objects.requireNonNull;
@@ -64,8 +63,8 @@ final class WebModule_RestEasy implements WebModule  {
         }
         
         // try to fetch restfulPath from config else fallback to default
-        final String restfulPath = _Config
-                .peekAtString(KEY_RESTFUL_BASE_PATH, KEY_RESTFUL_BASE_PATH_DEFAULT);
+        final String restfulPath = ctx.getConfiguration()
+                .getString(KEY_RESTFUL_BASE_PATH, KEY_RESTFUL_BASE_PATH_DEFAULT);
                 
         putRestfulPath(restfulPath);
         
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java
index 8bcf82f..c1cc32f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java
@@ -25,7 +25,6 @@ import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.config.internal._Config;
 
 import static java.util.Objects.requireNonNull;
 import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
@@ -36,7 +35,7 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
 
 /**
  * Package private mixin for WebModule implementing WebModule.
- * @since 2.0.0
+ * @since 2.0.0-M2
  */
 final class WebModule_Wicket implements WebModule  {
 
@@ -62,14 +61,14 @@ final class WebModule_Wicket implements WebModule  {
         }
 
         pathConfigValue = 
-                _Config.peekAtString("isis.viewer.wicket.basePath", "/wicket");
+                ctx.getConfiguration().getString("isis.viewer.wicket.basePath", "/wicket");
         
         deploymentMode = _Context.isPrototyping()
                     ? "development" 
                             : "deployment";
         
         appConfigValue = 
-                _Config.peekAtString("isis.viewer.wicket.app",
+                ctx.getConfiguration().getString("isis.viewer.wicket.app",
                         "org.apache.isis.viewer.wicket.viewer.IsisWicketApplication");
         
         ctx.setHasBootstrapper();
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 bd169aa..a853a12 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,8 +29,6 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.function.Function;
 
-import javax.servlet.ServletContext;
-
 import com.google.common.base.Charsets;
 import com.google.common.io.Resources;
 import com.google.inject.Guice;
@@ -79,11 +77,9 @@ import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
-import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
-import org.apache.isis.core.webapp.IsisWebAppConfigHelper;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettingsAccessor;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
@@ -174,8 +170,6 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
     public static final boolean ENABLE_DEVELOPMENT_UTILITIES_DEFAULT = false;
     public static final BootswatchTheme BOOTSWATCH_THEME_DEFAULT = BootswatchTheme.Flatly;
 
-    private final IsisLoggingConfigurer loggingConfigurer = new IsisLoggingConfigurer();
-
     /**
      * Convenience locator, down-casts inherited functionality.
      */
@@ -244,27 +238,16 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
 
         // this doesn't seem to accomplish anything
         // experimental.addListenerToStripRemovedComponentsFromAjaxTargetResponse();
-
-        // --- prepare the configuration prior to init()
-        
-        prepareConfigurationBuilder(getServletContext()); // FIXME[2039] do this in the ServletContextListener
         
         super.internalInit();
 
     }
     
-    private void prepareConfigurationBuilder(ServletContext ctx) {
-        final String isisConfigDir = ctx.getInitParameter("isis.config.dir");
-        configureLogging(isisConfigDir);
-        IsisWebAppConfigHelper.initConfigurationFrom(ctx);
-    }
-
     private static AjaxRequestTarget decorate(final AjaxRequestTarget ajaxRequestTarget) {
         ajaxRequestTarget.registerRespondListener( new TargetRespondListenerToResetQueryResultCache() );
         return ajaxRequestTarget;
     }
 
-
     @Override
     public Application setAjaxRequestTargetProvider(Function<Page, AjaxRequestTarget> ajaxRequestTargetProvider) {
         final Application application = super.setAjaxRequestTargetProvider(
@@ -280,10 +263,6 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
     @Override
     protected void init() {
         
-        //[ahuber] the implementing class is assumed to be loaded be a class-loader
-        // that's suitable for the entire web-application to use as default.
-        _Context.setDefaultClassLoader(this.getClass().getClassLoader(), true);
-        
         final IsisConfiguration configuration = _Config.getConfiguration();
         
         List<Future<Object>> futures = null;
@@ -519,22 +498,6 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
     /**
      * Factored out for easy (informal) pluggability.
      */
-    protected void configureLogging(String isisConfigDir) {
-        final String loggingPropertiesDir;
-        if(isisConfigDir != null) {
-            loggingPropertiesDir = isisConfigDir;
-        } else {
-            loggingPropertiesDir = getServletContext().getRealPath("/WEB-INF");
-        }
-
-        loggingConfigurer.configureLogging(loggingPropertiesDir, new String[0]);
-    }
-
-    // //////////////////////////////////////
-
-    /**
-     * Factored out for easy (informal) pluggability.
-     */
     protected IRequestCycleListener newWebRequestCycleForIsis() {
         return new WebRequestCycleForIsis();
     }
@@ -607,18 +570,6 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
         setHeaderResponseDecorator(response -> {
             return new ResourceAggregator(new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS"));
         });
-
-        //[ahuber] no longer supported since wicket 8
-        //		setHeaderResponseDecorator(new IHeaderResponseDecorator()
-        //		{
-        //			@Override
-        //			public IHeaderResponse decorate(IHeaderResponse response)
-        //			{
-        //				// use this header resource decorator to load all JavaScript resources in the page
-        //				// footer (after </body>)
-        //				return new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS");
-        //			}
-        //		});
     }
 
     // //////////////////////////////////////
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/IsisInjectModule.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/IsisInjectModule.java
index d4a3541..3ebaefb 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/IsisInjectModule.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/IsisInjectModule.java
@@ -24,7 +24,7 @@ import com.google.inject.Provides;
 import com.google.inject.Singleton;
 
 import org.apache.isis.applib.AppManifest;
-import org.apache.isis.core.commons.config.AppConfigLocator;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
@@ -35,11 +35,7 @@ public class IsisInjectModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        
-        System.err.println("!!!!!!!!!! IsisInjectModule.configure "+Thread.currentThread().getName());
-        
-        IsisConfiguration isisConfiguration = AppConfigLocator.getAppConfig().isisConfiguration();
-        bind(IsisConfiguration.class).toInstance(isisConfiguration);
+        bind(IsisConfiguration.class).toProvider(_Config::getConfiguration);
     }
 
     @Provides
@@ -49,7 +45,6 @@ public class IsisInjectModule extends AbstractModule {
         
         AppManifest appManifest = isisConfiguration.getAppManifest();
         
-        
         System.err.println("!!!!!!!!!! provideIsisSessionFactory STAGE 1 "+Thread.currentThread().getName());
 
         final IsisComponentProvider componentProvider = IsisComponentProvider
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
index 5f14b04..1099282 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
@@ -31,6 +31,8 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.core.commons.config.WebAppConstants;
+
 import com.google.common.io.CharSource;
 import com.google.common.io.Files;
 import com.google.common.io.Resources;
@@ -40,7 +42,6 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.i18n.TranslationsResolver;
-import org.apache.isis.core.webapp.WebAppConstants;
 import org.apache.isis.viewer.wicket.viewer.IsisWicketApplication;