diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityChangeLogService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityChangeLogService.java index f0acf82e..2d50d3f6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityChangeLogService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityChangeLogService.java @@ -1,6 +1,7 @@ package com.iqser.red.service.redaction.v1.server.service; import java.time.OffsetDateTime; +import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.Set; @@ -12,6 +13,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ChangeType; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; @@ -46,19 +48,43 @@ public class EntityChangeLogService { entityLogEntry.getChanges().add(new Change(analysisNumber, ChangeType.ADDED, now)); continue; } - var previousEntity = optionalPreviousEntity.get(); + + EntityLogEntry previousEntity = optionalPreviousEntity.get(); entityLogEntry.getChanges().addAll(previousEntity.getChanges()); if (!previousEntity.getState().equals(entityLogEntry.getState())) { hasChanges = true; ChangeType changeType = calculateChangeType(entityLogEntry.getState(), previousEntity.getState()); entityLogEntry.getChanges().add(new Change(analysisNumber, changeType, now)); } + + addManualChanges(entityLogEntry, previousEntity); } addRemovedEntriesAsRemoved(previousEntityLogEntries, newEntityLogEntries, manualRedactions, analysisNumber, now); return hasChanges; } + // If a manual change is present in the previous entity but not in the new entity, add it to the new one and + // sort them, so they are displayed in the correct order. + private void addManualChanges(EntityLogEntry entityLogEntry, EntityLogEntry previousEntity) { + + Comparator manualChangeComparator = + Comparator.comparing(ManualChange::getManualRedactionType) + .thenComparing(ManualChange::getRequestedDate); + + previousEntity.getManualChanges().forEach(manualChange -> { + boolean contains = entityLogEntry.getManualChanges() + .stream() + .anyMatch(existingChange -> manualChangeComparator.compare(existingChange, manualChange) == 0); + + if (!contains) { + entityLogEntry.getManualChanges().add(manualChange); + entityLogEntry.getManualChanges().sort(Comparator.comparing(ManualChange::getRequestedDate)); + } + }); + } + + private void addRemovedEntriesAsRemoved(List previousEntityLogEntries, List newEntityLogEntries, ManualRedactions manualRedactions, diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityLogCreatorService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityLogCreatorService.java index fe498798..f630a968 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityLogCreatorService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityLogCreatorService.java @@ -18,6 +18,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; import com.iqser.red.service.redaction.v1.server.RedactionServiceSettings; import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; @@ -136,24 +137,47 @@ public class EntityLogCreatorService { private List createEntityLogEntries(Document document, AnalyzeRequest analyzeRequest, List notFoundPrecursorEntries) { + Set dictionaryEntries; + Set dictionaryEntriesValues; + + if (analyzeRequest.getManualRedactions() != null && !analyzeRequest.getManualRedactions().getEntriesToAdd().isEmpty()) { + dictionaryEntries = analyzeRequest.getManualRedactions().getEntriesToAdd() + .stream() + .filter(e -> e.isAddToDictionary() || e.isAddToDossierDictionary()) + .collect(Collectors.toSet()); + dictionaryEntriesValues = dictionaryEntries.stream() + .map(ManualRedactionEntry::getValue) + .collect(Collectors.toSet()); + } else { + dictionaryEntriesValues = new HashSet<>(); + dictionaryEntries = new HashSet<>(); + } + String dossierTemplateId = analyzeRequest.getDossierTemplateId(); + List entries = new ArrayList<>(); + document.getEntities() .stream() .filter(entity -> !entity.getValue().isEmpty()) .filter(EntityLogCreatorService::notFalsePositiveOrFalseRecommendation) .filter(entity -> !entity.removed()) - .forEach(entityNode -> entries.addAll(toEntityLogEntries(entityNode))); + .forEach(entityNode -> entries.addAll(toEntityLogEntries(entityNode, dictionaryEntries, dictionaryEntriesValues))); document.streamAllImages().filter(entity -> !entity.removed()).forEach(imageNode -> entries.add(createEntityLogEntry(imageNode, dossierTemplateId))); notFoundPrecursorEntries.stream().filter(entity -> !entity.removed()).forEach(precursorEntity -> entries.add(createEntityLogEntry(precursorEntity, dossierTemplateId))); return entries; } - private List toEntityLogEntries(TextEntity textEntity) { + private List toEntityLogEntries(TextEntity textEntity, Set dictionaryEntries, Set dictionaryEntriesValues) { List entityLogEntries = new ArrayList<>(); + // Adding ADD_TO_DICTIONARY manual change to the entity's manual overwrite + if (dictionaryEntriesValues.contains(textEntity.getValue())) { + textEntity.getManualOverwrite().addChange(dictionaryEntries.stream().filter(entry -> entry.getValue().equals(textEntity.getValue())).findFirst().get()); + } + // split entity into multiple entries if it occurs on multiple pages, since FE can't handle multi page entities for (PositionOnPage positionOnPage : textEntity.getPositionsOnPagePerPage()) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/ManualChangeFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/ManualChangeFactory.java index d4d6f3c3..0add07c9 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/ManualChangeFactory.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/ManualChangeFactory.java @@ -2,6 +2,7 @@ package com.iqser.red.service.redaction.v1.server.service; import java.time.OffsetDateTime; import java.util.List; +import java.util.stream.Collectors; import org.springframework.stereotype.Service; @@ -22,7 +23,7 @@ public class ManualChangeFactory { public List toManualChangeList(List manualChanges, boolean isHint) { - return manualChanges.stream().map(baseAnnotation -> toManualChange(baseAnnotation, isHint)).toList(); + return manualChanges.stream().map(baseAnnotation -> toManualChange(baseAnnotation, isHint)).collect(Collectors.toList()); }