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 2023/08/19 06:03:20 UTC
[causeway] branch master updated: CAUSEWAY-3554: more meaningful feedback, if validation support returns empty string
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/causeway.git
The following commit(s) were added to refs/heads/master by this push:
new 56bf7c4232 CAUSEWAY-3554: more meaningful feedback, if validation support returns empty string
56bf7c4232 is described below
commit 56bf7c42325fb2f5610ff01a5df004ca62f7f8ef
Author: andi-huber <ah...@apache.org>
AuthorDate: Sat Aug 19 08:03:14 2023 +0200
CAUSEWAY-3554: more meaningful feedback, if validation support returns
empty string
---
.../progmodel/ProgrammingModelConstants.java | 7 ++++-
.../metamodel/interactions/InteractionUtils.java | 33 +++++++++++++++++++---
2 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/core/config/src/main/java/org/apache/causeway/core/config/progmodel/ProgrammingModelConstants.java b/core/config/src/main/java/org/apache/causeway/core/config/progmodel/ProgrammingModelConstants.java
index c8f9410798..8c8a2a0e7b 100644
--- a/core/config/src/main/java/org/apache/causeway/core/config/progmodel/ProgrammingModelConstants.java
+++ b/core/config/src/main/java/org/apache/causeway/core/config/progmodel/ProgrammingModelConstants.java
@@ -548,6 +548,12 @@ public final class ProgrammingModelConstants {
+ " but introspection did pick up method '${actualMethodName}' instead."),
INVALID_MIXIN_SORT("Mixin ${type} is declared as contributing '${expectedContributing}'"
+ " but introspection did pick it up as '${actualContributing}' instead."),
+ INVALID_USE_OF_VALIDATION_SUPPORT_METHOD("Validation support method "
+ + "for member '${memberName}' in class '${className}' "
+ + "was returning an empty string, which is invalid use of Apache Causeway's programming model. "
+ + "In case a successful validation was intended, "
+ + "the method should return null instead of an empty string. "
+ + "(Please inform your developers!)"),
;
private final String template;
@@ -816,5 +822,4 @@ public final class ProgrammingModelConstants {
return templateRef.getValue();
}
-
}
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
index e0e841857f..2e784dd8bb 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
@@ -20,6 +20,10 @@ package org.apache.causeway.core.metamodel.interactions;
import java.util.Optional;
+import org.springframework.lang.Nullable;
+
+import org.apache.causeway.applib.Identifier;
+import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants;
import org.apache.causeway.core.metamodel.consent.Consent;
import org.apache.causeway.core.metamodel.consent.InteractionAdvisor;
import org.apache.causeway.core.metamodel.consent.InteractionResult;
@@ -27,10 +31,13 @@ import org.apache.causeway.core.metamodel.consent.InteractionResultSet;
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet;
+import lombok.NonNull;
import lombok.val;
import lombok.experimental.UtilityClass;
+import lombok.extern.log4j.Log4j2;
@UtilityClass
+@Log4j2
public final class InteractionUtils {
public static InteractionResult isVisibleResult(final FacetHolder facetHolder, final VisibilityContext context) {
@@ -73,7 +80,9 @@ public final class InteractionUtils {
facetHolder.streamFacets(ValidatingInteractionAdvisor.class)
.filter(advisor->compatible(advisor, context))
.forEach(advisor->{
- val invalidatingReasonString = advisor.invalidates(context);
+ val invalidatingReasonString =
+ guardAgainstEmptyReasonString(advisor.invalidates(context), context.getIdentifier());
+
val invalidatingReason = Optional.ofNullable(invalidatingReasonString)
.map(Consent.VetoReason::explicit)
.orElse(null);
@@ -82,7 +91,7 @@ public final class InteractionUtils {
return iaResult;
}
-
+
public static InteractionResultSet isValidResultSet(
final FacetHolder facetHolder,
final ValidityContext context,
@@ -90,13 +99,29 @@ public final class InteractionUtils {
return resultSet.add(isValidResult(facetHolder, context));
}
+
+ /**
+ * [CAUSEWAY-3554] an empty String most likely is wrong use of the programming model,
+ * we should generate a message,
+ * explaining what was going wrong and hinting developers at a possible resolution
+ */
+ private static String guardAgainstEmptyReasonString(
+ final @Nullable String reason, final @NonNull Identifier identifier) {
+ if("".equals(reason)) {
+ val msg = ProgrammingModelConstants.Violation.INVALID_USE_OF_VALIDATION_SUPPORT_METHOD.builder()
+ .addVariable("className", identifier.getClassName())
+ .addVariable("memberName", identifier.getMemberLogicalName())
+ .buildMessage();
+ log.error(msg);
+ return msg;
+ }
+ return reason;
+ }
private static boolean compatible(final InteractionAdvisor advisor, final InteractionContext ic) {
-
if(advisor instanceof ActionDomainEventFacet) {
return ic instanceof ActionInteractionContext;
}
-
return true;
}