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 f677889de02 CAUSEWAY-3892: adds flatMap to Blob and Clob (quality of 
life)
f677889de02 is described below

commit f677889de0286274f23246288e953ee6fb67d99b
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Thu Jul 10 10:39:21 2025 +0200

    CAUSEWAY-3892: adds flatMap to Blob and Clob (quality of life)
---
 .../org/apache/causeway/applib/value/Blob.java     | 27 +++++++++++++++++++++-
 .../org/apache/causeway/applib/value/Clob.java     | 17 ++++++++++----
 .../ui/CommandReplayOnSecondaryService.java        |  2 +-
 3 files changed, 40 insertions(+), 6 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 64a84dc4a30..b40fd201ff1 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
@@ -26,9 +26,11 @@
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.function.UnaryOperator;
 
 import jakarta.activation.MimeType;
 import jakarta.activation.MimeTypeParseException;
@@ -36,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;
@@ -52,7 +55,6 @@
 import org.apache.causeway.commons.io.ZipUtils;
 import org.apache.causeway.commons.io.ZipUtils.ZipOptions;
 
-import org.jspecify.annotations.NonNull;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 
@@ -172,6 +174,14 @@ public Clob toClob(final @NonNull Charset charset) {
         return new Clob(name(), mimeType(), _Strings.ofBytes(bytes(), 
charset));
     }
 
+    /**
+     * Converts to a {@link Clob}, using UTF-8
+     * for the underlying byte[] to String conversion.
+     */
+    public Clob toClobUtf8() {
+        return toClob(StandardCharsets.UTF_8);
+    }
+
     /**
      * Does not close the OutputStream.
      */
@@ -212,6 +222,21 @@ public DataSource asDataSource() {
         return DataSource.ofBytes(_NullSafe.toNonNull(bytes()));
     }
 
+    // -- MAPPING
+
+    /**
+     * Allows fluent chaining of {@link Blob} operators.
+     * @param mapper when {@code null} method acts as an identity operation
+     */
+    public Blob flatMap(
+            @Nullable UnaryOperator<Blob> mapper) {
+        return mapper != null
+            ? mapper.apply(this)
+            : this;
+    }
+
+    // -- COMPRESSION
+
     /**
      * Returns a new {@link Blob} that has this Blob's underlying byte array
      * zipped into a zip-entry using this Blob's name.
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 b5ff2284bf0..469d3c69a35 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
@@ -30,6 +30,7 @@
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.Objects;
+import java.util.function.UnaryOperator;
 
 import jakarta.activation.MimeType;
 import jakarta.activation.MimeTypeParseException;
@@ -78,7 +79,7 @@ public record Clob(
     MimeType mimeType,
     CharSequence chars
     ) implements NamedWithMimeType {
-    
+
 
     // -- FACTORIES
 
@@ -179,10 +180,18 @@ public Clob(final String name, final MimeType mimeType, 
final CharSequence chars
         this.chars = chars;
     }
 
+    // -- MAPPING
+
     /**
-     * @deprecated use {@link #chars()} instead
+     * Allows fluent chaining of {@link Clob} operators.
+     * @param mapper when {@code null} method acts as an identity operation
      */
-    public CharSequence getChars() { return chars(); }
+    public Clob flatMap(
+            @Nullable UnaryOperator<Clob> mapper) {
+        return mapper != null
+            ? mapper.apply(this)
+            : this;
+    }
 
     // -- UTILITIES
 
@@ -264,7 +273,7 @@ public boolean equals(final Object o) {
 
     @Override
     public String toString() {
-        return name() + " [" + mimeType().getBaseType() + "]: " + 
getChars().length() + " chars";
+        return name() + " [" + mimeType().getBaseType() + "]: " + 
chars().length() + " chars";
     }
 
     /**
diff --git 
a/incubator/extensions/core/commandreplay/secondary/src/main/java/org/apache/causeway/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
 
b/incubator/extensions/core/commandreplay/secondary/src/main/java/org/apache/causeway/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
index e97dff43edf..a9743e07f5f 100644
--- 
a/incubator/extensions/core/commandreplay/secondary/src/main/java/org/apache/causeway/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
+++ 
b/incubator/extensions/core/commandreplay/secondary/src/main/java/org/apache/causeway/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
@@ -89,7 +89,7 @@ public class uploadCommands{
         public class ActionDomainEvent extends 
CommandReplayOnSecondaryService.ActionDomainEvent<uploadCommands> { }
 
         @MemberSupport public void act(final Clob commandsDtoAsXml) {
-            var chars = commandsDtoAsXml.getChars();
+            var chars = commandsDtoAsXml.chars();
             List<CommandDto> commandDtoList;
 
             try {

Reply via email to