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 2021/03/28 09:10:55 UTC

[isis] branch master updated: ISIS-2590: make MessageBroker Spring managed and session scoped

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 548b353  ISIS-2590: make MessageBroker Spring managed and session scoped
548b353 is described below

commit 548b353c6f30540ee886faa19660f07a58525c60
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Mar 28 11:10:42 2021 +0200

    ISIS-2590: make MessageBroker Spring managed and session scoped
---
 .../interaction/session/InteractionSession.java    |  9 +++--
 .../core/interaction/session/MessageBroker.java    | 46 +++++++++-------------
 .../session/InteractionFactoryDefault.java         | 10 ++++-
 .../isis/core/webapp/IsisModuleCoreWebapp.java     | 15 ++++++-
 .../core/messageservice/MessageServiceDemoVm.java  |  1 +
 .../isis/viewer/wicket/ui/errors/JGrowlUtil.java   | 16 ++++----
 .../isis/viewer/wicket/ui/panels/PanelBase.java    |  2 +-
 .../viewer/integration/WebRequestCycleForIsis.java |  4 +-
 8 files changed, 60 insertions(+), 43 deletions(-)

diff --git a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionSession.java b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionSession.java
index c62db56..0d1fd47 100644
--- a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionSession.java
+++ b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionSession.java
@@ -58,7 +58,7 @@ implements HasInteractionId {
     /**
      * The {@link MessageBroker} that holds messages for this session.
      */
-    @Getter private final MessageBroker messageBroker = new MessageBroker();
+    @Getter private final MessageBroker messageBroker;
 
     /**
      * The {@link MetaModelContext} that holds services for this session.
@@ -66,11 +66,14 @@ implements HasInteractionId {
     @Getter private final MetaModelContext metaModelContext;
 
     public InteractionSession(
-            @NonNull final MetaModelContext mmc, UUID conversationId) {
+            final @NonNull MetaModelContext mmc,
+            final @NonNull MessageBroker messageBroker,
+            final @NonNull UUID interactionId) {
 
         this.metaModelContext = mmc;
+        this.messageBroker = messageBroker;
         this.startedAtSystemNanos = System.nanoTime(); // used to measure time periods, so not using ClockService here
-        this.interaction = new IsisInteraction(conversationId);
+        this.interaction = new IsisInteraction(interactionId);
     }
 
     // -- FLUSH
diff --git a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/MessageBroker.java b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/MessageBroker.java
index 23a0117..a1342fa 100644
--- a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/MessageBroker.java
+++ b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/MessageBroker.java
@@ -20,27 +20,26 @@
 package org.apache.isis.core.interaction.session;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.collections._Lists;
 
+import lombok.val;
+
 public class MessageBroker implements Serializable {
 
     private static final long serialVersionUID = 1L;
-
-    // -- constructor, fields
-
+    
     private final List<String> messages = _Lists.newArrayList();
     private final List<String> warnings = _Lists.newArrayList();
     private String applicationError;
-
+    
     public MessageBroker() {
     }
 
-
-    // -- reset
+    // -- RESET
 
     public void reset() {
         warnings.clear();
@@ -48,11 +47,9 @@ public class MessageBroker implements Serializable {
         applicationError = null;
     }
 
+    // -- MESSAGES
 
-
-    // -- messages
-
-    public List<String> getMessages() {
+    public Can<String> drainMessages() {
         return copyAndClear(messages);
     }
 
@@ -60,11 +57,9 @@ public class MessageBroker implements Serializable {
         messages.add(message);
     }
 
+    // -- WARNINGS
 
-
-    // -- warnings
-
-    public List<String> getWarnings() {
+    public Can<String> drainWarnings() {
         return copyAndClear(warnings);
     }
 
@@ -76,13 +71,12 @@ public class MessageBroker implements Serializable {
         warnings.add(message);
     }
 
-
-
-    // -- applicationError
-    public String getApplicationError() {
+    // -- APPLICATION ERROR
+    
+    public Optional<String> drainApplicationError() {
         final String error = applicationError;
         setApplicationError(null);
-        return error;
+        return Optional.ofNullable(error);
     }
 
     public void setApplicationError(String applicationError) {
@@ -90,16 +84,12 @@ public class MessageBroker implements Serializable {
     }
 
 
+    // -- HELPERS
 
-    // -- helpers
-
-    private List<String> copyAndClear(final List<String> messages) {
-        final List<String> copy = Collections.unmodifiableList(new ArrayList<>(messages));
+    private Can<String> copyAndClear(final List<String> messages) {
+        val copy = Can.ofCollection(messages);
         messages.clear();
         return copy;
     }
 
-
-
-
 }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionFactoryDefault.java
index 9ac8465..34ab070 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionFactoryDefault.java
@@ -33,6 +33,7 @@ import java.util.concurrent.Callable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.inject.Provider;
 
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
@@ -48,6 +49,7 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.util.schema.ChangesDtoUtils;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
+import org.apache.isis.commons.functional.Result;
 import org.apache.isis.commons.functional.ThrowingRunnable;
 import org.apache.isis.commons.internal.concurrent._ConcurrentContext;
 import org.apache.isis.commons.internal.concurrent._ConcurrentTaskList;
@@ -64,6 +66,7 @@ import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionSession;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.interaction.session.IsisInteraction;
+import org.apache.isis.core.interaction.session.MessageBroker;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.services.publishing.CommandPublisher;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -103,6 +106,7 @@ implements
     @Inject ClockService clockService;
     @Inject CommandPublisher commandPublisher;
     @Inject List<InteractionScopeAware> interactionScopeAwareBeans;
+    @Inject Provider<MessageBroker> sessionScopedMessageBroker;
 
     private InteractionScopeLifecycleHandler interactionScopeLifecycleHandler;
 
@@ -207,7 +211,11 @@ implements
     private InteractionSession getOrCreateInteractionSession() {
     	
     	return authenticationStack.get().isEmpty()
-    			? new InteractionSession(metaModelContext, UUID.randomUUID())
+    			? new InteractionSession(
+    			        metaModelContext, 
+    			        Result.of(sessionScopedMessageBroker::get) // only available with web contexts (Spring)
+    			            .presentElse(new MessageBroker()), // fallback if no web context available (eg. JUnit)
+    			        UUID.randomUUID())
 				: authenticationStack.get().firstElement().getInteractionSession();
     }
 
diff --git a/core/webapp/src/main/java/org/apache/isis/core/webapp/IsisModuleCoreWebapp.java b/core/webapp/src/main/java/org/apache/isis/core/webapp/IsisModuleCoreWebapp.java
index e8b7ec8..8e2af31 100644
--- a/core/webapp/src/main/java/org/apache/isis/core/webapp/IsisModuleCoreWebapp.java
+++ b/core/webapp/src/main/java/org/apache/isis/core/webapp/IsisModuleCoreWebapp.java
@@ -18,13 +18,18 @@
  */
 package org.apache.isis.core.webapp;
 
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Scope;
+import org.springframework.context.annotation.ScopedProxyMode;
+import org.springframework.web.context.WebApplicationContext;
 
+import org.apache.isis.core.interaction.session.MessageBroker;
 import org.apache.isis.core.runtime.IsisModuleCoreRuntime;
+import org.apache.isis.core.webapp.health.HealthIndicatorUsingHealthCheckService;
 import org.apache.isis.core.webapp.modules.logonlog.WebModuleLogOnExceptionLogger;
 import org.apache.isis.core.webapp.modules.templresources.WebModuleTemplateResources;
-import org.apache.isis.core.webapp.health.HealthIndicatorUsingHealthCheckService;
 import org.apache.isis.core.webapp.webappctx.IsisWebAppContextInitializer;
 
 @Configuration
@@ -45,4 +50,12 @@ import org.apache.isis.core.webapp.webappctx.IsisWebAppContextInitializer;
 })
 public class IsisModuleCoreWebapp {
 
+    @Bean
+    @Scope(
+            value = WebApplicationContext.SCOPE_SESSION, 
+            proxyMode = ScopedProxyMode.TARGET_CLASS)
+    public MessageBroker sessionScopedMessageBroker() {
+        return new MessageBroker();
+    }
+    
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/messageservice/MessageServiceDemoVm.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/messageservice/MessageServiceDemoVm.java
index b7f2f65..da0d14e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/messageservice/MessageServiceDemoVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/messageservice/MessageServiceDemoVm.java
@@ -44,6 +44,7 @@ public class MessageServiceDemoVm implements HasAsciiDocDescription {
             position = Position.PANEL)
     @Action
     public MessageServiceDemoVm infoMessage(){
+        System.err.println("EXEC");
         messageService.informUser("Demo Info Message.");
         return this;
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/JGrowlUtil.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/JGrowlUtil.java
index 7b63558..eae5986 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/JGrowlUtil.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/JGrowlUtil.java
@@ -24,6 +24,7 @@ import org.apache.isis.core.interaction.session.MessageBroker;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
+import lombok.val;
 
 public class JGrowlUtil {
 
@@ -44,19 +45,20 @@ public class JGrowlUtil {
     }
 
     public static String asJGrowlCalls(final MessageBroker messageBroker) {
-        final StringBuilder buf = new StringBuilder();
+        val buf = new StringBuilder();
 
-        for (String info : messageBroker.getMessages()) {
+        for (String info : messageBroker.drainMessages()) {
             addJGrowlCall(info, JGrowlUtil.MessageSeverity.INFO, buf);
         }
-        for (String warning : messageBroker.getWarnings()) {
+        
+        for (String warning : messageBroker.drainWarnings()) {
             addJGrowlCall(warning, JGrowlUtil.MessageSeverity.WARNING, buf);
         }
 
-        final String error =  messageBroker.getApplicationError();
-        if(error!=null) {
-            addJGrowlCall(error, MessageSeverity.DANGER, buf);
-        }
+        messageBroker.drainApplicationError()
+        .ifPresent(error->
+            addJGrowlCall(error, MessageSeverity.DANGER, buf));
+        
         return buf.toString();
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java
index 2ba6ecc..9b19401 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java
@@ -141,7 +141,7 @@ implements HasCommonContext {
     }
     
     protected MessageBroker getMessageBroker() {
-        return commonContext.getInteractionTracker().currentMessageBrokerElseFail();
+        return getCommonContext().getInteractionTracker().currentMessageBrokerElseFail();
     }
     
     protected HeaderUiModel getHeaderModel() {
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/WebRequestCycleForIsis.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/WebRequestCycleForIsis.java
index 352f8c0..4043f77 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/WebRequestCycleForIsis.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/WebRequestCycleForIsis.java
@@ -479,11 +479,11 @@ public class WebRequestCycleForIsis implements IRequestCycleListener {
     }
 
     private boolean isInInteraction() {
-        return commonContext.getInteractionTracker().isInInteractionSession();
+        return getCommonContext().getInteractionTracker().isInInteractionSession();
     }
 
     private Optional<MessageBroker> getMessageBroker() {
-        return commonContext.getInteractionTracker().currentMessageBroker();
+        return getCommonContext().getInteractionTracker().currentMessageBroker();
     }
 
     private AuthenticatedWebSession getWicketAuthenticatedWebSession() {