You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/06/21 06:24:33 UTC

[causeway] branch master updated: CAUSEWAY-3451: fix for honoring CollectionLayout#tableDecorator

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/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new 9b4e02a7fa CAUSEWAY-3451: fix for honoring CollectionLayout#tableDecorator
9b4e02a7fa is described below

commit 9b4e02a7fa3b42af402dbc57d1c354683026c3f1
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Jun 21 08:24:28 2023 +0200

    CAUSEWAY-3451: fix for honoring CollectionLayout#tableDecorator
---
 .../tabledec/TableDecoratorFacetAbstract.java      |  6 ++---
 .../core/metamodel/spec/feature/ObjectMember.java  | 15 +++++------
 .../causeway/core/metamodel/util/Facets.java       | 18 ++++++++++++++
 .../entity/collection/EntityCollectionPanel.java   | 29 ++++++++++++++--------
 4 files changed, 44 insertions(+), 24 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/tabledec/TableDecoratorFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/tabledec/TableDecoratorFacetAbstract.java
index bd23aaa8fb..56314de3c5 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/tabledec/TableDecoratorFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/tabledec/TableDecoratorFacetAbstract.java
@@ -18,13 +18,13 @@
  */
 package org.apache.causeway.core.metamodel.facets.object.tabledec;
 
+import java.util.function.BiConsumer;
+
 import org.apache.causeway.applib.annotation.TableDecorator;
 import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import org.apache.causeway.core.metamodel.facets.SingleValueFacetAbstract;
 
