From 5b2877ea3cdd228a300dea25fd47fe59cd8a608a Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Mon, 11 Sep 2023 11:47:07 +0200 Subject: [PATCH] DM-285: Entity to component mappings with new ruleset * refactoring structure * added custom syntax validation, such that rule files may not be corrupted * added component drools preparations * deprecated redactionLog * integrated entityLog * integrated new getRules with ruleFileType * renamed service.graph package -> service.document * fixed tests * update layout parser version * initial component drools file - wip * disabled some tests due to OOM Error Signed-off-by: Kilian Schuettler --- .../redaction/v1/model/RuleFileType.java | 7 -- .../{Rules.java => RuleValidationModel.java} | 5 +- .../v1/resources/RedactionResource.java | 4 +- .../controller/RedactionController.java | 4 +- .../document/ComponentCreationService.java | 20 ++--- .../drools/DroolsSyntaxValidationService.java | 21 ++--- .../resources/drools/base_component_rules.drl | 76 ++++-------------- .../src/main/resources/drools/base_rules.drl | 5 +- .../redaction/v1/server/RulesTest.java | 79 ++++++++----------- .../DroolsSyntaxValidationServiceTest.java | 22 +++--- .../src/test/resources/drools/all_rules.drl | 30 ++++--- .../drools/documine_flora_components.drl | 73 +++++++++-------- 12 files changed, 139 insertions(+), 207 deletions(-) delete mode 100644 redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/RuleFileType.java rename redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/{Rules.java => RuleValidationModel.java} (77%) diff --git a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/RuleFileType.java b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/RuleFileType.java deleted file mode 100644 index d47785bf..00000000 --- a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/RuleFileType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iqser.red.service.redaction.v1.model; - -public enum RuleFileType { - - ENTITY, - COMPONENT -} diff --git a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/Rules.java b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/RuleValidationModel.java similarity index 77% rename from redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/Rules.java rename to redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/RuleValidationModel.java index 11fd5ee9..6bdf1418 100644 --- a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/Rules.java +++ b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/RuleValidationModel.java @@ -7,9 +7,8 @@ import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor -public class Rules { +public class RuleValidationModel { - RuleFileType ruleFileType; + String ruleFileType; String rulesString; - } diff --git a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/resources/RedactionResource.java b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/resources/RedactionResource.java index c2cc1409..18620d3a 100644 --- a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/resources/RedactionResource.java +++ b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/resources/RedactionResource.java @@ -5,11 +5,11 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; -import com.iqser.red.service.redaction.v1.model.Rules; +import com.iqser.red.service.redaction.v1.model.RuleValidationModel; public interface RedactionResource { @PostMapping(value = "/rules/test", consumes = MediaType.APPLICATION_JSON_VALUE) - DroolsSyntaxValidation testRules(@RequestBody Rules rules); + DroolsSyntaxValidation testRules(@RequestBody RuleValidationModel rules); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RedactionController.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RedactionController.java index e268eca8..da275d26 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RedactionController.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RedactionController.java @@ -4,7 +4,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; -import com.iqser.red.service.redaction.v1.model.Rules; +import com.iqser.red.service.redaction.v1.model.RuleValidationModel; import com.iqser.red.service.redaction.v1.resources.RedactionResource; import com.iqser.red.service.redaction.v1.server.service.drools.DroolsSyntaxValidationService; import com.iqser.red.service.redaction.v1.server.utils.exception.RulesValidationException; @@ -21,7 +21,7 @@ public class RedactionController implements RedactionResource { @Override - public DroolsSyntaxValidation testRules(@RequestBody Rules rules) { + public DroolsSyntaxValidation testRules(@RequestBody RuleValidationModel rules) { try { return droolsSyntaxValidationService.testRules(rules); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/ComponentCreationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/ComponentCreationService.java index 56efb290..dd948fc7 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/ComponentCreationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/document/ComponentCreationService.java @@ -31,7 +31,7 @@ public class ComponentCreationService { String transformation = String.format("First found value or else '%s'", fallback); String value = entities.stream().min(EntityComparators.start()).map(Entity::getValue).orElse(fallback); - createComponent(ruleIdentifier, category, value, transformation, entities); + create(ruleIdentifier, category, value, transformation, entities); } @@ -45,7 +45,7 @@ public class ComponentCreationService { String transformation = String.format("Joining all values with '%s'", delimiter); String value = entities.stream().sorted(EntityComparators.start()).map(Entity::getValue).collect(Collectors.joining(delimiter)); - createComponent(ruleIdentifier, category, value, transformation, entities); + create(ruleIdentifier, category, value, transformation, entities); } @@ -59,7 +59,7 @@ public class ComponentCreationService { String transformation = String.format("Joining all values with '%s'", delimiter); String value = entities.stream().sorted(EntityComparators.start()).map(Entity::getValue).distinct().collect(Collectors.joining(delimiter)); - createComponent(ruleIdentifier, category, value, transformation, entities); + create(ruleIdentifier, category, value, transformation, entities); } @@ -73,17 +73,17 @@ public class ComponentCreationService { String transformation = "Convert values of type to dd/MM/yyyy joined with ', '"; String date = entities.stream().map(Entity::getValue).map(value -> DateConverter.convertDate(value, resultFormat)).collect(Collectors.joining(", ")); - createComponent(ruleIdentifier, category, date, transformation, entities); + create(ruleIdentifier, category, date, transformation, entities); } public void createComponentsForUnMappedEntities(String ruleIdentifier, Collection entities) { - entities.forEach(entity -> createComponent(ruleIdentifier, entity.getType(), entity.getValue(), "Unmapped Entity", List.of(entity))); + entities.forEach(entity -> create(ruleIdentifier, entity.getType(), entity.getValue(), "Unmapped Entity", List.of(entity))); } - public void createComponent(String ruleIdentifier, String category, String value, String transformation, Collection references) { + public void create(String ruleIdentifier, String category, String value, String transformation, Collection references) { referencedEntities.addAll(references); @@ -96,7 +96,7 @@ public class ComponentCreationService { } - public void createComponent(String ruleIdentifier, String category, String value, String transformation, Entity reference) { + public void create(String ruleIdentifier, String category, String value, String transformation, Entity reference) { referencedEntities.add(reference); List referenceList = new LinkedList<>(); @@ -111,13 +111,13 @@ public class ComponentCreationService { } - public void createComponent(String ruleIdentifier, String category, String value, String transformation) { + public void create(String ruleIdentifier, String category, String value, String transformation) { - createComponent(ruleIdentifier, category, value, transformation, Collections.emptyList()); + create(ruleIdentifier, category, value, transformation, Collections.emptyList()); } - public void createComponent(String ruleIdentifier, String category, String value) { + public void create(String ruleIdentifier, String category, String value) { kieSession.insert(Component.builder() .matchedRule(RuleIdentifier.fromString(ruleIdentifier)) diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/DroolsSyntaxValidationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/DroolsSyntaxValidationService.java index 53d6f0de..902c9c04 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/DroolsSyntaxValidationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/DroolsSyntaxValidationService.java @@ -7,10 +7,10 @@ import org.kie.api.builder.KieBuilder; import org.kie.api.builder.Message; import org.springframework.stereotype.Service; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; import com.iqser.red.service.redaction.v1.model.DroolsSyntaxErrorMessage; import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; -import com.iqser.red.service.redaction.v1.model.RuleFileType; -import com.iqser.red.service.redaction.v1.model.Rules; +import com.iqser.red.service.redaction.v1.model.RuleValidationModel; import com.iqser.red.service.redaction.v1.server.model.drools.BasicRule; import com.iqser.red.service.redaction.v1.server.model.drools.RuleFileBluePrint; import com.iqser.red.service.redaction.v1.server.storage.RuleManagementResources; @@ -26,9 +26,9 @@ public class DroolsSyntaxValidationService { @SneakyThrows - public DroolsSyntaxValidation testRules(Rules rules) { + public DroolsSyntaxValidation testRules(RuleValidationModel rules) { - DroolsSyntaxValidation customDroolsSyntaxValidation = buildCustomDroolsSyntaxValidation(rules.getRulesString(), rules.getRuleFileType()); + DroolsSyntaxValidation customDroolsSyntaxValidation = buildCustomDroolsSyntaxValidation(rules.getRulesString(), RuleFileType.valueOf(rules.getRuleFileType())); DroolsSyntaxValidation droolsCompilerSyntaxValidation = buildDroolsCompilerSyntaxValidation(rules); droolsCompilerSyntaxValidation.getDroolsSyntaxErrorMessages().addAll(customDroolsSyntaxValidation.getDroolsSyntaxErrorMessages()); return droolsCompilerSyntaxValidation; @@ -89,26 +89,17 @@ public class DroolsSyntaxValidationService { } - private DroolsSyntaxValidation buildDroolsCompilerSyntaxValidation(Rules rules) { + private DroolsSyntaxValidation buildDroolsCompilerSyntaxValidation(RuleValidationModel rules) { var versionId = System.currentTimeMillis(); var testRules = "test-rules"; KieBuilder kieBuilder = kieContainerCreationService.registerNewKieContainerVersion(testRules, versionId, - rules.getRulesString(), - toPersistenceRuleFileType(rules.getRuleFileType())); + rules.getRulesString(), RuleFileType.valueOf(rules.getRuleFileType())); return buildDroolsCompilerSyntaxValidation(kieBuilder); } - private com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType toPersistenceRuleFileType(RuleFileType ruleFileType) { - - return switch (ruleFileType) { - case ENTITY -> com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType.ENTITY; - case COMPONENT -> com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType.COMPONENT; - }; - } - private DroolsSyntaxValidation buildDroolsCompilerSyntaxValidation(KieBuilder kieBuilder) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/resources/drools/base_component_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/main/resources/drools/base_component_rules.drl index 6cd84052..d55381be 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/resources/drools/base_component_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/main/resources/drools/base_component_rules.drl @@ -12,55 +12,23 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.model.document.*; -import com.iqser.red.service.redaction.v1.server.model.document.TextRange; -import com.iqser.red.service.redaction.v1.server.model.document.entity.*; -import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule; -import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity -import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule -import com.iqser.red.service.redaction.v1.server.model.document.nodes.*; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.Document; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.Image; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.ImageType; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.Page; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.Headline; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.SectionIdentifier; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.Footer; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.Header; -import com.iqser.red.service.redaction.v1.server.model.document.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.model.document.textblock.*; -import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlockCollector; -import com.iqser.red.service.redaction.v1.server.model.document.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.model.document.textblock.ConcatenatedTextBlock; -import com.iqser.red.service.redaction.v1.server.model.NerEntities; -import com.iqser.red.service.redaction.v1.server.model.dictionary.Dictionary; -import com.iqser.red.service.redaction.v1.server.model.dictionary.DictionaryModel; -import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.service.ManualChangesApplicationService; -import com.iqser.red.service.redaction.v1.server.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.model.component.Component; +import com.iqser.red.service.redaction.v1.server.model.component.Entity; +import com.iqser.red.service.redaction.v1.server.service.document.ComponentCreationService; + +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.Engine; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; -import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Engine; -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.IdRemoval; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; -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.ManualLegalBasisChange; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -global Document document -global EntityCreationService entityCreationService -global ManualChangesApplicationService manualChangesApplicationService -global Dictionary dictionary + +global ComponentCreationService componentCreationService /** -This file contains all the rules that are in the templates. -The Imports from this file are all that are possible and will be imported for all entity files. +The imports, globals, queries and rules from this file are required for any component rule file. Since customers may edit their rules we need to ensure they can't change the imports to prevent malicious code execution! */ @@ -70,20 +38,6 @@ query "getFileAttributes" $fileAttribute: FileAttribute() end -//------------------------------------ Local dictionary search rules ------------------------------------ - -// Rule unit: LocalDictionarySearch.0 -rule "LDS.0.0: run local dictionary search" - agenda-group "LOCAL_DICTIONARY_ADDS" - salience -999 - when - $dictionaryModel: DictionaryModel(!localEntriesWithMatchedRules.isEmpty()) from dictionary.getDictionaryModels() - then - entityCreationService.bySearchImplementation($dictionaryModel.getLocalSearch(), $dictionaryModel.getType(), EntityType.RECOMMENDATION, document) - .forEach(entity -> { - Collection matchedRules = $dictionaryModel.getLocalEntriesWithMatchedRules().get(entity.getValue()); - entity.addMatchedRules(matchedRules); - }); +query "getComponents" + $component: Component() end - -// Everything above this comment will be prepended to any entity rule file before execution. diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/resources/drools/base_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/main/resources/drools/base_rules.drl index 216fc2b4..17205da4 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/resources/drools/base_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/main/resources/drools/base_rules.drl @@ -60,8 +60,7 @@ global ManualChangesApplicationService manualChangesApplicationService global Dictionary dictionary /** -This file contains all the rules that are in the templates. -The Imports from this file are all that are possible and will be imported for all entity files. +The imports, globals, queries and rules from this file are required for any entity rule file. Since customers may edit their rules we need to ensure they can't change the imports to prevent malicious code execution! */ @@ -86,5 +85,3 @@ rule "LDS.0.0: run local dictionary search" entity.addMatchedRules(matchedRules); }); end - -// Everything above this comment will be prepended to any entity rule file before execution. diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java index e5faedf0..246ba8d3 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java @@ -61,18 +61,20 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.iqser.red.service.dictionarymerge.commons.DictionaryEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; +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.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.EntityLogLegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; 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.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.Rectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogComment; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogLegalBasis; import com.iqser.red.service.redaction.v1.server.client.DictionaryClient; import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; import com.iqser.red.service.redaction.v1.server.client.RulesClient; @@ -95,8 +97,6 @@ import com.knecon.fforesight.tenantcommons.TenantsClient; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -@Disabled - @Slf4j @ExtendWith(SpringExtension.class) @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -431,24 +431,23 @@ public class RulesTest { analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER); analyzeService.analyze(request); - RedactionLog redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); + EntityLog entityLog = redactionStorageService.getEntityLog(TEST_DOSSIER_ID, TEST_FILE_ID); // All timestamps are ignored, because they are for sure different - assertThat(redactionLog.getAnalysisVersion()).isEqualTo(savedRedactionLog.getAnalysisVersion()); - assertThat(redactionLog.getAnalysisNumber()).isEqualTo(savedRedactionLog.getAnalysisNumber()); - assertThat(redactionLog.getDictionaryVersion()).isEqualTo(savedRedactionLog.getDictionaryVersion()); - assertThat(redactionLog.getDossierDictionaryVersion()).isEqualTo(savedRedactionLog.getDossierDictionaryVersion()); - assertThat(redactionLog.getRulesVersion()).isEqualTo(savedRedactionLog.getRulesVersion()); - assertThat(redactionLog.getLegalBasisVersion()).isEqualTo(savedRedactionLog.getLegalBasisVersion()); + assertThat(entityLog.getAnalysisVersion()).isEqualTo(savedRedactionLog.getAnalysisVersion()); + assertThat(entityLog.getAnalysisNumber()).isEqualTo(savedRedactionLog.getAnalysisNumber()); + assertThat(entityLog.getDictionaryVersion()).isEqualTo(savedRedactionLog.getDictionaryVersion()); + assertThat(entityLog.getDossierDictionaryVersion()).isEqualTo(savedRedactionLog.getDossierDictionaryVersion()); + assertThat(entityLog.getRulesVersion()).isEqualTo(savedRedactionLog.getRulesVersion()); + assertThat(entityLog.getLegalBasisVersion()).isEqualTo(savedRedactionLog.getLegalBasisVersion()); - assertThat(redactionLog.getRedactionLogEntry() - .stream() - .filter(r -> !r.isFalsePositive()) + assertThat(entityLog.getEntityLogEntry() + .stream().filter(r -> !r.getEntryType().equals(EntryType.FALSE_POSITIVE)).filter(r -> !r.getEntryType().equals(EntryType.FALSE_RECOMMENDATION)) .collect(Collectors.toSet()) .size()).isEqualTo(savedRedactionLog.getRedactionLogEntry().stream().filter(r -> !r.isFalsePositive()).collect(Collectors.toSet()).size()); - assertThat(redactionLog.getLegalBasis().size()).isEqualTo(savedRedactionLog.getLegalBasis().size()); + assertThat(entityLog.getLegalBasis().size()).isEqualTo(savedRedactionLog.getLegalBasis().size()); - for (RedactionLogLegalBasis redactionLegalBasis : redactionLog.getLegalBasis()) { + for (EntityLogLegalBasis redactionLegalBasis : entityLog.getLegalBasis()) { var savedRedactionLegalBasis = savedRedactionLog.getLegalBasis() .stream() .filter(lb -> lb.getName().equalsIgnoreCase(redactionLegalBasis.getName())) @@ -458,7 +457,7 @@ public class RulesTest { assertThat(savedRedactionLegalBasis).isPresent(); } - for (RedactionLogEntry redactionLogEntry : redactionLog.getRedactionLogEntry()) { + for (EntityLogEntry redactionLogEntry : entityLog.getEntityLogEntry()) { var savedRedactionLogEntry = savedRedactionLog.getRedactionLogEntry().stream().filter(r -> r.getId().equalsIgnoreCase(redactionLogEntry.getId())).findFirst(); assertThat(savedRedactionLogEntry).isPresent(); assertThat(savedRedactionLogEntry.get().getId()).isEqualTo(redactionLogEntry.getId()); @@ -469,10 +468,10 @@ public class RulesTest { assertThat(savedRedactionLogEntry.get().isRectangle()).isEqualTo(redactionLogEntry.isRectangle()); assertThat(savedRedactionLogEntry.get().getLegalBasis()).isEqualTo(redactionLogEntry.getLegalBasis()); assertThat(savedRedactionLogEntry.get().isImported()).isEqualTo(redactionLogEntry.isImported()); - assertThat(savedRedactionLogEntry.get().isRedacted()).isEqualTo(redactionLogEntry.isRedacted()); - assertThat(savedRedactionLogEntry.get().isHint()).isEqualTo(redactionLogEntry.isHint()); - assertThat(savedRedactionLogEntry.get().isRecommendation()).isEqualTo(redactionLogEntry.isRecommendation()); - assertThat(savedRedactionLogEntry.get().isFalsePositive()).isEqualTo(redactionLogEntry.isFalsePositive()); + assertThat(savedRedactionLogEntry.get().isRedacted()).isEqualTo(redactionLogEntry.getState().equals(EntryState.APPLIED)); + assertThat(savedRedactionLogEntry.get().isHint()).isEqualTo(redactionLogEntry.getEntryType().equals(EntryType.HINT)); + assertThat(savedRedactionLogEntry.get().isRecommendation()).isEqualTo(redactionLogEntry.getEntryType().equals(EntryType.RECOMMENDATION)); + assertThat(savedRedactionLogEntry.get().isFalsePositive()).isEqualTo(redactionLogEntry.getEntryType().equals(EntryType.FALSE_POSITIVE)); assertThat(savedRedactionLogEntry.get().getSection()).isEqualTo(redactionLogEntry.getSection()); assertThat(savedRedactionLogEntry.get().getColor()).isEqualTo(redactionLogEntry.getColor()); assertThat(savedRedactionLogEntry.get().getSectionNumber()).isEqualTo(redactionLogEntry.getSectionNumber()); @@ -480,43 +479,31 @@ public class RulesTest { assertThat(savedRedactionLogEntry.get().getTextAfter()).isEqualTo(redactionLogEntry.getTextAfter()); assertThat(savedRedactionLogEntry.get().getStartOffset()).isEqualTo(redactionLogEntry.getStartOffset()); assertThat(savedRedactionLogEntry.get().getEndOffset()).isEqualTo(redactionLogEntry.getEndOffset()); - assertThat(savedRedactionLogEntry.get().isImage()).isEqualTo(redactionLogEntry.isImage()); + assertThat(savedRedactionLogEntry.get().isImage()).isEqualTo(redactionLogEntry.getEntryType().equals(EntryType.IMAGE)); assertThat(savedRedactionLogEntry.get().isImageHasTransparency()).isEqualTo(redactionLogEntry.isImageHasTransparency()); assertThat(savedRedactionLogEntry.get().isDictionaryEntry()).isEqualTo(redactionLogEntry.isDictionaryEntry()); assertThat(savedRedactionLogEntry.get().isDossierDictionaryEntry()).isEqualTo(redactionLogEntry.isDossierDictionaryEntry()); assertThat(savedRedactionLogEntry.get().isExcluded()).isEqualTo(redactionLogEntry.isExcluded()); assertThat(savedRedactionLogEntry.get().getSourceId()).isEqualTo(redactionLogEntry.getSourceId()); - for (Rectangle rectangle : redactionLogEntry.getPositions()) { + for (Position position : redactionLogEntry.getPositions()) { var savedRectangle = savedRedactionLogEntry.get() .getPositions() .stream() - .filter(r -> r.getPage() == rectangle.getPage()) - .filter(r -> r.getTopLeft().getX() == rectangle.getTopLeft().getX()) - .filter(r -> r.getTopLeft().getY() == rectangle.getTopLeft().getY()) - .filter(r -> r.getHeight() == rectangle.getHeight()) - .filter(r -> r.getWidth() == rectangle.getWidth()) + .filter(r -> r.getPage() == position.getPageNumber()) + .filter(r -> r.getTopLeft().getX() == position.getRectangle()[0]) + .filter(r -> r.getTopLeft().getY() == position.getRectangle()[1]) + .filter(r -> r.getHeight() == position.getRectangle()[3]) + .filter(r -> r.getWidth() == position.getRectangle()[2]) .findFirst(); assertThat(savedRectangle).isPresent(); } - for (RedactionLogComment comment : redactionLogEntry.getComments()) { - var savedComment = savedRedactionLogEntry.get().getComments().stream().filter(c -> c.getId() == comment.getId()).findFirst(); - assertThat(savedComment).isPresent(); - assertThat(savedComment.get().getId()).isEqualTo(comment.getId()); - assertThat(savedComment.get().getUser()).isEqualTo(comment.getUser()); - assertThat(savedComment.get().getText()).isEqualTo(comment.getText()); - assertThat(savedComment.get().getAnnotationId()).isEqualTo(comment.getAnnotationId()); - assertThat(savedComment.get().getFileId()).isEqualTo(comment.getFileId()); - - } - for (Change change : redactionLogEntry.getChanges()) { var savedChange = savedRedactionLogEntry.get() .getChanges() .stream() - .filter(c -> c.getAnalysisNumber() == change.getAnalysisNumber()) - .filter(c -> c.getType() == change.getType()) + .filter(c -> c.getAnalysisNumber() == change.getAnalysisNumber()).filter(c -> c.getType().name().equals(change.getType().name())) .findFirst(); assertThat(savedChange).isPresent(); } @@ -526,7 +513,7 @@ public class RulesTest { .getManualChanges() .stream() .filter(m -> m.getAnnotationStatus() == manualChange.getAnnotationStatus()) - .filter(m -> m.getManualRedactionType() == manualChange.getManualRedactionType()) + .filter(m -> m.getManualRedactionType().name().equals(manualChange.getManualRedactionType().name())) .filter(m -> m.getUserId().equalsIgnoreCase(manualChange.getUserId())) .filter(m -> m.getPropertyChanges() == manualChange.getPropertyChanges()) .findFirst(); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/drools/files/management/services/DroolsSyntaxValidationServiceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/drools/files/management/services/DroolsSyntaxValidationServiceTest.java index fa0321f7..4ce2977f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/drools/files/management/services/DroolsSyntaxValidationServiceTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/drools/files/management/services/DroolsSyntaxValidationServiceTest.java @@ -14,9 +14,9 @@ import org.mockito.MockitoAnnotations; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.ClassPathResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; -import com.iqser.red.service.redaction.v1.model.RuleFileType; -import com.iqser.red.service.redaction.v1.model.Rules; +import com.iqser.red.service.redaction.v1.model.RuleValidationModel; import com.iqser.red.service.redaction.v1.server.client.RulesClient; import com.iqser.red.service.redaction.v1.server.model.drools.RuleFileBluePrint; import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService; @@ -51,7 +51,7 @@ class DroolsSyntaxValidationServiceTest { String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new Rules(RuleFileType.ENTITY, rulesString)); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -66,7 +66,7 @@ class DroolsSyntaxValidationServiceTest { String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new Rules(RuleFileType.ENTITY, rulesString)); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -81,7 +81,7 @@ class DroolsSyntaxValidationServiceTest { String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new Rules(RuleFileType.ENTITY, rulesString)); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -96,7 +96,7 @@ class DroolsSyntaxValidationServiceTest { String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new Rules(RuleFileType.ENTITY, rulesString)); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -111,7 +111,7 @@ class DroolsSyntaxValidationServiceTest { String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new Rules(RuleFileType.ENTITY, rulesString)); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -126,7 +126,7 @@ class DroolsSyntaxValidationServiceTest { String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new Rules(RuleFileType.ENTITY, rulesString)); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -142,7 +142,7 @@ class DroolsSyntaxValidationServiceTest { String rulesString = new String(rulesFile.getInputStream().readAllBytes()); String corruptedRules = rulesString.replaceAll(";", ""); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new Rules(RuleFileType.ENTITY, corruptedRules)); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), corruptedRules)); assertFalse(droolsSyntaxValidation.isCompiled()); } @@ -157,7 +157,7 @@ class DroolsSyntaxValidationServiceTest { String rulesString = new String(rulesFile.getInputStream().readAllBytes()); String corruptedRules = rulesString.replaceAll("import com.iqser.red.service.redaction.v1.server.model.document.nodes.ImageType;", ""); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new Rules(RuleFileType.ENTITY, corruptedRules)); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), corruptedRules)); assertFalse(droolsSyntaxValidation.isCompiled()); } @@ -178,7 +178,7 @@ class DroolsSyntaxValidationServiceTest { for (String ruleFile : ruleFiles) { var rulesFile = new ClassPathResource(ruleFile); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new Rules(RuleFileType.ENTITY, rulesString)); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); if (droolsSyntaxValidation.isCompiled()) { continue; } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl index 1c51a6a5..bb03c61c 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl @@ -1247,20 +1247,31 @@ rule "MAN.2.1: Apply force redaction to images" rule "MAN.3.0: Apply entity recategorization" salience 128 when - $recategorization: ManualRecategorization($id: annotationId, status == AnnotationStatus.APPROVED, $requestDate: requestDate) + $recategorization: ManualRecategorization($id: annotationId, $type: type, status == AnnotationStatus.APPROVED, $requestDate: requestDate) not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate)) - $entityToBeRecategorized: TextEntity(matchesAnnotationId($id)) + $entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type != $type) then - if (!$recategorization.getType().equals($entityToBeRecategorized.getType())) { - $entityToBeRecategorized.getIntersectingNodes().forEach(node -> update(node)); - manualChangesApplicationService.recategorize($entityToBeRecategorized, $recategorization); - // Entity is copied and inserted, so the old entity needs to be retracted to avoid duplication. - retract($entityToBeRecategorized); - } + $entityToBeRecategorized.getIntersectingNodes().forEach(node -> update(node)); + manualChangesApplicationService.recategorize($entityToBeRecategorized, $recategorization); + retract($recategorization); + // Entity is copied and inserted, so the old entity needs to be retracted to avoid duplication. + retract($entityToBeRecategorized); + end + + +rule "MAN.3.1: Apply entity recategorization of same type" + salience 128 + when + $recategorization: ManualRecategorization($id: annotationId, $type: type, status == AnnotationStatus.APPROVED, $requestDate: requestDate) + not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate)) + $entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type == $type) + then + $entityToBeRecategorized.getManualOverwrite().addChange($recategorization); retract($recategorization); end -rule "MAN.3.1: Apply image recategorization" + +rule "MAN.3.2: Apply image recategorization" salience 128 when $recategorization: ManualRecategorization($id: annotationId, status == AnnotationStatus.APPROVED, $requestDate: requestDate) @@ -1273,6 +1284,7 @@ rule "MAN.3.1: Apply image recategorization" retract($recategorization); end + // Rule unit: MAN.4 rule "MAN.4.0: Apply legal basis change" salience 128 diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora_components.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora_components.drl index a2470366..8c6a7563 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora_components.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora_components.drl @@ -23,7 +23,6 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; - import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; global ComponentCreationService componentCreationService @@ -56,7 +55,7 @@ rule "PerformingLaboratory.0.0: Performing Laboratory" not Entity(type == "laboratory_country", Math.abs($laboratoryName.startOffset - startOffset) < $distance) eval($distance < 80) then - componentCreationService.createComponent("PerformingLaboratory.0.0", "Performing_Laboratory", $laboratoryName.getValue() + ", " + $laboratoryCountry.getValue(), "Laboratory name and country found!"); + componentCreationService.create("PerformingLaboratory.0.0", "Performing_Laboratory", $laboratoryName.getValue() + ", " + $laboratoryCountry.getValue(), "Laboratory name and country found!"); end rule "PerformingLaboratory.0.1: Performing Laboratory" @@ -64,7 +63,7 @@ rule "PerformingLaboratory.0.1: Performing Laboratory" $laboratoryName: Entity(type == "laboratory_name") not Entity(type == "laboratory_country", Math.abs($laboratoryName.startOffset - startOffset) < 80) then - componentCreationService.createComponent("DefaultComponents.0.1", "Performing_Laboratory", $laboratoryName.getValue(), "Only laboratory name found!"); + componentCreationService.create("DefaultComponents.0.1", "Performing_Laboratory", $laboratoryName.getValue(), "Only laboratory name found!"); end rule "PerformingLaboratory.0.2: Performing Laboratory" @@ -72,7 +71,7 @@ rule "PerformingLaboratory.0.2: Performing Laboratory" when not Component(category == "Performing_Laboratory") then - componentCreationService.createComponent("PerformingLaboratory.0.2", "Performing_Laboratory", "n-a", "fallback"); + componentCreationService.create("PerformingLaboratory.0.2", "Performing_Laboratory", "n-a", "fallback"); end @@ -88,14 +87,14 @@ rule "GLPStudy.0.0: GLP Study" when $glpStudy: Entity(type() == "glp_study") then - componentCreationService.createComponent("GLPStudy.0.0", "GLP_study", "Yes", "Yes if present, No if not", $glpStudy); + componentCreationService.create("GLPStudy.0.0", "GLP_study", "Yes", "Yes if present, No if not", $glpStudy); end rule "GLPStudy.1.0: GLP Study" when not Entity(type() == "glp_study") then - componentCreationService.createComponent("GLPStudy.1.0", "GLP_study", "No", "Yes if present, No if not"); + componentCreationService.create("GLPStudy.1.0", "GLP_study", "No", "Yes if present, No if not"); end rule "GLPStudy.2.0: GLP Study" @@ -113,7 +112,7 @@ rule "DefaultComponents.4.0: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number") not Entity(type == "oecd_guideline_year") then - componentCreationService.createComponent("DefaultComponents.4.0", "Test_Guidelines_1", $guidelineNumber.getValue(), "Only OECD Number found!"); + componentCreationService.create("DefaultComponents.4.0", "Test_Guidelines_1", $guidelineNumber.getValue(), "Only OECD Number found!"); end rule "DefaultComponents.4.1: Test Guideline 1" @@ -121,7 +120,7 @@ rule "DefaultComponents.4.1: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2015") $guidelineYear: Entity(type == "oecd_guideline_year", value == "404") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.1", "Test_Guidelines_1", "Nº 404: Acute Dermal Irritation/Corrosion (28/07/2015)", @@ -134,7 +133,7 @@ rule "DefaultComponents.4.2: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "1981") $guidelineYear: Entity(type == "oecd_guideline_year", value == "403") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.2", "Test_Guidelines_1", "Nº 403: Acute Inhalation Toxicity (12/05/1981)", @@ -147,7 +146,7 @@ rule "DefaultComponents.4.3: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2018") $guidelineYear: Entity(type == "oecd_guideline_year", value == "442B") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.3", "Test_Guidelines_1", "Nº 442B: Skin Sensitization (27/06/2018)", @@ -160,7 +159,7 @@ rule "DefaultComponents.4.4: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2016") $guidelineYear: Entity(type == "oecd_guideline_year", value == "487") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.4", "Test_Guidelines_1", "Nº 487: Micronucleus Human Lymphocytes (2016)", @@ -173,7 +172,7 @@ rule "DefaultComponents.4.5: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2004") $guidelineYear: Entity(type == "oecd_guideline_year", value == "428") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.5", "Test_Guidelines_1", "Nº 428: Split-Thickness Skin test (2004)", @@ -186,7 +185,7 @@ rule "DefaultComponents.4.6: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2018") $guidelineYear: Entity(type == "oecd_guideline_year", value == "442A") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.6", "Test_Guidelines_1", "Nº 442A: Skin Sensitization (23/07/2018)", @@ -199,7 +198,7 @@ rule "DefaultComponents.4.7: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2002") $guidelineYear: Entity(type == "oecd_guideline_year", value == "404") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.7", "Test_Guidelines_1", "Nº 404: Acute Dermal Irritation/Corrosion (24/04/2002)", @@ -212,7 +211,7 @@ rule "DefaultComponents.4.8: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "1992") $guidelineYear: Entity(type == "oecd_guideline_year", value == "406") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.8", "Test_Guidelines_1", "Nº 406: Skin Sensitisation (1992)", @@ -225,7 +224,7 @@ rule "DefaultComponents.4.9: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2018") $guidelineYear: Entity(type == "oecd_guideline_year", value == "438") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.9", "Test_Guidelines_1", "Nº 438: Eye Irritation (26/06/2018)", @@ -238,7 +237,7 @@ rule "DefaultComponents.4.10: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2009") $guidelineYear: Entity(type == "oecd_guideline_year", value == "436") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.10", "Test_Guidelines_1", "Nº 436: Acute Inhalation Toxicity – Acute Toxic Class Method (08/09/2009)", @@ -251,7 +250,7 @@ rule "DefaultComponents.4.11: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2002") $guidelineYear: Entity(type == "oecd_guideline_year", value == "429") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.11", "Test_Guidelines_1", "Nº 429: Skin Sensitisation: Local Lymph Node Assay (24/04/2002)", @@ -264,7 +263,7 @@ rule "DefaultComponents.4.12: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2020") $guidelineYear: Entity(type == "oecd_guideline_year", value == "471") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.12", "Test_Guidelines_1", "Nº 471: Bacterial Reverse Mutation Test (26/06/2020)", @@ -277,7 +276,7 @@ rule "DefaultComponents.4.13: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "1987") $guidelineYear: Entity(type == "oecd_guideline_year", value == "405") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.13", "Test_Guidelines_1", "Nº 405: Acute Eye Irritation/Corrosion (24/02/1987)", @@ -290,7 +289,7 @@ rule "DefaultComponents.4.14: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "1997") $guidelineYear: Entity(type == "oecd_guideline_year", value == "471") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.14", "Test_Guidelines_1", "Nº 471: Bacterial Reverse Mutation Test (21/07/1997)", @@ -303,7 +302,7 @@ rule "DefaultComponents.4.15: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2009") $guidelineYear: Entity(type == "oecd_guideline_year", value == "403") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.15", "Test_Guidelines_1", "Nº 403: Acute Inhalation Toxicity (08/09/2009)", @@ -316,7 +315,7 @@ rule "DefaultComponents.4.16: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2018") $guidelineYear: Entity(type == "oecd_guideline_year", value == "433") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.16", "Test_Guidelines_1", "Nº 433: Acute Inhalation Toxicity: Fixed Concentration Procedure (27/06/2018)", @@ -329,7 +328,7 @@ rule "DefaultComponents.4.17: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2019") $guidelineYear: Entity(type == "oecd_guideline_year", value == "439") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.17", "Test_Guidelines_1", "Nº 439: Skin Irritation (2019)", @@ -342,7 +341,7 @@ rule "DefaultComponents.4.18: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2001") $guidelineYear: Entity(type == "oecd_guideline_year", value == "425") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.18", "Test_Guidelines_1", "Nº 425: Acute oral Toxicity - Up-and-Down Procedure (17/12/2001)", @@ -355,7 +354,7 @@ rule "DefaultComponents.4.19: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2017") $guidelineYear: Entity(type == "oecd_guideline_year", value == "402") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.19", "Test_Guidelines_1", "Nº 402: Acute Dermal Toxicity (09/10/2017)", @@ -368,7 +367,7 @@ rule "DefaultComponents.4.20: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "1981") $guidelineYear: Entity(type == "oecd_guideline_year", value == "404") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.20", "Test_Guidelines_1", "Nº 404: Acute Dermal Irritation/Corrosion (12/05/1981)", @@ -381,7 +380,7 @@ rule "DefaultComponents.4.21: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2016") $guidelineYear: Entity(type == "oecd_guideline_year", value == "474") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.21", "Test_Guidelines_1", "Nº 474: Micronucleus Bone Marrow Cells Rat (2016)", @@ -394,7 +393,7 @@ rule "DefaultComponents.4.22: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2017") $guidelineYear: Entity(type == "oecd_guideline_year", value == "433") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.22", "Test_Guidelines_1", "Nº 433: Acute Inhalation Toxicity: Fixed Concentration Procedure (09/10/2017)", @@ -407,7 +406,7 @@ rule "DefaultComponents.4.23: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "1992") $guidelineYear: Entity(type == "oecd_guideline_year", value == "404") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.23", "Test_Guidelines_1", "Nº 404: Acute Dermal Irritation/Corrosion (17/07/1992)", @@ -420,7 +419,7 @@ rule "DefaultComponents.4.24: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2010") $guidelineYear: Entity(type == "oecd_guideline_year", value == "429") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.24", "Test_Guidelines_1", "Nº 429: Skin Sensitisation (23/07/2010)", @@ -433,7 +432,7 @@ rule "DefaultComponents.4.25: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2017") $guidelineYear: Entity(type == "oecd_guideline_year", value == "405") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.25", "Test_Guidelines_1", "Nº 405: Acute Eye Irritation/Corrosion (09/10/2017)", @@ -446,7 +445,7 @@ rule "DefaultComponents.4.26: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "1987") $guidelineYear: Entity(type == "oecd_guideline_year", value == "402") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.26", "Test_Guidelines_1", "Nº 402: Acute Dermal Toxicity (24/02/1987)", @@ -459,7 +458,7 @@ rule "DefaultComponents.4.27: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2012") $guidelineYear: Entity(type == "oecd_guideline_year", value == "405") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.27", "Test_Guidelines_1", "Nº 405: Acute Eye Irritation/Corrosion (02/10/2012)", @@ -472,7 +471,7 @@ rule "DefaultComponents.4.28: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2002") $guidelineYear: Entity(type == "oecd_guideline_year", value == "405") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.28", "Test_Guidelines_1", "Nº 405: Acute Eye Irritation/Corrosion (24/04/2002)", @@ -485,7 +484,7 @@ rule "DefaultComponents.4.29: Test Guideline 1" $guidelineNumber: Entity(type == "oecd_guideline_number", value == "2008") $guidelineYear: Entity(type == "oecd_guideline_year", value == "425") then - componentCreationService.createComponent( + componentCreationService.create( "DefaultComponents.4.29", "Test_Guidelines_1", "Nº 425: Acute oral Toxicity - Up-and-Down Procedure (03/10/2008)", @@ -537,7 +536,7 @@ rule "DefaultComponents.8.0: Certificate of analysis batch identification" rule "DefaultComponents.999.0: Create components for all unmapped entities." salience -999 when - $allEntities: List(!isEmpty()) from collect (Entity() + $allEntities: List(!isEmpty()) from collect (Entity()) then componentCreationService.createComponentsForUnMappedEntities("DefaultComponents.999.0", $allEntities); end