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

commit 0b563d9f22df554b1a8fcf4faa64101fb19a7740
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Fri Sep 26 09:24:18 2025 +0200

    CAUSEWAY-3905: refactoring around icon handling
---
 .../applib/services/linking/DeepLinkService.java   |  3 +-
 .../services/render/ObjectRenderService.java       |  1 +
 .../wicket/model/models/BookmarkTreeNode.java      | 81 +++++++++-------------
 .../wicket/model/models/BookmarkedPagesModel.java  |  2 +-
 ...ache.java => IconResourceReferenceFactory.java} |  6 +-
 .../viewer/wicket/model/models/UiObjectWkt.java    | 29 --------
 .../bookmarkedpages/BookmarkedPagesPanel.java      | 45 ++++++++++--
 .../object/icontitle/ObjectIconAndTitlePanel.java  |  2 +-
 .../viewer/wicket/ui/panels/PanelBase.java         |  8 +--
 .../viewer/CausewayModuleViewerWicketViewer.java   |  5 +-
 ...va => IconResourceReferenceFactoryDefault.java} | 35 ++--------
 .../viewer/services/ObjectRenderServiceWicket.java |  6 +-
 12 files changed, 90 insertions(+), 133 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/linking/DeepLinkService.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/linking/DeepLinkService.java
index ac1fb575bcc..fa9b20d1908 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/linking/DeepLinkService.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/linking/DeepLinkService.java
@@ -30,7 +30,7 @@
  * <p>Note that the implementation is specific to the viewer(s).  At the time
  * of writing only one implementation is available, for the Wicket viewer.
  *
