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