Skip to content

Commit 7f3551f

Browse files
authored
Fixing support stringfied json (#893)
Signed-off-by: fjtirado <ftirados@redhat.com>
1 parent fd6c7b9 commit 7f3551f

File tree

6 files changed

+174
-25
lines changed

6 files changed

+174
-25
lines changed

experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModel.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,14 @@ public Optional<Map<String, Object>> asMap() {
4646
}
4747

4848
@Override
49-
public <T> Optional<T> as(Class<T> clazz) {
50-
if (AgenticScope.class.isAssignableFrom(clazz)) {
51-
return Optional.of(clazz.cast(this.agenticScope));
52-
} else if (Map.class.isAssignableFrom(clazz)) {
53-
return asMap().map(clazz::cast);
54-
} else {
55-
return super.as(clazz);
56-
}
49+
public Object asJavaObject() {
50+
return agenticScope;
5751
}
5852

5953
@Override
60-
public Object asJavaObject() {
61-
return agenticScope;
54+
protected <T> Optional<T> convert(Class<T> clazz) {
55+
return AgenticScope.class.isAssignableFrom(clazz)
56+
? Optional.of(clazz.cast(this.agenticScope))
57+
: super.convert(clazz);
6258
}
6359
}

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.serverlessworkflow.impl.model.func;
1717

18+
import io.serverlessworkflow.impl.AbstractWorkflowModel;
1819
import io.serverlessworkflow.impl.WorkflowModel;
1920
import java.time.OffsetDateTime;
2021
import java.util.Collection;
@@ -24,7 +25,7 @@
2425
import java.util.Optional;
2526
import java.util.stream.Collectors;
2627

27-
public class JavaModel implements WorkflowModel {
28+
public class JavaModel extends AbstractWorkflowModel {
2829

2930
protected Object object;
3031

@@ -65,7 +66,6 @@ public Optional<Number> asNumber() {
6566

6667
@Override
6768
public Optional<Map<String, Object>> asMap() {
68-
6969
return object instanceof Map ? Optional.of((Map<String, Object>) object) : Optional.empty();
7070
}
7171

@@ -94,10 +94,7 @@ public Class<?> objectClass() {
9494
}
9595

9696
@Override
97-
public <T> Optional<T> as(Class<T> clazz) {
98-
if (WorkflowModel.class.isAssignableFrom(clazz)) {
99-
return Optional.of(clazz.cast(this));
100-
}
97+
protected <T> Optional<T> convert(Class<T> clazz) {
10198
return object != null && clazz.isAssignableFrom(object.getClass())
10299
? Optional.of(clazz.cast(object))
103100
: Optional.empty();
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright 2020-Present The Serverless Workflow Specification Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.serverlessworkflow.impl;
17+
18+
import java.time.OffsetDateTime;
19+
import java.util.Collection;
20+
import java.util.Map;
21+
import java.util.Optional;
22+
23+
public abstract class AbstractWorkflowModel implements WorkflowModel {
24+
25+
protected abstract <T> Optional<T> convert(Class<T> clazz);
26+
27+
@Override
28+
public <T> Optional<T> as(Class<T> clazz) {
29+
if (WorkflowModel.class.isAssignableFrom(clazz)) {
30+
return (Optional<T>) Optional.of(this);
31+
} else if (String.class.isAssignableFrom(clazz)) {
32+
return (Optional<T>) asText();
33+
} else if (Boolean.class.isAssignableFrom(clazz)) {
34+
return (Optional<T>) asBoolean();
35+
} else if (OffsetDateTime.class.isAssignableFrom(clazz)) {
36+
return (Optional<T>) asDate();
37+
} else if (Number.class.isAssignableFrom(clazz)) {
38+
return (Optional<T>) asNumber();
39+
} else if (Collection.class.isAssignableFrom(clazz)) {
40+
Collection<?> collection = asCollection();
41+
return collection.isEmpty() ? Optional.empty() : (Optional<T>) Optional.of(collection);
42+
} else if (Map.class.isAssignableFrom(clazz)) {
43+
return (Optional<T>) asMap();
44+
} else {
45+
return convert(clazz);
46+
}
47+
}
48+
}

impl/model/pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,17 @@
1616
<groupId>io.serverlessworkflow</groupId>
1717
<artifactId>serverlessworkflow-impl-core</artifactId>
1818
</dependency>
19+
<dependency>
20+
<groupId>org.junit.jupiter</groupId>
21+
<artifactId>junit-jupiter-engine</artifactId>
22+
</dependency>
23+
<dependency>
24+
<groupId>org.assertj</groupId>
25+
<artifactId>assertj-core</artifactId>
26+
</dependency>
27+
<dependency>
28+
<groupId>ch.qos.logback</groupId>
29+
<artifactId>logback-classic</artifactId>
30+
</dependency>
1931
</dependencies>
2032
</project>

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.fasterxml.jackson.databind.node.ArrayNode;
2222
import com.fasterxml.jackson.databind.node.BooleanNode;
2323
import com.fasterxml.jackson.databind.node.NullNode;
24+
import io.serverlessworkflow.impl.AbstractWorkflowModel;
2425
import io.serverlessworkflow.impl.WorkflowModel;
2526
import io.serverlessworkflow.impl.jackson.JsonUtils;
2627
import java.time.OffsetDateTime;
@@ -31,7 +32,7 @@
3132

3233
@JsonSerialize(using = JacksonModelSerializer.class)
3334
@JsonDeserialize(using = JacksonModelDeserializer.class)
34-
public class JacksonModel implements WorkflowModel {
35+
public class JacksonModel extends AbstractWorkflowModel {
3536

3637
protected JsonNode node;
3738

@@ -68,13 +69,6 @@ public Optional<Number> asNumber() {
6869
return node.isNumber() ? Optional.of(node.asLong()) : Optional.empty();
6970
}
7071

71-
@Override
72-
public <T> Optional<T> as(Class<T> clazz) {
73-
return clazz.isAssignableFrom(node.getClass())
74-
? Optional.of(clazz.cast(node))
75-
: Optional.of(JsonUtils.convertValue(node, clazz));
76-
}
77-
7872
@Override
7973
public String toString() {
8074
return node.toPrettyString();
@@ -84,7 +78,7 @@ public String toString() {
8478
public Optional<Map<String, Object>> asMap() {
8579
// TODO use generic to avoid warning
8680
return node.isObject()
87-
? Optional.of(JsonUtils.convertValue(node, Map.class))
81+
? Optional.of(JsonUtils.mapper().convertValue(node, Map.class))
8882
: Optional.empty();
8983
}
9084

@@ -97,4 +91,11 @@ public Object asJavaObject() {
9791
public Class<?> objectClass() {
9892
return node.getClass();
9993
}
94+
95+
@Override
96+
protected <T> Optional<T> convert(Class<T> clazz) {
97+
return clazz.isAssignableFrom(node.getClass())
98+
? Optional.of(clazz.cast(node))
99+
: Optional.of(JsonUtils.mapper().convertValue(node, clazz));
100+
}
100101
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*
2+
* Copyright 2020-Present The Serverless Workflow Specification Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.serverlessworkflow.impl.model.jackson;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
20+
import com.fasterxml.jackson.databind.JsonNode;
21+
import io.serverlessworkflow.impl.WorkflowModel;
22+
import io.serverlessworkflow.impl.WorkflowModelFactory;
23+
import io.serverlessworkflow.impl.jackson.JsonUtils;
24+
import java.util.Collection;
25+
import java.util.LinkedHashMap;
26+
import java.util.Map;
27+
import org.junit.jupiter.api.BeforeAll;
28+
import org.junit.jupiter.api.Test;
29+
30+
public class JacksonModelTest {
31+
32+
private static WorkflowModelFactory factory;
33+
34+
@BeforeAll
35+
static void init() {
36+
factory = new JacksonModelFactory();
37+
}
38+
39+
@Test
40+
void testObjectFromNode() {
41+
testObjectNode(
42+
factory.fromAny(
43+
JsonUtils.mapper()
44+
.createObjectNode()
45+
.put("name", "Javierito")
46+
.put("jobs", 3)
47+
.put("male", true)));
48+
}
49+
50+
@Test
51+
void testObjectFromString() {
52+
testObjectNode(factory.fromAny("{\"name\":\"Javierito\",\"jobs\":3,\"male\":true}"));
53+
}
54+
55+
@Test
56+
void testObjectFromMap() {
57+
Map<String, Object> map = new LinkedHashMap<String, Object>();
58+
map.put("name", "Javierito");
59+
map.put("jobs", 3);
60+
map.put("male", true);
61+
testObjectNode(factory.fromAny(map));
62+
}
63+
64+
private void testObjectNode(WorkflowModel model) {
65+
assertThat(model.as(JsonNode.class).orElseThrow())
66+
.isEqualTo(
67+
JsonUtils.mapper()
68+
.createObjectNode()
69+
.put("name", "Javierito")
70+
.put("jobs", 3)
71+
.put("male", true));
72+
assertThat(model.as(String.class).orElseThrow())
73+
.isEqualTo("{\"name\":\"Javierito\",\"jobs\":3,\"male\":true}");
74+
assertThat(model.as(String.class)).isEqualTo(model.asText());
75+
assertThat(model.as(Map.class)).isEqualTo(model.asMap());
76+
assertThat(model.as(Map.class).orElseThrow())
77+
.isEqualTo(Map.of("name", "Javierito", "jobs", 3, "male", true));
78+
}
79+
80+
@Test
81+
void testCollection() {
82+
WorkflowModel model =
83+
factory.fromAny(
84+
JsonUtils.mapper()
85+
.createArrayNode()
86+
.add(
87+
JsonUtils.mapper()
88+
.createObjectNode()
89+
.put("name", "Javierito")
90+
.put("jobs", 3)
91+
.put("male", true)));
92+
testObjectNode(factory.fromAny(model.asCollection().iterator().next()));
93+
testObjectNode(factory.fromAny(model.as(Collection.class).orElseThrow().iterator().next()));
94+
}
95+
}

0 commit comments

Comments
 (0)