From fdf9653053d49a103e7aa7bae040d2f299ed9dd7 Mon Sep 17 00:00:00 2001 From: fjtirado Date: Mon, 9 Mar 2026 13:55:20 +0100 Subject: [PATCH] Fix model hierarchy backward compatibility Provide a default asNumber(Class targerNumberClass) implementation Signed-off-by: fjtirado --- .../impl/model/func/JavaModel.java | 26 +--------------- .../impl/AbstractWorkflowModel.java | 30 ++++++++++++++++++- .../impl/scripts/ScriptUtils.java | 4 +-- .../impl/model/jackson/JacksonModel.java | 2 +- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModel.java b/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModel.java index 061523a50..a0a13c0f4 100644 --- a/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModel.java +++ b/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModel.java @@ -17,8 +17,6 @@ import io.serverlessworkflow.impl.AbstractWorkflowModel; import io.serverlessworkflow.impl.WorkflowModel; -import java.math.BigDecimal; -import java.math.BigInteger; import java.time.OffsetDateTime; import java.util.Collection; import java.util.Collections; @@ -68,29 +66,7 @@ public Optional asNumber() { @Override protected Optional asNumber(Class targetNumberClass) { - - if (object instanceof Number num) { - if (targetNumberClass.isInstance(object)) { - return Optional.of(targetNumberClass.cast(object)); - } else if (targetNumberClass == Integer.class) { - return Optional.of(targetNumberClass.cast(num.intValue())); - } else if (targetNumberClass == Long.class) { - return Optional.of(targetNumberClass.cast(num.longValue())); - } else if (targetNumberClass == Double.class) { - return Optional.of(targetNumberClass.cast(num.doubleValue())); - } else if (targetNumberClass == Float.class) { - return Optional.of(targetNumberClass.cast(num.floatValue())); - } else if (targetNumberClass == Short.class) { - return Optional.of(targetNumberClass.cast(num.shortValue())); - } else if (targetNumberClass == Byte.class) { - return Optional.of(targetNumberClass.cast(num.byteValue())); - } else if (targetNumberClass == BigDecimal.class) { - return Optional.of(targetNumberClass.cast(BigDecimal.valueOf(num.doubleValue()))); - } else if (targetNumberClass == BigInteger.class) { - return Optional.of(targetNumberClass.cast(BigInteger.valueOf(num.longValue()))); - } - } - return Optional.empty(); + return object instanceof Number num ? asSubclass(num, targetNumberClass) : Optional.empty(); } @Override diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/AbstractWorkflowModel.java b/impl/core/src/main/java/io/serverlessworkflow/impl/AbstractWorkflowModel.java index 25e0f26c4..834f8526e 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/AbstractWorkflowModel.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/AbstractWorkflowModel.java @@ -15,6 +15,8 @@ */ package io.serverlessworkflow.impl; +import java.math.BigDecimal; +import java.math.BigInteger; import java.time.OffsetDateTime; import java.util.Collection; import java.util.Map; @@ -24,7 +26,33 @@ public abstract class AbstractWorkflowModel implements WorkflowModel { protected abstract Optional convert(Class clazz); - protected abstract Optional asNumber(Class targetNumberClass); + protected final Optional asSubclass( + Number num, Class targetNumberClass) { + if (targetNumberClass.isInstance(num)) { + return Optional.of(targetNumberClass.cast(num)); + } else if (targetNumberClass == Integer.class) { + return Optional.of(targetNumberClass.cast(num.intValue())); + } else if (targetNumberClass == Long.class) { + return Optional.of(targetNumberClass.cast(num.longValue())); + } else if (targetNumberClass == Double.class) { + return Optional.of(targetNumberClass.cast(num.doubleValue())); + } else if (targetNumberClass == Float.class) { + return Optional.of(targetNumberClass.cast(num.floatValue())); + } else if (targetNumberClass == Short.class) { + return Optional.of(targetNumberClass.cast(num.shortValue())); + } else if (targetNumberClass == Byte.class) { + return Optional.of(targetNumberClass.cast(num.byteValue())); + } else if (targetNumberClass == BigDecimal.class) { + return Optional.of(targetNumberClass.cast(BigDecimal.valueOf(num.doubleValue()))); + } else if (targetNumberClass == BigInteger.class) { + return Optional.of(targetNumberClass.cast(BigInteger.valueOf(num.longValue()))); + } + return Optional.empty(); + } + + protected Optional asNumber(Class targetNumberClass) { + return asNumber().flatMap(n -> asSubclass(n, targetNumberClass)); + } @Override public Optional as(Class clazz) { diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/scripts/ScriptUtils.java b/impl/core/src/main/java/io/serverlessworkflow/impl/scripts/ScriptUtils.java index 3eb20a845..f33f3bed3 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/scripts/ScriptUtils.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/scripts/ScriptUtils.java @@ -47,9 +47,9 @@ public static WorkflowModel modelFromOutput( case ALL -> modelFactory.fromAny( new ProcessResult( - 0, streamSuppliers.outputStream().get(), streamSuppliers.errorStream().get())); + code, streamSuppliers.outputStream().get(), streamSuppliers.errorStream().get())); case NONE -> model; - case CODE -> modelFactory.from(0); + case CODE -> modelFactory.from(code); case STDOUT -> modelFactory.from(streamSuppliers.outputStream().get()); case STDERR -> modelFactory.from(streamSuppliers.errorStream().get()); }; diff --git a/impl/model/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModel.java b/impl/model/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModel.java index 1bd4a9837..34c9775dc 100644 --- a/impl/model/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModel.java +++ b/impl/model/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModel.java @@ -68,7 +68,7 @@ public Optional asDate() { @Override public Optional asNumber() { - return node.isNumber() ? Optional.of(node.asLong()) : Optional.empty(); + return node.isNumber() ? Optional.of(node.numberValue()) : Optional.empty(); } @Override