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/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 9310225b82 ISIS-3335: purge UiObjectWkt's getLayoutData
9310225b82 is described below

commit 9310225b82c56ae257389176379e93539c8d9faa
Author: Andi Huber <[email protected]>
AuthorDate: Tue Jan 24 08:30:41 2023 +0100

    ISIS-3335: purge UiObjectWkt's getLayoutData
---
 .../models/EntityCollectionModelParented.java      | 32 ++++++--------
 .../viewer/wicket/model/models/UiObjectWkt.java    |  4 --
 .../entity/collection/EntityCollectionPanel.java   | 10 +++--
 .../collection/EntityCollectionPanelFactory.java   | 33 +++++++++++++-
 .../wicket/ui/components/layout/bs/col/Col.java    | 51 +++++++++-------------
 5 files changed, 70 insertions(+), 60 deletions(-)

diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/EntityCollectionModelParented.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/EntityCollectionModelParented.java
index f3bf57eeca..009bf32af1 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/EntityCollectionModelParented.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/EntityCollectionModelParented.java
@@ -18,13 +18,10 @@
  */
 package org.apache.causeway.viewer.wicket.model.models;
 
-import java.util.Optional;
-
 import org.apache.wicket.Component;
 
 import org.apache.causeway.applib.layout.component.CollectionLayoutData;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
-import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.viewer.wicket.model.hints.UiHintContainer;
 import 
org.apache.causeway.viewer.wicket.model.models.interaction.coll.DataTableModelWkt;
@@ -43,34 +40,35 @@ implements
     // TODO parent object model, maybe should not be exposed
     // maybe could be resolved in the process of decoupling the ActionModel 
from Wicket
     @Getter private final @NonNull UiObjectWkt entityModel;
+    @Getter private final @NonNull CollectionLayoutData layoutData;
 
     // -- FACTORIES
 
     public static EntityCollectionModelParented forParentObjectModel(
-            final @NonNull UiObjectWkt entityModel) {
+            final @NonNull UiObjectWkt entityModel, final @NonNull 
CollectionLayoutData layoutData) {
 
-        val collMetaModel =
-                Optional.ofNullable(entityModel.getCollectionLayoutData())
-                .map(collectionLayoutData->
-                    entityModel
+        val coll = entityModel
                         .getTypeOfSpecification()
-                        .getCollectionElseFail(collectionLayoutData.getId()))
-                .orElseThrow(()->_Exceptions
-                        .illegalArgument("EntityModel must have 
CollectionLayoutMetadata"));
+                        .getCollectionElseFail(layoutData.getId()); // 
collection's member-id
+
+        val dataTableModel = DataTableModelWkt
+                .forCollection(entityModel.bookmarkedObjectModel(), coll);
 
         return new EntityCollectionModelParented(
-                DataTableModelWkt
-                .forCollection(entityModel.bookmarkedObjectModel(), 
collMetaModel),
-                entityModel);
+                dataTableModel,
+                entityModel,
+                layoutData);
     }
 
     // -- CONSTRUCTOR
 
     protected EntityCollectionModelParented(
             final @NonNull DataTableModelWkt delegate,
-            final @NonNull UiObjectWkt parentObjectModel) { //TODO maybe 
instead use the delegate (?)
+            final @NonNull UiObjectWkt parentObjectModel,  //TODO maybe 
instead use the delegate (?)
+            final @NonNull CollectionLayoutData layoutData) {
         super(delegate, Variant.PARENTED);
         this.entityModel = parentObjectModel;
+        this.layoutData = layoutData;
     }
 
     // -- UI HINT CONTAINER
@@ -97,10 +95,6 @@ implements
         return (OneToManyAssociation) super.getMetaModel();
     }
 
-    public CollectionLayoutData getLayoutData() {
-        return entityModel.getCollectionLayoutData();
-    }
-
     public Bookmark asHintingBookmark() {
         return entityModel.getOwnerBookmark();
     }
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
index 0011a4cc8a..cac6a8f6d1 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
@@ -26,7 +26,6 @@ import org.apache.wicket.Component;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.springframework.lang.Nullable;
 
-import org.apache.causeway.applib.layout.component.CollectionLayoutData;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.applib.services.hint.HintStore;
 import org.apache.causeway.commons.internal.assertions._Assert;
@@ -272,9 +271,6 @@ implements
 
     // -- TAB AND COLUMN (metadata if any)
 