- * @since 1.x revised for 4.x {@index}
+ * @since 1.x {@index}
  */
 public interface DeepLinkService {
 
@@ -39,5 +39,4 @@ public interface DeepLinkService {
      * Causeway viewers.
      */
     URI deepLinkFor(Object domainObject);
-
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/render/ObjectRenderService.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/render/ObjectRenderService.java
index 278680316d4..ef2840d3bd0 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/render/ObjectRenderService.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/render/ObjectRenderService.java
@@ -25,6 +25,7 @@
 /**
  * <h1>Experimental</h1>
  * Service that renders various aspects of a domain object, enum or value, as 
presented with the UI.
+ * Currently handling icons only, but could be extended in the future.
  * <ul>
  * <li>icon</li>
  * <li>title</li>
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BookmarkTreeNode.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BookmarkTreeNode.java
index d900f256b4f..c7eb6027dc8 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BookmarkTreeNode.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BookmarkTreeNode.java
@@ -19,42 +19,37 @@
 package org.apache.causeway.viewer.wicket.model.models;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.LongAdder;
-import java.util.function.Consumer;
 
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.request.resource.ResourceReference;
 import org.jspecify.annotations.NonNull;
 
 import org.apache.causeway.applib.annotation.ObjectSupport.IconSize;
-import org.apache.causeway.applib.fa.FontAwesomeLayers;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
-import org.apache.causeway.applib.services.render.ObjectIconEmbedded;
+import org.apache.causeway.applib.services.render.ObjectIcon;
+import org.apache.causeway.applib.services.render.ObjectIconUrlBased;
 import org.apache.causeway.commons.internal.base._Casts;
-import org.apache.causeway.commons.internal.collections._Lists;
 import org.apache.causeway.commons.internal.functions._Functions;
+import org.apache.causeway.viewer.commons.model.mixin.HasIcon;
 
-import lombok.Getter;
-
-public class BookmarkTreeNode
+public record BookmarkTreeNode(
+    Bookmark bookmark,
+    PageParameters pageParameters,
+    AtomicReference<String> titleRef,
+    /**
+     * @implNote While {@link ObjectIcon} is serializable,
+     * with the {@link ObjectIconUrlBased} case we don't want to include image 
data (just the URL)
+     */
+    ObjectIcon objectIcon,
+    int depth, // starting at root with depth = 0
+    List<BookmarkTreeNode> children)
 implements
     Comparable<BookmarkTreeNode>, Serializable {
 
-    private static final long serialVersionUID = 1L;
-
-    @Getter private final List<BookmarkTreeNode> children = 
_Lists.newArrayList();
-    @Getter private final int depth; // starting at root with depth = 0
-    @Getter private final @NonNull Bookmark bookmark;
-    @Getter private final @NonNull PageParameters pageParameters;
-
-    @Getter private String title;
-
-    private ResourceReference iconResourceReference;
-    private FontAwesomeLayers faLayers;
-    private ObjectIconEmbedded embedded;
-
     // -- FACTORIES
 
     public static BookmarkTreeNode newRoot(
@@ -70,30 +65,16 @@ private BookmarkTreeNode(
             final @NonNull BookmarkableModel bookmarkableModel,
             final int depth) {
 
-        this.pageParameters = 
bookmarkableModel.getPageParametersWithoutUiHints();
-        this.bookmark = bookmark;
-        this.title = bookmarkableModel.getTitle();
-
-        _Casts.castTo(UiObjectWkt.class, bookmarkableModel)
-        .ifPresent(x->x.visitIconVariantOrElse(
-                IconSize.MEDIUM,
-                rref->{this.iconResourceReference = rref;},
-                embedded->{this.embedded = embedded;},
-                faLayers->{this.faLayers = faLayers;},
-                ()->{}));
-
-        this.depth = depth;
+        this(bookmark, bookmarkableModel.getPageParametersWithoutUiHints(),
+            new AtomicReference<>(bookmarkableModel.getTitle()),
+            _Casts.castTo(HasIcon.class, bookmarkableModel)
+                .map(x->x.getIcon(IconSize.MEDIUM))
+                .orElse(null),
+            depth, new ArrayList<>());
     }
 
-    public void visitIconVariantOrElse(
-            Consumer<ResourceReference> a,
-            Consumer<ObjectIconEmbedded> b,
-            Consumer<FontAwesomeLayers> c,
-            Runnable onNoMatch) {
-        if(this.iconResourceReference!=null) a.accept(iconResourceReference);
-        else if(this.embedded!=null) b.accept(embedded);
-        else if(this.faLayers!=null) c.accept(faLayers);
-        else onNoMatch.run();
+    public String title() {
+        return titleRef.get();
     }
 
     // -- COMPARATOR
@@ -104,15 +85,15 @@ public int compareTo(final BookmarkTreeNode o2) {
         var o1 = this;
 
         // sort by entity type
-        var typeName1 = o1.getBookmark().logicalTypeName();
-        var typeName2 = o2.getBookmark().logicalTypeName();
+        var typeName1 = o1.bookmark().logicalTypeName();
+        var typeName2 = o2.bookmark().logicalTypeName();
 
         final int typeNameComparison = typeName1.compareTo(typeName2);
         if(typeNameComparison != 0) {
             return typeNameComparison;
         }
 
-        return o1.getTitle().compareTo(o2.getTitle());
+        return o1.title().compareTo(o2.title());
     }
 
     /**
@@ -163,14 +144,14 @@ private Optional<BookmarkTreeNode> addChild(final 
BookmarkableModel childModel)
      */
     private boolean matchAndUpdateTitleFor(final UiObjectWkt 
candidateEntityModel) {
         var candidateBookmark = candidateEntityModel.toBookmark().orElse(null);
-        boolean inGraph = getBookmark().equals(candidateBookmark);
+        boolean inGraph = bookmark().equals(candidateBookmark);
         if(inGraph) {
-            this.title = candidateEntityModel.getTitle();
+            this.titleRef.set(candidateEntityModel.getTitle());
         }
 
         // and also match recursively down to all children and grand-children.
         if(candidateEntityModel.getBookmarkPolicy().isChild()) {
-            for(BookmarkTreeNode childNode: this.getChildren()) {
+            for(BookmarkTreeNode childNode: this.children()) {
                 inGraph = childNode.matches(candidateEntityModel) || inGraph; 
// evaluate each
             }
 
@@ -190,7 +171,7 @@ private boolean addToGraphIfParented(final 
BookmarkableModel candidateBookmarkab
         var addedCount = new LongAdder();
 
         candidateBookmarkableModel.streamPropertyBookmarks()
-        .filter(getBookmark()::equals)
+        .filter(bookmark()::equals)
         .forEach(propBookmark->{
             if(this.addChild(candidateBookmarkableModel).isPresent()) {
                 addedCount.increment();
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 018cec48a59..31c3eee8eec 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
@@ -96,7 +96,7 @@ public void remove(final BookmarkTreeNode rootNode) {
 
     public void remove(final UiObjectWkt objectModel) {
         var bookmark = objectModel.getOwnerBookmark();
-        rootNodes.removeIf(node->node.getBookmark().equals(bookmark));
+        rootNodes.removeIf(node->node.bookmark().equals(bookmark));
         depthFirstGraph.clear();
     }
 
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ImageResourceCache.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/IconResourceReferenceFactory.java
similarity index 85%
rename from 
viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ImageResourceCache.java
rename to 
viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/IconResourceReferenceFactory.java
index 07329c716a0..cc0c2d8c04d 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ImageResourceCache.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/IconResourceReferenceFactory.java
@@ -18,14 +18,12 @@
  */
 package org.apache.causeway.viewer.wicket.model.models;
 
-import java.io.Serializable;
-
 import org.apache.wicket.request.resource.ResourceReference;
 
 import org.apache.causeway.applib.services.render.ObjectIconUrlBased;
 
-public interface ImageResourceCache extends Serializable {
+public interface IconResourceReferenceFactory {
 
-    ResourceReference resourceReferenceForObjectIcon(final ObjectIconUrlBased 
objectIcon);
+    ResourceReference resourceReferenceForObjectIcon(ObjectIconUrlBased 
objectIcon);
 
 }
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
index dc557e60717..e19af684d01 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
@@ -21,23 +21,19 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
-import java.util.function.Consumer;
 import java.util.stream.Stream;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.request.resource.ResourceReference;
 import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.applib.Identifier;
 import org.apache.causeway.applib.annotation.ObjectSupport.IconSize;
 import 
org.apache.causeway.applib.exceptions.unrecoverable.ObjectNotFoundException;
-import org.apache.causeway.applib.fa.FontAwesomeLayers;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.applib.services.hint.HintStore;
 import org.apache.causeway.applib.services.render.ObjectIcon;
-import org.apache.causeway.applib.services.render.ObjectIconEmbedded;
 import org.apache.causeway.commons.internal.assertions._Assert;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.core.metamodel.commons.ViewOrEditMode;
@@ -189,26 +185,6 @@ public ObjectIcon getIcon(IconSize iconSize) {
         return getManagedObject().getIcon(iconSize);
     }
 
-    public void visitIconVariantOrElse(
-            IconSize iconSize,
-            Consumer<ResourceReference> a,
-            Consumer<ObjectIconEmbedded> b,
-            Consumer<FontAwesomeLayers> c,
-            Runnable onNoMatch) {
-        visitIconVariant(
-            iconSize,
-            urlBased->{
-                var rref = 
imageResourceCache().resourceReferenceForObjectIcon(urlBased);
-                if(rref!=null) {
-                    a.accept(rref);
-                } else {
-                    onNoMatch.run();
-                }
-            },
-            embedded->b.accept(embedded),
-            fa->c.accept(fa.fontAwesomeLayers()));
-    }
-
     @Override
     public ManagedObject getManagedObject() {
         return getObject();
@@ -329,9 +305,4 @@ private HintStore hintStore() {
         return hintStore = 
getMetaModelContext().loadServiceIfAbsent(HintStore.class, hintStore);
     }
 
-    private transient ImageResourceCache imageResourceCache;
-    private ImageResourceCache imageResourceCache() {
-        return imageResourceCache = 
getMetaModelContext().loadServiceIfAbsent(ImageResourceCache.class, 
imageResourceCache);
-    }
-
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/bookmarkedpages/BookmarkedPagesPanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/bookmarkedpages/BookmarkedPagesPanel.java
index 6a06a14e5e1..f823a23ae64 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/bookmarkedpages/BookmarkedPagesPanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/bookmarkedpages/BookmarkedPagesPanel.java
@@ -19,6 +19,7 @@
 package org.apache.causeway.viewer.wicket.ui.components.bookmarkedpages;
 
 import java.util.List;
+import java.util.function.Consumer;
 
 import jakarta.inject.Inject;
 
@@ -31,9 +32,14 @@
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.resource.CssResourceReference;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.util.string.Strings;
 
 import 
org.apache.causeway.applib.exceptions.unrecoverable.ObjectNotFoundException;
+import org.apache.causeway.applib.fa.FontAwesomeLayers;
+import org.apache.causeway.applib.services.render.ObjectIconEmbedded;
+import org.apache.causeway.applib.services.render.ObjectIconFa;
+import org.apache.causeway.applib.services.render.ObjectIconUrlBased;
 import org.apache.causeway.applib.value.Markup;
 import org.apache.causeway.viewer.wicket.model.models.BookmarkTreeNode;
 import org.apache.causeway.viewer.wicket.model.models.BookmarkedPagesModel;
@@ -63,8 +69,7 @@ class BookmarkedPagesPanel
 
     private static final JavaScriptResourceReference SLIDE_PANEL_JS = new 
JavaScriptResourceReference(BookmarkedPagesPanel.class, "slide-panel.js");
 
-    @Inject
-    private PageClassRegistry pageClassRegistry;
+    @Inject private PageClassRegistry pageClassRegistry;
 
     public BookmarkedPagesPanel(final String id, final BookmarkedPagesModel 
bookmarkedPagesModel) {
         super(id, bookmarkedPagesModel);
@@ -128,17 +133,17 @@ public void renderHead(final IHeaderResponse response) {
                     target.add(container, clearAllBookmarksLink);
                 });
 
-                if(bookmarkNode.getDepth() == 0) {
+                if(bookmarkNode.depth() == 0) {
                     Wkt.cssAppend(clearBookmarkLink, "clearBookmark");
                 } else {
                     clearBookmarkLink.setEnabled(true);
                 }
 
                 var link = Wkt.add(item, 
WktLinks.newBookmarkablePageLink(ID_BOOKMARKED_PAGE_LINK,
-                                bookmarkNode.getPageParameters(),
+                                bookmarkNode.pageParameters(),
                                 
pageClassRegistry.getPageClass(PageType.DOMAIN_OBJECT)));
 
-                bookmarkNode.visitIconVariantOrElse(
+                visitIconVariantOrElse(bookmarkNode,
                         iconResourceRef->{
                             Wkt.imageAddCachable(link, 
ID_BOOKMARKED_PAGE_ICON, iconResourceRef);
                             WktComponents.permanentlyHide(link, 
ID_BOOKMARKED_PAGE_ICON_FA);
@@ -157,14 +162,14 @@ public void renderHead(final IHeaderResponse response) {
                             WktComponents.permanentlyHide(link, 
ID_BOOKMARKED_PAGE_ICON);
                         });
 
-                Wkt.labelAdd(link, ID_BOOKMARKED_PAGE_TITLE, 
bookmarkNode.getTitle());
+                Wkt.labelAdd(link, ID_BOOKMARKED_PAGE_TITLE, 
bookmarkNode.title());
 
 //XXX seems broken when there is only one bookmark entry;
 // an alternative idea would be to render the item differently eg. bold, but 
don't disable it
 //                    if(bookmarkedPagesModel.isCurrent(pageParameters)) {
 //                        item.add(new CssClassAppender("disabled"));
 //                    }
-                Wkt.cssAppend(item, "bookmarkDepth" + bookmarkNode.getDepth());
+                Wkt.cssAppend(item, "bookmarkDepth" + bookmarkNode.depth());
             } catch(ObjectNotFoundException ex) {
                 // ignore
                 // this is a partial fix for an infinite redirect loop.
@@ -186,4 +191,30 @@ protected void onConfigure() {
         };
     }
 
+    // -- HELPER
+
+    private void visitIconVariantOrElse(
+            BookmarkTreeNode treeNode,
+            Consumer<ResourceReference> a,
+            Consumer<ObjectIconEmbedded> b,
+            Consumer<FontAwesomeLayers> c,
+            Runnable onNoMatch) {
+
+        var objectIcon = treeNode.objectIcon();
+        if(objectIcon instanceof ObjectIconUrlBased urlBased) {
+            var rref = 
getIconResourceReferenceFactory().resourceReferenceForObjectIcon(urlBased);
+            if(rref!=null) {
+                a.accept(rref);
+            } else {
+                onNoMatch.run();
+            }
+        } else if(objectIcon instanceof ObjectIconEmbedded embedded) {
+            b.accept(embedded);
+        } else if(objectIcon instanceof ObjectIconFa fa) {
+            c.accept(fa.fontAwesomeLayers());
+        } else {
+            onNoMatch.run();
+        }
+    }
+
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/icontitle/ObjectIconAndTitlePanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/icontitle/ObjectIconAndTitlePanel.java
index af68fbc2692..a5eb85d0982 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/icontitle/ObjectIconAndTitlePanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/object/icontitle/ObjectIconAndTitlePanel.java
@@ -126,7 +126,7 @@ private AbstractLink createLinkWithIconAndTitle(IconSize 
iconSize) {
                 iconSize,
                 iconUrlBased->{
                     Wkt.imageAddCachable(link, ID_OBJECT_ICON,
-                        
getImageResourceCache().resourceReferenceForObjectIcon(iconUrlBased))
+                        
getIconResourceReferenceFactory().resourceReferenceForObjectIcon(iconUrlBased))
                         .add(cssClassNameModifier("objectIcon", iconSize));
                     WktComponents.permanentlyHide(link, 
ID_OBJECT_FONT_AWESOME_LEFT);
                     WktComponents.permanentlyHide(link, 
ID_OBJECT_FONT_AWESOME_RIGHT);
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 cb4e9e44ed2..bc31613afa5 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
@@ -30,7 +30,7 @@
 import org.apache.causeway.viewer.commons.applib.services.header.HeaderUiModel;
 import 
org.apache.causeway.viewer.commons.applib.services.header.HeaderUiService;
 import org.apache.causeway.viewer.wicket.model.hints.UiHintContainer;
-import org.apache.causeway.viewer.wicket.model.models.ImageResourceCache;
+import 
org.apache.causeway.viewer.wicket.model.models.IconResourceReferenceFactory;
 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;
@@ -62,9 +62,9 @@ public PageClassRegistry getPageClassRegistry() {
         return pageClassRegistry = computeIfAbsent(PageClassRegistry.class, 
pageClassRegistry);
     }
 
-    private transient ImageResourceCache imageCache;
-    public ImageResourceCache getImageResourceCache() {
-        return imageCache = computeIfAbsent(ImageResourceCache.class, 
imageCache);
+    private transient IconResourceReferenceFactory 
iconResourceReferenceFactory;
+    public IconResourceReferenceFactory getIconResourceReferenceFactory() {
+        return iconResourceReferenceFactory = 
computeIfAbsent(IconResourceReferenceFactory.class, 
iconResourceReferenceFactory);
     }
 
     private transient LanguageProvider localeProvider;
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/CausewayModuleViewerWicketViewer.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/CausewayModuleViewerWicketViewer.java
index 11c256b51dd..8746f572e7c 100644
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/CausewayModuleViewerWicketViewer.java
+++ 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/CausewayModuleViewerWicketViewer.java
@@ -29,7 +29,7 @@
 import 
org.apache.causeway.viewer.wicket.viewer.services.BookmarkUiServiceWicket;
 import org.apache.causeway.viewer.wicket.viewer.services.DeepLinkServiceWicket;
 import 
org.apache.causeway.viewer.wicket.viewer.services.HintStoreUsingWicketSession;
-import 
org.apache.causeway.viewer.wicket.viewer.services.ImageResourceCacheClassPath;
+import 
org.apache.causeway.viewer.wicket.viewer.services.IconResourceReferenceFactoryDefault;
 import 
org.apache.causeway.viewer.wicket.viewer.services.ObjectRenderServiceWicket;
 import org.apache.causeway.viewer.wicket.viewer.webmodule.WebModuleWicket;
 import 
org.apache.causeway.viewer.wicket.viewer.wicketapp.config.BootstrapInitWkt;
@@ -62,14 +62,13 @@
         BookmarkUiServiceWicket.class,
         DeepLinkServiceWicket.class,
         ObjectRenderServiceWicket.class,
+        IconResourceReferenceFactoryDefault.class,
         WebModuleWicket.class,
 
         PageClassListDefault.AutoConfiguration.class,
         PageClassRegistryDefault.AutoConfiguration.class,
         PageNavigationServiceDefault.AutoConfiguration.class,
-
         HintStoreUsingWicketSession.AutoConfiguration.class,
-        ImageResourceCacheClassPath.AutoConfiguration.class,
 
 })
 public class CausewayModuleViewerWicketViewer {
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/IconResourceReferenceFactoryDefault.java
similarity index 74%
rename from 
viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java
rename to 
viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/IconResourceReferenceFactoryDefault.java
index 2880b74e38d..d3a1daa59d7 100644
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/ImageResourceCacheClassPath.java
+++ 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/IconResourceReferenceFactoryDefault.java
@@ -30,41 +30,18 @@
 import org.apache.wicket.request.resource.ResourceReference;
 import org.jspecify.annotations.NonNull;
 
-import org.springframework.beans.factory.annotation.Qualifier;
-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.applib.services.render.ObjectIconUrlBased;
-import org.apache.causeway.viewer.wicket.model.models.ImageResourceCache;
+import 
org.apache.causeway.viewer.wicket.model.models.IconResourceReferenceFactory;
 import 
org.apache.causeway.viewer.wicket.viewer.CausewayModuleViewerWicketViewer;
 
 import lombok.RequiredArgsConstructor;
 
-/**
- * Caches images loaded either from the same package as the specified object,
- * or from the <tt>images</tt> package otherwise.
- * <p>
- * Searches for a fixed set of suffixes: <code>png, gif, jpeg, jpg, svg</code>.
- */
-public class ImageResourceCacheClassPath
-implements ImageResourceCache {
-
-    public static final String LOGICAL_TYPE_NAME =
-            CausewayModuleViewerWicketViewer.NAMESPACE + 
".ImageResourceCacheClassPath";
-
-    @Configuration(proxyBeanMethods = false)
-    public static class AutoConfiguration {
-        @Bean
-        @Named(LOGICAL_TYPE_NAME)
-        @Order(PriorityPrecedence.MIDPOINT)
-        @Qualifier("ClassPath")
-        public ImageResourceCacheClassPath imageResourceCacheClassPath() {
-            return new ImageResourceCacheClassPath();
-        }
-    }
-    private static final long serialVersionUID = 1L;
+@Service
+@Named(CausewayModuleViewerWicketViewer.NAMESPACE + 
".IconResourceReferenceFactoryDefault")
+public record IconResourceReferenceFactoryDefault()
+implements IconResourceReferenceFactory {
 
     @Override
     public ResourceReference resourceReferenceForObjectIcon(final 
ObjectIconUrlBased objectIcon) {
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/ObjectRenderServiceWicket.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/ObjectRenderServiceWicket.java
index d9b3b0f2950..ead0213ece1 100644
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/ObjectRenderServiceWicket.java
+++ 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/services/ObjectRenderServiceWicket.java
@@ -36,7 +36,7 @@
 import org.apache.causeway.applib.services.render.ObjectIconFa;
 import org.apache.causeway.applib.services.render.ObjectIconUrlBased;
 import org.apache.causeway.applib.services.render.ObjectRenderService;
-import org.apache.causeway.viewer.wicket.model.models.ImageResourceCache;
+import 
org.apache.causeway.viewer.wicket.model.models.IconResourceReferenceFactory;
 import 
org.apache.causeway.viewer.wicket.viewer.CausewayModuleViewerWicketViewer;
 
 @Service
@@ -45,12 +45,12 @@
 @Qualifier("Wicket")
 public class ObjectRenderServiceWicket implements ObjectRenderService {
 
-    @Inject private ImageResourceCache imageResourceCache;
+    @Inject private IconResourceReferenceFactory iconResourceReferenceFactory;
 
     @Override
     public String iconToHtml(@Nullable final ObjectIcon objectIcon, final 
IconSize iconSize) {
         if(objectIcon instanceof ObjectIconUrlBased urlBased) {
-            ResourceReference resourceReference = 
imageResourceCache.resourceReferenceForObjectIcon(urlBased);
+            ResourceReference resourceReference = 
iconResourceReferenceFactory.resourceReferenceForObjectIcon(urlBased);
             // Get the URL for the ResourceReference
             String iconUrl = RequestCycle.get().urlFor(resourceReference, 
null).toString();
             String fullUrl = 
RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(iconUrl));

Reply via email to