Skip to content

Commit 4d00401

Browse files
authored
Merge pull request #3622 from apache/4035-qual.valsem.choices
CAUSEWAY-4035: Honor Qualified ValueSemantics when rendering Choices
2 parents a1e270a + c842d3c commit 4d00401

15 files changed

Lines changed: 120 additions & 113 deletions

File tree

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedAction.java

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
*/
1919
package org.apache.causeway.core.metamodel.interactions.managed;
2020

21-
import java.io.Serializable;
2221
import java.util.Optional;
2322

2423
import org.jspecify.annotations.NonNull;
@@ -38,14 +37,10 @@
3837
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
3938
import org.apache.causeway.core.metamodel.object.ManagedObject;
4039
import org.apache.causeway.core.metamodel.object.ManagedObjects;
41-
import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
42-
import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
4340
import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
4441
import org.apache.causeway.core.metamodel.spec.feature.ObjectMember.AuthorizationException;
4542

46-
import lombok.AccessLevel;
4743
import lombok.Getter;
48-
import lombok.RequiredArgsConstructor;
4944
import lombok.SneakyThrows;
5045

5146
public final class ManagedAction extends ManagedMember {
@@ -167,9 +162,8 @@ public final ManagedObject invokeWithRuleChecking(
167162

168163
private ManagedObject route(final @Nullable ManagedObject actionResult) {
169164

170-
if(ManagedObjects.isNullOrUnspecifiedOrEmpty(actionResult)) {
165+
if(ManagedObjects.isNullOrUnspecifiedOrEmpty(actionResult))
171166
return ManagedObject.empty(action.getReturnType());
172-
}
173167

174168
var resultPojo = actionResult.getPojo();
175169
var objManager = mmc().getObjectManager();
@@ -206,32 +200,4 @@ private ServiceRegistry getServiceRegistry() {
206200
return mmc().getServiceRegistry();
207201
}
208202

209-
// -- MEMENTO FOR ARGUMENT LIST
210-
211-
public MementoForArgs getMementoForArgs(final Can<ManagedObject> args) {
212-
return MementoForArgs.create(
213-
getMetaModel().getMetaModelContext().getObjectManager(),
214-
args);
215-
}
216-
217-
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
218-
public static class MementoForArgs implements Serializable {
219-
private static final long serialVersionUID = 1L;
220-
221-
static MementoForArgs create(
222-
final ObjectManager objectManager,
223-
final Can<ManagedObject> args) {
224-
return new MementoForArgs(args.map(objectManager::mementifyElseFail));
225-
}
226-
227-
private final Can<ObjectMemento> argsMementos;
228-
229-
public Can<ManagedObject> getArgumentList(final ObjectAction actionMeta) {
230-
var argTypes = actionMeta.getParameterTypes();
231-
var objectManager = actionMeta.getMetaModelContext().getObjectManager();
232-
return argsMementos.zipMap(argTypes, (argMemento, argSpec)->
233-
objectManager.demementify(argMemento));
234-
}
235-
}
236-
237203
}

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/Bookmarkable.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@
2121
import java.io.Serializable;
2222
import java.util.Optional;
2323

24+
import org.jspecify.annotations.Nullable;
25+
2426
import org.apache.causeway.applib.services.bookmark.Bookmark;
2527
import org.apache.causeway.commons.internal.base._Casts;
2628
import org.apache.causeway.commons.internal.exceptions._Exceptions;
2729
import org.apache.causeway.core.metamodel.object.ManagedObject.Specialization.BookmarkPolicy;
2830
import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
2931
import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
32+
import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
3033

3134
public interface Bookmarkable {
3235

@@ -67,9 +70,9 @@ default Optional<Bookmark> refreshBookmark() {
6770
* with an additional memorized object title, based on whether
6871
* is supported and a {@link Bookmark} is available.
6972
*/
70-
Optional<ObjectMemento> getMemento();
71-
default ObjectMemento getMementoElseFail() {
72-
return getMemento()
73+
Optional<ObjectMemento> getMemento(final @Nullable ObjectFeature feature);
74+
default ObjectMemento getMementoElseFail(final @Nullable ObjectFeature feature) {
75+
return getMemento(feature)
7376
.orElseThrow(()->_Exceptions.illegalState("failed to create memento for %s", this));
7477
}
7578

@@ -83,7 +86,7 @@ static interface NoBookmark extends Bookmarkable {
8386
@Override default boolean isBookmarkSupported() { return false; }
8487
@Override default Optional<Bookmark> getBookmark() { return Optional.empty(); }
8588
@Override default boolean isBookmarkMemoized() { return false; }
86-
@Override default Optional<ObjectMemento> getMemento() { return Optional.empty(); }
89+
@Override default Optional<ObjectMemento> getMemento(final @Nullable ObjectFeature feature) { return Optional.empty(); }
8790
}
8891

8992
static interface BookmarkRefreshable extends Bookmarkable {

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectEmpty.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
import java.util.Optional;
2222

2323
import org.jspecify.annotations.NonNull;
24+
import org.jspecify.annotations.Nullable;
2425

2526
import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
2627
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
28+
import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
2729

2830
/**
2931
* (package private) specialization corresponding to {@link Specialization#EMPTY}
@@ -49,7 +51,7 @@ public String getTitle() {
4951
}
5052

5153
@Override
52-
public Optional<ObjectMemento> getMemento() {
54+
public Optional<ObjectMemento> getMemento(final @Nullable ObjectFeature feature) {
5355
return Optional.of(ObjectMemento.empty(objSpec().logicalType()));
5456
}
5557

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectEntity.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.function.Consumer;
2424

2525
import org.jspecify.annotations.NonNull;
26+
import org.jspecify.annotations.Nullable;
2627

2728
import org.apache.causeway.applib.exceptions.unrecoverable.ObjectNotFoundException;
2829
import org.apache.causeway.applib.services.bookmark.Bookmark;
@@ -32,6 +33,7 @@
3233
import org.apache.causeway.core.metamodel.facets.object.title.TitleRenderRequest;
3334
import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
3435
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
36+
import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
3537

3638
import lombok.SneakyThrows;
3739
import lombok.extern.slf4j.Slf4j;
@@ -77,9 +79,9 @@ private static Optional<PhaseState> transitionAdvice(final PhaseState previous,
7779
case TRANSIENT->{
7880
var stayTransient = !entityState.isRemoved()
7981
&& !entityState.isAttached();
80-
if(stayTransient) yield Optional.empty();
81-
if(entityState.hasOid()) yield Optional.of(PhaseState.BOOKMARKED);
82-
if(entityState.isTransientOrRemoved()) yield Optional.of(PhaseState.REMOVED);
82+
if(stayTransient){yield Optional.empty();}
83+
if(entityState.hasOid()){yield Optional.of(PhaseState.BOOKMARKED);}
84+
if(entityState.isTransientOrRemoved()){yield Optional.of(PhaseState.REMOVED);}
8385
yield Optional.empty();
8486
}
8587
case BOOKMARKED->entityState.isTransientOrRemoved()
@@ -112,8 +114,8 @@ public String getTitle() {
112114
}
113115

114116
@Override
115-
public Optional<ObjectMemento> getMemento() {
116-
return Optional.ofNullable(ObjectMemento.singularOrEmpty(this));
117+
public Optional<ObjectMemento> getMemento(final @Nullable ObjectFeature feature) {
118+
return Optional.ofNullable(ObjectMemento.singularOrEmpty(feature, this));
117119
}
118120

119121
@Override

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@
2222
import java.util.Optional;
2323

2424
import org.jspecify.annotations.NonNull;
25+
import org.jspecify.annotations.Nullable;
2526

2627
import org.apache.causeway.applib.services.bookmark.Bookmark;
2728
import org.apache.causeway.commons.internal.assertions._Assert;
2829
import org.apache.causeway.core.metamodel.facets.object.title.TitleRenderRequest;
2930
import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
3031
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
32+
import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
3133

3234
/**
3335
* (package private) specialization corresponding to {@link Specialization#SERVICE}
@@ -58,8 +60,8 @@ public boolean isBookmarkMemoized() {
5860
}
5961

6062
@Override
61-
public Optional<ObjectMemento> getMemento() {
62-
return ObjectMemento.singular(this);
63+
public Optional<ObjectMemento> getMemento(final @Nullable ObjectFeature feature) {
64+
return ObjectMemento.singular(feature, this);
6365
}
6466

6567
@Override

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectValue.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Optional;
2323

2424
import org.jspecify.annotations.NonNull;
25+
import org.jspecify.annotations.Nullable;
2526

2627
import org.apache.causeway.applib.services.bookmark.Bookmark;
2728
import org.apache.causeway.commons.internal.assertions._Assert;
@@ -31,6 +32,7 @@
3132
import org.apache.causeway.core.metamodel.facets.object.value.ValueSerializer.Format;
3233
import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
3334
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
35+
import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
3436

3537
/**
3638
* (package private) specialization corresponding to {@link Specialization#VALUE}
@@ -61,8 +63,8 @@ public boolean isBookmarkMemoized() {
6163
}
6264

6365
@Override
64-
public Optional<ObjectMemento> getMemento() {
65-
return ObjectMemento.singular(this);
66+
public Optional<ObjectMemento> getMemento(final @Nullable ObjectFeature feature) {
67+
return ObjectMemento.singular(feature, this);
6668
}
6769

6870
@Override

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectViewmodel.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.causeway.core.metamodel.facets.object.title.TitleRenderRequest;
3636
import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
3737
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
38+
import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
3839

3940
/**
4041
* (package private) specialization corresponding to {@link Specialization#VIEWMODEL}
@@ -57,7 +58,7 @@ record ManagedObjectViewmodel(
5758
this(
5859
objSpec,
5960
new TransientObjectRef<>(pojo),
60-
new TransientObjectRef<TransactionId>(null),
61+
new TransientObjectRef<>(null),
6162
null);
6263
bookmarkIfKnown.ifPresent(bookmarkLazy::set);
6364
}
@@ -77,8 +78,8 @@ record ManagedObjectViewmodel(
7778
}
7879

7980
@Override
80-
public Optional<ObjectMemento> getMemento() {
81-
return ObjectMemento.singular(this);
81+
public Optional<ObjectMemento> getMemento(final @Nullable ObjectFeature feature) {
82+
return ObjectMemento.singular(feature, this);
8283
}
8384

8485
@Override

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmValueUtils.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.util.Optional;
2222

23+
import org.jspecify.annotations.NonNull;
2324
import org.jspecify.annotations.Nullable;
2425

2526
import org.apache.causeway.applib.value.semantics.Renderer;
@@ -31,7 +32,6 @@
3132
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
3233
import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
3334

34-
import org.jspecify.annotations.NonNull;
3535
import lombok.experimental.UtilityClass;
3636

3737
@UtilityClass
@@ -55,25 +55,39 @@ public Optional<ValueSemanticsProvider.Context> createValueSemanticsContext(
5555

5656
// -- RENDERER
5757

58+
public String titleStringForValueType(
59+
final @Nullable ObjectFeature feature,
60+
final @Nullable ManagedObject mo) {
61+
return render(feature, mo, Renderer::titlePresentation);
62+
}
63+
5864
public String htmlStringForValueType(
5965
final @Nullable ObjectFeature feature,
60-
final @Nullable ManagedObject adapter) {
66+
final @Nullable ManagedObject mo) {
67+
return render(feature, mo, Renderer::htmlPresentation);
68+
}
69+
70+
private interface RenderingFun {
71+
String render(Renderer<Object> renderer, ValueSemanticsProvider.Context context, Object pojo);
72+
}
6173

62-
if(!ManagedObjects.isSpecified(adapter)) return "";
74+
private String render(
75+
final @Nullable ObjectFeature feature,
76+
final @Nullable ManagedObject mo,
77+
final RenderingFun renderingFun) {
78+
if(!ManagedObjects.isSpecified(mo)) return "";
6379

64-
var spec = adapter.objSpec();
80+
var spec = mo.objSpec();
6581
var valueFacet = spec.valueFacet().orElse(null);
66-
if(valueFacet==null) {
67-
return String.format("missing ValueFacet %s", spec.getCorrespondingClass());
68-
}
82+
if(valueFacet==null)
83+
return "missing ValueFacet %s".formatted(spec.getCorrespondingClass());
6984

7085
@SuppressWarnings("unchecked")
7186
var renderer = (Renderer<Object>) valueFacet.selectRendererForFeature(feature).orElse(null);
72-
if(renderer==null) {
73-
return String.format("missing Renderer %s", spec.getCorrespondingClass());
74-
}
87+
if(renderer==null)
88+
return "missing Renderer %s".formatted(spec.getCorrespondingClass());
7589

76-
return renderer.htmlPresentation(valueFacet.createValueSemanticsContext(feature), adapter.getPojo());
90+
return renderingFun.render(renderer, valueFacet.createValueSemanticsContext(feature), mo.getPojo());
7791
}
7892

7993
// -- TEMPORAL SUPPORT

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/PackedManagedObject.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.apache.causeway.commons.internal.assertions._Assert;
3030
import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
3131
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
32+
import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
3233

3334
/**
3435
* 'Collection' of {@link ManagedObject}s.
@@ -54,8 +55,8 @@ public PackedManagedObject(
5455
@Override
5556
public String getTitle() {
5657
return nonScalar.stream()
57-
.map(ManagedObject::getTitle)
58-
.collect(Collectors.joining(","));
58+
.map(ManagedObject::getTitle)
59+
.collect(Collectors.joining(","));
5960
}
6061

6162
@Override
@@ -67,9 +68,9 @@ public Object getPojo() {
6768
}
6869

6970
@Override
70-
public Optional<ObjectMemento> getMemento() {
71+
public Optional<ObjectMemento> getMemento(final @Nullable ObjectFeature feature) {
7172
var listOfMementos = nonScalar.stream()
72-
.map(scalar->scalar.getMementoElseFail())
73+
.map(scalar->scalar.getMementoElseFail(feature))
7374
.collect(Collectors.toCollection(ArrayList::new)); // ArrayList is serializable
7475
var memento = ObjectMemento.packed(
7576
logicalType(),

0 commit comments

Comments
 (0)