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/11/07 05:54:34 UTC

(causeway) 01/01: CAUSEWAY-3641: DataTableInteractive#Memento don't require Executions on Deserialization

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

ahuber pushed a commit to branch 3641-table.no.exec.on.deserial
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit f1c016e8546c384987b12d761f486448eae4e25c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Nov 7 06:54:28 2023 +0100

    CAUSEWAY-3641: DataTableInteractive#Memento don't require Executions on
    Deserialization
---
 .../tabular/interactive/DataTableInteractive.java  | 69 +++++++++++-----------
 .../models/interaction/coll/DataTableModelWkt.java |  4 +-
 .../export/CollectionContentsAsExportFactory.java  |  2 +-
 3 files changed, 36 insertions(+), 39 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/interactive/DataTableInteractive.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/interactive/DataTableInteractive.java
index 80b098ad59..2eac79e20b 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/interactive/DataTableInteractive.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/interactive/DataTableInteractive.java
@@ -23,7 +23,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.function.Supplier;
 
 import org.springframework.lang.Nullable;
 
@@ -47,7 +46,6 @@ import org.apache.causeway.core.metamodel.interactions.VisibilityContext;
 import org.apache.causeway.core.metamodel.interactions.managed.ActionInteraction;
 import org.apache.causeway.core.metamodel.interactions.managed.CollectionInteraction;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
-import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction.MementoForArgs;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedCollection;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedMember;
 import org.apache.causeway.core.metamodel.interactions.managed.MultiselectChoices;