-    @Getter @Setter
-    private CollectionLayoutData collectionLayoutData;
-
     @Setter
     private @Nullable Bookmark contextBookmarkIfAny;
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
index e4743f74f8..2c0c96ba27 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
@@ -26,6 +26,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 
 import org.apache.causeway.applib.annotation.TableDecorator;
 import org.apache.causeway.applib.annotation.Where;
+import org.apache.causeway.applib.layout.component.CollectionLayoutData;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
@@ -76,11 +77,13 @@ implements HasDynamicallyVisibleContent {
     @Getter(value = AccessLevel.PROTECTED)
     private CollectionPresentationSelectorPanel selectorDropdownPanel;
 
+    private final CollectionLayoutData layoutData;
     private final WebMarkupContainer div;
 
-    public EntityCollectionPanel(final String id, final UiObjectWkt 
entityModel) {
+    public EntityCollectionPanel(final String id, final UiObjectWkt 
entityModel, final CollectionLayoutData layoutData) {
         super(id, entityModel);
 
+        this.layoutData = layoutData;
         this.div = new WebMarkupContainer(ID_COLLECTION_GROUP);
 
         selectedItemHintKey = 
ComponentHintKey.create(super.getMetaModelContext(),
@@ -90,7 +93,6 @@ implements HasDynamicallyVisibleContent {
         buildGui();
     }
 
-
     /**
      * Attach UI only after added to parent.
      */
@@ -119,7 +121,7 @@ implements HasDynamicallyVisibleContent {
 
     private void buildGui() {
 
-        val collectionModel = 
EntityCollectionModelParented.forParentObjectModel(getModel());
+        val collectionModel = 
EntityCollectionModelParented.forParentObjectModel(getModel(), layoutData);
         div.setMarkupId("collection-" + 
collectionModel.getLayoutData().getId());
 
         val collectionMetaModel = collectionModel.getMetaModel();
@@ -168,7 +170,7 @@ implements HasDynamicallyVisibleContent {
     private transient Optional<TableDecorator> tableDecorator;
     private Optional<TableDecorator> tableDecorator() {
         if(tableDecorator==null) {
-            val collectionModel = 
EntityCollectionModelParented.forParentObjectModel(getModel());
+            val collectionModel = 
EntityCollectionModelParented.forParentObjectModel(getModel(), layoutData);
             val collectionMetaModel = collectionModel.getMetaModel();
             this.tableDecorator = Facets.tableDecorator(collectionMetaModel);
         }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanelFactory.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanelFactory.java
index b5e2ecae8d..77ca208835 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanelFactory.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/entity/collection/EntityCollectionPanelFactory.java
@@ -18,14 +18,22 @@
  */
 package org.apache.causeway.viewer.wicket.ui.components.entity.collection;
 
+import java.io.Serializable;
+
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
 
+import org.apache.causeway.applib.layout.component.CollectionLayoutData;
 import org.apache.causeway.viewer.commons.model.components.UiComponentType;
 import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
 import org.apache.causeway.viewer.wicket.ui.ComponentFactory;
 import 
org.apache.causeway.viewer.wicket.ui.components.entity.EntityComponentFactoryAbstract;
 
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.val;
+
 /**
  * {@link ComponentFactory} for {@link EntityCollectionPanel}.
  */
@@ -33,13 +41,34 @@ public class EntityCollectionPanelFactory extends 
EntityComponentFactoryAbstract
 
     private static final long serialVersionUID = 1L;
 
+    /**
+     * Helper class, used to call this factory.
+     */
+    @RequiredArgsConstructor
+    @Getter
+    public static class CollectionOwnerAndLayout implements Serializable {
+        private static final long serialVersionUID = 1L;
+        final @NonNull UiObjectWkt owner;
+        final @NonNull CollectionLayoutData layout;
+    }
+
     public EntityCollectionPanelFactory() {
         super(UiComponentType.ENTITY_COLLECTION, EntityCollectionPanel.class);
     }
 
+    @Override
+    protected ApplicationAdvice appliesTo(final IModel<?> model) {
+        if (!(model instanceof org.apache.wicket.model.Model)) {
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        }
+        return (model.getObject() instanceof CollectionOwnerAndLayout)
+                ? ApplicationAdvice.APPLIES
+                : ApplicationAdvice.DOES_NOT_APPLY;
+    }
+
     @Override
     public Component createComponent(final String id, final IModel<?> model) {
-        final UiObjectWkt entityModel = (UiObjectWkt) model;
-        return new EntityCollectionPanel(id, entityModel);
+        val collectionOwnerAndId = (CollectionOwnerAndLayout) 
model.getObject();
+        return new EntityCollectionPanel(id, collectionOwnerAndId.getOwner(), 
collectionOwnerAndId.getLayout());
     }
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/layout/bs/col/Col.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/layout/bs/col/Col.java
index d160937a4f..536406eafd 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/layout/bs/col/Col.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/layout/bs/col/Col.java
@@ -19,11 +19,13 @@
 package org.apache.causeway.viewer.wicket.ui.components.layout.bs.col;
 
 import java.util.List;
-import java.util.function.Predicate;
+import java.util.Map;
+import java.util.function.UnaryOperator;
 import java.util.stream.Collectors;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.model.Model;
 
 import org.apache.causeway.applib.layout.component.ActionLayoutData;
 import org.apache.causeway.applib.layout.component.CollectionLayoutData;
@@ -42,6 +44,7 @@ import 
org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
 import org.apache.causeway.viewer.wicket.ui.ComponentFactory;
 import 
org.apache.causeway.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
 import 
org.apache.causeway.viewer.wicket.ui.components.actionmenu.entityactions.LinkAndLabelFactory;
+import 
org.apache.causeway.viewer.wicket.ui.components.entity.collection.EntityCollectionPanelFactory.CollectionOwnerAndLayout;
 import 
org.apache.causeway.viewer.wicket.ui.components.entity.fieldset.PropertyGroup;
 import org.apache.causeway.viewer.wicket.ui.components.layout.bs.row.Row;
 import 
org.apache.causeway.viewer.wicket.ui.components.layout.bs.tabs.TabGroupPanel;
@@ -229,49 +232,35 @@ implements HasDynamicallyVisibleContent {
             WktComponents.permanentlyHide(div, ID_FIELD_SETS);
         }
 
+        final UiObjectWkt entityModel = getModel();
+        val ownerSpec = entityModel.getManagedObject().getSpecification();
 
-        // collections
-        final List<CollectionLayoutData> collections =
+        // collection layout data by collection id (the collection's member-id)
+        final Map<String, CollectionLayoutData> collectionLayoutById =
                 _NullSafe.stream(bsCol.getCollections())
-                .filter(
-                        new Predicate<CollectionLayoutData>() {
-                            @Override
-                            public boolean test(final CollectionLayoutData 
collectionLayoutData) {
-                                return collectionLayoutData.getMetadataError() 
== null;
-                            }
-                        })
-                .collect(Collectors.toList());
-        if(!collections.isEmpty()) {
+                .filter(collectionLayoutData -> 
collectionLayoutData.getMetadataError() == null)
+                .filter(collectionLayoutData -> 
!ownerSpec.getCollection(collectionLayoutData.getId()).isEmpty())
+                
.collect(Collectors.toUnmodifiableMap(CollectionLayoutData::getId, 
UnaryOperator.identity()));
+
+        if(!collectionLayoutById.isEmpty()) {
             final RepeatingViewWithDynamicallyVisibleContent collectionRv =
                     new 
RepeatingViewWithDynamicallyVisibleContent(ID_COLLECTIONS);
 
-            final UiObjectWkt entityModel = getModel();
-            final CollectionLayoutData snapshot = 
entityModel.getCollectionLayoutData();
-
-            for (CollectionLayoutData collection : collections) {
-
-                if 
(entityModel.getManagedObject().getSpecification().getAssociation(collection.getId()).isEmpty())
 {
-                    continue;
-                }
-
-                final String id = collectionRv.newChildId();
+            collectionLayoutById.forEach((id, layout)->{
 
-                // we successively trample over the layout data; but that's 
ok, this is synchronous code anyway...
-                entityModel.setCollectionLayoutData(collection);
+                val helperModel = Model.of(new 
CollectionOwnerAndLayout(entityModel, layout));
 
-                // the entityModel's getLayoutData() provides the hint as to 
which collection of the entity to render.
                 final ComponentFactory componentFactory =
                         getComponentFactoryRegistry().findComponentFactory(
-                                UiComponentType.ENTITY_COLLECTION, 
entityModel);
-                final Component collectionPanel = 
componentFactory.createComponent(id, entityModel);
+                                UiComponentType.ENTITY_COLLECTION, 
helperModel);
+
+                final Component collectionPanel = 
componentFactory.createComponent(collectionRv.newChildId(), helperModel);
                 collectionRv.add(collectionPanel);
-            }
+            });
+
             div.add(collectionRv);
             visible = visible || collectionRv.isVisible();
 
-            //XXX CAUSEWAY-1698 restore original state after trampling over
-            entityModel.setCollectionLayoutData(snapshot);
-
         } else {
             WktComponents.permanentlyHide(div, ID_COLLECTIONS);
         }

Reply via email to