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 2022/09/17 18:30:23 UTC

[isis] branch master updated: ISIS-3215: debugging: integrate param negotiation events with Xray

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 8a4c1e6bb5 ISIS-3215: debugging: integrate param negotiation events with Xray
8a4c1e6bb5 is described below

commit 8a4c1e6bb582966e2c193c3f5fb5291cb16419ff
Author: andi-huber <ah...@apache.org>
AuthorDate: Sat Sep 17 20:30:13 2022 +0200

    ISIS-3215: debugging: integrate param negotiation events with Xray
---
 .../isis/commons/internal/debug/_IconResource.java |   3 +-
 .../isis/commons/internal/debug/_XrayEvent.java    |   7 ++
 commons/src/main/resources/xray/user.png           | Bin 0 -> 333 bytes
 .../isis/core/metamodel/object/MmDebugUtil.java    |  75 +++++++++++++++++++
 .../components/actions/ActionParametersForm.java   |  82 ++++++++++++---------
 .../viewer/wicket/ui/components/actions/_Xray.java |  63 ++++++++++++++++
 .../ui/components/scalars/ScalarPanelAbstract.java |  16 +++-
 .../viewer/wicket/ui/components/scalars/_Util.java |  13 ++++
 .../viewer/wicket/ui/components/scalars/_Xray.java |  46 ++++++++++++
 .../widgets/linkandlabel/ActionLink.java           |   4 -
 10 files changed, 265 insertions(+), 44 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/debug/_IconResource.java b/commons/src/main/java/org/apache/isis/commons/internal/debug/_IconResource.java
