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;
+ }
}