RED-3616: Do not remove annotation that intersects with skipped imported redactions

This commit is contained in:
deiflaender 2022-04-04 12:14:36 +02:00
parent 49d47a0682
commit d050070dc7
2 changed files with 56 additions and 12 deletions

View File

@ -159,7 +159,7 @@ 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);
var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), newRedactionLogEntries, false, analyzeRequest.getManualRedactions());
redactionLog.getRedactionLogEntry()
.removeIf(entry -> sectionsToReanalyse.contains(entry.getSectionNumber()) && !entry.getType()
@ -195,7 +195,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);

View File

@ -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<RedactionLogEntry> processImportedRedactions(String dossierTemplateId, String dossierId, String fileId,
List<RedactionLogEntry> redactionLogEntries, boolean addImportedRedactions) {
List<RedactionLogEntry> 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<String>() : manualRedactions.getIdsToRemove()
.stream()
.filter(idRemoval -> idRemoval.getStatus().equals(AnnotationStatus.APPROVED))
.map(idRemoval -> idRemoval.getAnnotationId())
.collect(Collectors.toSet());
var approvedResizeRedactions = new HashMap<String, List<Rectangle>>();
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;
@ -43,7 +69,8 @@ public class ImportedRedactionService {
private List<RedactionLogEntry> addImportedRedactionsRedactionLogEntries(String dossierTemplateId,
List<RedactionLogEntry> redactionLogEntries,
ImportedRedactions importedRedactions) {
ImportedRedactions importedRedactions,
Set<String> approvedRemoveRedactions) {
for (List<ImportedRedaction> 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<String> approvedRemoveRedactions,
Map<String, List<Rectangle>> 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<Rectangle> convert(
List<com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle> positions) {
return positions.stream()
.map(pos -> new Rectangle(new Point(pos.getTopLeftX(), pos.getTopLeftY()), pos.getWidth(), pos.getHeight(), pos.getPage()))
.collect(Collectors.toList());
}
}