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