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));