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

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


The following commit(s) were added to refs/heads/master by this push:
     new de5715f9ad ISIS-3112: ValueFacet: support for custom renderer on 
non-scalar members
de5715f9ad is described below

commit de5715f9ad66c2f37611361348af61eea6850709
Author: Andi Huber <[email protected]>
AuthorDate: Fri Aug 5 06:35:28 2022 +0200

    ISIS-3112: ValueFacet: support for custom renderer on non-scalar members
---
 .../title/parser/TitleFacetFromValueFacet.java     | 43 +++++++++++++++-------
 .../metamodel/facets/object/value/ValueFacet.java  |  7 ++++
 .../facets/object/value/ValueFacetAbstract.java    |  9 +++++
 3 files changed, 45 insertions(+), 14 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetFromValueFacet.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetFromValueFacet.java
index b2b68bc016..6be31fdca3 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetFromValueFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetFromValueFacet.java
@@ -28,6 +28,7 @@ import 
org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 import lombok.NonNull;
@@ -61,20 +62,34 @@ implements TitleFacet {
 
         // support for qualified value semantics, requires a 'where' context, 
that is,
         // what property, collection, action return or action param this is to 
be rendered for ...
-
-        if(renderRequest.getFeature() instanceof OneToOneAssociation) {
-            val prop = (OneToOneAssociation)renderRequest.getFeature();
-            final Renderer renderer = valueFacet
-                    .selectRendererForPropertyElseFallback(prop);
-            return renderer
-                    .titlePresentation(valueFacet
-                            .createValueSemanticsContext(prop), pojo);
-        }
-        if(renderRequest.getFeature() instanceof ObjectActionParameter) {
-            val param = (ObjectActionParameter)renderRequest.getFeature();
-            final Renderer renderer = valueFacet
-                    .selectRendererForParameterElseFallback(param);
-            return 
renderer.titlePresentation(valueFacet.createValueSemanticsContext(param), pojo);
+        if(renderRequest.getFeature()!=null) {
+            switch(renderRequest.getFeature().getFeatureType()) {
+            case PROPERTY: {
+                val prop = (OneToOneAssociation)renderRequest.getFeature();
+                final Renderer renderer = valueFacet
+                        .selectRendererForPropertyElseFallback(prop);
+                return renderer
+                        .titlePresentation(valueFacet
+                                .createValueSemanticsContext(prop), pojo);
+            }
+            case COLLECTION: {
+                val coll = (OneToManyAssociation)renderRequest.getFeature();
+                final Renderer renderer = valueFacet
+                        .selectRendererForCollectionElseFallback(coll);
+                return renderer
+                        .titlePresentation(valueFacet
+                                .createValueSemanticsContext(coll), pojo);
+            }
+            case ACTION_PARAMETER_SCALAR:
+            case ACTION_PARAMETER_COLLECTION:{
+                val param = (ObjectActionParameter)renderRequest.getFeature();
+                final Renderer renderer = valueFacet
+                        .selectRendererForParameterElseFallback(param);
+                return 
renderer.titlePresentation(valueFacet.createValueSemanticsContext(param), pojo);
+            }
+            default:
+                // fall through
+            }
         }
 
         // fall back to default value semantics ...
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
index 78caf452d3..49ead1d33c 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
@@ -38,6 +38,7 @@ import 
org.apache.isis.core.metamodel.interactions.managed.ParameterNegotiationM
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -123,6 +124,7 @@ extends
     Optional<Renderer<T>> selectDefaultRenderer();
     Optional<Renderer<T>> selectRendererForParameter(final 
ObjectActionParameter param);
     Optional<Renderer<T>> selectRendererForProperty(final OneToOneAssociation 
prop);
+    Optional<Renderer<T>> selectRendererForCollection(final 
OneToManyAssociation coll);
 
     Renderer<T> fallbackRenderer(Identifier featureIdentifier);
 
@@ -150,6 +152,11 @@ extends
                 .orElseGet(()->fallbackRenderer(prop.getFeatureIdentifier()));
     }
 
+    default Renderer<T> selectRendererForCollectionElseFallback(final 
OneToManyAssociation coll) {
+        return selectRendererForCollection(coll)
+                .orElseGet(()->fallbackRenderer(coll.getFeatureIdentifier()));
+    }
+
     // -- COMPOSITE VALUE SUPPORT
 
     Optional<ObjectAction> selectCompositeValueMixinForParameter(
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
index d706c6074c..3c402b246a 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -50,6 +50,7 @@ import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionMixedIn;
 
@@ -256,6 +257,14 @@ implements ValueFacet<T> {
                 .findFirst();
     }
 
+    @Override
+    public Optional<Renderer<T>> selectRendererForCollection(final 
OneToManyAssociation coll) {
+        return streamValueSemanticsHonoringQualifiers(coll)
+                .map(ValueSemanticsProvider::getRenderer)
+                .filter(_NullSafe::isPresent)
+                .findFirst();
+    }
+
     @Override
     public Renderer<T> fallbackRenderer(final Identifier featureIdentifier) {
         return fallbackRenderer(getLogicalType(), featureIdentifier);

Reply via email to