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

commit dbc4423ebb0ae46e2344b6e257bd8196be104bca
Author: Andi Huber <[email protected]>
AuthorDate: Thu Feb 8 10:16:29 2024 +0100

    CAUSEWAY-3686: on not-authorized editing veto provide feature-id in UI
---
 .../metamodel/interactions/managed/ActionInteraction.java    |  4 ++++
 .../allbutparam/authorization/AuthorizationFacet.java        | 10 ++++++++++
 .../authorization/AuthorizationFacetAbstract.java            |  3 +--
 .../ActionInteractionTest_notUsingAllowSafeSemantics.java    | 12 ++++++++++--
 .../ActionInteractionTest_usingAllowSafeSemantics.java       |  7 ++++++-
 5 files changed, 31 insertions(+), 5 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteraction.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteraction.java
index ef6ee1ce61..440ca60e5d 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteraction.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ActionInteraction.java
@@ -103,6 +103,10 @@ extends MemberInteraction<ManagedAction, 
ActionInteraction> {
      */
     @Getter
     private final Optional<ObjectAction> metamodel;
+    
+    public final Optional<Identifier> getFeatureIdentifier() {
+        return metamodel.map(ObjectAction::getFeatureIdentifier);
+    }
 
     public ActionInteraction checkSemanticConstraint(@NonNull final 
SemanticConstraint semanticConstraint) {
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
index 6eac7d29b2..b03c18b948 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacet.java
@@ -18,6 +18,9 @@
  */
 package 
org.apache.causeway.core.metamodel.postprocessors.allbutparam.authorization;
 
+import org.springframework.lang.Nullable;
+
+import org.apache.causeway.applib.Identifier;
 import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.interactions.ActionVisibilityContext;
 import 
org.apache.causeway.core.metamodel.interactions.CollectionVisibilityContext;
@@ -80,5 +83,12 @@ extends Facet, HidingInteractionAdvisor, 
DisablingInteractionAdvisor {
                                 vc.getWhere())) != null)
                 .orElse(false);
     }
+    
+    public static String formatNotAuthorizedToEdit(final @Nullable Identifier 
identifier) {
+        return identifier!=null
+                ? String.format("Not authorized to edit feature: %s",
+                        identifier.getLogicalType().getLogicalTypeSimpleName())
+                : "Not authorized to edit";
+    }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java
index 6e4ea31f9f..066001442a 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationFacetAbstract.java
@@ -81,7 +81,7 @@ implements AuthorizationFacet {
                         
getInteractionService().currentInteractionContextElseFail(),
                         ic.getIdentifier())
                 ? null
-                : "Not authorized to edit";
+                : 
AuthorizationFacet.formatNotAuthorizedToEdit(ic.getIdentifier());
 
         if(disables!=null && log.isDebugEnabled()) {
             log.debug("disables[{}] -> {}", ic.getIdentifier(), disables);
@@ -90,5 +90,4 @@ implements AuthorizationFacet {
         return Optional.ofNullable(disables).map(VetoReason::explicit);
     }
 
-
 }
diff --git 
a/regressiontests/stable-interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_notUsingAllowSafeSemantics.java
 
b/regressiontests/stable-interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_notUsingAllowSafeSemantics.java
index 23ab2f7923..971a83ff84 100644
--- 
a/regressiontests/stable-interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_notUsingAllowSafeSemantics.java
+++ 
b/regressiontests/stable-interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_notUsingAllowSafeSemantics.java
@@ -34,6 +34,8 @@ import 
org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.applib.services.iactnlayer.InteractionContext;
 import org.apache.causeway.core.config.presets.CausewayPresets;
+import 
org.apache.causeway.core.metamodel.postprocessors.allbutparam.authorization.AuthorizationFacet;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.security.authorization.Authorizor;
 import org.apache.causeway.testdomain.conf.Configuration_headless;
 import 
org.apache.causeway.testdomain.model.interaction.Configuration_usingInteractionDomain;
@@ -90,7 +92,10 @@ class ActionInteractionTest_notUsingAllowSafeSemantics 
extends InteractionTestAb
                 .checkVisibility()
                 .checkUsability();
         val veto = actionInteraction.getInteractionVeto().orElseThrow(); // 
should not throw
-        assertEquals("Not authorized to edit", 
veto.getReasonAsString().orElse(null));
+        val actionId = 
actionInteraction.getMetamodel().map(ObjectAction::getFeatureIdentifier).orElse(null);
+        assertEquals(
+                AuthorizationFacet.formatNotAuthorizedToEdit(actionId), 
+                veto.getReasonAsString().orElse(null));
     }
 
     @Test
@@ -99,7 +104,10 @@ class ActionInteractionTest_notUsingAllowSafeSemantics 
extends InteractionTestAb
                 .checkVisibility()
                 .checkUsability();
         val veto = actionInteraction.getInteractionVeto().orElseThrow(); // 
should not throw
-        assertEquals("Not authorized to edit", 
veto.getReasonAsString().orElse(null));
+        val actionId = 
actionInteraction.getMetamodel().map(ObjectAction::getFeatureIdentifier).orElse(null);
+        assertEquals(
+                AuthorizationFacet.formatNotAuthorizedToEdit(actionId), 
+                veto.getReasonAsString().orElse(null));
     }
 
 }
diff --git 
a/regressiontests/stable-interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_usingAllowSafeSemantics.java
 
b/regressiontests/stable-interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_usingAllowSafeSemantics.java
index 8a092a8fe3..32132eeca8 100644
--- 
a/regressiontests/stable-interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_usingAllowSafeSemantics.java
+++ 
b/regressiontests/stable-interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_usingAllowSafeSemantics.java
@@ -35,6 +35,8 @@ import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.applib.services.iactnlayer.InteractionContext;
 import org.apache.causeway.core.config.presets.CausewayPresets;
+import 
org.apache.causeway.core.metamodel.postprocessors.allbutparam.authorization.AuthorizationFacet;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.security.authorization.Authorizor;
 import org.apache.causeway.testdomain.conf.Configuration_headless;
 import 
org.apache.causeway.testdomain.model.interaction.Configuration_usingInteractionDomain;
@@ -101,7 +103,10 @@ class ActionInteractionTest_usingAllowSafeSemantics 
extends InteractionTestAbstr
                 .checkVisibility()
                 .checkUsability();
         val veto = actionInteraction.getInteractionVeto().orElseThrow(); // 
should not throw
-        assertEquals("Not authorized to edit", 
veto.getReasonAsString().orElse(null));
+        val actionId = 
actionInteraction.getMetamodel().map(ObjectAction::getFeatureIdentifier).orElse(null);
+        assertEquals(
+                AuthorizationFacet.formatNotAuthorizedToEdit(actionId), 
+                veto.getReasonAsString().orElse(null));
     }
 
 }

Reply via email to