You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by da...@apache.org on 2024/06/04 16:05:52 UTC
(causeway) branch CAUSEWAY-3751 created (now 56d75cecea)
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a change to branch CAUSEWAY-3751
in repository https://gitbox.apache.org/repos/asf/causeway.git
at 56d75cecea CAUSEWAY-3751: extends the SPI, onRendering
This branch includes the following new commits:
new 56d75cecea CAUSEWAY-3751: extends the SPI, onRendering
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(causeway) 01/01: CAUSEWAY-3751: extends the SPI, onRendering
Posted by da...@apache.org.
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 <da...@haywood-associates.co.uk>
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));
});
-
}
}