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