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/06/24 09:05:01 UTC

[isis] branch master updated: ISIS-3049: fixes choicesFrom semantics only ever getting applied to the first action parameter

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 c483ca71f2 ISIS-3049: fixes choicesFrom semantics only ever getting applied to the first action parameter
c483ca71f2 is described below

commit c483ca71f287734e77026c1f7aa6283677ffae4a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jun 24 11:04:52 2022 +0200

    ISIS-3049: fixes choicesFrom semantics only ever getting applied to the
    first action parameter
---
 .../managed/ActionInteractionHead.java             | 29 +++++++++++-----------
 .../param/ChoicesAndDefaultsPostProcessor.java     | 10 +++++---
 .../interact/CollectionInteractionTest.java        |  8 +++---
 3 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteractionHead.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteractionHead.java
index 4241baef6d..2e9c43bdd5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteractionHead.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteractionHead.java
@@ -121,18 +121,10 @@ implements HasMetaModel<ObjectAction> {
         // third pass ... verify we have found a fixed point
         final int maxIterations = 3;
 
-        val params = getMetaModel().getParameters();
-
         val fixedPoint = fixedPointSearch(
                 getEmptyParameterValues(),
                 // vector of packed values - where each is either scalar or non-scalar
-                paramVector->
-                    params
-                    .map(param->param
-                            .getDefault(
-                                    ParameterNegotiationModel
-                                    .of(managedAction, paramVector)))
-                ,
+                paramVector->iterate(managedAction, paramVector),
                 maxIterations);
 
         if(fixedPoint.isRight()) {
@@ -140,7 +132,7 @@ implements HasMetaModel<ObjectAction> {
                     + "parameter defaults on action {}.", getMetaModel());
         }
 
-        return modelForParamValues(managedAction,
+        return ParameterNegotiationModel.of(managedAction,
                 fixedPoint.fold(
                 left->left,
                 right->right));
@@ -148,14 +140,21 @@ implements HasMetaModel<ObjectAction> {
 
     // -- HELPER
 
-    private ParameterNegotiationModel modelForParamValues(
-            final ManagedAction managedAction,
-            @NonNull final Can<ManagedObject> paramValues) {
-        return ParameterNegotiationModel.of(managedAction, paramValues);
+    /**
+     * (defaults) fixed point search iteration step
+     */
+    private Can<ManagedObject> iterate(
+            final @NonNull ManagedAction managedAction,
+            final @NonNull Can<ManagedObject> paramVector) {
+
+        val pendingParamModel = ParameterNegotiationModel.of(managedAction, paramVector);
+
+        return getMetaModel().getParameters()
+            .map(param->param.getDefault(pendingParamModel));
     }
 
     /**
-     * Returns either a fixed point or the last iteration.
+     * Returns either a fixed point (left) or the last iteration (right).
      */
     private static <T> Either<T, T> fixedPointSearch(
             final T start,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
index 9e02a71689..ce2aca78c1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
@@ -48,7 +48,13 @@ import lombok.val;
  * {@link ActionParameterDefaultsFacet} and {@link ActionParameterChoicesFacet},
  * as well as
  * {@link PropertyDefaultFacet} and {@link PropertyChoicesFacet}.
+ *
+ * @deprecated this post-processor should be converted into a facet factory instead,
+ * as we now have a notion facet precedence e.g. install
+ * ActionParameterDefaultsFacetFromAssociatedCollection with LOW precedence
+ * and everything should just work fine
  */
+@Deprecated
 public class ChoicesAndDefaultsPostProcessor
 extends ObjectSpecificationPostProcessorAbstract {
 
@@ -157,9 +163,7 @@ extends ObjectSpecificationPostProcessorAbstract {
 
     private static void addCollectionParamDefaultsFacetIfNoneAlready(
             final ObjectActionParameter collectionParam) {
-        // with current programming model this can only be the first parameter of an action dialog
-        if(collectionParam.getParameterIndex()==0
-                && !hasMemberLevelDefaults(collectionParam)) {
+        if(!hasMemberLevelDefaults(collectionParam)) {
             FacetUtil.addFacet(
                     ActionParameterDefaultsFacetFromAssociatedCollection
                     .create(collectionParam));
diff --git a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CollectionInteractionTest.java b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CollectionInteractionTest.java
index 7dd0eaf15b..01e8e8c016 100644
--- a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CollectionInteractionTest.java
+++ b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CollectionInteractionTest.java
@@ -21,7 +21,6 @@ package org.apache.isis.testdomain.interact;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
@@ -106,7 +105,8 @@ class CollectionInteractionTest extends InteractionTestAbstract {
 
     }
 
-    @Test @Disabled("fails when model has more than 1 param") //FIXME[ISIS-3049]
+    @Test
+    //@Disabled("fails when model has more than 1 param") //FIXME[ISIS-3049]
     void choicesFromMultiselect() {
 
         val collTester =
@@ -141,8 +141,8 @@ class CollectionInteractionTest extends InteractionTestAbstract {
 
         // verify param defaults are seeded with choices from selection
         actTester.assertParameterValues(true,
-                arg0->assertEquals(expectedParamDefault, arg0),
-                arg1->assertEquals(expectedParamDefault, arg1));
+                arg0->assertEquals(expectedParamDefault, arg0, ()->"param 0 mismatch"),
+                arg1->assertEquals(expectedParamDefault, arg1, ()->"param 1 mismatch"));
     }
 
 }