From f687edd94be7ebaeb1a80ef688dbdaaf3f086103 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Wed, 21 Jan 2026 10:46:56 +0100 Subject: [PATCH] [NAE-2359] SetData endpoint no longer calls getData event on dataGroups resolving - added flag whether events are disabled when getting data - added new interface methods to ensure backward compatibility --- .../engine/workflow/service/DataService.java | 55 +++++++++++++++---- .../service/interfaces/IDataService.java | 12 ++++ .../workflow/web/AbstractTaskController.java | 2 +- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java index 672a229447..e42f880641 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java @@ -48,7 +48,6 @@ import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.poi.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.data.domain.Page; @@ -111,15 +110,25 @@ public class DataService implements IDataService { @Override public GetDataEventOutcome getData(String taskId) { - return getData(taskId, new HashMap<>()); + return getData(taskId, true); + } + + @Override + public GetDataEventOutcome getData(String taskId, boolean eventsEnabled) { + return getData(taskId, new HashMap<>(), eventsEnabled); } @Override public GetDataEventOutcome getData(String taskId, Map params) { + return getData(taskId, params, true); + } + + @Override + public GetDataEventOutcome getData(String taskId, Map params, boolean eventsEnabled) { Task task = taskService.findOne(taskId); Case useCase = workflowService.findOne(task.getCaseId()); - return getData(task, useCase, params); + return getData(task, useCase, params, eventsEnabled); } @Override @@ -127,8 +136,18 @@ public GetDataEventOutcome getData(Task task, Case useCase) { return getData(task, useCase, new HashMap<>()); } + @Override + public GetDataEventOutcome getData(Task task, Case useCase, boolean eventsEnabled) { + return getData(task, useCase, new HashMap<>(), eventsEnabled); + } + @Override public GetDataEventOutcome getData(Task task, Case useCase, Map params) { + return getData(task, useCase, params, true); + } + + @Override + public GetDataEventOutcome getData(Task task, Case useCase, Map params, boolean eventsEnabled) { log.info("[" + useCase.getStringId() + "]: Getting data of task " + task.getTransitionId() + " [" + task.getStringId() + "]"); AbstractUser user = userService.getLoggedOrSystem(); Transition transition = useCase.getPetriNet().getTransition(task.getTransitionId()); @@ -143,8 +162,10 @@ public GetDataEventOutcome getData(Task task, Case useCase, Map if (isForbidden(fieldId, transition, useCase.getDataField(fieldId))) return; Field field = useCase.getPetriNet().getField(fieldId).get(); - outcome.addOutcomes(resolveDataEvents(field, DataEventType.GET, EventPhase.PRE, useCase, task, params)); - publisher.publishEvent(new GetDataEvent(outcome, EventPhase.PRE, user)); + if (eventsEnabled) { + outcome.addOutcomes(resolveDataEvents(field, DataEventType.GET, EventPhase.PRE, useCase, task, params)); + publisher.publishEvent(new GetDataEvent(outcome, EventPhase.PRE, user)); + } if (outcome.getMessage() == null) { Map dataSet = useCase.getPetriNet().getTransition(task.getTransitionId()).getDataSet(); @@ -176,8 +197,10 @@ public GetDataEventOutcome getData(Task task, Case useCase, Map dataSetFields.add(validationField); } } - outcome.addOutcomes(resolveDataEvents(field, DataEventType.GET, EventPhase.POST, useCase, task, params)); - publisher.publishEvent(new GetDataEvent(outcome, EventPhase.POST, user)); + if (eventsEnabled) { + outcome.addOutcomes(resolveDataEvents(field, DataEventType.GET, EventPhase.POST, useCase, task, params)); + publisher.publishEvent(new GetDataEvent(outcome, EventPhase.POST, user)); + } }); workflowService.save(useCase); @@ -349,8 +372,18 @@ public GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale) { return getDataGroups(taskId, locale, new HashSet<>(), 0, null); } + @Override + public GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale, boolean eventsEnabled) { + return getDataGroups(taskId, locale, new HashSet<>(), 0, null, eventsEnabled); + } + @Override public GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale, Set collectedTaskIds, int level, String parentTaskRefId) { + return getDataGroups(taskId, locale, collectedTaskIds, level, parentTaskRefId, true); + } + + @Override + public GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale, Set collectedTaskIds, int level, String parentTaskRefId, boolean eventsEnabled) { Task task = taskService.findOne(taskId); Case useCase = workflowService.findOne(task.getCaseId()); PetriNet net = useCase.getPetriNet(); @@ -359,7 +392,7 @@ public GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale, Set log.info("Getting groups of task " + taskId + " in case " + useCase.getTitle() + " level: " + level); List resultDataGroups = new ArrayList<>(); - List> data = getData(task, useCase).getData(); + List> data = getData(task, useCase, eventsEnabled).getData(); Map> dataFieldMap = data.stream().collect(Collectors.toMap(Field::getImportId, field -> field)); List dataGroups = transition.getDataGroups().values().stream().map((dg) -> (DataGroup) new com.netgrif.application.engine.adapter.spring.workflow.domain.DataGroup((com.netgrif.application.engine.adapter.spring.workflow.domain.DataGroup) dg)).toList(); for (DataGroup dataGroup : dataGroups) { @@ -383,7 +416,7 @@ public GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale, Set } resources.add(resource); if (field.getType() == FieldType.TASK_REF && shouldResolveTaskRefData(field, transition.getDataSet().get(field.getStringId()))) { - resultDataGroups.addAll(collectTaskRefDataGroups((TaskField) dataFieldMap.get(dataFieldId), locale, collectedTaskIds, level)); + resultDataGroups.addAll(collectTaskRefDataGroups((TaskField) dataFieldMap.get(dataFieldId), locale, collectedTaskIds, level, eventsEnabled)); } } } @@ -409,7 +442,7 @@ private boolean hasRequiredComponentProperty(Component component, String propert && component.getProperties().get(propertyName).equals(propertyValue); } - private List collectTaskRefDataGroups(TaskField taskRefField, Locale locale, Set collectedTaskIds, int level) { + private List collectTaskRefDataGroups(TaskField taskRefField, Locale locale, Set collectedTaskIds, int level, boolean eventsEnabled) { List taskIds = taskRefField.getValue(); List groups = new ArrayList<>(); @@ -417,7 +450,7 @@ private List collectTaskRefDataGroups(TaskField taskRefField, Locale taskIds = taskIds.stream().filter(id -> !collectedTaskIds.contains(id)).collect(Collectors.toList()); taskIds.forEach(id -> { collectedTaskIds.add(id); - List taskRefDataGroups = getDataGroups(id, locale, collectedTaskIds, level + 1, taskRefField.getStringId()).getData(); + List taskRefDataGroups = getDataGroups(id, locale, collectedTaskIds, level + 1, taskRefField.getStringId(), eventsEnabled).getData(); resolveTaskRefBehavior(taskRefField, taskRefDataGroups); groups.addAll(taskRefDataGroups); }); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IDataService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IDataService.java index 7f1f5038a6..324b3c74f9 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IDataService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IDataService.java @@ -27,12 +27,20 @@ public interface IDataService { GetDataEventOutcome getData(String taskId); + GetDataEventOutcome getData(String taskId, boolean eventsEnabled); + GetDataEventOutcome getData(String taskId, Map params); + GetDataEventOutcome getData(String taskId, Map params, boolean eventsEnabled); + GetDataEventOutcome getData(Task task, Case useCase); + GetDataEventOutcome getData(Task task, Case useCase, boolean eventsEnabled); + GetDataEventOutcome getData(Task task, Case useCase, Map params); + GetDataEventOutcome getData(Task task, Case useCase, Map params, boolean eventsEnabled); + SetDataEventOutcome setData(String taskId, ObjectNode values); SetDataEventOutcome setData(String taskId, ObjectNode values, Map params); @@ -51,8 +59,12 @@ public interface IDataService { FileFieldInputStream getFileByName(Case useCase, FileListField field, String name, Map params) throws FileNotFoundException; + GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale, boolean eventsEnabled); + GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale, Set collectedTaskIds, int level, String parentTaskRefId); + GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale, Set collectedTaskIds, int level, String parentTaskRefId, boolean eventsEnabled); + FileFieldInputStream getFileByTask(String taskId, String fieldId, boolean forPreview) throws FileNotFoundException; FileFieldInputStream getFileByTaskAndName(String taskId, String fieldId, String name) throws FileNotFoundException; diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java index bbde665db3..43d3ce9b7d 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java @@ -221,7 +221,7 @@ public EntityModel getData(String taskId, Locale locale public EntityModel setData(String taskId, ObjectNode dataBody, Locale locale) { try { - List dataGroups = dataService.getDataGroups(taskId, locale).getData(); + List dataGroups = dataService.getDataGroups(taskId, locale, false).getData(); Set referencedTaskIds = new HashSet<>(); referencedTaskIds.add(taskId); for (com.netgrif.application.engine.objects.petrinet.domain.DataGroup dataGroup : dataGroups) {