From cd27b364fe65a93dce04ccae311724bb3f3c37c6 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Mon, 8 Dec 2025 19:42:02 +0100 Subject: [PATCH 1/3] Add support for handling TaskField in ElasticCaseMapping Introduced the TaskField class to handle task references in elastic mappings. Updated ElasticCaseMappingService to transform TaskField objects and integrated this functionality into the application engine. This enhancement ensures proper indexing and retrieval of task-related data in Elasticsearch. --- .../service/ElasticCaseMappingService.java | 8 +++++ .../objects/elastic/domain/TaskField.java | 26 ++++++++++++++++ .../spring/elastic/domain/TaskField.java | 31 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java create mode 100644 nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/TaskField.java diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseMappingService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseMappingService.java index 23ec0930de..8a2785d9ac 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseMappingService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseMappingService.java @@ -6,6 +6,7 @@ import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseMappingService; import com.netgrif.application.engine.objects.petrinet.domain.I18nString; import com.netgrif.application.engine.objects.petrinet.domain.dataset.*; +import com.netgrif.application.engine.objects.petrinet.domain.dataset.TaskField; import com.netgrif.application.engine.objects.workflow.domain.Case; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -77,6 +78,8 @@ protected Optional transformDataField(String fieldId, Case useCase) { return this.transformFilterFieldField(caseField, (com.netgrif.application.engine.objects.petrinet.domain.dataset.FilterField) netField); } else if (netField instanceof com.netgrif.application.engine.objects.petrinet.domain.dataset.StringCollectionField) { return this.transformStringCollectionField(caseField, (com.netgrif.application.engine.objects.petrinet.domain.dataset.StringCollectionField) netField); + } else if (netField instanceof com.netgrif.application.engine.objects.petrinet.domain.dataset.TaskField) { + return this.transformTaskField(caseField); } else { String string = caseField.getValue().toString(); if (string == null) @@ -226,6 +229,11 @@ private Optional getMultichoiceValue(com.netgrif.application.engine.objects return Optional.of(new com.netgrif.application.engine.adapter.spring.elastic.domain.UserListField(userMappingData)); } + protected Optional transformTaskField(com.netgrif.application.engine.objects.workflow.domain.DataField dataField) { + String[] referencedTasks = ((List) dataField.getValue()).toArray(new String[0]); + return Optional.of(new com.netgrif.application.engine.adapter.spring.elastic.domain.TaskField(referencedTasks)); + } + private UserField.UserMappingData transformUserValue(UserFieldValue user) { return new UserField.UserMappingData(user.getId(), user.getRealmId(), user.getUsername(), buildFullName(user.getFirstName(), user.getLastName()).toString()); } diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java new file mode 100644 index 0000000000..6afb80dc0f --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java @@ -0,0 +1,26 @@ +package com.netgrif.application.engine.objects.elastic.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public abstract class TaskField extends DataField { + + public String[] taskRefValue; + + public TaskField(String[] values) { + super(values); + this.taskRefValue = values; + } + + @Override + public Object getValue() { + return new ArrayList<>(List.of(taskRefValue)); + } +} diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/TaskField.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/TaskField.java new file mode 100644 index 0000000000..9b463851e7 --- /dev/null +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/TaskField.java @@ -0,0 +1,31 @@ +package com.netgrif.application.engine.adapter.spring.elastic.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.data.elasticsearch.annotations.Field; + +import static org.springframework.data.elasticsearch.annotations.FieldType.Keyword; +import static org.springframework.data.elasticsearch.annotations.FieldType.Text; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class TaskField extends com.netgrif.application.engine.objects.elastic.domain.TaskField { + + public TaskField(String[] values) { + super(values); + } + + @Override + @Field(type = Text) + public String[] getFulltextValue() { + return super.getFulltextValue(); + } + + @Override + @Field(type = Keyword) + public String[] getTaskRefValue() { + return super.getTaskRefValue(); + } +} From c54a2fa77a047d1cfae8dd044bd94281ac1ee96a Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Tue, 9 Dec 2025 09:49:39 +0100 Subject: [PATCH 2/3] Refactor TaskField value handling for null safety. Replaced `List.of` with `Arrays.asList` to allow null checks and ensure compatibility. Added a null check for `taskRefValue` to prevent potential `NullPointerException` and return an empty list when it is null. This improves robustness and aligns with safe coding practices. --- .../engine/objects/elastic/domain/TaskField.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java index 6afb80dc0f..85934d778e 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java @@ -5,7 +5,7 @@ import lombok.NoArgsConstructor; import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; @Data @NoArgsConstructor @@ -21,6 +21,9 @@ public TaskField(String[] values) { @Override public Object getValue() { - return new ArrayList<>(List.of(taskRefValue)); + if (taskRefValue == null) { + return new ArrayList(); + } + return new ArrayList<>(Arrays.asList(taskRefValue)); } } From 2f8a320fa45169003f46c2880d529eb82d6e5436 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Tue, 9 Dec 2025 09:54:21 +0100 Subject: [PATCH 3/3] - removed String qualifier --- .../application/engine/objects/elastic/domain/TaskField.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java index 85934d778e..2ed419123b 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/TaskField.java @@ -22,7 +22,7 @@ public TaskField(String[] values) { @Override public Object getValue() { if (taskRefValue == null) { - return new ArrayList(); + return new ArrayList<>(); } return new ArrayList<>(Arrays.asList(taskRefValue)); }