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/21 08:55:48 UTC

[isis] branch master updated: ISIS-3215: refactoring, separate concerns: behavior vs on change dispatching

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 9505070d51 ISIS-3215: refactoring, separate concerns: behavior vs on change dispatching
9505070d51 is described below

commit 9505070d5183c88459e8182a988e7c03bac7bdb1
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 21 10:55:42 2022 +0200

    ISIS-3215: refactoring, separate concerns: behavior vs on change
    dispatching
---
 .../scalars/ScalarModelChangeDispatcher.java       |  6 +-
 ....java => ScalarModelDefaultChangeBehavior.java} | 30 +++++-----
 .../ui/components/scalars/ScalarPanelAbstract.java | 69 ++++++++--------------
 .../scalars/ScalarPanelSelectAbstract.java         |  5 +-
 .../viewer/wicket/ui/components/scalars/_Xray.java | 15 +++++
 .../scalars/reference/ReferencePanel.java          | 28 +--------
 .../valuechoices/ValueChoicesSelect2Panel.java     |  2 +-
 7 files changed, 63 insertions(+), 92 deletions(-)

diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelChangeDispatcher.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelChangeDispatcher.java
index e3d2b39dac..b23d9f7f90 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelChangeDispatcher.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelChangeDispatcher.java
@@ -25,17 +25,17 @@ import lombok.val;
 
 public interface ScalarModelChangeDispatcher {
 
-    @NonNull Iterable<ScalarModelChangeListener> getOnChangeListeners();
+    @NonNull Iterable<ScalarModelChangeListener> getChangeListeners();
     @NonNull ScalarPanelAbstract getScalarPanel();
 
     default void notifyUpdate(final AjaxRequestTarget target) {
-        for (val listener : getOnChangeListeners()) {
+        for (val listener : getChangeListeners()) {
             listener.onUpdate(target, getScalarPanel());
         }
     }
 
     default void notifyError(final AjaxRequestTarget target) {
-        for (val listener : getOnChangeListeners()) {
+        for (val listener : getChangeListeners()) {
             listener.onError(target, getScalarPanel());
         }
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelChangeDispatcher.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelDefaultChangeBehavior.java
similarity index 55%
copy from viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelChangeDispatcher.java
copy to viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelDefaultChangeBehavior.java
index e3d2b39dac..3f8b4f6d0a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelChangeDispatcher.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelDefaultChangeBehavior.java
@@ -19,25 +19,27 @@
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 
-import lombok.NonNull;
-import lombok.val;
+class ScalarModelDefaultChangeBehavior extends AjaxFormComponentUpdatingBehavior {
+    private static final long serialVersionUID = 1L;
 
-public interface ScalarModelChangeDispatcher {
+    private final ScalarPanelAbstract scalarPanel;
 
-    @NonNull Iterable<ScalarModelChangeListener> getOnChangeListeners();
-    @NonNull ScalarPanelAbstract getScalarPanel();
+    ScalarModelDefaultChangeBehavior(final ScalarPanelAbstract scalarPanel) {
+        super("change");
+        this.scalarPanel = scalarPanel;
+    }
 
-    default void notifyUpdate(final AjaxRequestTarget target) {
-        for (val listener : getOnChangeListeners()) {
-            listener.onUpdate(target, getScalarPanel());
-        }
+    @Override
+    protected void onUpdate(final AjaxRequestTarget target) {
+        scalarPanel.getScalarModelChangeDispatcher().notifyUpdate(target);
     }
 
-    default void notifyError(final AjaxRequestTarget target) {
-        for (val listener : getOnChangeListeners()) {
-            listener.onError(target, getScalarPanel());
-        }
+    @Override
+    protected void onError(final AjaxRequestTarget target, final RuntimeException e) {
+        super.onError(target, e);
+        scalarPanel.getScalarModelChangeDispatcher().notifyError(target);
     }
 
-}
+}
\ No newline at end of file
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 566f5c8293..50dfe36d8e 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
@@ -18,22 +18,21 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
+import java.io.Serializable;
+import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Supplier;
-import java.util.stream.Collectors;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.feedback.ComponentFeedbackMessageFilter;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.IModel;
 import org.springframework.lang.Nullable;
 
@@ -44,7 +43,6 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.debug._Probe.EntryPoint;
-import org.apache.isis.commons.internal.debug._XrayEvent;
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.core.metamodel.object.ManagedObject;
@@ -55,7 +53,6 @@ import org.apache.isis.viewer.commons.model.decorators.FormLabelDecorator.FormLa
 import org.apache.isis.viewer.commons.model.scalar.UiParameter;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.util.PageParameterUtils;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.FrameFragment;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.RegularFrame;
@@ -73,6 +70,7 @@ import org.apache.isis.viewer.wicket.ui.util.WktTooltips;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
@@ -309,7 +307,7 @@ implements ScalarModelChangeListener {
         addCssFromMetaModel();
 
         addChangeListener(this);
-        installScalarModelUpdateDispatcher();
+        installScalarModelChangeBehavior();
     }
 
     protected abstract void setupInlinePrompt();
@@ -449,69 +447,46 @@ implements ScalarModelChangeListener {
         super.onConfigure();
     }
 
-
     // //////////////////////////////////////
 
-    protected void installScalarModelUpdateDispatcher() {
-        addOrReplaceBehavoir(ScalarUpdatingBehavior.class, ()->new ScalarUpdatingBehavior(this));
+    protected void installScalarModelChangeBehavior() {
+        addOrReplaceBehavoir(ScalarModelDefaultChangeBehavior.class, ()->new ScalarModelDefaultChangeBehavior(this));
     }
 
-    static class ScalarUpdatingBehavior extends AjaxFormComponentUpdatingBehavior
-    implements ScalarModelChangeDispatcher {
+    @RequiredArgsConstructor
+    static class ScalarModelChangeDispatcherImpl
+    implements ScalarModelChangeDispatcher, Serializable {
         private static final long serialVersionUID = 1L;
+        private final List<ScalarModelChangeListener> changeListeners = _Lists.newArrayList();
 
         @Getter(onMethod_={@Override})
         private final ScalarPanelAbstract scalarPanel;
 
         @Override
-        public @NonNull Iterable<ScalarModelChangeListener> getOnChangeListeners() {
-            return scalarPanel.onChangeListeners;
-        }
-
-        private ScalarUpdatingBehavior(final ScalarPanelAbstract scalarPanel) {
-            super("change");
-            this.scalarPanel = scalarPanel;
-        }
-
-        @Override
-        protected Form.MethodMismatchResponse onMethodMismatch() {
-            onBeforeRequest(); // onRequest method in super is final, hooking into onMethodMismatch is trick
-            return super.onMethodMismatch();
-        }
-
-        private void onBeforeRequest() {
-            val requestArgs = PageParameterUtils.streamCurrentRequestParameters()
-                    .map(pair->String.format("%s->%s", pair.getKey(), pair.getValue()))
-                    .collect(Collectors.joining(", "));
-
-            _XrayEvent.event("onRequest %s%n", requestArgs);
-        }
-
-        @Override
-        protected void onUpdate(final AjaxRequestTarget target) {
-
+        public void notifyUpdate(final AjaxRequestTarget target) {
             _Probe.entryPoint(EntryPoint.USER_INTERACTION, "Wicket Ajax Request, "
                     + "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);
-
-            notifyUpdate(target);
+            ScalarModelChangeDispatcher.super.notifyUpdate(target);
         }
 
         @Override
-        protected void onError(final AjaxRequestTarget target, final RuntimeException e) {
-            super.onError(target, e);
-            notifyError(target);
+        public @NonNull Iterable<ScalarModelChangeListener> getChangeListeners() {
+            return Collections.unmodifiableCollection(changeListeners);
         }
 
+        public void addChangeListener(final ScalarModelChangeListener listener) {
+            changeListeners.add(listener);
+        }
     }
 
     @Getter
-    private final List<ScalarModelChangeListener> onChangeListeners = _Lists.newArrayList();
+    private final ScalarModelChangeDispatcher scalarModelChangeDispatcher =
+            new ScalarModelChangeDispatcherImpl(this);
 
-    public void addChangeListener(final ScalarModelChangeListener subscriber) {
-        onChangeListeners.add(subscriber);
+    public void addChangeListener(final ScalarModelChangeListener listener) {
+        ((ScalarModelChangeDispatcherImpl)getScalarModelChangeDispatcher()).addChangeListener(listener);
     }
 
     protected final <T extends Behavior> void addOrReplaceBehavoir(
@@ -688,4 +663,6 @@ implements ScalarModelChangeListener {
                : Repaint.NOTHING;
    }
 
+
+
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
index e25bfc2f95..398bbe88d6 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
@@ -61,12 +61,11 @@ extends ScalarPanelFormFieldAbstract<ManagedObject> {
 
     protected final Select2 createSelect2(
             final String id,
-            final Function<ScalarModel, ChoiceProviderAbstract> choiceProviderFactory,
-            final ScalarModelChangeDispatcher select2ChangeDispatcher) {
+            final Function<ScalarModel, ChoiceProviderAbstract> choiceProviderFactory) {
         val scalarModel = scalarModel();
         val select2 = Select2.createSelect2(id, scalarModel,
                 choiceProviderFactory.apply(scalarModel),
-                select2ChangeDispatcher);
+                getScalarModelChangeDispatcher());
         val settings = select2.getSettings();
         switch(scalarModel.getChoiceProviderSort()) {
         case CHOICES:
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
index 5f4625e506..c7961f5b38 100644
--- 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
@@ -18,9 +18,12 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
+import java.util.stream.Collectors;
+
 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 org.apache.isis.viewer.wicket.model.util.PageParameterUtils;
 
 import lombok.val;
 
@@ -43,4 +46,16 @@ class _Xray {
             });
     }
 
+    public static void debugRequestParams() {
+        if(!XrayUi.isXrayEnabled()) {
+            return;
+        }
+
+        val requestArgs = PageParameterUtils.streamCurrentRequestParameters()
+                .map(pair->String.format("%s->%s", pair.getKey(), pair.getValue()))
+                .collect(Collectors.joining(",\n"));
+
+        _XrayEvent.event("Form Component Change Event %s%n", requestArgs);
+    }
+
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 5ee2fbc9e5..8879ee0c70 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
 
-import java.io.Serializable;
 import java.util.Optional;
 
 import org.apache.wicket.Application;
@@ -37,8 +36,6 @@ import org.apache.isis.viewer.commons.model.components.UiComponentType;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.CompactFragment;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.FieldFrame;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelChangeDispatcher;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelChangeListener;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelectAbstract;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelectAbstract.ChoiceTitleHandler;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
@@ -46,8 +43,6 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.Cho
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 import org.apache.isis.viewer.wicket.ui.util.WktComponents;
 
-import lombok.Getter;
-import lombok.NonNull;
 import lombok.val;
 
 /**
@@ -94,7 +89,7 @@ implements ChoiceTitleHandler {
         entityLink.setRequired(scalarModel.isRequired());
 
         this.select2 = createSelect2(ID_AUTO_COMPLETE,
-                ChoiceProviderForReferences::new, new Select2ChangeDispatcher(this));
+                ChoiceProviderForReferences::new);
 
         entityLink.addOrReplace(select2.asComponent());
         entityLink.setOutputMarkupId(true);
@@ -105,25 +100,8 @@ implements ChoiceTitleHandler {
     // -- CUSTOM UPDATING BEHAVIOR
 
     @Override
-    protected void installScalarModelUpdateDispatcher() {
-        // no-op
-    }
-
-    static class Select2ChangeDispatcher
-    implements ScalarModelChangeDispatcher, Serializable {
-        private static final long serialVersionUID = 1L;
-
-        @Getter(onMethod_={@Override})
-        private final ReferencePanel scalarPanel;
-
-        private Select2ChangeDispatcher(final ReferencePanel scalarPanel) {
-            this.scalarPanel = scalarPanel;
-        }
-
-        @Override
-        public @NonNull Iterable<ScalarModelChangeListener> getOnChangeListeners() {
-            return scalarPanel.getOnChangeListeners();
-        }
+    protected void installScalarModelChangeBehavior() {
+        // no-op, as we already have the Select2OnSelect behavior (directly) installed with the Select2 form component
     }
 
     // -- ON BEFORE RENDER
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index 80837d320f..9a83fbe88e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -57,7 +57,7 @@ implements ChoiceTitleHandler {
     protected FormComponent<ManagedObject> createFormComponent(
             final String id, final ScalarModel scalarModel) {
         if(select2 == null) {
-            this.select2 = createSelect2(id, ChoiceProviderForValues::new, null);
+            this.select2 = createSelect2(id, ChoiceProviderForValues::new);
         } else {
             select2.clearInput();
         }