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;
     }