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);
}
}