Skip to content

Commit 1c7c9ba

Browse files
authored
Merge pull request #138 from manick02/main
Implemented GetActionsForFunctionDefinition #127
2 parents aaf4203 + 36b5902 commit 1c7c9ba

File tree

2 files changed

+104
-1
lines changed

2 files changed

+104
-1
lines changed

utils/src/main/java/io/serverlessworkflow/utils/WorkflowUtils.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,97 @@ public static FunctionDefinition getFunctionDefinitionsForAction(
258258
return functionDefinition.isPresent() ? functionDefinition.get() : null;
259259
}
260260

261+
/** @return : Returns @{code List<Action>} which uses a function defintion */
262+
public static List<Action> getActionsForFunctionDefinition(
263+
Workflow workflow, String functionDefinitionName) {
264+
if (!hasFunctionDefs(workflow, functionDefinitionName)) return null;
265+
return getActionsWhichUsesFunctionDefinition(workflow, functionDefinitionName);
266+
}
267+
268+
private static List<Action> getActionsWhichUsesFunctionDefinition(
269+
Workflow workflow, String functionDefinitionName) {
270+
List<Action> actions = new ArrayList<>();
271+
for (State state : workflow.getStates()) {
272+
if (state instanceof EventState) {
273+
EventState eventState = (EventState) state;
274+
List<OnEvents> onEvents = eventState.getOnEvents();
275+
if (onEvents != null) {
276+
for (OnEvents onEvent : onEvents) {
277+
if (onEvent != null) {
278+
List<Action> onEventActions = onEvent.getActions();
279+
if (onEventActions != null) {
280+
for (Action onEventAction : onEventActions) {
281+
if (checkIfActionUsesFunctionDefinition(functionDefinitionName, onEventAction))
282+
actions.add(onEventAction);
283+
}
284+
}
285+
}
286+
}
287+
}
288+
} else if (state instanceof CallbackState) {
289+
CallbackState callbackState = (CallbackState) state;
290+
final Action callbackStateAction = callbackState.getAction();
291+
if (checkIfActionUsesFunctionDefinition(functionDefinitionName, callbackStateAction)) {
292+
actions.add(callbackStateAction);
293+
}
294+
295+
} else if (state instanceof OperationState) {
296+
OperationState operationState = (OperationState) state;
297+
final List<Action> operationStateActions = operationState.getActions();
298+
if (operationStateActions != null) {
299+
for (Action operationStateAction : operationStateActions) {
300+
if (checkIfActionUsesFunctionDefinition(functionDefinitionName, operationStateAction)) {
301+
actions.add(operationStateAction);
302+
}
303+
}
304+
}
305+
} else if (state instanceof ParallelState) {
306+
ParallelState parallelState = (ParallelState) state;
307+
List<Branch> parallelStateBranches = parallelState.getBranches();
308+
if (parallelStateBranches != null) {
309+
for (Branch branch : parallelStateBranches) {
310+
List<Action> branchActions = branch.getActions();
311+
if (branchActions != null) {
312+
for (Action branchAction : branchActions) {
313+
if (checkIfActionUsesFunctionDefinition(functionDefinitionName, branchAction)) {
314+
actions.add(branchAction);
315+
}
316+
}
317+
}
318+
}
319+
}
320+
} else if (state instanceof ForEachState) {
321+
ForEachState forEachState = (ForEachState) state;
322+
List<Action> forEachStateActions = forEachState.getActions();
323+
if (forEachStateActions != null) {
324+
for (Action forEachStateAction : forEachStateActions) {
325+
if (checkIfActionUsesFunctionDefinition(functionDefinitionName, forEachStateAction)) {
326+
actions.add(forEachStateAction);
327+
}
328+
}
329+
}
330+
}
331+
}
332+
333+
return actions;
334+
}
335+
336+
private static boolean checkIfActionUsesFunctionDefinition(
337+
String functionDefinitionName, Action action) {
338+
return action != null
339+
&& action.getFunctionRef() != null
340+
&& action.getFunctionRef().getRefName() != null
341+
&& action.getFunctionRef().getRefName().equals(functionDefinitionName);
342+
}
343+
344+
private static boolean hasFunctionDefs(Workflow workflow, String functionDefinitionName) {
345+
if (!hasFunctionDefs(workflow)) return false;
346+
List<FunctionDefinition> functionDefs = workflow.getFunctions().getFunctionDefs();
347+
return functionDefs.stream()
348+
.anyMatch(
349+
functionDefinition -> functionDefinition.getName().equals(functionDefinitionName));
350+
}
351+
261352
private static FunctionRef getFunctionRefFromAction(Workflow workflow, String action) {
262353
if (!hasStates(workflow)) return null;
263354

utils/src/test/java/io/serverlessworkflow/util/FunctionDefinitionsTest.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919
import static org.junit.jupiter.api.Assertions.*;
2020

2121
import io.serverlessworkflow.api.Workflow;
22+
import io.serverlessworkflow.api.actions.Action;
2223
import io.serverlessworkflow.api.functions.FunctionDefinition;
2324
import io.serverlessworkflow.util.testutil.TestUtils;
2425
import io.serverlessworkflow.utils.WorkflowUtils;
26+
import java.util.List;
2527
import org.junit.jupiter.params.ParameterizedTest;
2628
import org.junit.jupiter.params.provider.ValueSource;
2729

@@ -43,7 +45,6 @@ public void testFunctionDefsForAction(String funcDefinitions) {
4345
@ValueSource(strings = {"/funcdefinitiontest/functiondefinition.yml"})
4446
public void testFunctionDefsForActionNotPresent(String funcDefinitions) {
4547
String actionLookUp = "finalizeApplicationFunctionNotPresent";
46-
int expectedCount = 0;
4748
Workflow workflow = TestUtils.createWorkflowFromTestResource(funcDefinitions);
4849
FunctionDefinition finalizeApplicationFunctionDefinition =
4950
WorkflowUtils.getFunctionDefinitionsForAction(workflow, actionLookUp);
@@ -55,4 +56,15 @@ public void testFunctionDefsForActionNotPresent(String funcDefinitions) {
5556
public void testFunctionDefsForNullWorkflow(String funcDefinitions) {
5657
assertNull(WorkflowUtils.getFunctionDefinitionsForAction(null, "TestAction"));
5758
}
59+
60+
@ParameterizedTest
61+
@ValueSource(strings = {"/funcdefinitiontest/functiondefinition.yml"})
62+
public void testGetActionsForFunctionDefinition(String funcDefinitions) {
63+
String functionRefName = "finalizeApplicationFunction";
64+
int expectedActionCount = 2;
65+
Workflow workflow = TestUtils.createWorkflowFromTestResource(funcDefinitions);
66+
List<Action> actionsForFunctionDefinition =
67+
WorkflowUtils.getActionsForFunctionDefinition(workflow, functionRefName);
68+
assertEquals(expectedActionCount, actionsForFunctionDefinition.size());
69+
}
5870
}

0 commit comments

Comments
 (0)