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/11 10:57:00 UTC

[isis] branch master updated: ISIS-2877: properly handle parameter model when value is set to null

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 e2c3c39  ISIS-2877: properly handle parameter model when value is set to null
e2c3c39 is described below

commit e2c3c398fa8a92a97412ab11b4e7d7baf07d1f36
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Nov 11 11:56:53 2021 +0100

    ISIS-2877: properly handle parameter model when value is set to null
---
 .../core/metamodel/commons/CanonicalParameterUtil.java     |  9 +++++----
 .../metamodel/interactions/managed/ActionInteraction.java  |  5 ++---
 .../interactions/managed/ParameterNegotiationModel.java    | 14 ++++++++++++--
 .../specloader/specimpl/ObjectActionParameterAbstract.java |  6 +++---
 .../common/applib/mixins/Object_impersonateWithRoles.java  |  2 +-
 5 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalParameterUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalParameterUtil.java
index 5f34474..724f476 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalParameterUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalParameterUtil.java
@@ -55,7 +55,7 @@ public final class CanonicalParameterUtil {
 
         // supports effective private constructors as well
         return _Reflect.invokeConstructor(constructor, adaptedExecutionParameters)
-        .mapFailure(ex->toVerboseException(constructor.getParameterTypes(), adaptedExecutionParameters, ex))
+        .mapFailure(ex->toVerboseException(constructor, adaptedExecutionParameters, ex))
         .presentElseFail();
     }
 
@@ -66,7 +66,7 @@ public final class CanonicalParameterUtil {
 
         // supports effective private methods as well
         return _Reflect.invokeMethodOn(method, targetPojo, adaptedExecutionParameters)
-        .mapFailure(ex->toVerboseException(method.getParameterTypes(), adaptedExecutionParameters, ex))
+        .mapFailure(ex->toVerboseException(method, adaptedExecutionParameters, ex))
         .optionalElseFail()
         .orElse(null);
     }
@@ -144,10 +144,11 @@ public final class CanonicalParameterUtil {
     }
 
     private static Throwable toVerboseException(
-            final Class<?>[] parameterTypes,
+            final Executable executable,
             final Object[] adaptedExecutionParameters,
             final Throwable e) {
 
+        final Class<?>[] parameterTypes = executable.getParameterTypes();
         final int expectedParamCount = _NullSafe.size(parameterTypes);
         final int actualParamCount = _NullSafe.size(adaptedExecutionParameters);
         if(expectedParamCount!=actualParamCount) {
@@ -188,7 +189,7 @@ public final class CanonicalParameterUtil {
                 }
             }
             if(paramTypeMismatchEncountered) {
-                sb.insert(0, "expected param type mismatch\n");
+                sb.insert(0, String.format("expected param type mismatch in %s\n", executable));
                 return new IllegalArgumentException(sb.toString(), e);
             }
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
index 5ac8f08..f1fc78b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
@@ -185,9 +185,8 @@ public final class ActionInteraction extends MemberInteraction<ManagedAction, Ac
 
     public <X extends Throwable>
     ManagedAction getManagedActionElseFail() {
-        return getManagedActionElseThrow(veto->_Exceptions.unrecoverable("action vetoed: " + veto.getReason()));
+        return getManagedActionElseThrow(veto->
+            _Exceptions.unrecoverable("action vetoed: " + veto.getReason()));
     }
 
-
-
 }
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 7c20973..0deebc0 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
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.core.metamodel.interactions.managed;
 
+import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.IntStream;
 
@@ -99,9 +100,13 @@ public class ParameterNegotiationModel {
     }
 
     @NonNull public Can<ManagedObject> getParamValues() {
-        return paramModels
+        return paramModels.stream()
+                .peek(x->System.err.printf("\tparam[%d]%s%n", x.getParamNr(), x.getValue().getValue()))
                 .map(ParameterModel::getValue)
-                .map(Bindable::getValue);
+                .map(Bindable::getValue)
+                .peek(managedObj->Objects.requireNonNull(managedObj, ()->
+                        String.format("param wrapper cannot be null %s", "?")))
+                .collect(Can.toCan());
     }
 
     @NonNull public ManagedObject getActionTarget() {
@@ -267,6 +272,11 @@ public class ParameterNegotiationModel {
 
             bindableParamValue = _Bindables.forValue(initialValue);
             bindableParamValue.addListener((e,o,n)->{
+                if(n==null) {
+                    // lift null to empty ...
+                    bindableParamValue.setValue(metaModel.getEmpty());
+                    return;
+                }
                 getNegotiationModel().onNewParamValue();
             });
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index b96b8cb..5c4b483 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -71,17 +71,17 @@ implements
 
     protected ObjectActionParameterAbstract(
             final FeatureType featureType,
-            final int number,
+            final int parameterIndex,
             final ObjectSpecification paramElementType,
             final ObjectActionDefault objectAction) {
 
         this.featureType = featureType;
-        this.parameterIndex = number;
+        this.parameterIndex = parameterIndex;
         this.parentAction = objectAction;
         this.paramElementType = paramElementType;
 
         this.javaSourceParamName =
-                objectAction.getFacetedMethod().getMethod().getParameters()[number].getName();
+                objectAction.getFacetedMethod().getMethod().getParameters()[parameterIndex].getName();
     }
 
     @Override
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/applib/mixins/Object_impersonateWithRoles.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/applib/mixins/Object_impersonateWithRoles.java
index e6fb486..b6c3094 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/applib/mixins/Object_impersonateWithRoles.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/applib/mixins/Object_impersonateWithRoles.java
@@ -38,7 +38,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
- * Same as {@link ImpersonateMenu.impersonateWithRoles#act(String, List, String)},
+ * Same as {@link org.apache.isis.applib.services.user.ImpersonateMenu.impersonateWithRoles#act(String, List, String)},
  * but implemented as a mixin so that can be invoked while accessing an object.
  *
  * @since 2.0 {@index}