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 2023/03/13 18:24:27 UTC

[causeway] branch master updated: CAUSEWAY-3373: some minor refactoring (code quality)

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


The following commit(s) were added to refs/heads/master by this push:
     new 2c373c00af CAUSEWAY-3373: some minor refactoring (code quality)
2c373c00af is described below

commit 2c373c00afe4ad2e593f2ba01d9d7053254e67de
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Mar 13 19:24:21 2023 +0100

    CAUSEWAY-3373: some minor refactoring (code quality)
---
 .../services/publishing/log/PageRenderLogger.java  | 57 +++++++++++++---------
 .../publishing/spi/PageRenderSubscriber.java       | 32 ++++++++++--
 .../applib/services/publishing/spi/PageType.java   | 41 ----------------
 .../commons/model/components/UiComponentType.java  | 15 ++++++
 .../viewer/wicket/model/models/PageType.java       | 44 ++++++++---------
 .../viewer/wicket/ui/pages/PageAbstract.java       | 31 +++++++-----
 .../viewer/wicket/ui/pages/entity/EntityPage.java  | 24 ++++++---
 .../StandaloneCollectionPage.java                  | 38 +++++++--------
 .../viewer/wicket/ui/pages/value/ValuePage.java    | 23 ++++++---
 9 files changed, 168 insertions(+), 137 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/log/PageRenderLogger.java b/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/log/PageRenderLogger.java
index 304d600807..f1a7251e3d 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/log/PageRenderLogger.java
+++ b/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/log/PageRenderLogger.java
@@ -18,22 +18,26 @@
  */
 package org.apache.causeway.applib.services.publishing.log;
 
-import lombok.extern.log4j.Log4j2;
-import lombok.val;
-
 import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.Objects;
 import java.util.function.Supplier;
+import java.util.stream.Collectors;
 
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.lang.Nullable;
+import org.springframework.stereotype.Service;
+
 import org.apache.causeway.applib.CausewayModuleApplib;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Service;
