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 2020/07/25 08:17:28 UTC

[isis] branch master updated: ISIS-2340: parameter validation to consider all pending parameters

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 653e95d  ISIS-2340: parameter validation to consider all pending parameters
653e95d is described below

commit 653e95d4b80d7533c515db50959ccf0851e86717
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Jul 25 10:17:10 2020 +0200

    ISIS-2340: parameter validation to consider all pending parameters
---
 .../managed/ParameterNegotiationModel.java         | 26 +++++++++++++---------
 .../spec/feature/ObjectActionParameter.java        | 20 +++++++++++++++--
 .../specimpl/ObjectActionParameterAbstract.java    | 20 +++++++++++++----
 ...ionParameterAbstractTest_getId_and_getName.java |  7 ++++++
 .../interact/ScalarParamNegotiationTest.java       |  2 +-
 5 files changed, 57 insertions(+), 18 deletions(-)

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 04a2d35..2ce1f93 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
@@ -58,6 +58,7 @@ public class ParameterNegotiationModel {
     @Getter private final ActionInteractionHead head;
     private final Can<ParameterModel> paramModels;
     private final _BindableAbstract<Boolean> validationFeedbackActive;
+    private final LazyObservable<String> observableActionValidation;
     
     private ParameterNegotiationModel(
             @NonNull final ActionInteractionHead head,
@@ -68,6 +69,13 @@ public class ParameterNegotiationModel {
         val paramNrIterator = IntStream.range(0, initialParamValues.size()).iterator();
         this.paramModels = initialParamValues
                 .map(initialValue->new ParameterModel(paramNrIterator.nextInt(), this, initialValue));
+        
+        this.observableActionValidation = _Observables.forFactory(()->
+            validationFeedbackActive.getValue()
+            ? head.getMetaModel()
+                    .isArgumentSetValid(getActionTarget(), getParamValues(), InteractionInitiatedBy.USER)
+                    .getReason()
+            : (String)null);
     }
     
     // -- ACTION SPECIFIC
@@ -81,9 +89,7 @@ public class ParameterNegotiationModel {
     }
     
     @NonNull public Observable<String> getObservableActionValidation() {
-        // TODO listen to any user initiated submit attempt then validate the action
-        // this also turns on validationFeedback
-        return _Bindables.forValue(null);
+        return observableActionValidation;
     }
     
     /**
@@ -142,6 +148,7 @@ public class ParameterNegotiationModel {
     
     private void onNewParamValue() {
         paramModels.forEach(ParameterModel::invalidateChoicesAndValidation);
+        observableActionValidation.invalidate();
     }
     
     // -- INTERNAL HOLDER OF PARAMETER BINDABLES
@@ -183,7 +190,7 @@ public class ParameterNegotiationModel {
                     getMetaModel().getChoices(getModel(), InteractionInitiatedBy.USER))
                 : _Observables.forFactory(Can::empty);
 
-                    
+            // if has autoComplete, then activate the search argument        
             bindableParamSearchArgument = _Bindables.forValue(null);
             if(metaModel.hasAutoComplete()) {
                 bindableParamSearchArgument.addListener((e,o,n)->{
@@ -191,16 +198,13 @@ public class ParameterNegotiationModel {
                 });
             }
             
-            // TODO listen to any user initiated value changes, then validate the corresponding parameter
-            // but only after validationFeedback has been turned on
+            // validate this parameter, but only when validationFeedback has been activated
             observableParamValidation = _Observables.forFactory(()->
                 isValidationFeedbackActive()
-                ? getMetaModel().isValid(
-                        getModel().head, 
-                        getValue(), // TODO consider all params
-                        InteractionInitiatedBy.USER)
+                ? getMetaModel()
+                        .isValid(getModel().head, getModel().getParamValues(), InteractionInitiatedBy.USER)
+                        .getReason()
                 : (String)null); 
-            
         }
         
         public String getName() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
index 36c868c..0fa2bfd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -139,7 +139,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
 
     /**
      * Whether this parameter is visible given the entered previous arguments
-     * @param targetAdapter
+     * @param head
      * @param pendingArgs
      * @param interactionInitiatedBy
      * @return
@@ -151,7 +151,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
 
     /**
      * Whether this parameter is disabled given the entered previous arguments
-     * @param targetAdapter
+     * @param head
      * @param pendingArgs
      * @param interactionInitiatedBy
      * @return
@@ -164,16 +164,32 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
     /**
      * Whether proposed value for this parameter is valid.
      *
+     * @param head
+     * @param pendingArgs
+     * @param interactionInitiatedBy
+     * @return
+     */
+    Consent isValid(
+            InteractionHead head,
+            Can<ManagedObject> pendingArgs,
+            InteractionInitiatedBy interactionInitiatedBy);
+
+    /**
+     * Whether proposed value for this parameter is valid.
+     *
      * @param adapter
      * @param proposedValue
      * @param interactionInitiatedBy
      * @return
+     * @deprecated use variant with all pendingArgs instead
      */
+    @Deprecated
     String isValid(
             InteractionHead head,
             ManagedObject proposedValue,
             InteractionInitiatedBy interactionInitiatedBy);
 
+    
     @Vetoed
     public static class Predicates {
         private Predicates(){}
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 715b55e..1803de4 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
@@ -29,7 +29,6 @@ import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.consent.Allow;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.consent.InteractionResultSet;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -46,7 +45,6 @@ import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.core.metamodel.interactions.ActionArgVisibilityContext;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.spec.DomainModelException;
@@ -336,10 +334,10 @@ implements ObjectActionParameter, FacetHolder.Delegating {
             final Can<ManagedObject> pendingArgs,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        final UsabilityContext ic = createArgumentUsabilityContext(
+        val usabilityContext = createArgumentUsabilityContext(
                 head, pendingArgs, getNumber(), interactionInitiatedBy);
 
-        final InteractionResult usableResult = InteractionUtils.isUsableResult(this, ic);
+        val usableResult = InteractionUtils.isUsableResult(this, usabilityContext);
         return usableResult.createConsent();
     }
 
@@ -358,6 +356,19 @@ implements ObjectActionParameter, FacetHolder.Delegating {
     }
 
     @Override
+    public Consent isValid(
+            InteractionHead head, 
+            Can<ManagedObject> pendingArgs,
+            InteractionInitiatedBy interactionInitiatedBy) {
+        
+        val validityContext = createProposedArgumentInteractionContext(
+                head, pendingArgs, getNumber(), interactionInitiatedBy);
+        
+        val validResult = InteractionUtils.isValidResult(this, validityContext);
+        return validResult.createConsent();
+    }
+    
+    @Override @Deprecated
     public String isValid(
             final InteractionHead head,
             final ManagedObject proposedValue,
@@ -386,6 +397,7 @@ implements ObjectActionParameter, FacetHolder.Delegating {
      * to do this in two passes, one to build up the argument set as a single
      * unit, and then validate each in turn.
      */
+    @Deprecated
     private Can<ManagedObject> arguments(final ManagedObject proposedValue) {
         final int paramCount = getAction().getParameterCount();
         final int paramIndex = getNumber();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
index b5a0b83..d27159e 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
@@ -35,6 +35,7 @@ import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
@@ -91,6 +92,12 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
         }
 
         @Override
+        public Consent isValid(InteractionHead head, Can<ManagedObject> pendingArgs,
+                InteractionInitiatedBy interactionInitiatedBy) {
+            return null;
+        }
+        
+        @Override
         public ObjectSpecification getSpecification() {
             return objectSpec;
         }
diff --git a/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/ScalarParamNegotiationTest.java b/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/ScalarParamNegotiationTest.java
index 95c98be..28b9d62 100644
--- a/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/ScalarParamNegotiationTest.java
+++ b/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/ScalarParamNegotiationTest.java
@@ -156,7 +156,7 @@ class ScalarParamNegotiationTest extends InteractionTestAbstract {
         assertComponentWiseUnwrappedEquals(new int[] {-3, -1}, uiParamC.getChoices());
         final int eventCount2 = uiParamC.getChoiceBoxUpdateEventCount().intValue();
         
-        // verify that no additional changes where triggered listeners
+        // verify that no additional changes were triggered
         assertEquals(eventCount1, eventCount2);
         
         // TODO such a change might set or clear paramC validation message once validation feedback is active