From 25323f56ebc05c38233137fd14e53cb707972679 Mon Sep 17 00:00:00 2001 From: Francisco Javier Tirado Sarti Date: Thu, 17 Sep 2026 16:45:46 +0200 Subject: [PATCH] [Fix #1690] Add metadata() method to WorkflowInstance Signed-off-by: Francisco Javier Tirado Sarti --- .../impl/WorkflowInstance.java | 17 +++++++++++++++-- .../impl/WorkflowInstanceData.java | 9 ++++++++- .../impl/WorkflowMutableInstance.java | 12 ++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowInstance.java b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowInstance.java index 3c7b912c3..04317c8d3 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowInstance.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowInstance.java @@ -15,6 +15,7 @@ */ package io.serverlessworkflow.impl; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; @@ -63,7 +64,19 @@ default CompletableFuture resumeFuture() { return CompletableFuture.completedFuture(resume()); } - T addMetadataIfAbsent(String key, Supplier supplier); + default T addMetadataIfAbsent(String key, Supplier supplier) { + return supplier.get(); + } + + default void removeMetadata(String key) {} - void removeMetadata(String key); + /** + * Remove metadata key if present and return a non-empty optional if the deleted object matches + * the specified class type + */ + default Optional removeMetadata(String key, Class clazz) { + Optional value = findMetadata(key, clazz); + removeMetadata(key); + return value; + } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowInstanceData.java b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowInstanceData.java index daa5e4496..5bd779d0e 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowInstanceData.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowInstanceData.java @@ -16,6 +16,7 @@ package io.serverlessworkflow.impl; import java.time.Instant; +import java.util.Map; import java.util.Optional; public interface WorkflowInstanceData { @@ -31,5 +32,11 @@ public interface WorkflowInstanceData { WorkflowModel context(); - Optional findMetadata(String key, Class objectClass); + default Optional findMetadata(String key, Class objectClass) { + return Optional.empty(); + } + + default Map metadata() { + return Map.of(); + } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowMutableInstance.java b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowMutableInstance.java index fa0b5ba4a..0783b7565 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowMutableInstance.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowMutableInstance.java @@ -29,6 +29,7 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.concurrent.CancellationException; @@ -452,6 +453,17 @@ public T addMetadataIfAbsent(String key, Supplier supplier) { return (T) additionalObjects.computeIfAbsent(key, k -> supplier.get()); } + @Override + public Optional removeMetadata(String key, Class clazz) { + Object value = additionalObjects.remove(key); + return clazz.isInstance(value) ? Optional.of(clazz.cast(value)) : Optional.empty(); + } + + @Override + public Map metadata() { + return Collections.unmodifiableMap(additionalObjects); + } + @Override public void removeMetadata(String key) { additionalObjects.remove(key);