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

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


The following commit(s) were added to refs/heads/main by this push:
     new 2c0e94129fa CAUSEWAY-3859: Java record refactoring (part 40)
2c0e94129fa is described below

commit 2c0e94129fabe421fcc2c06107671c68e60dcb55
Author: andi-huber <[email protected]>
AuthorDate: Sat Feb 22 18:18:29 2025 +0100

    CAUSEWAY-3859: Java record refactoring (part 40)
---
 .../interactions/managed/ManagedProperty.java      |  6 +--
 .../commons/model/src/main/java/module-info.java   |  1 -
 .../commons/model/binding/BindingConverter.java    | 45 -----------------
 .../binding/BindingConverterForManagedObject.java  | 45 -----------------
 .../wicket/model/hints/CausewayEventAbstract.java  | 18 +++----
 .../wicket/model/modelhelpers/WhereAmIHelper.java  | 55 +++++++-------------
 .../wicket/model/models/BookmarkedPagesModel.java  |  5 +-
 .../wicket/model/models/InlinePromptContext.java   | 32 ++++--------
 .../viewer/wicket/model/models/UiAttributeWkt.java | 28 +++++-----
 .../ui/app/registry/ComponentFactoryList.java      | 14 ++---
 .../ui/components/about/JarManifestAttributes.java | 49 +++++++-----------
 .../ui/components/about/JarManifestListView.java   |  4 +-
 .../attributes/AttributeModelChangeDispatcher.java | 12 ++---
 .../ui/components/attributes/AttributePanel.java   | 29 ++++-------
 .../wicket/ui/components/attributes/_Util.java     |  4 +-
 .../parented/ParentedCollectionPanelFactory.java   | 16 ++----
 ...efault.java => TreeThemeProviderBootstrap.java} |  2 +-
 .../components/widgets/actionlink/ActionLink.java  |  2 +-
 .../ui/components/widgets/select2/Select2.java     | 10 ++--
 .../viewer/wicket/ui/errors/StackTraceDetail.java  | 59 +++++++++-------------
 .../wicket/ui/errors/StackTraceListView.java       |  7 +--
 .../viewer/wicket/ui/pages/error/ErrorPage.java    |  2 +-
 .../wicket/ui/pages/obj/DomainObjectPage.java      |  2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      | 16 ++----
 .../viewer/wicket/ui/panels/PanelBase.java         |  4 +-
 .../wicket/ui/panels/PromptFormAbstract.java       |  2 +-
 .../viewer/wicket/viewer/integration/Timing.java   | 31 ------------
 .../integration/WebRequestCycleForCauseway.java    | 11 ++--
 .../registries/pages/PageClassRegistryDefault.java | 13 ++---
 .../wicket/viewer/wicketapp/_PageFactory.java      | 21 ++------
 30 files changed, 161 insertions(+), 384 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedProperty.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedProperty.java
