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

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


The following commit(s) were added to refs/heads/v4 by this push:
     new 9fc9af1314c CAUSEWAY-3889: makes ObjectIcon a record
9fc9af1314c is described below

commit 9fc9af1314c3e568b10dc400a3b54d9a7e4fe952
Author: a.huber <[email protected]>
AuthorDate: Mon Aug 18 07:17:37 2025 +0200

    CAUSEWAY-3889: makes ObjectIcon a record
    
    also doing some method renaming around mime support
---
 .../org/apache/causeway/applib/value/Blob.java     |  4 +-
 .../org/apache/causeway/applib/value/Clob.java     |  6 +--
 .../org/apache/causeway/applib/value/Markup.java   |  2 +-
 .../causeway/applib/value/NamedWithMimeType.java   | 10 ++--
 .../commons/internal/base/_StableValue.java        |  9 +++-
 .../metamodel/facets/object/icon/ObjectIcon.java   | 57 ++++++++++-----------
 .../services/grid/GridLoaderServiceDefault.java    |  7 +--
 .../services/layout/LayoutServiceDefault.java      |  5 +-
 .../BufferedImageValueSemantics.java               |  3 +-
 .../CausewayModuleCoreRuntimeServices.java         |  4 +-
 .../icons/ObjectIconServiceDefault.java            | 58 +++++++++-------------
 .../resources/DomainObjectResourceServerside.java  |  2 +-
 .../export/CollectionContentsAsExportFactory.java  |  2 +-
 .../apache/causeway/viewer/wicket/ui/util/Wkt.java |  5 +-
 .../services/ImageResourceCacheClassPath.java      |  8 +--
 15 files changed, 89 insertions(+), 93 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/value/Blob.java 
