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/12/04 06:32:17 UTC

[isis] branch master updated: ISIS-2903: Xray: associate logs with actual current thread nodes

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 24bf32b  ISIS-2903: Xray: associate logs with actual current thread nodes
24bf32b is described below

commit 24bf32bc872fefdb02e8cb0b16f564b40c0c161a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Dec 4 07:32:03 2021 +0100

    ISIS-2903: Xray: associate logs with actual current thread nodes
---
 .../org/apache/isis/commons/internal/debug/_Xray.java   |  8 ++++++--
 .../isis/commons/internal/debug/xray/XrayModel.java     | 15 +++++++++++++--
 ...creatableObjectFacetForXmlRootElementAnnotation.java |  3 ++-
 .../java/org/apache/isis/core/runtime/events/_Xray.java | 11 ++++++-----
 .../apache/isis/core/runtimeservices/session/_Xray.java |  9 +++++----
 .../org/apache/isis/core/security/util/XrayUtil.java    | 15 +++------------
 .../isis/testdomain/viewers/jdo/wkt/TestAppJpaWkt.java  |  3 ++-
 .../publishing/PublishingTestFactoryAbstract.java       |  4 ++--
 .../isis/viewer/wicket/model/models/FormExecutor.java   | 17 ++++++++++++++++-
 .../ui/components/widgets/linkandlabel/ActionLink.java  | 13 ++++++++++---
 .../viewer/wicket/ui/panels/FormExecutorDefault.java    | 13 +++++++++++++
 11 files changed, 78 insertions(+), 33 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/debug/_Xray.java b/commons/src/main/java/org/apache/isis/commons/internal/debug/_Xray.java
index 8759f87..f48930e 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/debug/_Xray.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/debug/_Xray.java
@@ -21,6 +21,7 @@ package org.apache.isis.commons.internal.debug;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.debug.xray.XrayDataModel;
+import org.apache.isis.commons.internal.debug.xray.XrayModel.ThreadMemento;
 import org.apache.isis.commons.internal.debug.xray.XrayUi;
 
 import lombok.val;
@@ -37,9 +38,12 @@ final class _Xray {
             return;
         }
 