@@ -69,12 +67,12 @@ implements MultiselectChoices {
     // -- FACTORIES
 
     public static DataTableInteractive empty(final ManagedMember managedMember, final Where where) {
-        return new DataTableInteractive(managedMember, where, Can::empty);
+        return new DataTableInteractive(managedMember, where, Can.empty());
     }
 
     public static DataTableInteractive forCollection(
             final ManagedCollection managedCollection) {
-        return new DataTableInteractive(managedCollection, managedCollection.getWhere(), ()->
+        return new DataTableInteractive(managedCollection, managedCollection.getWhere(),
             managedCollection
             .streamElements()
             .collect(Can.toCan()));
@@ -86,7 +84,7 @@ implements MultiselectChoices {
             final ManagedObject actionResult) {
 
         if(actionResult==null) {
-            new DataTableInteractive(managedAction, managedAction.getWhere(), Can::empty);
+            new DataTableInteractive(managedAction, managedAction.getWhere(), Can.empty());
         }
         if(!(actionResult instanceof PackedManagedObject)) {
             throw _Exceptions.unexpectedCodeReach();
@@ -95,8 +93,7 @@ implements MultiselectChoices {
         val elements = ((PackedManagedObject)actionResult).unpack();
         elements.forEach(ManagedObject::getBookmark);
 
-        return new DataTableInteractive(managedAction, managedAction.getWhere(),
-                ()->elements);
+        return new DataTableInteractive(managedAction, managedAction.getWhere(), elements);
     }
 
     // -- CONSTRUCTION
@@ -118,13 +115,13 @@ implements MultiselectChoices {
             // we need access to the owner in support of imperative title and referenced column detection
             final ManagedMember managedMember,
             final Where where,
-            final Supplier<Can<ManagedObject>> elementSupplier) {
+            final Can<ManagedObject> elements) {
 
         this.managedMember = managedMember;
         this.where = where;
 
-        //dataElements = _Observables.lazy(elementSupplier);
-        dataElements = _Observables.lazy(()->elementSupplier.get().map(
+        //dataElements = _Observables.lazy(()->elements);
+        dataElements = _Observables.lazy(()->elements.map(
             MetaModelContext.instanceElseFail()::injectServicesInto));
 
         searchArgument = _Bindables.forValue(null);
@@ -261,7 +258,7 @@ implements MultiselectChoices {
 
     // -- EXPORT
 
-    public DataTable export() {
+    public DataTable exportFiltered() {
         return new DataTable(getElementType(),
                 getTitle().getValue(),
                 getDataColumns().getValue()
@@ -272,10 +269,18 @@ implements MultiselectChoices {
                     .collect(Can.toCan()));
     }
 
+    public DataTable exportAll() {
+        return new DataTable(getElementType(),
+                getTitle().getValue(),
+                getDataColumns().getValue()
+                    .map(DataColumn::getAssociationMetaModel),
+                getDataElements().getValue());
+    }
+
     // -- MEMENTO
 
-    public Memento getMemento(final @Nullable ManagedAction.MementoForArgs argsMemento) {
-        return Memento.create(this, argsMemento);
+    public Memento getMemento() {
+        return Memento.create(this);
     }
 
     /**
@@ -297,19 +302,18 @@ implements MultiselectChoices {
         private static final long serialVersionUID = 1L;
 
         static Memento create(
-                final @Nullable DataTableInteractive table,
-                final @Nullable MementoForArgs argsMemento) {
-            val managedMember = table.managedMember;
+                final @Nullable DataTableInteractive tableInteractive) {
+            val managedMember = tableInteractive.managedMember;
 
             return new Memento(
                     managedMember.getIdentifier(),
-                    table.where,
-                    argsMemento);
+                    tableInteractive.where,
+                    tableInteractive.exportAll());
         }
 
-        private final Identifier featureId;
-        private final Where where;
-        private final MementoForArgs argsMemento;
+        private final @NonNull Identifier featureId;
+        private final @NonNull Where where;
+        private final @NonNull DataTable dataTable;
 
         public DataTableInteractive getDataTableModel(final ManagedObject owner) {
 
@@ -320,21 +324,14 @@ implements MultiselectChoices {
 
             val memberId = featureId.getMemberLogicalName();
 
-            if(featureId.getType().isPropertyOrCollection()) {
-                // bypass domain events
-                val collInteraction = CollectionInteraction.start(owner, memberId, where);
-                val managedColl = collInteraction.getManagedCollection().orElseThrow();
-                // invocation bypassing domain events (pass-through)
-                return new DataTableInteractive(managedColl, where, ()->
-                    managedColl.streamElements(InteractionInitiatedBy.PASS_THROUGH).collect(Can.toCan()));
-            }
-            val actionInteraction = ActionInteraction.start(owner, memberId, where);
-            val managedAction = actionInteraction.getManagedActionElseFail();
-            val args = argsMemento.getArgumentList(managedAction.getMetaModel());
-            // invocation bypassing domain events (pass-through)
-            val actionResult = managedAction.invoke(args, InteractionInitiatedBy.PASS_THROUGH)
-                    .getSuccessElseFail();
-            return forAction(managedAction, args, actionResult);
+            final ManagedMember managedMember = featureId.getType().isPropertyOrCollection()
+                    ? CollectionInteraction.start(owner, memberId, where)
+                        .getManagedCollection().orElseThrow()
+                    : ActionInteraction.start(owner, memberId, where)
+                        .getManagedActionElseFail();
+
+            return new DataTableInteractive(managedMember, where,
+                    dataTable.streamDataElements().collect(Can.toCan()));
         }
     }
 
diff --git a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/coll/DataTableModelWkt.java b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/coll/DataTableModelWkt.java
index 2e96ae4b2a..b025e856ce 100644
--- a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/coll/DataTableModelWkt.java
+++ b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/coll/DataTableModelWkt.java
@@ -67,7 +67,7 @@ implements
                 args,
                 actionResult);
 
-        val tableMemento = table.getMemento(managedAction.getMementoForArgs(args));
+        val tableMemento = table.getMemento();
 
         val model = new DataTableModelWkt(
                 bookmarkedObjectModel, actMetaModel.getFeatureIdentifier(), tableMemento);
@@ -85,7 +85,7 @@ implements
                 ManagedCollection
                 .of(bookmarkedObjectModel.getObject(), collMetaModel, Where.NOT_SPECIFIED));
 
-        val tableMemento = table.getMemento(null);
+        val tableMemento = table.getMemento();
 
         val model = new DataTableModelWkt(
                 bookmarkedObjectModel, collMetaModel.getFeatureIdentifier(), tableMemento);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/export/CollectionContentsAsExportFactory.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/export/CollectionContentsAsExportFactory.java
index 4cb8cf1a8a..282e301469 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/export/CollectionContentsAsExportFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/export/CollectionContentsAsExportFactory.java
@@ -113,7 +113,7 @@ implements CollectionContentsAsFactory {
         public File getObject() {
             val tempFile = File.createTempFile(CollectionContentsAsExportFactory.class.getCanonicalName(), fileName);
             Try.run(()->
-                exporter().createExport(model.getDataTableModel().export(), tempFile))
+                exporter().createExport(model.getDataTableModel().exportFiltered(), tempFile))
             .ifFailure(__->{
                 Files.remove(tempFile); // cleanup after sad case
             })