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/11/17 18:01:05 UTC

[isis] branch master updated: ISIS-2896: ManagedAction: don't memoize the head, as owner might dynamically re-attach (when entity)

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 e82715e  ISIS-2896: ManagedAction: don't memoize the head, as owner might dynamically re-attach (when entity)
e82715e is described below

commit e82715ebf8089a6b93f5c62393fb353a3b4312f9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Nov 17 18:59:48 2021 +0100

    ISIS-2896: ManagedAction: don't memoize the head, as owner might
    dynamically re-attach (when entity)
---
 .../metamodel/interactions/managed/ManagedAction.java    | 15 +++++++++------
 .../interactions/managed/ParameterNegotiationModel.java  |  2 +-
 .../viewer/wicket/ui/panels/FormExecutorDefault.java     | 16 +++++++---------
 3 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedAction.java
index 91bef57..e57f4a7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedAction.java
@@ -83,7 +83,6 @@ public final class ManagedAction extends ManagedMember {
     // -- IMPLEMENTATION
 
     @Getter private final ObjectAction action;
-    @Getter private final ActionInteractionHead interactionHead;
     @Getter private final MultiselectChoices multiselectChoices;
 
     private ManagedAction(
@@ -94,16 +93,20 @@ public final class ManagedAction extends ManagedMember {
 
         super(owner, where);
         this.action = action;
-        this.interactionHead = action.interactionHead(owner);
         this.multiselectChoices = multiselectChoices;
     }
 
+    //ISIS-2897 ... don't memoize the head, as owner might dynamically re-attach (when entity)
+    ActionInteractionHead interactionHead() {
+        return action.interactionHead(getOwner());
+    }
+
     /**
      * @returns a new {@link ParameterNegotiationModel} that is associated with this managed-action;
      * parameters if any are initialized with their defaults (taking into account any supporting methods)
      */
     public ParameterNegotiationModel startParameterNegotiation() {
-        return interactionHead.defaults(this);
+        return interactionHead().defaults(this);
     }
 
     @Override
@@ -125,7 +128,7 @@ public final class ManagedAction extends ManagedMember {
         }
 
         final ManagedObject actionResult = getAction()
-                .execute(getInteractionHead(), actionParameters, InteractionInitiatedBy.USER);
+                .execute(interactionHead(), actionParameters, InteractionInitiatedBy.USER);
 
         return _Either.left(route(actionResult));
     }
@@ -140,7 +143,7 @@ public final class ManagedAction extends ManagedMember {
 
         final ManagedObject actionResult = getAction()
                 .executeWithRuleChecking(
-                        getInteractionHead(), actionParameters, InteractionInitiatedBy.USER, getWhere());
+                        interactionHead(), actionParameters, InteractionInitiatedBy.USER, getWhere());
 
         return route(actionResult);
     }
@@ -161,7 +164,7 @@ public final class ManagedAction extends ManagedMember {
         val method = ((ObjectMemberAbstract)action).getFacetedMethod().getMethod();
 
         final Object[] executionParameters = UnwrapUtil.multipleAsArray(actionParameters);
-        final Object targetPojo = UnwrapUtil.single(getInteractionHead().getTarget());
+        final Object targetPojo = UnwrapUtil.single(interactionHead().getTarget());
 
         val resultPojo = CanonicalParameterUtil
                 .invoke(method, targetPojo, executionParameters);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
index b6c9df2..7dc6d9d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
@@ -73,7 +73,7 @@ public class ParameterNegotiationModel {
             final @NonNull ManagedAction managedAction,
             final @NonNull Can<ManagedObject> initialParamValues) {
         this.managedAction = managedAction;
-        this.head = managedAction.getInteractionHead(); //TODO maybe don't memoize
+        this.head = managedAction.interactionHead(); //TODO maybe don't memoize
         this.validationFeedbackActive = _Bindables.forValue(false);
 
         val paramNrIterator = IntStream.range(0, initialParamValues.size()).iterator();
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 77ee726..28d0c62 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
@@ -91,7 +91,13 @@ implements FormExecutor {
 
         try {
 
-            final Optional<Recognition> invalidReasonIfAny = getReasonInvalidIfAny();
+            final Optional<Recognition> invalidReasonIfAny = Recognition.of(
+                    Category.CONSTRAINT_VIOLATION,
+                    actionOrPropertyModel
+                        .fold(
+                                act->act.getValidityConsent().getReason(),
+                                prop->prop.getReasonInvalidIfAny()));
+
             if (invalidReasonIfAny.isPresent()) {
                 raiseWarning(ajaxTarget, feedbackFormIfAny, invalidReasonIfAny.get());
                 return FormExecutionOutcome.FAILURE_SO_STAY_ON_PAGE; // invalid args, stay on page
@@ -189,14 +195,6 @@ implements FormExecutor {
         }
     }
 
-    private Optional<Recognition> getReasonInvalidIfAny() {
-        val reason = actionOrPropertyModel
-                .fold(
-                        act->act.getValidityConsent().getReason(),
-                        prop->prop.getReasonInvalidIfAny());
-        return Recognition.of(Category.CONSTRAINT_VIOLATION, reason);
-    }
-
     // -- DEPENDENCIES
 
     private IsisAppCommonContext getCommonContext() {