RED-9472: seperation of system rules
added a method for merging imports to preserve the package description
This commit is contained in:
parent
2d7feb8bfa
commit
a723fe7129
@ -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()
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user