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() {