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