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() {