From e86a370253d81ca161b1dc1401d2bd8fe8de46db Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Wed, 27 May 2026 13:54:47 +0200 Subject: [PATCH 1/2] [NAE-2442] Fix dataset update from database and action handling Introduced `updateCaseFromDb` in `IWorkflowService` and its implementation in `WorkflowService` to synchronize case data with the database. Updated `EventService` to invoke this method during action execution. --- .../engine/workflow/service/EventService.java | 6 ++++++ .../engine/workflow/service/WorkflowService.java | 10 ++++++++++ .../workflow/service/interfaces/IWorkflowService.java | 2 ++ 3 files changed, 18 insertions(+) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java index e7c8549c21..14eba05149 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java @@ -51,6 +51,9 @@ public List runActions(List actions, Case useCase, Optiona List functions = useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions(); actions.forEach(action -> { List outcomes = actionsRunner.run(action, useCase, task, params, functions); + if (useCase != null) { + workflowService.updateCaseFromDb(useCase); + } outcomes.stream().filter(SetDataEventOutcome.class::isInstance) .forEach(outcome -> { if (((SetDataEventOutcome) outcome).getChangedFields().isEmpty()) return; @@ -75,6 +78,9 @@ public List runEventActions(Case useCase, Task task, List List functions = useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions(); actions.forEach(action -> { List outcomes = actionsRunner.run(action, useCase, taskOpt, params, functions); + if (useCase != null) { + workflowService.updateCaseFromDb(useCase); + } outcomes.stream().filter(SetDataEventOutcome.class::isInstance) .forEach(outcome -> { if (((SetDataEventOutcome) outcome).getChangedFields().isEmpty()) return; diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java index a16077f530..a1d6537aec 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java @@ -252,6 +252,16 @@ public Case resolveActorRef(Case useCase, boolean canSaveUseCase) { return useCase; } + @Override + public void updateCaseFromDb(Case useCase) { + Case actual = findOneNoNet(useCase.getStringId()); + actual.getDataSet().forEach((id, dataField) -> { + if (dataField.isNewerThen(useCase.getDataField(id))) { + useCase.getDataSet().put(id, dataField); + } + }); + } + /** * Resolves actor permissions for the useCase based on the actor list data field. * diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java index 0065281b89..48818587fa 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java @@ -31,6 +31,8 @@ public interface IWorkflowService { Case resolveActorRef(Case useCase, boolean canSaveUseCase); + void updateCaseFromDb(Case useCase); + CreateCaseEventOutcome createCase(CreateCaseParams createCaseParams); Page findAllByAuthor(String authorId, String petriNet, Pageable pageable); From ce8003c66cf3eb770d1becefcc2752c1f120fbfe Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Wed, 27 May 2026 15:28:54 +0200 Subject: [PATCH 2/2] [NAE-2442] Fix dataset update from database and action handling Refactored `setData` method in `ActionApi` to use `Map>` for flexible data handling. Adjusted `WorkflowService` to use the `findOne` method for better database case update synchronization. --- .../com/netgrif/application/engine/actions/ActionApiImpl.java | 2 +- .../application/engine/workflow/service/WorkflowService.java | 2 +- .../application/engine/adapter/spring/actions/ActionApi.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/actions/ActionApiImpl.java b/application-engine/src/main/java/com/netgrif/application/engine/actions/ActionApiImpl.java index 4967e85e3c..be243a76b8 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/actions/ActionApiImpl.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/actions/ActionApiImpl.java @@ -111,7 +111,7 @@ public GetDataEventOutcome getData(String taskId, Map params) { } @Override - public SetDataEventOutcome setData(String taskId, Map> dataSet, Map params) throws JsonProcessingException { + public SetDataEventOutcome setData(String taskId, Map> dataSet, Map params) throws JsonProcessingException { log.debug("Setting data for task [{}] with params: [{}]", taskId, params == null ? "null" : params.toString()); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(dataSet); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java index a1d6537aec..1a25eb15fb 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java @@ -254,7 +254,7 @@ public Case resolveActorRef(Case useCase, boolean canSaveUseCase) { @Override public void updateCaseFromDb(Case useCase) { - Case actual = findOneNoNet(useCase.getStringId()); + Case actual = findOne(useCase.getStringId()); actual.getDataSet().forEach((id, dataField) -> { if (dataField.isNewerThen(useCase.getDataField(id))) { useCase.getDataSet().put(id, dataField); diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/actions/ActionApi.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/actions/ActionApi.java index 0fcf7a3730..fac2f56709 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/actions/ActionApi.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/actions/ActionApi.java @@ -47,7 +47,7 @@ public interface ActionApi { * @return the outcome of the set data operation * @throws JsonProcessingException if there is an error processing JSON data */ - SetDataEventOutcome setData(String taskId, Map> dataSet, Map params) throws JsonProcessingException; + SetDataEventOutcome setData(String taskId, Map> dataSet, Map params) throws JsonProcessingException; /** * Finds a specific case by its ID.