From 89f642ba900ea60aa08f75da75ff09fd93eb2fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominique=20Eifl=C3=A4nder?= Date: Wed, 13 Jan 2021 12:45:07 +0100 Subject: [PATCH] RED-937: Handle rules version per RuleSetId --- .../service/DroolsExecutionService.java | 55 +++++++++++++------ .../service/EntityRedactionService.java | 2 +- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java index 7ef0dade..7b8233b5 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java @@ -1,11 +1,11 @@ package com.iqser.red.service.redaction.v1.server.redaction.service; -import com.iqser.red.service.configuration.v1.api.model.RulesResponse; -import com.iqser.red.service.redaction.v1.server.client.RulesClient; -import com.iqser.red.service.redaction.v1.server.exception.RulesValidationException; -import com.iqser.red.service.redaction.v1.server.redaction.model.Section; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + import org.apache.commons.lang3.StringUtils; import org.kie.api.KieServices; import org.kie.api.builder.KieBuilder; @@ -15,11 +15,12 @@ import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.springframework.stereotype.Service; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; +import com.iqser.red.service.configuration.v1.api.model.RulesResponse; +import com.iqser.red.service.redaction.v1.server.client.RulesClient; +import com.iqser.red.service.redaction.v1.server.exception.RulesValidationException; +import com.iqser.red.service.redaction.v1.server.redaction.model.Section; + +import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor @@ -29,7 +30,11 @@ public class DroolsExecutionService { private Map kieContainers = new HashMap<>(); + private Map rulesVersionPerRuleSetId = new HashMap<>(); + + public KieContainer getKieContainer(String ruleSetId) { + KieContainer container = kieContainers.get(ruleSetId); if (container == null) { return createOrUpdateKieContainer(ruleSetId); @@ -39,9 +44,6 @@ public class DroolsExecutionService { } - @Getter - private long rulesVersion = -1; - public Section executeRules(KieContainer kieContainer, Section section) { KieSession kieSession = kieContainer.newKieSession(); @@ -54,17 +56,24 @@ public class DroolsExecutionService { } + public KieContainer updateRules(String ruleSetId) { long version = rulesClient.getVersion(ruleSetId); - if (version > rulesVersion) { - rulesVersion = version; + Long rulesVersion = rulesVersionPerRuleSetId.get(ruleSetId); + if (rulesVersion == null) { + rulesVersion = -1L; + } + + if (version > rulesVersion.longValue()) { + rulesVersionPerRuleSetId.put(ruleSetId, version); return createOrUpdateKieContainer(ruleSetId); } return getKieContainer(ruleSetId); } + private KieContainer createOrUpdateKieContainer(String ruleSetId) { try { @@ -92,7 +101,9 @@ public class DroolsExecutionService { } + private KieModule getKieModule(String ruleSetId, String rules, KieServices kieServices) { + KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); InputStream input = new ByteArrayInputStream(rules.getBytes(StandardCharsets.UTF_8)); kieFileSystem.write("src/main/resources/drools/rules" + ruleSetId + ".drl", kieServices.getResources() @@ -104,10 +115,22 @@ public class DroolsExecutionService { public void testRules(String rules) { + KieServices kieServices = KieServices.Factory.get(); KieModule kieModule = getKieModule("test-rules", rules, kieServices); var container = kieServices.newKieContainer(kieModule.getReleaseId()); container.newKieSession(); container.dispose(); } + + + public long getRulesVersion(String ruleSetId) { + + Long rulesVersion = rulesVersionPerRuleSetId.get(ruleSetId); + if (rulesVersion == null) { + return -1; + } + return rulesVersion.longValue(); + } + } \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java index 1d97e674..9a0c44d0 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java @@ -50,7 +50,7 @@ public class EntityRedactionService { dictionaryService.updateDictionary(ruleSetId); KieContainer container = droolsExecutionService.updateRules(ruleSetId); - long rulesVersion = droolsExecutionService.getRulesVersion(); + long rulesVersion = droolsExecutionService.getRulesVersion(ruleSetId); Dictionary dictionary = dictionaryService.getDeepCopyDictionary(ruleSetId);