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 2d50d3f6..e61f2ccd 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 @@ -56,35 +56,12 @@ public class EntityChangeLogService { ChangeType changeType = calculateChangeType(entityLogEntry.getState(), previousEntity.getState()); entityLogEntry.getChanges().add(new Change(analysisNumber, changeType, now)); } - - addManualChanges(entityLogEntry, previousEntity); } addRemovedEntriesAsRemoved(previousEntityLogEntries, newEntityLogEntries, manualRedactions, analysisNumber, now); return hasChanges; } - // If a manual change is present in the previous entity but not in the new entity, add it to the new one and - // sort them, so they are displayed in the correct order. - private void addManualChanges(EntityLogEntry entityLogEntry, EntityLogEntry previousEntity) { - - Comparator manualChangeComparator = - Comparator.comparing(ManualChange::getManualRedactionType) - .thenComparing(ManualChange::getRequestedDate); - - previousEntity.getManualChanges().forEach(manualChange -> { - boolean contains = entityLogEntry.getManualChanges() - .stream() - .anyMatch(existingChange -> manualChangeComparator.compare(existingChange, manualChange) == 0); - - if (!contains) { - entityLogEntry.getManualChanges().add(manualChange); - entityLogEntry.getManualChanges().sort(Comparator.comparing(ManualChange::getRequestedDate)); - } - }); - } - - private void addRemovedEntriesAsRemoved(List previousEntityLogEntries, List newEntityLogEntries, ManualRedactions manualRedactions, @@ -94,7 +71,10 @@ public class EntityChangeLogService { Set existingIds = newEntityLogEntries.stream().map(EntityLogEntry::getId).collect(Collectors.toSet()); List removedEntries = previousEntityLogEntries.stream() .filter(entry -> !existingIds.contains(entry.getId())) - .toList(); + .collect(Collectors.toList()); + var 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)); 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 c77f7a32..844ad6c6 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 @@ -123,7 +123,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 ff854a43..79bfd519 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 @@ -690,13 +690,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 b1fbf077..11c4f729 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 @@ -1148,13 +1148,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 aed445b2..0418db92 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 @@ -800,13 +800,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 57124c27..9b8b529e 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 @@ -1157,13 +1157,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