diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityChangeLogService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityChangeLogService.java index 08b32ad1..8e24fa77 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityChangeLogService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityChangeLogService.java @@ -26,10 +26,9 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor -@FieldDefaults(makeFinal=true, level= AccessLevel.PRIVATE) +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class EntityChangeLogService { - @Timed("redactmanager_computeChanges") public boolean computeChanges(List previousEntityLogEntries, List newEntityLogEntries, ManualRedactions manualRedactions, int analysisNumber) { @@ -42,7 +41,9 @@ public class EntityChangeLogService { boolean hasChanges = false; for (EntityLogEntry entityLogEntry : newEntityLogEntries) { - Optional optionalPreviousEntity = previousEntityLogEntries.stream().filter(entry -> entry.getId().equals(entityLogEntry.getId())).findAny(); + Optional optionalPreviousEntity = previousEntityLogEntries.stream() + .filter(entry -> entry.getId().equals(entityLogEntry.getId())) + .findAny(); if (optionalPreviousEntity.isEmpty()) { hasChanges = true; entityLogEntry.getChanges().add(new Change(analysisNumber, ChangeType.ADDED, now)); @@ -63,15 +64,22 @@ public class EntityChangeLogService { private void addRemovedEntriesAsRemoved(List previousEntityLogEntries, - List newEntityLogEntries, - ManualRedactions manualRedactions, - int analysisNumber, - OffsetDateTime now) { + List newEntityLogEntries, + ManualRedactions manualRedactions, + int analysisNumber, + OffsetDateTime now) { - Set existingIds = newEntityLogEntries.stream().map(EntityLogEntry::getId).collect(Collectors.toSet()); + Set existingIds = newEntityLogEntries.stream() + .map(EntityLogEntry::getId) + .collect(Collectors.toSet()); List removedEntries = previousEntityLogEntries.stream() .filter(entry -> !existingIds.contains(entry.getId())) + .collect(Collectors.toList()); + List removedDossierRedaction = removedEntries.stream() + .filter(e -> e.getState() == EntryState.REMOVED && e.getType().equals("dossier_redaction")) .toList(); + previousEntityLogEntries.removeAll(removedDossierRedaction); + removedEntries.removeAll(removedDossierRedaction); removedEntries.forEach(entry -> entry.getChanges().add(new Change(analysisNumber, ChangeType.REMOVED, now))); removedEntries.forEach(entry -> entry.setState(EntryState.REMOVED)); removedEntries.forEach(entry -> addManualChangeForDictionaryRemovals(entry, manualRedactions)); @@ -85,13 +93,15 @@ public class EntityChangeLogService { return; } - manualRedactions.getIdsToRemove().stream() + manualRedactions.getIdsToRemove() + .stream() .filter(IdRemoval::isRemoveFromDictionary)// .filter(removed -> removed.getAnnotationId().equals(entry.getId()))// .findFirst()// .ifPresent(idRemove -> entry.getManualChanges().add(ManualChangeFactory.toManualChange(idRemove, false))); } + private ChangeType calculateChangeType(EntryState state, EntryState previousState) { if (state.equals(previousState)) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityLogCreatorService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityLogCreatorService.java index 893015ca..458d3c5b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityLogCreatorService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/EntityLogCreatorService.java @@ -125,7 +125,7 @@ public class EntityLogCreatorService { .stream() .filter(entry -> (newEntityIds.contains(entry.getId()) || entry.getContainingNodeId().isEmpty() || sectionsToReanalyseIds.contains(entry.getContainingNodeId() .get(0)))) - .toList(); + .collect(Collectors.toList()); previousEntityLog.getEntityLogEntry().removeAll(previousEntriesFromReAnalyzedSections); boolean hasChanges = entityChangeLogService.computeChanges(previousEntriesFromReAnalyzedSections, diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl index 3d278a3b..54563936 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl @@ -692,13 +692,22 @@ rule "ETC.3.1: Redact logos (vertebrate study)" // Rule unit: ETC.5 -rule "ETC.5.0: Ignore dossier_redaction entries if confidentiality is not 'confidential'" +rule "ETC.5.0: Skip dossier_redaction entries if confidentiality is 'confidential'" + when + FileAttribute(label == "Confidentiality", value == "confidential") + $dossierRedaction: TextEntity(type() == "dossier_redaction") + then + $dossierRedaction.skip("ETC.5.0", "Ignore dossier_redaction when confidential"); + $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + end + +rule "ETC.5.1: Remove dossier_redaction entries if confidentiality is not 'confidential'" when not FileAttribute(label == "Confidentiality", value == "confidential") $dossierRedaction: TextEntity(type() == "dossier_redaction") then - $dossierRedaction.ignore("ETC.5.0", "Ignore dossier redactions, when not confidential"); - $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + $dossierRedaction.remove("ETC.5.1", "Remove dossier_redaction when not confidential"); + retract($dossierRedaction); end diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_redact_manager_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_redact_manager_rules.drl index 5e3663e2..23a1aeb5 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_redact_manager_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_redact_manager_rules.drl @@ -1150,13 +1150,22 @@ rule "ETC.4.2: Redact dossier dictionary entries" // Rule unit: ETC.5 -rule "ETC.5.0: Ignore dossier_redaction entries if confidentiality is not 'confidential'" +rule "ETC.5.0: Skip dossier_redaction entries if confidentiality is 'confidential'" + when + FileAttribute(label == "Confidentiality", value == "confidential") + $dossierRedaction: TextEntity(type() == "dossier_redaction") + then + $dossierRedaction.skip("ETC.5.0", "Ignore dossier_redaction when confidential"); + $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + end + +rule "ETC.5.1: Remove dossier_redaction entries if confidentiality is not 'confidential'" when not FileAttribute(label == "Confidentiality", value == "confidential") $dossierRedaction: TextEntity(type() == "dossier_redaction") then - $dossierRedaction.ignore("ETC.5.0", "Ignore dossier redactions, when not confidential"); - $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + $dossierRedaction.remove("ETC.5.1", "Remove dossier_redaction when not confidential"); + retract($dossierRedaction); end diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl index dd53a53e..00691056 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl @@ -802,13 +802,22 @@ rule "ETC.4.0: Redact dossier dictionary entries" // Rule unit: ETC.5 -rule "ETC.5.0: Ignore dossier_redaction entries if confidentiality is not 'confidential'" +rule "ETC.5.0: Skip dossier_redaction entries if confidentiality is 'confidential'" + when + FileAttribute(label == "Confidentiality", value == "confidential") + $dossierRedaction: TextEntity(type() == "dossier_redaction") + then + $dossierRedaction.skip("ETC.5.0", "Ignore dossier_redaction when confidential"); + $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + end + +rule "ETC.5.1: Remove dossier_redaction entries if confidentiality is not 'confidential'" when not FileAttribute(label == "Confidentiality", value == "confidential") $dossierRedaction: TextEntity(type() == "dossier_redaction") then - $dossierRedaction.ignore("ETC.5.0", "Ignore dossier redactions, when not confidential"); - $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + $dossierRedaction.remove("ETC.5.1", "Remove dossier_redaction when not confidential"); + retract($dossierRedaction); end diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl index 8b28390c..9cc2d93f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl @@ -449,14 +449,22 @@ rule "ETC.3.1: Redact logos (non vertebrate study)" // Rule unit: ETC.5 -rule "ETC.5.0: Ignore dossier_redaction entries if confidentiality is not 'confidential'" +rule "ETC.5.0: Skip dossier_redaction entries if confidentiality is 'confidential'" + when + FileAttribute(label == "Confidentiality", value == "confidential") + $dossierRedaction: TextEntity(type() == "dossier_redaction") + then + $dossierRedaction.skip("ETC.5.0", "Ignore dossier_redaction when confidential"); + $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + end + +rule "ETC.5.1: Remove dossier_redaction entries if confidentiality is not 'confidential'" when not FileAttribute(label == "Confidentiality", value == "confidential") $dossierRedaction: TextEntity(type() == "dossier_redaction") then - $dossierRedaction.ignore("ETC.5.0", "Ignore dossier redactions, when not confidential"); - update($dossierRedaction); - $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + $dossierRedaction.remove("ETC.5.1", "Remove dossier_redaction when not confidential"); + retract($dossierRedaction); end diff --git a/redaction-service-v1/rules-management/src/main/resources/all_redact_manager_rules.drl b/redaction-service-v1/rules-management/src/main/resources/all_redact_manager_rules.drl index ee0481dc..6ae671ec 100644 --- a/redaction-service-v1/rules-management/src/main/resources/all_redact_manager_rules.drl +++ b/redaction-service-v1/rules-management/src/main/resources/all_redact_manager_rules.drl @@ -1159,13 +1159,22 @@ rule "ETC.4.2: Redact dossier dictionary entries" // Rule unit: ETC.5 -rule "ETC.5.0: Ignore dossier_redaction entries if confidentiality is not 'confidential'" +rule "ETC.5.0: Skip dossier_redaction entries if confidentiality is 'confidential'" + when + FileAttribute(label == "Confidentiality", value == "confidential") + $dossierRedaction: TextEntity(type() == "dossier_redaction") + then + $dossierRedaction.skip("ETC.5.0", "Ignore dossier_redaction when confidential"); + $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + end + +rule "ETC.5.1: Remove dossier_redaction entries if confidentiality is not 'confidential'" when not FileAttribute(label == "Confidentiality", value == "confidential") $dossierRedaction: TextEntity(type() == "dossier_redaction") then - $dossierRedaction.ignore("ETC.5.0", "Ignore dossier redactions, when not confidential"); - $dossierRedaction.getIntersectingNodes().forEach(node -> update(node)); + $dossierRedaction.remove("ETC.5.1", "Remove dossier_redaction when not confidential"); + retract($dossierRedaction); end