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

danhaywood pushed a commit to branch CAUSEWAY-3751
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit 56d75ceceaa673983f954c246dd8c98b0a47e9ec
Author: Dan Haywood <[email protected]>
AuthorDate: Tue Jun 4 17:05:45 2024 +0100

    CAUSEWAY-3751: extends the SPI, onRendering
---
 .../publishing/spi/PageRenderSubscriber.java       | 25 ++++++++++-
 .../viewer/wicket/ui/pages/PageAbstract.java       | 11 +++++
 .../viewer/wicket/ui/pages/entity/EntityPage.java  | 42 +++++++++++++++----
 .../StandaloneCollectionPage.java                  | 49 ++++++++++++++++++----
 .../viewer/wicket/ui/pages/value/ValuePage.java    | 28 +++++++++++--
 5 files changed, 134 insertions(+), 21 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/spi/PageRenderSubscriber.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/spi/PageRenderSubscriber.java
index 088d32e7a1..1bcd2040a0 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/spi/PageRenderSubscriber.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/spi/PageRenderSubscriber.java
@@ -62,7 +62,8 @@ public interface PageRenderSubscriber extends HasEnabling {
      * <p>
      *     Determines which of the <code>onRenderedXxx</code> callbacks (if 
any) will next be called:
      *     <ul>
-     *         <li>if {@link PageType#DOMAIN_OBJECT}, then will call {@link 
#onRenderedDomainObject(Bookmark)} next</li>
+     *         <li>if {@link PageType#DOMAIN_OBJECT}, then will call {@link 
#onRenderingDomainObject(Bookmark)} next,
+     *             and afterwards {@link #onRenderedDomainObject(Bookmark)} 
next</li>
      *         <li>if {@link PageType#COLLECTION}, then will call {@link 
#onRenderedCollection(Supplier)} next</li>
      *         <li>if {@link PageType#VALUE}, then will call {@link 
#onRenderedValue(Object)} next</li>
      *     </ul>
@@ -83,6 +84,28 @@ public interface PageRenderSubscriber extends HasEnabling {
     default void onRendering(final PageType pageType) {}
 
 
+    /**
+     * Indicates that the domain object represented by the {@link Bookmark} is 
about to be rendered.
+     *
+     * @param bookmark - representation of the domain object that are to be 
rendered.
+     */
+    default void onRenderingDomainObject(final Bookmark bookmark) {}
+
+    /**
+     * Indicates that a standalone list of domain objects (each represented by 
a {@link Bookmark} is about to be rendered.
+     *
+     * @param bookmarkSupplier - a supplier representations of the collection 
of domain objects that are to be rendered.  The level of indirection is for 
performance (in case no implementation is interested)
+     */
+    default void onRenderingCollection(final Supplier<List<Bookmark>> 
bookmarkSupplier) {}
+
+    /**
+     * Indicates that a value is about to be rendered.
+     *
+     * @param value - the actual value that is to be rendered.
+     */
+    default void onRenderingValue(final @Nullable Object value) {}
+
+
     /**
      * Indicates that the domain object represented by the {@link Bookmark} 
has been rendered.
      *
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/PageAbstract.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/PageAbstract.java
index b231df4e15..cb6846d449 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/PageAbstract.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/PageAbstract.java
@@ -489,14 +489,17 @@ implements ActionPromptProvider {
         enabledPageRenderSubscribers
                 .forEach(subscriber -> subscriber.onRendering(pageType));
 
+
         if(XrayUi.isXrayEnabled()){
             _Debug.log("about to render %s ..", 
this.getClass().getSimpleName());
             val stopWatch = _Timing.now();
+            onRendering(enabledPageRenderSubscribers);
             onNewRequestCycle();
             super.renderPage();
             stopWatch.stop();
             _Debug.log(".. rendering took %s", stopWatch.toString());
         } else {
+            onRendering(enabledPageRenderSubscribers);
             onNewRequestCycle();
             super.renderPage();
         }
@@ -513,6 +516,14 @@ implements ActionPromptProvider {
         // implemented only by EntityPage
     }
 
+    /**
+     * Hook to call {@link PageRenderSubscriber} implementations
+     *
+     * @param enabledObjectRenderSubscribers  - those {@link 
PageRenderSubscriber}s that are {@link PageRenderSubscriber#isEnabled() enabled}
+     */
+    protected void onRendering(final Can<PageRenderSubscriber> 
enabledObjectRenderSubscribers) {
+    }
+
     /**
      * Hook to call {@link PageRenderSubscriber} implementations
      *
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/entity/EntityPage.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/entity/EntityPage.java
index 33b35537bf..6f35f9c51a 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/entity/EntityPage.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -19,6 +19,10 @@
 package org.apache.causeway.viewer.wicket.ui.pages.entity;
 
 import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+
+import org.apache.causeway.applib.services.bookmark.Bookmark;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.RestartResponseException;
@@ -223,20 +227,40 @@ public class EntityPage extends PageAbstract {
                         .orElseThrow());
     }
 
+    @Override
+    public void onRendering(final Can<PageRenderSubscriber> 
pageRenderSubscribers) {
+        onRenderingOrRendered(pageRenderSubscribers, (pageRenderSubscriber, 
bookmark) -> {
+            pageRenderSubscriber.onRenderingDomainObject(bookmark);;
+            return null;
+        });
+    }
+
     @Override
     public void onRendered(final Can<PageRenderSubscriber> 
pageRenderSubscribers) {
+        onRenderingOrRendered(pageRenderSubscribers, (pageRenderSubscriber, 
bookmark) -> {
+            pageRenderSubscriber.onRenderedDomainObject(bookmark);;
+            return null;
+        });
+    }
+
+    private void onRenderingOrRendered(
+            final Can<PageRenderSubscriber> pageRenderSubscribers,
+            final BiFunction<PageRenderSubscriber, Bookmark, Void> handler) {
+
+        if(pageRenderSubscribers.isEmpty()) {
+            return;
+        }
 
         // guard against unspecified
         ManagedObjects.asSpecified(model.getObject())
-        .map(ManagedObject::getBookmark)
-        // guard against no bookmark available
-        .filter(Optional::isPresent)
-        .map(Optional::get)
-        .ifPresent(bookmark->{
-            pageRenderSubscribers
-                .forEach(objectRenderSubscriber -> 
objectRenderSubscriber.onRenderedDomainObject(bookmark));
-        });
-
+            .map(ManagedObject::getBookmark)
+            // guard against no bookmark available
+            .filter(Optional::isPresent)
+            .map(Optional::get)
+            .ifPresent(bookmark->{
+                pageRenderSubscribers
+                    .forEach(pageRenderSubscriber -> 
handler.apply(pageRenderSubscriber, bookmark));
+            });
     }
 
     // -- HELPER
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/standalonecollection/StandaloneCollectionPage.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/standalonecollection/StandaloneCollectionPage.java
index 7f2a26458c..3842d66901 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/standalonecollection/StandaloneCollectionPage.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/standalonecollection/StandaloneCollectionPage.java
@@ -18,9 +18,17 @@
  */
 package org.apache.causeway.viewer.wicket.ui.pages.standalonecollection;
 
+import java.util.List;
 import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import org.apache.causeway.applib.services.bookmark.Bookmark;
+
+import org.apache.causeway.commons.internal.binding._Observables;
+import 
org.apache.causeway.core.metamodel.tabular.interactive.DataTableInteractive;
+
 import org.apache.wicket.Component;
 import 
org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 
@@ -58,22 +66,49 @@ public class StandaloneCollectionPage extends PageAbstract {
         addBookmarkedPages(themeDiv);
     }
 
+    @Override
+    public void onRendering(final Can<PageRenderSubscriber> 
objectRenderSubscribers) {
+        onRenderingOrRendered(objectRenderSubscribers, (pageRenderSubscriber, 
bookmarkListSupplier) -> {
+            pageRenderSubscriber.onRenderingCollection(bookmarkListSupplier);
+            return null;
+        });
+    }
+
     @Override
     public void onRendered(final Can<PageRenderSubscriber> 
objectRenderSubscribers) {
+        onRenderingOrRendered(objectRenderSubscribers, (pageRenderSubscriber, 
bookmarkListSupplier) -> {
+            pageRenderSubscriber.onRenderedCollection(bookmarkListSupplier);
+            return null;
+        });
+    }
+
+    private void onRenderingOrRendered(
+            final Can<PageRenderSubscriber> objectRenderSubscribers,
+            final BiFunction<PageRenderSubscriber, Supplier<List<Bookmark>>, 
Void> handler) {
 
         if(objectRenderSubscribers.isEmpty()) {
             return;
         }
 
-        val bookmarks =
-            collectionModel.getObject().getDataElements().getValue().stream()
-            .map(ManagedObject::getBookmark)
-            .filter(Optional::isPresent)
-            .map(Optional::get)
-            .collect(Collectors.toUnmodifiableList());
+        Supplier<List<Bookmark>> listSupplier = () -> {
+
+            final var dataTableInteractive = collectionModel.getObject();
+            _Observables.LazyObservable<Can<ManagedObject>> dataElements = 
dataTableInteractive.getDataElements();
+            Can<ManagedObject> managedObjects = dataElements.getValue();
+
+            final var bookmarks =
+                managedObjects.stream()
+                .map(ManagedObject::getBookmark)
+                .filter(Optional::isPresent)
+                .map(Optional::get)
+                .collect(Collectors.toUnmodifiableList());
+            return bookmarks;
+        };
 
         objectRenderSubscribers
-            .forEach(subscriber -> 
subscriber.onRenderedCollection(()->bookmarks));
+            .forEach(subscriber -> {
+                handler.apply(subscriber, listSupplier);
+            });
     }
 
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/value/ValuePage.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/value/ValuePage.java
index 262e17a58c..ee9365f6d3 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/value/ValuePage.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/value/ValuePage.java
@@ -34,6 +34,8 @@ import org.apache.causeway.viewer.wicket.ui.util.Wkt;
 
 import lombok.val;
 
+import java.util.function.BiFunction;
+
 /**
  * Web page representing an action invocation.
  */
@@ -70,8 +72,29 @@ public class ValuePage extends PageAbstract {
         return "Results"; // fallback, probably not required because hint 
should always exist on the model.
     }
 
+    @Override
+    public void onRendering(final Can<PageRenderSubscriber> 
enabledObjectRenderSubscribers) {
+        onRenderingOrRendered(enabledObjectRenderSubscribers, 
(pageRenderSubscriber, value) -> {
+            pageRenderSubscriber.onRenderingValue(value);
+            return null;
+        });
+    }
+
     @Override
     public void onRendered(final Can<PageRenderSubscriber> 
enabledObjectRenderSubscribers) {
+        onRenderingOrRendered(enabledObjectRenderSubscribers, 
(pageRenderSubscriber, value) -> {
+            pageRenderSubscriber.onRenderedValue(value);
+            return null;
+        });
+    }
+
+    private void onRenderingOrRendered(
+            final Can<PageRenderSubscriber> pageRenderSubscribers,
+            final BiFunction<PageRenderSubscriber, Object, Void> handler) {
+
+        if(pageRenderSubscribers.isEmpty()) {
+            return;
+        }
 
         // guard against unspecified
         ManagedObjects.asSpecified(valueModel.getObject())
@@ -79,10 +102,7 @@ public class ValuePage extends PageAbstract {
 
             val nullableValuePojo = managedObject.getPojo();
 
-            enabledObjectRenderSubscribers.forEach(objectRenderSubscriber -> {
-                objectRenderSubscriber.onRenderedValue(nullableValuePojo);
-            });
+            pageRenderSubscribers.forEach(subscriber -> 
handler.apply(subscriber, nullableValuePojo));
         });
-
     }
 }

Reply via email to