-import java.util.function.BiConsumer;
-
 public abstract class TableDecoratorFacetAbstract
 extends SingleValueFacetAbstract<Class<? extends TableDecorator>>
 implements TableDecoratorFacet {
@@ -33,7 +33,6 @@ implements TableDecoratorFacet {
         return TableDecoratorFacet.class;
     }
 
-
     protected TableDecoratorFacetAbstract(
             final Class<? extends TableDecorator> value,
             final FacetHolder holder,
@@ -50,7 +49,6 @@ implements TableDecoratorFacet {
     @Override
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
-        visitor.accept("value", value());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectMember.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectMember.java
index c6b88f5aa8..e7f6cd3f19 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectMember.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectMember.java
@@ -40,7 +40,6 @@ import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
-import org.apache.causeway.core.metamodel.facets.SingleValueFacet;
 import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.causeway.core.metamodel.facets.collections.sortedby.SortedByFacet;
 import org.apache.causeway.core.metamodel.facets.members.layout.group.LayoutGroupFacet;
@@ -49,6 +48,7 @@ import org.apache.causeway.core.metamodel.facets.object.paged.PagedFacet;
 import org.apache.causeway.core.metamodel.facets.object.tabledec.TableDecoratorFacet;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
+import org.apache.causeway.core.metamodel.util.Facets;
 
 import lombok.val;
 
@@ -260,15 +260,12 @@ public interface ObjectMember extends ObjectFeature {
             .findFirst();
     }
 
+    /**
+     * Looks up any {@link TableDecoratorFacet} on the member itself, then on its element-type.
+     * First found wins.
+     */
     default Optional<TableDecorator> getTableDecorator() {
-        return FacetUtil.lookupFacetInButExcluding(TableDecoratorFacet.class, o -> o == TableDecorator.Default.class, getElementType())
-            .stream()
-            .map(SingleValueFacet::value)
-            .map(decoratorClass -> {
-                val decorator = _InstanceUtil.createInstance(decoratorClass, decoratorClass, _Constants.emptyObjects);
-                return injectServicesInto(decorator);
-            })
-            .findFirst();
+        return Facets.tableDecorator(this, getElementType());
     }
 
     // -- COLLECTION SORTING (COLL + NON-SCALAR ACTION RESULT)
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
index 5f4e591c9a..f3a70a2979 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
@@ -30,18 +30,22 @@ import org.apache.causeway.applib.annotation.BookmarkPolicy;
 import org.apache.causeway.applib.annotation.DomainServiceLayout.MenuBar;
 import org.apache.causeway.applib.annotation.LabelPosition;
 import org.apache.causeway.applib.annotation.PromptStyle;
+import org.apache.causeway.applib.annotation.TableDecorator;
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.applib.id.LogicalType;
 import org.apache.causeway.applib.layout.grid.bootstrap.BSGrid;
 import org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal._Constants;
 import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
+import org.apache.causeway.commons.internal.factory._InstanceUtil;
 import org.apache.causeway.core.config.metamodel.facets.ParameterConfigOptions;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
+import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
 import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.causeway.core.metamodel.facets.collections.CollectionFacet;
@@ -56,6 +60,7 @@ import org.apache.causeway.core.metamodel.facets.object.icon.IconFacet;
 import org.apache.causeway.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.causeway.core.metamodel.facets.object.projection.ProjectionFacet;
 import org.apache.causeway.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
+import org.apache.causeway.core.metamodel.facets.object.tabledec.TableDecoratorFacet;
 import org.apache.causeway.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.causeway.core.metamodel.facets.object.value.ValueSerializer;
 import org.apache.causeway.core.metamodel.facets.objectvalue.daterenderedadjust.DateRenderAdjustFacet;
@@ -353,6 +358,19 @@ public final class Facets {
                 .orElseGet(OptionalInt::empty);
     }
 
+    // -- TABLES
+
+    public Optional<TableDecorator> tableDecorator(final FacetHolder ... facetHolders) {
+        return FacetUtil.lookupFacetInButExcluding(TableDecoratorFacet.class, o -> o == TableDecorator.Default.class, facetHolders)
+                .stream()
+                .map(TableDecoratorFacet::value)
+                .map(decoratorClass -> {
+                    val decorator = _InstanceUtil.createInstance(decoratorClass, decoratorClass, _Constants.emptyObjects);
+                    return facetHolders[0].injectServicesInto(decorator);
+                })
+                .findFirst();
+    }
+
     // -- VALUE FACET
 
     public static Predicate<ObjectSpecification> valueTypeMatches(final Predicate<Class<?>> typeMatcher) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
index 9da87e9bf7..a63d1aa802 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
@@ -120,8 +120,7 @@ implements HasDynamicallyVisibleContent {
     // -- HELPER
 
     private void buildGui() {
-
-        val collectionModel = EntityCollectionModelParented.forParentObjectModel(getModel(), layoutData);
+        val collectionModel = entityCollectionModelParented();
         div.setMarkupId("collection-" + collectionModel.getLayoutData().getId());
 
         val collectionMetaModel = collectionModel.getMetaModel();
@@ -138,12 +137,10 @@ implements HasDynamicallyVisibleContent {
             visible = true;
 
             Facets.cssClass(collectionMetaModel, objectAdapter)
-            .ifPresent(cssClass->Wkt.cssAppend(div, cssClass));
+                .ifPresent(cssClass->Wkt.cssAppend(div, cssClass));
 
-            this.tableDecorator = collectionMetaModel.getTableDecorator();
-            tableDecorator.ifPresent(tableDecorator->{
-                    Wkt.cssAppend(div, tableDecorator.cssClass());
-                });
+            tableDecorator().ifPresent(tableDecorator->
+                Wkt.cssAppend(div, tableDecorator.cssClass()));
 
             val collectionPanel = new CollectionPanel(ID_COLLECTION, collectionModel);
             div.addOrReplace(collectionPanel);
@@ -154,7 +151,7 @@ implements HasDynamicallyVisibleContent {
             div.add(labelComponent);
 
             collectionMetaModel.getDescription(collectionModel::getParentObject)
-            .ifPresent(description->WktTooltips.addTooltip(labelComponent, description));
+                .ifPresent(description->WktTooltips.addTooltip(labelComponent, description));
 
             final Can<LinkAndLabel> links = collectionModel.getLinks();
             AdditionalLinksPanel.addAdditionalLinks(
@@ -166,14 +163,24 @@ implements HasDynamicallyVisibleContent {
         }
     }
 
+    // EntityCollectionModelParented caching
+    private transient EntityCollectionModelParented entityCollectionModelParented;
+    private EntityCollectionModelParented entityCollectionModelParented() {
+        if(entityCollectionModelParented == null) {
+            this.entityCollectionModelParented = EntityCollectionModelParented.forParentObjectModel(getModel(), layoutData);
+        }
+        return entityCollectionModelParented;
+    }
+
     // TableDecorator caching
     private transient Optional<TableDecorator> tableDecorator;
     private Optional<TableDecorator> tableDecorator() {
         if(tableDecorator == null) {
-            val collectionModel = EntityCollectionModelParented.forParentObjectModel(getModel(), layoutData);
-            val collectionMetaModel = collectionModel.getMetaModel();
-            this.tableDecorator = collectionMetaModel.getTableDecorator();
+            this.tableDecorator = entityCollectionModelParented()
+                    .getMetaModel()
+                    .getTableDecorator();
         }
+        System.err.printf("tableDecorator %s%n", tableDecorator);
         return tableDecorator;
     }