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