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 2024/11/28 08:52:25 UTC

(causeway) branch v3 updated: CAUSEWAY-2297: directly wire CollectionModelAbstract to DataTableInteractive

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

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


The following commit(s) were added to refs/heads/v3 by this push:
     new a3d912a8381 CAUSEWAY-2297: directly wire CollectionModelAbstract to DataTableInteractive
a3d912a8381 is described below

commit a3d912a8381852b0db4c08408e8090ee31d7379e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Nov 28 09:52:19 2024 +0100

    CAUSEWAY-2297: directly wire CollectionModelAbstract to
    DataTableInteractive
---
 .../tabular/internal/DataTableInternal.java        |  10 +-
 .../metamodel/tabular/internal/_FilterUtils.java   |   6 +-
 .../model/models/coll/CollectionModelAbstract.java | 121 ++++-----------------
 .../model/models/coll/CollectionModelEmpty.java    |  12 +-
 .../model/models/coll/CollectionModelParented.java |  15 ++-
 .../models/coll/CollectionModelStandalone.java     |  20 ++--
 6 files changed, 61 insertions(+), 123 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataTableInternal.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataTableInternal.java
index f0ca1aa27fa..bfb78c51cf1 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataTableInternal.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/DataTableInternal.java
@@ -143,20 +143,14 @@ implements DataTableInteractive {
             final Where where,
             final Can<ManagedObject> elements) {
 
-        var elementType = managedMember.getElementType();
-        //var mmc = elementType.getMetaModelContext();
-
         this.managedMember = managedMember;
         this.where = where;
-        this.filterHandler = _FilterUtils.createFilterHandler(elementType);
+        this.filterHandler = _FilterUtils.createFilterHandler(managedMember.getElementType());
 
         this.searchArgumentBindable = _Bindables.forValue("");
         this.columnSortBindable = _Bindables.forValue(null);
 
-        this.dataElementsObservable = _Observables.lazy(()->elements
-                //.map(mmc::injectServicesInto) // I believe is redundant, has major performance impact
-                //.filter(this::ignoreHidden) // I believe is redundant, has major performance impact
-                );
+        this.dataElementsObservable = _Observables.lazy(()->elements);
 
         this.dataRowsObservable = _Observables.lazy(()->
             dataElementsObservable.getValue().stream()
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/_FilterUtils.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/_FilterUtils.java
index 1639a9bad7f..e961f753d04 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/_FilterUtils.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/internal/_FilterUtils.java
@@ -22,6 +22,8 @@ import java.util.Optional;
 import java.util.function.BiPredicate;
 import java.util.function.Function;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.causeway.applib.services.filter.CollectionFilterService;
 import org.apache.causeway.applib.services.filter.CollectionFilterService.Tokens;
 import org.apache.causeway.applib.services.i18n.TranslationContext;
@@ -50,7 +52,9 @@ class _FilterUtils {
         }
     }
 
-    Optional<FilterHandler> createFilterHandler(final @NonNull ObjectSpecification elementType) {
+    Optional<FilterHandler> createFilterHandler(final @Nullable ObjectSpecification elementType) {
+        if(elementType==null) return Optional.empty();
+
         var mmc = elementType.getMetaModelContext();
         var collectionFilterServiceOpt = mmc.getServiceRegistry().select(CollectionFilterService.class).stream()
                 .filter(service->service.handles(elementType.getCorrespondingClass()))
diff --git a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
index 707095dab70..87ad99478d3 100644
--- a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
+++ b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
@@ -20,19 +20,13 @@ package org.apache.causeway.viewer.wicket.model.models.coll;
 
 import java.util.List;
 
-import org.apache.wicket.model.ChainingModel;
 import org.apache.wicket.model.LoadableDetachableModel;
 
 import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.collections._Lists;
-import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
-import org.apache.causeway.core.metamodel.interactions.managed.ManagedCollection;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
-import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.tabular.DataTableInteractive;
 import org.apache.causeway.core.metamodel.tabular.DataTableMemento;
 import org.apache.causeway.viewer.wicket.model.models.ActionModel;
@@ -43,114 +37,47 @@ import lombok.NonNull;
 /**
  * Represents a collection (a member) of a domain object.
  *
- * @implSpec
- * <pre>
- * CollectionModel --chained-to--> DataTableInteractive (delegate)
- * </pre>
+ * Bound to a {@link BookmarkedObjectWkt} and {@link DataTableInteractive}
+ * representing either a <i>Collection</i> or an <i>Action</i>'s result.
+ *
+ * @implSpec {@link DataTableInteractive} is not serializable,
+ *      hence is held transient,
+ *      that means it does not survive a serialization/de-serialization cycle;
+ *      it is recreated on {@link LoadableDetachableModel#load}
  */
 sealed abstract class CollectionModelAbstract
-extends ChainingModel<DataTableInteractive>
+extends LoadableDetachableModel<DataTableInteractive>
 implements CollectionModel
 permits CollectionModelParented, CollectionModelStandalone {
 
     private static final long serialVersionUID = 1L;
 
-    // -- FACTORIES
-    record DataTableHolderFactory(
-        BookmarkedObjectWkt bookmarkedObject,
-        DataTableInteractive tableInteractive) {
-
-        static DataTableHolderFactory forActionModel(
-            final @NonNull BookmarkedObjectWkt bookmarkedObjectModel,
-            final @NonNull ObjectAction actMetaModel,
-            final @NonNull ManagedObject actionResult) {
-
-            var tableInteractive = DataTableInteractive.forAction(
-                ManagedAction.of(bookmarkedObjectModel.getObject(), actMetaModel, Where.NOT_SPECIFIED),
-                actionResult);
-            return new DataTableHolderFactory(bookmarkedObjectModel, tableInteractive);
-        }
-
-        static @NonNull DataTableHolderFactory forCollection(
-            final @NonNull BookmarkedObjectWkt bookmarkedObjectModel,
-            final @NonNull OneToManyAssociation collMetaModel) {
-
-            var tableInteractive = DataTableInteractive.forCollection(
-                ManagedCollection.of(bookmarkedObjectModel.getObject(), collMetaModel, Where.NOT_SPECIFIED));
-            return new DataTableHolderFactory(bookmarkedObjectModel, tableInteractive);
-        }
-
-        DataTableHolder build() {
-            return new DataTableHolder(bookmarkedObject, tableInteractive);
-        }
-
-    }
-
-    /**
-     * Bound to a BookmarkedObjectWkt, with the {@link DataTableInteractive}
-     * representing either a <i>Collection</i> or an <i>Action</i>'s result.
-     *
-     * @implSpec the state of the DataTableModel is held transient,
-     * that means it does not survive a serialization/de-serialization cycle;
-     * it is recreated on load
-     */
-    private static final class DataTableHolder
-    extends LoadableDetachableModel<DataTableInteractive> {
-
-        // -- CONSTRUCTION
-
-        private static final long serialVersionUID = 1L;
-
-        private final BookmarkedObjectWkt bookmarkedObject;
-        private final DataTableMemento tableMemento;
-
-        private DataTableHolder(
-                final BookmarkedObjectWkt bookmarkedObject,
-                final DataTableInteractive tableInteractive) {
-            this.bookmarkedObject = bookmarkedObject;
-            this.tableMemento = tableInteractive.createMemento();
-            setObject(tableInteractive); // memoize
-            tableMemento.setupBindings(tableInteractive);
-        }
-
-        @Override
-        protected DataTableInteractive load() {
-            var tableInteractive = tableMemento.getDataTableModel(bookmarkedObject.asManagedObject());
-            tableMemento.setupBindings(tableInteractive);
-            return tableInteractive;
-        }
-
-    }
-
     private final @NonNull Variant variant;
+    private final BookmarkedObjectWkt bookmarkedObject;
+    private final DataTableMemento tableMemento;
 
     protected CollectionModelAbstract(
-            final DataTableHolderFactory dataTableHolderFactory,
+            final BookmarkedObjectWkt bookmarkedObject,
+            final DataTableInteractive tableInteractive,
             final @NonNull Variant variant) {
-        super(dataTableHolderFactory.build());
-        this.variant = variant;
-    }
 
-    //only used by CollectionModelHidden
-    @Deprecated
-    protected CollectionModelAbstract(
-        final CollectionModelAbstract collectionModel) {
-        super(collectionModel.delegate());
-        this.variant = collectionModel.getVariant();
+        this.bookmarkedObject = bookmarkedObject;
+        this.tableMemento = tableInteractive.createMemento();
+        setObject(tableInteractive); // memoize
+        tableMemento.setupBindings(tableInteractive);
+        this.variant = variant;
     }
 
     @Override
-    public final boolean isTableDataLoaded() {
-        return delegate().isAttached();
-    }
-
-    public final DataTableHolder delegate() {
-        return (DataTableHolder) super.getTarget();
+    protected DataTableInteractive load() {
+        var tableInteractive = tableMemento.getDataTableModel(bookmarkedObject.asManagedObject());
+        tableMemento.setupBindings(tableInteractive);
+        return tableInteractive;
     }
 
     @Override
-    public final DataTableInteractive getObject() {
-        return delegate().getObject();
+    public final boolean isTableDataLoaded() {
+        return this.isAttached();
     }
 
     @Override
@@ -171,7 +98,7 @@ permits CollectionModelParented, CollectionModelStandalone {
 
     @Override
     public final ManagedObject getParentObject() {
-        return delegate().bookmarkedObject.asManagedObject();
+        return bookmarkedObject.asManagedObject();
     }
 
     /* XXX[CAUSEWAY-3798] do not override (as it was for the hidden table)
diff --git a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelEmpty.java b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelEmpty.java
index 350f9c86264..27b4f179542 100644
--- a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelEmpty.java
+++ b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelEmpty.java
@@ -54,11 +54,16 @@ implements CollectionModel {
         return Can.empty();
     }
 
+    @Override
+    public DataTableInteractive getDataTableModel() {
+        return getObject();
+    }
+
     // -- NOT IMPLEMENTED
 
     @Override
     public DataTableInteractive getObject() {
-        throw _Exceptions.notImplemented();
+        return null;
     }
 
     @Override
@@ -71,11 +76,6 @@ implements CollectionModel {
         throw _Exceptions.notImplemented();
     }
 
-    @Override
-    public DataTableInteractive getDataTableModel() {
-        throw _Exceptions.notImplemented();
-    }
-
     @Override
     public ObjectMember getMetaModel() {
         throw _Exceptions.notImplemented();
diff --git a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelParented.java b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelParented.java
index 0d821b131e9..8bc3b2ecefd 100644
--- a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelParented.java
+++ b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelParented.java
@@ -20,11 +20,15 @@ package org.apache.causeway.viewer.wicket.model.models.coll;
 
 import org.apache.wicket.Component;
 
+import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.applib.layout.component.CollectionLayoutData;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
+import org.apache.causeway.core.metamodel.interactions.managed.ManagedCollection;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.causeway.core.metamodel.tabular.DataTableInteractive;
 import org.apache.causeway.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
+import org.apache.causeway.viewer.wicket.model.models.interaction.BookmarkedObjectWkt;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -49,9 +53,13 @@ implements
         var coll = objectModel
                         .getTypeOfSpecification()
                         .getCollectionElseFail(layoutData.getId()); // collection's member-id
+        var bookmarkedObject = objectModel.bookmarkedObjectModel();
+        var tableInteractive = DataTableInteractive.forCollection(
+            ManagedCollection.of(bookmarkedObject.getObject(), coll, Where.NOT_SPECIFIED));
 
         return new CollectionModelParented(
-                DataTableHolderFactory.forCollection(objectModel.bookmarkedObjectModel(), coll),
+                bookmarkedObject,
+                tableInteractive,
                 objectModel,
                 layoutData);
     }
@@ -59,10 +67,11 @@ implements
     // -- CONSTRUCTOR
 
     protected CollectionModelParented(
-            final @NonNull DataTableHolderFactory factory,
+            final BookmarkedObjectWkt bookmarkedObject,
+            final DataTableInteractive tableInteractive,
             final @NonNull UiObjectWkt parentObjectModel,  //TODO maybe instead use the delegate (?)
             final @NonNull CollectionLayoutData layoutData) {
-        super(factory, Variant.PARENTED);
+        super(bookmarkedObject, tableInteractive, Variant.PARENTED);
         this.objectModel = parentObjectModel;
         this.layoutData = layoutData;
     }
diff --git a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelStandalone.java b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelStandalone.java
index f7b666b6718..bb1b44ac0a4 100644
--- a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelStandalone.java
+++ b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelStandalone.java
@@ -18,7 +18,10 @@
  */
 package org.apache.causeway.viewer.wicket.model.models.coll;
 
+import org.apache.causeway.applib.annotation.Where;
+import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.causeway.core.metamodel.object.PackedManagedObject;
+import org.apache.causeway.core.metamodel.tabular.DataTableInteractive;
 import org.apache.causeway.viewer.wicket.model.models.ActionModel;
 import org.apache.causeway.viewer.wicket.model.models.interaction.BookmarkedObjectWkt;
 
@@ -35,19 +38,20 @@ extends CollectionModelAbstract {
             final @NonNull PackedManagedObject collectionAsAdapter,
             final @NonNull ActionModel actionModel) {
 
-        return new CollectionModelStandalone(
-                DataTableHolderFactory.forActionModel(
-                        BookmarkedObjectWkt
-                            .ofAdapter(actionModel.getParentObject()),
-                        actionModel.getAction(),
-                        collectionAsAdapter));
+        var bookmarkedObject = BookmarkedObjectWkt.ofAdapter(actionModel.getParentObject());
+        var tableInteractive = DataTableInteractive.forAction(
+            ManagedAction.of(bookmarkedObject.getObject(), actionModel.getAction(), Where.NOT_SPECIFIED),
+            collectionAsAdapter);
+
+        return new CollectionModelStandalone(bookmarkedObject, tableInteractive);
     }
 
     // -- CONSTRUCTOR
 
     private CollectionModelStandalone(
-            final @NonNull DataTableHolderFactory factory) {
-        super(factory, Variant.STANDALONE);
+            final BookmarkedObjectWkt bookmarkedObject,
+            final DataTableInteractive tableInteractive) {
+        super(bookmarkedObject, tableInteractive, Variant.STANDALONE);
     }
 
 }