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 fdb30163aef CAUSEWAY-3859: no longer require proxy for composite value 
edit actions
fdb30163aef is described below

commit fdb30163aef7d6b62a1c51551b63a3af28e23a65
Author: Andi Huber <[email protected]>
AuthorDate: Fri Feb 28 15:41:32 2025 +0100

    CAUSEWAY-3859: no longer require proxy for composite value edit actions
    
    - also enforce INLINE_AS_IF_EDIT on such actions
---
 .../core/metamodel/facetapi/FacetUtil.java         | 43 ++++++++---
 .../PromptStyleFacetForActionLayoutAnnotation.java | 83 ++++++--------------
 .../layout/PromptStyleFacetForActionLayoutXml.java | 20 ++---
 .../promptStyle/PromptStyleFacetAbstract.java      |  8 ++
 .../promptStyle/PromptStyleFacetAsConfigured.java  | 17 ++---
 ... => PromptStyleFacetForCompositeValueEdit.java} | 18 +----
 .../facets/object/value/CompositeValueUpdater.java | 36 ++++++---
 .../facets/object/value/ValueFacetAbstract.java    |  4 +-
 ...romptStyleFacetForPropertyLayoutAnnotation.java | 88 +++++++---------------
 .../PromptStyleFacetForPropertyLayoutXml.java      | 19 +----
 .../services/grid/GridSystemServiceAbstract.java   |  4 +-
 .../interaction/act/ActionInteractionWkt.java      |  6 +-
 12 files changed, 144 insertions(+), 202 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetUtil.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetUtil.java
index 000b7ce727e..ff5bc5daf3c 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetUtil.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/FacetUtil.java
@@ -20,11 +20,14 @@
 
 import java.util.Optional;
 import java.util.function.BiConsumer;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
+
 import org.springframework.util.ClassUtils;
 
 import org.apache.causeway.commons.internal.base._NullSafe;
@@ -33,7 +36,6 @@
 import org.apache.causeway.core.metamodel.facetapi.Facet.Precedence;
 import org.apache.causeway.core.metamodel.util.snapshot.XmlSchema;
 
-import org.jspecify.annotations.NonNull;
 import lombok.experimental.UtilityClass;
 
 @UtilityClass
