diff --git a/redaction-service-v1/redaction-service-server-v1/build.gradle.kts b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts index a7061434..44de1f8d 100644 --- a/redaction-service-v1/redaction-service-server-v1/build.gradle.kts +++ b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts @@ -33,6 +33,7 @@ configurations { dependencies { + implementation(project(":rules-management")) implementation(project(":redaction-service-api-v1")) { exclude(group = "com.iqser.red.service", module = "persistence-service-internal-api-v1") } implementation("com.iqser.red.service:persistence-service-internal-api-v1:${persistenceServiceVersion}") { exclude(group = "org.springframework.boot") } implementation("com.iqser.red.service:persistence-service-shared-mongo-v1:${persistenceServiceVersion}") diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/RuleBuilderService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/RuleBuilderService.java index 0fd4d255..95cecf24 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/RuleBuilderService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/RuleBuilderService.java @@ -60,8 +60,8 @@ public class RuleBuilderService { log.info("starting to merge user rules update with system rules"); RuleFileBluePrint ruleFileBluePrintExisting = RuleFileParser.buildBluePrintFromRulesString(existingRules); - RuleFileBluePrint mergedRuleFileBlueprint = RuleFileParser.buildBluePrintFromRulesString(userUpdatedRules); - removeAllRulesExceptSystemRules(ruleFileBluePrintExisting); + RuleFileBluePrint mergedRuleFileBlueprint = RuleFileParser.buildBluePrintFromRulesString(userUpdatedRules, true); + removeAllRulesExceptSystemRulesAndCheck(ruleFileBluePrintExisting); ruleFileBluePrintExisting.getRuleClasses() .stream() .flatMap(ruleClass -> ruleClass.ruleUnits() @@ -89,12 +89,13 @@ public class RuleBuilderService { .collect(Collectors.toSet()); removeAllRulesExceptSystemRules(ruleFileBluePrint); ruleFileBluePrint.getRuleClasses() - .forEach(ruleClass -> Assert.assertFalse("there was an error removing all rules except system rules", systemRuleNames.contains(ruleClass.ruleType().name()))); + .forEach(ruleClass -> Assert.assertTrue("there was an error removing all rules except system rules", systemRuleNames.contains(ruleClass.ruleType().name()))); } private void removeAllRulesExceptSystemRules(RuleFileBluePrint ruleFileBluePrint) { + List rules = new ArrayList(); Set systemRuleNames = systemRules.stream() .map(RuleType::name) .collect(Collectors.toSet()); @@ -105,7 +106,10 @@ public class RuleBuilderService { .flatMap(ruleClass -> ruleClass.ruleUnits() .stream() .map(ruleUnit -> new RuleIdentifier(ruleClass.ruleType(), ruleUnit.unit(), null))) - .forEach(ruleFileBluePrint::removeRule); + .forEach(rule -> rules.add(rule)); + rules.forEach(ruleIdentifier -> { + ruleFileBluePrint.removeRule(ruleIdentifier); + }); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RuleBuilderTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RuleBuilderTest.java index 9dcbeb4a..de4592ff 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RuleBuilderTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RuleBuilderTest.java @@ -37,6 +37,8 @@ import com.iqser.red.storage.commons.service.StorageService; import com.iqser.red.storage.commons.utils.FileSystemBackedStorageService; import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; +import com.knecon.fforesight.utility.rules.management.factory.RuleFileParser; +import com.knecon.fforesight.utility.rules.management.models.RuleFileBluePrint; @ExtendWith(SpringExtension.class) @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -114,6 +116,12 @@ public class RuleBuilderTest extends AbstractRedactionIntegrationTest { RuleMergingResult mergingResult = this.ruleBuilderService.mergeUserRulesAndSystemRules(RULES, USER_RULES); String mergedRules = mergingResult.getMergedRules(); + RuleFileBluePrint ruleFileBluePrintUserRulesUpdate = RuleFileParser.buildBluePrintFromRulesString(mergedRules, true); + RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(mergedRules); + ruleFileBluePrintUserRulesUpdate.getRuleClasses() + .forEach(ruleClass -> { + Assert.assertTrue(ruleFileBluePrint.getRuleClasses().contains(ruleClass)); + }); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/user_rule_update.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/user_rule_update.drl index a4828b80..16ea73d2 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/user_rule_update.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/user_rule_update.drl @@ -1,3 +1,4 @@ +package drools //------------------------------------ Table extraction rules ------------------------------------ // Rule unit: TAB.0 @@ -35,7 +36,7 @@ rule "TAB.0.1: Changed Guidelines" // Rule unit: TAB.6 -rule "TAB.6.0: Changed Targeted cell extraction (Experimental Stop date)" +rule "TAB.6.1: Changed Targeted cell extraction (Experimental Stop date)" when $section: Section(getHeadline().containsString("Advanced Table Extraction"), containsAllStrings("female", "Female", "Survived", "Group 2")) $table: Table(hasHeader("Group 2")) from $section.streamChildren().toList() diff --git a/redaction-service-v1/rules-management/src/main/java/com/knecon/fforesight/utility/rules/management/factory/RuleFileParser.java b/redaction-service-v1/rules-management/src/main/java/com/knecon/fforesight/utility/rules/management/factory/RuleFileParser.java index 15a9b05f..36b206aa 100644 --- a/redaction-service-v1/rules-management/src/main/java/com/knecon/fforesight/utility/rules/management/factory/RuleFileParser.java +++ b/redaction-service-v1/rules-management/src/main/java/com/knecon/fforesight/utility/rules/management/factory/RuleFileParser.java @@ -49,6 +49,13 @@ public class RuleFileParser { @SneakyThrows public RuleFileBluePrint buildBluePrintFromRulesString(String rulesString) { + return buildBluePrintFromRulesString(rulesString, false); + } + + + @SneakyThrows + public RuleFileBluePrint buildBluePrintFromRulesString(String rulesString, boolean isUserRuleUpdate) { + DrlParser parser = new DrlParser(LanguageLevelOption.DRL6); PackageDescr packageDescr = parser.parse(false, rulesString); StringBuilder queryBuilder = new StringBuilder(); @@ -78,12 +85,15 @@ public class RuleFileParser { for (AbstractClassTypeDeclarationDescr declaration : packageDescr.getTypeDeclarations()) { declarations.add(BasicDeclaration.fromDeclarationDescription(declaration, rulesString)); } - String imports = rulesString.substring(0, - packageDescr.getImports() - .stream() - .mapToInt(ImportDescr::getEndCharacter) - .max() - .orElseThrow() + 1); + String imports = ""; + if (isUserRuleUpdate && !packageDescr.getImports().isEmpty()) { + imports = rulesString.substring(0, + packageDescr.getImports() + .stream() + .mapToInt(ImportDescr::getEndCharacter) + .max() + .orElseThrow() + 1); + } String globals = packageDescr.getGlobals() .stream() .map(globalDescr -> rulesString.substring(globalDescr.getStartCharacter(), globalDescr.getEndCharacter())) @@ -108,13 +118,18 @@ public class RuleFileParser { private List groupingByGroup(List rules) { - Map> rulesPerUnit = rules.stream() - .collect(groupingBy(rule -> rule.identifier().unit())); - return rulesPerUnit.keySet() - .stream() - .sorted() - .map(unit -> new RuleUnit(unit, rulesPerUnit.get(unit))) - .collect(Collectors.toList()); + try { + Map> rulesPerUnit = rules.stream() + .collect(groupingBy(rule -> rule.identifier().unit())); + return rulesPerUnit.keySet() + .stream() + .sorted() + .map(unit -> new RuleUnit(unit, rulesPerUnit.get(unit))) + .collect(Collectors.toList()); + } catch (NullPointerException e) { + System.out.println(rules); + throw e; + } }