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

ahuber pushed a commit to branch v4
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/v4 by this push:
     new a7a108be4ee fixes regression AboutPage not serializable
a7a108be4ee is described below

commit a7a108be4ee44c5dbdfacb0f37c0e1504573056d
Author: Andi Huber <[email protected]>
AuthorDate: Fri Sep 19 09:55:52 2025 +0200

    fixes regression AboutPage not serializable
---
 .../commons/internal/base/_StableValue.java        |  4 ++
 .../viewer/wicket/model/models/AboutModel.java     | 20 ++++++---
 .../wicket/ui/components/about/AboutPanel.java     | 47 ++++++++++------------
 .../viewer/wicket/ui/pages/PageAbstract.java       | 13 ++----
 4 files changed, 44 insertions(+), 40 deletions(-)

diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/base/_StableValue.java
 
b/commons/src/main/java/org/apache/causeway/commons/internal/base/_StableValue.java
index d43c6d36cc1..2f46a325252 100644
--- 
a/commons/src/main/java/org/apache/causeway/commons/internal/base/_StableValue.java
+++ 
b/commons/src/main/java/org/apache/causeway/commons/internal/base/_StableValue.java
@@ -42,6 +42,10 @@ public _StableValue() {
         this(new AtomicReference<>());
     }
 
+    public _StableValue(T t) {
+        this(new AtomicReference<>(t));
+    }
+
     /**
      * Returns the current value if already set, or sets it using the provided 
supplier
      * and returns the result. This ensures the supplier is only executed 
once, even
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/AboutModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/AboutModel.java
index 6a10f9a7ec9..0510f75d244 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/AboutModel.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/AboutModel.java
@@ -18,19 +18,29 @@
  */
 package org.apache.causeway.viewer.wicket.model.models;
 
-import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
 
 import org.apache.causeway.core.config.CausewayConfiguration;
+import org.apache.causeway.core.metamodel.context.MetaModelContext;
 
 /**
  * Model providing welcome text.
  */
