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/23 08:40:26 UTC

[isis] 07/07: ISIS-2039: lazy binding to config for wicket

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

commit f22c497ac2e84f028ffd207752d37abb11108021
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Nov 23 09:39:12 2018 +0100

    ISIS-2039: lazy binding to config for wicket
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2039
---
 .../org/apache/isis/config/internal/_Config.java   | 14 +----
 .../config/internal/_Config_LifecycleResource.java | 29 +++++++++-
 .../configbuilder/IsisConfigurationBuilder.java    |  1 +
 .../IsisConfigurationBuilderDefault.java           |  2 +-
 .../IsisComponentProvider.java                     | 14 +++++
 .../IsisComponentProviderBuilder.java              | 10 ++++
 ...isComponentProviderHelper_UsingInstallers.java} | 66 +++++++++-------------
 .../wicket/viewer/IsisWicketApplication.java       | 17 +++---
 .../viewer/wicket/viewer/IsisWicketModule.java     | 48 +++++++++++-----
 .../viewer/integration/isis/IsisInjectModule.java  | 40 ++++++-------
 .../isisWicketModule_bindingsStandard_Test.java    |  3 +-
 11 files changed, 147 insertions(+), 97 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/config/internal/_Config.java b/core/config/src/main/java/org/apache/isis/config/internal/_Config.java
