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 <[email protected]> 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(); + } + ); + } + }); + }); + } }
