From 4b27910ff215360d763079b430e169f79160a523 Mon Sep 17 00:00:00 2001 From: deiflaender Date: Mon, 4 Apr 2022 12:14:36 +0200 Subject: [PATCH] RED-3616: Do not remove annotation that intersects with skipped imported redactions --- .../redaction/service/AnalyzeService.java | 13 ++-- .../service/ImportedRedactionService.java | 64 ++++++++++++++++--- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java index 70059b16..866341c0 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java @@ -159,12 +159,13 @@ public class AnalyzeService { PageEntities pageEntities = entityRedactionService.findEntities(dictionary, reanalysisSections, kieContainer, analyzeRequest, nerEntities); var newRedactionLogEntries = redactionLogCreatorService.createRedactionLog(pageEntities, text.getNumberOfPages(), analyzeRequest.getDossierTemplateId()); - var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), newRedactionLogEntries, false); - redactionLog.getRedactionLogEntry() - .removeIf(entry -> sectionsToReanalyse.contains(entry.getSectionNumber()) && !entry.getType() - .equals(IMPORTED_REDACTION_TYPE)); - redactionLog.getRedactionLogEntry().addAll(importedRedactionFilteredEntries); + .removeIf(entry -> entry.equals(IMPORTED_REDACTION_TYPE) || sectionsToReanalyse.contains(entry.getSectionNumber())); + redactionLog.getRedactionLogEntry().addAll(newRedactionLogEntries); + + var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), redactionLog.getRedactionLogEntry(), false, analyzeRequest.getManualRedactions()); + + redactionLog.setRedactionLogEntry(importedRedactionFilteredEntries); return finalizeAnalysis(analyzeRequest, startTime, redactionLog, text, dictionaryIncrement.getDictionaryVersion(), true); } @@ -195,7 +196,7 @@ public class AnalyzeService { .getDossierTemplateVersion(), dictionary.getVersion() .getDossierVersion(), rulesVersion, legalBasisClient.getVersion(analyzeRequest.getDossierTemplateId())); - var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), redactionLog.getRedactionLogEntry(), true); + var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), redactionLog.getRedactionLogEntry(), true, analyzeRequest.getManualRedactions()); redactionLog.setRedactionLogEntry(importedRedactionFilteredEntries); return finalizeAnalysis(analyzeRequest, startTime, redactionLog, text, dictionary.getVersion(), false); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ImportedRedactionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ImportedRedactionService.java index 28ccfe35..9039832e 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ImportedRedactionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ImportedRedactionService.java @@ -1,12 +1,21 @@ package com.iqser.red.service.redaction.v1.server.redaction.service; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import org.springframework.stereotype.Service; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; import com.iqser.red.service.redaction.v1.model.ImportedRedaction; import com.iqser.red.service.redaction.v1.model.ImportedRedactions; +import com.iqser.red.service.redaction.v1.model.Point; import com.iqser.red.service.redaction.v1.model.Rectangle; import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; @@ -24,17 +33,34 @@ public class ImportedRedactionService { public List processImportedRedactions(String dossierTemplateId, String dossierId, String fileId, - List redactionLogEntries, boolean addImportedRedactions) { + List redactionLogEntries, + boolean addImportedRedactions, + ManualRedactions manualRedactions) { var importedRedactions = redactionStorageService.getImportedRedactions(dossierId, fileId); - if (importedRedactions == null) { + if (importedRedactions == null || importedRedactions.getImportedRedactions().isEmpty()) { return redactionLogEntries; } - redactionLogEntries.removeIf(redactionLogEntry -> hasIntersections(redactionLogEntry, importedRedactions)); + var approvedRemoveRedactions = manualRedactions == null ? new HashSet() : manualRedactions.getIdsToRemove() + .stream() + .filter(idRemoval -> idRemoval.getStatus().equals(AnnotationStatus.APPROVED)) + .map(idRemoval -> idRemoval.getAnnotationId()) + .collect(Collectors.toSet()); + + var approvedResizeRedactions = new HashMap>(); + if (manualRedactions != null) { + manualRedactions.getResizeRedactions().forEach(resizeRedaction -> { + if (resizeRedaction.getStatus().equals(AnnotationStatus.APPROVED)) { + approvedResizeRedactions.put(resizeRedaction.getAnnotationId(), convert(resizeRedaction.getPositions())); + } + }); + } + + redactionLogEntries.removeIf(redactionLogEntry -> !(redactionLogEntry.isImage() && !redactionLogEntry.isRedacted()) && hasIntersections(redactionLogEntry, importedRedactions, approvedRemoveRedactions, approvedResizeRedactions)); if (addImportedRedactions) { - return addImportedRedactionsRedactionLogEntries(dossierTemplateId, redactionLogEntries, importedRedactions); + return addImportedRedactionsRedactionLogEntries(dossierTemplateId, redactionLogEntries, importedRedactions, approvedRemoveRedactions); } return redactionLogEntries; @@ -42,8 +68,9 @@ public class ImportedRedactionService { private List addImportedRedactionsRedactionLogEntries(String dossierTemplateId, - List redactionLogEntries, - ImportedRedactions importedRedactions) { + List redactionLogEntries, + ImportedRedactions importedRedactions, + Set approvedRemoveRedactions) { for (List importedRedactionsValues : importedRedactions.getImportedRedactions().values()) { for (ImportedRedaction importedRedaction : importedRedactionsValues) { @@ -51,9 +78,9 @@ public class ImportedRedactionService { .id(importedRedaction.getId()) .type(IMPORTED_REDACTION_TYPE) .imported(true) - .redacted(true) + .redacted(approvedRemoveRedactions.contains(importedRedaction.getId()) ? false : true) .positions(importedRedaction.getPositions()) - .color(getColor("imported_redaction", dossierTemplateId)) + .color(getColor(IMPORTED_REDACTION_TYPE, dossierTemplateId)) .build(); redactionLogEntries.add(redactionLogEntry); @@ -64,13 +91,20 @@ public class ImportedRedactionService { } - private boolean hasIntersections(RedactionLogEntry redactionLogEntry, ImportedRedactions importedRedactions) { + private boolean hasIntersections(RedactionLogEntry redactionLogEntry, ImportedRedactions importedRedactions, + Set approvedRemoveRedactions, + Map> approvedResizeRedactions) { for (Rectangle rectangle : redactionLogEntry.getPositions()) { if (importedRedactions.getImportedRedactions().containsKey(rectangle.getPage())) { var importedRedactionsOnPage = importedRedactions.getImportedRedactions().get(rectangle.getPage()); for (ImportedRedaction importedRedaction : importedRedactionsOnPage) { - for (Rectangle importedRedactionPosition : importedRedaction.getPositions()) { + + if (approvedRemoveRedactions.contains(importedRedaction.getId())) { + continue; + } + + for (Rectangle importedRedactionPosition : approvedResizeRedactions.containsKey(importedRedaction.getId()) ? approvedResizeRedactions.get(importedRedaction.getId()) : importedRedaction.getPositions()) { if (intersects(importedRedactionPosition, rectangle)) { return true; } @@ -99,4 +133,14 @@ public class ImportedRedactionService { return dictionaryService.getColor(type, dossierTemplateId); } + + private List convert( + List positions) { + + return positions.stream() + .map(pos -> new Rectangle(new Point(pos.getTopLeftX(), pos.getTopLeftY()), pos.getWidth(), pos.getHeight(), pos.getPage())) + .collect(Collectors.toList()); + + } + }