RED-7784 - Fixes for unprocessed redactions
This commit is contained in:
parent
0a08c57f44
commit
eae93223fa
@ -9,9 +9,11 @@ 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.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.UnprocessedManualEntityClient;
|
import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.UnprocessedManualEntityClient;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
|
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
|
||||||
@ -19,6 +21,7 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.
|
|||||||
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
|
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService;
|
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService;
|
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService;
|
||||||
|
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Change;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Change;
|
||||||
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.ChangeType;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog;
|
||||||
@ -36,6 +39,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations
|
|||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
||||||
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.annotations.entitymapped.ManualRedactionEntry;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel;
|
||||||
import com.iqser.red.service.redaction.v1.model.UnprocessedManualEntity;
|
import com.iqser.red.service.redaction.v1.model.UnprocessedManualEntity;
|
||||||
|
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
@ -47,6 +51,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
|
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@Transactional
|
||||||
public class EntityLogService {
|
public class EntityLogService {
|
||||||
|
|
||||||
FileManagementStorageService fileManagementStorageService;
|
FileManagementStorageService fileManagementStorageService;
|
||||||
@ -56,6 +61,7 @@ public class EntityLogService {
|
|||||||
DossierService dossierService;
|
DossierService dossierService;
|
||||||
CommentService commentService;
|
CommentService commentService;
|
||||||
DictionaryPersistenceService dictionaryPersistenceService;
|
DictionaryPersistenceService dictionaryPersistenceService;
|
||||||
|
DossierTemplatePersistenceService dossierTemplatePersistenceService;
|
||||||
|
|
||||||
|
|
||||||
public EntityLog getEntityLog(String dossierId, String fileId) {
|
public EntityLog getEntityLog(String dossierId, String fileId) {
|
||||||
@ -84,7 +90,7 @@ public class EntityLogService {
|
|||||||
DossierEntity dossier = dossierService.getDossierById(dossierId);
|
DossierEntity dossier = dossierService.getDossierById(dossierId);
|
||||||
ManualRedactions manualRedactions = manualRedactionProviderService.getManualRedactions(fileId, true);
|
ManualRedactions manualRedactions = manualRedactionProviderService.getManualRedactions(fileId, true);
|
||||||
List<UnprocessedManualEntity> unprocessedManualEntities = getUnprocessedManualEntities(dossierId, fileId, dossier.getDossierTemplateId(), manualRedactions);
|
List<UnprocessedManualEntity> unprocessedManualEntities = getUnprocessedManualEntities(dossierId, fileId, dossier.getDossierTemplateId(), manualRedactions);
|
||||||
mergeEntityLog(manualRedactions, unprocessedManualEntities, entityLog, dossier.getDossierTemplateId());
|
mergeEntityLog(manualRedactions, unprocessedManualEntities, entityLog, dossier, fileStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, Integer> commentCountPerAnnotationId = commentService.getCommentCounts(fileId);
|
Map<String, Integer> commentCountPerAnnotationId = commentService.getCommentCounts(fileId);
|
||||||
@ -136,20 +142,20 @@ public class EntityLogService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mergeEntityLog(ManualRedactions manualRedactions, List<UnprocessedManualEntity> unprocessedManualEntities, EntityLog entityLog, String dossierTemplateId) {
|
public void mergeEntityLog(ManualRedactions manualRedactions, List<UnprocessedManualEntity> unprocessedManualEntities, EntityLog entityLog, DossierEntity dossier, FileModel fileStatus) {
|
||||||
|
|
||||||
log.info("Merging EntityLog");
|
log.info("Merging EntityLog");
|
||||||
mergeManualRedactionEntries(manualRedactions.getEntriesToAdd(), unprocessedManualEntities, entityLog, dossierTemplateId);
|
mergeManualRedactionEntries(manualRedactions.getEntriesToAdd(), unprocessedManualEntities, entityLog, dossier, fileStatus);
|
||||||
mergeIdsToRemove(manualRedactions.getIdsToRemove(), entityLog);
|
mergeIdsToRemove(manualRedactions.getIdsToRemove(), entityLog);
|
||||||
mergeResizeRedactions(manualRedactions.getResizeRedactions(), entityLog);
|
mergeResizeRedactions(manualRedactions.getResizeRedactions(), entityLog);
|
||||||
mergeLegalBasisChanges(manualRedactions.getLegalBasisChanges(), entityLog);
|
mergeLegalBasisChanges(manualRedactions.getLegalBasisChanges(), entityLog);
|
||||||
mergeRecategorizations(manualRedactions.getRecategorizations(), entityLog);
|
mergeRecategorizations(manualRedactions.getRecategorizations(), entityLog, dossier, fileStatus);
|
||||||
mergeForceRedactions(manualRedactions.getForceRedactions(), entityLog);
|
mergeForceRedactions(manualRedactions.getForceRedactions(), entityLog);
|
||||||
log.info("EntityLog merged successfully!");
|
log.info("EntityLog merged successfully!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void mergeManualRedactionEntries(Set<ManualRedactionEntry> manualRedactionEntries, List<UnprocessedManualEntity> unprocessedManualEntities, EntityLog entityLog, String dossierTemplateId) {
|
private void mergeManualRedactionEntries(Set<ManualRedactionEntry> manualRedactionEntries, List<UnprocessedManualEntity> unprocessedManualEntities, EntityLog entityLog, DossierEntity dossier, FileModel fileStatus) {
|
||||||
|
|
||||||
manualRedactionEntries.forEach(manualRedactionEntry -> {
|
manualRedactionEntries.forEach(manualRedactionEntry -> {
|
||||||
UnprocessedManualEntity unprocessedManualEntity = unprocessedManualEntities.stream()
|
UnprocessedManualEntity unprocessedManualEntity = unprocessedManualEntities.stream()
|
||||||
@ -161,12 +167,12 @@ public class EntityLogService {
|
|||||||
.dateTime(OffsetDateTime.now())
|
.dateTime(OffsetDateTime.now())
|
||||||
.type(ChangeType.ADDED)
|
.type(ChangeType.ADDED)
|
||||||
.build());
|
.build());
|
||||||
boolean isHint = isHint(manualRedactionEntry.getType(), dossierTemplateId);
|
boolean isHint = isHint(manualRedactionEntry.getType(), dossier, fileStatus);
|
||||||
entityLog.getEntityLogEntry().add(EntityLogEntry.builder()
|
entityLog.getEntityLogEntry().add(EntityLogEntry.builder()
|
||||||
.id(manualRedactionEntry.getAnnotationId())
|
.id(manualRedactionEntry.getAnnotationId())
|
||||||
.type(manualRedactionEntry.getType())
|
.type(manualRedactionEntry.getType())
|
||||||
.value(manualRedactionEntry.getValue())
|
.value(manualRedactionEntry.getValue())
|
||||||
.legalBasis(manualRedactionEntry.getLegalBasis())
|
.legalBasis(manualRedactionEntry.getLegalBasis() == null || manualRedactionEntry.getLegalBasis().isEmpty() ? unprocessedManualEntity.getLegalBasis() : manualRedactionEntry.getLegalBasis())
|
||||||
.reason(manualRedactionEntry.getReason())
|
.reason(manualRedactionEntry.getReason())
|
||||||
.entryType(isHint ? EntryType.HINT : EntryType.ENTITY)
|
.entryType(isHint ? EntryType.HINT : EntryType.ENTITY)
|
||||||
.state(isHint ? EntryState.SKIPPED : EntryState.APPLIED)
|
.state(isHint ? EntryState.SKIPPED : EntryState.APPLIED)
|
||||||
@ -262,12 +268,15 @@ public class EntityLogService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mergeRecategorizations(Set<ManualRecategorization> recategorizations, EntityLog entityLog) {
|
private void mergeRecategorizations(Set<ManualRecategorization> recategorizations, EntityLog entityLog, DossierEntity dossier, FileModel fileStatus) {
|
||||||
|
|
||||||
recategorizations.forEach(recategorization -> {
|
recategorizations.forEach(recategorization -> {
|
||||||
|
boolean isHint = isHint(recategorization.getType(), dossier, fileStatus);
|
||||||
var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(recategorization.getAnnotationId())).findAny();
|
var entity = entityLog.getEntityLogEntry().stream().filter(entityLogEntry -> entityLogEntry.getId().equals(recategorization.getAnnotationId())).findAny();
|
||||||
if (entity.isPresent()) {
|
if (entity.isPresent()) {
|
||||||
entity.get().setType(recategorization.getType());
|
entity.get().setType(recategorization.getType());
|
||||||
|
entity.get().setEntryType(getEntryType(isHint, recategorization.getType()));
|
||||||
|
entity.get().setState(isHint ? EntryState.SKIPPED : EntryState.APPLIED);
|
||||||
addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber());
|
addChanges(entity.get().getChanges(), ChangeType.CHANGED, entityLog.getAnalysisNumber());
|
||||||
entity.get().getManualChanges().add(ManualChange.builder()
|
entity.get().getManualChanges().add(ManualChange.builder()
|
||||||
.manualRedactionType(ManualRedactionType.RECATEGORIZE)
|
.manualRedactionType(ManualRedactionType.RECATEGORIZE)
|
||||||
@ -280,6 +289,17 @@ public class EntityLogService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static EntryType getEntryType(boolean isHint, String type) {
|
||||||
|
|
||||||
|
if (type.equals("image") || type.equals("logo") || type.equals("signature") || type.equals("formula")) {
|
||||||
|
return isHint ? EntryType.IMAGE_HINT : EntryType.IMAGE;
|
||||||
|
} else {
|
||||||
|
return isHint ? EntryType.HINT : EntryType.ENTITY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void mergeForceRedactions(Set<ManualForceRedaction> forceRedactions, EntityLog entityLog) {
|
private void mergeForceRedactions(Set<ManualForceRedaction> forceRedactions, EntityLog entityLog) {
|
||||||
|
|
||||||
forceRedactions.forEach(forceRedaction -> {
|
forceRedactions.forEach(forceRedaction -> {
|
||||||
@ -312,13 +332,39 @@ public class EntityLogService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isHint(String type, String dossierTemplateId) {
|
private boolean isHint(String type, DossierEntity dossier, FileModel fileStatus) {
|
||||||
|
|
||||||
String typeId = toTypeId(type, dossierTemplateId);
|
String typeId = toTypeId(type, dossier.getDossierTemplateId());
|
||||||
TypeEntity typeEntity = dictionaryPersistenceService.getType(typeId);
|
TypeEntity typeEntity = dictionaryPersistenceService.getType(typeId);
|
||||||
|
|
||||||
if (typeEntity == null) {
|
if (typeEntity == null) {
|
||||||
throw new NotFoundException("TypeEntity could not be found for typeId: " + typeId);
|
var optionalType = dictionaryPersistenceService.getAllTypes(false).stream().filter(typeEntity1 -> typeEntity1.getType().equals(type)).findFirst();
|
||||||
|
if (optionalType.isPresent()) {
|
||||||
|
typeEntity = optionalType.get();
|
||||||
|
} else {
|
||||||
|
throw new NotFoundException("TypeEntity could not be found for typeId: " + typeId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Objects.equals(type, "CBI_address")) {
|
||||||
|
|
||||||
|
String vertebrateStudyId = "";
|
||||||
|
var fileAttributesMap = fileStatus.getFileAttributes();
|
||||||
|
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(dossier.getDossierTemplateId());
|
||||||
|
var fileAttributeConfigs = dossierTemplate.getFileAttributeConfigs();
|
||||||
|
var vertebrateStudy = fileAttributeConfigs.stream().filter(fileAttributeConfigEntity -> fileAttributeConfigEntity.getLabel().equals("Vertebrate Study")).findFirst();
|
||||||
|
|
||||||
|
if (vertebrateStudy.isPresent()) {
|
||||||
|
vertebrateStudyId = vertebrateStudy.get().getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Objects.equals(vertebrateStudyId, "")
|
||||||
|
&& fileAttributesMap.containsKey(vertebrateStudyId)
|
||||||
|
&& (fileAttributesMap.get(vertebrateStudyId) == null || !fileAttributesMap.get(vertebrateStudyId).equals("Yes"))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return typeEntity.isHint();
|
return typeEntity.isHint();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,7 @@ import java.util.UUID;
|
|||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
import org.testcontainers.shaded.com.google.common.collect.Lists;
|
import org.testcontainers.shaded.com.google.common.collect.Lists;
|
||||||
@ -32,6 +33,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.FileMan
|
|||||||
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService;
|
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService;
|
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService;
|
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService;
|
||||||
|
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
|
||||||
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.ChangeType;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog;
|
||||||
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.EntityLogEntry;
|
||||||
@ -73,12 +75,15 @@ public class EntityLogTest {
|
|||||||
@MockBean
|
@MockBean
|
||||||
private DictionaryPersistenceService dictionaryPersistenceService;
|
private DictionaryPersistenceService dictionaryPersistenceService;
|
||||||
|
|
||||||
|
@MockBean
|
||||||
|
private DossierTemplatePersistenceService dossierTemplatePersistenceService;
|
||||||
|
|
||||||
private EntityLogService entityLogService;
|
private EntityLogService entityLogService;
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
|
|
||||||
entityLogService = new EntityLogService(fileManagementStorageService, fileStatusService, manualRedactionProviderService, unprocessedManualEntityClient, dossierService, commentService, dictionaryPersistenceService);
|
entityLogService = new EntityLogService(fileManagementStorageService, fileStatusService, manualRedactionProviderService, unprocessedManualEntityClient, dossierService, commentService, dictionaryPersistenceService, dossierTemplatePersistenceService);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -31,10 +31,10 @@
|
|||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<redaction-service.version>4.165.0</redaction-service.version>
|
<redaction-service.version>4.177.0</redaction-service.version>
|
||||||
<search-service.version>2.71.0</search-service.version>
|
<search-service.version>2.71.0</search-service.version>
|
||||||
<pdftron-redaction-service.version>4.38.0</pdftron-redaction-service.version>
|
<pdftron-redaction-service.version>4.38.0</pdftron-redaction-service.version>
|
||||||
<redaction-report-service.version>4.33.0</redaction-report-service.version>
|
<redaction-report-service.version>4.36.0</redaction-report-service.version>
|
||||||
<ocr-service.version>3.10.0</ocr-service.version>
|
<ocr-service.version>3.10.0</ocr-service.version>
|
||||||
<storage.commons.version>2.45.0</storage.commons.version>
|
<storage.commons.version>2.45.0</storage.commons.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user