From 6ee795f91347eda7f978242bd122370b05561593 Mon Sep 17 00:00:00 2001 From: Ricardo Zanini Date: Mon, 27 May 2024 15:44:01 -0300 Subject: [PATCH 1/2] Fix #212 - Add validation for actions in ForEachState Signed-off-by: Ricardo Zanini --- .quarkus/cli/plugins/quarkus-cli-catalog.json | 5 ++ .../validation/WorkflowValidatorImpl.java | 80 +++++++++++-------- .../test/WorkflowValidationTest.java | 36 ++++++++- 3 files changed, 86 insertions(+), 35 deletions(-) create mode 100644 .quarkus/cli/plugins/quarkus-cli-catalog.json diff --git a/.quarkus/cli/plugins/quarkus-cli-catalog.json b/.quarkus/cli/plugins/quarkus-cli-catalog.json new file mode 100644 index 00000000..03ca7e4a --- /dev/null +++ b/.quarkus/cli/plugins/quarkus-cli-catalog.json @@ -0,0 +1,5 @@ +{ + "version" : "v1", + "lastUpdate" : "16/02/2024 14:27:48", + "plugins" : { } +} \ No newline at end of file diff --git a/validation/src/main/java/io/serverlessworkflow/validation/WorkflowValidatorImpl.java b/validation/src/main/java/io/serverlessworkflow/validation/WorkflowValidatorImpl.java index 84dbb432..739f24ea 100644 --- a/validation/src/main/java/io/serverlessworkflow/validation/WorkflowValidatorImpl.java +++ b/validation/src/main/java/io/serverlessworkflow/validation/WorkflowValidatorImpl.java @@ -144,40 +144,7 @@ public List validate() { if (s instanceof OperationState) { OperationState operationState = (OperationState) s; - - List actions = operationState.getActions(); - for (Action action : actions) { - if (action.getFunctionRef() != null) { - if (action.getFunctionRef().getRefName().isEmpty()) { - addValidationError( - "Operation State action functionRef should not be null or empty", - ValidationError.WORKFLOW_VALIDATION); - } - - if (!haveFunctionDefinition( - action.getFunctionRef().getRefName(), functions)) { - addValidationError( - "Operation State action functionRef does not reference an existing workflow function definition", - ValidationError.WORKFLOW_VALIDATION); - } - } - - if (action.getEventRef() != null) { - - if (!haveEventsDefinition( - action.getEventRef().getTriggerEventRef(), events)) { - addValidationError( - "Operation State action trigger event def does not reference an existing workflow event definition", - ValidationError.WORKFLOW_VALIDATION); - } - - if (!haveEventsDefinition(action.getEventRef().getResultEventRef(), events)) { - addValidationError( - "Operation State action results event def does not reference an existing workflow event definition", - ValidationError.WORKFLOW_VALIDATION); - } - } - } + checkActionsDefinition(operationState.getActions(), functions, events); } if (s instanceof EventState) { @@ -281,6 +248,7 @@ public List validate() { if (s instanceof ForEachState) { ForEachState forEachState = (ForEachState) s; + checkActionsDefinition(forEachState.getActions(), functions, events); if (forEachState.getInputCollection() == null || forEachState.getInputCollection().isEmpty()) { addValidationError( @@ -334,6 +302,50 @@ public WorkflowValidator reset() { return this; } + private void checkActionsDefinition( + List actions, List functions, List events) { + if (actions == null) { + return; + } + for (Action action : actions) { + if (action.getFunctionRef() != null) { + if (action.getFunctionRef().getRefName().isEmpty()) { + addValidationError( + String.format( + "State action '%s' functionRef should not be null or empty", action.getName()), + ValidationError.WORKFLOW_VALIDATION); + } + + if (!haveFunctionDefinition(action.getFunctionRef().getRefName(), functions)) { + addValidationError( + String.format( + "State action '%s' functionRef does not reference an existing workflow function definition", + action.getName()), + ValidationError.WORKFLOW_VALIDATION); + } + } + + if (action.getEventRef() != null) { + + if (!haveEventsDefinition(action.getEventRef().getTriggerEventRef(), events)) { + addValidationError( + String.format( + "State action '%s' trigger event def does not reference an existing workflow event definition", + action.getName()), + ValidationError.WORKFLOW_VALIDATION); + } + + if (!haveEventsDefinition(action.getEventRef().getResultEventRef(), events)) { + addValidationError( + String.format( + "State action '%s' results event def does not reference an existing workflow event definition", + action.getName()), + ValidationError.WORKFLOW_VALIDATION); + } + } + } + } + private boolean haveFunctionDefinition(String functionName, List functions) { if (functions != null) { FunctionDefinition fun = diff --git a/validation/src/test/java/io/serverlessworkflow/validation/test/WorkflowValidationTest.java b/validation/src/test/java/io/serverlessworkflow/validation/test/WorkflowValidationTest.java index 6ccef44f..0bc2f3e4 100644 --- a/validation/src/test/java/io/serverlessworkflow/validation/test/WorkflowValidationTest.java +++ b/validation/src/test/java/io/serverlessworkflow/validation/test/WorkflowValidationTest.java @@ -29,6 +29,7 @@ import io.serverlessworkflow.api.interfaces.WorkflowValidator; import io.serverlessworkflow.api.retry.RetryDefinition; import io.serverlessworkflow.api.start.Start; +import io.serverlessworkflow.api.states.ForEachState; import io.serverlessworkflow.api.states.OperationState; import io.serverlessworkflow.api.states.SleepState; import io.serverlessworkflow.api.validation.ValidationError; @@ -173,7 +174,7 @@ public void testOperationStateNoFunctionRef() { Assertions.assertEquals(1, validationErrors.size()); Assertions.assertEquals( - "Operation State action functionRef does not reference an existing workflow function definition", + "State action 'null' functionRef does not reference an existing workflow function definition", validationErrors.get(0).getMessage()); } @@ -333,4 +334,37 @@ void testEventCall() { .withEnd(new End()))); Assertions.assertTrue(new WorkflowValidatorImpl().setWorkflow(workflow).validate().isEmpty()); } + + /** + * @see Validation missing out + * on refname in foreach>actions + */ + @Test + void testActionDefForEach() { + Workflow workflow = + new Workflow() + .withId("test-workflow") + .withVersion("1.0") + .withStart(new Start().withStateName("TestingForEach")) + .withFunctions(new Functions(Arrays.asList(new FunctionDefinition("Test")))) + .withStates( + Arrays.asList( + new ForEachState() + .withName("TestingForEach") + .withInputCollection("${ .archives }") + .withIterationParam("archive") + .withOutputCollection("${ .output}") + .withActions( + Arrays.asList( + new Action() + .withName("callFn") + .withFunctionRef(new FunctionRef("DoesNotExist")))) + .withEnd(new End()))); + final List validationErrors = + new WorkflowValidatorImpl().setWorkflow(workflow).validate(); + Assertions.assertEquals(1, validationErrors.size()); + Assertions.assertEquals( + "State action 'callFn' functionRef does not reference an existing workflow function definition", + validationErrors.get(0).getMessage()); + } } From 8fb3f9fbb4d7c885fee7362b84b40af6d9366d35 Mon Sep 17 00:00:00 2001 From: Ricardo Zanini Date: Mon, 27 May 2024 15:44:39 -0300 Subject: [PATCH 2/2] Remove .quarkus dir Signed-off-by: Ricardo Zanini --- .quarkus/cli/plugins/quarkus-cli-catalog.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .quarkus/cli/plugins/quarkus-cli-catalog.json diff --git a/.quarkus/cli/plugins/quarkus-cli-catalog.json b/.quarkus/cli/plugins/quarkus-cli-catalog.json deleted file mode 100644 index 03ca7e4a..00000000 --- a/.quarkus/cli/plugins/quarkus-cli-catalog.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version" : "v1", - "lastUpdate" : "16/02/2024 14:27:48", - "plugins" : { } -} \ No newline at end of file