From 46d9ee4d73dc855a81c1f4769b398195c98ae1a2 Mon Sep 17 00:00:00 2001 From: Samuel Beniamin Date: Wed, 11 Sep 2024 16:42:31 +0200 Subject: [PATCH 1/3] [incubator-kie-issues#1474] Fix NPE when loading multiple Signavio MID --- .../signavio/MultiInstanceDecisionLogic.java | 3 + .../org/kie/dmn/signavio/SignavioTest.java | 72 +++++++++++-------- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/kie-dmn/kie-dmn-signavio/src/main/java/org/kie/dmn/signavio/MultiInstanceDecisionLogic.java b/kie-dmn/kie-dmn-signavio/src/main/java/org/kie/dmn/signavio/MultiInstanceDecisionLogic.java index d9a11187fc1..7f4c12280c3 100644 --- a/kie-dmn/kie-dmn-signavio/src/main/java/org/kie/dmn/signavio/MultiInstanceDecisionLogic.java +++ b/kie-dmn/kie-dmn-signavio/src/main/java/org/kie/dmn/signavio/MultiInstanceDecisionLogic.java @@ -132,6 +132,9 @@ public void compileEvaluator(DMNNode node, DMNCompilerImpl compiler, DMNCompiler di.setEvaluator(miEvaluator); compiler.addCallback((cCompiler, cCtx, cModel) -> { + if (cModel != model) { + return; + } MIDDependenciesProcessor processor = new MIDDependenciesProcessor(midl, cModel); addRequiredDecisions(miEvaluator, processor); removeChildElementsFromIndex(cModel, processor); diff --git a/kie-dmn/kie-dmn-signavio/src/test/java/org/kie/dmn/signavio/SignavioTest.java b/kie-dmn/kie-dmn-signavio/src/test/java/org/kie/dmn/signavio/SignavioTest.java index c9e77a9ab6e..72358f344cc 100644 --- a/kie-dmn/kie-dmn-signavio/src/test/java/org/kie/dmn/signavio/SignavioTest.java +++ b/kie-dmn/kie-dmn-signavio/src/test/java/org/kie/dmn/signavio/SignavioTest.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.kie.api.KieServices; import org.kie.api.builder.KieBuilder; @@ -37,6 +38,7 @@ import org.kie.dmn.api.core.DMNModel; import org.kie.dmn.api.core.DMNResult; import org.kie.dmn.api.core.DMNRuntime; +import org.kie.dmn.api.core.ast.DMNNode; import org.kie.dmn.model.api.DRGElement; import org.kie.dmn.model.api.Definitions; import org.slf4j.Logger; @@ -50,17 +52,17 @@ public class SignavioTest { @Test void test() { DMNRuntime runtime = createRuntime("Test_Signavio_multiple.dmn"); - + List models = runtime.getModels(); - + DMNContext context = runtime.newContext(); context.set("persons", Arrays.asList("p1", "p2")); - + DMNModel model0 = models.get(0); LOG.info("EVALUATE ALL:"); DMNResult evaluateAll = runtime.evaluateAll(model0, context); LOG.info("{}", evaluateAll); - + assertThat((List) evaluateAll.getContext().get("Greeting for each Person in Persons")).contains("Hello p1", "Hello p2"); } @@ -142,14 +144,14 @@ private void checkSurveryMID(DMNRuntime runtime, Object numbers, Object iteratin assertThat(evaluateAll.getDecisionResultByName("iterating").getResult()).isEqualTo(iterating); } - private DMNRuntime createRuntime(String modelFileName) { - final KieServices ks = KieServices.Factory.get(); + private DMNRuntime createRuntime(String... modelFileNames) { + final KieServices ks = KieServices.get(); final KieFileSystem kfs = ks.newKieFileSystem(); KieModuleModel kmm = ks.newKieModuleModel(); kmm.setConfigurationProperty("org.kie.dmn.profiles.signavio", "org.kie.dmn.signavio.KieDMNSignavioProfile"); kfs.writeKModuleXML(kmm.toXML()); - kfs.write(ks.getResources().newClassPathResource(modelFileName, this.getClass())); + Arrays.stream(modelFileNames).forEachOrdered(f -> kfs.write(ks.getResources().newClassPathResource(f, getClass()))); KieBuilder kieBuilder = ks.newKieBuilder(kfs).buildAll(); Results results = kieBuilder.getResults(); @@ -214,21 +216,21 @@ void zipFunctions() { @SuppressWarnings("unchecked") void midTakesCareOfRequirements() { DMNRuntime runtime = createRuntime("Test_SignavioMID.dmn"); - + List models = runtime.getModels(); - + DMNContext context = runtime.newContext(); context.set("numbers1", Arrays.asList(1,2)); context.set("numbers2", Arrays.asList(2,3)); - + DMNModel model0 = models.get(0); LOG.info("EVALUATE ALL:"); DMNResult evaluateAll = runtime.evaluateAll(model0, context); LOG.info("{}", evaluateAll); - + List result = (List) evaluateAll.getDecisionResultByName("calculate").getResult(); assertThat(result).hasSize(6); - + assertThat(result).doesNotContainNull(); } @@ -236,12 +238,12 @@ void midTakesCareOfRequirements() { @Test void signavioConcatFunction() { DMNRuntime runtime = createRuntime("Signavio_Concat.dmn"); - + List models = runtime.getModels(); - + DMNContext context = runtime.newContext(); context.set("listOfNames", Arrays.asList("John", "Jane", "Doe")); - + DMNModel model0 = models.get(0); LOG.info("EVALUATE ALL:"); DMNResult evaluateAll = runtime.evaluateAll(model0, context); @@ -249,20 +251,20 @@ void signavioConcatFunction() { assertThat(evaluateAll.getDecisionResultByName("concatNames").getResult()).isEqualTo("JohnJaneDoe"); } - - + + private void checkBothFunctionsAreWorking(DMNRuntime runtime) { List models = runtime.getModels(); - + DMNContext context = runtime.newContext(); context.set("names", Arrays.asList("John Doe", "Jane Doe")); context.set("ages", Arrays.asList(37, 35)); - + DMNModel model0 = models.get(0); LOG.info("EVALUATE ALL:"); DMNResult evaluateAll = runtime.evaluateAll(model0, context); LOG.info("{}", evaluateAll); - + assertThat((List) evaluateAll.getDecisionResultByName("zipvararg").getResult()).hasSize(2); assertThat((List) evaluateAll.getDecisionResultByName("zipsinglelist").getResult()).hasSize(2); } @@ -270,7 +272,7 @@ private void checkBothFunctionsAreWorking(DMNRuntime runtime) { @Test void signavioIterateMultiinstanceWithComplexInputs() { DMNRuntime runtime = createRuntime("Iterate Complex List.dmn"); - + DMNContext context = runtime.newContext(); Map johnDoe = new HashMap<>(); johnDoe.put("iD", "id-john"); @@ -279,7 +281,7 @@ void signavioIterateMultiinstanceWithComplexInputs() { alice.put("iD", "id-alice"); alice.put("name", "Alice"); context.set("customer", Collections.singletonMap("persons", Arrays.asList(johnDoe, alice))); - + DMNModel model0 = runtime.getModels().get(0); LOG.info("EVALUATE ALL:"); DMNResult evaluateAll = runtime.evaluateAll(model0, context); @@ -291,31 +293,45 @@ void signavioIterateMultiinstanceWithComplexInputs() { @Test void signavioIterateMultiinstanceMultipleDecisions() { DMNRuntime runtime = createRuntime("MID with multiple inside decisions.dmn"); - + DMNContext context = runtime.newContext(); context.set("names", Arrays.asList("John", "Alice")); - + DMNModel model0 = runtime.getModels().get(0); LOG.info("EVALUATE ALL:"); DMNResult evaluateAll = runtime.evaluateAll(model0, context); LOG.info("{}", evaluateAll); - + assertThat(evaluateAll.getDecisionResultByName("overallage").getResult()).isEqualTo(new BigDecimal("18")); } @Test void signavioIterateMultiinstanceMultipleDecisionsOutside() { DMNRuntime runtime = createRuntime("MID with outside requirement.dmn"); - + DMNContext context = runtime.newContext(); context.set("numbers", Arrays.asList(1,2,3)); context.set("operand", "PLUS"); - + DMNModel model0 = runtime.getModels().get(0); LOG.info("EVALUATE ALL:"); DMNResult evaluateAll = runtime.evaluateAll(model0, context); LOG.info("{}", evaluateAll); - + assertThat(evaluateAll.getDecisionResultByName("sumUp").getResult()).isEqualTo(new BigDecimal("6")); } + + @Test + void signavioMultiInstanceDecisionTableWithinMultipleFiles() { + DMNRuntime dmnRuntime = createRuntime("MID with outside requirement.dmn", "survey MID SUM.dmn", "Signavio_Concat.dmn"); + + List decisionNames = dmnRuntime + .getModels() + .stream() + .flatMap(dmnModel -> dmnModel.getDecisions().stream()) + .map(DMNNode::getName) + .collect(Collectors.toList()); + + assertThat(decisionNames).containsOnly("sumUp", "iterating", "determineModifier", "concatNames"); + } } From 383c93742c674672ef682b910b2dbf104861e8ea Mon Sep 17 00:00:00 2001 From: Samuel Beniamin Date: Thu, 12 Sep 2024 11:53:02 +0200 Subject: [PATCH 2/3] [incubator-kie-issues#1474] Add debugging logs for skipping MID callback --- .../org/kie/dmn/signavio/MultiInstanceDecisionLogic.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kie-dmn/kie-dmn-signavio/src/main/java/org/kie/dmn/signavio/MultiInstanceDecisionLogic.java b/kie-dmn/kie-dmn-signavio/src/main/java/org/kie/dmn/signavio/MultiInstanceDecisionLogic.java index 7f4c12280c3..542b7c3ff91 100644 --- a/kie-dmn/kie-dmn-signavio/src/main/java/org/kie/dmn/signavio/MultiInstanceDecisionLogic.java +++ b/kie-dmn/kie-dmn-signavio/src/main/java/org/kie/dmn/signavio/MultiInstanceDecisionLogic.java @@ -55,6 +55,8 @@ import org.kie.dmn.feel.runtime.functions.SumFunction; import org.kie.dmn.feel.util.NumberEvalHelper; import org.kie.dmn.model.api.DMNElement.ExtensionElements; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static java.util.Collections.emptySet; import static java.util.Collections.singleton; @@ -63,6 +65,8 @@ @XStreamAlias("MultiInstanceDecisionLogic") public class MultiInstanceDecisionLogic { + private static Logger logger = LoggerFactory.getLogger(MultiInstanceDecisionLogic.class); + @XStreamAlias("iterationExpression") private String iterationExpression; @@ -133,6 +137,9 @@ public void compileEvaluator(DMNNode node, DMNCompilerImpl compiler, DMNCompiler compiler.addCallback((cCompiler, cCtx, cModel) -> { if (cModel != model) { + if (logger.isDebugEnabled()) { + logger.debug("Skipping MID processing for imported model: {}", cModel.getName()); + } return; } MIDDependenciesProcessor processor = new MIDDependenciesProcessor(midl, cModel); From 81bed69a88d97233c247ca0c4f83960974a99ed7 Mon Sep 17 00:00:00 2001 From: Samuel Beniamin Date: Thu, 12 Sep 2024 16:04:40 +0200 Subject: [PATCH 3/3] [incubator-kie-issues#1474] Use Assertj fluent interface --- .../test/java/org/kie/dmn/signavio/SignavioTest.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/kie-dmn/kie-dmn-signavio/src/test/java/org/kie/dmn/signavio/SignavioTest.java b/kie-dmn/kie-dmn-signavio/src/test/java/org/kie/dmn/signavio/SignavioTest.java index 72358f344cc..e1088266a48 100644 --- a/kie-dmn/kie-dmn-signavio/src/test/java/org/kie/dmn/signavio/SignavioTest.java +++ b/kie-dmn/kie-dmn-signavio/src/test/java/org/kie/dmn/signavio/SignavioTest.java @@ -325,13 +325,9 @@ void signavioIterateMultiinstanceMultipleDecisionsOutside() { void signavioMultiInstanceDecisionTableWithinMultipleFiles() { DMNRuntime dmnRuntime = createRuntime("MID with outside requirement.dmn", "survey MID SUM.dmn", "Signavio_Concat.dmn"); - List decisionNames = dmnRuntime - .getModels() - .stream() - .flatMap(dmnModel -> dmnModel.getDecisions().stream()) - .map(DMNNode::getName) - .collect(Collectors.toList()); - - assertThat(decisionNames).containsOnly("sumUp", "iterating", "determineModifier", "concatNames"); + assertThat(dmnRuntime.getModels()) + .flatExtracting(DMNModel::getDecisions) + .extracting(DMNNode::getName) + .containsOnly("sumUp", "iterating", "determineModifier", "concatNames"); } }