index 06dbb14ec75..7c41fb77206 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedProperty.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ManagedProperty.java
@@ -96,7 +96,6 @@ public Can<ObjectAction> getAssociatedActions() {
 
     public Optional<InteractionVeto> checkValidity(final ManagedObject 
proposedNewValue) {
         try {
-
             var validityConsent =
                     property.isAssociationValid(getOwner(), proposedNewValue, 
InteractionInitiatedBy.USER);
 
@@ -117,11 +116,8 @@ public Optional<InteractionVeto> checkValidity(final 
ManagedObject proposedNewVa
      * @return non-empty if the interaction is not valid for given {@code 
proposedNewValue}
      */
     public Optional<InteractionVeto> modifyProperty(final @Nullable 
ManagedObject newValue) {
-
         var interactionVeto = checkValidity(newValue);
-        if(interactionVeto.isPresent()) {
-            return interactionVeto;
-        }
+        if(interactionVeto.isPresent()) return interactionVeto;
 
         var updatedOwner = property.set(getOwner(), newValue, 
InteractionInitiatedBy.USER);
         setOwner(updatedOwner);
diff --git a/viewers/commons/model/src/main/java/module-info.java 
b/viewers/commons/model/src/main/java/module-info.java
index 0e85fee55be..9565c18ec76 100644
--- a/viewers/commons/model/src/main/java/module-info.java
+++ b/viewers/commons/model/src/main/java/module-info.java
@@ -20,7 +20,6 @@
     exports org.apache.causeway.viewer.commons.model;
     exports org.apache.causeway.viewer.commons.model.layout;
     exports org.apache.causeway.viewer.commons.model.components;
-    exports org.apache.causeway.viewer.commons.model.binding;
     exports org.apache.causeway.viewer.commons.model.mixin;
     exports org.apache.causeway.viewer.commons.model.object;
     exports org.apache.causeway.viewer.commons.model.action;
diff --git 
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/binding/BindingConverter.java
 
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/binding/BindingConverter.java
deleted file mode 100644
index 370d6df421d..00000000000
--- 
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/binding/BindingConverter.java
+++ /dev/null
@@ -1,45 +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.viewer.commons.model.binding;
-
-public interface BindingConverter<L, R> {
-
-    L toLeft(R right);
-    R toRight(L left);
-
-    public static <T> BindingConverter<T, T> identity(final Class<T> type){
-        return new BindingConverter<T, T>() {
-            @Override public T toLeft(final T right) {
-                return right;}
-            @Override public T toRight(final T left) {
-                return left;}
-        };
-    }
-
-    public default BindingConverter<R, L> reverse() {
-        var self = this;
-        return new BindingConverter<R, L>() {
-            @Override public R toLeft(final L right) {
-                return self.toRight(right);}
-            @Override public L toRight(final R left) {
-                return self.toLeft(left);}
-        };
-    }
-
-}
diff --git 
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/binding/BindingConverterForManagedObject.java
 
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/binding/BindingConverterForManagedObject.java
deleted file mode 100644
index 5d44d77bb4d..00000000000
--- 
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/binding/BindingConverterForManagedObject.java
+++ /dev/null
@@ -1,45 +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.viewer.commons.model.binding;
-
-import org.apache.causeway.commons.internal.base._Casts;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor(staticName = "of")
-public final class BindingConverterForManagedObject<T>
-implements BindingConverter<ManagedObject, T> {
-
-    @Getter private final ObjectSpecification valueSpecification;
-
-    @Override
-    public ManagedObject toLeft(final T pojo) {
-        return ManagedObject.value(getValueSpecification(), pojo);
-    }
-
-    @Override
-    public T toRight(final ManagedObject adapter) {
-        return _Casts.uncheckedCast(MmUnwrapUtils.single(adapter));
-    }
-
-}
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/hints/CausewayEventAbstract.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/hints/CausewayEventAbstract.java
index 1f236d285b2..83cd2782889 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/hints/CausewayEventAbstract.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/hints/CausewayEventAbstract.java
@@ -24,18 +24,16 @@
 import lombok.RequiredArgsConstructor;
 
 /**
- * All Causeway-related events subclass from this, and fall into two 
categories.
- *
+ * All Causeway-related events subclass from this and fall into two categories.
  * <p>
- * Components that are raising events should create a subclass of {@link 
org.apache.causeway.viewer.wicket.model.hints.CausewayEventLetterAbstract} (the 
letter)
- * and then {@link 
org.apache.wicket.Component#send(org.apache.wicket.event.IEventSink, 
org.apache.wicket.event.Broadcast, Object) send} as a
- * {@link org.apache.wicket.event.Broadcast#EXACT exact} message to 
<tt>PageAbstract</tt>.
- * </p>
- *
+ * Components that are raising events should create a subclass of
+ * {@link 
org.apache.causeway.viewer.wicket.model.hints.CausewayEventLetterAbstract} (the 
letter)
+ * and then {@link 
org.apache.wicket.Component#send(org.apache.wicket.event.IEventSink, 
org.apache.wicket.event.Broadcast, Object)}
+ * as a {@link org.apache.wicket.event.Broadcast#EXACT} message to 
<tt>PageAbstract</tt>.
  * <p>
- * Then, <tt>PageAbstract</tt> will wrap the letter into the {@link 
org.apache.causeway.viewer.wicket.model.hints.CausewayEnvelopeEvent} (envelope) 
and
- * send as a {@link org.apache.wicket.event.Broadcast#BREADTH down} to all its 
components.
- * </p>
+ * Then <tt>PageAbstract</tt> will wrap the letter into the
+ * {@link org.apache.causeway.viewer.wicket.model.hints.CausewayEnvelopeEvent} 
(envelope) and
+ * send as a {@link org.apache.wicket.event.Broadcast#BREADTH} to all its 
components.
  */
 @RequiredArgsConstructor
 public abstract class CausewayEventAbstract {
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/modelhelpers/WhereAmIHelper.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/modelhelpers/WhereAmIHelper.java
index 1be671591b1..e35e7696151 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/modelhelpers/WhereAmIHelper.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/modelhelpers/WhereAmIHelper.java
@@ -19,52 +19,37 @@
 package org.apache.causeway.viewer.wicket.model.modelhelpers;
 
 import java.util.LinkedList;
+import java.util.List;
 import java.util.stream.Stream;
 
-import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.util.pchain.ParentChain;
 import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
 
 /**
- *
- * @implNote - previously this was called WhereAmIModel,
- *      but it isn't really a model in the Wicket sense (it's not 
serializable, for a start), hence renamed.
  * @since 2.0
  */
-public class WhereAmIHelper {
+public record WhereAmIHelper(
+        /** immutable start node of the navigable parent chain */
+        UiObjectWkt startOfChain,
+        List<Object> reversedChainOfParents,
+        boolean isWhereAmIEnabled) {
 
     public static WhereAmIHelper of(final UiObjectWkt startOfChain) {
-        return new WhereAmIHelper(startOfChain);
-    }
-
-    private final LinkedList<Object> reversedChainOfParents = new 
LinkedList<>();
-    private final UiObjectWkt startOfChain;
-    private final MetaModelContext commonContext;
-
-    private final boolean isWhereAmIEnabled;
-
-    public WhereAmIHelper(final UiObjectWkt startOfChain) {
-        this.startOfChain = startOfChain;
-        this.commonContext = startOfChain.getMetaModelContext();
-
-        var settings = 
commonContext.getConfiguration().getViewer().getWicket().getBreadcrumbs();
-        this.isWhereAmIEnabled = settings.isEnabled();
+        var mmc = startOfChain.getMetaModelContext();
+        var settings = 
mmc.getConfiguration().getViewer().getWicket().getBreadcrumbs();
+        var isWhereAmIEnabled = settings.isEnabled();
         int maxChainLength = settings.getMaxParentChainLength();
 
         var adapter = startOfChain.getObject();
         final Object startNode = adapter.getPojo();
 
-        ParentChain.of(commonContext.getSpecificationLoader())
-        .streamParentChainOf(startNode, maxChainLength)
-        .forEach(reversedChainOfParents::addFirst);
-    }
+        var reversedChainOfParents = new LinkedList<Object>();
 
-    /**
-     *
-     * @return the immutable start node of the navigable parent chain
-     */
-    public UiObjectWkt getStartOfChain() {
-        return startOfChain;
+        ParentChain.of(mmc.getSpecificationLoader())
+            .streamParentChainOf(startNode, maxChainLength)
+            .forEach(reversedChainOfParents::addFirst);
+
+        return new WhereAmIHelper(startOfChain, reversedChainOfParents, 
isWhereAmIEnabled);
     }
 
     /**
@@ -72,9 +57,8 @@ public UiObjectWkt getStartOfChain() {
      * @return whether the where-am-I hint should be shown or hidden
      */
     public boolean isShowWhereAmI() {
-        if(!isWhereAmIEnabled) {
-            return false; // this will prevent rendering
-        }
+        if(!isWhereAmIEnabled) return false; // this will prevent rendering
+
         return !reversedChainOfParents.isEmpty();
     }
 
@@ -83,8 +67,7 @@ public boolean isShowWhereAmI() {
      * @return reversed order stream of linked parent nodes, which does not 
include the start node
      */
     public Stream<UiObjectWkt> streamParentChainReversed() {
-        if(!isWhereAmIEnabled)
-            return Stream.empty(); //[ahuber] unexpected call, we could log a 
warning
+        if(!isWhereAmIEnabled) return Stream.empty(); //unexpected call, we 
could log a warning
 
         return reversedChainOfParents.stream()
                 .map(this::toEntityModel);
@@ -93,7 +76,7 @@ public Stream<UiObjectWkt> streamParentChainReversed() {
     // -- HELPER
 
     private UiObjectWkt toEntityModel(final Object domainObject) {
-        var objectAdapter = 
commonContext.getObjectManager().adapt(domainObject);
+        var objectAdapter = 
startOfChain.getMetaModelContext().getObjectManager().adapt(domainObject);
         return UiObjectWkt.ofAdapter(objectAdapter);
     }
 
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BookmarkedPagesModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BookmarkedPagesModel.java
index 34eec239364..68300d91f40 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BookmarkedPagesModel.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BookmarkedPagesModel.java
@@ -33,10 +33,7 @@ public class BookmarkedPagesModel extends 
ModelAbstract<List<BookmarkTreeNode>>
     public void bookmarkPage(final BookmarkableModel bookmarkableModel) {
 
         var bookmark = bookmarkableModel.toBookmark().orElse(null);
-        if(bookmark == null) {
-            // ignore
-            return;
-        }
+        if(bookmark == null) return; // ignore
 
         var matchingRootNode = matchRootNode(bookmarkableModel).orElse(null);
 
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/InlinePromptContext.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/InlinePromptContext.java
index d89d8768c49..c26cff4192c 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/InlinePromptContext.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/InlinePromptContext.java
@@ -27,21 +27,11 @@
 import org.apache.causeway.commons.functional.Either;
 import org.apache.causeway.commons.internal.functions._Functions;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-public class InlinePromptContext implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private final UiAttributeWkt attributeModel;
-
-    @Getter
-    private final MarkupContainer scalarTypeContainer;
-
-    private final Component scalarIfRegular;
-    private final WebMarkupContainer scalarIfRegularInlinePromptForm;
+public record InlinePromptContext(
+        UiAttributeWkt attributeModel,
+        MarkupContainer scalarTypeContainer,
+        Component scalarIfRegular,
+        WebMarkupContainer scalarIfRegularInlinePromptForm) implements 
Serializable {
 
     public void onPrompt() {
         scalarIfRegular.setVisible(false);
@@ -49,17 +39,15 @@ public void onPrompt() {
     }
 
     public void onCancel(final Either<ActionModel, PropertyModel> memberModel) 
{
-
         memberModel
-        .accept(_Functions.noopConsumer(), prop->{
-            // reset the UI form input field to the untouched property value
-            var untouchedPropertyValue = 
prop.getManagedProperty().getPropertyValue();
-            attributeModel.setObject(untouchedPropertyValue);
-        });
+            .accept(_Functions.noopConsumer(), prop->{
+                // reset the UI form input field to the untouched property 
value
+                var untouchedPropertyValue = 
prop.getManagedProperty().getPropertyValue();
+                attributeModel.setObject(untouchedPropertyValue);
+            });
 
         scalarIfRegular.setVisible(true);
         scalarIfRegularInlinePromptForm.setVisible(false);
-
     }
 
 }
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiAttributeWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiAttributeWkt.java
index b3521c9275a..26f7ea5a18b 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiAttributeWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiAttributeWkt.java
@@ -218,33 +218,35 @@ public void setInlinePromptContext(final 
InlinePromptContext inlinePromptContext
 
     public final AssociatedActions getAssociatedActions() {
         if (associatedActions == null) {
-            associatedActions = new AssociatedActions(calcAssociatedActions());
+            associatedActions = AssociatedActions.of(calcAssociatedActions());
         }
         return associatedActions;
     }
 
     public final boolean hasAssociatedActionWithInlineAsIfEdit() {
-        return 
getAssociatedActions().getFirstAssociatedWithInlineAsIfEdit().isPresent();
+        return 
getAssociatedActions().firstAssociatedWithInlineAsIfEdit().isPresent();
     }
 
     protected transient AssociatedActions associatedActions;
 
-    public static class AssociatedActions {
-        @Getter private final Optional<ObjectAction> 
firstAssociatedWithInlineAsIfEdit;
-        @Getter private final List<ObjectAction> remainingAssociated;
-
-        AssociatedActions(final Can<ObjectAction> allAssociated) {
-            firstAssociatedWithInlineAsIfEdit = 
firstAssociatedActionWithInlineAsIfEdit(allAssociated);
-            remainingAssociated = firstAssociatedWithInlineAsIfEdit.isPresent()
-                    ? 
allAssociated.remove(firstAssociatedWithInlineAsIfEdit.get()).toList()
-                    : allAssociated.toList();
+    public record AssociatedActions(
+            Optional<ObjectAction> firstAssociatedWithInlineAsIfEdit,
+            List<ObjectAction> remainingAssociated) {
+
+        static AssociatedActions of(final Can<ObjectAction> allAssociated) {
+            Optional<ObjectAction> firstAssociatedWithInlineAsIfEdit = 
firstAssociatedActionWithInlineAsIfEdit(allAssociated);
+            return new AssociatedActions(
+                    firstAssociatedWithInlineAsIfEdit,
+                    firstAssociatedWithInlineAsIfEdit.isPresent()
+                        ? 
allAssociated.remove(firstAssociatedWithInlineAsIfEdit.get()).toList()
+                        : allAssociated.toList());
         }
 
         private static Optional<ObjectAction> 
firstAssociatedActionWithInlineAsIfEdit(
                 final Can<ObjectAction> objectActions) {
             return objectActions.stream()
-            
.filter(act->ObjectAction.Util.promptStyleFor(act).isInlineAsIfEdit())
-            .findFirst();
+                
.filter(act->ObjectAction.Util.promptStyleFor(act).isInlineAsIfEdit())
+                .findFirst();
         }
     }
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/app/registry/ComponentFactoryList.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/app/registry/ComponentFactoryList.java
index 7225f164eeb..5fbef603afd 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/app/registry/ComponentFactoryList.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/app/registry/ComponentFactoryList.java
@@ -18,21 +18,23 @@
  */
 package org.apache.causeway.viewer.wicket.ui.app.registry;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Stream;
 
-import org.apache.causeway.commons.internal.collections._Lists;
 import org.apache.causeway.viewer.wicket.ui.ComponentFactory;
 
-public final class ComponentFactoryList implements Iterable<ComponentFactory> {
+public record ComponentFactoryList(
+        List<ComponentFactory> componentFactories) implements 
Iterable<ComponentFactory> {
 
-    private final List<ComponentFactory> componentFactories = 
_Lists.newArrayList();
+    public ComponentFactoryList() {
+        this(new ArrayList<>());
+    }
 
     public void add(final ComponentFactory componentFactory) {
-        if(componentFactories.contains(componentFactory)) {
-            return;
-        }
+        if(componentFactories.contains(componentFactory)) return;
+
         componentFactories.add(componentFactory);
     }
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/JarManifestAttributes.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/JarManifestAttributes.java
index 2161791a9da..0c0eca22324 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/JarManifestAttributes.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/JarManifestAttributes.java
@@ -22,28 +22,9 @@
 import java.net.URL;
 import java.util.Map.Entry;
 
-class JarManifestAttributes implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    public static JarManifestAttributes jarName(String jarName) {
-        return new JarManifestAttributes(JarManifestAttributes.Type.JAR_NAME, 
jarName);
-    }
-
-    public static JarManifestAttributes jarUrl(URL jarUrl) {
-        return new JarManifestAttributes(JarManifestAttributes.Type.JAR_URL, 
jarUrl != null? jarUrl.toExternalForm(): "");
-    }
-
-    public static JarManifestAttributes attribute(Entry<Object,Object> entry) {
-        StringBuilder buf = new StringBuilder();
-        buf .append("    ")
-        .append(entry.getKey())
-        .append(": ")
-        .append(entry.getValue())
-        .append("\n")
-        ;
-        return new 
JarManifestAttributes(JarManifestAttributes.Type.MANIFEST_ATTRIBUTE, 
buf.toString());
-    }
+record JarManifestAttributes(
+        Type type,
+        String line) implements Serializable {
 
     enum Type {
         JAR_NAME,
@@ -51,18 +32,22 @@ enum Type {
         MANIFEST_ATTRIBUTE
     }
 
-    private final Type type;
-    private final String line;
-
-    public JarManifestAttributes(Type type, String line) {
-        this.type = type;
-        this.line = line;
+    public static JarManifestAttributes jarName(final String jarName) {
+        return new JarManifestAttributes(JarManifestAttributes.Type.JAR_NAME, 
jarName);
     }
-    public JarManifestAttributes.Type getType() {
-        return type;
+
+    public static JarManifestAttributes jarUrl(final URL jarUrl) {
+        return new JarManifestAttributes(JarManifestAttributes.Type.JAR_URL, 
jarUrl != null? jarUrl.toExternalForm(): "");
     }
-    public String getLine() {
-        return line;
+
+    public static JarManifestAttributes attribute(final Entry<Object,Object> 
entry) {
+        var buf = new StringBuilder();
+        buf.append("    ")
+            .append(entry.getKey())
+            .append(": ")
+            .append(entry.getValue())
+            .append("\n");
+        return new 
JarManifestAttributes(JarManifestAttributes.Type.MANIFEST_ATTRIBUTE, 
buf.toString());
     }
 
 }
\ No newline at end of file
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/JarManifestListView.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/JarManifestListView.java
index 7c6aa4c2b99..17ebab250db 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/JarManifestListView.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/about/JarManifestListView.java
@@ -39,7 +39,7 @@ public JarManifestListView(final String id, final String 
idLine, final List<JarM
     @Override
     protected void populateItem(final ListItem<JarManifestAttributes> item) {
         final JarManifestAttributes detail = item.getModelObject();
-        item.add(new AttributeAppender("class", 
detail.getType().name().toLowerCase()));
-        Wkt.labelAdd(item, idLine, detail.getLine());
+        item.add(new AttributeAppender("class", 
detail.type().name().toLowerCase()));
+        Wkt.labelAdd(item, idLine, detail.line());
     }
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributeModelChangeDispatcher.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributeModelChangeDispatcher.java
index 90e8d3af054..52ae0c5af2a 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributeModelChangeDispatcher.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributeModelChangeDispatcher.java
@@ -24,18 +24,18 @@
 
 public interface AttributeModelChangeDispatcher {
 
-    @NonNull Iterable<AttributeModelChangeListener> getChangeListeners();
-    @NonNull AttributePanel getScalarPanel();
+    @NonNull Iterable<AttributeModelChangeListener> changeListeners();
+    @NonNull AttributePanel attributePanel();
 
     default void notifyUpdate(final AjaxRequestTarget target) {
-        for (var listener : getChangeListeners()) {
-            listener.onUpdate(target, getScalarPanel());
+        for (var listener : changeListeners()) {
+            listener.onUpdate(target, attributePanel());
         }
     }
 
     default void notifyError(final AjaxRequestTarget target) {
-        for (var listener : getChangeListeners()) {
-            listener.onError(target, getScalarPanel());
+        for (var listener : changeListeners()) {
+            listener.onError(target, attributePanel());
         }
     }
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanel.java
index 33b01d82198..bc249ff4bef 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/AttributePanel.java
@@ -19,7 +19,7 @@
 package org.apache.causeway.viewer.wicket.ui.components.attributes;
 
 import java.io.Serializable;
-import java.util.Collections;
+import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Optional;
@@ -43,7 +43,6 @@
 import org.apache.causeway.commons.collections.ImmutableEnumSet;
 import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.commons.internal.collections._Lists;
 import org.apache.causeway.commons.internal.debug._Probe;
 import org.apache.causeway.commons.internal.debug._Probe.EntryPoint;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
@@ -69,7 +68,6 @@
 
 import lombok.AccessLevel;
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 
 import 
de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
@@ -492,37 +490,28 @@ protected void installModelChangeBehavior() {
         addOrReplaceBehavoir(AttributeModelDefaultChangeBehavior.class, 
()->new AttributeModelDefaultChangeBehavior(this));
     }
 
-    @RequiredArgsConstructor
-    static class AttributeModelChangeDispatcherImpl
-    implements AttributeModelChangeDispatcher, Serializable {
-        private static final long serialVersionUID = 1L;
-        private final List<AttributeModelChangeListener> changeListeners = 
_Lists.newArrayList();
-
-        @Getter(onMethod_={@Override})
-        private final AttributePanel scalarPanel;
+    record AttributeModelChangeDispatcherImpl(
+            AttributePanel attributePanel,
+            List<AttributeModelChangeListener> changeListeners) implements 
AttributeModelChangeDispatcher, Serializable {
 
         @Override
         public void notifyUpdate(final AjaxRequestTarget target) {
             _Probe.entryPoint(EntryPoint.USER_INTERACTION, "Wicket Ajax 
Request, "
                     + "originating from User either having changed a Property 
value during inline editing "
                     + "or having changed a Parameter value within an open 
ActionPrompt.");
-            _Xray.onParamOrPropertyEdited(scalarPanel);
+            _Xray.onParamOrPropertyEdited(attributePanel);
             AttributeModelChangeDispatcher.super.notifyUpdate(target);
         }
 
-        @Override
-        public @NonNull Iterable<AttributeModelChangeListener> 
getChangeListeners() {
-            return Collections.unmodifiableCollection(changeListeners);
-        }
-
         void addChangeListener(final AttributeModelChangeListener listener) {
             changeListeners.add(listener);
         }
+
     }
 
     @Getter
     private final AttributeModelChangeDispatcher 
attributeModelChangeDispatcher =
-            new AttributeModelChangeDispatcherImpl(this);
+            new AttributeModelChangeDispatcherImpl(this, new ArrayList<>());
 
     public void addChangeListener(final AttributeModelChangeListener listener) 
{
         
((AttributeModelChangeDispatcherImpl)getAttributeModelChangeDispatcher()).addChangeListener(listener);
@@ -538,7 +527,7 @@ protected final <T extends Behavior> void 
addOrReplaceBehavoir(
         validationFeedbackReceiver.add(factory.get());
     }
 
-    // //////////////////////////////////////
+    // --
 
     @Override
     public void onUpdate(final AjaxRequestTarget target, final AttributePanel 
scalarPanel) {
@@ -551,7 +540,7 @@ public void onUpdate(final AjaxRequestTarget target, final 
AttributePanel scalar
     public void onError(final AjaxRequestTarget target, final AttributePanel 
scalarPanel) {
     }
 
-    // ///////////////////////////////////////////////////////////////////
+    // --
 
     /**
      * When label-position LEFT or TOP populates Wicket template 
ID_SCALAR_NAME_BEFORE_VALUE,
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/_Util.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/_Util.java
index 73b8ec886e8..5cb192280a0 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/_Util.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/_Util.java
@@ -80,7 +80,7 @@ Optional<ActionModel> 
lookupMixinForCompositeValueUpdate(final UiAttributeWkt at
     Optional<ActionModel> lookupPropertyActionForInlineEdit(final 
UiAttributeWkt attributeModel) {
         // not editable property, but maybe one of the actions is.
         return attributeModel.getAssociatedActions()
-                .getFirstAssociatedWithInlineAsIfEdit()
+                .firstAssociatedWithInlineAsIfEdit()
                 .flatMap(action->toActionModelWithRuleChecking(action, 
attributeModel));
     }
 
@@ -88,7 +88,7 @@ Can<ActionModel> associatedActionModels(final UiAttributeWkt 
attributeModel) {
         // find associated actions for this scalar property (only properties 
will have any.)
         // convert those actions into UI layer widgets
         return attributeModel.getAssociatedActions()
-                .getRemainingAssociated()
+                .remainingAssociated()
                 .stream()
                 .map(act->ActionModel.forPropertyOrParameter(act, 
attributeModel))
                 .collect(Can.toCan());
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/parented/ParentedCollectionPanelFactory.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/parented/ParentedCollectionPanelFactory.java
index d0753a6cf1e..9f3a1fc0019 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/parented/ParentedCollectionPanelFactory.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/parented/ParentedCollectionPanelFactory.java
@@ -22,6 +22,7 @@
 
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
+import org.jspecify.annotations.NonNull;
 
 import org.apache.causeway.applib.layout.component.CollectionLayoutData;
 import org.apache.causeway.viewer.commons.model.components.UiComponentType;
@@ -29,10 +30,6 @@
 import org.apache.causeway.viewer.wicket.ui.ComponentFactory;
 import 
org.apache.causeway.viewer.wicket.ui.components.object.ObjectComponentFactoryAbstract;
 
-import lombok.Getter;
-import org.jspecify.annotations.NonNull;
-import lombok.RequiredArgsConstructor;
-
 /**
  * {@link ComponentFactory} for {@link ParentedCollectionPanel}.
  */
@@ -41,12 +38,9 @@ public class ParentedCollectionPanelFactory extends 
ObjectComponentFactoryAbstra
     /**
      * Helper class, used to call this factory.
      */
-    @RequiredArgsConstructor
-    @Getter
-    public static class CollectionOwnerAndLayout implements Serializable {
-        private static final long serialVersionUID = 1L;
-        final @NonNull UiObjectWkt owner;
-        final @NonNull CollectionLayoutData layout;
+    public record CollectionOwnerAndLayout(
+            @NonNull UiObjectWkt owner,
+            @NonNull CollectionLayoutData layout) implements Serializable {
     }
 
     public ParentedCollectionPanelFactory() {
@@ -66,6 +60,6 @@ protected ApplicationAdvice appliesTo(final IModel<?> model) {
     @Override
     public Component createComponent(final String id, final IModel<?> model) {
         var collectionOwnerAndId = (CollectionOwnerAndLayout) 
model.getObject();
-        return new ParentedCollectionPanel(id, 
collectionOwnerAndId.getOwner(), collectionOwnerAndId.getLayout());
+        return new ParentedCollectionPanel(id, collectionOwnerAndId.owner(), 
collectionOwnerAndId.layout());
     }
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/themes/TreeThemeProviderDefault.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/themes/TreeThemeProviderBootstrap.java
similarity index 94%
rename from 
viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/themes/TreeThemeProviderDefault.java
rename to 
viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/themes/TreeThemeProviderBootstrap.java
index 75d2b33ef1e..295b71c40f3 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/themes/TreeThemeProviderDefault.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/themes/TreeThemeProviderBootstrap.java
@@ -22,7 +22,7 @@
 
 import 
org.apache.causeway.viewer.wicket.ui.components.tree.themes.bootstrap.WktBootstrapTreeTheme;
 
-public class TreeThemeProviderDefault implements TreeThemeProvider {
+public class TreeThemeProviderBootstrap implements TreeThemeProvider {
 
     // other options as provided by wicket-extensions: WindowsTheme, HumanTheme
     private final Behavior bootstrapTheme = new WktBootstrapTreeTheme();
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/actionlink/ActionLink.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/actionlink/ActionLink.java
index 1b0cfb39c31..bbe700075fa 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/actionlink/ActionLink.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/actionlink/ActionLink.java
@@ -241,7 +241,7 @@ private void startDialogWithParams(final AjaxRequestTarget 
target) {
     private void startDialogInline(final AjaxRequestTarget target) {
         var actionModel = this.getActionModel();
         var inlinePromptContext = actionModel.getInlinePromptContext();
-        var scalarTypeContainer = inlinePromptContext.getScalarTypeContainer();
+        var scalarTypeContainer = inlinePromptContext.scalarTypeContainer();
 
         
getComponentFactoryRegistry().addOrReplaceComponent(scalarTypeContainer,
                 FrameFragment.INLINE_PROMPT_FORM.getContainerId(),
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/select2/Select2.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/select2/Select2.java
index a9b3ca9de30..f722355cfed 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/select2/Select2.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -43,15 +43,12 @@
 /**
  * Wrapper around either a {@link Select2Choice} or a {@link 
Select2MultiChoice}.
  */
-public class Select2
+public record Select2(
+        Either<Select2ChoiceExt, Select2MultiChoiceExt> select2Choice)
 implements
     Serializable,
     HasCommonContext {
 
-    private static final long serialVersionUID = 1L;
-
-    final Either<Select2ChoiceExt, Select2MultiChoiceExt> select2Choice;
-
     public static Select2 createSelect2(
             final String id,
             final UiAttributeWkt attributeModel,
@@ -78,7 +75,8 @@ public static Select2 createSelect2(
         return select2;
     }
 
-    private Select2(final @NonNull Either<Select2ChoiceExt, 
Select2MultiChoiceExt> select2Choice) {
+    // canonical constructor
+    public Select2(final @NonNull Either<Select2ChoiceExt, 
Select2MultiChoiceExt> select2Choice) {
         this.select2Choice = select2Choice;
         asComponent().setOutputMarkupId(true);
     }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceDetail.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceDetail.java
index cf78aecfb21..3e95cb40082 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceDetail.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceDetail.java
@@ -20,30 +20,37 @@
 
 import java.io.Serializable;
 
-public class StackTraceDetail implements Serializable {
+public record StackTraceDetail(
+        Type type,
+        String line) implements Serializable {
 
-    private static final long serialVersionUID = 1L;
+    enum Type {
+        EXCEPTION_CLASS_NAME,
+        EXCEPTION_MESSAGE,
+        STACKTRACE_ELEMENT,
+        LITERAL
+    }
 
-    public static StackTraceDetail exceptionClassName(Throwable cause) {
+    public static StackTraceDetail exceptionClassName(final Throwable cause) {
         return new 
StackTraceDetail(StackTraceDetail.Type.EXCEPTION_CLASS_NAME, 
cause.getClass().getName());
     }
 
-    public static StackTraceDetail exceptionMessage(Throwable cause) {
+    public static StackTraceDetail exceptionMessage(final Throwable cause) {
         return new StackTraceDetail(StackTraceDetail.Type.EXCEPTION_MESSAGE, 
cause.getMessage());
     }
 
-    public static StackTraceDetail element(StackTraceElement el) {
-        StringBuilder buf = new StringBuilder();
-        buf .append("    ")
-        .append(el.getClassName())
-        .append("#")
-        .append(el.getMethodName())
-        .append("(")
-        .append(el.getFileName())
-        .append(":")
-        .append(el.getLineNumber())
-        .append(")\n")
-        ;
+    public static StackTraceDetail element(final StackTraceElement el) {
+        var buf = new StringBuilder();
+        buf.append("    ")
+            .append(el.getClassName())
+            .append("#")
+            .append(el.getMethodName())
+            .append("(")
+            .append(el.getFileName())
+            .append(":")
+            .append(el.getLineNumber())
+            .append(")\n");
+
         return new StackTraceDetail(StackTraceDetail.Type.STACKTRACE_ELEMENT, 
buf.toString());
     }
 
@@ -55,24 +62,4 @@ public static StackTraceDetail causedBy() {
         return new StackTraceDetail(Type.LITERAL, "Caused by:");
     }
 
-    enum Type {
-        EXCEPTION_CLASS_NAME,
-        EXCEPTION_MESSAGE,
-        STACKTRACE_ELEMENT,
-        LITERAL
-    }
-    private final Type type;
-    private final String line;
-
-    public StackTraceDetail(Type type, String line) {
-        this.type = type;
-        this.line = line;
-    }
-    public StackTraceDetail.Type getType() {
-        return type;
-    }
-    public String getLine() {
-        return line;
-    }
-
 }
\ No newline at end of file
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceListView.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceListView.java
index a2146a072ca..ea8e852e323 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceListView.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceListView.java
@@ -32,7 +32,8 @@ public final class StackTraceListView
     private static final long serialVersionUID = 1L;
     private final String idLine;
 
-    public StackTraceListView(final String id, final String idLine, final 
List<org.apache.causeway.viewer.wicket.ui.errors.StackTraceDetail> list) {
+    public StackTraceListView(final String id, final String idLine,
+            final 
List<org.apache.causeway.viewer.wicket.ui.errors.StackTraceDetail> list) {
         super(id, list);
         this.idLine = idLine;
     }
@@ -40,7 +41,7 @@ public StackTraceListView(final String id, final String 
idLine, final List<org.a
     @Override
     protected void populateItem(final ListItem<StackTraceDetail> item) {
         final StackTraceDetail detail = item.getModelObject();
-        item.add(new AttributeAppender("class", 
detail.getType().name().toLowerCase()));
-        Wkt.labelAdd(item, idLine, detail.getLine());
+        item.add(new AttributeAppender("class", 
detail.type().name().toLowerCase()));
+        Wkt.labelAdd(item, idLine, detail.line());
     }
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.java
index dfd80244b3a..7a8861ff657 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.java
@@ -85,7 +85,7 @@ public ErrorPage(final ExceptionModel exceptionModel) {
     }
 
     protected List<String> transform(final List<StackTraceDetail> stackTrace) {
-        return _Lists.map(stackTrace, (final StackTraceDetail 
stackTraceDetail) -> stackTraceDetail.getLine());
+        return _Lists.map(stackTrace, StackTraceDetail::line);
     }
 
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/obj/DomainObjectPage.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/obj/DomainObjectPage.java
index b57bbdce297..7802146841b 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/obj/DomainObjectPage.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/obj/DomainObjectPage.java
@@ -198,7 +198,7 @@ protected void addWhereAmIIfShown(
         whereAmIModel.streamParentChainReversed().forEach(objectModel->
             
listItems.add(ObjectIconAndTitlePanelFactory.entityIconAndTitlePanel(listItems.newChildId(),
 objectModel)));
 
-        Wkt.labelAdd(listItems, listItems.newChildId(), 
whereAmIModel.getStartOfChain().getTitle());
+        Wkt.labelAdd(listItems, listItems.newChildId(), 
whereAmIModel.startOfChain().getTitle());
 
         whereAmIContainer.addOrReplace(listItems);
     }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/FormExecutorDefault.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/FormExecutorDefault.java
index 7a83099a33c..93a3c7ecbde 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -40,10 +40,9 @@
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
-public final class FormExecutorDefault
-implements FormExecutor, HasCommonContext {
-
-    private static final long serialVersionUID = 1L;
+public record FormExecutorDefault(
+        Either<ActionModel, PropertyModel> actionOrPropertyModel
+        ) implements FormExecutor, HasCommonContext {
 
     // -- FACTORIES
 
@@ -59,15 +58,6 @@ public static FormExecutor forMember(final 
Either<ActionModel, PropertyModel> ac
         return new FormExecutorDefault(actionOrPropertyModel);
     }
 
-    // -- CONSTRUCTION
-
-    private final Either<ActionModel, PropertyModel> actionOrPropertyModel;
-
-    private FormExecutorDefault(
-            final Either<ActionModel, PropertyModel> actionOrPropertyModel) {
-        this.actionOrPropertyModel = actionOrPropertyModel;
-    }
-
     /**
      * @return <tt>false</tt> - if invalid args;
      * <tt>true</tt> if redirecting to new page, or repainting all components
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/PanelBase.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/PanelBase.java
index 5f53bfd5096..d18c47e7481 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/PanelBase.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/PanelBase.java
@@ -35,7 +35,7 @@
 import 
org.apache.causeway.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import 
org.apache.causeway.viewer.wicket.ui.app.registry.HasComponentFactoryRegistry;
 import 
org.apache.causeway.viewer.wicket.ui.components.tree.themes.TreeThemeProvider;
-import 
org.apache.causeway.viewer.wicket.ui.components.tree.themes.TreeThemeProviderDefault;
+import 
org.apache.causeway.viewer.wicket.ui.components.tree.themes.TreeThemeProviderBootstrap;
 import org.apache.causeway.viewer.wicket.ui.pages.EmailVerificationUrlService;
 import org.apache.causeway.viewer.wicket.ui.pages.PageClassRegistry;
 import org.apache.causeway.viewer.wicket.ui.pages.PageNavigationService;
@@ -75,7 +75,7 @@ public LanguageProvider getLanguageProvider() {
 
     private transient TreeThemeProvider treeThemeProvider;
     protected TreeThemeProvider getTreeThemeProvider() {
-        return treeThemeProvider = 
computeIfAbsentOrFallback(TreeThemeProvider.class, treeThemeProvider, 
TreeThemeProviderDefault::new);
+        return treeThemeProvider = 
computeIfAbsentOrFallback(TreeThemeProvider.class, treeThemeProvider, 
TreeThemeProviderBootstrap::new);
     }
 
     private transient EmailNotificationService emailNotificationService;
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/PromptFormAbstract.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/PromptFormAbstract.java
index 3e8cdedf7f1..7170a8dd910 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/PromptFormAbstract.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/panels/PromptFormAbstract.java
@@ -201,7 +201,7 @@ private void rebuildGuiAfterInlinePromptDone(final 
AjaxRequestTarget target) {
         // change visibility of inline components
         
formExecutorContext().getInlinePromptContext().onCancel(getMemberModel());
 
-        
Optional.ofNullable(formExecutorContext().getInlinePromptContext().getScalarTypeContainer())
+        
Optional.ofNullable(formExecutorContext().getInlinePromptContext().scalarTypeContainer())
         .ifPresent(scalarTypeContainer->{
             Wkt.javaScriptAdd(target, EventTopic.FOCUS_FIRST_PROPERTY, 
scalarTypeContainer.getMarkupId());
         });
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/Timing.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/Timing.java
deleted file mode 100644
index d3317d6ea9b..00000000000
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/Timing.java
+++ /dev/null
@@ -1,31 +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.viewer.wicket.viewer.integration;
-
-class Timing {
-    private final long startTime;
-
-    Timing() {
-        this.startTime = System.currentTimeMillis();
-    }
-
-    long took() {
-        return System.currentTimeMillis() - startTime;
-    }
-}
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
index b24b01fd56f..f847d353f39 100644
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
+++ 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
@@ -43,7 +43,6 @@
 import org.apache.wicket.request.cycle.PageRequestHandlerTracker;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-
 import org.jspecify.annotations.Nullable;
 
 import 
org.apache.causeway.applib.exceptions.unrecoverable.BookmarkNotFoundException;
@@ -58,6 +57,8 @@
 import org.apache.causeway.applib.services.user.UserService;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Strings;
+import org.apache.causeway.commons.internal.base._Timing;
+import org.apache.causeway.commons.internal.base._Timing.StopWatch;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 import 
org.apache.causeway.core.metamodel.specloader.validator.MetaModelInvalidException;
@@ -121,7 +122,7 @@ static boolean isExpiryMessageTimeframeExpired() {
     @Setter
     private PageClassRegistry pageClassRegistry;
 
-    private static ThreadLocal<Timing> timings = 
ThreadLocal.withInitial(Timing::new);
+    private static ThreadLocal<StopWatch> timings = 
ThreadLocal.withInitial(_Timing::now);
 
     @Override
     public synchronized void onBeginRequest(final RequestCycle requestCycle) {
@@ -186,7 +187,7 @@ public synchronized void onBeginRequest(final RequestCycle 
requestCycle) {
         }
 
         if(log.isDebugEnabled()) {
-            timings.set(new Timing());
+            timings.set(_Timing.now());
         }
     }
 
@@ -273,7 +274,7 @@ public synchronized void onEndRequest(final RequestCycle 
requestCycle) {
 
         if(log.isDebugEnabled()) {
             var metricsServiceIfAny = 
getMetaModelContext().lookupService(MetricsService.class);
-            long took = timings.get().took();
+            long took = timings.get().getMillis();
             if(took > 50) {  // avoid too much clutter
                 if(metricsServiceIfAny.isPresent()) {
                     var metricsService = metricsServiceIfAny.get();
@@ -303,7 +304,7 @@ public void onDetach(final RequestCycle requestCycle) {
     public IRequestHandler onException(final RequestCycle cycle, final 
Exception ex) {
 
         if(log.isDebugEnabled()) {
-            log.debug("onException {}  took: {}ms", 
ex.getClass().getSimpleName(), timings.get().took());
+            log.debug("onException {}  took: {}ms", 
ex.getClass().getSimpleName(), timings.get().getMillis());
         }
 
         // using side-effect free access to MM validation result
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
index 47d105b8c98..11b79f46c09 100644
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
+++ 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
@@ -30,6 +30,7 @@
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.commons.internal.collections._Maps;
@@ -44,7 +45,9 @@
  * Default implementation of {@link PageClassRegistry}; just delegates to an
  * underlying {@link PageClassList}.
  */
+@Service
 public class PageClassRegistryDefault implements PageClassRegistry, 
PageClassRegistrySpi {
+    private static final long serialVersionUID = 1L;
 
     public static final String LOGICAL_TYPE_NAME =
             CausewayModuleViewerWicketViewer.NAMESPACE + 
".PageClassRegistryDefault";
@@ -55,19 +58,17 @@ public static class AutoConfiguration {
         @Named(LOGICAL_TYPE_NAME)
         @Order(PriorityPrecedence.MIDPOINT)
         @Qualifier("Default")
-        public PageClassRegistryDefault pageClassRegistryDefault(PageClassList 
pageClassList) {
+        public PageClassRegistryDefault pageClassRegistryDefault(final 
PageClassList pageClassList) {
             return new PageClassRegistryDefault(pageClassList);
         }
     }
 
-    private static final long serialVersionUID = 1L;
-
     private final PageClassList pageClassList; // serializable
     private final Map<PageType, Class<? extends Page>> pageClassByType = 
_Maps.newHashMap();
     private final Map<Class<? extends Page>, PageType> typeByPageClass = 
_Maps.newHashMap();
 
     @Inject
-    public PageClassRegistryDefault(PageClassList pageClassList) {
+    public PageClassRegistryDefault(final PageClassList pageClassList) {
         this.pageClassList = pageClassList;
     }
 
@@ -91,12 +92,12 @@ public final Class<? extends Page> getPageClass(final 
PageType pageType) {
     }
 
     @Override
-    public PageType getPageType(Class<? extends Page> pageClass) {
+    public PageType getPageType(final Class<? extends Page> pageClass) {
         return typeByPageClass.get(pageClass);
     }
 
     @Override
-    public PageType getPageType(PageAbstract page) {
+    public PageType getPageType(final PageAbstract page) {
         return getPageType(page.getClass());
     }
 
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/_PageFactory.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/_PageFactory.java
index e1f1ae0345d..81275d744f9 100644
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/_PageFactory.java
+++ 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/_PageFactory.java
@@ -27,8 +27,6 @@
 import org.apache.causeway.viewer.wicket.model.models.PageType;
 import org.apache.causeway.viewer.wicket.ui.pages.obj.DomainObjectPage;
 
-import lombok.RequiredArgsConstructor;
-
 /**
  * Uses Wicket's default page factory, except for {@link DomainObjectPage}s 
which require special instantiation:
  * <p>
@@ -38,43 +36,32 @@
  *
  * @since 2.0
  */
-@RequiredArgsConstructor
-class _PageFactory implements IPageFactory {
-
-    private final CausewayWicketApplication holder;
-    private final IPageFactory delegate;
+record _PageFactory(
+        CausewayWicketApplication holder,
+        IPageFactory delegate) implements IPageFactory {
 
     @Override
     public <C extends IRequestablePage> C newPage(final Class<C> pageClass, 
final PageParameters parameters) {
-
         if(DomainObjectPage.class.equals(pageClass)) {
             return 
_Casts.uncheckedCast(DomainObjectPage.forPageParameters(parameters));
         }
-
         return delegate.newPage(pageClass, parameters);
     }
 
     @Override
     public <C extends IRequestablePage> C newPage(final Class<C> pageClass) {
-
         if(DomainObjectPage.class.equals(pageClass)) {
             //TODO whenever this happens we should redirect to home,
             // almost certainly the session has timed out
-
             var pageTimeoutPageClass = 
holder.getPageClassRegistry().getPageClass(PageType.HOME_AFTER_PAGETIMEOUT);
             return 
_Casts.uncheckedCast(delegate.newPage(pageTimeoutPageClass));
         }
-
         return delegate.newPage(pageClass);
     }
 
     @Override
     public <C extends IRequestablePage> boolean isBookmarkable(final Class<C> 
pageClass) {
-
-        if(DomainObjectPage.class.equals(pageClass)) {
-            return true;
-        }
-
+        if(DomainObjectPage.class.equals(pageClass)) return true;
         return delegate.isBookmarkable(pageClass);
     }
 

Reply via email to