From fb2d1fb2f27fbf702fb28c5061bdcaa1d76f3c1a Mon Sep 17 00:00:00 2001 From: Corina Olariu Date: Tue, 20 Feb 2024 07:57:48 +0100 Subject: [PATCH] RED-7886 - Endpoint for rule validation --- .../model/DroolsSyntaxDeprecatedWarnings.java | 20 ++ .../v1/model/DroolsSyntaxValidation.java | 2 + .../build.gradle.kts | 2 + .../redaction/v1/server/Application.java | 8 + .../v1/server/DeprecatedElementsFinder.java | 108 ++++++++ .../drools/DroolsSyntaxValidationService.java | 143 +++++++--- .../DroolsSyntaxValidationServiceTest.java | 249 +++++++++++------- 7 files changed, 402 insertions(+), 130 deletions(-) create mode 100644 redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/DroolsSyntaxDeprecatedWarnings.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/DeprecatedElementsFinder.java diff --git a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/DroolsSyntaxDeprecatedWarnings.java b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/DroolsSyntaxDeprecatedWarnings.java new file mode 100644 index 00000000..787beb5f --- /dev/null +++ b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/DroolsSyntaxDeprecatedWarnings.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.redaction.v1.model; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldDefaults; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE) +public class DroolsSyntaxDeprecatedWarnings { + + Integer line; + Integer column; + String message; +} diff --git a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/DroolsSyntaxValidation.java b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/DroolsSyntaxValidation.java index 11c9eecd..ece14831 100644 --- a/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/DroolsSyntaxValidation.java +++ b/redaction-service-v1/redaction-service-api-v1/src/main/java/com/iqser/red/service/redaction/v1/model/DroolsSyntaxValidation.java @@ -19,6 +19,8 @@ public class DroolsSyntaxValidation { @Builder.Default List droolsSyntaxErrorMessages = new LinkedList<>(); + @Builder.Default + List droolsSyntaxDeprecatedWarnings = new LinkedList<>(); public void addErrorMessage(int line, int column, String message) { diff --git a/redaction-service-v1/redaction-service-server-v1/build.gradle.kts b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts index bd56e7c0..9f605928 100644 --- a/redaction-service-v1/redaction-service-server-v1/build.gradle.kts +++ b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts @@ -60,6 +60,8 @@ dependencies { implementation("net.logstash.logback:logstash-logback-encoder:7.4") implementation("ch.qos.logback:logback-classic") + implementation("org.reflections:reflections:0.10.2") + testImplementation(project(":rules-management")) testImplementation("org.apache.pdfbox:pdfbox:${pdfBoxVersion}") testImplementation("org.apache.pdfbox:pdfbox-tools:${pdfBoxVersion}") diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/Application.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/Application.java index 59c644fd..52f9a9ed 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/Application.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/Application.java @@ -46,10 +46,18 @@ public class Application { return new TimedAspect(registry); } + @Bean public DictionaryMergeService dictionaryMergeService() { return new DictionaryMergeService(); } + + @Bean(initMethod = "findDeprecatedMethods") + public DeprecatedElementsFinder deprecatedElementsFinder() { + + return new DeprecatedElementsFinder(); + } + } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/DeprecatedElementsFinder.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/DeprecatedElementsFinder.java new file mode 100644 index 00000000..9383edeb --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/DeprecatedElementsFinder.java @@ -0,0 +1,108 @@ +package com.iqser.red.service.redaction.v1.server; + +import static java.util.stream.Collectors.groupingBy; + +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; +import org.reflections.util.ConfigurationBuilder; + +import com.iqser.red.service.redaction.v1.server.model.dictionary.SearchImplementation; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class DeprecatedElementsFinder { + + public static final String PACKAGE_NAME = "com.iqser.red.service.redaction.v1.server"; + private Set deprecatedMethods; + @Getter + private Map deprecatedMethodsSignaturesMap; + private Set> deprecatedClasses; + @Getter + private SearchImplementation classesSearchImplementation; + @Getter + private SearchImplementation methodsSearchImplementation; + + + public void findDeprecatedMethods() { + + deprecatedMethods = new HashSet<>(); + deprecatedClasses = new HashSet<>(); + deprecatedMethodsSignaturesMap = new HashMap<>(); + + Reflections reflections = new Reflections(new ConfigurationBuilder().forPackage(PACKAGE_NAME) + .setExpandSuperTypes(true) + .setScanners(Scanners.MethodsAnnotated, Scanners.TypesAnnotated, Scanners.SubTypes)); + + deprecatedMethods = reflections.get(Scanners.MethodsAnnotated.with(Deprecated.class).as(Method.class)); + + deprecatedClasses = reflections.get(Scanners.TypesAnnotated.with(Deprecated.class).asClass()); + + if (!deprecatedClasses.isEmpty()) { + deprecatedClasses.forEach(deprecatedType -> deprecatedMethods.addAll(Arrays.stream(deprecatedType.getDeclaredMethods()) + .collect(Collectors.toSet()))); + classesSearchImplementation = new SearchImplementation(deprecatedClasses.stream() + .map(Class::getName) + .collect(Collectors.toSet()), false); + } + + if (!deprecatedMethods.isEmpty()) { + methodsSearchImplementation = new SearchImplementation(deprecatedMethods.stream() + .map(Method::getName) + .collect(Collectors.toSet()), false); + deprecatedMethodsSignaturesMap = new HashMap<>(); + Map> deprecatedMethodsNameMap = deprecatedMethods.stream() + .collect(groupingBy(Method::getName)); + for (String deprecatedMethod : deprecatedMethodsNameMap.keySet()) { + deprecatedMethodsSignaturesMap.computeIfAbsent(deprecatedMethod, + key -> deprecatedMethodsNameMap.get(deprecatedMethod) + .stream() + .map(this::getMethodSignature) + .collect(Collectors.joining("\n"))); + } + + } + + log.info("For package: {} found deprecated classes {} deprecated methods {}", PACKAGE_NAME, deprecatedClasses.size(), deprecatedMethods.size()); + } + + + public Set getDeprecatedMethods() { + + if (this.deprecatedMethods == null) { + findDeprecatedMethods(); + } + return this.deprecatedMethods; + } + + + public Set> getDeprecatedClasses() { + + if (this.deprecatedClasses == null) { + findDeprecatedMethods(); + } + return this.deprecatedClasses; + } + + private String getMethodSignature(Method method) { + + String methodName = method.getName(); + String parameterTypes = Arrays.stream(method.getGenericParameterTypes()) + .map(Type::getTypeName) + .collect(Collectors.joining(", ")); + + return method.getGenericReturnType() + " " + methodName + "(" + parameterTypes + ")"; + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/DroolsSyntaxValidationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/DroolsSyntaxValidationService.java index da11cf93..4aa89dda 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/DroolsSyntaxValidationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/DroolsSyntaxValidationService.java @@ -1,6 +1,9 @@ package com.iqser.red.service.redaction.v1.server.service.drools; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -12,24 +15,34 @@ import org.springframework.stereotype.Service; import com.google.common.collect.Sets; import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; +import com.iqser.red.service.redaction.v1.model.DroolsSyntaxDeprecatedWarnings; import com.iqser.red.service.redaction.v1.model.DroolsSyntaxErrorMessage; import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; import com.iqser.red.service.redaction.v1.model.RuleValidationModel; +import com.iqser.red.service.redaction.v1.server.DeprecatedElementsFinder; +import com.iqser.red.service.redaction.v1.server.model.dictionary.SearchImplementation; import com.iqser.red.service.redaction.v1.server.model.drools.BasicQuery; +import com.iqser.red.service.redaction.v1.server.model.drools.BasicRule; +import com.iqser.red.service.redaction.v1.server.model.drools.RuleClass; import com.iqser.red.service.redaction.v1.server.model.drools.RuleFileBluePrint; +import com.iqser.red.service.redaction.v1.server.model.drools.RuleUnit; import com.iqser.red.service.redaction.v1.server.storage.RuleManagementResources; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; @Service @RequiredArgsConstructor +@Slf4j public class DroolsSyntaxValidationService { - + private static final Pattern allowedImportsPattern = Pattern.compile("^(?:import\\s+static\\s+)?(?:import\\s+)?(?:com\\.knecon\\.fforesight|com\\.iqser\\.red)\\..*;$"); private final KieContainerCreationService kieContainerCreationService; + private final DeprecatedElementsFinder deprecatedElementsFinder; + @SneakyThrows public DroolsSyntaxValidation testRules(RuleValidationModel rules) { @@ -43,15 +56,74 @@ public class DroolsSyntaxValidationService { } DroolsSyntaxValidation droolsCompilerSyntaxValidation = buildDroolsCompilerSyntaxValidation(rules); droolsCompilerSyntaxValidation.getDroolsSyntaxErrorMessages().addAll(customDroolsSyntaxValidation.getDroolsSyntaxErrorMessages()); + droolsCompilerSyntaxValidation.getDroolsSyntaxDeprecatedWarnings().addAll(customDroolsSyntaxValidation.getDroolsSyntaxDeprecatedWarnings()); return droolsCompilerSyntaxValidation; } + private DroolsSyntaxDeprecatedWarnings getWarningsForDeprecatedImports(RuleFileBluePrint ruleFileBluePrint) { + + if (!deprecatedElementsFinder.getDeprecatedClasses().isEmpty()) { + String imports = ruleFileBluePrint.getImports(); + SearchImplementation classesSearchImplementation = deprecatedElementsFinder.getClassesSearchImplementation(); + List matches = classesSearchImplementation.getMatches(imports); + if (!matches.isEmpty()) { + String sb = "Following imports are deprecated: \n" + matches.stream() + .map(m -> imports.substring(m.startIndex(), m.endIndex())) + .collect(Collectors.joining("\n")); + return DroolsSyntaxDeprecatedWarnings.builder().line(ruleFileBluePrint.getImportLine()).column(0).message(sb) + .build(); + } + } + return null; + } + + private List getWarningsForDeprecatedRules(RuleFileBluePrint ruleFileBluePrint) { + + List warningMessages = new ArrayList<>(); + + // checks the rules for deprecateMethods + if (!deprecatedElementsFinder.getDeprecatedMethods().isEmpty()) { + SearchImplementation methodsSearchImplementation = deprecatedElementsFinder.getMethodsSearchImplementation(); + Map deprecatedMethodsSignatureMap = deprecatedElementsFinder.getDeprecatedMethodsSignaturesMap(); + + for (RuleClass ruleClass : ruleFileBluePrint.getRuleClasses()) { + for (RuleUnit ruleUnit : ruleClass.ruleUnits()) { + for (BasicRule basicRule : ruleUnit.rules()) { + List matches = methodsSearchImplementation.getMatches(basicRule.getCode()); + if (!matches.isEmpty()) { + String warningMessage = matches.stream() + .map(m -> basicRule.getCode().substring(m.startIndex(), m.endIndex())) + .distinct() + .map(dm -> String.format("Method %s might be deprecated because of \n %s \n", dm, deprecatedMethodsSignatureMap.get(dm))) + .collect(Collectors.joining("\n")); + warningMessages.add(DroolsSyntaxDeprecatedWarnings.builder().line(basicRule.getLine()).column(0).message(warningMessage) + .build()); + } + } + } + } + + } + + return warningMessages.stream() + .sorted(Comparator.comparingInt(DroolsSyntaxDeprecatedWarnings::getLine)) + .collect(Collectors.toList()); + } + private DroolsSyntaxValidation buildCustomDroolsSyntaxValidation(String ruleString, RuleFileType ruleFileType) throws DroolsParserException { RuleFileBluePrint ruleFileBluePrint = RuleFileParser.buildBluePrintFromRulesString(ruleString); + DroolsSyntaxValidation customSyntaxValidation = ruleFileBluePrint.getDroolsSyntaxValidation(); + // find deprecated elements in the ruleFileBluePrint + DroolsSyntaxDeprecatedWarnings warningMessageForImports = getWarningsForDeprecatedImports(ruleFileBluePrint); + if (warningMessageForImports != null) { + customSyntaxValidation.getDroolsSyntaxDeprecatedWarnings().add(warningMessageForImports); + } + customSyntaxValidation.getDroolsSyntaxDeprecatedWarnings().addAll(getWarningsForDeprecatedRules(ruleFileBluePrint)); + RuleFileBluePrint baseRuleFileBluePrint = switch (ruleFileType) { case ENTITY -> RuleFileParser.buildBluePrintFromRulesString(RuleManagementResources.getBaseRuleFileString()); case COMPONENT -> RuleFileParser.buildBluePrintFromRulesString(RuleManagementResources.getBaseComponentRuleFileString()); @@ -60,35 +132,36 @@ public class DroolsSyntaxValidationService { if (!importsAreValid(baseRuleFileBluePrint, ruleFileBluePrint)) { customSyntaxValidation.getDroolsSyntaxErrorMessages() .add(DroolsSyntaxErrorMessage.builder() - .line(ruleFileBluePrint.getImportLine()) - .column(0) - .message(String.format("Changing the imports is not allowed! Must be: %n%s", baseRuleFileBluePrint.getImports())) - .build()); + .line(ruleFileBluePrint.getImportLine()) + .column(0) + .message(String.format("Changing the imports is not allowed! Must be: %n%s", baseRuleFileBluePrint.getImports())) + .build()); } if (!ruleFileBluePrint.getGlobals().equals(baseRuleFileBluePrint.getGlobals())) { customSyntaxValidation.getDroolsSyntaxErrorMessages() .add(DroolsSyntaxErrorMessage.builder() - .line(ruleFileBluePrint.getGlobalsLine()) - .column(0) - .message(String.format("Changing the globals is not allowed! Must be: %n%s", baseRuleFileBluePrint.getGlobals())) - .build()); + .line(ruleFileBluePrint.getGlobalsLine()) + .column(0) + .message(String.format("Changing the globals is not allowed! Must be: %n%s", baseRuleFileBluePrint.getGlobals())) + .build()); } - baseRuleFileBluePrint.getQueries().forEach(basicQuery -> { - if (!validateQueryIsPresent(basicQuery, ruleFileBluePrint)) { - customSyntaxValidation.getDroolsSyntaxErrorMessages() - .add(DroolsSyntaxErrorMessage.builder() - .line(basicQuery.getLine()) - .column(0) - .message(String.format("Changing or removing the query %s is not allowed! Must be: %n%s", basicQuery.getName(), basicQuery.getCode())) - .build()); - } - }); + baseRuleFileBluePrint.getQueries() + .forEach(basicQuery -> { + if (!validateQueryIsPresent(basicQuery, ruleFileBluePrint)) { + customSyntaxValidation.getDroolsSyntaxErrorMessages() + .add(DroolsSyntaxErrorMessage.builder() + .line(basicQuery.getLine()) + .column(0) + .message(String.format("Changing or removing the query %s is not allowed! Must be: %n%s", basicQuery.getName(), basicQuery.getCode())) + .build()); + } + }); if (ruleFileType.equals(RuleFileType.ENTITY)) { String requiredAgendaGroup = "LOCAL_DICTIONARY_ADDS"; if (!validateAgendaGroupIsPresent(ruleFileBluePrint, requiredAgendaGroup)) { - customSyntaxValidation.getDroolsSyntaxErrorMessages().add(DroolsSyntaxErrorMessage.builder().line(0) - .column(0).message(String.format("At least one rule with Agenda-Group '%s' required!", requiredAgendaGroup)) - .build()); + customSyntaxValidation.getDroolsSyntaxErrorMessages() + .add(DroolsSyntaxErrorMessage.builder().line(0).column(0).message(String.format("At least one rule with Agenda-Group '%s' required!", requiredAgendaGroup)) + .build()); } } return customSyntaxValidation; @@ -97,7 +170,8 @@ public class DroolsSyntaxValidationService { private boolean validateAgendaGroupIsPresent(RuleFileBluePrint ruleFileBluePrint, String agendaGroupName) { - return ruleFileBluePrint.streamAllRules().anyMatch(basicRule -> basicRule.getAgendaGroup().equals(agendaGroupName)); + return ruleFileBluePrint.streamAllRules() + .anyMatch(basicRule -> basicRule.getAgendaGroup().equals(agendaGroupName)); } @@ -109,13 +183,16 @@ public class DroolsSyntaxValidationService { Set additionalImports = Sets.difference(imports, baseImports); - return additionalImports.stream().allMatch(additionalImport -> allowedImportsPattern.matcher(additionalImport).matches()); + return additionalImports.stream() + .allMatch(additionalImport -> allowedImportsPattern.matcher(additionalImport).matches()); } private static boolean validateQueryIsPresent(BasicQuery queryToCheckFor, RuleFileBluePrint ruleFileBluePrint) { - return ruleFileBluePrint.getQueries().stream().anyMatch(query -> query.getName().equals(queryToCheckFor.getName()) && query.getCode().equals(queryToCheckFor.getCode())); + return ruleFileBluePrint.getQueries() + .stream() + .anyMatch(query -> query.getName().equals(queryToCheckFor.getName()) && query.getCode().equals(queryToCheckFor.getCode())); } @@ -124,9 +201,9 @@ public class DroolsSyntaxValidationService { var versionId = System.currentTimeMillis(); var testRules = "test-rules"; KieBuilder kieBuilder = kieContainerCreationService.registerNewKieContainerVersion(testRules, - versionId, - rules.getRulesString(), - RuleFileType.valueOf(rules.getRuleFileType())); + versionId, + rules.getRulesString(), + RuleFileType.valueOf(rules.getRuleFileType())); return buildDroolsCompilerSyntaxValidation(kieBuilder); } @@ -134,14 +211,18 @@ public class DroolsSyntaxValidationService { private DroolsSyntaxValidation buildDroolsCompilerSyntaxValidation(KieBuilder kieBuilder) { List errorMessages = kieBuilder.getResults().getMessages(Message.Level.ERROR); - List droolsSyntaxErrorMessages = errorMessages.stream().map(this::buildDroolsSyntaxErrorMessage).collect(Collectors.toList()); - return DroolsSyntaxValidation.builder().droolsSyntaxErrorMessages(droolsSyntaxErrorMessages).build(); + List droolsSyntaxErrorMessages = errorMessages.stream() + .map(this::buildDroolsSyntaxErrorMessage) + .collect(Collectors.toList()); + return DroolsSyntaxValidation.builder().droolsSyntaxErrorMessages(droolsSyntaxErrorMessages) + .build(); } private DroolsSyntaxErrorMessage buildDroolsSyntaxErrorMessage(Message message) { - return DroolsSyntaxErrorMessage.builder().line(message.getLine()).column(message.getColumn()).message(message.getText()).build(); + return DroolsSyntaxErrorMessage.builder().line(message.getLine()).column(message.getColumn()).message(message.getText()) + .build(); } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/drools/files/management/services/DroolsSyntaxValidationServiceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/drools/files/management/services/DroolsSyntaxValidationServiceTest.java index ec6ab5af..27f29647 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/drools/files/management/services/DroolsSyntaxValidationServiceTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/drools/files/management/services/DroolsSyntaxValidationServiceTest.java @@ -1,5 +1,6 @@ package com.iqser.red.service.redaction.v1.server.drools.files.management.services; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -18,6 +19,7 @@ import org.springframework.core.io.ClassPathResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; import com.iqser.red.service.redaction.v1.model.RuleValidationModel; +import com.iqser.red.service.redaction.v1.server.DeprecatedElementsFinder; import com.iqser.red.service.redaction.v1.server.client.RulesClient; import com.iqser.red.service.redaction.v1.server.model.drools.RuleFileBluePrint; import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService; @@ -47,13 +49,15 @@ class DroolsSyntaxValidationServiceTest { @SneakyThrows void testRules() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); var rulesFile = new ClassPathResource("drools/rules.drl"); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -62,14 +66,16 @@ class DroolsSyntaxValidationServiceTest { @SneakyThrows void testRulesWithRemovedImportsAndChangedName() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); var rulesFile = new ClassPathResource("drools/rules.drl"); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); rulesString = rulesString.replaceAll("import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;", ""); rulesString = rulesString.replaceAll("rule \"LDS.0.0: Run local dictionary search\"", "rule \"LDS.0.0: run local dictionary search\""); DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -77,102 +83,32 @@ class DroolsSyntaxValidationServiceTest { @SneakyThrows void testRulesWithAddedImports() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); var rulesFile = new ClassPathResource("drools/rules.drl"); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - rulesString = rulesString.replaceAll("import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;", "import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;\nimport com.iqser.red.service.redaction.v1.server.service.document.EntityComparators;"); + rulesString = rulesString.replaceAll("import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;", + "import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;\nimport com.iqser.red.service.redaction.v1.server.service.document.EntityComparators;"); DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } - @Test - @SneakyThrows - void testRulesWithUnallowedAddedImports() { - - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); - var rulesFile = new ClassPathResource("drools/rules.drl"); - - String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - rulesString = rulesString.replaceAll("import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;", "import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;\nimport com.google.common.collect.Sets;"); - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); - assertFalse(droolsSyntaxValidation.isCompiled()); - } - - - @Test - @SneakyThrows - void testAllRules() { - - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); - var rulesFile = new ClassPathResource("drools/all_redact_manager_rules.drl"); - - String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); - assertTrue(droolsSyntaxValidation.isCompiled()); - } - - - @Test - @SneakyThrows - void testAcceptanceRules() { - - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); - var rulesFile = new ClassPathResource("drools/acceptance_rules.drl"); - - String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); - assertTrue(droolsSyntaxValidation.isCompiled()); - } - - - @Test - @SneakyThrows - void testManualRedactionRules() { - - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); - var rulesFile = new ClassPathResource("drools/manual_redaction_rules.drl"); - - String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); - assertTrue(droolsSyntaxValidation.isCompiled()); - } - - - @Test - @SneakyThrows - void testRulesV2() { - - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); - var rulesFile = new ClassPathResource("drools/rules_v2.drl"); - - String rulesString = new String(rulesFile.getInputStream().readAllBytes()); - - DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); - assertTrue(droolsSyntaxValidation.isCompiled()); - } - - @Test @SneakyThrows void testDocumineRules() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); var rulesFile = new ClassPathResource("drools/documine_flora.drl"); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -181,7 +117,8 @@ class DroolsSyntaxValidationServiceTest { @SneakyThrows void testCorruptedRules() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); var rulesFile = new ClassPathResource("drools/rules.drl"); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); @@ -196,12 +133,13 @@ class DroolsSyntaxValidationServiceTest { @SneakyThrows void testCorruptedImports() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); var rulesFile = new ClassPathResource("drools/rules.drl"); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); String corruptedRules = rulesString.replaceAll("import com.iqser.red.service.redaction.v1.server.model.document.nodes.ImageType;", - "import com.iqser.red.service.redaction.v1.server.model.document.nodes.ImageType;\nimport com.iqser.red.service.redaction.v1.server.model.document.nodes.SomethingElse;"); + "import com.iqser.red.service.redaction.v1.server.model.document.nodes.ImageType;\nimport com.iqser.red.service.redaction.v1.server.model.document.nodes.SomethingElse;"); DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), corruptedRules)); assertFalse(droolsSyntaxValidation.isCompiled()); @@ -212,14 +150,16 @@ class DroolsSyntaxValidationServiceTest { @SneakyThrows void testRemoveQuery() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); var rulesFile = new ClassPathResource("drools/rules.drl"); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); String corruptedRules = rulesString.replaceAll("query \"getFileAttributes\"\n.*\n *end", ""); DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), corruptedRules)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); assertFalse(droolsSyntaxValidation.isCompiled()); } @@ -228,13 +168,15 @@ class DroolsSyntaxValidationServiceTest { @SneakyThrows void testComponentDrools() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); var rulesFile = new ClassPathResource("drools/documine_flora_components.drl"); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.COMPONENT.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); assertTrue(droolsSyntaxValidation.isCompiled()); } @@ -243,13 +185,15 @@ class DroolsSyntaxValidationServiceTest { @SneakyThrows void testComponentDroolsAsEntityDrools() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); var rulesFile = new ClassPathResource("drools/documine_flora_components.drl"); String rulesString = new String(rulesFile.getInputStream().readAllBytes()); DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); - droolsSyntaxValidation.getDroolsSyntaxErrorMessages().forEach(System.out::println); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); assertFalse(droolsSyntaxValidation.isCompiled()); } @@ -259,13 +203,15 @@ class DroolsSyntaxValidationServiceTest { @Disabled void attemptImportsFixToAllRuleFiles() { - DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient)); + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); - List ruleFiles = List.of("drools/rules.drl", "drools/all_redact_manager_rules.drl", - "drools/documine_flora.drl", - "drools/manual_redaction_rules.drl", - "drools/acceptance_rules.drl", - "drools/rules_v2.drl"); + List ruleFiles = List.of("drools/rules.drl", + "drools/all_redact_manager_rules.drl", + "drools/documine_flora.drl", + "drools/manual_redaction_rules.drl", + "drools/acceptance_rules.drl", + "drools/rules_v2.drl"); for (String ruleFile : ruleFiles) { var rulesFile = new ClassPathResource(ruleFile); @@ -288,4 +234,109 @@ class DroolsSyntaxValidationServiceTest { } + + @Test + @SneakyThrows + void testRulesWithUnallowedAddedImports() { + + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); + var rulesFile = new ClassPathResource("drools/rules.drl"); + + String rulesString = new String(rulesFile.getInputStream().readAllBytes()); + rulesString = rulesString.replaceAll("import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;", + "import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;\nimport com.google.common.collect.Sets;"); + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); + assertFalse(droolsSyntaxValidation.isCompiled()); + } + + + @Test + @SneakyThrows + void testAllRules() { + + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); + var rulesFile = new ClassPathResource("drools/all_redact_manager_rules.drl"); + + String rulesString = new String(rulesFile.getInputStream().readAllBytes()); + + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); + assertTrue(droolsSyntaxValidation.isCompiled()); + } + + + @Test + @SneakyThrows + void testAcceptanceRules() { + + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); + var rulesFile = new ClassPathResource("drools/acceptance_rules.drl"); + + String rulesString = new String(rulesFile.getInputStream().readAllBytes()); + + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); + assertTrue(droolsSyntaxValidation.isCompiled()); + } + + + @Test + @SneakyThrows + void testManualRedactionRules() { + + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); + var rulesFile = new ClassPathResource("drools/manual_redaction_rules.drl"); + + String rulesString = new String(rulesFile.getInputStream().readAllBytes()); + + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); + assertTrue(droolsSyntaxValidation.isCompiled()); + } + + + @Test + @SneakyThrows + void testRulesV2() { + + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); + var rulesFile = new ClassPathResource("drools/rules_v2.drl"); + + String rulesString = new String(rulesFile.getInputStream().readAllBytes()); + + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); + assertTrue(droolsSyntaxValidation.isCompiled()); + } + + + @Test + @SneakyThrows + void testRulesWithDeprecatedFunctions() { + + DroolsSyntaxValidationService droolsSyntaxValidationService = new DroolsSyntaxValidationService(new KieContainerCreationService(rulesClient), + new DeprecatedElementsFinder()); + var rulesFile = new ClassPathResource("drools/rules.drl"); + + String rulesString = new String(rulesFile.getInputStream().readAllBytes()); + rulesString = rulesString.replaceAll(".resize\\(", ".resizeEntityAndReinsert("); + + DroolsSyntaxValidation droolsSyntaxValidation = droolsSyntaxValidationService.testRules(new RuleValidationModel(RuleFileType.ENTITY.name(), rulesString)); + droolsSyntaxValidation.getDroolsSyntaxErrorMessages() + .forEach(System.out::println); + assertTrue(droolsSyntaxValidation.isCompiled()); + assertEquals(droolsSyntaxValidation.getDroolsSyntaxDeprecatedWarnings().size(), 2); + } + } \ No newline at end of file