From ce8afcb5ff693a74d8814d905135546e174f0542 Mon Sep 17 00:00:00 2001 From: Tihomir Surdilovic Date: Fri, 5 Feb 2021 13:07:10 -0500 Subject: [PATCH] transition and functionref update Signed-off-by: Tihomir Surdilovic --- .../FunctionRefDeserializer.java | 78 ++++++++++++++++ .../deserializers/TransitionDeserializer.java | 84 +++++++++++++++++ .../api/mapper/WorkflowModule.java | 7 +- .../serializers/FunctionRefSerializer.java | 63 +++++++++++++ .../api/serializers/TransitionSerializer.java | 70 +++++++++++++++ .../api/test/MarkupToWorkflowTest.java | 89 +++++++++++++++++++ .../resources/examples/applicantrequest.json | 12 +-- .../resources/examples/applicantrequest.yml | 9 +- .../test/resources/examples/creditcheck.json | 16 +--- .../test/resources/examples/creditcheck.yml | 12 +-- .../examples/eventbasedtransition.json | 12 +-- .../examples/eventbasedtransition.yml | 9 +- .../resources/examples/jobmonitoring.json | 28 ++---- .../test/resources/examples/jobmonitoring.yml | 21 ++--- .../examples/periodicinboxcheck.json | 8 +- .../resources/examples/periodicinboxcheck.yml | 6 +- .../resources/examples/provisionorder.json | 16 +--- .../resources/examples/provisionorder.yml | 12 +-- .../resources/features/applicantrequest.json | 12 +-- .../resources/features/applicantrequest.yml | 9 +- .../features/compensationworkflow.json | 4 +- .../features/compensationworkflow.yml | 3 +- .../test/resources/features/functionrefs.json | 38 ++++++++ .../test/resources/features/functionrefs.yml | 21 +++++ .../test/resources/features/transitions.json | 39 ++++++++ .../test/resources/features/transitions.yml | 23 +++++ .../resources/examples/applicantrequest.json | 12 +-- .../resources/examples/applicantrequest.yml | 9 +- .../test/resources/examples/creditcheck.json | 16 +--- .../test/resources/examples/creditcheck.yml | 12 +-- .../examples/eventbasedtransition.json | 12 +-- .../examples/eventbasedtransition.yml | 9 +- .../resources/examples/jobmonitoring.json | 28 ++---- .../test/resources/examples/jobmonitoring.yml | 21 ++--- .../examples/periodicinboxcheck.json | 8 +- .../resources/examples/periodicinboxcheck.yml | 6 +- .../resources/examples/provisionorder.json | 16 +--- .../resources/examples/provisionorder.yml | 12 +-- .../resources/examples/singleswitchstate.json | 8 +- .../resources/examples/singleswitchstate.yml | 6 +- .../singleswitchstateeventconditions.json | 8 +- .../singleswitchstateeventconditions.yml | 6 +- 42 files changed, 619 insertions(+), 271 deletions(-) create mode 100644 api/src/main/java/io/serverlessworkflow/api/deserializers/FunctionRefDeserializer.java create mode 100644 api/src/main/java/io/serverlessworkflow/api/deserializers/TransitionDeserializer.java create mode 100644 api/src/main/java/io/serverlessworkflow/api/serializers/FunctionRefSerializer.java create mode 100644 api/src/main/java/io/serverlessworkflow/api/serializers/TransitionSerializer.java create mode 100644 api/src/test/resources/features/functionrefs.json create mode 100644 api/src/test/resources/features/functionrefs.yml create mode 100644 api/src/test/resources/features/transitions.json create mode 100644 api/src/test/resources/features/transitions.yml diff --git a/api/src/main/java/io/serverlessworkflow/api/deserializers/FunctionRefDeserializer.java b/api/src/main/java/io/serverlessworkflow/api/deserializers/FunctionRefDeserializer.java new file mode 100644 index 00000000..0921ac47 --- /dev/null +++ b/api/src/main/java/io/serverlessworkflow/api/deserializers/FunctionRefDeserializer.java @@ -0,0 +1,78 @@ +/* + * Copyright 2020-Present The Serverless Workflow Specification Authors + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package io.serverlessworkflow.api.deserializers; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import io.serverlessworkflow.api.functions.FunctionRef; +import io.serverlessworkflow.api.interfaces.WorkflowPropertySource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class FunctionRefDeserializer extends StdDeserializer { + + private static final long serialVersionUID = 510l; + private static Logger logger = LoggerFactory.getLogger(FunctionRefDeserializer.class); + + private WorkflowPropertySource context; + + public FunctionRefDeserializer() { + this(FunctionRef.class); + } + + public FunctionRefDeserializer(Class vc) { + super(vc); + } + + public FunctionRefDeserializer(WorkflowPropertySource context) { + this(FunctionRef.class); + this.context = context; + } + + @Override + public FunctionRef deserialize(JsonParser jp, + DeserializationContext ctxt) throws IOException { + + ObjectMapper mapper = (ObjectMapper) jp.getCodec(); + JsonNode node = jp.getCodec().readTree(jp); + + FunctionRef functionRef = new FunctionRef(); + + if (!node.isObject()) { + functionRef.setRefName(node.asText()); + functionRef.setParameters(new HashMap<>()); + return functionRef; + } else { + if(node.get("parameters") != null) { + functionRef.setParameters(mapper.treeToValue(node.get("parameters"), Map.class)); + } + + if(node.get("refName") != null) { + functionRef.setRefName(node.get("refName").asText()); + } + + return functionRef; + } + } +} diff --git a/api/src/main/java/io/serverlessworkflow/api/deserializers/TransitionDeserializer.java b/api/src/main/java/io/serverlessworkflow/api/deserializers/TransitionDeserializer.java new file mode 100644 index 00000000..9c1d3497 --- /dev/null +++ b/api/src/main/java/io/serverlessworkflow/api/deserializers/TransitionDeserializer.java @@ -0,0 +1,84 @@ +/* + * Copyright 2020-Present The Serverless Workflow Specification Authors + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package io.serverlessworkflow.api.deserializers; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import io.serverlessworkflow.api.interfaces.WorkflowPropertySource; +import io.serverlessworkflow.api.produce.ProduceEvent; +import io.serverlessworkflow.api.transitions.Transition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; + +public class TransitionDeserializer extends StdDeserializer { + + private static final long serialVersionUID = 510l; + private static Logger logger = LoggerFactory.getLogger(TransitionDeserializer.class); + + private WorkflowPropertySource context; + + public TransitionDeserializer() { + this(Transition.class); + } + + public TransitionDeserializer(Class vc) { + super(vc); + } + + public TransitionDeserializer(WorkflowPropertySource context) { + this(Transition.class); + this.context = context; + } + + @Override + public Transition deserialize(JsonParser jp, + DeserializationContext ctxt) throws IOException { + + ObjectMapper mapper = (ObjectMapper) jp.getCodec(); + JsonNode node = jp.getCodec().readTree(jp); + + Transition transition = new Transition(); + + if (!node.isObject()) { + transition.setProduceEvents(new ArrayList<>()); + transition.setCompensate(false); + transition.setNextState(node.asText()); + return transition; + } else { + if(node.get("produceEvents") != null) { + transition.setProduceEvents(Arrays.asList(mapper.treeToValue(node.get("produceEvents"), ProduceEvent[].class)) ); + } + + if(node.get("nextState") != null) { + transition.setNextState(node.get("nextState").asText()); + } + + if(node.get("compensate") != null) { + transition.setCompensate(node.get("compensate").asBoolean()); + } + + return transition; + } + } +} diff --git a/api/src/main/java/io/serverlessworkflow/api/mapper/WorkflowModule.java b/api/src/main/java/io/serverlessworkflow/api/mapper/WorkflowModule.java index 370ec435..4eaea570 100644 --- a/api/src/main/java/io/serverlessworkflow/api/mapper/WorkflowModule.java +++ b/api/src/main/java/io/serverlessworkflow/api/mapper/WorkflowModule.java @@ -22,6 +22,7 @@ import io.serverlessworkflow.api.events.EventDefinition; import io.serverlessworkflow.api.events.OnEvents; import io.serverlessworkflow.api.functions.FunctionDefinition; +import io.serverlessworkflow.api.functions.FunctionRef; import io.serverlessworkflow.api.interfaces.Extension; import io.serverlessworkflow.api.interfaces.State; import io.serverlessworkflow.api.interfaces.WorkflowPropertySource; @@ -31,6 +32,7 @@ import io.serverlessworkflow.api.states.DefaultState; import io.serverlessworkflow.api.states.OperationState; import io.serverlessworkflow.api.states.ParallelState; +import io.serverlessworkflow.api.transitions.Transition; import io.serverlessworkflow.api.workflow.Events; import io.serverlessworkflow.api.workflow.Functions; import io.serverlessworkflow.api.workflow.Retries; @@ -69,6 +71,8 @@ private void addDefaultSerializers() { addSerializer(new CallbackStateSerializer()); addSerializer(new StartDefinitionSerializer()); addSerializer(new EndDefinitionSerializer()); + addSerializer(new TransitionSerializer()); + addSerializer(new FunctionRefSerializer()); addSerializer(extensionSerializer); } @@ -93,7 +97,8 @@ private void addDefaultDeserializers() { addDeserializer(End.class, new EndDefinitionDeserializer(workflowPropertySource)); addDeserializer(Extension.class, extensionDeserializer); addDeserializer(FunctionDefinition.Type.class, new FunctionDefinitionTypeDeserializer(workflowPropertySource)); - + addDeserializer(Transition.class, new TransitionDeserializer(workflowPropertySource)); + addDeserializer(FunctionRef.class, new FunctionRefDeserializer(workflowPropertySource)); } public ExtensionSerializer getExtensionSerializer() { diff --git a/api/src/main/java/io/serverlessworkflow/api/serializers/FunctionRefSerializer.java b/api/src/main/java/io/serverlessworkflow/api/serializers/FunctionRefSerializer.java new file mode 100644 index 00000000..b20a473f --- /dev/null +++ b/api/src/main/java/io/serverlessworkflow/api/serializers/FunctionRefSerializer.java @@ -0,0 +1,63 @@ +/* + * Copyright 2020-Present The Serverless Workflow Specification Authors + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package io.serverlessworkflow.api.serializers; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import io.serverlessworkflow.api.functions.FunctionRef; + +import java.io.IOException; + +public class FunctionRefSerializer extends StdSerializer { + + public FunctionRefSerializer() { + this(FunctionRef.class); + } + + protected FunctionRefSerializer(Class t) { + super(t); + } + + @Override + public void serialize(FunctionRef functionRef, + JsonGenerator gen, + SerializerProvider provider) throws IOException { + + if(functionRef != null) { + if((functionRef.getParameters() == null || functionRef.getParameters().isEmpty()) + && functionRef.getRefName() != null + && functionRef.getRefName().length() > 0) { + gen.writeString(functionRef.getRefName()); + } else { + gen.writeStartObject(); + + if(functionRef.getRefName() != null && functionRef.getRefName().length() > 0) { + gen.writeStringField("refName", functionRef.getRefName()); + } + + if (functionRef.getParameters() != null && !functionRef.getParameters().isEmpty()) { + gen.writeObjectField("parameters", functionRef.getParameters()); + } + + + gen.writeEndObject(); + } + } + } +} + diff --git a/api/src/main/java/io/serverlessworkflow/api/serializers/TransitionSerializer.java b/api/src/main/java/io/serverlessworkflow/api/serializers/TransitionSerializer.java new file mode 100644 index 00000000..f41afb1d --- /dev/null +++ b/api/src/main/java/io/serverlessworkflow/api/serializers/TransitionSerializer.java @@ -0,0 +1,70 @@ +/* + * Copyright 2020-Present The Serverless Workflow Specification Authors + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package io.serverlessworkflow.api.serializers; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import io.serverlessworkflow.api.produce.ProduceEvent; +import io.serverlessworkflow.api.transitions.Transition; + +import java.io.IOException; + +public class TransitionSerializer extends StdSerializer { + + public TransitionSerializer() { + this(Transition.class); + } + + protected TransitionSerializer(Class t) { + super(t); + } + + @Override + public void serialize(Transition transition, + JsonGenerator gen, + SerializerProvider provider) throws IOException { + + if(transition != null) { + if((transition.getProduceEvents() == null || transition.getProduceEvents().size() < 1) + && !transition.isCompensate() && transition.getNextState() != null + && transition.getNextState().length() > 0) { + gen.writeString(transition.getNextState()); + } else { + gen.writeStartObject(); + + if (transition.getProduceEvents() != null && !transition.getProduceEvents().isEmpty()) { + gen.writeArrayFieldStart("produceEvents"); + for (ProduceEvent produceEvent : transition.getProduceEvents()) { + gen.writeObject(produceEvent); + } + gen.writeEndArray(); + } + + if(transition.isCompensate()) { + gen.writeBooleanField("compensate", true); + } + + if(transition.getNextState() != null && transition.getNextState().length() > 0) { + gen.writeStringField("nextState", transition.getNextState()); + } + + gen.writeEndObject(); + } + } + } +} diff --git a/api/src/test/java/io/serverlessworkflow/api/test/MarkupToWorkflowTest.java b/api/src/test/java/io/serverlessworkflow/api/test/MarkupToWorkflowTest.java index b0c5b53e..5ab7e095 100644 --- a/api/src/test/java/io/serverlessworkflow/api/test/MarkupToWorkflowTest.java +++ b/api/src/test/java/io/serverlessworkflow/api/test/MarkupToWorkflowTest.java @@ -17,10 +17,15 @@ package io.serverlessworkflow.api.test; import io.serverlessworkflow.api.Workflow; +import io.serverlessworkflow.api.actions.Action; +import io.serverlessworkflow.api.defaultdef.DefaultDefinition; import io.serverlessworkflow.api.functions.FunctionDefinition; +import io.serverlessworkflow.api.functions.FunctionRef; import io.serverlessworkflow.api.interfaces.State; import io.serverlessworkflow.api.states.EventState; import io.serverlessworkflow.api.states.OperationState; +import io.serverlessworkflow.api.states.SwitchState; +import io.serverlessworkflow.api.switchconditions.DataCondition; import io.serverlessworkflow.api.test.utils.WorkflowTestUtils; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -147,4 +152,88 @@ public void testFunctionTypes(String workflowLocation) { FunctionDefinition restFunc2 = functionDefs.get(1); assertEquals(restFunc2.getType(), FunctionDefinition.Type.EXPRESSION); } + + @ParameterizedTest + @ValueSource(strings = {"/features/transitions.json", "/features/transitions.yml"}) + public void testTransitions(String workflowLocation) { + Workflow workflow = Workflow.fromSource(WorkflowTestUtils.readWorkflowFile(workflowLocation)); + + assertNotNull(workflow); + assertNotNull(workflow.getId()); + assertNotNull(workflow.getName()); + assertNotNull(workflow.getStates()); + + assertNotNull(workflow.getStates()); + assertTrue(workflow.getStates().size() == 1); + + State state = workflow.getStates().get(0); + assertTrue(state instanceof SwitchState); + + SwitchState switchState = (SwitchState) workflow.getStates().get(0); + assertNotNull(switchState.getDataConditions()); + List dataConditions = switchState.getDataConditions(); + + assertEquals(2, dataConditions.size()); + + DataCondition cond1 = switchState.getDataConditions().get(0); + assertNotNull(cond1.getTransition()); + assertEquals("StartApplication", cond1.getTransition().getNextState()); + assertNotNull(cond1.getTransition().getProduceEvents()); + assertTrue(cond1.getTransition().getProduceEvents().isEmpty()); + assertFalse(cond1.getTransition().isCompensate()); + + + DataCondition cond2 = switchState.getDataConditions().get(1); + assertNotNull(cond2.getTransition()); + assertEquals("RejectApplication", cond2.getTransition().getNextState()); + assertNotNull(cond2.getTransition().getProduceEvents()); + assertEquals(1, cond2.getTransition().getProduceEvents().size()); + assertFalse(cond2.getTransition().isCompensate()); + + + assertNotNull(switchState.getDefault()); + DefaultDefinition defaultDefinition = switchState.getDefault(); + assertNotNull(defaultDefinition.getTransition()); + assertEquals("RejectApplication", defaultDefinition.getTransition().getNextState()); + assertNotNull(defaultDefinition.getTransition().getProduceEvents()); + assertTrue(defaultDefinition.getTransition().getProduceEvents().isEmpty()); + assertTrue(defaultDefinition.getTransition().isCompensate()); + + } + + @ParameterizedTest + @ValueSource(strings = {"/features/functionrefs.json", "/features/functionrefs.yml"}) + public void testFunctionRefs(String workflowLocation) { + Workflow workflow = Workflow.fromSource(WorkflowTestUtils.readWorkflowFile(workflowLocation)); + + assertNotNull(workflow); + assertNotNull(workflow.getId()); + assertNotNull(workflow.getName()); + assertNotNull(workflow.getStates()); + + assertNotNull(workflow.getStates()); + assertTrue(workflow.getStates().size() == 1); + + State state = workflow.getStates().get(0); + assertTrue(state instanceof OperationState); + + OperationState operationState = (OperationState) workflow.getStates().get(0); + assertNotNull(operationState.getActions()); + assertEquals(2, operationState.getActions().size()); + + Action action1 = operationState.getActions().get(0); + assertNotNull(action1); + assertNotNull(action1.getFunctionRef()); + FunctionRef functionRef1 = action1.getFunctionRef(); + assertEquals("creditCheckFunction", functionRef1.getRefName()); + assertEquals(0, functionRef1.getParameters().size()); + + Action action2 = operationState.getActions().get(1); + assertNotNull(action2); + assertNotNull(action2.getFunctionRef()); + FunctionRef functionRef2 = action2.getFunctionRef(); + assertEquals("sendRejectionEmailFunction", functionRef2.getRefName()); + assertEquals(1, functionRef2.getParameters().size()); + assertEquals("{{ $.customer }}", functionRef2.getParameters().get("applicant")); + } } diff --git a/api/src/test/resources/examples/applicantrequest.json b/api/src/test/resources/examples/applicantrequest.json index a0f783b1..751adbf3 100644 --- a/api/src/test/resources/examples/applicantrequest.json +++ b/api/src/test/resources/examples/applicantrequest.json @@ -17,21 +17,15 @@ "dataConditions": [ { "condition": "{{ $.applicants[?(@.age >= 18)] }}", - "transition": { - "nextState": "StartApplication" - } + "transition": "StartApplication" }, { "condition": "{{ $.applicants[?(@.age < 18)] }}", - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } ], "default": { - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } }, { diff --git a/api/src/test/resources/examples/applicantrequest.yml b/api/src/test/resources/examples/applicantrequest.yml index 2fc4d15b..1e35d373 100644 --- a/api/src/test/resources/examples/applicantrequest.yml +++ b/api/src/test/resources/examples/applicantrequest.yml @@ -12,14 +12,11 @@ states: start: true dataConditions: - condition: "{{ $.applicants[?(@.age >= 18)] }}" - transition: - nextState: StartApplication + transition: StartApplication - condition: "{{ $.applicants[?(@.age < 18)] }}" - transition: - nextState: RejectApplication + transition: RejectApplication default: - transition: - nextState: RejectApplication + transition: RejectApplication - name: StartApplication type: subflow workflowId: startApplicationWorkflowId diff --git a/api/src/test/resources/examples/creditcheck.json b/api/src/test/resources/examples/creditcheck.json index 046b64ac..cbc3171f 100644 --- a/api/src/test/resources/examples/creditcheck.json +++ b/api/src/test/resources/examples/creditcheck.json @@ -40,9 +40,7 @@ }, "eventRef": "CreditCheckCompletedEvent", "timeout": "PT15M", - "transition": { - "nextState": "EvaluateDecision" - } + "transition": "EvaluateDecision" }, { "name": "EvaluateDecision", @@ -51,22 +49,16 @@ { "name": "Approved", "condition": "{{ $.creditCheck[?(@.decision == 'Approved')] }}", - "transition": { - "nextState": "StartApplication" - } + "transition": "StartApplication" }, { "name": "Denied", "condition": "{{ $.creditCheck[?(@.decision == 'Denied')] }}", - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } ], "default": { - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } }, { diff --git a/api/src/test/resources/examples/creditcheck.yml b/api/src/test/resources/examples/creditcheck.yml index 65ad7c35..6739cd21 100644 --- a/api/src/test/resources/examples/creditcheck.yml +++ b/api/src/test/resources/examples/creditcheck.yml @@ -25,22 +25,18 @@ states: customer: "{{ $.customer }}" eventRef: CreditCheckCompletedEvent timeout: PT15M - transition: - nextState: EvaluateDecision + transition: EvaluateDecision - name: EvaluateDecision type: switch dataConditions: - name: Approved condition: "{{ $.creditCheck[?(@.decision == 'Approved')] }}" - transition: - nextState: StartApplication + transition: StartApplication - name: Denied condition: "{{ $.creditCheck[?(@.decision == 'Denied')] }}" - transition: - nextState: RejectApplication + transition: RejectApplication default: - transition: - nextState: RejectApplication + transition: RejectApplication - name: StartApplication type: subflow workflowId: startApplicationWorkflowId diff --git a/api/src/test/resources/examples/eventbasedtransition.json b/api/src/test/resources/examples/eventbasedtransition.json index f5b4ffce..40fddc89 100644 --- a/api/src/test/resources/examples/eventbasedtransition.json +++ b/api/src/test/resources/examples/eventbasedtransition.json @@ -23,22 +23,16 @@ "eventConditions": [ { "eventRef": "visaApprovedEvent", - "transition": { - "nextState": "HandleApprovedVisa" - } + "transition": "HandleApprovedVisa" }, { "eventRef": "visaRejectedEvent", - "transition": { - "nextState": "HandleRejectedVisa" - } + "transition": "HandleRejectedVisa" } ], "eventTimeout": "PT1H", "default": { - "transition": { - "nextState": "HandleNoVisaDecision" - } + "transition": "HandleNoVisaDecision" } }, { diff --git a/api/src/test/resources/examples/eventbasedtransition.yml b/api/src/test/resources/examples/eventbasedtransition.yml index 5f9dc8ed..a221eaaa 100644 --- a/api/src/test/resources/examples/eventbasedtransition.yml +++ b/api/src/test/resources/examples/eventbasedtransition.yml @@ -16,15 +16,12 @@ states: start: true eventConditions: - eventRef: visaApprovedEvent - transition: - nextState: HandleApprovedVisa + transition: HandleApprovedVisa - eventRef: visaRejectedEvent - transition: - nextState: HandleRejectedVisa + transition: HandleRejectedVisa eventTimeout: PT1H default: - transition: - nextState: HandleNoVisaDecision + transition: HandleNoVisaDecision - name: HandleApprovedVisa type: subflow workflowId: handleApprovedVisaWorkflowID diff --git a/api/src/test/resources/examples/jobmonitoring.json b/api/src/test/resources/examples/jobmonitoring.json index 3229e0c7..2e896687 100644 --- a/api/src/test/resources/examples/jobmonitoring.json +++ b/api/src/test/resources/examples/jobmonitoring.json @@ -43,17 +43,13 @@ "onErrors": [ { "error": "*", - "transition": { - "nextState": "SubmitError" - } + "transition": "SubmitError" } ], "stateDataFilter": { "dataOutputPath": "{{ $.jobuid }}" }, - "transition": { - "nextState":"WaitForCompletion" - } + "transition": "WaitForCompletion" }, { "name": "SubmitError", @@ -65,9 +61,7 @@ "name": "WaitForCompletion", "type": "delay", "timeDelay": "PT5S", - "transition": { - "nextState":"GetJobStatus" - } + "transition": "GetJobStatus" }, { "name":"GetJobStatus", @@ -89,9 +83,7 @@ "stateDataFilter": { "dataOutputPath": "{{ $.jobstatus }}" }, - "transition": { - "nextState":"DetermineCompletion" - } + "transition": "DetermineCompletion" }, { "name":"DetermineCompletion", @@ -99,21 +91,15 @@ "dataConditions": [ { "condition": "{{ $[?(@.jobstatus == 'SUCCEEDED')] }}", - "transition": { - "nextState": "JobSucceeded" - } + "transition": "JobSucceeded" }, { "condition": "{{ $[?(@.jobstatus == 'FAILED')] }}", - "transition": { - "nextState": "JobFailed" - } + "transition": "JobFailed" } ], "default": { - "transition": { - "nextState": "WaitForCompletion" - } + "transition": "WaitForCompletion" } }, { diff --git a/api/src/test/resources/examples/jobmonitoring.yml b/api/src/test/resources/examples/jobmonitoring.yml index d375a752..62b00dab 100644 --- a/api/src/test/resources/examples/jobmonitoring.yml +++ b/api/src/test/resources/examples/jobmonitoring.yml @@ -26,12 +26,10 @@ states: dataResultsPath: "{{ $.jobuid }}" onErrors: - error: "*" - transition: - nextState: SubmitError + transition: SubmitError stateDataFilter: dataOutputPath: "{{ $.jobuid }}" - transition: - nextState: WaitForCompletion + transition: WaitForCompletion - name: SubmitError type: subflow workflowId: handleJobSubmissionErrorWorkflow @@ -39,8 +37,7 @@ states: - name: WaitForCompletion type: delay timeDelay: PT5S - transition: - nextState: GetJobStatus + transition: GetJobStatus - name: GetJobStatus type: operation actionMode: sequential @@ -53,20 +50,16 @@ states: dataResultsPath: "{{ $.jobstatus }}" stateDataFilter: dataOutputPath: "{{ $.jobstatus }}" - transition: - nextState: DetermineCompletion + transition: DetermineCompletion - name: DetermineCompletion type: switch dataConditions: - condition: "{{ $[?(@.jobstatus == 'SUCCEEDED')] }}" - transition: - nextState: JobSucceeded + transition: JobSucceeded - condition: "{{ $[?(@.jobstatus == 'FAILED')] }}" - transition: - nextState: JobFailed + transition: JobFailed default: - transition: - nextState: WaitForCompletion + transition: WaitForCompletion - name: JobSucceeded type: operation actionMode: sequential diff --git a/api/src/test/resources/examples/periodicinboxcheck.json b/api/src/test/resources/examples/periodicinboxcheck.json index 1c5cdfc6..d2be22dc 100644 --- a/api/src/test/resources/examples/periodicinboxcheck.json +++ b/api/src/test/resources/examples/periodicinboxcheck.json @@ -27,14 +27,10 @@ "actionMode": "sequential", "actions": [ { - "functionRef": { - "refName": "checkInboxFunction" - } + "functionRef": "checkInboxFunction" } ], - "transition": { - "nextState": "SendTextForHighPrioriry" - } + "transition": "SendTextForHighPrioriry" }, { "name": "SendTextForHighPrioriry", diff --git a/api/src/test/resources/examples/periodicinboxcheck.yml b/api/src/test/resources/examples/periodicinboxcheck.yml index 162a29ff..8d6633e2 100644 --- a/api/src/test/resources/examples/periodicinboxcheck.yml +++ b/api/src/test/resources/examples/periodicinboxcheck.yml @@ -16,10 +16,8 @@ states: expression: 0 0/15 * * * ? actionMode: sequential actions: - - functionRef: - refName: checkInboxFunction - transition: - nextState: SendTextForHighPrioriry + - functionRef: checkInboxFunction + transition: SendTextForHighPrioriry - name: SendTextForHighPrioriry type: foreach inputCollection: "{{ $.messages }}" diff --git a/api/src/test/resources/examples/provisionorder.json b/api/src/test/resources/examples/provisionorder.json index c7ab194f..f155fa33 100644 --- a/api/src/test/resources/examples/provisionorder.json +++ b/api/src/test/resources/examples/provisionorder.json @@ -28,29 +28,21 @@ "onErrors": [ { "error": "MissingOrderId", - "transition": { - "nextState": "MissingId" - } + "transition": "MissingId" }, { "error": "MissingOrderItem", - "transition": { - "nextState": "MissingItem" - } + "transition": "MissingItem" }, { "error": "MissingOrderQuantity", - "transition": { - "nextState": "MissingQuantity" - } + "transition": "MissingQuantity" } ], "stateDataFilter": { "dataOutputPath": "{{ $.exceptions }}" }, - "transition": { - "nextState":"ApplyOrder" - } + "transition": "ApplyOrder" }, { "name": "MissingId", diff --git a/api/src/test/resources/examples/provisionorder.yml b/api/src/test/resources/examples/provisionorder.yml index 44777fe6..ea3cef9f 100644 --- a/api/src/test/resources/examples/provisionorder.yml +++ b/api/src/test/resources/examples/provisionorder.yml @@ -17,18 +17,14 @@ states: order: "{{ $.order }}" onErrors: - error: "MissingOrderId" - transition: - nextState: MissingId + transition: MissingId - error: "MissingOrderItem" - transition: - nextState: MissingItem + transition: MissingItem - error: "MissingOrderQuantity" - transition: - nextState: MissingQuantity + transition: MissingQuantity stateDataFilter: dataOutputPath: "{{ $.exceptions }}" - transition: - nextState: ApplyOrder + transition: ApplyOrder - name: MissingId type: subflow workflowId: handleMissingIdExceptionWorkflow diff --git a/api/src/test/resources/features/applicantrequest.json b/api/src/test/resources/features/applicantrequest.json index 09be71f1..4b215fb1 100644 --- a/api/src/test/resources/features/applicantrequest.json +++ b/api/src/test/resources/features/applicantrequest.json @@ -13,21 +13,15 @@ "dataConditions": [ { "condition": "{{ $.applicants[?(@.age >= 18)] }}", - "transition": { - "nextState": "StartApplication" - } + "transition": "StartApplication" }, { "condition": "{{ $.applicants[?(@.age < 18)] }}", - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } ], "default": { - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } }, { diff --git a/api/src/test/resources/features/applicantrequest.yml b/api/src/test/resources/features/applicantrequest.yml index 2b688a70..517acd12 100644 --- a/api/src/test/resources/features/applicantrequest.yml +++ b/api/src/test/resources/features/applicantrequest.yml @@ -10,14 +10,11 @@ states: start: true dataConditions: - condition: "{{ $.applicants[?(@.age >= 18)] }}" - transition: - nextState: StartApplication + transition: StartApplication - condition: "{{ $.applicants[?(@.age < 18)] }}" - transition: - nextState: RejectApplication + transition: RejectApplication default: - transition: - nextState: RejectApplication + transition: RejectApplication - name: StartApplication type: subflow workflowId: startApplicationWorkflowId diff --git a/api/src/test/resources/features/compensationworkflow.json b/api/src/test/resources/features/compensationworkflow.json index 5f979f68..c6c8bc2f 100644 --- a/api/src/test/resources/features/compensationworkflow.json +++ b/api/src/test/resources/features/compensationworkflow.json @@ -33,9 +33,7 @@ } ], "compensatedBy": "CancelPurchase", - "transition": { - "nextState": "SomeNextWorkflowState" - } + "transition": "SomeNextWorkflowState" }, { "name": "CancelPurchase", diff --git a/api/src/test/resources/features/compensationworkflow.yml b/api/src/test/resources/features/compensationworkflow.yml index 81506399..4fb093b6 100644 --- a/api/src/test/resources/features/compensationworkflow.yml +++ b/api/src/test/resources/features/compensationworkflow.yml @@ -18,8 +18,7 @@ states: parameters: customerid: "{{ $.purchase.customerid }}" compensatedBy: CancelPurchase - transition: - nextState: SomeNextWorkflowState + transition: SomeNextWorkflowState - name: CancelPurchase type: operation usedForCompensation: true diff --git a/api/src/test/resources/features/functionrefs.json b/api/src/test/resources/features/functionrefs.json new file mode 100644 index 00000000..fbf742d3 --- /dev/null +++ b/api/src/test/resources/features/functionrefs.json @@ -0,0 +1,38 @@ +{ + "id": "functionrefs", + "version": "1.0", + "name": "Customer Credit Check Workflow", + "description": "Perform Customer Credit Check", + "functions": [ + { + "name": "creditCheckFunction", + "operation": "http://myapis.org/creditcheckapi.json#doCreditCheck" + }, + { + "name": "sendRejectionEmailFunction", + "operation": "http://myapis.org/creditcheckapi.json#rejectionEmail" + } + ], + "states": [ + { + "name": "TestFunctionRefs", + "type": "operation", + "actionMode": "sequential", + "start": true, + "actions": [ + { + "functionRef": "creditCheckFunction" + }, + { + "functionRef": { + "refName": "sendRejectionEmailFunction", + "parameters": { + "applicant": "{{ $.customer }}" + } + } + } + ], + "end": true + } + ] +} \ No newline at end of file diff --git a/api/src/test/resources/features/functionrefs.yml b/api/src/test/resources/features/functionrefs.yml new file mode 100644 index 00000000..bf8bb5b3 --- /dev/null +++ b/api/src/test/resources/features/functionrefs.yml @@ -0,0 +1,21 @@ +id: functionrefs +version: '1.0' +name: Customer Credit Check Workflow +description: Perform Customer Credit Check +functions: + - name: creditCheckFunction + operation: http://myapis.org/creditcheckapi.json#doCreditCheck + - name: sendRejectionEmailFunction + operation: http://myapis.org/creditcheckapi.json#rejectionEmail +states: + - name: TestFunctionRefs + type: operation + actionMode: sequential + start: true + actions: + - functionRef: creditCheckFunction + - functionRef: + refName: sendRejectionEmailFunction + parameters: + applicant: "{{ $.customer }}" + end: true \ No newline at end of file diff --git a/api/src/test/resources/features/transitions.json b/api/src/test/resources/features/transitions.json new file mode 100644 index 00000000..b92dbf5d --- /dev/null +++ b/api/src/test/resources/features/transitions.json @@ -0,0 +1,39 @@ +{ + "id": "transitions", + "version": "1.0", + "name": "Transitions Workflow", + "description": "Transitions Workflow", + "functions": "features/applicantrequestfunctions.json", + "retries": "features/applicantrequestretries.json", + "states":[ + { + "name":"DifferentTransitionsTestState", + "type":"switch", + "start": true, + "dataConditions": [ + { + "condition": "{{ $.applicants[?(@.age >= 18)] }}", + "transition": "StartApplication" + }, + { + "condition": "{{ $.applicants[?(@.age < 18)] }}", + "transition": { + "nextState": "RejectApplication", + "produceEvents": [ + { + "eventRef": "provisioningCompleteEvent", + "data": "{{ $.provisionedOrders }}" + } + ] + } + } + ], + "default": { + "transition": { + "nextState": "RejectApplication", + "compensate": true + } + } + } + ] +} \ No newline at end of file diff --git a/api/src/test/resources/features/transitions.yml b/api/src/test/resources/features/transitions.yml new file mode 100644 index 00000000..6271a620 --- /dev/null +++ b/api/src/test/resources/features/transitions.yml @@ -0,0 +1,23 @@ +id: transitions +version: '1.0' +name: Transitions Workflow +description: Transitions Workflow +functions: features/applicantrequestfunctions.json +retries: features/applicantrequestretries.json +states: + - name: DifferentTransitionsTestState + type: switch + start: true + dataConditions: + - condition: "{{ $.applicants[?(@.age >= 18)] }}" + transition: StartApplication + - condition: "{{ $.applicants[?(@.age < 18)] }}" + transition: + nextState: RejectApplication + produceEvents: + - eventRef: provisioningCompleteEvent + data: "{{ $.provisionedOrders }}" + default: + transition: + nextState: RejectApplication + compensate: true \ No newline at end of file diff --git a/diagram/src/test/resources/examples/applicantrequest.json b/diagram/src/test/resources/examples/applicantrequest.json index a0f783b1..751adbf3 100644 --- a/diagram/src/test/resources/examples/applicantrequest.json +++ b/diagram/src/test/resources/examples/applicantrequest.json @@ -17,21 +17,15 @@ "dataConditions": [ { "condition": "{{ $.applicants[?(@.age >= 18)] }}", - "transition": { - "nextState": "StartApplication" - } + "transition": "StartApplication" }, { "condition": "{{ $.applicants[?(@.age < 18)] }}", - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } ], "default": { - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } }, { diff --git a/diagram/src/test/resources/examples/applicantrequest.yml b/diagram/src/test/resources/examples/applicantrequest.yml index 2fc4d15b..1e35d373 100644 --- a/diagram/src/test/resources/examples/applicantrequest.yml +++ b/diagram/src/test/resources/examples/applicantrequest.yml @@ -12,14 +12,11 @@ states: start: true dataConditions: - condition: "{{ $.applicants[?(@.age >= 18)] }}" - transition: - nextState: StartApplication + transition: StartApplication - condition: "{{ $.applicants[?(@.age < 18)] }}" - transition: - nextState: RejectApplication + transition: RejectApplication default: - transition: - nextState: RejectApplication + transition: RejectApplication - name: StartApplication type: subflow workflowId: startApplicationWorkflowId diff --git a/diagram/src/test/resources/examples/creditcheck.json b/diagram/src/test/resources/examples/creditcheck.json index 046b64ac..cbc3171f 100644 --- a/diagram/src/test/resources/examples/creditcheck.json +++ b/diagram/src/test/resources/examples/creditcheck.json @@ -40,9 +40,7 @@ }, "eventRef": "CreditCheckCompletedEvent", "timeout": "PT15M", - "transition": { - "nextState": "EvaluateDecision" - } + "transition": "EvaluateDecision" }, { "name": "EvaluateDecision", @@ -51,22 +49,16 @@ { "name": "Approved", "condition": "{{ $.creditCheck[?(@.decision == 'Approved')] }}", - "transition": { - "nextState": "StartApplication" - } + "transition": "StartApplication" }, { "name": "Denied", "condition": "{{ $.creditCheck[?(@.decision == 'Denied')] }}", - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } ], "default": { - "transition": { - "nextState": "RejectApplication" - } + "transition": "RejectApplication" } }, { diff --git a/diagram/src/test/resources/examples/creditcheck.yml b/diagram/src/test/resources/examples/creditcheck.yml index 65ad7c35..6739cd21 100644 --- a/diagram/src/test/resources/examples/creditcheck.yml +++ b/diagram/src/test/resources/examples/creditcheck.yml @@ -25,22 +25,18 @@ states: customer: "{{ $.customer }}" eventRef: CreditCheckCompletedEvent timeout: PT15M - transition: - nextState: EvaluateDecision + transition: EvaluateDecision - name: EvaluateDecision type: switch dataConditions: - name: Approved condition: "{{ $.creditCheck[?(@.decision == 'Approved')] }}" - transition: - nextState: StartApplication + transition: StartApplication - name: Denied condition: "{{ $.creditCheck[?(@.decision == 'Denied')] }}" - transition: - nextState: RejectApplication + transition: RejectApplication default: - transition: - nextState: RejectApplication + transition: RejectApplication - name: StartApplication type: subflow workflowId: startApplicationWorkflowId diff --git a/diagram/src/test/resources/examples/eventbasedtransition.json b/diagram/src/test/resources/examples/eventbasedtransition.json index f5b4ffce..40fddc89 100644 --- a/diagram/src/test/resources/examples/eventbasedtransition.json +++ b/diagram/src/test/resources/examples/eventbasedtransition.json @@ -23,22 +23,16 @@ "eventConditions": [ { "eventRef": "visaApprovedEvent", - "transition": { - "nextState": "HandleApprovedVisa" - } + "transition": "HandleApprovedVisa" }, { "eventRef": "visaRejectedEvent", - "transition": { - "nextState": "HandleRejectedVisa" - } + "transition": "HandleRejectedVisa" } ], "eventTimeout": "PT1H", "default": { - "transition": { - "nextState": "HandleNoVisaDecision" - } + "transition": "HandleNoVisaDecision" } }, { diff --git a/diagram/src/test/resources/examples/eventbasedtransition.yml b/diagram/src/test/resources/examples/eventbasedtransition.yml index 5f9dc8ed..a221eaaa 100644 --- a/diagram/src/test/resources/examples/eventbasedtransition.yml +++ b/diagram/src/test/resources/examples/eventbasedtransition.yml @@ -16,15 +16,12 @@ states: start: true eventConditions: - eventRef: visaApprovedEvent - transition: - nextState: HandleApprovedVisa + transition: HandleApprovedVisa - eventRef: visaRejectedEvent - transition: - nextState: HandleRejectedVisa + transition: HandleRejectedVisa eventTimeout: PT1H default: - transition: - nextState: HandleNoVisaDecision + transition: HandleNoVisaDecision - name: HandleApprovedVisa type: subflow workflowId: handleApprovedVisaWorkflowID diff --git a/diagram/src/test/resources/examples/jobmonitoring.json b/diagram/src/test/resources/examples/jobmonitoring.json index 3229e0c7..2e896687 100644 --- a/diagram/src/test/resources/examples/jobmonitoring.json +++ b/diagram/src/test/resources/examples/jobmonitoring.json @@ -43,17 +43,13 @@ "onErrors": [ { "error": "*", - "transition": { - "nextState": "SubmitError" - } + "transition": "SubmitError" } ], "stateDataFilter": { "dataOutputPath": "{{ $.jobuid }}" }, - "transition": { - "nextState":"WaitForCompletion" - } + "transition": "WaitForCompletion" }, { "name": "SubmitError", @@ -65,9 +61,7 @@ "name": "WaitForCompletion", "type": "delay", "timeDelay": "PT5S", - "transition": { - "nextState":"GetJobStatus" - } + "transition": "GetJobStatus" }, { "name":"GetJobStatus", @@ -89,9 +83,7 @@ "stateDataFilter": { "dataOutputPath": "{{ $.jobstatus }}" }, - "transition": { - "nextState":"DetermineCompletion" - } + "transition": "DetermineCompletion" }, { "name":"DetermineCompletion", @@ -99,21 +91,15 @@ "dataConditions": [ { "condition": "{{ $[?(@.jobstatus == 'SUCCEEDED')] }}", - "transition": { - "nextState": "JobSucceeded" - } + "transition": "JobSucceeded" }, { "condition": "{{ $[?(@.jobstatus == 'FAILED')] }}", - "transition": { - "nextState": "JobFailed" - } + "transition": "JobFailed" } ], "default": { - "transition": { - "nextState": "WaitForCompletion" - } + "transition": "WaitForCompletion" } }, { diff --git a/diagram/src/test/resources/examples/jobmonitoring.yml b/diagram/src/test/resources/examples/jobmonitoring.yml index d375a752..62b00dab 100644 --- a/diagram/src/test/resources/examples/jobmonitoring.yml +++ b/diagram/src/test/resources/examples/jobmonitoring.yml @@ -26,12 +26,10 @@ states: dataResultsPath: "{{ $.jobuid }}" onErrors: - error: "*" - transition: - nextState: SubmitError + transition: SubmitError stateDataFilter: dataOutputPath: "{{ $.jobuid }}" - transition: - nextState: WaitForCompletion + transition: WaitForCompletion - name: SubmitError type: subflow workflowId: handleJobSubmissionErrorWorkflow @@ -39,8 +37,7 @@ states: - name: WaitForCompletion type: delay timeDelay: PT5S - transition: - nextState: GetJobStatus + transition: GetJobStatus - name: GetJobStatus type: operation actionMode: sequential @@ -53,20 +50,16 @@ states: dataResultsPath: "{{ $.jobstatus }}" stateDataFilter: dataOutputPath: "{{ $.jobstatus }}" - transition: - nextState: DetermineCompletion + transition: DetermineCompletion - name: DetermineCompletion type: switch dataConditions: - condition: "{{ $[?(@.jobstatus == 'SUCCEEDED')] }}" - transition: - nextState: JobSucceeded + transition: JobSucceeded - condition: "{{ $[?(@.jobstatus == 'FAILED')] }}" - transition: - nextState: JobFailed + transition: JobFailed default: - transition: - nextState: WaitForCompletion + transition: WaitForCompletion - name: JobSucceeded type: operation actionMode: sequential diff --git a/diagram/src/test/resources/examples/periodicinboxcheck.json b/diagram/src/test/resources/examples/periodicinboxcheck.json index 1c5cdfc6..d2be22dc 100644 --- a/diagram/src/test/resources/examples/periodicinboxcheck.json +++ b/diagram/src/test/resources/examples/periodicinboxcheck.json @@ -27,14 +27,10 @@ "actionMode": "sequential", "actions": [ { - "functionRef": { - "refName": "checkInboxFunction" - } + "functionRef": "checkInboxFunction" } ], - "transition": { - "nextState": "SendTextForHighPrioriry" - } + "transition": "SendTextForHighPrioriry" }, { "name": "SendTextForHighPrioriry", diff --git a/diagram/src/test/resources/examples/periodicinboxcheck.yml b/diagram/src/test/resources/examples/periodicinboxcheck.yml index 162a29ff..8d6633e2 100644 --- a/diagram/src/test/resources/examples/periodicinboxcheck.yml +++ b/diagram/src/test/resources/examples/periodicinboxcheck.yml @@ -16,10 +16,8 @@ states: expression: 0 0/15 * * * ? actionMode: sequential actions: - - functionRef: - refName: checkInboxFunction - transition: - nextState: SendTextForHighPrioriry + - functionRef: checkInboxFunction + transition: SendTextForHighPrioriry - name: SendTextForHighPrioriry type: foreach inputCollection: "{{ $.messages }}" diff --git a/diagram/src/test/resources/examples/provisionorder.json b/diagram/src/test/resources/examples/provisionorder.json index c7ab194f..f155fa33 100644 --- a/diagram/src/test/resources/examples/provisionorder.json +++ b/diagram/src/test/resources/examples/provisionorder.json @@ -28,29 +28,21 @@ "onErrors": [ { "error": "MissingOrderId", - "transition": { - "nextState": "MissingId" - } + "transition": "MissingId" }, { "error": "MissingOrderItem", - "transition": { - "nextState": "MissingItem" - } + "transition": "MissingItem" }, { "error": "MissingOrderQuantity", - "transition": { - "nextState": "MissingQuantity" - } + "transition": "MissingQuantity" } ], "stateDataFilter": { "dataOutputPath": "{{ $.exceptions }}" }, - "transition": { - "nextState":"ApplyOrder" - } + "transition": "ApplyOrder" }, { "name": "MissingId", diff --git a/diagram/src/test/resources/examples/provisionorder.yml b/diagram/src/test/resources/examples/provisionorder.yml index 44777fe6..ea3cef9f 100644 --- a/diagram/src/test/resources/examples/provisionorder.yml +++ b/diagram/src/test/resources/examples/provisionorder.yml @@ -17,18 +17,14 @@ states: order: "{{ $.order }}" onErrors: - error: "MissingOrderId" - transition: - nextState: MissingId + transition: MissingId - error: "MissingOrderItem" - transition: - nextState: MissingItem + transition: MissingItem - error: "MissingOrderQuantity" - transition: - nextState: MissingQuantity + transition: MissingQuantity stateDataFilter: dataOutputPath: "{{ $.exceptions }}" - transition: - nextState: ApplyOrder + transition: ApplyOrder - name: MissingId type: subflow workflowId: handleMissingIdExceptionWorkflow diff --git a/diagram/src/test/resources/examples/singleswitchstate.json b/diagram/src/test/resources/examples/singleswitchstate.json index 82d38193..dd6e43a8 100644 --- a/diagram/src/test/resources/examples/singleswitchstate.json +++ b/diagram/src/test/resources/examples/singleswitchstate.json @@ -12,16 +12,12 @@ { "name": "first", "condition": "", - "transition": { - "nextState": "FromFirstCondition" - } + "transition": "FromFirstCondition" }, { "name": "second", "condition": "", - "transition": { - "nextState": "FromSecondCondition" - } + "transition": "FromSecondCondition" }, { "name": "third", diff --git a/diagram/src/test/resources/examples/singleswitchstate.yml b/diagram/src/test/resources/examples/singleswitchstate.yml index cb6de3e0..975f67df 100644 --- a/diagram/src/test/resources/examples/singleswitchstate.yml +++ b/diagram/src/test/resources/examples/singleswitchstate.yml @@ -10,12 +10,10 @@ states: dataConditions: - name: first condition: '' - transition: - nextState: FromFirstCondition + transition: FromFirstCondition - name: second condition: '' - transition: - nextState: FromSecondCondition + transition: FromSecondCondition - name: third condition: '' end: true diff --git a/diagram/src/test/resources/examples/singleswitchstateeventconditions.json b/diagram/src/test/resources/examples/singleswitchstateeventconditions.json index 47be5732..17fa6f5c 100644 --- a/diagram/src/test/resources/examples/singleswitchstateeventconditions.json +++ b/diagram/src/test/resources/examples/singleswitchstateeventconditions.json @@ -12,16 +12,12 @@ { "name": "first", "eventRef": "firstEvent", - "transition": { - "nextState": "FromFirstCondition" - } + "transition": "FromFirstCondition" }, { "name": "second", "eventRef": "secondEvent", - "transition": { - "nextState": "FromSecondCondition" - } + "transition": "FromSecondCondition" }, { "name": "third", diff --git a/diagram/src/test/resources/examples/singleswitchstateeventconditions.yml b/diagram/src/test/resources/examples/singleswitchstateeventconditions.yml index 0a3fe653..97d9948c 100644 --- a/diagram/src/test/resources/examples/singleswitchstateeventconditions.yml +++ b/diagram/src/test/resources/examples/singleswitchstateeventconditions.yml @@ -10,12 +10,10 @@ states: eventConditions: - name: first eventRef: firstEvent - transition: - nextState: FromFirstCondition + transition: FromFirstCondition - name: second eventRef: secondEvent - transition: - nextState: FromSecondCondition + transition: FromSecondCondition - name: third eventRef: thirdEvent end: true