You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/01/25 07:50:06 UTC

[isis] branch 2033-IoC updated: ISIS-2033: introduces a RequestContextService

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

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


The following commit(s) were added to refs/heads/2033-IoC by this push:
     new 6e78b29  ISIS-2033: introduces a RequestContextService
6e78b29 is described below

commit 6e78b29ad36a2f4e6e1af28565968c380b51f12a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jan 25 08:49:58 2019 +0100

    ISIS-2033: introduces a RequestContextService
    
    to programmatically 'start' a new RequestScope
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
 .../org/apache/isis/applib/mixins/dto/Util.java    |  3 ++
 .../isis/applib/services/bookmark/Bookmark.java    |  4 +-
 .../apache/isis/applib/services/swagger/Util.java  |  3 ++
 .../apache/isis/applib/types/DescriptionType.java  |  3 ++
 .../isis/applib/types/MemberIdentifierType.java    |  3 ++
 .../apache/isis/applib/types/TargetActionType.java |  3 ++
 .../apache/isis/applib/types/TargetClassType.java  |  3 ++
 .../core/plugins/ioc/RequestContextHandle.java     | 10 +++++
 .../core/plugins/ioc/RequestContextService.java    |  7 +++
 .../org/apache/isis/config/AppConfigLocator.java   |  6 +++
 .../facets/object/choices/ChoicesFacetUtils.java   |  3 ++
 .../services/appfeat/ApplicationFeature.java       |  4 ++
 .../spec/feature/ObjectActionParameter.java        |  4 +-
 .../metamodel/spec/feature/ObjectAssociation.java  | 22 +++-------
 .../specimpl/ObjectSpecificationAbstract.java      |  3 ++
 .../standard/AuthorizationManagerStandard.java     |  4 +-
 .../isis/core/plugins/ioc/weld/WeldFactory.java    | 12 +++++-
 .../request/RequestContextHandleDefault.java       | 18 ++++++++
 .../request/RequestContextServiceWeld.java         | 50 ++++++++++++++++++++++
 .../system/persistence/PersistenceSession5.java    | 24 +++++++----
 .../isis/core/runtime/headless/IsisSystem.java     | 10 ++++-
 .../background/BackgroundServiceDefault.java       |  2 +-
 .../system/persistence/PersistenceSessionBase.java |  9 ++--
 .../standard/AuthenticationManagerStandard.java    |  3 ++
 .../application/simpleapp/module-simple/pom.xml    |  5 +++
 .../services/org.apache.isis.config.AppConfig      |  1 +
 .../modules/simple/SimpleModuleManifest.java       | 43 ++++++++++++++++++-
 27 files changed, 224 insertions(+), 38 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/Util.java b/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/Util.java
index d5bf81b..d33982c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/Util.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/Util.java
@@ -16,6 +16,9 @@
  */
 package org.apache.isis.applib.mixins.dto;
 
