diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionLogMergeService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionLogMergeService.java index 7e3844031..a2b8e9bb6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionLogMergeService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionLogMergeService.java @@ -28,6 +28,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Change; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ChangeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ManualChange; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ManualRedactionType; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; @@ -189,157 +190,30 @@ public class RedactionLogMergeService { manualRedactionWrappers.forEach(mrw -> { - if (mrw.getItem() instanceof ManualImageRecategorization) { - var imageRecategorization = (ManualImageRecategorization) mrw.getItem(); - String manualOverrideReason = null; - if (imageRecategorization.getStatus().equals(AnnotationStatus.APPROVED)) { - - redactionLogEntry.setType(imageRecategorization.getType()); - redactionLogEntry.setSection("Image:" + redactionLogEntry.getType()); - - if (isHint(types, imageRecategorization.getType())) { - redactionLogEntry.setRedacted(false); - redactionLogEntry.setHint(true); - } else { - redactionLogEntry.setHint(false); - } - - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", recategorized by manual override"); - } else if (imageRecategorization.getStatus().equals(AnnotationStatus.REQUESTED)) { - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to recategorize"); - redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), false, types)); - } - - if (manualOverrideReason != null) { - redactionLogEntry.setReason(manualOverrideReason); - } - - redactionLogEntry.getManualChanges() - .add(ManualChange.from(imageRecategorization) - .withManualRedactionType(ManualRedactionType.RECATEGORIZE) - .withChange("type", imageRecategorization.getType())); + Object item = mrw.getItem(); + if (item instanceof ManualImageRecategorization) { + var imageRecategorization = (ManualImageRecategorization) item; + processManualImageRecategorization(redactionLogEntry, types, colors, imageRecategorization); } - if (mrw.getItem() instanceof IdRemoval) { - var manualRemoval = (IdRemoval) mrw.getItem(); - if (manualRemoval.getStatus().equals(AnnotationStatus.APPROVED) && manualRemoval.isRemoveFromDictionary()) { - log.debug("Skipping merge for dictionary-modifying entry"); - } else { - String manualOverrideReason = null; - if (manualRemoval.getStatus().equals(AnnotationStatus.APPROVED)) { - redactionLogEntry.setRedacted(false); - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", removed by manual override"); - redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), true, types)); - redactionLogEntry.setHint(false); - } else if (manualRemoval.getStatus().equals(AnnotationStatus.REQUESTED)) { - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to remove"); - redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); - } - - if (manualOverrideReason != null) { - redactionLogEntry.setReason(manualOverrideReason); - } - } - - redactionLogEntry.getManualChanges() - .add(ManualChange.from(manualRemoval) - .withManualRedactionType(manualRemoval.isRemoveFromDictionary() ? ManualRedactionType.REMOVE_FROM_DICTIONARY : ManualRedactionType.REMOVE_LOCALLY)); + if (item instanceof IdRemoval) { + var manualRemoval = (IdRemoval) item; + processIdRemoval(redactionLogEntry, types, colors, manualRemoval); } - if (mrw.getItem() instanceof ManualForceRedaction) { - var manualForceRedact = (ManualForceRedaction) mrw.getItem(); - String manualOverrideReason = null; - var dictionaryIsHint = isHint(types, redactionLogEntry.getType()); - if (manualForceRedact.getStatus().equals(AnnotationStatus.APPROVED)) { - // Forcing a skipped hint should result in a hint - if (dictionaryIsHint) { - redactionLogEntry.setHint(true); - } else { - redactionLogEntry.setRedacted(true); - } - redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), false, types)); - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", forced by manual override"); - redactionLogEntry.setLegalBasis(manualForceRedact.getLegalBasis()); - } else if (manualForceRedact.getStatus().equals(AnnotationStatus.REQUESTED)) { - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to force " + (dictionaryIsHint ? "hint" : "redact")); - redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); - redactionLogEntry.setLegalBasis(manualForceRedact.getLegalBasis()); - } - - if (manualOverrideReason != null) { - redactionLogEntry.setReason(manualOverrideReason); - } - - var manualChange = ManualChange.from(manualForceRedact) - .withManualRedactionType(dictionaryIsHint ? ManualRedactionType.FORCE_HINT : ManualRedactionType.FORCE_REDACT); - - redactionLogEntry.getManualChanges().add(manualChange); - + if (item instanceof ManualForceRedaction) { + var manualForceRedact = (ManualForceRedaction) item; + processManualForceRedaction(redactionLogEntry, types, colors, manualForceRedact); } - if (mrw.getItem() instanceof ManualLegalBasisChange) { - var manualLegalBasisChange = (ManualLegalBasisChange) mrw.getItem(); - String manualOverrideReason = null; - if (manualLegalBasisChange.getStatus().equals(AnnotationStatus.APPROVED)) { - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", legal basis was manually changed"); - redactionLogEntry.setLegalBasis(manualLegalBasisChange.getLegalBasis()); - redactionLogEntry.setRedacted(true); - if (manualLegalBasisChange.getSection() != null) { - redactionLogEntry.setSection(manualLegalBasisChange.getSection()); - } - if (redactionLogEntry.isRectangle() && manualLegalBasisChange.getValue() != null) { - redactionLogEntry.setValue(manualLegalBasisChange.getValue()); - } - } else if (manualLegalBasisChange.getStatus().equals(AnnotationStatus.REQUESTED)) { - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", legal basis change requested"); - redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); - } - - if (manualOverrideReason != null) { - redactionLogEntry.setReason(manualOverrideReason); - } - - var manualChange = ManualChange.from(manualLegalBasisChange).withManualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE); - manualChange.withChange("legalBasis", manualLegalBasisChange.getLegalBasis()); - if (manualLegalBasisChange.getSection() != null) { - manualChange.withChange("section", manualLegalBasisChange.getSection()); - } - if (redactionLogEntry.isRectangle() && manualLegalBasisChange.getValue() != null) { - manualChange.withChange("value", manualLegalBasisChange.getValue()); - } - redactionLogEntry.getManualChanges().add(manualChange); + if (item instanceof ManualLegalBasisChange) { + var manualLegalBasisChange = (ManualLegalBasisChange) item; + processManualLegalBasisChange(redactionLogEntry, types, colors, manualLegalBasisChange); } - if (mrw.getItem() instanceof ManualResizeRedaction) { - var manualResizeRedact = (ManualResizeRedaction) mrw.getItem(); - String manualOverrideReason = null; - if (manualResizeRedact.getStatus().equals(AnnotationStatus.APPROVED)) { - redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), false, types)); - redactionLogEntry.setPositions(convertPositions(manualResizeRedact.getPositions())); - if (!"signature".equalsIgnoreCase(redactionLogEntry.getType()) && !"logo".equalsIgnoreCase(redactionLogEntry.getType())) { - redactionLogEntry.setValue(manualResizeRedact.getValue()); - } - // This is for backwards compatibility, now the text after/before is calculated during reanalysis because we need to find dict entries on positions where entries are resized to smaller. - if (manualResizeRedact.getTextBefore() != null || manualResizeRedact.getTextAfter() != null) { - redactionLogEntry.setTextBefore(manualResizeRedact.getTextBefore()); - redactionLogEntry.setTextAfter(manualResizeRedact.getTextAfter()); - } - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", resized by manual override"); - } else if (manualResizeRedact.getStatus().equals(AnnotationStatus.REQUESTED)) { - manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to resize redact"); - redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); - redactionLogEntry.setPositions(convertPositions(manualResizeRedact.getPositions())); - - // This is for backwards compatibility, now the text after/before is calculated during reanalysis because we need to find dict entries on positions where entries are resized to smaller. - if (manualResizeRedact.getTextBefore() != null || manualResizeRedact.getTextAfter() != null) { - redactionLogEntry.setTextBefore(manualResizeRedact.getTextBefore()); - redactionLogEntry.setTextAfter(manualResizeRedact.getTextAfter()); - } - } - - redactionLogEntry.setReason(manualOverrideReason); - redactionLogEntry.getManualChanges() - .add(ManualChange.from(manualResizeRedact).withManualRedactionType(ManualRedactionType.RESIZE).withChange("value", manualResizeRedact.getValue())); + if (item instanceof ManualResizeRedaction) { + var manualResizeRedact = (ManualResizeRedaction) item; + processManualResizeRedaction(redactionLogEntry, types, colors, manualResizeRedact); } }); @@ -347,6 +221,36 @@ public class RedactionLogMergeService { } + private void processManualImageRecategorization(RedactionLogEntry redactionLogEntry, List types, Colors colors, ManualImageRecategorization imageRecategorization) { + + String manualOverrideReason = null; + if (imageRecategorization.getStatus().equals(AnnotationStatus.APPROVED)) { + + redactionLogEntry.setType(imageRecategorization.getType()); + redactionLogEntry.setSection("Image:" + redactionLogEntry.getType()); + + if (isHint(types, imageRecategorization.getType())) { + redactionLogEntry.setRedacted(false); + redactionLogEntry.setHint(true); + } else { + redactionLogEntry.setHint(false); + } + + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", recategorized by manual override"); + } else if (imageRecategorization.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to recategorize"); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), false, types)); + } + + if (manualOverrideReason != null) { + redactionLogEntry.setReason(manualOverrideReason); + } + + redactionLogEntry.getManualChanges() + .add(ManualChange.from(imageRecategorization).withManualRedactionType(ManualRedactionType.RECATEGORIZE).withChange("type", imageRecategorization.getType())); + } + + private String mergeReasonIfNecessary(String currentReason, String addition) { if (currentReason != null) { @@ -360,6 +264,138 @@ public class RedactionLogMergeService { } + private void processIdRemoval(RedactionLogEntry redactionLogEntry, List types, Colors colors, IdRemoval manualRemoval) { + + boolean isApprovedRedaction = manualRemoval.getStatus().equals(AnnotationStatus.APPROVED); + if (isApprovedRedaction && manualRemoval.isRemoveFromDictionary() && isBasedOnDictionaryOnly(redactionLogEntry)) { + log.debug("Skipping merge for dictionary-modifying entry"); + } else { + String redactionLogEntryType = redactionLogEntry.getType(); + String manualOverrideReason = null; + if (isApprovedRedaction) { + redactionLogEntry.setRedacted(false); + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", removed by manual override"); + redactionLogEntry.setColor(getColor(redactionLogEntryType, colors, false, redactionLogEntry.isRedacted(), true, types)); + redactionLogEntry.setHint(false); + } else if (manualRemoval.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to remove"); + redactionLogEntry.setColor(getColor(redactionLogEntryType, colors, true, redactionLogEntry.isRedacted(), false, types)); + } + + if (manualOverrideReason != null) { + redactionLogEntry.setReason(manualOverrideReason); + } + } + + redactionLogEntry.getManualChanges() + .add(ManualChange.from(manualRemoval) + .withManualRedactionType(manualRemoval.isRemoveFromDictionary() ? ManualRedactionType.REMOVE_FROM_DICTIONARY : ManualRedactionType.REMOVE_LOCALLY)); + } + + + private boolean isBasedOnDictionaryOnly(RedactionLogEntry redactionLogEntry) { + + return redactionLogEntry.getEngines().contains(Engine.DICTIONARY) && redactionLogEntry.getEngines().size() == 1; + } + + + private void processManualForceRedaction(RedactionLogEntry redactionLogEntry, List types, Colors colors, ManualForceRedaction manualForceRedact) { + + String manualOverrideReason = null; + var dictionaryIsHint = isHint(types, redactionLogEntry.getType()); + if (manualForceRedact.getStatus().equals(AnnotationStatus.APPROVED)) { + // Forcing a skipped hint should result in a hint + if (dictionaryIsHint) { + redactionLogEntry.setHint(true); + } else { + redactionLogEntry.setRedacted(true); + } + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), false, types)); + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", forced by manual override"); + redactionLogEntry.setLegalBasis(manualForceRedact.getLegalBasis()); + } else if (manualForceRedact.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to force " + (dictionaryIsHint ? "hint" : "redact")); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); + redactionLogEntry.setLegalBasis(manualForceRedact.getLegalBasis()); + } + + if (manualOverrideReason != null) { + redactionLogEntry.setReason(manualOverrideReason); + } + + var manualChange = ManualChange.from(manualForceRedact).withManualRedactionType(dictionaryIsHint ? ManualRedactionType.FORCE_HINT : ManualRedactionType.FORCE_REDACT); + + redactionLogEntry.getManualChanges().add(manualChange); + } + + + private void processManualLegalBasisChange(RedactionLogEntry redactionLogEntry, List types, Colors colors, ManualLegalBasisChange manualLegalBasisChange) { + + String manualOverrideReason = null; + if (manualLegalBasisChange.getStatus().equals(AnnotationStatus.APPROVED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", legal basis was manually changed"); + redactionLogEntry.setLegalBasis(manualLegalBasisChange.getLegalBasis()); + redactionLogEntry.setRedacted(true); + if (manualLegalBasisChange.getSection() != null) { + redactionLogEntry.setSection(manualLegalBasisChange.getSection()); + } + if (redactionLogEntry.isRectangle() && manualLegalBasisChange.getValue() != null) { + redactionLogEntry.setValue(manualLegalBasisChange.getValue()); + } + } else if (manualLegalBasisChange.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", legal basis change requested"); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); + } + + if (manualOverrideReason != null) { + redactionLogEntry.setReason(manualOverrideReason); + } + + var manualChange = ManualChange.from(manualLegalBasisChange).withManualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE); + manualChange.withChange("legalBasis", manualLegalBasisChange.getLegalBasis()); + if (manualLegalBasisChange.getSection() != null) { + manualChange.withChange("section", manualLegalBasisChange.getSection()); + } + if (redactionLogEntry.isRectangle() && manualLegalBasisChange.getValue() != null) { + manualChange.withChange("value", manualLegalBasisChange.getValue()); + } + redactionLogEntry.getManualChanges().add(manualChange); + } + + + private void processManualResizeRedaction(RedactionLogEntry redactionLogEntry, List types, Colors colors, ManualResizeRedaction manualResizeRedact) { + + String manualOverrideReason = null; + if (manualResizeRedact.getStatus().equals(AnnotationStatus.APPROVED)) { + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), false, types)); + redactionLogEntry.setPositions(convertPositions(manualResizeRedact.getPositions())); + if (!"signature".equalsIgnoreCase(redactionLogEntry.getType()) && !"logo".equalsIgnoreCase(redactionLogEntry.getType())) { + redactionLogEntry.setValue(manualResizeRedact.getValue()); + } + // This is for backwards compatibility, now the text after/before is calculated during reanalysis because we need to find dict entries on positions where entries are resized to smaller. + if (manualResizeRedact.getTextBefore() != null || manualResizeRedact.getTextAfter() != null) { + redactionLogEntry.setTextBefore(manualResizeRedact.getTextBefore()); + redactionLogEntry.setTextAfter(manualResizeRedact.getTextAfter()); + } + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", resized by manual override"); + } else if (manualResizeRedact.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to resize redact"); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); + redactionLogEntry.setPositions(convertPositions(manualResizeRedact.getPositions())); + + // This is for backwards compatibility, now the text after/before is calculated during reanalysis because we need to find dict entries on positions where entries are resized to smaller. + if (manualResizeRedact.getTextBefore() != null || manualResizeRedact.getTextAfter() != null) { + redactionLogEntry.setTextBefore(manualResizeRedact.getTextBefore()); + redactionLogEntry.setTextAfter(manualResizeRedact.getTextAfter()); + } + } + + redactionLogEntry.setReason(manualOverrideReason); + redactionLogEntry.getManualChanges() + .add(ManualChange.from(manualResizeRedact).withManualRedactionType(ManualRedactionType.RESIZE).withChange("value", manualResizeRedact.getValue())); + } + + public List addManualAddEntries(SectionGrid sectionGrid, Set manualAdds, Map> comments,