Skip to content

Commit 7366c0a

Browse files
committed
Fixing support stringfied json
Signed-off-by: fjtirado <[email protected]>
1 parent 7f0c915 commit 7366c0a

File tree

6 files changed

+169
-7
lines changed

6 files changed

+169
-7
lines changed

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ public Optional<Map<String, Object>> asMap() {
4949
public <T> Optional<T> as(Class<T> clazz) {
5050
if (AgenticScope.class.isAssignableFrom(clazz)) {
5151
return Optional.of(clazz.cast(this.agenticScope));
52-
} else if (Map.class.isAssignableFrom(clazz)) {
53-
return asMap().map(clazz::cast);
5452
} else {
5553
return super.as(clazz);
5654
}

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

Lines changed: 8 additions & 3 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

@@ -100,6 +100,11 @@ public <T> Optional<T> as(Class<T> clazz) {
100100
}
101101
return object != null && clazz.isAssignableFrom(object.getClass())
102102
? Optional.of(clazz.cast(object))
103-
: Optional.empty();
103+
: super.as(clazz);
104+
}
105+
106+
@Override
107+
protected <T> Optional<T> convert(Class<T> clazz) {
108+
return Optional.empty();
104109
}
105110
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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 (String.class.isAssignableFrom(clazz)) {
30+
return (Optional<T>) asText();
31+
} else if (Boolean.class.isAssignableFrom(clazz)) {
32+
return (Optional<T>) asBoolean();
33+
} else if (OffsetDateTime.class.isAssignableFrom(clazz)) {
34+
return (Optional<T>) asDate();
35+
} else if (Number.class.isAssignableFrom(clazz)) {
36+
return (Optional<T>) asNumber();
37+
} else if (Collection.class.isAssignableFrom(clazz)) {
38+
Collection<?> collection = asCollection();
39+
return collection.isEmpty() ? Optional.empty() : (Optional<T>) Optional.of(collection);
40+
} else if (Map.class.isAssignableFrom(clazz)) {
41+
return (Optional<T>) asMap();
42+
} else {
43+
return convert(clazz);
44+
}
45+
}
46+
}

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: 8 additions & 2 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

@@ -72,7 +73,7 @@ public Optional<Number> asNumber() {
7273
public <T> Optional<T> as(Class<T> clazz) {
7374
return clazz.isAssignableFrom(node.getClass())
7475
? Optional.of(clazz.cast(node))
75-
: Optional.of(JsonUtils.convertValue(node, clazz));
76+
: super.as(clazz);
7677
}
7778

7879
@Override
@@ -97,4 +98,9 @@ public Object asJavaObject() {
9798
public Class<?> objectClass() {
9899
return node.getClass();
99100
}
101+
102+
@Override
103+
protected <T> Optional<T> convert(Class<T> clazz) {
104+
return Optional.of(JsonUtils.mapper().convertValue(node, clazz));
105+
}
100106
}
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)