Skip to content

Commit e3a305b

Browse files
committed
Fix model hierarchy backward compatibility
Provide a default asNumber(Class<N> targerNumberClass) implementation Signed-off-by: fjtirado <ftirados@redhat.com>
1 parent 29ed45e commit e3a305b

File tree

4 files changed

+32
-28
lines changed

4 files changed

+32
-28
lines changed

experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModel.java

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717

1818
import io.serverlessworkflow.impl.AbstractWorkflowModel;
1919
import io.serverlessworkflow.impl.WorkflowModel;
20-
import java.math.BigDecimal;
21-
import java.math.BigInteger;
2220
import java.time.OffsetDateTime;
2321
import java.util.Collection;
2422
import java.util.Collections;
@@ -68,29 +66,7 @@ public Optional<Number> asNumber() {
6866

6967
@Override
7068
protected <N extends Number> Optional<N> asNumber(Class<N> targetNumberClass) {
71-
72-
if (object instanceof Number num) {
73-
if (targetNumberClass.isInstance(object)) {
74-
return Optional.of(targetNumberClass.cast(object));
75-
} else if (targetNumberClass == Integer.class) {
76-
return Optional.of(targetNumberClass.cast(num.intValue()));
77-
} else if (targetNumberClass == Long.class) {
78-
return Optional.of(targetNumberClass.cast(num.longValue()));
79-
} else if (targetNumberClass == Double.class) {
80-
return Optional.of(targetNumberClass.cast(num.doubleValue()));
81-
} else if (targetNumberClass == Float.class) {
82-
return Optional.of(targetNumberClass.cast(num.floatValue()));
83-
} else if (targetNumberClass == Short.class) {
84-
return Optional.of(targetNumberClass.cast(num.shortValue()));
85-
} else if (targetNumberClass == Byte.class) {
86-
return Optional.of(targetNumberClass.cast(num.byteValue()));
87-
} else if (targetNumberClass == BigDecimal.class) {
88-
return Optional.of(targetNumberClass.cast(BigDecimal.valueOf(num.doubleValue())));
89-
} else if (targetNumberClass == BigInteger.class) {
90-
return Optional.of(targetNumberClass.cast(BigInteger.valueOf(num.longValue())));
91-
}
92-
}
93-
return Optional.empty();
69+
return object instanceof Number num ? asSubclass(num, targetNumberClass) : Optional.empty();
9470
}
9571

9672
@Override

impl/core/src/main/java/io/serverlessworkflow/impl/AbstractWorkflowModel.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package io.serverlessworkflow.impl;
1717

18+
import java.math.BigDecimal;
19+
import java.math.BigInteger;
1820
import java.time.OffsetDateTime;
1921
import java.util.Collection;
2022
import java.util.Map;
@@ -24,7 +26,33 @@ public abstract class AbstractWorkflowModel implements WorkflowModel {
2426

2527
protected abstract <T> Optional<T> convert(Class<T> clazz);
2628

27-
protected abstract <N extends Number> Optional<N> asNumber(Class<N> targetNumberClass);
29+
protected final <N extends Number> Optional<N> asSubclass(
30+
Number num, Class<N> targetNumberClass) {
31+
if (targetNumberClass.isInstance(num)) {
32+
return Optional.of(targetNumberClass.cast(num));
33+
} else if (targetNumberClass == Integer.class) {
34+
return Optional.of(targetNumberClass.cast(num.intValue()));
35+
} else if (targetNumberClass == Long.class) {
36+
return Optional.of(targetNumberClass.cast(num.longValue()));
37+
} else if (targetNumberClass == Double.class) {
38+
return Optional.of(targetNumberClass.cast(num.doubleValue()));
39+
} else if (targetNumberClass == Float.class) {
40+
return Optional.of(targetNumberClass.cast(num.floatValue()));
41+
} else if (targetNumberClass == Short.class) {
42+
return Optional.of(targetNumberClass.cast(num.shortValue()));
43+
} else if (targetNumberClass == Byte.class) {
44+
return Optional.of(targetNumberClass.cast(num.byteValue()));
45+
} else if (targetNumberClass == BigDecimal.class) {
46+
return Optional.of(targetNumberClass.cast(BigDecimal.valueOf(num.doubleValue())));
47+
} else if (targetNumberClass == BigInteger.class) {
48+
return Optional.of(targetNumberClass.cast(BigInteger.valueOf(num.longValue())));
49+
}
50+
return Optional.empty();
51+
}
52+
53+
protected <N extends Number> Optional<N> asNumber(Class<N> targetNumberClass) {
54+
return asNumber().flatMap(n -> asSubclass(n, targetNumberClass));
55+
}
2856

2957
@Override
3058
public <T> Optional<T> as(Class<T> clazz) {

impl/model/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public Optional<OffsetDateTime> asDate() {
6868

6969
@Override
7070
public Optional<Number> asNumber() {
71-
return node.isNumber() ? Optional.of(node.asLong()) : Optional.empty();
71+
return node.isNumber() ? Optional.of(node.numberValue()) : Optional.empty();
7272
}
7373

7474
@Override

impl/test/src/test/java/io/serverlessworkflow/impl/test/RunShellExecutorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ void testExitCode() throws IOException {
166166
SoftAssertions.assertSoftly(
167167
softly -> {
168168
softly.assertThat(outputModel.asNumber()).isPresent();
169-
softly.assertThat(outputModel.asNumber().get()).isNotEqualTo(0);
169+
softly.assertThat(outputModel.asNumber().get()).isEqualTo(0);
170170
});
171171
}
172172
}

0 commit comments

Comments
 (0)