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 11cfa58912 CAUSEWAY-3630: DataTable serialization: keep exact list of 
column-ids
11cfa58912 is described below

commit 11cfa5891253fd6b22111dda67d29df223efdb2a
Author: Andi Huber <[email protected]>
AuthorDate: Wed Mar 6 14:10:17 2024 +0100

    CAUSEWAY-3630: DataTable serialization: keep exact list of column-ids
    
    - also restore prev. behavior of DataTableProvider, that is, only
    include non-mixed-in properties that are enabled for snapshots
---
 .../core/metamodel/tabular/simple/DataTable.java   | 29 +++++++++++++++++++++-
 .../causeway/tabular/applib/DataTableProvider.java | 12 ++++++---
 2 files changed, 36 insertions(+), 5 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/simple/DataTable.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/simple/DataTable.java
index 49c36943b7..0f8ace874c 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/simple/DataTable.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/simple/DataTable.java
@@ -27,11 +27,13 @@ import java.util.stream.Stream;
 
 import org.springframework.lang.Nullable;
 
+import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.applib.query.Query;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.applib.value.Blob;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.assertions._Assert;
+import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.internal.functions._Predicates;
@@ -43,6 +45,8 @@ import 
org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.causeway.core.metamodel.util.Facets;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -293,6 +297,25 @@ public class DataTable implements Serializable {
         return exporter.exportToBlob(this, tableFriendlyName);
     }
 
+    // -- COLUMN FILTER FACTORIES
+
+    public final static Predicate<ObjectAssociation> 
columnFilterIncluding(final @NonNull Where whereToInclude) {
+        return (final ObjectAssociation assoc) ->
+            !Facets.hiddenWhere(assoc)
+                .map(where->where.includes(whereToInclude))
+                .orElse(false);
+    }
+
+    public final static Predicate<ObjectAssociation> 
columnFilterExcludingMixins() {
+        return _Predicates.not(ObjectAssociation::isMixedIn);
+    }
+
+    public final static Predicate<ObjectAssociation> 
columnFilterIncludingEnabledForSnapshot() {
+        return (final ObjectAssociation assoc) -> 
_Casts.castTo(OneToOneAssociation.class, assoc)
+                .map(prop->prop.isIncludedWithSnapshots())
+                .orElse(false);
+    }
+
     // -- SERIALIZATION PROXY
 
     private Object writeReplace() {
@@ -309,6 +332,7 @@ public class DataTable implements Serializable {
         private final @NonNull Class<?> elementTypeClass;
         private final @NonNull Can<Bookmark> rowElementBookmarks;
         private final @Nullable String tableFriendlyName;
+        private final @NonNull Can<String> columnIds;
 
         private SerializationProxy(final DataTable dataTable) {
             this.elementTypeClass = 
dataTable.getElementType().getCorrespondingClass();
@@ -316,11 +340,14 @@ public class DataTable implements Serializable {
                     .map(ManagedObject::getBookmarkElseFail)
                     .collect(Can.toCan());
             this.tableFriendlyName = dataTable.getTableFriendlyName();
+            this.columnIds = 
dataTable.getDataColumns().map(DataColumn::getColumnId);
         }
 
         private Object readResolve() {
             var objectManager = 
MetaModelContext.instanceElseFail().getObjectManager();
-            var dataTable = DataTable.forDomainType(elementTypeClass);
+            var elementType = 
MetaModelContext.instanceElseFail().specForTypeElseFail(elementTypeClass);
+            var dataTable = new DataTable(elementType, columnIds
+                    
.map(columnId->elementType.getAssociationElseFail(columnId, MixedIn.INCLUDED)));
             var rowElements = 
rowElementBookmarks.map(objectManager::loadObjectElseFail);
             dataTable.setDataElements(rowElements);
             dataTable.tableFriendlyName = tableFriendlyName;
diff --git 
a/extensions/vw/tabular/applib/src/main/java/org/apache/causeway/tabular/applib/DataTableProvider.java
 
b/extensions/vw/tabular/applib/src/main/java/org/apache/causeway/tabular/applib/DataTableProvider.java
index 1b3a0c6613..cfea544a50 100644
--- 
a/extensions/vw/tabular/applib/src/main/java/org/apache/causeway/tabular/applib/DataTableProvider.java
+++ 
b/extensions/vw/tabular/applib/src/main/java/org/apache/causeway/tabular/applib/DataTableProvider.java
@@ -22,7 +22,6 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.core.config.beans.CausewayBeanTypeRegistry;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
@@ -37,11 +36,16 @@ public abstract class DataTableProvider {
     @Inject CausewayBeanTypeRegistry beanTypeRegistry;
 
     /**
-     * Returns an empty {@link DataTable} for given domain object type.
-     * It can be populated later on using {@link 
DataTable#setDataElements(Can)}.
+     * Returns an empty {@link DataTable} for given domain object type
+     * with columns mapped to non-mixed-in properties that are enabled for 
snapshots.
+     * <p>
+     * The table can be populated later on using {@link 
DataTable#setDataElements(Iterable)} or
+     * {@link DataTable#setDataElementPojos(Iterable)}.
      */
     public DataTable getDataTable(final Class<?> domainType) {
-        return DataTable.forDomainType(domainType);
+        return DataTable.forDomainType(domainType,
+                DataTable.columnFilterExcludingMixins()
+                .and(DataTable.columnFilterIncludingEnabledForSnapshot()));
     }
 
     public Stream<DataTable> streamDataTables() {

Reply via email to