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); PageEntities pageEntities = entityRedactionService.findEntities(dictionary, reanalysisSections, kieContainer, analyzeRequest, nerEntities);
var newRedactionLogEntries = redactionLogCreatorService.createRedactionLog(pageEntities, text.getNumberOfPages(), analyzeRequest.getDossierTemplateId()); 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() redactionLog.getRedactionLogEntry()
.removeIf(entry -> sectionsToReanalyse.contains(entry.getSectionNumber()) && !entry.getType() .removeIf(entry -> sectionsToReanalyse.contains(entry.getSectionNumber()) && !entry.getType()
@ -195,7 +195,7 @@ public class AnalyzeService {
.getDossierTemplateVersion(), dictionary.getVersion() .getDossierTemplateVersion(), dictionary.getVersion()
.getDossierVersion(), rulesVersion, legalBasisClient.getVersion(analyzeRequest.getDossierTemplateId())); .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); redactionLog.setRedactionLogEntry(importedRedactionFilteredEntries);
return finalizeAnalysis(analyzeRequest, startTime, redactionLog, text, dictionary.getVersion(), false); 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; 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.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service; 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.ImportedRedaction;
import com.iqser.red.service.redaction.v1.model.ImportedRedactions; 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.Rectangle;
import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; import com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; 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, 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); var importedRedactions = redactionStorageService.getImportedRedactions(dossierId, fileId);
if (importedRedactions == null) { if (importedRedactions == null || importedRedactions.getImportedRedactions().isEmpty()) {
return redactionLogEntries; 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) { if (addImportedRedactions) {
return addImportedRedactionsRedactionLogEntries(dossierTemplateId, redactionLogEntries, importedRedactions); return addImportedRedactionsRedactionLogEntries(dossierTemplateId, redactionLogEntries, importedRedactions, approvedRemoveRedactions);
} }
return redactionLogEntries; return redactionLogEntries;
@ -43,7 +69,8 @@ public class ImportedRedactionService {
private List<RedactionLogEntry> addImportedRedactionsRedactionLogEntries(String dossierTemplateId, private List<RedactionLogEntry> addImportedRedactionsRedactionLogEntries(String dossierTemplateId,
List<RedactionLogEntry> redactionLogEntries, List<RedactionLogEntry> redactionLogEntries,
ImportedRedactions importedRedactions) { ImportedRedactions importedRedactions,
Set<String> approvedRemoveRedactions) {
for (List<ImportedRedaction> importedRedactionsValues : importedRedactions.getImportedRedactions().values()) { for (List<ImportedRedaction> importedRedactionsValues : importedRedactions.getImportedRedactions().values()) {
for (ImportedRedaction importedRedaction : importedRedactionsValues) { for (ImportedRedaction importedRedaction : importedRedactionsValues) {
@ -51,9 +78,9 @@ public class ImportedRedactionService {
.id(importedRedaction.getId()) .id(importedRedaction.getId())
.type(IMPORTED_REDACTION_TYPE) .type(IMPORTED_REDACTION_TYPE)
.imported(true) .imported(true)
.redacted(true) .redacted(approvedRemoveRedactions.contains(importedRedaction.getId()) ? false : true)
.positions(importedRedaction.getPositions()) .positions(importedRedaction.getPositions())
.color(getColor("imported_redaction", dossierTemplateId)) .color(getColor(IMPORTED_REDACTION_TYPE, dossierTemplateId))
.build(); .build();
redactionLogEntries.add(redactionLogEntry); 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()) { for (Rectangle rectangle : redactionLogEntry.getPositions()) {
if (importedRedactions.getImportedRedactions().containsKey(rectangle.getPage())) { if (importedRedactions.getImportedRedactions().containsKey(rectangle.getPage())) {
var importedRedactionsOnPage = importedRedactions.getImportedRedactions().get(rectangle.getPage()); var importedRedactionsOnPage = importedRedactions.getImportedRedactions().get(rectangle.getPage());
for (ImportedRedaction importedRedaction : importedRedactionsOnPage) { 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)) { if (intersects(importedRedactionPosition, rectangle)) {
return true; return true;
} }
@ -99,4 +133,14 @@ public class ImportedRedactionService {
return dictionaryService.getColor(type, dossierTemplateId); 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());
}
} }