+        val threadId = ThreadMemento.fromCurrentThread();
+
         XrayUi.updateModel(model->{
-            val root = model.getRootNode();
-            val logModel = model.addDataNode(root,
+            val parentNode = model.getThreadNode(threadId);
+
+            val logModel = model.addDataNode(parentNode,
                     new XrayDataModel.LogEntry(
                             "debug-log",
                             _Strings.ellipsifyAtEnd(logMessage, 80, "..."),
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/debug/xray/XrayModel.java b/commons/src/main/java/org/apache/isis/commons/internal/debug/xray/XrayModel.java
index 3477bcd..89810f5 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/debug/xray/XrayModel.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/debug/xray/XrayModel.java
@@ -22,13 +22,15 @@ import java.util.Optional;
 import java.util.Stack;
 import java.util.UUID;
 
-import org.springframework.lang.Nullable;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.MutableTreeNode;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.isis.commons.internal.base._Strings;
 
 import lombok.Value;
+import lombok.val;
 
 public interface XrayModel {
 
@@ -42,7 +44,7 @@ public interface XrayModel {
     }
 
     MutableTreeNode addContainerNode(MutableTreeNode parent, String name, String id);
-    default MutableTreeNode addContainerNode(MutableTreeNode parent, String name) {
+    default MutableTreeNode addContainerNode(final MutableTreeNode parent, final String name) {
         return addContainerNode(parent, name, UUID.randomUUID().toString());
     }
 
@@ -86,6 +88,15 @@ public interface XrayModel {
         private final String id;
         private final String label;
         private final String multilinelabel;
+
+        public static ThreadMemento fromCurrentThread() {
+            val ct = Thread.currentThread();
+            return ThreadMemento.of(
+                    String.format("thread-%d-%s", ct.getId(), ct.getName()),
+                    String.format("Thread-%d [%s]", ct.getId(), ct.getName()),
+                    String.format("Thread-%d\n%s", ct.getId(), ct.getName()));
+        }
+
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java
index 1d2d468..75a7e42 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java
@@ -23,6 +23,7 @@ import java.util.UUID;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.urlencoding.UrlEncodingService;
 import org.apache.isis.commons.internal.debug._Debug;
+import org.apache.isis.commons.internal.debug.xray.XrayUi;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 
@@ -50,7 +51,7 @@ extends RecreatableObjectFacetAbstract {
         final String xml = getJaxbService().toXml(vmPojo);
         final String encoded = getUrlEncodingService().encodeString(xml);
         //FIXME[ISIS-2903] gets called about 4 times per same object, why?
-        _Debug.onCondition(true, ()->{
+        _Debug.onCondition(XrayUi.isXrayEnabled(), ()->{
             _Debug.log(100, "%s => %s",
                     super.getMetaModelContext().getInteractionProvider().getInteractionId()
                     .map(UUID::toString)
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/events/_Xray.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/events/_Xray.java
index be0ca98..35e6b0e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/events/_Xray.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/events/_Xray.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.runtime.events;
 import org.apache.isis.applib.services.confview.ConfigurationViewService;
 import org.apache.isis.applib.services.iactnlayer.InteractionLayerTracker;
 import org.apache.isis.commons.internal.debug.xray.XrayDataModel;
+import org.apache.isis.commons.internal.debug.xray.XrayModel.ThreadMemento;
 import org.apache.isis.commons.internal.debug.xray.XrayUi;
 import org.apache.isis.core.security.util.XrayUtil;
 
@@ -28,7 +29,7 @@ import lombok.val;
 
 final class _Xray {
 
-    static void addConfiguration(ConfigurationViewService configurationService) {
+    static void addConfiguration(final ConfigurationViewService configurationService) {
 
         XrayUi.updateModel(model->{
 
@@ -48,14 +49,14 @@ final class _Xray {
 
     }
 
-    public static void txBeforeCompletion(InteractionLayerTracker iaTracker, String txInfo) {
+    public static void txBeforeCompletion(final InteractionLayerTracker iaTracker, final String txInfo) {
         // append to the current interaction if any
 
         if(!XrayUi.isXrayEnabled()) {
             return;
         }
 
-        val threadId = XrayUtil.currentThreadAsMemento();
+        val threadId = ThreadMemento.fromCurrentThread();
 
         val sequenceId = XrayUtil.currentSequenceId(iaTracker)
         .orElse(null);
@@ -84,14 +85,14 @@ final class _Xray {
 
     }
 
-    public static void txAfterCompletion(InteractionLayerTracker iaTracker, String txInfo) {
+    public static void txAfterCompletion(final InteractionLayerTracker iaTracker, final String txInfo) {
         // append to the current interaction if any
 
         if(!XrayUi.isXrayEnabled()) {
             return;
         }
 
-        val threadId = XrayUtil.currentThreadAsMemento();
+        val threadId = ThreadMemento.fromCurrentThread();
 
         val sequenceId = XrayUtil.currentSequenceId(iaTracker)
                 .orElse(null);
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/_Xray.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/_Xray.java
index 617a401..2972f5c 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/_Xray.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/_Xray.java
@@ -20,9 +20,10 @@ package org.apache.isis.core.runtimeservices.session;
 
 import java.util.Stack;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionLayer;
 import org.apache.isis.commons.internal.debug.xray.XrayDataModel;
+import org.apache.isis.commons.internal.debug.xray.XrayModel.ThreadMemento;
 import org.apache.isis.commons.internal.debug.xray.XrayUi;
-import org.apache.isis.applib.services.iactnlayer.InteractionLayer;
 import org.apache.isis.core.security.util.XrayUtil;
 
 import lombok.val;
@@ -30,7 +31,7 @@ import lombok.val;
 //@Log4j2
 final class _Xray {
 
-    static void newInteractionLayer(Stack<InteractionLayer> afterEnter) {
+    static void newInteractionLayer(final Stack<InteractionLayer> afterEnter) {
 
         if(!XrayUi.isXrayEnabled()) {
             return;
@@ -41,7 +42,7 @@ final class _Xray {
         val interactionId = afterEnter.peek().getInteraction().getInteractionId();
         val executionContext = afterEnter.peek().getInteractionContext();
 
-        val threadId = XrayUtil.currentThreadAsMemento();
+        val threadId = ThreadMemento.fromCurrentThread();
 
         XrayUi.updateModel(model->{
 
@@ -85,7 +86,7 @@ final class _Xray {
 
     }
 
-    public static void closeInteractionLayer(Stack<InteractionLayer> beforeClose) {
+    public static void closeInteractionLayer(final Stack<InteractionLayer> beforeClose) {
 
         if(!XrayUi.isXrayEnabled()) {
             return;
diff --git a/core/security/src/main/java/org/apache/isis/core/security/util/XrayUtil.java b/core/security/src/main/java/org/apache/isis/core/security/util/XrayUtil.java
index b5b2f10..5bff5e4 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/util/XrayUtil.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/util/XrayUtil.java
@@ -24,9 +24,8 @@ import java.util.function.Consumer;
 
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.debug.xray.XrayModel.ThreadMemento;
-import org.apache.isis.commons.internal.debug.xray.graphics.SequenceDiagram;
 import org.apache.isis.commons.internal.debug.xray.XrayUi;
+import org.apache.isis.commons.internal.debug.xray.graphics.SequenceDiagram;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 
 import lombok.Builder;
@@ -49,15 +48,7 @@ public final class XrayUtil {
         return String.format("seq-%s", uuid);
     }
 
-    public static ThreadMemento currentThreadAsMemento() {
-        val ct = Thread.currentThread();
-        return ThreadMemento.of(
-                String.format("thread-%d-%s", ct.getId(), ct.getName()),
-                String.format("Thread-%d [%s]", ct.getId(), ct.getName()),
-                String.format("Thread-%d\n%s", ct.getId(), ct.getName()));
-    }
-
-    public static String nestedInteractionId(int authenticationStackSize) {
+    public static String nestedInteractionId(final int authenticationStackSize) {
         return "ia-" + (authenticationStackSize-1);
     }
 
@@ -92,7 +83,7 @@ public final class XrayUtil {
         final @NonNull String caller;
         final @NonNull Can<String> callees;
 
-        public void submit(Consumer<SequenceDiagram> onSubmission) {
+        public void submit(final Consumer<SequenceDiagram> onSubmission) {
             XrayUi.updateModel(model->{
                 model.lookupSequence(getSequenceId())
                 .ifPresent(sequence->onSubmission.accept(sequence.getData()));
diff --git a/regressiontests/stable-viewers-jpa/src/main/java/org/apache/isis/testdomain/viewers/jdo/wkt/TestAppJpaWkt.java b/regressiontests/stable-viewers-jpa/src/main/java/org/apache/isis/testdomain/viewers/jdo/wkt/TestAppJpaWkt.java
index e36714c..668dfbd 100644
--- a/regressiontests/stable-viewers-jpa/src/main/java/org/apache/isis/testdomain/viewers/jdo/wkt/TestAppJpaWkt.java
+++ b/regressiontests/stable-viewers-jpa/src/main/java/org/apache/isis/testdomain/viewers/jdo/wkt/TestAppJpaWkt.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.annotation.HomePage;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.ObjectSupport;
 import org.apache.isis.applib.services.user.UserService;
+import org.apache.isis.commons.internal.debug.xray.XrayEnable;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.testdomain.conf.Configuration_usingJpa;
 import org.apache.isis.testdomain.conf.Configuration_usingWicket;
@@ -50,7 +51,7 @@ import org.apache.isis.viewer.wicket.viewer.IsisModuleViewerWicketViewer;
     // UI (Wicket Viewer)
     IsisModuleViewerWicketViewer.class,
 
-    //XrayEnable.class // for debugging only
+    XrayEnable.class // for debugging only
 })
 public class TestAppJpaWkt extends SpringBootServletInitializer {
 
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryAbstract.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryAbstract.java
index 380b1bc..391bb37 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryAbstract.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryAbstract.java
@@ -43,8 +43,8 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.debug._Probe;
+import org.apache.isis.commons.internal.debug.xray.XrayModel.ThreadMemento;
 import org.apache.isis.commons.internal.debug.xray.XrayUi;
-import org.apache.isis.core.security.util.XrayUtil;
 import org.apache.isis.core.transaction.events.TransactionAfterCompletionEvent;
 import org.apache.isis.core.transaction.events.TransactionBeforeCompletionEvent;
 
@@ -401,7 +401,7 @@ public abstract class PublishingTestFactoryAbstract {
 
     private final void xrayAddTest(final String name) {
 
-        val threadId = XrayUtil.currentThreadAsMemento();
+        val threadId = ThreadMemento.fromCurrentThread();
 
         XrayUi.updateModel(model->{
             model.addContainerNode(
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
index b9d116c..e6fbfb4 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
@@ -32,14 +32,29 @@ import org.apache.wicket.markup.html.form.Form;
 public interface FormExecutor extends Serializable {
 
     enum FormExecutionOutcome {
+
+        /**
+         * if invalid arguments or exception
+         */
         FAILURE_SO_STAY_ON_PAGE,
+
+        /**
+         * redirect to result page or re-render all UI components
+         */
         SUCCESS_SO_REDIRECT_TO_RESULT_PAGE,
+
+        /**
+         * do not trigger a full page re-render, when executing eg. a nested dialog
+         */
         SUCCESS_IN_NESTED_CONTEXT_SO_STAY_ON_PAGE;
 
         public boolean isFailure() { return this == FAILURE_SO_STAY_ON_PAGE; }
-        public boolean isSuccess() { return this != FAILURE_SO_STAY_ON_PAGE; }
+        public boolean isSuccess() { return !isFailure(); }
         public boolean isSuccessWithRedirect() { return this == SUCCESS_SO_REDIRECT_TO_RESULT_PAGE; }
         public boolean isSuccessWithinNestedContext() { return this == SUCCESS_IN_NESTED_CONTEXT_SO_STAY_ON_PAGE; }
+
+        public boolean isRedirect() { return this == SUCCESS_SO_REDIRECT_TO_RESULT_PAGE; }
+
     }
 
     FormExecutionOutcome executeAndProcessResults(
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
index cac37f9..1f0ad4e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
@@ -28,8 +28,10 @@ import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.request.cycle.RequestCycle;
 
+import org.apache.isis.commons.internal.debug._Debug;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.debug._Probe.EntryPoint;
+import org.apache.isis.commons.internal.debug.xray.XrayUi;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
@@ -219,9 +221,6 @@ extends IndicatingAjaxLink<ManagedObject> {
         val actionModel = this.getActionModel();
         val page = this.getPage();
 
-        // returns true - if redirecting to new page, or repainting all components.
-        // returns false - if invalid args; if concurrency exception;
-
         val outcome = FormExecutorDefault
                 .forAction(actionModel)
                 .executeAndProcessResults(page, null, null, actionModel);
@@ -240,6 +239,10 @@ extends IndicatingAjaxLink<ManagedObject> {
                 }
             });
 
+            _Debug.onCondition(XrayUi.isXrayEnabled(), ()->{
+                _Debug.log(10, "nothing to do, outcome: %s", outcome);
+            });
+
             // else nothing to do
 
             //
@@ -249,6 +252,10 @@ extends IndicatingAjaxLink<ManagedObject> {
 
         } else {
 
+            _Debug.onCondition(XrayUi.isXrayEnabled(), ()->{
+                _Debug.log(10, "render the target entity again, outcome: %s", outcome);
+            });
+
             // render the target entity again
             //
             // (One way this can occur is if an event subscriber has a defect and throws an exception; in which case
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index 28d0c62..01128f4 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -32,6 +32,8 @@ import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Either;
+import org.apache.isis.commons.internal.debug._Debug;
+import org.apache.isis.commons.internal.debug.xray.XrayUi;
 import org.apache.isis.core.metamodel.spec.ManagedObjects.EntityUtil;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
@@ -103,6 +105,13 @@ implements FormExecutor {
                 return FormExecutionOutcome.FAILURE_SO_STAY_ON_PAGE; // invalid args, stay on page
             }
 
+            _Debug.onCondition(XrayUi.isXrayEnabled(), ()->{
+                _Debug.log(10, "execute %s ...", actionOrPropertyModel
+                        .fold(
+                                act->act.getFriendlyName(),
+                                prop->prop.getFriendlyName()));
+            });
+
             //
             // the following line will (attempt to) invoke the action, and will in turn either:
             //
@@ -135,6 +144,10 @@ implements FormExecutor {
                         resultAdapter);
             }
 
+            _Debug.onCondition(XrayUi.isXrayEnabled(), ()->{
+                _Debug.log(10, "process result ...");
+            });
+
             val resultResponse = actionOrPropertyModel.fold(
                     act->ActionResultResponseType
                             .determineAndInterpretResult(act, ajaxTarget, resultAdapter, act.snapshotArgs()),