You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2025/01/09 05:10:22 UTC

(causeway) 02/04: CAUSEWAY-3843: simplifies action param default calculation

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit 59b7b78437857dcfbd1856f5ae17434e9342d3cf
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Jan 8 08:51:23 2025 +0100

    CAUSEWAY-3843: simplifies action param default calculation
---
 .../managed/ActionInteractionHead.java             | 75 ++++------------------
 .../managed/ParameterNegotiationModel.java         |  7 ++
 2 files changed, 21 insertions(+), 61 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteractionHead.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteractionHead.java
index 481a897eba0..25a2809a0ba 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteractionHead.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteractionHead.java
@@ -19,12 +19,10 @@
 package org.apache.causeway.core.metamodel.interactions.managed;
 
 import java.util.List;
-import java.util.function.UnaryOperator;
 
 import org.springframework.lang.Nullable;
 
 import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.functional.Either;
 import org.apache.causeway.commons.internal.assertions._Assert;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
@@ -77,9 +75,9 @@ implements HasMetaModel<ObjectAction> {
      */
     public Can<ManagedObject> getEmptyParameterValues() {
         return getMetaModel().getParameters().stream()
-        .map(objectActionParameter->
-            ManagedObject.empty(objectActionParameter.getElementType()))
-        .collect(Can.toCan());
+            .map(objectActionParameter->
+                ManagedObject.empty(objectActionParameter.getElementType()))
+            .collect(Can.toCan());
     }
 
     /**
@@ -90,15 +88,12 @@ implements HasMetaModel<ObjectAction> {
      * @param pojoArgList - argument pojos
      */
     public Can<ManagedObject> getPopulatedParameterValues(@Nullable final List<Object> pojoArgList) {
-
         var params = getMetaModel().getParameters();
 
         _Assert.assertEquals(params.size(), _NullSafe.size(pojoArgList));
 
-        if(params.isEmpty()) {
-            return Can.empty();
-        }
-
+        if(params.isEmpty()) return Can.empty();
+        
         return params.zipMap(pojoArgList, (objectActionParameter, argPojo)->
             ManagedObject.adaptParameter(objectActionParameter, argPojo));
     }
@@ -115,59 +110,17 @@ implements HasMetaModel<ObjectAction> {
      */
     public ParameterNegotiationModel defaults(final ManagedAction managedAction) {
 
-        // first pass ... empty values
-        // second pass ... proposed default values
-        // third pass ... verify we have found a fixed point
-        final int maxIterations = 3;
-
-        var fixedPoint = fixedPointSearch(
-                getEmptyParameterValues(),
-                // vector of packed values - where each is either scalar or non-scalar
-                paramVector->iterate(managedAction, paramVector),
-                maxIterations);
-
-        if(fixedPoint.isRight()) {
-            log.warn("Cannot find an initial fixed point for action "
-                    + "parameter defaults on action {}.", getMetaModel());
-        }
-
-        return ParameterNegotiationModel.of(managedAction,
-                fixedPoint.fold(
-                left->left,
-                right->right));
-    }
-
-    // -- HELPER
-
-    /**
-     * (defaults) fixed point search iteration step
-     */
-    private Can<ManagedObject> iterate(
-            final @NonNull ManagedAction managedAction,
-            final @NonNull Can<ManagedObject> paramVector) {
-        var pendingParamModel = ParameterNegotiationModel.of(managedAction, paramVector);
-        return getMetaModel().getParameters()
-            .map(param->param.getDefault(pendingParamModel));
-    }
+        // init with empty values
+        var pendingParamModel = ParameterNegotiationModel.of(managedAction, getEmptyParameterValues());
 
-    /**
-     * Returns either a fixed point (left) or the last iteration (right).
-     */
-    private static <T> Either<T, T> fixedPointSearch(
-            final T start,
-            final UnaryOperator<T> f,
-            final int maxIterations) {
-
-        T t1, t0 = start;
-        for(int i=0; i<maxIterations; ++i) {
-            t1 = f.apply(t0);
-            if(t1.equals(t0)) {
-                return Either.left(t1);
-            }
-            t0 = t1;
+        // fill in the parameter defaults with a single sweep through all default providing methods in order, 
+        // updating the pendingParamModel at each iteration
+        for(var param : getMetaModel().getParameters()) {
+            pendingParamModel = pendingParamModel
+                .withParamValue(param.getParameterIndex(), param.getDefault(pendingParamModel));
         }
-
-        return Either.right(t0);
+        
+        return pendingParamModel;
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ParameterNegotiationModel.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ParameterNegotiationModel.java
index c39be78e259..a459e1c18c2 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ParameterNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ParameterNegotiationModel.java
@@ -319,6 +319,13 @@ public class ParameterNegotiationModel {
         return PendingParamsSnapshot.create(this);
     }
 
+    /**
+     * Returns a copy, but with a single param value replaced. 
+     */
+    public ParameterNegotiationModel withParamValue(int parameterIndex, @NonNull ManagedObject paramValue) {
+        return ParameterNegotiationModel.of(managedAction, getParamValues().replace(parameterIndex, paramValue));
+    }
+    
     // -- INTERNAL HOLDER OF PARAMETER BINDABLES
 
     private static class ParameterModel extends ManagedParameter {