Skip to content

Commit b765646

Browse files
committed
update to changes to subflow state to subflowref
Signed-off-by: Tihomir Surdilovic <[email protected]>
1 parent 21c51ca commit b765646

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+793
-322
lines changed

api/src/main/java/io/serverlessworkflow/api/deserializers/StateDeserializer.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,6 @@ public State deserialize(JsonParser jp,
8787
return mapper.treeToValue(node,
8888
ParallelState.class);
8989

90-
case SUBFLOW:
91-
return mapper.treeToValue(node,
92-
SubflowState.class);
93-
9490
case INJECT:
9591
return mapper.treeToValue(node,
9692
InjectState.class);
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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.api.deserializers;
17+
18+
import com.fasterxml.jackson.core.JsonParser;
19+
import com.fasterxml.jackson.databind.DeserializationContext;
20+
import com.fasterxml.jackson.databind.JsonNode;
21+
import com.fasterxml.jackson.databind.ObjectMapper;
22+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
23+
import io.serverlessworkflow.api.functions.SubFlowRef;
24+
import io.serverlessworkflow.api.interfaces.WorkflowPropertySource;
25+
26+
import java.io.IOException;
27+
28+
public class SubFlowRefDeserializer extends StdDeserializer<SubFlowRef> {
29+
30+
private static final long serialVersionUID = 510l;
31+
32+
@SuppressWarnings("unused")
33+
private WorkflowPropertySource context;
34+
35+
public SubFlowRefDeserializer() {
36+
this(SubFlowRef.class);
37+
}
38+
39+
public SubFlowRefDeserializer(Class<?> vc) {
40+
super(vc);
41+
}
42+
43+
public SubFlowRefDeserializer(WorkflowPropertySource context) {
44+
this(SubFlowRef.class);
45+
this.context = context;
46+
}
47+
48+
@Override
49+
public SubFlowRef deserialize(JsonParser jp,
50+
DeserializationContext ctxt) throws IOException {
51+
52+
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
53+
JsonNode node = jp.getCodec().readTree(jp);
54+
55+
SubFlowRef subflowRef = new SubFlowRef();
56+
57+
if (!node.isObject()) {
58+
subflowRef.setWorkflowId(node.asText());
59+
subflowRef.setWaitForCompletion(true);
60+
return subflowRef;
61+
} else {
62+
if (node.get("waitForCompletion") != null) {
63+
subflowRef.setWaitForCompletion(node.get("waitForCompletion").asBoolean());
64+
}
65+
66+
if (node.get("workflowId") != null) {
67+
subflowRef.setWorkflowId(node.get("workflowId").asText());
68+
}
69+
70+
return subflowRef;
71+
}
72+
}
73+
}
74+

api/src/main/java/io/serverlessworkflow/api/mapper/WorkflowModule.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.serverlessworkflow.api.events.OnEvents;
2525
import io.serverlessworkflow.api.functions.FunctionDefinition;
2626
import io.serverlessworkflow.api.functions.FunctionRef;
27+
import io.serverlessworkflow.api.functions.SubFlowRef;
2728
import io.serverlessworkflow.api.interfaces.Extension;
2829
import io.serverlessworkflow.api.interfaces.State;
2930
import io.serverlessworkflow.api.interfaces.WorkflowPropertySource;
@@ -66,7 +67,6 @@ private void addDefaultSerializers() {
6667
addSerializer(new OperationStateSerializer());
6768
addSerializer(new ParallelStateSerializer());
6869
addSerializer(new SwitchStateSerializer());
69-
addSerializer(new SubflowStateSerializer());
7070
addSerializer(new InjectStateSerializer());
7171
addSerializer(new ForEachStateSerializer());
7272
addSerializer(new CallbackStateSerializer());
@@ -76,6 +76,7 @@ private void addDefaultSerializers() {
7676
addSerializer(new FunctionRefSerializer());
7777
addSerializer(new CronSerializer());
7878
addSerializer(new ScheduleSerializer());
79+
addSerializer(new SubFlowRefSerializer());
7980
addSerializer(extensionSerializer);
8081
}
8182

@@ -101,6 +102,7 @@ private void addDefaultDeserializers() {
101102
addDeserializer(FunctionDefinition.Type.class, new FunctionDefinitionTypeDeserializer(workflowPropertySource));
102103
addDeserializer(Transition.class, new TransitionDeserializer(workflowPropertySource));
103104
addDeserializer(FunctionRef.class, new FunctionRefDeserializer(workflowPropertySource));
105+
addDeserializer(SubFlowRef.class, new SubFlowRefDeserializer(workflowPropertySource));
104106
addDeserializer(Cron.class, new CronDeserializer(workflowPropertySource));
105107
addDeserializer(Schedule.class, new ScheduleDeserializer(workflowPropertySource));
106108
addDeserializer(DataInputSchema.class, new DataInputSchemaDeserializer(workflowPropertySource));

api/src/main/java/io/serverlessworkflow/api/serializers/SubflowStateSerializer.java renamed to api/src/main/java/io/serverlessworkflow/api/serializers/SubFlowRefSerializer.java

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,36 +17,43 @@
1717

1818
import com.fasterxml.jackson.core.JsonGenerator;
1919
import com.fasterxml.jackson.databind.SerializerProvider;
20-
import com.fasterxml.jackson.databind.ser.BeanSerializerFactory;
2120
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
22-
import com.fasterxml.jackson.databind.type.TypeFactory;
23-
import io.serverlessworkflow.api.states.DefaultState;
24-
import io.serverlessworkflow.api.states.SubflowState;
21+
import io.serverlessworkflow.api.functions.SubFlowRef;
2522

2623
import java.io.IOException;
2724

28-
public class SubflowStateSerializer extends StdSerializer<SubflowState> {
25+
public class SubFlowRefSerializer extends StdSerializer<SubFlowRef> {
2926

30-
public SubflowStateSerializer() {
31-
this(SubflowState.class);
27+
public SubFlowRefSerializer() {
28+
this(SubFlowRef.class);
3229
}
3330

34-
protected SubflowStateSerializer(Class<SubflowState> t) {
31+
protected SubFlowRefSerializer(Class<SubFlowRef> t) {
3532
super(t);
3633
}
3734

3835
@Override
39-
public void serialize(SubflowState subflowState,
36+
public void serialize(SubFlowRef subflowRef,
4037
JsonGenerator gen,
4138
SerializerProvider provider) throws IOException {
4239

43-
// set defaults for end state
44-
subflowState.setType(DefaultState.Type.SUBFLOW);
40+
if (subflowRef != null) {
41+
if ((subflowRef.getWorkflowId() == null || subflowRef.getWorkflowId().isEmpty())
42+
&& subflowRef.isWaitForCompletion()) {
43+
gen.writeString(subflowRef.getWorkflowId());
44+
} else {
45+
gen.writeStartObject();
4546

46-
// serialize after setting default bean values...
47-
BeanSerializerFactory.instance.createSerializer(provider,
48-
TypeFactory.defaultInstance().constructType(SubflowState.class)).serialize(subflowState,
49-
gen,
50-
provider);
47+
if (subflowRef.getWorkflowId() != null && subflowRef.getWorkflowId().length() > 0) {
48+
gen.writeStringField("workflowId", subflowRef.getWorkflowId());
49+
}
50+
51+
if (!subflowRef.isWaitForCompletion()) {
52+
gen.writeBooleanField("waitForCompletion", false);
53+
}
54+
55+
gen.writeEndObject();
56+
}
57+
}
5158
}
52-
}
59+
}

api/src/main/resources/schema/actions/action.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
"description": "References a 'trigger' and 'result' reusable event definitions",
1616
"$ref": "../events/eventref.json"
1717
},
18+
"subFlowRef": {
19+
"description": "References a sub-workflow to invoke",
20+
"$ref": "../functions/subflowref.json"
21+
},
1822
"timeout": {
1923
"type": "string",
2024
"description": "Time period to wait for function execution to complete"
@@ -33,6 +37,11 @@
3337
"required": [
3438
"eventRef"
3539
]
40+
},
41+
{
42+
"required": [
43+
"subFlowRef"
44+
]
3645
}
3746
]
3847
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"type": "object",
3+
"javaType": "io.serverlessworkflow.api.functions.SubFlowRef",
4+
"properties": {
5+
"waitForCompletion": {
6+
"type": "boolean",
7+
"default": true,
8+
"description": "Workflow execution must wait for sub-workflow to finish before continuing"
9+
},
10+
"workflowId": {
11+
"type": "string",
12+
"description": "Unique id of the sub-workflow to be invoked"
13+
}
14+
},
15+
"required": [
16+
"workflowId"
17+
]
18+
}

api/src/main/resources/schema/states/subflowstate.json

Lines changed: 0 additions & 34 deletions
This file was deleted.

api/src/main/resources/schema/workflow.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,6 @@
9999
"title": "Switch State",
100100
"$ref": "states/switchstate.json"
101101
},
102-
{
103-
"title": "SubFlow State",
104-
"$ref": "states/subflowstate.json"
105-
},
106102
{
107103
"title": "Relay State",
108104
"$ref": "states/injectstate.json"

api/src/test/java/io/serverlessworkflow/api/test/MarkupToWorkflowTest.java

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
import io.serverlessworkflow.api.exectimeout.ExecTimeout;
2424
import io.serverlessworkflow.api.functions.FunctionDefinition;
2525
import io.serverlessworkflow.api.functions.FunctionRef;
26+
import io.serverlessworkflow.api.functions.SubFlowRef;
2627
import io.serverlessworkflow.api.interfaces.State;
2728
import io.serverlessworkflow.api.retry.RetryDefinition;
2829
import io.serverlessworkflow.api.states.EventState;
2930
import io.serverlessworkflow.api.states.OperationState;
30-
import io.serverlessworkflow.api.states.SubflowState;
3131
import io.serverlessworkflow.api.states.SwitchState;
3232
import io.serverlessworkflow.api.switchconditions.DataCondition;
3333
import io.serverlessworkflow.api.test.utils.WorkflowTestUtils;
@@ -86,9 +86,6 @@ public void testSpecFreatureFunctionRef(String workflowLocation) {
8686

8787
assertNotNull(workflow.getFunctions());
8888
assertEquals(1, workflow.getFunctions().getFunctionDefs().size());
89-
90-
assertNotNull(workflow.getRetries());
91-
assertEquals(1, workflow.getRetries().getRetryDefs().size());
9289
}
9390

9491
@ParameterizedTest
@@ -263,31 +260,6 @@ public void testKeepActiveExecTimeout(String workflowLocation) {
263260
assertEquals("GenerateReport", execTimeout.getRunBefore());
264261
}
265262

266-
@ParameterizedTest
267-
@ValueSource(strings = {"/features/checkcarvitals.json", "/features/checkcarvitals.yml"})
268-
public void testSubflowStateRepeat(String workflowLocation) {
269-
Workflow workflow = Workflow.fromSource(WorkflowTestUtils.readWorkflowFile(workflowLocation));
270-
271-
assertNotNull(workflow);
272-
assertNotNull(workflow.getId());
273-
assertNotNull(workflow.getName());
274-
assertNotNull(workflow.getStates());
275-
276-
assertNotNull(workflow.getStates());
277-
assertEquals(2, workflow.getStates().size());
278-
279-
State state = workflow.getStates().get(1);
280-
assertTrue(state instanceof SubflowState);
281-
282-
SubflowState subflowState = (SubflowState) workflow.getStates().get(1);
283-
assertNotNull(subflowState.getRepeat());
284-
assertEquals(10, subflowState.getRepeat().getMax());
285-
assertTrue(subflowState.getRepeat().isContinueOnError());
286-
assertNotNull(subflowState.getRepeat().getStopOnEvents());
287-
assertEquals(1, subflowState.getRepeat().getStopOnEvents().size());
288-
assertEquals("CarTurnedOffEvent", subflowState.getRepeat().getStopOnEvents().get(0));
289-
}
290-
291263
@ParameterizedTest
292264
@ValueSource(strings = {"/features/functionrefjsonparams.json", "/features/functionrefjsonparams.yml"})
293265
public void testFunctionRefJsonParams(String workflowLocation) {
@@ -494,4 +466,39 @@ public void testDataInputSchemaFromObject(String workflowLocation) {
494466
assertEquals("somejsonschema.json", dataInputSchema.getSchema());
495467
assertFalse(dataInputSchema.isFailOnValidationErrors());
496468
}
469+
470+
@ParameterizedTest
471+
@ValueSource(strings = {"/features/subflowref.json", "/features/subflowref.yml"})
472+
public void testSubFlowRef(String workflowLocation) {
473+
Workflow workflow = Workflow.fromSource(WorkflowTestUtils.readWorkflowFile(workflowLocation));
474+
475+
assertNotNull(workflow);
476+
assertNotNull(workflow.getId());
477+
assertNotNull(workflow.getName());
478+
assertNotNull(workflow.getStates());
479+
480+
assertNotNull(workflow.getStates());
481+
assertEquals(1, workflow.getStates().size());
482+
483+
assertTrue(workflow.getStates().get(0) instanceof OperationState);
484+
485+
OperationState operationState = (OperationState) workflow.getStates().get(0);
486+
487+
List<Action> actions = operationState.getActions();
488+
assertNotNull(actions);
489+
assertEquals(2, actions.size());
490+
491+
Action firstAction = operationState.getActions().get(0);
492+
assertNotNull(firstAction.getSubFlowRef());
493+
SubFlowRef firstSubflowRef = firstAction.getSubFlowRef();
494+
assertEquals("subflowRefReference", firstSubflowRef.getWorkflowId());
495+
assertTrue(firstSubflowRef.isWaitForCompletion());
496+
497+
Action secondAction = operationState.getActions().get(1);
498+
assertNotNull(secondAction.getSubFlowRef());
499+
SubFlowRef secondSubflowRef = secondAction.getSubFlowRef();
500+
assertEquals("subflowrefworkflowid", secondSubflowRef.getWorkflowId());
501+
assertFalse(secondSubflowRef.isWaitForCompletion());
502+
503+
}
497504
}

api/src/test/resources/examples/applicantrequest.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@
3030
},
3131
{
3232
"name": "StartApplication",
33-
"type": "subflow",
34-
"workflowId": "startApplicationWorkflowId",
33+
"type": "operation",
34+
"actions": [
35+
{
36+
"subFlowRef": "startApplicationWorkflowId"
37+
}
38+
],
3539
"end": true
3640
},
3741
{

0 commit comments

Comments
 (0)