RED-9472: seperation of system rules

added a method for merging imports to preserve the package description
This commit is contained in:
yhampe 2024-12-13 14:46:20 +01:00
parent 2d7feb8bfa
commit a723fe7129
3 changed files with 92 additions and 30 deletions

View File

@ -62,7 +62,6 @@ public class RuleBuilderController implements RuleBuilderResource {
throw new AssertionError("There was an error when merging the user rule update into the rule file"); throw new AssertionError("There was an error when merging the user rule update into the rule file");
} }
try { try {
log.info("result"+mergingResult.getMergedRules());
var droolsValidation = droolsValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), mergingResult.getMergedRules())); var droolsValidation = droolsValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), mergingResult.getMergedRules()));
log.info("result of validation: " + droolsValidation); log.info("result of validation: " + droolsValidation);
droolsValidationResponse = DroolsValidationResponse.builder() droolsValidationResponse = DroolsValidationResponse.builder()

View File

@ -1,6 +1,7 @@
package com.iqser.red.service.redaction.v1.server.rulesmanagement.models; package com.iqser.red.service.redaction.v1.server.rulesmanagement.models;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
@ -34,6 +35,9 @@ public class RuleFileBluePrint {
List<BasicDeclaration> declarations; List<BasicDeclaration> declarations;
List<BasicFunction> functions; List<BasicFunction> functions;
private static final String IMPORT_PREFIX = "import ";
private static final String PACKAGE_PREFIX = "package ";
public boolean removeRule(RuleIdentifier ruleIdentifier) { public boolean removeRule(RuleIdentifier ruleIdentifier) {
@ -54,6 +58,60 @@ public class RuleFileBluePrint {
} }
public void addImport(String importStatement) {
if (importStatement == null || importStatement.trim().isEmpty()) {
return;
}
String cleanImport = importStatement.trim();
if (!cleanImport.startsWith(IMPORT_PREFIX)) {
cleanImport = IMPORT_PREFIX + cleanImport;
}
if (imports == null) {
imports = PACKAGE_PREFIX + "drools\n\n";
}
if (!imports.contains(cleanImport)) {
imports = imports.trim() + "\n" + cleanImport;
}
}
public void mergeImports(RuleFileBluePrint other) {
if (other == null || other.getImports() == null) {
return;
}
addImports(other.getImports());
}
public String getImports() {
if (imports == null || imports.trim().isEmpty()) {
return PACKAGE_PREFIX + "drools\n\n";
}
return imports;
}
public void addImports(String importStatements) {
if (importStatements == null || importStatements.trim().isEmpty()) {
return;
}
Arrays.stream(importStatements.split("\n"))
.map(String::trim)
.filter(line -> !line.isEmpty())
.filter(line -> !line.startsWith(PACKAGE_PREFIX))
.forEach(this::addImport);
}
public boolean removeRuleClassByRuleIdentifier(RuleIdentifier ruleIdentifier) { public boolean removeRuleClassByRuleIdentifier(RuleIdentifier ruleIdentifier) {
AtomicBoolean wasRemoved = new AtomicBoolean(false); AtomicBoolean wasRemoved = new AtomicBoolean(false);

View File

@ -51,10 +51,10 @@ public class RuleBuilderService {
public RuleMergingResult mergeUserRulesAndSystemRules(String existingRules, String userUpdatedRules) { public RuleMergingResult mergeUserRulesAndSystemRules(String existingRules, String userUpdatedRules) {
RuleFileBluePrint ruleFileBluePrintExisting = RuleFileParser.buildBluePrintFromRulesString(existingRules); RuleFileBluePrint mergedRuleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(existingRules);
RuleFileBluePrint mergedRuleFileBlueprint = RuleFileParser.buildBluePrintFromRulesString(userUpdatedRules, false); RuleFileBluePrint userRulesBluePrint = RuleFileParser.buildBluePrintFromRulesString(userUpdatedRules, false);
mergedRuleFileBlueprint.getRuleClasses() userRulesBluePrint.getRuleClasses()
.forEach(ruleClass -> { .forEach(ruleClass -> {
if (systemRules.stream() if (systemRules.stream()
.toList().contains(RuleIdentifier.fromName(ruleClass.ruleType().name()))) { .toList().contains(RuleIdentifier.fromName(ruleClass.ruleType().name()))) {
@ -62,35 +62,40 @@ public class RuleBuilderService {
throw new RuntimeException("No system rule updates allowed in user rule update."); throw new RuntimeException("No system rule updates allowed in user rule update.");
} }
}); });
ruleFileBluePrintExisting = removeAllRulesExceptSystemRules(ruleFileBluePrintExisting);
mergedRuleFileBlueprint.getAllRules() mergedRuleFileBluePrint = removeAllRulesExceptSystemRules(mergedRuleFileBluePrint);
.forEach(ruleFileBluePrintExisting::addRule); userRulesBluePrint.getAllRules()
Set<String> uniqueImports = Arrays.stream((ruleFileBluePrintExisting.getImports() + mergedRuleFileBlueprint.getImports()).replaceAll("\n", "").split("import")) .forEach(mergedRuleFileBluePrint::addRule);
mergedRuleFileBluePrint.mergeImports(userRulesBluePrint);
Set<String> uniqueGlobals = Arrays.stream((mergedRuleFileBluePrint.getGlobals() + userRulesBluePrint.getGlobals()).replaceAll("\n", "").split("global"))
.map(String::trim) .map(String::trim)
.filter(s -> !s.isEmpty())
.collect(Collectors.toSet()); .collect(Collectors.toSet());
ruleFileBluePrintExisting.setImports(uniqueImports.stream()
.collect(Collectors.joining(""))); mergedRuleFileBluePrint.setGlobals(uniqueGlobals.stream()
Set<String> uniqueGlobals = Arrays.stream((ruleFileBluePrintExisting.getGlobals() + mergedRuleFileBlueprint.getGlobals()).replaceAll("\n", "").split("import")) .map(global -> "global " + global)
.map(String::trim) .collect(Collectors.joining("\n")));
.collect(Collectors.toSet());
ruleFileBluePrintExisting.setGlobals(uniqueGlobals.stream() mergedRuleFileBluePrint.setFunctions(Stream.concat(mergedRuleFileBluePrint.getFunctions()
.collect(Collectors.joining(""))); .stream(),
ruleFileBluePrintExisting.setFunctions(Stream.concat(ruleFileBluePrintExisting.getFunctions() userRulesBluePrint.getFunctions()
.stream(), .stream())
mergedRuleFileBlueprint.getFunctions() .distinct()
.stream()) .toList());
.distinct()
.toList()); mergedRuleFileBluePrint.setDeclarations(Stream.concat(mergedRuleFileBluePrint.getDeclarations()
ruleFileBluePrintExisting.setDeclarations(Stream.concat(ruleFileBluePrintExisting.getDeclarations() .stream(),
.stream(), userRulesBluePrint.getDeclarations()
mergedRuleFileBlueprint.getDeclarations() .stream())
.stream()) .distinct()
.distinct() .toList());
.toList());
return RuleMergingResult.builder() return RuleMergingResult.builder()
.mergedRules(RuleFileFactory.buildRuleString(mergedRuleFileBlueprint, false, false)) .mergedRules(RuleFileFactory.buildRuleString(mergedRuleFileBluePrint, false, false))
.addedGlobalsOffset(mergedRuleFileBlueprint.getGlobals().length()) .addedGlobalsOffset(userRulesBluePrint.getGlobals().length())
.addedImportsOffset(mergedRuleFileBlueprint.getImports().length()) .addedImportsOffset(userRulesBluePrint.getImports().length())
.build(); .build();
} }