-public record AboutModel(CausewayConfiguration.Viewer.Common.Application 
applicationSettings)
-implements IModel<CausewayConfiguration.Viewer.Common.Application> {
+public class AboutModel
+extends 
LoadableDetachableModel<CausewayConfiguration.Viewer.Common.Application> {
+    private static final long serialVersionUID = 1L;
+
+    public AboutModel(CausewayConfiguration.Viewer.Common.Application value) {
+        super(value);
+    }
 
     @Override
-    public CausewayConfiguration.Viewer.Common.Application getObject() {
-        return applicationSettings();
+    public CausewayConfiguration.Viewer.Common.Application load() {
+        return 
MetaModelContext.instanceElseFail().getConfiguration().viewer().common().application();
     }
 
+    public String name() { return getObject().name(); }
+    public String version() { return getObject().version(); }
+    public String about() { return getObject().about(); }
+
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/AboutPanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/AboutPanel.java
index ccf45383162..829870cae2c 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/AboutPanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/AboutPanel.java
@@ -18,10 +18,7 @@
  */
 package org.apache.causeway.viewer.wicket.ui.components.about;
 
-import java.io.InputStream;
-
 import jakarta.inject.Inject;
-import jakarta.inject.Provider;
 import jakarta.servlet.ServletContext;
 
 import org.apache.wicket.markup.html.basic.Label;
@@ -29,6 +26,7 @@
 import org.apache.wicket.model.LambdaModel;
 
 import org.apache.causeway.commons.internal.base._NullSafe;
+import org.apache.causeway.commons.internal.base._StableValue;
 import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.viewer.commons.model.about.JarManifestModel;
 import org.apache.causeway.viewer.wicket.model.models.AboutModel;
@@ -49,8 +47,28 @@ class AboutPanel
     private static final String ID_APPLICATION_VERSION = "applicationVersion";
     private static final String ID_ABOUT_MESSAGE = "aboutMessage";
 
-    public static class LabelVisibleOnlyIfNonEmpty extends Label {
+    public AboutPanel(final String id, final AboutModel aboutModel) {
+        super(id);
+
+        add(new LabelVisibleOnlyIfNonEmpty(ID_APPLICATION_NAME, 
LambdaModel.of(aboutModel::name)));
+        add(new LabelVisibleOnlyIfNonEmpty(ID_APPLICATION_VERSION, 
LambdaModel.of(aboutModel::version)));
+        add(new LabelVisibleOnlyIfNonEmpty(ID_ABOUT_MESSAGE, 
LambdaModel.of(aboutModel::about)));
+        add(new JarManifestPanel(ID_MANIFEST_ATTRIBUTES, jarManifestModel()));
+    }
+
+    JarManifestModel jarManifestModel() {
+        return JAR_MANIFEST_MODEL_REF.orElseSet(this::createJarManifestModel);
+    }
+
+    // -- HELPER
+
+    private static final _StableValue<JarManifestModel> JAR_MANIFEST_MODEL_REF 
= new _StableValue<>();
+    @Inject private transient ServletContext servletContext;
+    private JarManifestModel createJarManifestModel() {
+        return 
JarManifestModel.of(()->servletContext.getResourceAsStream("/META-INF/MANIFEST.MF"));
+    }
 
+    public static class LabelVisibleOnlyIfNonEmpty extends Label {
         private static final long serialVersionUID = 1L;
         private final IModel<String> label;
 
@@ -65,25 +83,4 @@ public LabelVisibleOnlyIfNonEmpty(final String id, final 
IModel<String> label) {
         }
     }
 
-    @Inject
-    private ServletContext servletContext;
-
-    private JarManifestModel jarManifestModel;
-
-    public AboutPanel(final String id, final AboutModel aboutModel) {
-        super(id);
-
-        add(new LabelVisibleOnlyIfNonEmpty(ID_APPLICATION_NAME, 
LambdaModel.of(()->aboutModel.getObject().name())));
-        add(new LabelVisibleOnlyIfNonEmpty(ID_APPLICATION_VERSION, 
LambdaModel.of(()->aboutModel.getObject().version())));
-        add(new LabelVisibleOnlyIfNonEmpty(ID_ABOUT_MESSAGE, 
LambdaModel.of(()->aboutModel.getObject().about())));
-
-        if(jarManifestModel == null) {
-            Provider<InputStream> metaInfManifestProvider =
-                    () -> 
servletContext.getResourceAsStream("/META-INF/MANIFEST.MF");
-            jarManifestModel = JarManifestModel.of(metaInfManifestProvider);
-        }
-
-        add(new JarManifestPanel(ID_MANIFEST_ATTRIBUTES, jarManifestModel));
-    }
-
 }
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 798ccebddbf..265b8e9aaf4 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
@@ -330,9 +330,7 @@ private void addComponent(final MarkupContainer container, 
final UiComponentType
         getComponentFactoryRegistry().addOrReplaceComponent(container, 
uiComponentType, model);
     }
 
-    ////////////////////////////////////////////////////////////////
-    // bookmarked pages
-    ////////////////////////////////////////////////////////////////
+    // -- BOOKMARKED PAGES
 
     /**
      * Convenience for subclasses
@@ -391,9 +389,7 @@ protected Optional<BreadcrumbModel> getBreadcrumbModel() {
                 : Optional.empty();
     }
 
-    // ///////////////////////////////////////////////////////////////////
-    // ActionPromptModalWindowProvider
-    // ///////////////////////////////////////////////////////////////////
+    // -- ACTION PROMPT MODAL WINDOW PROVIDER
 
     private ActionPromptModalWindow actionPromptModalWindow;
     private ActionPromptSidebar actionPromptSidebar;
@@ -441,9 +437,7 @@ private void addActionPromptSidebar(final MarkupContainer 
parent) {
         parent.addOrReplace(actionPromptSidebar);
     }
 
-    // ///////////////////////////////////////////////////////////////////
-    // UI Hint
-    // ///////////////////////////////////////////////////////////////////
+    // -- UI HINT
 
     /**
      * Propagates all {@link 
org.apache.causeway.viewer.wicket.model.hints.CausewayEventLetterAbstract 
letter} events down to
@@ -456,7 +450,6 @@ public void onEvent(final org.apache.wicket.event.IEvent<?> 
event) {
             send(PageAbstract.this, Broadcast.BREADTH, new 
CausewayEnvelopeEvent(letter)));
     }
 
-    // -- getComponentFactoryRegistry (Convenience)
     protected ComponentFactoryRegistry getComponentFactoryRegistry() {
         final HasComponentFactoryRegistry cfra = (HasComponentFactoryRegistry) 
getApplication();
         return cfra.getComponentFactoryRegistry();

Reply via email to