+import javax.enterprise.inject.Vetoed;
+
+@Vetoed
 class Util {
 
     private Util(){}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java b/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
index 1c2c612..03ae076 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
@@ -21,6 +21,8 @@ package org.apache.isis.applib.services.bookmark;
 import java.io.Serializable;
 import java.util.Iterator;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -206,7 +208,7 @@ public class Bookmark implements Serializable {
         return state.getCode() + objectType + SEPARATOR + identifier;
     }
 
-
+    @Vetoed
     public static class AsStringType {
 
         private AsStringType() {}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/swagger/Util.java b/core/applib/src/main/java/org/apache/isis/applib/services/swagger/Util.java
index 81af662..c38058e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/swagger/Util.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/swagger/Util.java
@@ -16,6 +16,9 @@
  */
 package org.apache.isis.applib.services.swagger;
 
+import javax.enterprise.inject.Vetoed;
+
+@Vetoed
 class Util {
 
     private Util(){}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/types/DescriptionType.java b/core/applib/src/main/java/org/apache/isis/applib/types/DescriptionType.java
index 86f008f..bf9ccd5 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/types/DescriptionType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/types/DescriptionType.java
@@ -18,6 +18,9 @@
  */
 package org.apache.isis.applib.types;
 
+import javax.enterprise.inject.Vetoed;
+
+@Vetoed
 public class DescriptionType {
 
     private DescriptionType() {}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/types/MemberIdentifierType.java b/core/applib/src/main/java/org/apache/isis/applib/types/MemberIdentifierType.java
index a4e4de2..70367a3 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/types/MemberIdentifierType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/types/MemberIdentifierType.java
@@ -19,12 +19,15 @@ package org.apache.isis.applib.types;
 import java.sql.Timestamp;
 import java.util.UUID;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 
 /**
  * As per {@link Command#getMemberIdentifier()} and {@link org.apache.isis.applib.services.audit.AuditerService#audit(UUID, int, String, Bookmark, String, String, String, String, String, Timestamp)}.
  */
+@Vetoed
 public class MemberIdentifierType {
 
     private MemberIdentifierType() {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/types/TargetActionType.java b/core/applib/src/main/java/org/apache/isis/applib/types/TargetActionType.java
index a1525ef..a8b7aff 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/types/TargetActionType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/types/TargetActionType.java
@@ -19,12 +19,15 @@ package org.apache.isis.applib.types;
 import java.sql.Timestamp;
 import java.util.UUID;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 
 /**
  * A user-friendly name of an action, as per {@link Command#getTargetAction()}, {@link org.apache.isis.applib.services.audit.AuditerService#audit(UUID, int, String, Bookmark, String, String, String, String, String, Timestamp)}.
  */
+@Vetoed
 public class TargetActionType {
 
     private TargetActionType() {}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/types/TargetClassType.java b/core/applib/src/main/java/org/apache/isis/applib/types/TargetClassType.java
index 914e140..3cb9e82 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/types/TargetClassType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/types/TargetClassType.java
@@ -19,12 +19,15 @@ package org.apache.isis.applib.types;
 import java.sql.Timestamp;
 import java.util.UUID;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 
 /**
  * A user-friendly name of a class, as per {@link Command#getTargetClass()}, {@link org.apache.isis.applib.services.audit.AuditerService#audit(UUID, int, String, Bookmark, String, String, String, String, String, Timestamp)}.
  */
+@Vetoed
 public class TargetClassType {
 
     private TargetClassType() {}
diff --git a/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextHandle.java b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextHandle.java
new file mode 100644
index 0000000..77bf8b9
--- /dev/null
+++ b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextHandle.java
@@ -0,0 +1,10 @@
+package org.apache.isis.core.plugins.ioc;
+
+public interface RequestContextHandle extends AutoCloseable {
+
+	/**
+	 * Refined to not throw a catched exception
+	 */
+	@Override void close();
+	
+}
diff --git a/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextService.java b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextService.java
new file mode 100644
index 0000000..7d571bb
--- /dev/null
+++ b/core/commons/src/main/java/org/apache/isis/core/plugins/ioc/RequestContextService.java
@@ -0,0 +1,7 @@
+package org.apache.isis.core.plugins.ioc;
+
+public interface RequestContextService {
+
+	RequestContextHandle startRequest();
+
+}
diff --git a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
index 980f852..b3fd1e0 100644
--- a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
+++ b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
@@ -54,8 +54,11 @@ public final class AppConfigLocator {
     		"org.apache.isis.applib.services.registry.ServiceRegistry", 
     		"org.apache.isis.config.IsisConfiguration", 
     		"org.apache.isis.core.runtime.system.session.IsisSessionFactory", 
+    		
     		"org.apache.isis.core.security.authentication.manager.AuthenticationManager", 
     		"org.apache.isis.core.security.authorization.manager.AuthorizationManager",
+    		"org.apache.isis.core.security.authentication.AuthenticationSessionProvider",
+    		
     		"org.apache.isis.core.metamodel.specloader.SpecificationLoader",
     		"org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory",
     		
@@ -72,6 +75,9 @@ public final class AppConfigLocator {
     		"org.apache.isis.applib.services.user.UserService",
     		"org.apache.isis.applib.services.xactn.TransactionService",
     		
+    		"org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal",
+    		"org.apache.isis.applib.services.wrapper.WrapperFactory",
+    		
     		"org.apache.isis.applib.services.homepage.HomePageProviderService"
     		
     		
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetUtils.java
index eafbc29..518cfbc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetUtils.java
@@ -19,9 +19,12 @@
 
 package org.apache.isis.core.metamodel.facets.object.choices;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
+@Vetoed
 public class ChoicesFacetUtils {
 
     private ChoicesFacetUtils() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
index 70582c3..ac13ee2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
@@ -23,6 +23,8 @@ import java.util.SortedSet;
 import java.util.function.Function;
 import java.util.function.Predicate;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.apache.isis.applib.IsisApplibModule;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.SemanticsOf;
@@ -266,6 +268,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
 
     // -- Functions
 
+    @Vetoed
     public static class Functions {
         private Functions(){}
 
@@ -274,6 +277,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
 
     }
 
+    @Vetoed
     public static class Predicates {
         private Predicates(){}
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
index c008ac0..a957d4e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -23,6 +23,7 @@ import java.util.function.Function;
 import java.util.function.Predicate;
 
 import javax.annotation.Nullable;
+import javax.enterprise.inject.Vetoed;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -128,7 +129,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
             final Object proposedValue,
             final InteractionInitiatedBy interactionInitiatedBy);
 
-
+    @Vetoed
     public static class Functions {
         public static final Function<ObjectActionParameter, String> GET_NAME =
                 ObjectActionParameter::getName;
@@ -141,6 +142,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
 
     }
 
+    @Vetoed
     public static class Predicates {
         private Predicates(){}
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
index 0bb68c1..47113df 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
@@ -23,10 +23,11 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -128,25 +129,10 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
     ObjectSpecification getOnType();
 
     // //////////////////////////////////////////////////////
-    // Functions
-    // //////////////////////////////////////////////////////
-
-    public static class Functions {
-        private Functions(){}
-
-        public static Function<ObjectAssociation, String> toName() {
-            return ObjectAssociation::getName;
-        }
-
-        public static Function<ObjectAssociation, String> toId() {
-            return ObjectAssociation::getId;
-        }
-    }
-
-    // //////////////////////////////////////////////////////
     // Predicates
     // //////////////////////////////////////////////////////
 
+    @Vetoed
     public static class Predicates {
 
         private Predicates(){}
@@ -193,6 +179,7 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
     // Comparators
     // //////////////////////////////////////////////////////
 
+    @Vetoed
     public static class Comparators {
         /**
          * Use {@link ObjectMember.Comparators#byMemberOrderSequence()} instead.
@@ -218,6 +205,7 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
     // Util
     // //////////////////////////////////////////////////////
 
+    @Vetoed
     public static class Util {
         private Util(){}
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 722c167..6032660 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -30,6 +30,8 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -491,6 +493,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         .orElse(notANoopFacetFilter.noopFacet);
     }
 
+    @Vetoed
     private static class NotANoopFacetFilter<Q extends Facet> implements Predicate<Q> {
         Q noopFacet;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/runtime/authorization/standard/AuthorizationManagerStandard.java b/core/metamodel/src/main/java/org/apache/isis/core/runtime/authorization/standard/AuthorizationManagerStandard.java
index 7e88f73..8f03112 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/runtime/authorization/standard/AuthorizationManagerStandard.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/runtime/authorization/standard/AuthorizationManagerStandard.java
@@ -22,8 +22,8 @@ package org.apache.isis.core.runtime.authorization.standard;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Vetoed;
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.sudo.SudoService;
@@ -32,7 +32,7 @@ import org.apache.isis.core.security.authentication.AuthenticationSession;
 import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
 import org.apache.isis.core.security.authorization.standard.Authorizor;
 
-@Singleton
+@Vetoed
 public class AuthorizationManagerStandard implements AuthorizationManager {
 
 
diff --git a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java
index 6ab0162..9746ec9 100644
--- a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java
+++ b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java
@@ -51,8 +51,11 @@ public class WeldFactory {
 	    //final Class<?> beanScanInterceptor = classForName("org.apache.isis.core.webapp.jee.IsisCDIBeanScanInterceptor");
 	    final Class<?>[] additionalPackages = 
 	            classesForClassNames(
+	            		
+	            		"org.apache.isis.core.plugins.ioc.weld.services.request.RequestContextServiceWeld",
+	                    
+	                    "domainapp.application.HelloWorldAppManifest", // specific to the app
 	                    
-	                    "domainapp.application.HelloWorldAppManifest",
 	                    "org.apache.isis.config.AppConfig",
 	                    "org.apache.isis.applib.AppManifest",
 	                    "org.apache.isis.core.runtime.RuntimeModule",
@@ -79,7 +82,12 @@ public class WeldFactory {
 	            .addPackages(scanRecursively, classes)
 	            .addPackages(scanRecursively, additionalPackages)
 	            //.interceptors(beanScanInterceptor)
-	            .property("org.jboss.weld.construction.relaxed", true);
+//	            .property("org.jboss.weld.construction.relaxed", true)
+//	            .property("org.jboss.weld.development", true)
+//	            .property("org.jboss.weld.probe.jmxSupport", true)
+//	            .property("org.jboss.weld.probe.exportDataAfterDeployment", "d:/tmp/")
+	            ;
+        
         
         if(!_Strings.isNullOrEmpty(containerId)) {
             builder = builder.containerId(containerId);
diff --git a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/services/request/RequestContextHandleDefault.java b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/services/request/RequestContextHandleDefault.java
new file mode 100644
index 0000000..a22ee05
--- /dev/null
+++ b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/services/request/RequestContextHandleDefault.java
@@ -0,0 +1,18 @@
+package org.apache.isis.core.plugins.ioc.weld.services.request;
+
+import org.apache.isis.core.plugins.ioc.RequestContextHandle;
+
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor(staticName="of")
+class RequestContextHandleDefault implements RequestContextHandle {
+
+	private final Runnable onClose;
+	
+	@Override
+	public void close() {
+		onClose.run();
+	}
+	
+
+}
diff --git a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/services/request/RequestContextServiceWeld.java b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/services/request/RequestContextServiceWeld.java
new file mode 100644
index 0000000..6c1506e
--- /dev/null
+++ b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/services/request/RequestContextServiceWeld.java
@@ -0,0 +1,50 @@
+package org.apache.isis.core.plugins.ioc.weld.services.request;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.apache.isis.core.plugins.ioc.RequestContextHandle;
+import org.apache.isis.core.plugins.ioc.RequestContextService;
+import org.jboss.weld.context.bound.BoundRequestContext;
+
+@Singleton
+public class RequestContextServiceWeld implements RequestContextService {
+
+	/* Inject the BoundRequestContext. */
+	/* Alternatively, you could look this up from the BeanManager */
+	@Inject BoundRequestContext requestContext;
+
+	/* Start the request, providing a data store which will last the lifetime of the request */
+	@Override
+	public RequestContextHandle startRequest() {
+		
+		final Map<String, Object> requestDataStore = new HashMap<>();
+
+		// Associate the store with the context and activate the context
+		requestContext.associate(requestDataStore);
+		requestContext.activate();
+		
+		return RequestContextHandleDefault.of(()->endRequest(requestDataStore));
+	}
+
+
+	/* End the request, providing the same data store as was used to start the request */
+	private void endRequest(Map<String, Object> requestDataStore) {
+
+		try {
+			/* Invalidate the request (all bean instances will be scheduled for destruction) */
+			requestContext.invalidate();
+			/* Deactivate the request, causing all bean instances to be destroyed (as the context is invalid) */
+			requestContext.deactivate();
+
+		} finally {
+			/* Ensure that whatever happens we dissociate to prevent any memory leaks */
+			requestContext.dissociate(requestDataStore);
+		}
+
+	}
+
+}
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index 3e1b65d..1b44d69 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -18,6 +18,9 @@
  */
 package org.apache.isis.core.runtime.system.persistence;
 
+import static java.util.Objects.requireNonNull;
+import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+
 import java.sql.Timestamp;
 import java.text.MessageFormat;
 import java.util.ArrayList;
@@ -35,12 +38,6 @@ import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.identity.SingleFieldIdentity;
 import javax.jdo.listener.InstanceLifecycleListener;
 
-import org.datanucleus.enhancement.Persistable;
-import org.datanucleus.exceptions.NucleusObjectNotFoundException;
-import org.datanucleus.identity.DatastoreIdImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
@@ -70,6 +67,7 @@ import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.FreeStandingList;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.plugins.ioc.RequestContextHandle;
 import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
 import org.apache.isis.core.runtime.persistence.NotPersistableException;
 import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
@@ -92,9 +90,11 @@ import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.Persisten
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.spi.JdoObjectIdSerializer;
-
-import static java.util.Objects.requireNonNull;
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+import org.datanucleus.enhancement.Persistable;
+import org.datanucleus.exceptions.NucleusObjectNotFoundException;
+import org.datanucleus.identity.DatastoreIdImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A wrapper around the JDO {@link PersistenceManager}, which also manages concurrency
@@ -106,6 +106,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5.class);
     private ObjectAdapterContext objectAdapterContext;
+	private RequestContextHandle requestContextHandle;
 
     /**
      * Initialize the object store so that calls to this object store access
@@ -135,6 +136,9 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         if (LOG.isDebugEnabled()) {
             LOG.debug("opening {}", this);
         }
+        
+        // this handle needs to be closed when the request-scope's life-cycle ends 
+        requestContextHandle = requestContextService.startRequest(); 
 
         persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
 
@@ -259,6 +263,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         }
 
         objectAdapterContext.close();
+        
+        requestContextHandle.close();
 
         this.state = State.CLOSED;
     }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
index 91ee7bf..60897d3 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
@@ -25,7 +25,10 @@ import java.util.stream.Collectors;
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.fixtures.FixtureClock;
 import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.commons.internal.base._Blackhole;
 import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.commons.internal.cdi._CDI;
+import org.apache.isis.config.AppConfigLocator;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
 import org.apache.isis.core.runtime.headless.auth.AuthenticationRequestNameOnly;
@@ -117,8 +120,13 @@ public final class IsisSystem {
 
             // ensures that a FixtureClock is installed as the singleton underpinning the ClockService
             FixtureClock.initialize();
+            
+            // finalize the config (build and regard immutable)
+            // as a side-effect bootstrap CDI, if the environment we are running on does not already have its own 
+            _Blackhole.consume(AppConfigLocator.getAppConfig());
+            
 
-            isisSessionFactory = new IsisSessionProducerBean().produceIsisSessionFactory();
+            isisSessionFactory = _CDI.getSingleton(IsisSessionFactory.class);
             // REVIEW: does no harm, but is this required?
             closeSession();
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java
index cd1fa6e..79d038e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java
@@ -58,7 +58,7 @@ public class BackgroundServiceDefault implements BackgroundService {
     static final Logger LOG = LoggerFactory.getLogger(BackgroundServiceDefault.class);
 
     // only used if there is no BackgroundCommandService
-    private static class BuiltinExecutor {
+    static class BuiltinExecutor {
         /*
          * For the fixed thread-pool let there be 1-4 concurrent threads,
          * limited by the number of available (logical) processor cores.
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
index 527d09e..31f4946 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
@@ -23,9 +23,6 @@ import java.util.stream.Collectors;
 import javax.jdo.PersistenceManager;
 import javax.jdo.PersistenceManagerFactory;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.applib.services.command.spi.CommandService;
@@ -40,11 +37,14 @@ import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.util.ToString;
 import org.apache.isis.core.metamodel.MetaModelContext;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.plugins.ioc.RequestContextService;
 import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
 import org.apache.isis.core.runtime.services.changes.ChangedObjectsServiceInternal;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 abstract class PersistenceSessionBase implements PersistenceSession {
 
@@ -72,6 +72,8 @@ abstract class PersistenceSessionBase implements PersistenceSession {
     protected final MetricsService metricsService;
     protected final ClockService clockService;
     protected final UserService userService;
+    protected final RequestContextService requestContextService;
+    
     
     /**
      * Set to System.nanoTime() when session opens.
@@ -130,6 +132,7 @@ abstract class PersistenceSessionBase implements PersistenceSession {
         this.factoryService = lookupService(FactoryService.class);
         this.clockService = lookupService(ClockService.class);
         this.userService = lookupService(UserService.class);
+        this.requestContextService = lookupService(RequestContextService.class);
 
         // sub-components
         this.persistenceQueryFactory = new PersistenceQueryFactory(
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/standard/AuthenticationManagerStandard.java b/core/security/src/main/java/org/apache/isis/core/security/authentication/standard/AuthenticationManagerStandard.java
index 356509f..aec06bf 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authentication/standard/AuthenticationManagerStandard.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authentication/standard/AuthenticationManagerStandard.java
@@ -25,6 +25,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import javax.enterprise.inject.Vetoed;
+
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.util.ToString;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -39,6 +41,7 @@ import org.apache.isis.core.security.authentication.manager.RegistrationDetails;
 
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
+@Vetoed
 public class AuthenticationManagerStandard implements AuthenticationManager {
 
     private final Map<String, String> userByValidationCode = _Maps.newHashMap();
diff --git a/example/application/simpleapp/module-simple/pom.xml b/example/application/simpleapp/module-simple/pom.xml
index fc5521a..1a34da1 100644
--- a/example/application/simpleapp/module-simple/pom.xml
+++ b/example/application/simpleapp/module-simple/pom.xml
@@ -119,6 +119,11 @@
         </dependency>
         
         <!-- ISIS CORE PLUGINS -->
+        
+        <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-plugins-ioc-weld</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.apache.isis.core</groupId>
diff --git a/example/application/simpleapp/module-simple/src/main/java/META-INF/services/org.apache.isis.config.AppConfig b/example/application/simpleapp/module-simple/src/main/java/META-INF/services/org.apache.isis.config.AppConfig
new file mode 100644
index 0000000..0cc3c7f
--- /dev/null
+++ b/example/application/simpleapp/module-simple/src/main/java/META-INF/services/org.apache.isis.config.AppConfig
@@ -0,0 +1 @@
+domainapp.modules.simple.SimpleModuleManifest
\ No newline at end of file
diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModuleManifest.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModuleManifest.java
index 1230bae..141f949 100644
--- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModuleManifest.java
+++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModuleManifest.java
@@ -18,12 +18,25 @@
  */
 package domainapp.modules.simple;
 
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Singleton;
+
 import org.apache.isis.applib.AppManifestAbstract2;
+import org.apache.isis.config.AppConfig;
+import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.core.runtime.authorization.standard.AuthorizationManagerStandard;
+import org.apache.isis.core.security.authentication.bypass.AuthenticatorBypass;
+import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
+import org.apache.isis.core.security.authentication.standard.AuthenticationManagerStandard;
+import org.apache.isis.core.security.authorization.bypass.AuthorizorBypass;
+import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
 
 /**
  * Used by <code>isis-maven-plugin</code> (build-time validation of the module) and also by module-level integration tests.
  */
-public class SimpleModuleManifest extends AppManifestAbstract2 {
+@Singleton
+public class SimpleModuleManifest extends AppManifestAbstract2 implements AppConfig {
 
     public static final Builder BUILDER = Builder.forModule(new SimpleModule())
             .withConfigurationProperty("isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll","true")
@@ -34,5 +47,33 @@ public class SimpleModuleManifest extends AppManifestAbstract2 {
         super(BUILDER);
     }
 
+	// Implementing AppConfig, to tell the framework how to bootstrap the configuration.
+    @Override @Produces @Singleton
+    public IsisConfiguration isisConfiguration() {
+        return IsisConfiguration.buildFromAppManifest(this);
+    }
+    
+	 /**
+     * The standard authentication manager, configured with the 'bypass' authenticator 
+     * (allows all requests through).
+     * <p>
+     * integration tests ignore appManifest for authentication and authorization.
+     */
+    @Produces @Singleton
+    public AuthenticationManager authenticationManagerWithBypass() {
+        final AuthenticationManagerStandard authenticationManager = new AuthenticationManagerStandard();
+        authenticationManager.addAuthenticator(new AuthenticatorBypass());
+        return authenticationManager;
+    }
+    
+    @Produces @Singleton
+    public AuthorizationManager authorizationManagerWithBypass() {
+        final AuthorizationManagerStandard authorizationManager = new AuthorizationManagerStandard() {
+            {
+                authorizor = new AuthorizorBypass();
+            }  
+        };
+        return authorizationManager;
+    }
 
 }