RED-9472: seperation of system rules #516
@ -1,24 +1,25 @@
|
|||||||
package com.iqser.red.service.redaction.v1.resources;
|
package com.iqser.red.service.redaction.v1.resources;
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse;
|
|
||||||
import com.iqser.red.service.redaction.v1.model.RuleBuilderModel;
|
|
||||||
|
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUpdateRequest;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.SystemRulesSeperationRequest;
|
||||||
|
import com.iqser.red.service.redaction.v1.model.RuleBuilderModel;
|
||||||
|
|
||||||
public interface RuleBuilderResource {
|
public interface RuleBuilderResource {
|
||||||
|
|
||||||
@PostMapping(value = "/rule-builder-model", produces = MediaType.APPLICATION_JSON_VALUE)
|
@PostMapping(value = "/rule-builder-model", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
RuleBuilderModel getRuleBuilderModel();
|
RuleBuilderModel getRuleBuilderModel();
|
||||||
|
|
||||||
@PostMapping(value="/rulefile-system", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
|
|
||||||
RulesResponse getRuleFileWithoutSystemRules(@Schema(type = "string", format = "UTF_8", name = "file") @RequestPart(name = "ruleFile") String ruleFile);
|
|
||||||
|
|
||||||
@PostMapping(value="/rulefile", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
|
@PostMapping(value = "/internal-api/rules/user-rules", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||||
RulesResponse getRuleFileWithSeperatedSystemRules(@Schema(type = "string", format = "UTF_8", name = "file") @RequestPart(name = "ruleFile") String ruleFile);
|
RulesResponse getRuleFileWithoutSystemRules(@RequestBody SystemRulesSeperationRequest systemRulesSeperationRequest);
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping(value = "/internal-api/rules/system-rules", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
RulesResponse getRuleFileWithSeperatedSystemRules(@RequestBody RulesUpdateRequest rulesUpdateRequest);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,9 +3,15 @@ package com.iqser.red.service.redaction.v1.server.controller;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUpdateRequest;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.SystemRulesSeperationRequest;
|
||||||
import com.iqser.red.service.redaction.v1.model.RuleBuilderModel;
|
import com.iqser.red.service.redaction.v1.model.RuleBuilderModel;
|
||||||
|
import com.iqser.red.service.redaction.v1.model.RuleValidationModel;
|
||||||
import com.iqser.red.service.redaction.v1.resources.RuleBuilderResource;
|
import com.iqser.red.service.redaction.v1.resources.RuleBuilderResource;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.drools.RuleType;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.RuleBuilderService;
|
import com.iqser.red.service.redaction.v1.server.service.RuleBuilderService;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.service.drools.DroolsValidationService;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.utils.exception.RulesValidationException;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -16,6 +22,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
public class RuleBuilderController implements RuleBuilderResource {
|
public class RuleBuilderController implements RuleBuilderResource {
|
||||||
|
|
||||||
private final RuleBuilderService ruleBuilderService;
|
private final RuleBuilderService ruleBuilderService;
|
||||||
|
private final DroolsValidationService droolsValidationService;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -26,19 +33,31 @@ public class RuleBuilderController implements RuleBuilderResource {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RulesResponse getRuleFileWithoutSystemRules(String rulesString) {
|
public RulesResponse getRuleFileWithoutSystemRules(SystemRulesSeperationRequest systemRulesSeperationRequest) {
|
||||||
|
|
||||||
RulesResponse rulesResponse = new RulesResponse();
|
RulesResponse rulesResponse = new RulesResponse();
|
||||||
String filteredRules = this.ruleBuilderService.getRuleFileWithoutSystemRules(rulesString);
|
String filteredRules = this.ruleBuilderService.cleanRuleFileOfSystemRules(systemRulesSeperationRequest.getRules(), true);
|
||||||
log.info("Filtered rules: {}", filteredRules);
|
try {
|
||||||
|
droolsValidationService.testRules(new RuleValidationModel("ENTITY", filteredRules));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RulesValidationException("Could not test rules: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
rulesResponse.setRules(filteredRules);
|
||||||
return rulesResponse;
|
return rulesResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RulesResponse getRuleFileWithSeperatedSystemRules(String rulesString) {
|
public RulesResponse getRuleFileWithSeperatedSystemRules(RulesUpdateRequest rulesUpdateRequest) {
|
||||||
|
RulesResponse rulesResponse = new RulesResponse();
|
||||||
return this.ruleBuilderService.getRuleFileWithSeperatedSystemRules(rulesString);
|
String mergedRules = ruleBuilderService.getRuleFileWithSeperatedSystemRules(rulesUpdateRequest.getExistingRules(), rulesUpdateRequest.getUpdatedRules());
|
||||||
|
try {
|
||||||
|
droolsValidationService.testRules(new RuleValidationModel("ENTITY", mergedRules));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RulesValidationException("Could not test rules: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
rulesResponse.setRules(mergedRules);
|
||||||
|
return rulesResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,6 +57,47 @@ public final class RuleFileBluePrint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void dropAllRulesExceptSystemRules(List<String> systemRules) {
|
||||||
|
|
||||||
|
log.info("removing all rules except the system rules");
|
||||||
|
|
||||||
|
List<RuleClass> rulesToBeRemoved = ruleClasses.stream()
|
||||||
|
.filter(ruleClass -> filterOutRule(ruleClass.ruleType(), systemRules))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
log.info("rules to be removed {}", rulesToBeRemoved);
|
||||||
|
ruleClasses.removeAll(rulesToBeRemoved);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void dropImports() {
|
||||||
|
|
||||||
|
this.imports = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void dropQueries() {
|
||||||
|
|
||||||
|
this.queries.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int countRuleOccurences(RuleType ruleType) {
|
||||||
|
|
||||||
|
log.info("counting occurences of files {}", ruleType.name());
|
||||||
|
|
||||||
|
List<RuleClass> rulesToBeRemoved = ruleClasses.stream()
|
||||||
|
.filter(ruleClass -> Objects.equals(ruleClass.ruleType(), ruleType))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
return rulesToBeRemoved.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private boolean filterOutRule(RuleType ruleType, List<String> filteredRules) {
|
||||||
|
|
||||||
|
return !filteredRules.contains(ruleType.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public Set<String> getImportSplitByKeyword() {
|
public Set<String> getImportSplitByKeyword() {
|
||||||
|
|
||||||
return Arrays.stream(imports.replaceAll("\n", "").split("import"))
|
return Arrays.stream(imports.replaceAll("\n", "").split("import"))
|
||||||
@ -108,4 +149,10 @@ public final class RuleFileBluePrint {
|
|||||||
return "RuleFileBluePrint[imports=" + imports + ", globals=" + globals + ", queries=" + queries + ", ruleClasses=" + ruleClasses + ']';
|
return "RuleFileBluePrint[imports=" + imports + ", globals=" + globals + ", queries=" + queries + ", ruleClasses=" + ruleClasses + ']';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addRuleClass(RuleClass ruleClass) {
|
||||||
|
|
||||||
|
this.ruleClasses.add(ruleClass);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesResponse;
|
|
||||||
import com.iqser.red.service.redaction.v1.model.RuleBuilderModel;
|
import com.iqser.red.service.redaction.v1.model.RuleBuilderModel;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.drools.RuleFileBluePrint;
|
import com.iqser.red.service.redaction.v1.server.model.drools.RuleFileBluePrint;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.drools.RuleType;
|
import com.iqser.red.service.redaction.v1.server.model.drools.RuleType;
|
||||||
@ -33,23 +32,41 @@ public class RuleBuilderService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getRuleFileWithoutSystemRules(String rulesString) {
|
public String cleanRuleFileOfSystemRules(String rulesString, boolean removeImports) {
|
||||||
|
|
||||||
RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(rulesString);
|
RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(rulesString);
|
||||||
log.info("Starting to remove system rules from ruleFile {}", ruleFileBluePrint);
|
log.info("Starting to remove system rules from ruleFile");
|
||||||
for (String systemRule : systemRules) {
|
for (String systemRule : systemRules) {
|
||||||
ruleFileBluePrint.dropRulesByIdentifier(RuleType.fromString(systemRule));
|
ruleFileBluePrint.dropRulesByIdentifier(RuleType.fromString(systemRule));
|
||||||
}
|
}
|
||||||
log.info("Finished removing system rules for ruleFile {}", ruleFileBluePrint);
|
ruleFileBluePrint.dropQueries();
|
||||||
|
if (removeImports) {
|
||||||
|
ruleFileBluePrint.dropQueries();
|
||||||
|
}
|
||||||
|
log.info("Finished removing system rules for ruleFile");
|
||||||
|
|
||||||
return RuleFileParser.buildRulesStringFromBluePrint(ruleFileBluePrint);
|
return RuleFileParser.buildRulesStringFromBluePrint(ruleFileBluePrint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public RulesResponse getRuleFileWithSeperatedSystemRules(String rulesString) {
|
public String getRuleFileWithSeperatedSystemRules(String existingRules, String updatedRules) {
|
||||||
|
|
||||||
RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(rulesString);
|
RuleFileBluePrint ruleFileBluePrintExisting = RuleFileParser.buildBluePrintFromRulesString(existingRules);
|
||||||
return null;
|
ruleFileBluePrintExisting.dropAllRulesExceptSystemRules(systemRules);
|
||||||
|
RuleFileBluePrint ruleFileBluePrintUpdate = RuleFileParser.buildBluePrintFromRulesString(updatedRules);
|
||||||
|
for (String systemRule : systemRules) {
|
||||||
|
if (ruleFileBluePrintUpdate.countRuleOccurences(RuleType.fromString(systemRule)) > 0) {
|
||||||
|
throw new RuntimeException("System rules are not allowed in an update.");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ruleFileBluePrintExisting.setImports(ruleFileBluePrintUpdate.getImports());
|
||||||
|
ruleFileBluePrintUpdate.getRuleClasses()
|
||||||
|
.forEach(ruleClass -> {
|
||||||
|
ruleFileBluePrintExisting.addRuleClass(ruleClass);
|
||||||
|
});
|
||||||
|
|
||||||
|
return RuleFileParser.buildRulesStringFromBluePrint(ruleFileBluePrintExisting);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -203,4 +203,6 @@ public class RuleFileParser {
|
|||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<String> getImportsFromRuleFile(String ruleString)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user