+import org.apache.causeway.commons.internal.base._NullSafe;
+
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Simple implementation of {@link PageRenderSubscriber} that just
@@ -48,37 +52,42 @@ import org.springframework.stereotype.Service;
 @Log4j2
 public class PageRenderLogger implements PageRenderSubscriber {
 
-    static final String LOGICAL_TYPE_NAME = CausewayModuleApplib.NAMESPACE + ".ObjectRenderedLogger";
+    static final String LOGICAL_TYPE_NAME = CausewayModuleApplib.NAMESPACE + ".PageRenderLogger";
 
     @Override
     public boolean isEnabled() {
         return log.isDebugEnabled();
     }
 
-
     @Override
-    public void onRenderedDomainObject(Bookmark bookmark) {
-        log.debug("rendered object: [ \"{}\" ]", bookmark.stringify());
+    public void onRenderedDomainObject(final Bookmark bookmark) {
+        log.debug("rendered object: [ {} ]", doubleQuoted(bookmark.stringify()));
     }
 
     @Override
-    public void onRenderedCollection(Supplier<List<Bookmark>> bookmarkSupplier) {
-        val buf = new StringBuffer();
-        val first = new boolean[] {true};
-        bookmarkSupplier.get().forEach(x -> {
-            if(first[0]) {
-                first[0] = false;
-            } else {
-                buf.append(", ");
-            }
-            buf.append("\"").append(x.stringify()).append("\"");
-        });
-        log.debug("rendered collection: [ {} ]", buf.toString());
+    public void onRenderedCollection(final Supplier<List<Bookmark>> bookmarkSupplier) {
+
+        val bookmarksStringified =
+            _NullSafe.stream(bookmarkSupplier.get())
+            .filter(Objects::nonNull)
+            .map(Bookmark::stringify)
+            .map(this::doubleQuoted)
+            .collect(Collectors.joining(", "));
+
+        log.debug("rendered collection: [ {} ]", bookmarksStringified);
     }
 
 
     @Override
-    public void onRenderedValue(Object value) {
-        log.debug("rendered value: [ \"{}\" ]", value.toString());
+    public void onRenderedValue(final Object value) {
+        log.debug("rendered value: [ {} ]", doubleQuoted(value));
     }
+
+    // -- HELPER
+
+    private String doubleQuoted(final @Nullable Object obj) {
+        return "\"" + obj + "\"";
+    }
+
+
 }
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 c4713beadf..088d32e7a1 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
@@ -21,6 +21,8 @@ package org.apache.causeway.applib.services.publishing.spi;
 import java.util.List;
 import java.util.function.Supplier;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.commons.having.HasEnabling;
 
@@ -32,6 +34,28 @@ import org.apache.causeway.commons.having.HasEnabling;
  */
 public interface PageRenderSubscriber extends HasEnabling {
 
+    /**
+     * Enumerates the different types of pages that can be rendered.
+     */
+    public enum PageType {
+        /**
+         * Either a view model or an entity.
+         */
+        DOMAIN_OBJECT,
+        /**
+         * A collection of view models or entities.
+         */
+        COLLECTION,
+        /**
+         * A single value
+         */
+        VALUE,
+        /**
+         * Anything else; might include void, or sign in pages.
+         */
+        OTHER;
+    }
+
     /**
      * Called just before the rendering process starts.
      *
@@ -56,7 +80,7 @@ public interface PageRenderSubscriber extends HasEnabling {
      *
      * @param pageType - determines which of the subsequent <code>onRenderedXxx</code> callbacks (if any) will next be called.
      */
-    default void onRendering(PageType pageType) {}
+    default void onRendering(final PageType pageType) {}
 
 
     /**
@@ -64,20 +88,20 @@ public interface PageRenderSubscriber extends HasEnabling {
      *
      * @param bookmark - representation of the domain object that has been rendered.
      */
-    default void onRenderedDomainObject(Bookmark bookmark) {}
+    default void onRenderedDomainObject(final Bookmark bookmark) {}
 
     /**
      * Indicates that a standalone list of domain objects (each represented by a {@link Bookmark} has been rendered.
      *
      * @param bookmarkSupplier - a supplier representations of the collection of domain objects that have been rendered.  The level of indirection is for performance (in case no implementation is interested)
      */
-    default void onRenderedCollection(Supplier<List<Bookmark>> bookmarkSupplier) {}
+    default void onRenderedCollection(final Supplier<List<Bookmark>> bookmarkSupplier) {}
 
     /**
      * Indicates that a value has been rendered.
      *
      * @param value - the actual value that has been rendered.
      */
-    default void onRenderedValue(Object value) {}
+    default void onRenderedValue(final @Nullable Object value) {}
 
 }
diff --git a/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/spi/PageType.java b/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/spi/PageType.java
deleted file mode 100644
index 8cf97de942..0000000000
--- a/api/applib/src/main/java/org/apache/causeway/applib/services/publishing/spi/PageType.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.applib.services.publishing.spi;
-
-/**
- * Enumerates the different types of pages that can be rendered.
- */
-public enum PageType {
-    /**
-     * Either a view model or an entity.
-     */
-    DOMAIN_OBJECT,
-    /**
-     * A collection of view models or entities.
-     */
-    COLLECTION,
-    /**
-     * A single value
-     */
-    VALUE,
-    /**
-     * Anything else; might include void, or sign in pages.
-     */
-    OTHER;
-}
diff --git a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/components/UiComponentType.java b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/components/UiComponentType.java
index f1e7de7655..0fa7541855 100644
--- a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/components/UiComponentType.java
+++ b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/components/UiComponentType.java
@@ -21,6 +21,7 @@ package org.apache.causeway.viewer.commons.model.components;
 import org.springframework.lang.Nullable;
 
 import org.apache.causeway.applib.annotation.Optionality;
+import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
 import org.apache.causeway.core.metamodel.commons.StringExtensions;
 
 import lombok.Getter;
@@ -160,6 +161,17 @@ public enum UiComponentType {
 
     private UiComponentType() {
         this.optionality = Optionality.MANDATORY;
+        this.subscriberPageType = PageRenderSubscriber.PageType.OTHER;
+    }
+
+    private UiComponentType(final Optionality optionality) {
+        this.optionality = optionality;
+        this.subscriberPageType = PageRenderSubscriber.PageType.OTHER;
+    }
+
+    private UiComponentType(final PageRenderSubscriber.PageType pageType) {
+        this.optionality = Optionality.MANDATORY;
+        this.subscriberPageType = pageType;
     }
 
     @Override
@@ -184,6 +196,9 @@ public enum UiComponentType {
     @Getter
     private final Optionality optionality;
 
+    @Getter
+    private final PageRenderSubscriber.PageType subscriberPageType;
+
     @Nullable
     public static UiComponentType lookup(final String id) {
         for (final UiComponentType uiComponentType : values()) {
diff --git a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/PageType.java b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/PageType.java
index b5d9797581..da83b7af17 100644
--- a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/PageType.java
+++ b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/PageType.java
@@ -18,6 +18,12 @@
  */
 package org.apache.causeway.viewer.wicket.model.models;
 
+import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.experimental.Accessors;
+
 /**
  * Enumerates the different types of pages that can be rendered.
  *
@@ -26,29 +32,21 @@ package org.apache.causeway.viewer.wicket.model.models;
  * different types of pages. This allows the large-scale structure of page
  * layout (eg headers, footers) to be altered.
  */
+@RequiredArgsConstructor
 public enum PageType {
-    SIGN_IN,
-    SIGN_UP,
-    SIGN_UP_VERIFY,
-    PASSWORD_RESET,
-    HOME,
-    HOME_AFTER_PAGETIMEOUT,
-    ABOUT,
-    ENTITY,
-    STANDALONE_COLLECTION,
-    VALUE,
-    VOID_RETURN;
+    SIGN_IN(PageRenderSubscriber.PageType.OTHER),
+    SIGN_UP(PageRenderSubscriber.PageType.OTHER),
+    SIGN_UP_VERIFY(PageRenderSubscriber.PageType.OTHER),
+    PASSWORD_RESET(PageRenderSubscriber.PageType.OTHER),
+    HOME(PageRenderSubscriber.PageType.OTHER),
+    HOME_AFTER_PAGETIMEOUT(PageRenderSubscriber.PageType.OTHER),
+    ABOUT(PageRenderSubscriber.PageType.OTHER),
+    ENTITY(PageRenderSubscriber.PageType.DOMAIN_OBJECT),
+    STANDALONE_COLLECTION(PageRenderSubscriber.PageType.COLLECTION),
+    VALUE(PageRenderSubscriber.PageType.VALUE),
+    VOID_RETURN(PageRenderSubscriber.PageType.OTHER);
+
+    @Getter @Accessors(fluent=true)
+    private final PageRenderSubscriber.PageType asApplibPageType;
 
-    public org.apache.causeway.applib.services.publishing.spi.PageType asApplibPageType() {
-        switch (this) {
-            case ENTITY:
-                return org.apache.causeway.applib.services.publishing.spi.PageType.DOMAIN_OBJECT;
-            case STANDALONE_COLLECTION:
-                return org.apache.causeway.applib.services.publishing.spi.PageType.COLLECTION;
-            case VALUE:
-                return org.apache.causeway.applib.services.publishing.spi.PageType.VALUE;
-            default:
-                return org.apache.causeway.applib.services.publishing.spi.PageType.OTHER;
-        }
-    }
 }
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 2241ec2a13..8ced04608f 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
@@ -22,8 +22,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
 
-import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
-import org.apache.causeway.commons.collections.Can;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
@@ -48,6 +46,8 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.causeway.applib.annotation.PromptStyle;
 import org.apache.causeway.applib.services.exceprecog.ExceptionRecognizerService;
 import org.apache.causeway.applib.services.metamodel.BeanSort;
+import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
+import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.commons.internal.base._Timing;
 import org.apache.causeway.commons.internal.debug._Debug;
@@ -474,30 +474,30 @@ implements ActionPromptProvider {
         return cfra.getComponentFactoryRegistry();
     }
 
-
     // -- RE-ATTACH ENTITIES
 
     @Override
     public void renderPage() {
-        val enabledObjectRenderSubscribers = getServiceRegistry().select(PageRenderSubscriber.class)
-                .filter(PageRenderSubscriber::isEnabled);
-        enabledObjectRenderSubscribers
-                .forEach(subscriber -> {
-            subscriber.onRendering(getPageClassRegistry().getPageType(this).asApplibPageType());
-        });
+
+        val pageType = getPageClassRegistry().getPageType(this).asApplibPageType();
+        val enabledPageRenderSubscribers = enabledPageRenderSubscriber();
+
+        enabledPageRenderSubscribers
+                .forEach(subscriber -> subscriber.onRendering(pageType));
+
         if(XrayUi.isXrayEnabled()){
             _Debug.log("about to render %s ..", this.getClass().getSimpleName());
             val stopWatch = _Timing.now();
             onNewRequestCycle();
             super.renderPage();
-            onRendered(enabledObjectRenderSubscribers);
             stopWatch.stop();
             _Debug.log(".. rendering took %s", stopWatch.toString());
         } else {
             onNewRequestCycle();
             super.renderPage();
-            onRendered(enabledObjectRenderSubscribers);
         }
+
+        onRendered(enabledPageRenderSubscribers);
     }
 
     /**
@@ -514,7 +514,14 @@ implements ActionPromptProvider {
      *
      * @param enabledObjectRenderSubscribers  - those {@link PageRenderSubscriber}s that are {@link PageRenderSubscriber#isEnabled() enabled}
      */
-    public void onRendered(Can<PageRenderSubscriber> enabledObjectRenderSubscribers) {
+    protected void onRendered(final Can<PageRenderSubscriber> enabledObjectRenderSubscribers) {
+    }
+
+    // -- HELPER
+
+    private Can<PageRenderSubscriber> enabledPageRenderSubscriber() {
+        return getServiceRegistry().select(PageRenderSubscriber.class)
+                .filter(PageRenderSubscriber::isEnabled);
     }
 
 }
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 461eef51b2..76d0c0daca 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
@@ -18,8 +18,8 @@
  */
 package org.apache.causeway.viewer.wicket.ui.pages.entity;
 
-import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
-import org.apache.causeway.commons.collections.Can;
+import java.util.Optional;
+
 import org.apache.wicket.Application;
 import org.apache.wicket.RestartResponseException;
 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
@@ -31,7 +31,9 @@ import org.apache.wicket.markup.repeater.RepeatingView;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.CssResourceReference;
 
+import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
 import org.apache.causeway.applib.services.user.UserMemento;
+import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.debug._Debug;
 import org.apache.causeway.commons.internal.debug.xray.XrayUi;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
@@ -217,13 +219,19 @@ public class EntityPage extends PageAbstract {
     }
 
     @Override
-    public void onRendered(Can<PageRenderSubscriber> objectRenderSubscribers) {
-        final ManagedObject objectAdapter;
-        objectAdapter = model.getObject();
-        val bookmarkIfAny = objectAdapter.getBookmark();
+    public void onRendered(final Can<PageRenderSubscriber> pageRenderSubscribers) {
+
+        // 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));
+        });
 
-        objectRenderSubscribers
-                .forEach(objectRenderSubscriber -> objectRenderSubscriber.onRenderedDomainObject(bookmarkIfAny.get()));
     }
 
     // -- 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 1c4f1ff612..7f2a26458c 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,25 +18,23 @@
  */
 package org.apache.causeway.viewer.wicket.ui.pages.standalonecollection;
 
-import lombok.val;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Supplier;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
-import org.apache.causeway.applib.services.bookmark.Bookmark;
-import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.base._Lazy;
 import org.apache.wicket.Component;
 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 
+import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
 import org.apache.causeway.applib.services.user.UserMemento;
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.viewer.commons.model.components.UiComponentType;
 import org.apache.causeway.viewer.wicket.model.models.EntityCollectionModelStandalone;
 import org.apache.causeway.viewer.wicket.model.util.PageParameterUtils;
 import org.apache.causeway.viewer.wicket.ui.pages.PageAbstract;
 
+import lombok.val;
+
 /**
  * Web page representing an action invocation.
  */
@@ -61,19 +59,21 @@ public class StandaloneCollectionPage extends PageAbstract {
     }
 
     @Override
-    public void onRendered(Can<PageRenderSubscriber> objectRenderSubscribers) {
+    public void onRendered(final Can<PageRenderSubscriber> objectRenderSubscribers) {
+
+        if(objectRenderSubscribers.isEmpty()) {
+            return;
+        }
 
-        Supplier<List<Bookmark>> bookmarkSupplier = _Lazy.threadSafe(
-                () -> {
-                    val bookmarks = new ArrayList<Bookmark>();
-                    collectionModel.getObject().getDataElements().getValue().forEach(x -> {
-                        x.getBookmark().ifPresent(bookmarks::add);
-                    });
-                    return bookmarks;
-                });
+        val bookmarks =
+            collectionModel.getObject().getDataElements().getValue().stream()
+            .map(ManagedObject::getBookmark)
+            .filter(Optional::isPresent)
+            .map(Optional::get)
+            .collect(Collectors.toUnmodifiableList());
 
         objectRenderSubscribers
-                .forEach(subscriber -> subscriber.onRenderedCollection(bookmarkSupplier));
+            .forEach(subscriber -> subscriber.onRenderedCollection(()->bookmarks));
     }
 
 }
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 fb8d88a859..262e17a58c 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
@@ -18,12 +18,13 @@
  */
 package org.apache.causeway.viewer.wicket.ui.pages.value;
 
-import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
-import org.apache.causeway.commons.collections.Can;
 import org.apache.wicket.Component;
 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 
+import org.apache.causeway.applib.services.publishing.spi.PageRenderSubscriber;
 import org.apache.causeway.applib.services.user.UserMemento;
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.core.metamodel.object.ManagedObjects;
 import org.apache.causeway.viewer.commons.model.components.UiComponentType;
 import org.apache.causeway.viewer.wicket.model.models.ActionModel;
 import org.apache.causeway.viewer.wicket.model.models.ValueModel;
@@ -31,6 +32,8 @@ import org.apache.causeway.viewer.wicket.model.util.PageParameterUtils;
 import org.apache.causeway.viewer.wicket.ui.pages.PageAbstract;
 import org.apache.causeway.viewer.wicket.ui.util.Wkt;
 
+import lombok.val;
+
 /**
  * Web page representing an action invocation.
  */
@@ -47,7 +50,6 @@ public class ValuePage extends PageAbstract {
      */
     public ValuePage(final ValueModel valueModel) {
         this(valueModel, actionNameFrom(valueModel));
-
     }
 
     private ValuePage(final ValueModel valueModel, final String actionName) {
@@ -69,9 +71,18 @@ public class ValuePage extends PageAbstract {
     }
 
     @Override
-    public void onRendered(Can<PageRenderSubscriber> enabledObjectRenderSubscribers) {
-        enabledObjectRenderSubscribers.forEach(objectRenderSubscriber -> {
-            objectRenderSubscriber.onRenderedValue(valueModel.getObject().getPojo());
+    public void onRendered(final Can<PageRenderSubscriber> enabledObjectRenderSubscribers) {
+
+        // guard against unspecified
+        ManagedObjects.asSpecified(valueModel.getObject())
+        .ifPresent(managedObject->{
+
+            val nullableValuePojo = managedObject.getPojo();
+
+            enabledObjectRenderSubscribers.forEach(objectRenderSubscriber -> {
+                objectRenderSubscriber.onRenderedValue(nullableValuePojo);
+            });
         });
+
     }
 }