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/27 07:09:44 UTC

[isis] branch master updated: ISIS-2573: x-ray: be more verbose on publishing

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 8550963  ISIS-2573: x-ray: be more verbose on publishing
8550963 is described below

commit 855096338544ada7a25e10fec5410dbdf35a3bb2
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Mar 27 08:09:26 2021 +0100

    ISIS-2573: x-ray: be more verbose on publishing
    
    also allow seq. dia. individual connection styling
---
 .../debug/xray/sequence/SequenceDiagram.java       | 87 ++++++++++++++++++----
 .../publish/CommandPublisherDefault.java           | 26 ++++++-
 .../publish/EntityChangesPublisherDefault.java     | 17 ++++-
 .../EntityPropertyChangePublisherDefault.java      | 18 ++++-
 .../publish/ExecutionPublisherDefault.java         | 23 +++++-
 .../isis/core/runtimeservices/publish/_Xray.java   | 79 +++++++++++++++-----
 .../publishing/jdo/JdoExecutionPublishingTest.java |  4 +-
 7 files changed, 211 insertions(+), 43 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/debug/xray/sequence/SequenceDiagram.java b/commons/src/main/java/org/apache/isis/commons/internal/debug/xray/sequence/SequenceDiagram.java
index a7746bd..d3d598b 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/debug/xray/sequence/SequenceDiagram.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/debug/xray/sequence/SequenceDiagram.java
@@ -56,15 +56,15 @@ public class SequenceDiagram {
     }
 
     public void enter(final @NonNull String from, final @NonNull String to, String label) {
-        val p0 = participantsById.computeIfAbsent(from, id->new Participant(aliases.getOrDefault(id, id)));
-        val p1 = participantsById.computeIfAbsent(to, id->new Participant(aliases.getOrDefault(id, id)));
-        connections.add(new Connection(connections.size(), p0, p1, label, false));
+        val p0 = participant(from);
+        val p1 = participant(to);
+        connections.add(newConnection(p0, p1, label, false));
     }
 
     public void exit(final @NonNull String from, final @NonNull String to, String label) {
-        val p1 = participantsById.computeIfAbsent(to, id->new Participant(aliases.getOrDefault(id, id)));
-        val p0 = participantsById.computeIfAbsent(from, id->new Participant(aliases.getOrDefault(id, id)));
-        connections.add(new Connection(connections.size(), p0, p1, label, true));
+        val p1 = participant(to);
+        val p0 = participant(from);
+        connections.add(newConnection(p0, p1, label, true));
     }
 
     public void enter(String from, String to) {
@@ -76,22 +76,72 @@ public class SequenceDiagram {
     }
     
     public void activate(String participantId) {
-        val participant = participantsById
-                .computeIfAbsent(participantId, id->new Participant(aliases.getOrDefault(id, id)));
-        val latestConnection = Can.ofCollection(connections).getLast().orElse(null);
+        val participant = participant(participantId);
+        val latestConnection = latestConnection();
         lifelines.add(new Lifeline(participant, latestConnection));
     }
 
     public void deactivate(String participantId) {
-        val participant = participantsById
-                .computeIfAbsent(participantId, id->new Participant(aliases.getOrDefault(id, id)));
-        val latestConnection = Can.ofCollection(connections).getLast().orElse(null);
+        val participant = participant(participantId);
+        val latestConnection = latestConnection();
         Can.ofCollection(lifelines).reverse().stream()
         .filter(lifeline->lifeline.getParticipant().equals(participant))
         .findFirst()
         .ifPresent(lifeline->lifeline.endAt = latestConnection);
     }
+    
+    // -- STYLE OVERRIDE
+    
+    private Color connectionArrowColor;
+    private Color connectionLabelColor;
+    
+    public void setConnectionArrowColor(Color connectionArrowColor) {
+        this.connectionArrowColor = connectionArrowColor;
+    }
+    
+    public void setConnectionLabelColor(Color connectionLabelColor) {
+        this.connectionLabelColor = connectionLabelColor;
+    }
+
+    // -- HELPER
+    
+    private Connection newConnection(
+            final Participant from, 
+            final Participant to, 
+            final String label, 
+            final boolean dashedLine) {
+        return new Connection(
+                connections.size(), 
+                from, 
+                to, 
+                label, 
+                dashedLine, 
+                getConnectionArrowColor(), 
+                getConnectionLabelColor());
+    }
+    
+    private Participant participant(String participantId) {
+        return participantsById
+                .computeIfAbsent(participantId, id->new Participant(aliases.getOrDefault(id, id)));
+    }
+    
+    private Connection latestConnection() {
+        return Can.ofCollection(connections).getLast().orElse(null);
+    }
+    
+    private Color getConnectionArrowColor() {
+        return connectionArrowColor!=null
+                ? connectionArrowColor
+                : CONNECTION_ARROW_COLOR;
+    }
 
+    private Color getConnectionLabelColor() {
+        return connectionLabelColor!=null
+                ? connectionLabelColor
+                : CONNECTION_LABEL_COLOR;
+    }
+    
+    
     // -- RENDERING
 
     private final static Color PARTICIPANT_BACKGROUND_COLOR = _Graphics.COLOR_LIGHTER_GREEN;
@@ -107,6 +157,8 @@ public class SequenceDiagram {
     private final static Color LIFELINE_BACKGROUND_COLOR = Color.WHITE;
     private final static int LIFELINE_WIDTH = 8;
     
+    private final static Color CONNECTION_ARROW_COLOR = _Graphics.COLOR_DARKER_RED;
+    private final static Color CONNECTION_LABEL_COLOR = Color.BLACK;
     private final static int CONNECTION_MARGIN_V = 12;
     private final static int CONNECTION_LABEL_PADDING_H = 8;
     private final static int CONNECTION_LABEL_PADDING_V = 3;
@@ -121,6 +173,9 @@ public class SequenceDiagram {
         final String label;
         final boolean dashedLine;
 
+        final Color arrowColor;
+        final Color labelColor;
+        
         TextBlock textBlock;
 
         int x_left;
@@ -325,6 +380,8 @@ public class SequenceDiagram {
         lifelines.stream()
         .forEach(ll->{
             
+            // lifeline box
+            
             g.setColor(LIFELINE_BACKGROUND_COLOR);
             g.fillRect(ll.getX_left(), ll.getY_top(), ll.getWidth(), ll.getHeight());
 
@@ -339,7 +396,7 @@ public class SequenceDiagram {
 
             // connection arrow
 
-            g.setColor(_Graphics.COLOR_DARKER_RED);
+            g.setColor(c.getArrowColor());
 
             g.setStroke(c.isDashedLine()
                     ? _Graphics.STROKE_DASHED
@@ -352,12 +409,14 @@ public class SequenceDiagram {
 
             // connection label
 
-            g.setColor(Color.black);
+            g.setColor(c.getLabelColor());
             c.getTextBlock().render(g);
 
         });
 
     }
+    
+
 
 
 }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/CommandPublisherDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/CommandPublisherDefault.java
index 8491518..f61f63e 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/CommandPublisherDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/CommandPublisherDefault.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.runtimeservices.publish;
 
 import java.util.List;
 
+import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -65,10 +66,13 @@ public class CommandPublisherDefault implements CommandPublisher {
     @Override
     public void complete(final @NonNull Command command) {
         
-        val canPublish = canPublish(command);
-        val handle = _Xray.enterCommandPublishing(iaTracker, command, canPublish, enabledSubscribers);
+        val handle = _Xray.enterCommandPublishing(
+                iaTracker, 
+                command, 
+                enabledSubscribers, 
+                ()->getCannotPublishReason(command));
         
-        if(canPublish) {
+        if(canPublish(command)) {
             log.debug("about to PUBLISH command: {} to {}", command, enabledSubscribers);
             enabledSubscribers.forEach(subscriber -> subscriber.onCompleted(command));    
         }
@@ -84,6 +88,20 @@ public class CommandPublisherDefault implements CommandPublisher {
                 && command.getLogicalMemberIdentifier() != null; // eg null when seed fixtures
     }
     
-
+    // x-ray support
+    private @Nullable String getCannotPublishReason(final @NonNull Command command) {
+        return enabledSubscribers.isEmpty()
+                ? "no subscribers"
+                : !command.isPublishingEnabled()
+                        ? String.format(
+                                "publishing not enabled for given command\n%s",
+                                command.toString())
+                        : command.getLogicalMemberIdentifier() == null
+                                ? String.format(
+                                        "no logical-member-id for given command\n%s",
+                                        command.toString())
+                                : null;
+    }
+    
 }
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityChangesPublisherDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityChangesPublisherDefault.java
index 6deaed3..2870076 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityChangesPublisherDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityChangesPublisherDefault.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.runtimeservices.publish;
 import java.util.List;
 import java.util.Optional;
 
+import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -41,6 +42,7 @@ import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.transaction.changetracking.EntityChangesPublisher;
 import org.apache.isis.core.transaction.changetracking.HasEnlistedEntityChanges;
 
+import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
@@ -69,7 +71,11 @@ public class EntityChangesPublisherDefault implements EntityChangesPublisher {
     public void publishChangingEntities(HasEnlistedEntityChanges hasEnlistedEntityChanges) {
 
         val payload = getPayload(hasEnlistedEntityChanges);
-        val handle = _Xray.enterEntityChangesPublishing(iaTracker, payload, enabledSubscribers);
+        val handle = _Xray.enterEntityChangesPublishing(
+                iaTracker, 
+                payload, 
+                enabledSubscribers,
+                ()->getCannotPublishReason(payload));
         
         payload.ifPresent(entityChanges->{
             for (val subscriber : enabledSubscribers) {
@@ -89,5 +95,14 @@ public class EntityChangesPublisherDefault implements EntityChangesPublisher {
                         clockService.getClock().javaSqlTimestamp(), // current time 
                         userService.currentUserNameElseNobody()); // current user
     }
+    
+    // x-ray support
+    private @Nullable String getCannotPublishReason(final @NonNull Optional<EntityChanges> payload) {
+        return enabledSubscribers.isEmpty()
+                ? "no subscribers"
+                : !payload.isPresent()
+                        ? "no changes had been enlisted"
+                        : null;
+    }
 
 }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityPropertyChangePublisherDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityPropertyChangePublisherDefault.java
index 10c4cba..b5623cf 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityPropertyChangePublisherDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityPropertyChangePublisherDefault.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.runtimeservices.publish;
 
 import java.util.List;
 
+import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -42,6 +43,7 @@ import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.transaction.changetracking.EntityPropertyChangePublisher;
 import org.apache.isis.core.transaction.changetracking.HasEnlistedEntityPropertyChanges;
 
+import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
@@ -73,7 +75,12 @@ public class EntityPropertyChangePublisherDefault implements EntityPropertyChang
             final HasEnlistedEntityPropertyChanges hasEnlistedEntityPropertyChanges) {
         
         val payload = getPayload(hasEnlistedEntityPropertyChanges);
-        val handle = _Xray.enterEntityPropertyChangePublishing(iaTracker, payload, enabledSubscribers);
+        val handle = _Xray.enterEntityPropertyChangePublishing(
+                iaTracker, 
+                payload,
+                enabledSubscribers,
+                ()->getCannotPublishReason(payload)
+                );
         
         payload.forEach(propertyChange->{
             for (val subscriber : enabledSubscribers) {
@@ -103,5 +110,14 @@ public class EntityPropertyChangePublisherDefault implements EntityPropertyChang
                 currentUser,
                 currentTransactionId);
     }
+    
+    // x-ray support
+    private @Nullable String getCannotPublishReason(final @NonNull Can<EntityPropertyChange> payload) {
+        return enabledSubscribers.isEmpty()
+                ? "no subscribers"
+                : payload.isEmpty()
+                        ? "no changes had been enlisted"
+                        : null;
+    }
 
 }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ExecutionPublisherDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ExecutionPublisherDefault.java
index 652e3a3..01cb3c2 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ExecutionPublisherDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ExecutionPublisherDefault.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.concurrent.atomic.LongAdder;
 import java.util.function.Supplier;
 
+import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -90,10 +91,13 @@ implements ExecutionPublisher {
 
     private void notifySubscribers(final Execution<?,?> execution) {
         
-        val canPublish = canPublish();
-        val handle = _Xray.enterExecutionPublishing(iaTracker, execution, canPublish, enabledSubscribers);
+        val handle = _Xray.enterExecutionPublishing(
+                iaTracker, 
+                execution, 
+                enabledSubscribers,
+                this::getCannotPublishReason);
         
-        if(canPublish) {
+        if(canPublish()) {
             for (val subscriber : enabledSubscribers) {
                 subscriber.onExecution(execution);
             }    
@@ -107,7 +111,18 @@ implements ExecutionPublisher {
 
     private boolean canPublish() {
         return enabledSubscribers.isNotEmpty()
-                && suppressionRequestCounter.longValue() < 1L;    }
+                && suppressionRequestCounter.longValue() < 1L;    
+    }
 
+    // x-ray support
+    private @Nullable String getCannotPublishReason() {
+        return enabledSubscribers.isEmpty()
+                ? "no subscribers"
+                : suppressionRequestCounter.longValue() > 0L
+                        ? String.format(
+                                "suppressed for block of executable code\nsuppression request depth %d",
+                                suppressionRequestCounter.longValue())
+                        : null;
+    }
 
 }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/_Xray.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/_Xray.java
index 92f0399..b5bccde 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/_Xray.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/_Xray.java
@@ -18,7 +18,9 @@
  */
 package org.apache.isis.core.runtimeservices.publish;
 
+import java.awt.Color;
 import java.util.Optional;
+import java.util.function.Supplier;
 
 import javax.annotation.Nullable;
 
@@ -46,16 +48,20 @@ final class _Xray {
     static SequenceHandle enterCommandPublishing(
             final @NonNull InteractionTracker iaTracker,
             final @Nullable Command command,
-            final boolean canPublish,
-            final @NonNull Can<CommandSubscriber> enabledSubscribers) {
+            final @NonNull Can<CommandSubscriber> enabledSubscribers,
+            final @NonNull Supplier<String> cannotPublishReasonSupplier) {
         
         if(!XrayUi.isXrayEnabled()) {
             return null;
         }
         
+        val cannotPublishReason = cannotPublishReasonSupplier.get();
+        val canPublish = cannotPublishReason==null;
         val enteringLabel = canPublish 
-                ? String.format("publishing command to %d subscriber(s)", enabledSubscribers.size())
-                : "not publishing command";
+                ? String.format("publishing command to %d subscriber(s):\n%s", 
+                        enabledSubscribers.size(),
+                        command.toString())
+                : String.format("not publishing command:\n%s", cannotPublishReason);
         
         val handleIfAny = XrayUtil.createSequenceHandle(iaTracker, "cmd-publisher");
         handleIfAny.ifPresent(handle->{
@@ -64,6 +70,11 @@ final class _Xray {
                 
                 sequenceData.alias("cmd-publisher", "Command-\nPublisher-\n(Default)");
                 
+                if(!canPublish) {
+                    sequenceData.setConnectionArrowColor(Color.GRAY);
+                    sequenceData.setConnectionLabelColor(Color.GRAY);
+                }
+                
                 val callee = handle.getCallees().getFirstOrFail();
                 sequenceData.enter(handle.getCaller(), callee, enteringLabel);
                 sequenceData.activate(callee);
@@ -79,17 +90,21 @@ final class _Xray {
     
     public static SequenceHandle enterExecutionPublishing(
             final @NonNull InteractionTracker iaTracker,
-            final @Nullable Execution<?, ?> command,
-            final boolean canPublish,
-            final @NonNull Can<ExecutionSubscriber> enabledSubscribers) {
+            final @Nullable Execution<?, ?> execution,
+            final @NonNull Can<ExecutionSubscriber> enabledSubscribers,
+            final @NonNull Supplier<String> cannotPublishReasonSupplier) {
         
         if(!XrayUi.isXrayEnabled()) {
             return null;
         }
         
-        val enteringLabel = canPublish 
-                ? String.format("publishing execution to %d subscriber(s)", enabledSubscribers.size())
-                : "not publishing execution";
+        val cannotPublishReason = cannotPublishReasonSupplier.get();
+        val canPublish = cannotPublishReason==null;
+        val enteringLabel = canPublish
+                ? String.format("publishing execution to %d subscriber(s):\n%s", 
+                        enabledSubscribers.size(),
+                        execution.toString())
+                : String.format("not publishing execution:\n%s", cannotPublishReason);
         
         val handleIfAny = XrayUtil.createSequenceHandle(iaTracker, "exec-publisher");
         handleIfAny.ifPresent(handle->{
@@ -98,6 +113,11 @@ final class _Xray {
                 
                 sequenceData.alias("exec-publisher", "Execution-\nPublisher-\n(Default)");
                 
+                if(!canPublish) {
+                    sequenceData.setConnectionArrowColor(Color.GRAY);
+                    sequenceData.setConnectionLabelColor(Color.GRAY);
+                }
+                
                 val callee = handle.getCallees().getFirstOrFail();
                 sequenceData.enter(handle.getCaller(), callee, enteringLabel);
                 sequenceData.activate(callee);
@@ -114,15 +134,20 @@ final class _Xray {
     public static SequenceHandle enterEntityChangesPublishing(
             final @NonNull InteractionTracker iaTracker,
             final @NonNull Optional<EntityChanges> payload,
-            final @NonNull Can<EntityChangesSubscriber> enabledSubscribers) {
+            final @NonNull Can<EntityChangesSubscriber> enabledSubscribers,
+            final @NonNull Supplier<String> cannotPublishReasonSupplier) {
         
         if(!XrayUi.isXrayEnabled()) {
             return null;
         }
         
-        val enteringLabel = payload.isPresent() 
-                ? String.format("publishing entity-changes to %d subscriber(s)", enabledSubscribers.size())
-                : "not publishing entity-changes";
+        val cannotPublishReason = cannotPublishReasonSupplier.get();
+        val canPublish = cannotPublishReason==null;
+        val enteringLabel = canPublish 
+                ? String.format("publishing entity-changes to %d subscriber(s):\n%s", 
+                        enabledSubscribers.size(),
+                        payload.map(Object::toString).orElse("null"))
+                : String.format("not publishing entity-changes:\n%s", cannotPublishReason);
         
         val handleIfAny = XrayUtil.createSequenceHandle(iaTracker, "ec-publisher");
         handleIfAny.ifPresent(handle->{
@@ -131,6 +156,11 @@ final class _Xray {
                 
                 sequenceData.alias("ec-publisher", "EntityChanges-\nPublisher-\n(Default)");
                 
+                if(!canPublish) {
+                    sequenceData.setConnectionArrowColor(Color.GRAY);
+                    sequenceData.setConnectionLabelColor(Color.GRAY);
+                }
+                
                 val callee = handle.getCallees().getFirstOrFail();
                 sequenceData.enter(handle.getCaller(), callee, enteringLabel);
                 sequenceData.activate(callee);
@@ -147,15 +177,20 @@ final class _Xray {
     public static SequenceHandle enterEntityPropertyChangePublishing(
             final @NonNull InteractionTracker iaTracker,
             final @NonNull Can<EntityPropertyChange> payload,
-            final @NonNull Can<EntityPropertyChangeSubscriber> enabledSubscribers) {
+            final @NonNull Can<EntityPropertyChangeSubscriber> enabledSubscribers,
+            final @NonNull Supplier<String> cannotPublishReasonSupplier) {
         
         if(!XrayUi.isXrayEnabled()) {
             return null;
         }
         
-        val enteringLabel = !payload.isEmpty() 
-                ? String.format("publishing entity-property-changes to %d subscriber(s)", enabledSubscribers.size())
-                : "not publishing entity-property-changes";
+        val cannotPublishReason = cannotPublishReasonSupplier.get();
+        val canPublish = cannotPublishReason==null;
+        val enteringLabel = canPublish
+                ? String.format("publishing entity-property-changes to %d subscriber(s):\n%s", 
+                        enabledSubscribers.size(),
+                        payload)
+                : String.format("not publishing entity-property-changes:\n%s", cannotPublishReason);
         
         val handleIfAny = XrayUtil.createSequenceHandle(iaTracker, "epc-publisher");
         handleIfAny.ifPresent(handle->{
@@ -164,6 +199,11 @@ final class _Xray {
                 
                 sequenceData.alias("epc-publisher", "EntityProperty-\nChanges-Publisher-\n(Default)");
                 
+                if(!canPublish) {
+                    sequenceData.setConnectionArrowColor(Color.GRAY);
+                    sequenceData.setConnectionLabelColor(Color.GRAY);
+                }
+                
                 val callee = handle.getCallees().getFirstOrFail();
                 sequenceData.enter(handle.getCaller(), callee, enteringLabel);
                 sequenceData.activate(callee);
@@ -187,6 +227,9 @@ final class _Xray {
             val callee = handle.getCallees().getFirstOrFail();
             sequenceData.exit(callee, handle.getCaller());
             sequenceData.deactivate(callee);
+            
+            sequenceData.setConnectionArrowColor(null);
+            sequenceData.setConnectionLabelColor(null);
         });
         
     }
diff --git a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/JdoExecutionPublishingTest.java b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/JdoExecutionPublishingTest.java
index 5bb1a17..7c53276 100644
--- a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/JdoExecutionPublishingTest.java
+++ b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/JdoExecutionPublishingTest.java
@@ -36,6 +36,7 @@ import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.PropertyEdit;
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal.debug.xray.XrayEnable;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.testdomain.applayer.ApplicationLayerTestFactory;
@@ -53,7 +54,8 @@ import lombok.val;
         classes = {
                 Configuration_usingJdo.class,
                 Configuration_usingExecutionPublishing.class,
-                ApplicationLayerTestFactory.class
+                ApplicationLayerTestFactory.class,
+                XrayEnable.class
         },
         properties = {
                 "logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisTransactionJdo=DEBUG",