b/api/applib/src/main/java/org/apache/causeway/applib/value/Blob.java
index b40fd201ff1..b55f040ee66 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/value/Blob.java
+++ b/api/applib/src/main/java/org/apache/causeway/applib/value/Blob.java
@@ -104,8 +104,8 @@ public record Blob(
      * @return new {@link Blob}
      */
     public static Blob of(final String name, final CommonMimeType mimeType, 
final byte[] content) {
-        var fileName = _Strings.asFileNameWithExtension(name, 
mimeType.getProposedFileExtensions());
-        return new Blob(fileName, mimeType.getMimeType(), content);
+        var fileName = _Strings.asFileNameWithExtension(name, 
mimeType.proposedFileExtensions());
+        return new Blob(fileName, mimeType.baseType(), content);
     }
 
     /**
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/value/Clob.java 
b/api/applib/src/main/java/org/apache/causeway/applib/value/Clob.java
index 469d3c69a35..f8bd0ae16ce 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/value/Clob.java
+++ b/api/applib/src/main/java/org/apache/causeway/applib/value/Clob.java
@@ -38,6 +38,7 @@
 import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
+import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.applib.CausewayModuleApplib;
@@ -47,7 +48,6 @@
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.io.DataSource;
 
-import org.jspecify.annotations.NonNull;
 import lombok.SneakyThrows;
 
 /**
@@ -97,8 +97,8 @@ public record Clob(
      * @return new {@link Clob}
      */
     public static Clob of(final String name, final CommonMimeType mimeType, 
final CharSequence content) {
-        var fileName = _Strings.asFileNameWithExtension(name, 
mimeType.getProposedFileExtensions());
-        return new Clob(fileName, mimeType.getMimeType(), content);
+        var fileName = _Strings.asFileNameWithExtension(name, 
mimeType.proposedFileExtensions());
+        return new Clob(fileName, mimeType.mimeType(), content);
     }
 
     /**
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/value/Markup.java 
b/api/applib/src/main/java/org/apache/causeway/applib/value/Markup.java
index 0e21a70cfcc..b680487a0e0 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/value/Markup.java
+++ b/api/applib/src/main/java/org/apache/causeway/applib/value/Markup.java
@@ -64,7 +64,7 @@ public static Markup embeddedImage(final @Nullable DataUri 
dataUri) {
     public static Markup embeddedImage(final ImageType imageType, byte[] 
imageData) {
         Objects.requireNonNull(imageType);
         Objects.requireNonNull(imageData);
-        return embeddedImage(new DataUri(imageType.mimeType().getBaseType(), 
null, Encoding.BASE64, imageData));
+        return embeddedImage(new DataUri(imageType.mimeType().baseType(), 
null, Encoding.BASE64, imageData));
     }
 
     // -- CONSTRUCTION
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/value/NamedWithMimeType.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/value/NamedWithMimeType.java
index 7b9fb036811..b26f1644c9f 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/value/NamedWithMimeType.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/value/NamedWithMimeType.java
@@ -201,11 +201,11 @@ private CommonMimeType(final String primaryType, final 
String ... proposedFileEx
                         : Can.ofSingleton(name().toLowerCase()); // default
         }
 
-        @Getter final MimeType mimeType;
-        @Getter final Can<String> proposedFileExtensions;
+        @Getter @Accessors(fluent=true) final MimeType mimeType;
+        @Getter @Accessors(fluent=true) final Can<String> 
proposedFileExtensions;
 
-        public String getBaseType() {
-            return getMimeType().getBaseType();
+        public String baseType() {
+            return mimeType().getBaseType();
         }
 
         static MimeType newMimeType(final String primaryType, final String 
subtype) {
@@ -237,7 +237,7 @@ public static Optional<CommonMimeType> 
valueOfFileExtension(final @Nullable Stri
             }
             var fileExtLower = fileExt.toLowerCase();
             return Stream.of(CommonMimeType.values())
-                    
.filter(mime->mime.getProposedFileExtensions().contains(fileExtLower))
+                    
.filter(mime->mime.proposedFileExtensions().contains(fileExtLower))
                     .findFirst();
         }
 
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/internal/base/_StableValue.java
 
b/commons/src/main/java/org/apache/causeway/commons/internal/base/_StableValue.java
index e72f76e244d..d43c6d36cc1 100644
--- 
a/commons/src/main/java/org/apache/causeway/commons/internal/base/_StableValue.java
+++ 
b/commons/src/main/java/org/apache/causeway/commons/internal/base/_StableValue.java
@@ -18,6 +18,7 @@
  */
 package org.apache.causeway.commons.internal.base;
 
+import java.io.Serializable;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Supplier;
 
@@ -35,8 +36,11 @@
  * @param <T> the type of the value to be held
  * @since 4.0
  */
-public class _StableValue<T> {
-    private final AtomicReference<T> ref = new AtomicReference<>();
+public record _StableValue<T>(AtomicReference<T> ref) implements Serializable {
+
+    public _StableValue() {
+        this(new AtomicReference<>());
+    }
 
     /**
      * Returns the current value if already set, or sets it using the provided 
supplier
@@ -82,4 +86,5 @@ public T get() {
         }
         return value;
     }
+
 }
\ No newline at end of file
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/ObjectIcon.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/ObjectIcon.java
index 87e277ee968..09656132270 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/ObjectIcon.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/icon/ObjectIcon.java
@@ -21,32 +21,29 @@
 import java.io.InputStream;
 import java.io.Serializable;
 import java.net.URL;
+import java.util.Objects;
 
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
 import org.apache.causeway.commons.internal._Constants;
 import org.apache.causeway.commons.internal.base._Bytes;
+import org.apache.causeway.commons.internal.base._StableValue;
 import org.apache.causeway.commons.internal.base._Strings;
 
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import org.jspecify.annotations.NonNull;
-import lombok.RequiredArgsConstructor;
-import lombok.Synchronized;
-import lombok.ToString;
-
 /**
  * Icon image data class-path resource reference.
  *
  * @see ObjectIconService
  * @since 2.0
  */
-@RequiredArgsConstructor
-@ToString
-@EqualsAndHashCode
-public class ObjectIcon
-implements Serializable {
+public record ObjectIcon(
+        String shortName,
+        URL url,
+        CommonMimeType mimeType,
+        String identifier,
+        _StableValue<byte[]> iconData
+        ) implements Serializable {
 
-    private static final long serialVersionUID = 1L;
+    // -- FACTORIES
 
     /**
      * Create an ObjectIcon and eagerly read in image data from
@@ -57,7 +54,7 @@ public static ObjectIcon eager(
             final URL url,
             final CommonMimeType mimeType) {
         var id = _Strings.base64UrlEncode(url.getPath());
-        var objectIcon = new ObjectIcon(shortName, url, mimeType, id);
+        var objectIcon = new ObjectIcon(shortName, url, mimeType, id, new 
_StableValue<>());
         objectIcon.asBytes(); // memoize
         return objectIcon;
     }
@@ -71,30 +68,30 @@ public static ObjectIcon lazy(
             final URL url,
             final CommonMimeType mimeType) {
         var id = _Strings.base64UrlEncode(url.getPath());
-        return new ObjectIcon(shortName, url, mimeType, id);
+        return new ObjectIcon(shortName, url, mimeType, id, new 
_StableValue<>());
     }
 
-    @Getter private @NonNull String shortName;
-    @Getter private @NonNull URL url;
-    @Getter private @NonNull CommonMimeType mimeType;
-    @Getter private @NonNull String identifier;
+    // -- EQUALITY
 
-    @ToString.Exclude
-    @EqualsAndHashCode.Exclude
-    private transient byte[] iconData;
+    @Override
+    public final boolean equals(Object o) {
+        if(this == o) return true;
+        return o instanceof ObjectIcon other
+            ? Objects.equals(this.shortName, other.shortName)
+                    && Objects.equals(this.url, other.url)
+                    && Objects.equals(this.mimeType, other.mimeType)
+                    && Objects.equals(this.identifier, other.identifier)
+            : false;
+    }
 
-    @Synchronized
     public byte[] asBytes() {
-
-        if(iconData==null) {
+        return iconData.orElseSet(()->{
             try(final InputStream is = url.openStream()){
-                iconData = _Bytes.of(is);
+                return _Bytes.of(is);
             } catch (Exception e) {
-                iconData = _Constants.emptyBytes;
+                return _Constants.emptyBytes;
             }
-        }
-
-        return iconData;
+        });
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoaderServiceDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoaderServiceDefault.java
index 068b2a0e04f..ff695e04027 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoaderServiceDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoaderServiceDefault.java
@@ -30,8 +30,10 @@
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
 
-import org.springframework.beans.factory.annotation.Qualifier;
+import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
+
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -51,7 +53,6 @@
 import 
org.apache.causeway.core.metamodel.services.grid.spi.LayoutResourceLoader;
 
 import lombok.Getter;
-import org.jspecify.annotations.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.experimental.Accessors;
 import lombok.extern.slf4j.Slf4j;
@@ -212,7 +213,7 @@ private Stream<String> streamResourceNameCandidatesFor(
             final @NonNull Class<?> domainClass,
             final @Nullable String layoutIfAny,
             final @NonNull CommonMimeType format) {
-        return format.getProposedFileExtensions().stream()
+        return format.proposedFileExtensions().stream()
                 
.flatMap(fileExtension->streamResourceNameCandidatesFor(domainClass, 
layoutIfAny, fileExtension));
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/layout/LayoutServiceDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/layout/LayoutServiceDefault.java
index c70ec092256..01640bdc3c0 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/layout/LayoutServiceDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/layout/LayoutServiceDefault.java
@@ -25,8 +25,9 @@
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
 
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.jspecify.annotations.Nullable;
+
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -141,7 +142,7 @@ private static String zipEntryNameFor(
         final String fqn = objectSpec.getFullIdentifier();
         return fqn.replace(".", File.separator)
                 + ".layout."
-                + format.getProposedFileExtensions().getFirstElseFail();
+                + format.proposedFileExtensions().getFirstElseFail();
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
index ec2534fa0d5..dfa77b18983 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
@@ -25,6 +25,7 @@
 import jakarta.inject.Named;
 
 import org.jspecify.annotations.Nullable;
+
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -100,7 +101,7 @@ private BufferedImage fromBlobDto(final BlobDto blobDto) {
     private Blob toBlob(final BufferedImage img) {
         return img!=null
                 // arbitrary name and mimetype - not used when recovering the 
image
-                ? new Blob("image", CommonMimeType.PNG.getBaseType(), 
_Images.toBytes(img))
+                ? new Blob("image", CommonMimeType.PNG.baseType(), 
_Images.toBytes(img))
                 : null;
     }
 
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/CausewayModuleCoreRuntimeServices.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/CausewayModuleCoreRuntimeServices.java
index e6203862006..fc5ab2910ea 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/CausewayModuleCoreRuntimeServices.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/CausewayModuleCoreRuntimeServices.java
@@ -19,6 +19,7 @@
 package org.apache.causeway.core.runtimeservices;
 
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 import org.springframework.core.OrderComparator;
@@ -102,7 +103,7 @@
         MenuBarsMarshallerServiceBootstrap.class,
         MenuBarsServiceBootstrap.class,
         MessageServiceDefault.class,
-//        ObjectIconServiceDefault.class, // no longer public, but discovered 
anyway
+//        ObjectIconServiceDefault.class, // no longer public, added to 
ComponentScan below
         ObjectLifecyclePublisherDefault.class,
         PlaceholderRenderServiceDefault.class,
         LifecycleCallbackNotifier.class,
@@ -129,6 +130,7 @@
         ExceptionRecognizerForDataAccessException.class,
 
 })
+@ComponentScan(basePackages = "org.apache.causeway.core.runtimeservices.icons")
 public class CausewayModuleCoreRuntimeServices {
 
     public static final String NAMESPACE = "causeway.runtimeservices";
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/icons/ObjectIconServiceDefault.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/icons/ObjectIconServiceDefault.java
index 12bd8592f46..720abe71b3e 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/icons/ObjectIconServiceDefault.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/icons/ObjectIconServiceDefault.java
@@ -22,7 +22,6 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Stream;
 
 import jakarta.annotation.Priority;
 import jakarta.inject.Inject;
@@ -36,9 +35,7 @@
 import org.springframework.stereotype.Service;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
-import org.apache.causeway.applib.value.NamedWithMimeType;
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
-import org.apache.causeway.applib.value.NamedWithMimeType.ImageType;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._StableValue;
 import org.apache.causeway.commons.internal.base._Strings;
@@ -66,10 +63,12 @@ record ObjectIconServiceDefault(
 implements ObjectIconService {
 
     private static final String DEFAULT_IMAGE_RESOURCE_PATH = 
"classpath:images";
-    private static final Can<CommonMimeType> IMAGE_TYPES =
-            Stream.of(NamedWithMimeType.ImageType.values())
-                .map(ImageType::mimeType)
-                .collect(Can.toCan());
+    /* this is only a subset of NamedWithMimeType.ImageType */
+    private static final Can<CommonMimeType> IMAGE_TYPES = Can.of(
+                CommonMimeType.PNG,
+                CommonMimeType.GIF,
+                CommonMimeType.JPEG,
+                CommonMimeType.SVG);
 
     // non-canonical constructor
     @Inject
@@ -90,19 +89,16 @@ public ObjectIcon getObjectIcon(
         // also memoize unsuccessful icon lookups (as fallback), so we don't 
search repeatedly
 
         var cachedIcon = iconByKey.get(iconResourceKey);
-        if(cachedIcon!=null) {
-            return cachedIcon;
-        }
+        if(cachedIcon!=null) return cachedIcon;
 
         var icon = findIcon(spec, iconNameModifier);
 
+        //NOTE: cannot use computeIfAbsent, as it does not support recursive 
update
+        // return iconByKey.computeIfAbsent(iconResourceKey, key->
+        //     findIcon(spec, iconNameModifier));
         iconByKey.put(iconResourceKey, icon);
 
         return icon;
-
-        //XXX cannot use computeIfAbsent, as it does not support recursive 
update
-        // return iconByKey.computeIfAbsent(iconResourceKey, key->
-        //     findIcon(spec, iconNameModifier));
     }
 
     //@Override
@@ -131,7 +127,7 @@ private ObjectIcon findIcon(
         for(var imageType : IMAGE_TYPES) {
 
             var objectIcon = imageType
-                .getProposedFileExtensions()
+                .proposedFileExtensions()
                 .stream()
                 .map(suffix->iconResourceNameNoExt + "." + suffix)
                 .map(iconResourceName->
@@ -144,10 +140,7 @@ private ObjectIcon findIcon(
                 .map(Optional::get)
                 .findFirst();
 
-            if(objectIcon.isPresent()) {
-                return objectIcon.get(); // short-circuit if found
-            }
-
+            if(objectIcon.isPresent()) return objectIcon.get(); // 
short-circuit if found
         }
 
         // also search the default image resource path
@@ -155,7 +148,7 @@ private ObjectIcon findIcon(
         for(var imageType : IMAGE_TYPES) {
 
             var objectIcon = imageType
-                    .getProposedFileExtensions()
+                    .proposedFileExtensions()
                     .stream()
                     .map(suffix->DEFAULT_IMAGE_RESOURCE_PATH + "/" + 
iconResourceNameNoExt + "." + suffix)
                     .map(iconResourcePath->
@@ -168,19 +161,16 @@ private ObjectIcon findIcon(
                     .map(Optional::get)
                     .findFirst();
 
-            if(objectIcon.isPresent()) {
-                return objectIcon.get(); // short-circuit if found
-            }
-
+            if(objectIcon.isPresent()) return objectIcon.get(); // 
short-circuit if found
         }
 
         return spec.superclass()!=null
-                // continue search in super spec
-                ? getObjectIcon(spec.superclass(), iconNameModifier) // 
memoizes as a side-effect
-                : _Strings.isNotEmpty(iconNameModifier)
-                        // also do a more generic search, skipping the modifier
-                        ? getObjectIcon(spec, null) // memoizes as a 
side-effect
-                        : getObjectFallbackIcon();
+            // continue search in super spec
+            ? getObjectIcon(spec.superclass(), iconNameModifier) // memoizes 
as a side-effect
+            : _Strings.isNotEmpty(iconNameModifier)
+                // also do a more generic search, skipping the modifier
+                ? getObjectIcon(spec, null) // memoizes as a side-effect
+                : getObjectFallbackIcon();
     }
 
     // -- HELPER
@@ -190,12 +180,12 @@ private Optional<URL> classPathResource(
             final @NonNull String absoluteResourceName) {
         if(!absoluteResourceName.startsWith("classpath:")) {
             throw _Exceptions
-            .illegalArgument("invalid absolute resourceName %s", 
absoluteResourceName);
+                .illegalArgument("invalid absolute resourceName %s", 
absoluteResourceName);
         }
         var resource = resourceLoader.getResource(absoluteResourceName);
         return resource.exists()
-                ? Optional.ofNullable(resource.getURL())
-                : Optional.empty();
+            ? Optional.ofNullable(resource.getURL())
+            : Optional.empty();
     }
 
     private static Optional<URL> classPathResource(
@@ -203,7 +193,7 @@ private static Optional<URL> classPathResource(
             final @NonNull String relativeResourceName) {
         if(relativeResourceName.startsWith("/")) {
             throw _Exceptions
-            .illegalArgument("invalid relative resourceName %s", 
relativeResourceName);
+                .illegalArgument("invalid relative resourceName %s", 
relativeResourceName);
         }
         var resourceUrl = _Resources.getResourceUrl(contextClass, 
relativeResourceName);
         return Optional.ofNullable(resourceUrl);
diff --git 
a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
 
b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
index ee85948cf39..2b5a1600e1d 100644
--- 
a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
+++ 
b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
@@ -223,7 +223,7 @@ public ResponseEntity<Object> image(
         return _EndpointLogging.response(log, "GET 
/objects/{}/{}/object-icon", domainType, instanceId,
             responseFactory.ok(
                         objectIcon.asBytes(),
-                        
MediaType.parseMediaType(objectIcon.getMimeType().getBaseType())));
+                        
MediaType.parseMediaType(objectIcon.mimeType().baseType())));
     }
 
     @Override
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/export/CollectionContentsAsExportFactory.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/export/CollectionContentsAsExportFactory.java
index 927019a1601..27042f82eaa 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/export/CollectionContentsAsExportFactory.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collection/export/CollectionContentsAsExportFactory.java
@@ -69,7 +69,7 @@ public ApplicationAdvice appliesTo(final IModel<?> model) {
     public Component createComponent(final String id, final IModel<?> model) {
         var collectionModel = (CollectionModel) model;
         var mimeType = tabularExporter.getMimeType();
-        var ext = mimeType.getProposedFileExtensions().getFirstElseFail();
+        var ext = mimeType.proposedFileExtensions().getFirstElseFail();
         var fileName = collectionModel.getName().replaceAll(" ", "") + "." + 
ext;
 
         var link = new FileDownloadLink(id,
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/util/Wkt.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/util/Wkt.java
index f22d785d376..699b18d5c43 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/util/Wkt.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/util/Wkt.java
@@ -97,7 +97,7 @@
 import org.danekja.java.util.function.serializable.SerializableBiConsumer;
 import org.danekja.java.util.function.serializable.SerializableBooleanSupplier;
 import org.danekja.java.util.function.serializable.SerializableConsumer;
-
+import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.applib.Identifier;
@@ -125,7 +125,6 @@
 import org.apache.causeway.viewer.wicket.ui.panels.PanelUtil;
 import 
org.apache.causeway.viewer.wicket.ui.util.BootstrapConstants.ButtonSemantics;
 
-import org.jspecify.annotations.NonNull;
 import lombok.experimental.UtilityClass;
 
 import 
de.agilecoders.wicket.core.markup.html.bootstrap.behavior.CssClassNameAppender;
@@ -696,7 +695,7 @@ private FileResourceStream fileResourceStream(final File 
file, final CommonMimeT
                 new org.apache.wicket.util.file.File(file)) {
             private static final long serialVersionUID = 1L;
             @Override public String getContentType() {
-                return mime.getBaseType();
+                return mime.baseType();
             }
         };
     }
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/ImageResourceCacheClassPath.java
index 8a70f7a193b..b21ce1176ff 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/ImageResourceCacheClassPath.java
@@ -28,6 +28,7 @@
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.PartWriterCallback;
 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;
@@ -39,7 +40,6 @@
 import org.apache.causeway.viewer.wicket.model.models.ImageResourceCache;
 import 
org.apache.causeway.viewer.wicket.viewer.CausewayModuleViewerWicketViewer;
 
-import org.jspecify.annotations.NonNull;
 import lombok.RequiredArgsConstructor;
 
 /**
@@ -81,7 +81,7 @@ private static class ObjectIconResourceReference
         private final @NonNull ObjectIconResource objectIconResource;
 
         public ObjectIconResourceReference(final ObjectIcon objectIcon) {
-            super(new Key(Application.class.getName(), 
objectIcon.getIdentifier(), null, null, null));
+            super(new Key(Application.class.getName(), 
objectIcon.identifier(), null, null, null));
             this.objectIconResource = new ObjectIconResource(objectIcon);
         }
 
@@ -106,10 +106,10 @@ protected ResourceResponse newResourceResponse(final 
Attributes attributes) {
             var imageDataBytes = objectIcon.asBytes();
             final long size = imageDataBytes.length;
             ResourceResponse resourceResponse = new ResourceResponse();
-            
resourceResponse.setContentType(objectIcon.getMimeType().getBaseType());
+            resourceResponse.setContentType(objectIcon.mimeType().baseType());
             resourceResponse.setAcceptRange(ContentRangeType.BYTES);
             resourceResponse.setContentLength(size);
-            resourceResponse.setFileName(objectIcon.getShortName());
+            resourceResponse.setFileName(objectIcon.shortName());
             RequestCycle cycle = RequestCycle.get();
             Long startbyte = cycle.getMetaData(CONTENT_RANGE_STARTBYTE);
             Long endbyte = cycle.getMetaData(CONTENT_RANGE_ENDBYTE);

Reply via email to