You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2022/08/25 16:24:20 UTC

[isis] 07/09: ISIS-3178: handles logout event within transaction

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

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

commit 7907e9cb8c126dc36475850dc4e8045df1fcfd21
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Aug 25 17:18:51 2022 +0100

    ISIS-3178: handles logout event within transaction
---
 .../spiimpl/SessionSubscriberForSessionLog.java    | 34 ++++++++++++++--------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/extensions/sessionlog/applib/spiimpl/SessionSubscriberForSessionLog.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/extensions/sessionlog/applib/spiimpl/SessionSubscriberForSessionLog.java
index 65cf1317c0..05d45c0830 100644
--- a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/extensions/sessionlog/applib/spiimpl/SessionSubscriberForSessionLog.java
+++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/extensions/sessionlog/applib/spiimpl/SessionSubscriberForSessionLog.java
@@ -30,10 +30,13 @@ import javax.inject.Named;
 
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.session.SessionSubscriber;
+import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.extensions.sessionlog.applib.IsisModuleExtSessionLogApplib;
 import org.apache.isis.extensions.sessionlog.applib.dom.SessionLogEntry;
 import org.apache.isis.extensions.sessionlog.applib.dom.SessionLogEntryRepository;
@@ -57,21 +60,28 @@ public class SessionSubscriberForSessionLog implements SessionSubscriber {
     static final String LOGICAL_TYPE_NAME = IsisModuleExtSessionLogApplib.NAMESPACE + ".SessionLoggingServiceDefault";
 
     final SessionLogEntryRepository<? extends SessionLogEntry> sessionLogEntryRepository;
+    final TransactionService transactionService;
+    final InteractionService interactionService;
     final ClockService clockService;
 
     @Override
     public void log(final Type type, final String username, final Date date, final CausedBy causedBy, final UUID sessionGuid, final String httpSessionId) {
-        if (type == Type.LOGIN) {
-            sessionLogEntryRepository.create(username, sessionGuid, httpSessionId, causedBy, Timestamp.from(date.toInstant()));
-        } else {
-            val sessionLogEntryIfAny = sessionLogEntryRepository.findBySessionGuid(sessionGuid);
-            sessionLogEntryIfAny
-                    .ifPresent(entry -> {
-                        entry.setLogoutTimestamp(Timestamp.from(date.toInstant()));
-                        entry.setCausedBy(causedBy);
-                    }
-            );
-        }
-    }
+        interactionService.runAnonymous(() -> {
+            transactionService.runTransactional(Propagation.REQUIRES_NEW, () -> {
+                if (type == Type.LOGIN) {
+                    sessionLogEntryRepository.create(username, sessionGuid, httpSessionId, causedBy, Timestamp.from(date.toInstant()));
+                } else {
 
+                    val sessionLogEntryIfAny = sessionLogEntryRepository.findBySessionGuid(sessionGuid);
+                    sessionLogEntryIfAny
+                            .ifPresent(entry -> {
+                                        entry.setLogoutTimestamp(Timestamp.from(date.toInstant()));
+                                        entry.setCausedBy(causedBy);
+                                        transactionService.flushTransaction();
+                                    }
+                            );
+                }
+            });
+        });
+    }
 }