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) {