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

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


The following commit(s) were added to refs/heads/v4 by this push:
     new 661e39d6f4e CAUSEWAY-3897: adds temporary debug logging to the 2 
unstable rest tests (RO)
661e39d6f4e is described below

commit 661e39d6f4e0f89c7424291d8e8d4e5141dec11e
Author: andi-huber <[email protected]>
AuthorDate: Mon Jul 7 09:00:35 2025 +0200

    CAUSEWAY-3897: adds temporary debug logging to the 2 unstable rest tests
    (RO)
    
    - hope is to get some insight on the root cause
---
 .../commons/internal/debug/_XrayEvent.java         |  2 +-
 .../transaction/TransactionServiceSpring.java      | 24 ++++++++++++--------
 .../scenarios/staff/Staff_hilevel_IntegTest.java   | 26 ++++++++++++++++++++--
 3 files changed, 40 insertions(+), 12 deletions(-)

diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/debug/_XrayEvent.java
 
b/commons/src/main/java/org/apache/causeway/commons/internal/debug/_XrayEvent.java
index adea4ab5bab..922bb845c6e 100644
--- 
a/commons/src/main/java/org/apache/causeway/commons/internal/debug/_XrayEvent.java
+++ 
b/commons/src/main/java/org/apache/causeway/commons/internal/debug/_XrayEvent.java
@@ -88,7 +88,7 @@ public void user(final String format, final Object...args) {
      */
     void record(final int depthLimit, final _IconResource icon, final String 
format, final Object...args) {
         var stackTrace = _Exceptions.streamStackTrace()
-                .skip(3)
+                .skip(4)
                 .filter(_XrayEvent::accept)
                 .collect(Can.toCan());
                 //.reverse();
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/transaction/TransactionServiceSpring.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/transaction/TransactionServiceSpring.java
index a61a55e4e16..3027d3c7f02 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/transaction/TransactionServiceSpring.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/transaction/TransactionServiceSpring.java
@@ -20,6 +20,7 @@
 
 import java.util.List;
 import java.util.Optional;
+import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.LongAdder;
 
@@ -54,6 +55,7 @@
 import org.apache.causeway.commons.functional.Try;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.collections._Lists;
+import org.apache.causeway.commons.internal.debug._Debug;
 import org.apache.causeway.commons.internal.debug._Probe;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.core.interaction.session.CausewayInteraction;
@@ -116,21 +118,25 @@ public <T> Try<T> callTransactional(final 
TransactionDefinition def, final Calla
 
         Try<T> result = null;
 
+        var uuid = UUID.randomUUID();
+        _Debug.log("tx START %s (%d) 
-----------------------------------------------------------", uuid, 
def.getPropagationBehavior());
+
         try {
             TransactionStatus txStatus = 
platformTransactionManager.getTransaction(def);
             registerTransactionSynchronizations(txStatus);
 
             result = Try.call(() -> {
-                        final T callResult = callable.call();
 
-                        if(!FlushMgmt.isAutoFlushSuppressed()) {
-                            // we flush here to ensure that the result 
captures any exception, eg from a declarative constraint violation
-                            txStatus.flush();
-                        }
+                    final T callResult = callable.call();
 
-                        return callResult;
-                    })
-                    .mapFailure(ex->translateExceptionIfPossible(ex, 
platformTransactionManager));
+                    if(!FlushMgmt.isAutoFlushSuppressed()) {
+                        // we flush here to ensure that the result captures 
any exception, eg from a declarative constraint violation
+                        txStatus.flush();
+                    }
+
+                    return callResult;
+                })
+                .mapFailure(ex->translateExceptionIfPossible(ex, 
platformTransactionManager));
 
             if(result.isFailure()) {
                 // if this is a nested transaction, then the javadoc says it 
will actually be just a call to
@@ -155,7 +161,7 @@ public <T> Try<T> callTransactional(final 
TransactionDefinition def, final Calla
 
             return Try.failure(translateExceptionIfPossible(ex, 
platformTransactionManager));
         }
-
+        _Debug.log("tx END %s 
----------------------------------------------------------", uuid);
         return result;
     }
 
diff --git 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/staff/Staff_hilevel_IntegTest.java
 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/staff/Staff_hilevel_IntegTest.java
index 916d49de9dd..ae7aed2fb9e 100644
--- 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/staff/Staff_hilevel_IntegTest.java
+++ 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/staff/Staff_hilevel_IntegTest.java
@@ -35,6 +35,7 @@
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.applib.value.Blob;
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
+import org.apache.causeway.commons.internal.debug._Debug;
 import org.apache.causeway.commons.io.DataSource;
 import org.apache.causeway.viewer.restfulobjects.test.domain.dom.Department;
 import 
org.apache.causeway.viewer.restfulobjects.test.scenarios.Abstract_IntegTest;
@@ -148,6 +149,8 @@ void createStaffMemberWithPhoto2() {
         // given
         final var staffName = "Fred Smith";
 
+        _Debug.log("PHASE 1 
-----------------------------------------------------------");
+
         final var bookmarkBeforeIfAny = 
transactionService.callTransactional(Propagation.REQUIRED, () -> {
             final var staffMember = 
staffMemberRepository.findByName(staffName);
             return bookmarkService.bookmarkFor(staffMember);
@@ -155,6 +158,8 @@ void createStaffMemberWithPhoto2() {
 
         assertThat(bookmarkBeforeIfAny).isEmpty();
 
+        _Debug.log("PHASE 2 
-----------------------------------------------------------");
+
         // and given
         final var departmentName = "Classics";
         final var departmentBookmark = 
transactionService.callTransactional(Propagation.REQUIRED, () -> {
@@ -162,6 +167,9 @@ void createStaffMemberWithPhoto2() {
             return bookmarkService.bookmarkFor(staffMember).orElseThrow();
         }).valueAsNonNullElseFail();
 
+
+        _Debug.log("PHASE 3 
-----------------------------------------------------------");
+
         // and given
         final Blob photo = readFileAsBlob("StaffMember-photo-Bar.pdf");
         final var requestBuilder = 
restfulClient.request("services/university.dept.Staff/actions/createStaffMemberWithPhoto2/invoke");
@@ -174,6 +182,8 @@ void createStaffMemberWithPhoto2() {
 
         Approvals.verify(args.getEntity(), jsonOptions());
 
+        _Debug.log("PHASE 4 
-----------------------------------------------------------");
+
         // when
         var response = requestBuilder.post(args);
 
@@ -186,8 +196,10 @@ void createStaffMemberWithPhoto2() {
         var entity = response.readEntity(String.class);
         assertNotNull(entity);
 
+        _Debug.log("PHASE 5 
-----------------------------------------------------------");
+
         // and also object is created in database
-        final var bookmarkAfterIfAny = 
transactionService.callTransactional(Propagation.REQUIRES_NEW, () -> {
+        final var bookmarkAfterIfAny = 
transactionService.callTransactional(Propagation.REQUIRED, () -> {
             final var staffMember = 
staffMemberRepository.findByName(staffName);
             return bookmarkService.bookmarkFor(staffMember);
         }).valueAsNonNullElseFail();
@@ -202,6 +214,8 @@ void createStaffMemberWithPhoto2_using_map() {
         // given
         final var staffName = "Fred Smith";
 
+        _Debug.log("PHASE 1 
-----------------------------------------------------------");
+
         final var bookmarkBeforeIfAny = 
transactionService.callTransactional(Propagation.REQUIRED, () -> {
             final var staffMember = 
staffMemberRepository.findByName(staffName);
             return bookmarkService.bookmarkFor(staffMember);
@@ -209,6 +223,8 @@ void createStaffMemberWithPhoto2_using_map() {
 
         assertThat(bookmarkBeforeIfAny).isEmpty();
 
+        _Debug.log("PHASE 2 
-----------------------------------------------------------");
+
         // and given
         final var departmentName = "Classics";
         final var departmentBookmark = 
transactionService.callTransactional(Propagation.REQUIRED, () -> {
@@ -216,6 +232,8 @@ void createStaffMemberWithPhoto2_using_map() {
             return bookmarkService.bookmarkFor(staffMember).orElseThrow();
         }).valueAsNonNullElseFail();
 
+        _Debug.log("PHASE 3 
-----------------------------------------------------------");
+
         // and given
         final Blob photo = readFileAsBlob("StaffMember-photo-Bar.pdf");
         final var requestBuilder = 
restfulClient.request("services/university.dept.Staff/actions/createStaffMemberWithPhoto2/invoke");
@@ -233,6 +251,8 @@ void createStaffMemberWithPhoto2_using_map() {
 
         Approvals.verify(args.getEntity(), jsonOptions());
 
+        _Debug.log("PHASE 4 
-----------------------------------------------------------");
+
         // when
         var response = requestBuilder.post(args);
 
@@ -245,8 +265,10 @@ void createStaffMemberWithPhoto2_using_map() {
         var entity = response.readEntity(String.class);
         assertNotNull(entity);
 
+        _Debug.log("PHASE 5 
-----------------------------------------------------------");
+
         // and also object is created in database
-        final var bookmarkAfterIfAny = 
transactionService.callTransactional(Propagation.REQUIRES_NEW, () -> {
+        final var bookmarkAfterIfAny = 
transactionService.callTransactional(Propagation.REQUIRED, () -> {
             final var staffMember = 
staffMemberRepository.findByName(staffName);
             return bookmarkService.bookmarkFor(staffMember);
         }).valueAsNonNullElseFail();

Reply via email to