@@ -56,9 +58,8 @@ public static <F extends Facet> F addFacet(final @NonNull F 
facet) {
      * @return the argument as is - or just in case if null converted to an 
Optional.empty()
      */
     public static <F extends Facet> Optional<F> addFacetIfPresent(final 
@Nullable Optional<F> facetIfAny) {
-        if (facetIfAny == null) {
-            return Optional.empty();
-        }
+        if (facetIfAny == null) return Optional.empty();
+
         facetIfAny
             .ifPresent(facet->facet.getFacetHolder().addFacet(facet));
         return facetIfAny;
@@ -106,17 +107,14 @@ public void visit(final BiConsumer<Class<T>, T> 
elementConsumer) {
      * then adds given facet to its facetHolder, honoring precedence.
      */
     public static void updateFacet(final @Nullable Facet facet) {
-        if(facet==null) {
-            return;
-        }
+        if(facet==null) return;
+
         final boolean skip = 
facet.getFacetHolder().lookupFacet(facet.facetType())
                 .map(Facet::getPrecedence)
                 .map(Facet.Precedence::ordinal)
                 .map(ordinal -> ordinal>facet.getPrecedence().ordinal())
                 .orElse(false);
-        if(skip) {
-            return;
-        }
+        if(skip) return;
 
         purgeIf(facet.facetType(), facet.getClass()::isInstance, 
facet.getFacetHolder());
         addFacet(facet);
@@ -206,4 +204,29 @@ public static <F extends Facet> Optional<F> 
lookupFacetInButExcluding(
                 : a);
     }
 
+    /**
+     * Looks up the exact facet class and if found returns it,
+     * otherwise creates it via the factory and automatically wires it to its 
holder.
+     * <p>
+     * Only exception is, when there already exists a facet with higher 
precedence, in which case
+     * an empty optional is returned.
+     */
+    public static <E extends T, T extends Facet> Optional<E> 
computeIfAbsentExact(
+            final FacetHolder facetHolder,
+            final Class<T> facetType,
+            final Class<E> facetExactClass,
+            final Precedence overrideUpToIncluding,
+            final Function<FacetHolder, E> facetFactory) {
+
+        T winnerFacet = facetHolder.lookupFacet(facetType).orElse(null);
+        if(winnerFacet==null) return 
Optional.of(addFacet(facetFactory.apply(facetHolder)));
+        if(winnerFacet.getClass().equals(facetExactClass)) return 
Optional.of(winnerFacet).map(facetExactClass::cast);
+        // check if we are allowed to override based on precedence
+        
if(winnerFacet.getPrecedence().ordinal()<=overrideUpToIncluding.ordinal()) {
+            return Optional.of(addFacet(facetFactory.apply(facetHolder)));
+        }
+        // not allowed to override
+        return Optional.empty();
+    }
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
index 5dbec407e84..96a29544ba5 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
@@ -19,76 +19,49 @@
 package org.apache.causeway.core.metamodel.facets.actions.layout;
 
 import java.util.Optional;
-import java.util.function.BiConsumer;
 
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.PromptStyle;
-import org.apache.causeway.commons.internal.base._Optionals;
 import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
 import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacetAsConfigured;
 
-public class PromptStyleFacetForActionLayoutAnnotation
+public final class PromptStyleFacetForActionLayoutAnnotation
 extends PromptStyleFacetAbstract {
 
-    private final PromptStyle promptStyle;
-
-    public PromptStyleFacetForActionLayoutAnnotation(final PromptStyle 
promptStyle, final FacetHolder holder) {
-        super( holder );
-        this.promptStyle = promptStyle;
-    }
-
     public static Optional<PromptStyleFacet> create(
             final Optional<ActionLayout> actionLayoutIfAny,
             final CausewayConfiguration configuration,
             final FacetHolder holder) {
 
-        return _Optionals.<PromptStyleFacet>orNullable(
-
-        actionLayoutIfAny
-        .map(ActionLayout::promptStyle)
-        .filter(promptStyle -> promptStyle != PromptStyle.NOT_SPECIFIED)
-        .map(promptStyle -> {
-
-            switch (promptStyle) {
-            case DIALOG:
-            case DIALOG_MODAL:
-            case DIALOG_SIDEBAR:
-            case INLINE:
-            case INLINE_AS_IF_EDIT:
-                return new 
PromptStyleFacetForActionLayoutAnnotation(promptStyle, holder);
-
-            case AS_CONFIGURED:
-
-                // do not replace
-                if (holder.containsNonFallbackFacet(PromptStyleFacet.class)) {
-                    return null;
-                }
-
-                promptStyle = 
configuration.getViewer().getWicket().getPromptStyle();
-                return new PromptStyleFacetAsConfigured(promptStyle, holder);
-            default:
-                throw new IllegalStateException("promptStyle '" + promptStyle 
+ "' not recognised");
-            }
-
-        })
-
-        ,
-
-        () -> {
-            // do not replace
-            if (holder.containsNonFallbackFacet(PromptStyleFacet.class)) {
-                return null;
-            }
-
-            PromptStyle promptStyle = 
configuration.getViewer().getWicket().getPromptStyle();
-            return new PromptStyleFacetAsConfigured(promptStyle, holder);
-        }
-
+        return Optional.ofNullable(
+            actionLayoutIfAny
+                .map(ActionLayout::promptStyle)
+                .filter(promptStyle -> promptStyle != 
PromptStyle.NOT_SPECIFIED)
+                .map(promptStyle -> switch (promptStyle) {
+                    case DIALOG, DIALOG_MODAL, DIALOG_SIDEBAR, INLINE, 
INLINE_AS_IF_EDIT->
+                        new 
PromptStyleFacetForActionLayoutAnnotation(promptStyle, holder);
+                    case AS_CONFIGURED->
+                        holder.containsNonFallbackFacet(PromptStyleFacet.class)
+                            ? null // do not replace
+                            : new PromptStyleFacetAsConfigured(configuration, 
holder);
+                    case NOT_SPECIFIED -> null; // unexpected code reach
+                })
+                .orElseGet(() ->
+                    // do not replace
+                    holder.containsNonFallbackFacet(PromptStyleFacet.class)
+                        ? null
+                        : new PromptStyleFacetAsConfigured(configuration, 
holder))
         );
+    }
 
+    private final PromptStyle promptStyle;
+
+    private PromptStyleFacetForActionLayoutAnnotation(final PromptStyle 
promptStyle, final FacetHolder holder) {
+        super(holder);
+        this.promptStyle = promptStyle;
     }
 
     @Override
@@ -96,10 +69,4 @@ public PromptStyle value() {
         return promptStyle;
     }
 
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("promptStyle", promptStyle);
-    }
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutXml.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutXml.java
index 6e69ed483cf..d42a48f7c91 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutXml.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutXml.java
@@ -19,7 +19,6 @@
 package org.apache.causeway.core.metamodel.facets.actions.layout;
 
 import java.util.Optional;
-import java.util.function.BiConsumer;
 
 import org.apache.causeway.applib.annotation.PromptStyle;
 import org.apache.causeway.applib.layout.component.ActionLayoutData;
@@ -27,20 +26,17 @@
 import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
 
-public class PromptStyleFacetForActionLayoutXml
+public final class PromptStyleFacetForActionLayoutXml
 extends PromptStyleFacetAbstract {
 
     public static Optional<PromptStyleFacet> create(
             final ActionLayoutData actionLayout,
             final FacetHolder holder,
             final Precedence precedence) {
-        if(actionLayout == null) {
-            return Optional.empty();
-        }
-        final PromptStyle promptStyle = actionLayout.getPromptStyle();
-        return promptStyle != null
-                ? Optional.of(new 
PromptStyleFacetForActionLayoutXml(promptStyle, holder, precedence))
-                : Optional.empty();
+
+        return Optional.ofNullable(actionLayout)
+            .map(ActionLayoutData::getPromptStyle)
+            .map(promptStyle->new 
PromptStyleFacetForActionLayoutXml(promptStyle, holder, precedence));
     }
 
     private final PromptStyle promptStyle;
@@ -60,10 +56,4 @@ public boolean isObjectTypeSpecific() {
         return true;
     }
 
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("promptStyle", promptStyle);
-    }
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAbstract.java
index cc9e7f00ea3..dfe4a0f3feb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAbstract.java
@@ -18,6 +18,8 @@
  */
 package org.apache.causeway.core.metamodel.facets.object.promptStyle;
 
+import java.util.function.BiConsumer;
+
 import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
@@ -37,4 +39,10 @@ protected PromptStyleFacetAbstract(final FacetHolder holder, 
final Facet.Precede
         super( type(), holder, precedence);
     }
 
+    @Override
+    public final void visitAttributes(final BiConsumer<String, Object> 
visitor) {
+        super.visitAttributes(visitor);
+        visitor.accept("promptStyle", value());
+    }
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAsConfigured.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAsConfigured.java
index 6b3e0d4cc9f..c4915141fb6 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAsConfigured.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAsConfigured.java
@@ -18,17 +18,20 @@
  */
 package org.apache.causeway.core.metamodel.facets.object.promptStyle;
 
-import java.util.function.BiConsumer;
-
 import org.apache.causeway.applib.annotation.PromptStyle;
+import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 
-public class PromptStyleFacetAsConfigured
+public final class PromptStyleFacetAsConfigured
 extends PromptStyleFacetAbstract {
 
     private final PromptStyle promptStyle;
 
-    public PromptStyleFacetAsConfigured(final PromptStyle promptStyle, final 
FacetHolder holder) {
+    public PromptStyleFacetAsConfigured(final CausewayConfiguration 
configuration, final FacetHolder holder) {
+        this(configuration.getViewer().getWicket().getPromptStyle(), holder);
+    }
+
+    private PromptStyleFacetAsConfigured(final PromptStyle promptStyle, final 
FacetHolder holder) {
         super(holder);
         this.promptStyle = promptStyle;
     }
@@ -37,10 +40,4 @@ public PromptStyleFacetAsConfigured(final PromptStyle 
promptStyle, final FacetHo
         return promptStyle;
     }
 
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("promptStyle", promptStyle);
-    }
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAsConfigured.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetForCompositeValueEdit.java
similarity index 68%
copy from 
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAsConfigured.java
copy to 
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetForCompositeValueEdit.java
index 6b3e0d4cc9f..0491faf95e6 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetAsConfigured.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/promptStyle/PromptStyleFacetForCompositeValueEdit.java
@@ -18,29 +18,19 @@
  */
 package org.apache.causeway.core.metamodel.facets.object.promptStyle;
 
-import java.util.function.BiConsumer;
-
 import org.apache.causeway.applib.annotation.PromptStyle;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 
-public class PromptStyleFacetAsConfigured
+public final class PromptStyleFacetForCompositeValueEdit
 extends PromptStyleFacetAbstract {
 
-    private final PromptStyle promptStyle;
-
-    public PromptStyleFacetAsConfigured(final PromptStyle promptStyle, final 
FacetHolder holder) {
-        super(holder);
-        this.promptStyle = promptStyle;
+    public PromptStyleFacetForCompositeValueEdit(final FacetHolder holder) {
+        super(holder, Precedence.SYNTHESIZED); // overrules xml layout
     }
 
     @Override public PromptStyle value() {
-        return promptStyle;
+        return PromptStyle.INLINE_AS_IF_EDIT;
     }
 
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("promptStyle", promptStyle);
-    }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
index edf2abe8f51..da47a94b1af 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/CompositeValueUpdater.java
@@ -22,13 +22,16 @@
 import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.delegate._Delegate;
 import org.apache.causeway.core.metamodel.commons.CanonicalInvoker;
 import org.apache.causeway.core.metamodel.commons.ParameterConverters;
 import org.apache.causeway.core.metamodel.consent.Allow;
 import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.causeway.core.metamodel.facetapi.Facet.Precedence;
+import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
 import org.apache.causeway.core.metamodel.facets.HasFacetedMethod;
+import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
+import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacetForCompositeValueEdit;
 import 
org.apache.causeway.core.metamodel.facets.object.value.CompositeValueUpdater.CompositeValueUpdaterForParameter;
 import 
org.apache.causeway.core.metamodel.facets.object.value.CompositeValueUpdater.CompositeValueUpdaterForProperty;
 import org.apache.causeway.core.metamodel.interactions.InteractionHead;
@@ -42,10 +45,7 @@
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 
 /**
- * Implementations are proxied in support of composite value types.
- * <p>
- * @implSpec The proxy mimics an {@link ObjectAction},
- *      hence extending {@link HasObjectAction} for delegation to {@link 
#mixedInAction()}.
+ * Implementations are implementing {@link HasObjectAction} and delegating to 
{@link #mixedInAction()}.
  */
 public sealed interface CompositeValueUpdater extends HasObjectAction
 permits CompositeValueUpdaterForProperty, CompositeValueUpdaterForParameter {
@@ -57,9 +57,19 @@ public sealed interface CompositeValueUpdater extends 
HasObjectAction
     // HasObjectAction
     @Override default ObjectAction getObjectAction() { return mixedInAction(); 
}
 
+    // makes sure PromptStyle is always INLINE_AS_IF_EDIT
+    default CompositeValueUpdater overrideFacets() {
+        FacetUtil.computeIfAbsentExact(mixedInAction().getFacetHolder(),
+            PromptStyleFacet.class,
+            PromptStyleFacetForCompositeValueEdit.class,
+            Precedence.HIGH,
+            PromptStyleFacetForCompositeValueEdit::new);
+        return this;
+    }
+
     // -- OBJECT ACTION MOCKUP
 
-    @Override default String getId() { return 
"proxiedCompositeValueUpdaterAction"; }
+    @Override default String getId() { return 
"delegatedCompositeValueUpdaterAction"; }
     @Override default Consent isVisible(final ManagedObject a, final 
InteractionInitiatedBy b, final Where c) { return Allow.DEFAULT; }
     @Override default Consent isUsable(final ManagedObject a, final 
InteractionInitiatedBy b, final Where c) { return Allow.DEFAULT; }
     @Override default PromptStyle getPromptStyle() { return 
PromptStyle.INLINE_AS_IF_EDIT; }
@@ -88,6 +98,7 @@ public ManagedObject map(final ManagedObject newParamValue) {
             parameterNegotiationModel.setParamValue(paramIndex, newParamValue);
             return newParamValue;
         }
+
     }
 
     record CompositeValueUpdaterForProperty(
@@ -107,23 +118,24 @@ public ManagedObject map(final ManagedObject valueType) {
             propNeg.submit();
             return managedProperty.getOwner();
         }
+
     }
 
     // -- FACTORIES
 
-    static ObjectAction createProxyForParameter(
+    static ObjectAction createDelegatorForParameter(
         final ParameterNegotiationModel parameterNegotiationModel,
         final int paramIndex,
         final MixedInAction mixedInAction) {
-        return _Delegate.createProxy(ObjectAction.class,
-                new 
CompositeValueUpdaterForParameter(parameterNegotiationModel, paramIndex, 
mixedInAction));
+        return new 
CompositeValueUpdaterForParameter(parameterNegotiationModel, paramIndex, 
mixedInAction)
+            .overrideFacets();
     }
 
-    static ObjectAction createProxyForProperty(
+    static ObjectAction createDelegatorForProperty(
         final ManagedProperty managedProperty,
         final MixedInAction mixedInAction) {
-        return _Delegate.createProxy(ObjectAction.class,
-                new CompositeValueUpdaterForProperty(managedProperty, 
mixedInAction));
+        return new CompositeValueUpdaterForProperty(managedProperty, 
mixedInAction)
+            .overrideFacets();
     }
 
     // -- HELPER
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueFacetAbstract.java
index 779e1eb0af7..337c1347765 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -258,7 +258,7 @@ public Optional<ObjectAction> 
selectCompositeValueMixinForParameter(
         //feed the action's invocation result back into the parameter 
negotiation model of the parent edit dialog
         return 
resolveCompositeValueMixinForFeature(parameterNegotiationModel.getParamMetamodel(paramIndex))
                 .map(m->CompositeValueUpdater
-                        .createProxyForParameter(parameterNegotiationModel, 
paramIndex, (MixedInAction)m));
+                        
.createDelegatorForParameter(parameterNegotiationModel, paramIndex, 
(MixedInAction)m));
     }
 
     @Override
@@ -267,7 +267,7 @@ public Optional<ObjectAction> 
selectCompositeValueMixinForProperty(final Managed
 
         //feed the action's invocation result back into the attributeModel's 
proposed value, then submit
         return 
resolveCompositeValueMixinForFeature(managedProperty.getProperty())
-                
.map(m->CompositeValueUpdater.createProxyForProperty(managedProperty, 
(MixedInAction)m));
+                
.map(m->CompositeValueUpdater.createDelegatorForProperty(managedProperty, 
(MixedInAction)m));
     }
 
     // -- UTILITY
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
index da6135072df..1f93c1a5097 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
@@ -19,11 +19,9 @@
 package org.apache.causeway.core.metamodel.facets.properties.propertylayout;
 
 import java.util.Optional;
-import java.util.function.BiConsumer;
 
 import org.apache.causeway.applib.annotation.PromptStyle;
 import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.commons.internal.base._Optionals;
 import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
@@ -32,72 +30,48 @@
 import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
 import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacetAsConfigured;
 
-public class PromptStyleFacetForPropertyLayoutAnnotation
+public final class PromptStyleFacetForPropertyLayoutAnnotation
 extends PromptStyleFacetAbstract {
 
-    private final PromptStyle promptStyle;
-
-    public PromptStyleFacetForPropertyLayoutAnnotation(final PromptStyle 
promptStyle, final FacetHolder holder) {
-        super( holder );
-        this.promptStyle = promptStyle;
-    }
-
     public static Optional<PromptStyleFacet> create(
             final Optional<PropertyLayout> propertyLayoutIfAny,
             final CausewayConfiguration configuration,
             final FacetHolder holder) {
 
         // guard against member not being a property
-        if(holder instanceof FacetedMethod) {
-            final FacetedMethod facetedMethod = (FacetedMethod) holder;
-            if(facetedMethod.featureType() != FeatureType.PROPERTY) {
-                return Optional.empty();
-            }
+        if(holder instanceof FacetedMethod facetedMethod
+                && facetedMethod.featureType() != FeatureType.PROPERTY) {
+            return Optional.empty();
         }
 
-        return _Optionals.orNullable(
+        return Optional.ofNullable(
 
             propertyLayoutIfAny
-            .map(PropertyLayout::promptStyle)
-            .filter(promptStyle -> promptStyle != PromptStyle.NOT_SPECIFIED)
-            .map(promptStyle -> {
-
-                switch (promptStyle) {
-                case DIALOG:
-                case DIALOG_MODAL:
-                case DIALOG_SIDEBAR:
-                case INLINE:
-                    return new 
PromptStyleFacetForPropertyLayoutAnnotation(promptStyle, holder);
-                case INLINE_AS_IF_EDIT:
-                    return new 
PromptStyleFacetForPropertyLayoutAnnotation(PromptStyle.INLINE, holder);
-
-                case AS_CONFIGURED:
-
-                    // do not replace
-                    if 
(holder.containsNonFallbackFacet(PromptStyleFacet.class)) {
-                        return null;
-                    }
-
-                    promptStyle = 
configuration.getViewer().getWicket().getPromptStyle();
-                    return new PromptStyleFacetAsConfigured(promptStyle, 
holder);
-                default:
-                }
-                throw new IllegalStateException("promptStyle '" + promptStyle 
+ "' not recognised");
-            })
-
-            ,
-
-            () -> {
+                .map(PropertyLayout::promptStyle)
+                .filter(promptStyle -> promptStyle != 
PromptStyle.NOT_SPECIFIED)
+                .map(promptStyle -> switch (promptStyle) {
+                    case DIALOG, DIALOG_MODAL, DIALOG_SIDEBAR, INLINE->
+                        new 
PromptStyleFacetForPropertyLayoutAnnotation(promptStyle, holder);
+                    case INLINE_AS_IF_EDIT->
+                        new 
PromptStyleFacetForPropertyLayoutAnnotation(PromptStyle.INLINE, holder);
+                    case AS_CONFIGURED->
+                        holder.containsNonFallbackFacet(PromptStyleFacet.class)
+                            ? null // do not replace
+                            : new PromptStyleFacetAsConfigured(configuration, 
holder);
+                    case NOT_SPECIFIED -> null; // unexpected code reach
+                })
+                .orElseGet(() ->
+                    holder.containsNonFallbackFacet(PromptStyleFacet.class)
+                        ? null // do not replace
+                        : new PromptStyleFacetAsConfigured(configuration, 
holder))
+        );
+    }
 
-                // do not replace
-                if (holder.containsNonFallbackFacet(PromptStyleFacet.class)) {
-                    return null;
-                }
+    private final PromptStyle promptStyle;
 
-                PromptStyle promptStyle = 
configuration.getViewer().getWicket().getPromptStyle();
-                return new PromptStyleFacetAsConfigured(promptStyle, holder);
-            }
-        );
+    private PromptStyleFacetForPropertyLayoutAnnotation(final PromptStyle 
promptStyle, final FacetHolder holder) {
+        super( holder );
+        this.promptStyle = promptStyle;
     }
 
     @Override
@@ -105,10 +79,4 @@ public PromptStyle value() {
         return promptStyle;
     }
 
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("promptStyle", promptStyle);
-    }
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutXml.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutXml.java
index 37ccb2c1eca..770595fcb1e 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutXml.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutXml.java
@@ -19,7 +19,6 @@
 package org.apache.causeway.core.metamodel.facets.properties.propertylayout;
 
 import java.util.Optional;
-import java.util.function.BiConsumer;
 
 import org.apache.causeway.applib.annotation.PromptStyle;
 import org.apache.causeway.applib.layout.component.PropertyLayoutData;
@@ -27,20 +26,16 @@
 import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import 
org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
 
-public class PromptStyleFacetForPropertyLayoutXml
+public final class PromptStyleFacetForPropertyLayoutXml
 extends PromptStyleFacetAbstract {
 
     public static Optional<PromptStyleFacet> create(
             final PropertyLayoutData propertyLayout,
             final FacetHolder holder,
             final Precedence precedence) {
-        if(propertyLayout == null) {
-            return Optional.empty();
-        }
-        final PromptStyle promptStyle = propertyLayout.getPromptStyle();
-        return promptStyle != null
-                ? Optional.of(new 
PromptStyleFacetForPropertyLayoutXml(promptStyle, holder, precedence))
-                : Optional.empty();
+        return Optional.ofNullable(propertyLayout)
+            .map(PropertyLayoutData::getPromptStyle)
+            .map(promptStyle->new 
PromptStyleFacetForPropertyLayoutXml(promptStyle, holder, precedence));
     }
 
     private final PromptStyle promptStyle;
@@ -61,10 +56,4 @@ public PromptStyle value() {
         return promptStyle;
     }
 
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("promptStyle", promptStyle);
-    }
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridSystemServiceAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridSystemServiceAbstract.java
index 7ec7fa2c396..10c7cd0283d 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -279,9 +279,7 @@ public void visit(final ActionLayoutData actionLayoutData) {
             @Override
             public void visit(final PropertyLayoutData propertyLayoutData) {
                 var oneToOneAssociation = 
oneToOneAssociationById.get(propertyLayoutData.getId());
-                if(oneToOneAssociation == null) {
-                    return;
-                }
+                if(oneToOneAssociation == null) return;
 
                 updateFacetIfPresent(
                         
CssClassFacetForPropertyLayoutXml.create(propertyLayoutData, 
oneToOneAssociation, precedence));
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 e4b06783fbc..be9930f3863 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
@@ -18,7 +18,6 @@
  */
 package org.apache.causeway.viewer.wicket.model.models.interaction.act;
 
-import java.lang.reflect.Proxy;
 import java.util.Optional;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
@@ -32,6 +31,7 @@
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.assertions._Assert;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
+import 
org.apache.causeway.core.metamodel.facets.object.value.CompositeValueUpdater;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ActionInteraction;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
@@ -79,7 +79,7 @@ public class ActionInteractionWkt
      * <p>
      * nullable in support of lazy evaluation
      * <p>
-     * make sure we don't memoize non-serializable ObjectAction proxies (as 
introduced via composite value type support)
+     * make sure we don't memoize non-serializable ObjectAction instances (as 
introduced via composite value type support)
      */
     private @Nullable ObjectAction actionMemento;
     private transient @Nullable ObjectAction objectAction; // might be a proxy 
(non-serializbale)
@@ -138,7 +138,7 @@ private ActionInteractionWkt(
     private void setObjectAction(final ObjectAction objectAction) {
         this.objectAction = objectAction;
         this.actionMemento = objectAction!=null
-                && !Proxy.isProxyClass(objectAction.getClass())
+                && !(objectAction instanceof CompositeValueUpdater)
             ? objectAction
             : null;
     }


Reply via email to