This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/main by this push:
     new 1d293b9f5df CAUSEWAY-3859: Java record refactoring (part 39)
1d293b9f5df is described below

commit 1d293b9f5df40ee44965bc99c3a41abd4e3eb1df
Author: andi-huber <[email protected]>
AuthorDate: Sat Feb 22 09:08:53 2025 +0100

    CAUSEWAY-3859: Java record refactoring (part 39)
    
    - sealed MemberInteraction
---
 .../interactions/managed/ActionInteraction.java    | 229 +++++++++++----------
 .../managed/CollectionInteraction.java             |  15 +-
 .../interactions/managed/MemberInteraction.java    |  43 ++--
 .../interactions/managed/PropertyInteraction.java  |  17 +-
 .../interaction/DomainObjectTesterFactory.java     |   4 +-
 .../testdomain/interact/ActionInteractionTest.java |   4 +-
 ...InteractionTest_notUsingAllowSafeSemantics.java |   5 +-
 ...ionInteractionTest_usingAllowSafeSemantics.java |   3 +-
 .../testdomain/interact/NewParameterModelTest.java |   2 +-
 .../interaction/act/ActionInteractionWkt.java      |   9 +-
 .../models/interaction/act/UiParameterWkt.java     |   8 +-
 11 files changed, 157 insertions(+), 182 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 803c530cb82..a4938aa28b9 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
@@ -36,12 +36,16 @@
 import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
 import 
org.apache.causeway.core.metamodel.spec.feature.ObjectMember.AuthorizationException;
 