index 0c6eeefcb5..c86489b75f 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/debug/_IconResource.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/debug/_IconResource.java
@@ -28,7 +28,8 @@ enum _IconResource {
     INTERACTION_OPEN    ("/xray/ia-open.png"),
     INTERACTION_CLOSE   ("/xray/ia-close.png"),
     LOG                 ("/xray/log.png"),
-    TRANSACTION         ("/xray/tx.png");
+    TRANSACTION         ("/xray/tx.png"),
+    USER                ("/xray/user.png");
 
     private final String resourcePath;
 
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/debug/_XrayEvent.java b/commons/src/main/java/org/apache/isis/commons/internal/debug/_XrayEvent.java
index 6e0bedfc89..d5d116dbc0 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/debug/_XrayEvent.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/debug/_XrayEvent.java
@@ -74,6 +74,13 @@ public class _XrayEvent {
         record(1, _IconResource.TRANSACTION, format, args);
     }
 
+    /**
+     * User originating event.
+     */
+    public void user(final String format, final Object...args) {
+        record(1, _IconResource.USER, format, args);
+    }
+
     // -- HELPER
 
     /**
diff --git a/commons/src/main/resources/xray/user.png b/commons/src/main/resources/xray/user.png
new file mode 100644
index 0000000000..6872e3f5c0
Binary files /dev/null and b/commons/src/main/resources/xray/user.png differ
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmDebugUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmDebugUtil.java
new file mode 100644
index 0000000000..2e7ff58b84
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmDebugUtil.java
@@ -0,0 +1,75 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.object;
+
+import java.util.stream.Collectors;
+
+import org.apache.isis.commons.collections.Can;
+import org.apache.isis.core.metamodel.interactions.managed.ManagedParameter;
+import org.apache.isis.core.metamodel.interactions.managed.ParameterNegotiationModel;
+
+import lombok.Builder;
+import lombok.Value;
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public final class MmDebugUtil {
+
+    @Value @Builder
+    public static class ParamUpdateData {
+        final String action;
+        final int index;
+        final String name;
+        final ManagedObject pendingValue;
+        final Can<? extends ManagedParameter> allParams;
+        public String formatted() {
+            return String.format("%s[%d](%s->%s)\n%s",
+                    action, index, name, formatted(pendingValue),
+                    allParams.stream().map(this::formatted)
+                    .collect(Collectors.joining("\n")));
+        }
+        String formatted(final ManagedParameter managedParam) {
+            return String.format("- param[%d] %s->%s",
+                    managedParam.getParamNr(),
+                    managedParam.getFriendlyName(),
+                    formatted(managedParam.getValue().getValue()));
+        }
+        String formatted(final ManagedObject managedObject) {
+            return String.format("(%s, cls=%s, pojo=%s)",
+                    managedObject.getSpecialization().name(),
+                    managedObject.getCorrespondingClass().getName(),
+                    ""+managedObject.getPojo());
+        }
+    }
+
+    public static ParamUpdateData paramUpdateDataFor(
+            final int parameterIndex,
+            final ParameterNegotiationModel parameterNegotiationModel) {
+        val param = parameterNegotiationModel.getParamModels().getElseFail(parameterIndex);
+        return ParamUpdateData.builder()
+                .action(parameterNegotiationModel.getHead().getMetaModel().getId())
+                .name(param.getFriendlyName())
+                .pendingValue(param.getValue().getValue())
+                .allParams(parameterNegotiationModel.getParamModels())
+                .build();
+    }
+
+
+}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
index 266f45b284..371f01e31a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
@@ -29,8 +29,7 @@ import org.apache.wicket.markup.repeater.RepeatingView;
 
 import org.apache.isis.commons.functional.Either;
 import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.commons.internal.debug._Debug;
-import org.apache.isis.commons.internal.debug.xray.XrayUi;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.viewer.commons.model.components.UiComponentType;
 import org.apache.isis.viewer.commons.model.decorators.ConfirmDecorator.ConfirmDecorationModel;
@@ -41,13 +40,13 @@ import org.apache.isis.viewer.wicket.model.models.ScalarParameterModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarPropertyModel;
 import org.apache.isis.viewer.wicket.model.models.interaction.act.UiParameterWkt;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract.Repaint;
 import org.apache.isis.viewer.wicket.ui.panels.PromptFormAbstract;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 import org.apache.isis.viewer.wicket.ui.util.WktDecorators;
 
-import lombok.val;
-
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
+import lombok.val;
 
 class ActionParametersForm
 extends PromptFormAbstract<ActionModel> {
@@ -131,45 +130,58 @@ extends PromptFormAbstract<ActionModel> {
     @Override
     public void onUpdate(final AjaxRequestTarget target, final ScalarPanelAbstract scalarPanelUpdated) {
 
-        _Debug.onCondition(XrayUi.isXrayEnabled(), ()->{
-            _Debug.log("about to update Param Form ..");
-        });
-
         val actionModel = actionModel();
-
         val updatedParamModel = (UiParameter)scalarPanelUpdated.getModel();
+        val paramNegotiationModel = updatedParamModel.getParameterNegotiationModel();
+
         final int paramNumberUpdated = updatedParamModel.getParameterIndex();
+        _Xray.beforeParamFormUpdate(paramNumberUpdated, paramNegotiationModel);
+
         // only updates subsequent parameter panels starting from (paramNumberUpdated + 1)
         final int skipCount = paramNumberUpdated + 1;
 
-        actionModel.streamPendingParamUiModels()
-        .skip(skipCount)
-        .forEach(paramModel->{
-
-            val paramIndex = paramModel.getParameterIndex();
-            val pendingArgs = paramModel.getParameterNegotiationModel();
-
-            val actionParameter = paramModel.getMetaModel();
-            actionParameter.reassessDefault(pendingArgs);
-
-            val paramPanel = paramPanels.get(paramIndex);
-            val repaint = paramPanel.updateIfNecessary(paramModel, Optional.of(target));
-
-            switch (repaint) {
-            case ENTIRE_FORM:
-                target.add(this);
-                break;
-            case PARAM_ONLY:
+        val paramCount = updatedParamModel.getMetaModel().getAction().getParameterCount();
+        val maxCapacity = paramCount - skipCount; // just an optimization, not strictly required
+        val paramOnlyUpdateRequestsHavingParamIndex = _Lists.<Integer>newArrayList(maxCapacity);
+
+        val formRepaint = actionModel.streamPendingParamUiModels()
+            .skip(skipCount)
+            .map(paramModel->{
+
+                val paramIndex = paramModel.getParameterIndex();
+                val pendingArgs = paramModel.getParameterNegotiationModel();
+
+                val actionParameter = paramModel.getMetaModel();
+                actionParameter.reassessDefault(pendingArgs);
+                _Xray.reassessedDefault(paramIndex, paramNegotiationModel);
+
+                val paramPanel = paramPanels.get(paramIndex);
+                val paramRepaint = paramPanel.updateIfNecessary(paramModel, Optional.of(target));
+                if(paramRepaint.isParamOnly()) {
+                    paramOnlyUpdateRequestsHavingParamIndex.add(paramIndex);
+                }
+
+                return paramRepaint;
+            })
+            .reduce(Repaint.NOTHING, (a, b)->a.ordinal()>b.ordinal() ? a : b);
+
+        switch (formRepaint) {
+        case ENTIRE_FORM:
+            target.add(this);
+            break;
+        case PARAM_ONLY:
+            paramOnlyUpdateRequestsHavingParamIndex.forEach(paramIndex->{
+                val paramPanel = paramPanels.get(paramIndex);
                 paramPanel.repaint(target);
-                break;
-            case NOTHING:
-                break;
-            default:
-                throw _Exceptions.unmatchedCase(repaint);
-            }
-
-        });
+            });
+            break;
+        case NOTHING:
+            break;
+        default:
+            throw _Exceptions.unmatchedCase(formRepaint);
+        }
 
+        _Xray.afterParamFormUpdate(paramNumberUpdated, paramNegotiationModel);
 
         // previously this method was also doing:
         // target.add(this);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/_Xray.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/_Xray.java
new file mode 100644
index 0000000000..b55e82adc4
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/_Xray.java
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.components.actions;
+
+import org.apache.isis.commons.internal.debug._XrayEvent;
+import org.apache.isis.commons.internal.debug.xray.XrayUi;
+import org.apache.isis.core.metamodel.interactions.managed.ParameterNegotiationModel;
+import org.apache.isis.core.metamodel.object.MmDebugUtil;
+
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+final class _Xray {
+
+    void beforeParamFormUpdate(
+            final int paramIndex,
+            final ParameterNegotiationModel paramNegotiationModel) {
+        if(!XrayUi.isXrayEnabled()) return;
+
+        val data = MmDebugUtil
+                .paramUpdateDataFor(paramIndex, paramNegotiationModel);
+        _XrayEvent.event("Param Form about to update: %s", data.formatted());
+    }
+
+    void reassessedDefault(
+            final int paramIndex,
+            final ParameterNegotiationModel paramNegotiationModel) {
+        if(!XrayUi.isXrayEnabled()) return;
+
+        val data = MmDebugUtil
+                .paramUpdateDataFor(paramIndex, paramNegotiationModel);
+        _XrayEvent.event("Param Form param default reassessed: %s", data.formatted());
+    }
+
+    void afterParamFormUpdate(
+            final int paramIndex,
+            final ParameterNegotiationModel paramNegotiationModel) {
+        if(!XrayUi.isXrayEnabled()) return;
+
+        val data = MmDebugUtil
+                .paramUpdateDataFor(paramIndex, paramNegotiationModel);
+        _XrayEvent.event("Param Form updated: %s", data.formatted());
+    }
+
+}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index cc39c75794..a4946f06db 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -65,13 +65,12 @@ import org.apache.isis.viewer.wicket.ui.util.WktComponents;
 import org.apache.isis.viewer.wicket.ui.util.WktDecorators;
 import org.apache.isis.viewer.wicket.ui.util.WktTooltips;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.val;
 
-import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
-
 public abstract class ScalarPanelAbstract
 extends PanelAbstract<ManagedObject, ScalarModel>
 implements ScalarModelSubscriber {
@@ -95,10 +94,15 @@ implements ScalarModelSubscriber {
         NO_OUTPUT_ESCAPE
     }
 
+    /**
+     * Order matters: ascending order of precedence, eg. when used in reductions.
+     */
     public enum Repaint {
-        ENTIRE_FORM,
+        NOTHING,
         PARAM_ONLY,
-        NOTHING
+        ENTIRE_FORM,;
+        public boolean isParamOnly() { return this == PARAM_ONLY; }
+        public boolean isEntireForm() { return this == ENTIRE_FORM; }
     }
 
     public enum RenderScenario {
@@ -460,6 +464,10 @@ implements ScalarModelSubscriber {
                     + "originating from User either having changed a Property value during inline editing "
                     + "or having changed a Parameter value within an open ActionPrompt.");
 
+            _Xray.onUserParamOrPropertyEdit(scalarPanel);
+
+            System.err.printf("scalarPanel object: %s%n", scalarPanel.scalarModel().getObject());
+
             for (ScalarModelSubscriber subscriber : scalarPanel.subscribers) {
                 subscriber.onUpdate(target, scalarPanel);
             }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java
index e91a978662..034ed03846 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
+import java.util.Collection;
 import java.util.Optional;
 
 import org.apache.wicket.validation.IValidatable;
@@ -131,6 +132,18 @@ class _Util {
             final Object valueObject,
             final ScalarModel scalarModel){
 
+        if(valueObject instanceof Collection) {
+            val unpackedValues = ((Collection<?>)valueObject).stream()
+            .map(v->scalarModel
+            .getObjectManager().demementify((ObjectMemento)v))
+            .collect(Can.toCan());
+            return Optional.of(ManagedObject.packed(scalarModel.getScalarTypeSpec(), unpackedValues));
+        }
+
+//        if(scalarModel.isPlural()) {
+//            _Assert.assertTrue(valueObject instanceof ObjectMemento, ()->"unexpected code path???");
+//        }
+
         if(valueObject instanceof ObjectMemento) {
             // seeing this code-path particularly with enum choices
             return Optional.ofNullable(
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Xray.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Xray.java
new file mode 100644
index 0000000000..5f4625e506
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Xray.java
@@ -0,0 +1,46 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.components.scalars;
+
+import org.apache.isis.commons.internal.debug._XrayEvent;
+import org.apache.isis.commons.internal.debug.xray.XrayUi;
+import org.apache.isis.core.metamodel.object.MmDebugUtil;
+
+import lombok.val;
+
+class _Xray {
+
+    static void onUserParamOrPropertyEdit(final ScalarPanelAbstract scalarPanel) {
+        if(!XrayUi.isXrayEnabled()) {
+            return;
+        }
+
+        scalarPanel.scalarModel().getSpecialization()
+        .accept(
+            param->{
+                val data = MmDebugUtil
+                        .paramUpdateDataFor(param.getParameterIndex(), param.getParameterNegotiationModel());
+                _XrayEvent.user("User action param update %s", data.formatted());
+            },
+            prop->{
+                _XrayEvent.user("User property update: %s", prop.getObject());
+            });
+    }
+
+}
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 6e94b3785f..bef9001236 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
@@ -156,10 +156,6 @@ extends IndicatingAjaxLink<ManagedObject> {
                 : null;
     }
 
-//    protected Wicket getSettings() {
-//        return ((WicketViewerSettingsAccessor) Application.get()).getSettings();
-//    }
-
     @Override
     public void onClick(final AjaxRequestTarget target) {