RED-9472: seperation of system rules

added endpoints for seperating and readding system rules

working on service
This commit is contained in:
yhampe 2024-09-12 10:24:59 +02:00
parent 3ff541fee6
commit fb8f227ac9
8 changed files with 181 additions and 6 deletions

View File

@ -9,6 +9,7 @@ val persistenceServiceVersion = "2.545.0"
dependencies {
implementation("org.springframework:spring-web:6.0.12")
implementation("com.iqser.red.service:persistence-service-internal-api-v1:${persistenceServiceVersion}")
api("com.knecon.fforesight:swagger-commons:0.7.0")
}
publishing {

View File

@ -1,13 +1,24 @@
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.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.media.Schema;
public interface RuleBuilderResource {
@PostMapping(value = "/rule-builder-model", produces = MediaType.APPLICATION_JSON_VALUE)
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)
RulesResponse getRuleFileWithSeperatedSystemRules(@Schema(type = "string", format = "UTF_8", name = "file") @RequestPart(name = "ruleFile") String ruleFile);
}

View File

@ -76,6 +76,7 @@ dependencies {
implementation("net.logstash.logback:logstash-logback-encoder:7.4")
api("ch.qos.logback:logback-classic")
api("com.knecon.fforesight:swagger-commons:0.7.0")
implementation("org.reflections:reflections:0.10.2")

View File

@ -1,27 +1,44 @@
package com.iqser.red.service.redaction.v1.server.controller;
import java.util.Collections;
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.redaction.v1.model.RuleBuilderModel;
import com.iqser.red.service.redaction.v1.resources.RuleBuilderResource;
import com.iqser.red.service.redaction.v1.server.service.RuleBuilderService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@RestController
@Slf4j
@RequiredArgsConstructor
public class RuleBuilderController implements RuleBuilderResource {
private final RuleBuilderService ruleBuilderService;
@Override
public RuleBuilderModel getRuleBuilderModel() {
RuleBuilderModel ruleBuilderModel = new RuleBuilderModel();
return this.ruleBuilderService.getRuleBuilderModel();
}
ruleBuilderModel.setWhenClauses(Collections.emptyList());
ruleBuilderModel.setThenConditions(Collections.emptyList());
return ruleBuilderModel;
@Override
public RulesResponse getRuleFileWithoutSystemRules(String rulesString) {
RulesResponse rulesResponse = new RulesResponse();
String filteredRules = this.ruleBuilderService.getRuleFileWithoutSystemRules(rulesString);
log.info("Filtered rules: {}", filteredRules);
return rulesResponse;
}
@Override
public RulesResponse getRuleFileWithSeperatedSystemRules(String rulesString) {
return this.ruleBuilderService.getRuleFileWithSeperatedSystemRules(rulesString);
}
}

View File

@ -0,0 +1,23 @@
package com.iqser.red.service.redaction.v1.server.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Schema(description = "Object containing a string of Drools rules.")
public class RulesResponse {
@Schema(description = "The actual string of rules.")
private String rules;
@Schema(description = "The DossierTemplate Id for these rules")
private String dossierTemplateId;
@Schema(description = "Bad written rules can lead to timeouts or endless processing. This will be detected by the system and all analyse request for the rules will be rejected. This flag indicates that a timeout was detected and you need to fix the rules")
private boolean timeoutDetected;
}

View File

@ -18,8 +18,10 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.FieldDefaults;
import lombok.extern.slf4j.Slf4j;
@Data
@Slf4j
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ -43,6 +45,18 @@ public final class RuleFileBluePrint {
}
public void dropRulesByIdentifier(RuleType ruleType) {
log.info("removing rule with identifier {}", ruleType.name());
List<RuleClass> rulesToBeRemoved = ruleClasses.stream()
.filter(ruleClass -> Objects.equals(ruleClass.ruleType(), ruleType))
.collect(Collectors.toList());
log.info("rules to be removed {}", rulesToBeRemoved);
ruleClasses.removeAll(rulesToBeRemoved);
}
public Set<String> getImportSplitByKeyword() {
return Arrays.stream(imports.replaceAll("\n", "").split("import"))

View File

@ -0,0 +1,55 @@
package com.iqser.red.service.redaction.v1.server.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
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.server.model.drools.RuleFileBluePrint;
import com.iqser.red.service.redaction.v1.server.model.drools.RuleType;
import com.iqser.red.service.redaction.v1.server.service.drools.RuleFileParser;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class RuleBuilderService {
private final List<String> systemRules = new ArrayList<>(Arrays.asList("AI", "MAN", "X", "DICT", "FA", "LDS"));
public RuleBuilderModel getRuleBuilderModel() {
RuleBuilderModel ruleBuilderModel = new RuleBuilderModel();
ruleBuilderModel.setWhenClauses(Collections.emptyList());
ruleBuilderModel.setThenConditions(Collections.emptyList());
return ruleBuilderModel;
}
public String getRuleFileWithoutSystemRules(String rulesString) {
RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(rulesString);
log.info("Starting to remove system rules from ruleFile {}", ruleFileBluePrint);
for (String systemRule : systemRules) {
ruleFileBluePrint.dropRulesByIdentifier(RuleType.fromString(systemRule));
}
log.info("Finished removing system rules for ruleFile {}", ruleFileBluePrint);
return RuleFileParser.buildRulesStringFromBluePrint(ruleFileBluePrint);
}
public RulesResponse getRuleFileWithSeperatedSystemRules(String rulesString) {
RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(rulesString);
return null;
}
}

View File

@ -83,6 +83,59 @@ public class RuleFileParser {
}
@SneakyThrows
public String buildRulesStringFromBluePrint(RuleFileBluePrint bluePrint) {
StringBuilder ruleStringBuilder = new StringBuilder();
// Append imports
ruleStringBuilder.append(bluePrint.getImports()).append("\n\n");
// Append globals
if (!bluePrint.getGlobals().isEmpty()) {
ruleStringBuilder.append(bluePrint.getGlobals()).append("\n\n");
}
// Append queries
for (BasicQuery query : bluePrint.getQueries()) {
ruleStringBuilder.append(buildQueryString(query)).append("\n\n");
}
// Append rules
for (RuleClass ruleClass : bluePrint.getRuleClasses()) {
ruleStringBuilder.append(buildRuleString(ruleClass)).append("\n\n");
}
// Return the final rule string
return ruleStringBuilder.toString().trim();
}
private String buildQueryString(BasicQuery query) {
return "query \"" + query.getName() + "\"\n" + query.getCode() + "\n" + "end";
}
private String buildRuleString(RuleClass ruleClass) {
StringBuilder ruleBuilder = new StringBuilder();
// Use RuleType to distinguish between different rule types, if needed
ruleBuilder.append("rule \"").append(ruleClass.ruleType().name()).append("\"\n");
for (RuleUnit ruleUnit : ruleClass.ruleUnits()) {
for (BasicRule rule : ruleUnit.rules()) {
// Assuming BasicRule has a method to retrieve the condition as a string
ruleBuilder.append(rule.getCode()).append("\n");
}
}
ruleBuilder.append("end");
return ruleBuilder.toString();
}
private static void validateRule(String ruleString, RuleDescr rule, DroolsValidation customDroolsValidation, List<BasicRule> allRules) {
BasicRule basicRule;