index f2872c8..6463557 100644
--- a/core/config/src/main/java/org/apache/isis/config/internal/_Config.java
+++ b/core/config/src/main/java/org/apache/isis/config/internal/_Config.java
@@ -96,8 +96,9 @@ public class _Config {
     // -- HELPER -- BUILDER
     
     private static IsisConfigurationBuilder getConfigurationBuilder() {
-        IsisConfigurationBuilder builder = getLifecycleResource().getBuilder()
-                .orElseThrow(_Config::configurationAlreadyInUse);
+        _Config_LifecycleResource lifecycle = getLifecycleResource();
+        IsisConfigurationBuilder builder = lifecycle.getBuilder()
+                .orElseThrow(lifecycle::configurationAlreadyInUse);
         return builder;
     }
     
@@ -117,15 +118,6 @@ public class _Config {
     private static _Config_LifecycleResource createLifecycleResource() {
         return new _Config_LifecycleResource(createBuilder());
     }
-    
-    // -- HELPER -- EXCEPTIONS
-    
-    private static IllegalStateException configurationAlreadyInUse() {
-        return new IllegalStateException("The IsisConfigurationBuilder is no longer valid, because it has "
-                + "already built the IsisConfiguration for this application's life-cycle.");
-    }
-
-    
 
 //    /**
 //     * Sets the current context's configuration supplier via provided parameter. Will not override
diff --git a/core/config/src/main/java/org/apache/isis/config/internal/_Config_LifecycleResource.java b/core/config/src/main/java/org/apache/isis/config/internal/_Config_LifecycleResource.java
index f260046..ce6543a 100644
--- a/core/config/src/main/java/org/apache/isis/config/internal/_Config_LifecycleResource.java
+++ b/core/config/src/main/java/org/apache/isis/config/internal/_Config_LifecycleResource.java
@@ -34,7 +34,7 @@ class _Config_LifecycleResource {
     _Config_LifecycleResource(final IsisConfigurationBuilder builder) {
         requires(builder, "builder");
         this.builder = builder;
-        this.configuration = _Lazy.threadSafe(builder::build);
+        this.configuration = _Lazy.threadSafe(this::build);
     }
     
     IsisConfiguration getConfiguration() {
@@ -47,6 +47,33 @@ class _Config_LifecycleResource {
         }
         return Optional.empty();
     }
+
+    private IsisConfiguration build() {
+        
+        // we throw an exception, catch it and keep it for later, to provide
+        // causal information, in case the builder is accessed after it already
+        // built the configuration
+        try {
+            throw new IllegalStateException("Configuration Build Event");
+        } catch(IllegalStateException e) {
+            this.configurationBuildStacktrace = e;
+        }
+        
+        return builder.build();
+        
+    }
+    
+    // -- HELPER -- EXCEPTIONS
+    
+    private IllegalStateException configurationBuildStacktrace;
+    
+    IllegalStateException configurationAlreadyInUse() {
+        
+        IllegalStateException cause = configurationBuildStacktrace;
+        
+        return new IllegalStateException("The IsisConfigurationBuilder is no longer valid, because it has "
+                + "already built the IsisConfiguration for this application's life-cycle.", cause);
+    }
     
 
 }
diff --git a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
index be0f5b1..4a6b99b 100644
--- a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
@@ -63,6 +63,7 @@ public interface IsisConfigurationBuilder {
 
     String[] peekAtList(String key);
 
+    /** internal only **/
     IsisConfiguration build();
 
     /**
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 5374960..e541939 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
@@ -292,7 +292,7 @@ final class IsisConfigurationBuilderDefault implements IsisConfigurationBuilder
 
     @Override
     public IsisConfiguration build() {
-
+        
         dumpResourcesToLog();
 
         final IsisConfigurationDefault copy = new IsisConfigurationDefault(resourceStreamSourceChain);
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 06d2a28..2611587 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
@@ -85,6 +85,20 @@ public final class IsisComponentProvider {
     public static IsisComponentProviderBuilder builder() {
         return new IsisComponentProviderBuilder();
     }
+    
+    // -- BUILDER - USING INSTALLERS
+    
+    public static IsisComponentProviderBuilder builderUsingInstallers(AppManifest appManifest) {
+        
+        final IsisComponentProviderHelper_UsingInstallers helper = 
+                new IsisComponentProviderHelper_UsingInstallers(appManifest);
+        
+        return builder()
+                .appManifest(appManifest)
+                .authenticationManager(helper.authenticationManager)
+                .authorizationManager(helper.authorizationManager);
+    }
+    
 
     // -- constructor, fields
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
index 128de8a..086a943 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
@@ -26,6 +26,16 @@ public class IsisComponentProviderBuilder {
         return this;
     }
     
+    public IsisComponentProviderBuilder authenticationManager(AuthenticationManager authenticationManager) {
+        this.authenticationManager = authenticationManager;
+        return this;
+    }
+    
+    public IsisComponentProviderBuilder authorizationManager(AuthorizationManager authorizationManager) {
+        this.authorizationManager = authorizationManager;
+        return this;
+    }
+    
     public IsisComponentProviderBuilder addResourceStreamSource(ResourceStreamSource source) {
         resourceStreamSources.add(source);
         return this;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderHelper_UsingInstallers.java
similarity index 81%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderHelper_UsingInstallers.java
index 560de47..a483807 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderHelper_UsingInstallers.java
@@ -26,9 +26,9 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.components.Installer;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.factory.InstanceCreationClassException;
 import org.apache.isis.core.commons.factory.InstanceCreationException;
@@ -42,55 +42,44 @@ import org.apache.isis.core.runtime.authorization.AuthorizationManagerInstaller;
 import org.apache.isis.core.runtime.system.SystemConstants;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
 
-class IsisComponentProviderUsingInstallers  {
-/*
+class IsisComponentProviderHelper_UsingInstallers  {
+
+    final AppManifest appManifest;
+    final AuthenticationManager authenticationManager;
+    final AuthorizationManager authorizationManager;
+    
     // -- constructors
 
-    public IsisComponentProviderUsingInstallers(
-            final AppManifest appManifest,
-            final IsisConfigurationBuilder configurationBuilder) {
-        
-        this(appManifest,
-                configurationBuilder,
-                new InstallerLookup(configurationBuilder));
+    IsisComponentProviderHelper_UsingInstallers(final AppManifest appManifest) {
+        this(appManifest, new InstallerLookup());
     }
     
-    public IsisComponentProviderUsingInstallers(
+    private IsisComponentProviderHelper_UsingInstallers(
             final AppManifest appManifest,
-            final IsisConfigurationBuilder configurationBuilder,
             final InstallerLookup installerLookup) {
-        this(configurationBuilder, appManifest,
-                lookupAuthenticationManager(appManifest, installerLookup, configurationBuilder),
-                lookupAuthorizationManager(appManifest, installerLookup, configurationBuilder));
-    }
-
-    private IsisComponentProviderUsingInstallers(
-            final IsisConfigurationBuilder configurationBuilder,
-            final AppManifest appManifest,
-            final AuthenticationManager authenticationManager,
-            final AuthorizationManager authorizationManager){
-        super(configurationBuilder, appManifest, authenticationManager, authorizationManager);
+        
+        this.appManifest = appManifest;
+        this.authenticationManager = lookupAuthenticationManager(appManifest, installerLookup);
+        this.authorizationManager = lookupAuthorizationManager(appManifest, installerLookup);
     }
-
-    // -- constructor helpers (factories)
-
+    
+    // -- HELPER
+ 
     private static AuthenticationManager lookupAuthenticationManager(
-            final AppManifest appManifest, final InstallerLookup installerLookup,
-            final IsisConfigurationBuilder configurationBuilder) {
+            final AppManifest appManifest, final InstallerLookup installerLookup) {
 
         final String authenticationMechanism = appManifest.getAuthenticationMechanism();
         final AuthenticationManagerInstaller authenticationInstaller =
                 installerLookup.authenticationManagerInstaller(authenticationMechanism);
 
         // no longer used, could probably remove
-        configurationBuilder.put(SystemConstants.AUTHENTICATION_INSTALLER_KEY, authenticationMechanism);
+        //_Config.put(SystemConstants.AUTHENTICATION_INSTALLER_KEY, authenticationMechanism);
 
         return authenticationInstaller.createAuthenticationManager();
     }
 
     private static AuthorizationManager lookupAuthorizationManager(
-            final AppManifest appManifest, final InstallerLookup installerLookup,
-            final IsisConfigurationBuilder configurationBuilder) {
+            final AppManifest appManifest, final InstallerLookup installerLookup) {
 
         final String authorizationMechanism = appManifest.getAuthorizationMechanism();
 
@@ -99,13 +88,11 @@ class IsisComponentProviderUsingInstallers  {
                 installerLookup.authorizationManagerInstaller(authorizationMechanism);
 
         // no longer used, could probably remove
-        configurationBuilder.put(SystemConstants.AUTHORIZATION_INSTALLER_KEY, authorizationMechanism);
+        //_Config.put(SystemConstants.AUTHORIZATION_INSTALLER_KEY, authorizationMechanism);
 
         return authorizationInstaller.createAuthorizationManager();
     }
 
-*/
-
 
     /**
      * Looks up authorization and authentication implementations.
@@ -122,7 +109,7 @@ class IsisComponentProviderUsingInstallers  {
      *
      * @deprecated - intention is to replace in future using CDI
      */
-    /*
+    
     @Deprecated
     static class InstallerLookup implements ApplicationScopedComponent {
 
@@ -130,11 +117,10 @@ class IsisComponentProviderUsingInstallers  {
 
         // -- constructor, fields
 
-        private final IsisConfigurationBuilder configurationBuilder;
         private final List<Installer> installerList = _Lists.newArrayList();
 
-        public InstallerLookup(final IsisConfigurationBuilder configurationBuilder) throws InstanceCreationException {
-            this.configurationBuilder = configurationBuilder;
+        public InstallerLookup() throws InstanceCreationException {
+            
 
             final List<String> installerClassNames = _Lists.of(
                     "org.apache.isis.core.security.authentication.BypassAuthenticationManagerInstaller", // bypass
@@ -217,7 +203,7 @@ class IsisComponentProviderUsingInstallers  {
                 final String key,
                 final String defaultImpl) {
             if (reqImpl == null) {
-                reqImpl = configurationBuilder.peekAtString(key, defaultImpl);
+                reqImpl = _Config.peekAtString(key, defaultImpl);
             }
             if (reqImpl == null) {
                 return null;
@@ -231,5 +217,5 @@ class IsisComponentProviderUsingInstallers  {
         }
 
     }
-    */
+    
 }
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 a5d4e37..0cb84c9 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
@@ -76,6 +76,7 @@ import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 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;
@@ -299,22 +300,23 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
             requestCycleListeners.add(requestCycleListenerForIsis);
             requestCycleListeners.add(new PageRequestHandlerTracker());
 
-            configuration = _Config.getConfiguration(); 
-            
             //
             // create IsisSessionFactory
             //
             final IsisInjectModule isisModule = newIsisModule();
-            final Injector injector = Guice.createInjector(isisModule, newIsisWicketModule(configuration));
+            final Injector injector = Guice.createInjector(isisModule, newIsisWicketModule());
             initWicketComponentInjection(injector);
-
+            
             injector.injectMembers(this); // populates this.isisSessionFactory
-
+            Ensure.ensure("IsisSessionFactory should have been injected.", this.isisSessionFactory != null);
+            
             if (requestCycleListenerForIsis instanceof WebRequestCycleForIsis) {
                 WebRequestCycleForIsis webRequestCycleForIsis = (WebRequestCycleForIsis) requestCycleListenerForIsis;
                 webRequestCycleForIsis.setPageClassRegistry(pageClassRegistry);
             }
 
+            configuration = _Config.getConfiguration();
+            
             this.getMarkupSettings().setStripWicketTags(determineStripWicketTags(configuration));
 
             configureSecurity(configuration);
@@ -541,10 +543,9 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
 
     /**
      * Override if required
-     * @param isisConfiguration
      */
-    protected Module newIsisWicketModule(final IsisConfiguration isisConfiguration) {
-        return new IsisWicketModule(getServletContext(), isisConfiguration);
+    protected Module newIsisWicketModule() {
+        return new IsisWicketModule(getServletContext());
     }
 
     // //////////////////////////////////////
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
index 08beb27..fbf8655 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
@@ -24,10 +24,12 @@ import java.io.InputStream;
 import javax.servlet.ServletContext;
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Provider;
 import com.google.inject.name.Names;
 
 import org.apache.isis.applib.services.email.EmailService;
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.models.ImageResourceCache;
@@ -70,13 +72,10 @@ import static org.apache.isis.viewer.wicket.viewer.IsisWicketApplication.readLin
 public class IsisWicketModule extends AbstractModule {
 
     private ServletContext servletContext;
-    private IsisConfiguration isisConfig;
 
     public IsisWicketModule(
-            final ServletContext servletContext,
-            final IsisConfiguration isisConfiguration) {
+            final ServletContext servletContext) {
         this.servletContext = servletContext;
-        this.isisConfig = isisConfiguration;
     }
 
     @Override
@@ -96,34 +95,53 @@ public class IsisWicketModule extends AbstractModule {
         bind(EmailNotificationService.class).to(EmailNotificationServiceWicket.class);
 
         bind(String.class).annotatedWith(Names.named("applicationName"))
-                .toProvider(() -> isisConfig.getString("isis.viewer.wicket.application.name", "Apache Isis ™"));
+                .toProvider(string("isis.viewer.wicket.application.name", "Apache Isis ™"));
 
         bind(String.class).annotatedWith(Names.named("brandLogoHeader"))
-                .toProvider(() -> isisConfig.getString("isis.viewer.wicket.application.brandLogoHeader"));
+                .toProvider(string("isis.viewer.wicket.application.brandLogoHeader"));
 
         bind(String.class).annotatedWith(Names.named("brandLogoSignin"))
-                .toProvider(() -> isisConfig.getString("isis.viewer.wicket.application.brandLogoSignin"));
+                .toProvider(string("isis.viewer.wicket.application.brandLogoSignin"));
 
         bind(String.class).annotatedWith(Names.named("applicationCss"))
-                .toProvider(() -> isisConfig.getString("isis.viewer.wicket.application.css", "css/application.css"));
+                .toProvider(string("isis.viewer.wicket.application.css", "css/application.css"));
 
         bind(String.class).annotatedWith(Names.named("applicationJs"))
-                .toProvider(() -> isisConfig.getString("isis.viewer.wicket.application.js", "css/application.js"));
+                .toProvider(string("isis.viewer.wicket.application.js", "css/application.js"));
 
         bind(String.class).annotatedWith(Names.named("aboutMessage"))
-                .toProvider(() -> isisConfig.getString("isis.viewer.wicket.application.about",
-                                                       isisConfig.getString("isis.viewer.wicket.application.name")));
+                .toProvider(stringOrElse("isis.viewer.wicket.application.about",
+                        string("isis.viewer.wicket.application.name")));
 
-        final String welcomeFile = isisConfig.getString("isis.viewer.wicket.welcome.file", "welcome.html");
+        final Provider<String> welcomeFile = string("isis.viewer.wicket.welcome.file", "welcome.html");
         bind(String.class).annotatedWith(Names.named("welcomeMessage"))
-                .toProvider(() -> readLines(getClass(), welcomeFile,
-                                            isisConfig.getString("isis.viewer.wicket.welcome.text")));
+                .toProvider(() -> readLines(getClass(), welcomeFile.get(),
+                        getConfiguration().getString("isis.viewer.wicket.welcome.text")));
 
         bind(String.class).annotatedWith(Names.named("applicationVersion"))
-                .toProvider(() -> isisConfig.getString("isis.viewer.wicket.application.version"));
+                .toProvider(string("isis.viewer.wicket.application.version"));
 
         bind(InputStream.class).annotatedWith(Names.named("metaInfManifest"))
                 .toProvider(() -> servletContext.getResourceAsStream("/META-INF/MANIFEST.MF"));
 
     }
+    
+    // -- HELPER
+    
+    private Provider<String> string(String key) {
+        return ()->getConfiguration().getString(key);
+    }
+    
+    private Provider<String> string(String key, String defaultValue) {
+        return ()->getConfiguration().getString(key, defaultValue);
+    }
+    
+    private Provider<String> stringOrElse(String key, Provider<String> fallback) {
+        return ()->getConfiguration().getString(key, fallback.get());
+    }
+    
+    private IsisConfiguration getConfiguration() {
+        return _Config.getConfiguration();
+    }
+    
 }
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 3f3a854..7026c11 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
@@ -33,6 +33,8 @@ import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.runtime.system.SystemConstants;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
+import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProvider;
 
 public class IsisInjectModule extends AbstractModule {
 
@@ -82,25 +84,25 @@ public class IsisInjectModule extends AbstractModule {
         bind(AppManifest.class).toInstance(APP_MANIFEST_NOOP);
     }
 
-//TODO[2039]
-//    @Provides
-//    @com.google.inject.Inject
-//    @Singleton
-//    protected IsisSessionFactory provideIsisSessionFactory(
-//            final AppManifest appManifestIfExplicitlyBound) {
-//
-//        final AppManifest appManifestToUse = determineAppManifest(appManifestIfExplicitlyBound);
-//
-//        final IsisComponentProvider componentProvider =
-//                new IsisComponentProviderUsingInstallers(appManifestToUse);
-//
-//        final IsisSessionFactoryBuilder builder =
-//                new IsisSessionFactoryBuilder(componentProvider, componentProvider.getAppManifest());
-//
-//        // as a side-effect, if the metamodel turns out to be invalid, then
-//        // this will push the MetaModelInvalidException into IsisContext.
-//        return builder.buildSessionFactory();
-//    }
+    @Provides
+    @com.google.inject.Inject
+    @Singleton
+    protected IsisSessionFactory provideIsisSessionFactory(
+            final AppManifest appManifestIfExplicitlyBound) {
+        
+        final AppManifest appManifestToUse = determineAppManifest(appManifestIfExplicitlyBound);
+
+        final IsisComponentProvider componentProvider = IsisComponentProvider
+                .builderUsingInstallers(appManifestToUse)
+                .build();
+
+        final IsisSessionFactoryBuilder builder =
+                new IsisSessionFactoryBuilder(componentProvider, componentProvider.getAppManifest());
+
+        // as a side-effect, if the metamodel turns out to be invalid, then
+        // this will push the MetaModelInvalidException into IsisContext.
+        return builder.buildSessionFactory();
+    }
 
     @Provides
     @com.google.inject.Inject
diff --git a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/isisWicketModule_bindingsStandard_Test.java b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/isisWicketModule_bindingsStandard_Test.java
index 24d33eb..e77d353 100644
--- a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/isisWicketModule_bindingsStandard_Test.java
+++ b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/isisWicketModule_bindingsStandard_Test.java
@@ -88,9 +88,8 @@ public class isisWicketModule_bindingsStandard_Test {
 	public void setUp() throws Exception {
 	    
 	    _Config.clear();
-		final IsisConfiguration isisConfiguration = _Config.getConfiguration(); 
 		        
-        isisWicketModule = new IsisWicketModule(mockServletContext, isisConfiguration);
+        isisWicketModule = new IsisWicketModule(mockServletContext);
 
         context.checking(new Expectations() {{
             allowing(mockServletContext);