-import lombok.Getter;
-
-public final class ActionInteraction
-extends MemberInteraction<ManagedAction, ActionInteraction> {
-
-    public static enum SemanticConstraint {
+public record ActionInteraction(
+        String memberId,
+        /**
+         * optionally the action's metamodel, based on whether was found by 
actionId
+         */
+        @NonNull Optional<ObjectAction> objectAction,
+        @NonNull InteractionRailway<ManagedAction> railway)
+implements MemberInteraction<ManagedAction, ActionInteraction> {
+
+    public enum SemanticConstraint {
         NONE,
         IDEMPOTENT,
         SAFE
@@ -53,6 +57,12 @@ public record Result(
             ManagedObject actionReturnedObject) {
     }
 
+    public static interface ParameterInvalidCallback {
+        void onParameterInvalid(ManagedParameter managedParameter, 
InteractionVeto veto);
+    }
+
+    // -- FACTORIES
+
     public static final ActionInteraction start(
             final @NonNull ManagedObject owner,
             final @NonNull String memberId,
@@ -62,125 +72,22 @@ public static final ActionInteraction start(
 
     public static final ActionInteraction startWithMultiselect(
             final @NonNull ManagedObject owner,
-            final @NonNull String memberId,
+            final @NonNull String actionId,
             final @NonNull Where where,
             final @NonNull MultiselectChoices multiselectChoices) {
 
-        var managedAction = ManagedAction.lookupActionWithMultiselect(owner, 
memberId, where, multiselectChoices);
+        var managedAction = ManagedAction.lookupActionWithMultiselect(owner, 
actionId, where, multiselectChoices);
 
         final InteractionRailway<ManagedAction> railway = 
managedAction.isPresent()
                 ? InteractionRailway.success(managedAction.get())
-                : 
InteractionRailway.veto(InteractionVeto.notFound(Identifier.Type.ACTION, 
memberId));
+                : 
InteractionRailway.veto(InteractionVeto.notFound(Identifier.Type.ACTION, 
actionId));
 
         return new ActionInteraction(
-                managedAction.map(ManagedAction::getAction),
+                actionId,
+                managedAction.map(x->x.getAction()),
                 railway);
     }
 
-    public static ActionInteraction wrap(final @NonNull ManagedAction 
managedAction) {
-        return new ActionInteraction(
-                Optional.of(managedAction.getAction()),
-                InteractionRailway.success(managedAction));
-    }
-
-    public static ActionInteraction empty(final String actionId) {
-        return new ActionInteraction(
-                Optional.empty(),
-                
InteractionRailway.veto(InteractionVeto.notFound(Identifier.Type.ACTION, 
actionId)));
-    }
-
-    ActionInteraction(
-            final @NonNull Optional<ObjectAction> metamodel,
-            final @NonNull InteractionRailway<ManagedAction> railway) {
-        super(railway);
-        this.metamodel = metamodel;
-    }
-
-    /**
-     * optionally the action's metamodel, based on whether even exists (eg. 
was found by memberId)
-     */
-    @Getter
-    private final Optional<ObjectAction> metamodel;
-
-    public final Optional<Identifier> getFeatureIdentifier() {
-        return metamodel.map(ObjectAction::getFeatureIdentifier);
-    }
-
-    public ActionInteraction checkSemanticConstraint(final @NonNull 
SemanticConstraint semanticConstraint) {
-        railway.update(action -> switch(semanticConstraint) {
-                case NONE -> Optional.empty();
-                case IDEMPOTENT -> 
action.getAction().getSemantics().isIdempotentInNature()
-                            ? Optional.empty()
-                            : 
Optional.of(InteractionVeto.actionNotIdempotent(action));
-                case SAFE -> action.getAction().getSemantics().isSafeInNature()
-                            ? Optional.empty()
-                            : 
Optional.of(InteractionVeto.actionNotSafe(action));
-            }
-        );
-        return this;
-    }
-
-    public Optional<ParameterNegotiationModel> startParameterNegotiation() {
-        return getManagedAction()
-            .map(ManagedAction::startParameterNegotiation);
-    }
-
-    public static interface ParameterInvalidCallback {
-        void onParameterInvalid(ManagedParameter managedParameter, 
InteractionVeto veto);
-    }
-
-    public Railway<InteractionVeto, ManagedObject> invokeWith(final 
ParameterNegotiationModel pendingArgs) {
-        pendingArgs.activateValidationFeedback();
-        var veto = validate(pendingArgs);
-        if(veto.isPresent()) {
-            return Railway.failure(veto.get());
-        }
-        var action = railway.getSuccessElseFail();
-        var actionResultOrVeto = action.invoke(pendingArgs.getParamValues());
-        return actionResultOrVeto;
-    }
-
-    public final ManagedObject invokeWithRuleChecking(
-            final ParameterNegotiationModel pendingArgs) throws 
AuthorizationException {
-        var action = railway.getSuccessElseFail();
-        return action.invokeWithRuleChecking(pendingArgs.getParamValues());
-    }
-
-    public Optional<InteractionVeto> validate(
-            final @NonNull ParameterNegotiationModel pendingArgs) {
-
-        if(railway.isVeto()) return railway.getVeto();
-
-        var validityConsent = pendingArgs.validateParameterSet(); // full 
validation
-        if(validityConsent!=null && validityConsent.isVetoed()) {
-            return 
Optional.of(InteractionVeto.actionParamInvalid(validityConsent));
-        }
-        return Optional.empty();
-    }
-
-    /**
-     * @return optionally the ManagedAction based on whether there
-     * was no interaction veto within the originating chain
-     */
-    public Optional<ManagedAction> getManagedAction() {
-        return railway.getSuccess();
-    }
-
-    /**
-     * @return this Interaction's ManagedAction
-     * @throws X if there was any interaction veto within the originating chain
-     */
-    public <X extends Throwable>
-    ManagedAction getManagedActionElseThrow(final Function<InteractionVeto, ? 
extends X> onFailure) throws X {
-        return super.getManagedMemberElseThrow(onFailure);
-    }
-
-    public <X extends Throwable>
-    ManagedAction getManagedActionElseFail() {
-        return getManagedActionElseThrow(veto->
-            _Exceptions.unrecoverable("action vetoed: " + veto.getReason()));
-    }
-
     /** Supports composite-value-types via mixin (in case detected). */
     public static ActionInteraction startAsBoundToProperty(
             final ManagedProperty associatedWithProperty,
@@ -261,6 +168,100 @@ public static ActionInteraction startAsBoundToParameter(
         return ActionInteraction.start(actionOwner, memberId, where);
     }
 
+    public static ActionInteraction wrap(final @NonNull ManagedAction 
managedAction) {
+        var action = managedAction.getAction();
+        return new ActionInteraction(
+                action.getId(),
+                Optional.of(action),
+                InteractionRailway.success(managedAction));
+    }
+
+    public static ActionInteraction empty(final String actionId) {
+        return new ActionInteraction(
+                actionId,
+                Optional.empty(),
+                
InteractionRailway.veto(InteractionVeto.notFound(Identifier.Type.ACTION, 
actionId)));
+    }
+
+    // -- METHODS
+
+    public ObjectAction getObjectActionElseFail() {
+        return objectAction.orElseThrow(()->_Exceptions
+                .noSuchElement("could not resolve action by memberId '%s'", 
memberId));
+    }
+
+    public Optional<Identifier> getFeatureIdentifier() {
+        return objectAction.map(ObjectAction::getFeatureIdentifier);
+    }
+
+    public ActionInteraction checkSemanticConstraint(final @NonNull 
SemanticConstraint semanticConstraint) {
+        railway.update(action -> switch(semanticConstraint) {
+                case NONE -> Optional.empty();
+                case IDEMPOTENT -> 
action.getAction().getSemantics().isIdempotentInNature()
+                            ? Optional.empty()
+                            : 
Optional.of(InteractionVeto.actionNotIdempotent(action));
+                case SAFE -> action.getAction().getSemantics().isSafeInNature()
+                            ? Optional.empty()
+                            : 
Optional.of(InteractionVeto.actionNotSafe(action));
+            }
+        );
+        return this;
+    }
+
+    public Optional<ParameterNegotiationModel> startParameterNegotiation() {
+        return getManagedAction()
+            .map(ManagedAction::startParameterNegotiation);
+    }
+
+    public Railway<InteractionVeto, ManagedObject> invokeWith(final 
ParameterNegotiationModel pendingArgs) {
+        pendingArgs.activateValidationFeedback();
+        var veto = validate(pendingArgs);
+        if(veto.isPresent()) return Railway.failure(veto.get());
+
+        var action = railway.getSuccessElseFail();
+        var actionResultOrVeto = action.invoke(pendingArgs.getParamValues());
+        return actionResultOrVeto;
+    }
+
+    public ManagedObject invokeWithRuleChecking(
+            final ParameterNegotiationModel pendingArgs) throws 
AuthorizationException {
+        var action = railway.getSuccessElseFail();
+        return action.invokeWithRuleChecking(pendingArgs.getParamValues());
+    }
+
+    public Optional<InteractionVeto> validate(
+            final @NonNull ParameterNegotiationModel pendingArgs) {
+        if(railway.isVeto()) return railway.getVeto();
+
+        var validityConsent = pendingArgs.validateParameterSet(); // full 
validation
+        return validityConsent!=null
+                && validityConsent.isVetoed()
+            ? Optional.of(InteractionVeto.actionParamInvalid(validityConsent))
+            : Optional.empty();
+    }
+
+    /**
+     * @return optionally the ManagedAction based on whether there
+     * was no interaction veto within the originating chain
+     */
+    public Optional<ManagedAction> getManagedAction() {
+        return railway.getSuccess();
+    }
+
+    /**
+     * @return this Interaction's ManagedAction
+     * @throws X if there was any interaction veto within the originating chain
+     */
+    public <X extends Throwable> ManagedAction getManagedActionElseThrow(
+            final Function<InteractionVeto, ? extends X> onFailure) throws X {
+        return getManagedMemberElseThrow(onFailure);
+    }
+
+    public <X extends Throwable> ManagedAction getManagedActionElseFail() {
+        return getManagedActionElseThrow(veto->
+            _Exceptions.unrecoverable("action vetoed: " + veto.getReason()));
+    }
+
     // -- HELPER
 
     private static RuntimeException onMissingDefaultsProvider(final 
ObjectFeature feature) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/CollectionInteraction.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/CollectionInteraction.java
index 5f4ea28b996..d8879f43140 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/CollectionInteraction.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/CollectionInteraction.java
@@ -27,8 +27,9 @@
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 
-public final class CollectionInteraction
-extends MemberInteraction<ManagedCollection, CollectionInteraction> {
+public record CollectionInteraction(
+        @NonNull InteractionRailway<ManagedCollection> railway)
+implements MemberInteraction<ManagedCollection, CollectionInteraction> {
 
     public static final CollectionInteraction start(
             final @NonNull ManagedObject owner,
@@ -44,10 +45,6 @@ public static final CollectionInteraction start(
         return new CollectionInteraction(railway);
     }
 
-    CollectionInteraction(final @NonNull InteractionRailway<ManagedCollection> 
railway) {
-        super(railway);
-    }
-
     /**
      * @return optionally the ManagedCollection based on whether there
      * was no interaction veto within the originating chain
@@ -60,9 +57,9 @@ public Optional<ManagedCollection> getManagedCollection() {
      * @return this Interaction's ManagedCollection
      * @throws X if there was any interaction veto within the originating chain
      */
-    public <X extends Throwable>
-    ManagedCollection getManagedCollectionElseThrow(final 
Function<InteractionVeto, ? extends X> onFailure) throws X {
-        return super.getManagedMemberElseThrow(onFailure);
+    public <X extends Throwable> ManagedCollection 
getManagedCollectionElseThrow(
+            final Function<InteractionVeto, ? extends X> onFailure) throws X {
+        return getManagedMemberElseThrow(onFailure);
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/MemberInteraction.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/MemberInteraction.java
index b814de47d4d..c68f60b201c 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/MemberInteraction.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/MemberInteraction.java
@@ -25,26 +25,23 @@
 
 import org.apache.causeway.commons.internal.base._Casts;
 
-public abstract class MemberInteraction<T extends ManagedMember, H extends 
MemberInteraction<T, ?>> {
+public sealed interface MemberInteraction<T extends ManagedMember, H extends 
MemberInteraction<T, ?>>
+permits ActionInteraction, CollectionInteraction, PropertyInteraction {
 
     public static enum AccessIntent {
         ACCESS, MUTATE;
         public boolean isMutate() { return this == MUTATE; }
     }
 
-    @NonNull protected final InteractionRailway<T> railway;
+    @NonNull InteractionRailway<T> railway();
 
-    protected MemberInteraction(final @NonNull InteractionRailway<T> railway) {
-        this.railway = railway;
-    }
-
-    public H checkVisibility() {
-        railway.update(ManagedMember::checkVisibility);
+    default H checkVisibility() {
+        railway().update(ManagedMember::checkVisibility);
         return _Casts.uncheckedCast(this);
     }
 
-    public H checkUsability() {
-        railway.update(ManagedMember::checkUsability);
+    default H checkUsability() {
+        railway().update(ManagedMember::checkUsability);
         return _Casts.uncheckedCast(this);
     }
 
@@ -53,14 +50,14 @@ public H checkUsability() {
      * @param intent
      * @return self
      */
-    public H checkUsability(final @NonNull AccessIntent intent) {
+    default H checkUsability(final @NonNull AccessIntent intent) {
         if(intent.isMutate()) return checkUsability();
 
         return _Casts.uncheckedCast(this);
     }
 
-    public <X extends Throwable>
-    H validateElseThrow(final Function<InteractionVeto, ? extends X> 
onFailure) throws X {
+    default <X extends Throwable> H validateElseThrow(
+            final Function<InteractionVeto, ? extends X> onFailure) throws X {
         var veto = getInteractionVeto().orElse(null);
         if (veto == null) {
             return _Casts.uncheckedCast(this);
@@ -69,32 +66,24 @@ H validateElseThrow(final Function<InteractionVeto, ? 
extends X> onFailure) thro
         }
     }
 
-//    /**
-//     * @return optionally the ManagedMember based on whether there
-//     * was no interaction veto within the originating chain
-//     */
-//    protected InteractionRailway<T> getManagedMember() {
-//        return railway;
-//    }
-
     /**
      * @return optionally the InteractionVeto based on whether there
      * was any interaction veto within the originating chain
      */
-    public Optional<InteractionVeto> getInteractionVeto() {
-        return railway.getVeto();
+    default Optional<InteractionVeto> getInteractionVeto() {
+        return railway().getVeto();
     }
 
     /**
      * @return this Interaction's ManagedMember
      * @throws X if there was any interaction veto within the originating chain
      */
-    protected <X extends Throwable>
-    T getManagedMemberElseThrow(final Function<InteractionVeto, ? extends X> 
onFailure) throws X {
-        return railway.getSuccessElseFail(onFailure);
+    default <X extends Throwable> T getManagedMemberElseThrow(
+            final Function<InteractionVeto, ? extends X> onFailure) throws X {
+        return railway().getSuccessElseFail(onFailure);
     }
 
-    protected InteractionRailway<T> vetoRailway(final InteractionVeto veto) {
+    default InteractionRailway<T> vetoRailway(final InteractionVeto veto) {
         return InteractionRailway.veto(veto);
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/PropertyInteraction.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/PropertyInteraction.java
index f272b07ec8b..097593bb387 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/PropertyInteraction.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/PropertyInteraction.java
@@ -27,8 +27,9 @@
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 
-public final class PropertyInteraction
-extends MemberInteraction<ManagedProperty, PropertyInteraction> {
+public record PropertyInteraction(
+        @NonNull InteractionRailway<ManagedProperty> railway)
+implements MemberInteraction<ManagedProperty, PropertyInteraction> {
 
     public static final PropertyInteraction start(
             final @NonNull ManagedObject owner,
@@ -48,10 +49,6 @@ public static PropertyInteraction wrap(final @NonNull 
ManagedProperty managedPro
         return new 
PropertyInteraction(InteractionRailway.success(managedProperty));
     }
 
-    PropertyInteraction(final @NonNull InteractionRailway<ManagedProperty> 
railway) {
-        super(railway);
-    }
-
     public Optional<PropertyNegotiationModel> startPropertyNegotiation() {
         return getManagedProperty()
             .map(ManagedProperty::startNegotiation);
@@ -69,16 +66,16 @@ public PropertyInteraction modifyProperty(
      * was no interaction veto within the originating chain
      */
     public Optional<ManagedProperty> getManagedProperty() {
-        return super.railway.getSuccess();
+        return railway.getSuccess();
     }
 
     /**
      * @return this Interaction's ManagedProperty
      * @throws X if there was any interaction veto within the originating chain
      */
-    public <X extends Throwable>
-    ManagedProperty getManagedPropertyElseThrow(final 
Function<InteractionVeto, ? extends X> onFailure) throws X {
-        return super.getManagedMemberElseThrow(onFailure);
+    public <X extends Throwable> ManagedProperty getManagedPropertyElseThrow(
+            final Function<InteractionVeto, ? extends X> onFailure) throws X {
+        return getManagedMemberElseThrow(onFailure);
     }
 
 }
diff --git 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/util/interaction/DomainObjectTesterFactory.java
 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/util/interaction/DomainObjectTesterFactory.java
index 2a76ec182e8..16554828e2d 100644
--- 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/util/interaction/DomainObjectTesterFactory.java
+++ 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/util/interaction/DomainObjectTesterFactory.java
@@ -448,6 +448,7 @@ public void assertInvocationResultNoRules(
 
         }
 
+        @SuppressWarnings("unchecked")
         public void assertParameterValues(
                 final boolean checkRules,
                 @SuppressWarnings("rawtypes") final Consumer 
...pojoDefaultArgTests) {
@@ -539,7 +540,7 @@ public void assertParameterVisibility(
 
         public void assertParameterUsability(
                 final boolean checkRules,
-                final Consumer<String> ...argUsableChecks) {
+                @SuppressWarnings("unchecked") final Consumer<String> 
...argUsableChecks) {
 
             assertParameterModel(checkRules,
                 // when
@@ -566,6 +567,7 @@ public void assertParameterUsability(
 
         }
 
+        @SuppressWarnings("unchecked")
         public void assertValidationMessage(
                 final String expectedMessage,
                 final boolean checkRules,
diff --git 
a/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest.java
 
b/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest.java
index de113dd5312..73ed79f980b 100644
--- 
a/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest.java
+++ 
b/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest.java
@@ -107,9 +107,9 @@ void mixinWhenDisabled_shouldProvideActionMetadata() {
                 .checkUsability();
 
         assertFalse(actionInteraction.getManagedAction().isPresent()); // 
since usability should be vetoed
-        assertTrue(actionInteraction.getMetamodel().isPresent()); // but 
should always provide access to metamodel
+        assertTrue(actionInteraction.objectAction().isPresent()); // but 
should always provide access to metamodel
 
-        var actionMeta = actionInteraction.getMetamodel().get();
+        var actionMeta = actionInteraction.objectAction().get();
         assertEquals(2, actionMeta.getParameterCount());
     }
 
diff --git 
a/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_notUsingAllowSafeSemantics.java
 
b/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_notUsingAllowSafeSemantics.java
index d69fdb3182d..a37a1e6bf46 100644
--- 
a/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_notUsingAllowSafeSemantics.java
+++ 
b/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_notUsingAllowSafeSemantics.java
@@ -36,7 +36,6 @@
 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;
@@ -91,7 +90,7 @@ void whenSafeAction_shouldDenyUse() {
                 .checkVisibility()
                 .checkUsability();
         var veto = actionInteraction.getInteractionVeto().orElseThrow(); // 
should not throw
-        var actionId = 
actionInteraction.getMetamodel().map(ObjectAction::getFeatureIdentifier).orElse(null);
+        var actionId = actionInteraction.getFeatureIdentifier().orElse(null);
         assertEquals(
                 AuthorizationFacet.formatNotAuthorizedToEdit(actionId, 
objectManager.getMetaModelContext()),
                 veto.getReasonAsString().orElse(null));
@@ -103,7 +102,7 @@ void whenNonSafeAction_shouldDenyUse() {
                 .checkVisibility()
                 .checkUsability();
         var veto = actionInteraction.getInteractionVeto().orElseThrow(); // 
should not throw
-        var actionId = 
actionInteraction.getMetamodel().map(ObjectAction::getFeatureIdentifier).orElse(null);
+        var actionId = actionInteraction.getFeatureIdentifier().orElse(null);
         assertEquals(
                 AuthorizationFacet.formatNotAuthorizedToEdit(actionId, 
objectManager.getMetaModelContext()),
                 veto.getReasonAsString().orElse(null));
diff --git 
a/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_usingAllowSafeSemantics.java
 
b/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_usingAllowSafeSemantics.java
index 693f68e7294..2bc9a48d415 100644
--- 
a/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_usingAllowSafeSemantics.java
+++ 
b/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/ActionInteractionTest_usingAllowSafeSemantics.java
@@ -37,7 +37,6 @@
 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;
@@ -102,7 +101,7 @@ void whenNonSafeAction_shouldDenyUse() {
                 .checkVisibility()
                 .checkUsability();
         var veto = actionInteraction.getInteractionVeto().orElseThrow(); // 
should not throw
-        var actionId = 
actionInteraction.getMetamodel().map(ObjectAction::getFeatureIdentifier).orElse(null);
+        var actionId = actionInteraction.getFeatureIdentifier().orElse(null);
         assertEquals(
                 AuthorizationFacet.formatNotAuthorizedToEdit(actionId, 
objectManager.getMetaModelContext()),
                 veto.getReasonAsString().orElse(null));
diff --git 
a/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/NewParameterModelTest.java
 
b/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/NewParameterModelTest.java
index 11d650adb40..8069428e9f2 100644
--- 
a/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/NewParameterModelTest.java
+++ 
b/regressiontests/interact/src/test/java/org/apache/causeway/testdomain/interact/NewParameterModelTest.java
@@ -75,7 +75,7 @@ void metamodel_shouldBeValid() {
     void paramAnnotations_whenNpm_shouldBeRecognized(final String mixinName) {
 
         var param0Metamodel = 
startActionInteractionOn(InteractionNpmDemo.class, mixinName, 
Where.OBJECT_FORMS)
-                .getMetamodel().get().getParameters().getElseFail(0);
+                .objectAction().get().getParameterByIndex(0);
 
         // as with first param's @Parameter(maxLength = 2)
         var maxLengthFacet = param0Metamodel.getFacet(MaxLengthFacet.class);
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java
index 02a83ac9c71..03581670d8c 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java
@@ -161,16 +161,11 @@ public final ActionInteraction actionInteraction() {
     }
 
     public final ObjectAction getMetaModel() {
-
         //[CAUSEWAY-3648] In support of the composite value type's 
'Xxx_default' mixin.
         if(actionMemento==null) {
-            var objectAction = actionInteraction().getMetamodel()
-                .orElseThrow(()->_Exceptions
-                        .noSuchElement("could not resolve action by memberId 
'%s'", memberId));
-            this.actionMemento = objectAction;
-            return objectAction;
+            this.actionMemento = actionInteraction()
+                    .getObjectActionElseFail();
         }
-
         // re-attachment fails, if the owner is not found (eg. deleted entity),
         // hence we return the directly memoized meta-model of the underlying 
action
         return actionMemento;
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/UiParameterWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/UiParameterWkt.java
index 0082c7210df..a353569404e 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/UiParameterWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/act/UiParameterWkt.java
@@ -49,13 +49,9 @@ public ActionInteraction actionInteraction() {
         return getObject();
     }
 
-    public ActionInteractionWkt actionInteractionModel() {
-        return actionInteractionModel;
-    }
-
     @Override
     public UiObject getParentUiModel() {
-        return ()->getOwner();
+        return this::getOwner;
     }
 
     @Override
@@ -65,7 +61,7 @@ public ManagedObject getOwner() {
 
     @Override
     public ObjectActionParameter getMetaModel() {
-        return 
actionInteraction().getMetamodel().get().getParameters().getElseFail(paramIndex);
+        return 
actionInteraction().getObjectActionElseFail().getParameterByIndex(paramIndex);
     }
 
     @Override

Reply via email to