This is an automated email from the ASF dual-hosted git repository.

gitgabrio pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new 470b9f0282 [incubator-kie-issues#1474] Fix NPE when loading multiple 
Signavio MID (#6080)
470b9f0282 is described below

commit 470b9f0282b294751d0763f6833e8c535117c681
Author: samuel-beniamin <[email protected]>
AuthorDate: Fri Sep 13 15:06:54 2024 +0200

    [incubator-kie-issues#1474] Fix NPE when loading multiple Signavio MID 
(#6080)
    
    * [incubator-kie-issues#1474] Fix NPE when loading multiple Signavio MID
    
    * [incubator-kie-issues#1474] Add debugging logs for skipping MID callback
    
    * [incubator-kie-issues#1474] Use Assertj fluent interface
---
 .../dmn/signavio/MultiInstanceDecisionLogic.java   | 10 ++++
 .../java/org/kie/dmn/signavio/SignavioTest.java    | 68 +++++++++++++---------
 2 files changed, 50 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 d9a11187fc..542b7c3ff9 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.MinFunction;
 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 @@ import static java.util.stream.Collectors.toSet;
 @XStreamAlias("MultiInstanceDecisionLogic")
 public class MultiInstanceDecisionLogic {
 
+    private static Logger logger = 
LoggerFactory.getLogger(MultiInstanceDecisionLogic.class);
+
     @XStreamAlias("iterationExpression")
     private String iterationExpression;
     
@@ -132,6 +136,12 @@ public class MultiInstanceDecisionLogic {
             di.setEvaluator(miEvaluator);
             
             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);
                 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 c9e77a9ab6..e1088266a4 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.HashMap;
 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.DMNContext;
 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<DMNModel> 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<String>) evaluateAll.getContext().get("Greeting for 
each Person in Persons")).contains("Hello p1", "Hello p2");
     }
 
@@ -142,14 +144,14 @@ public class SignavioTest {
         
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 @@ public class SignavioTest {
     @SuppressWarnings("unchecked")
     void midTakesCareOfRequirements() {
         DMNRuntime runtime = createRuntime("Test_SignavioMID.dmn");
-    
+
         List<DMNModel> 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<Object> result = (List<Object>) 
evaluateAll.getDecisionResultByName("calculate").getResult();
         assertThat(result).hasSize(6);
-        
+
         assertThat(result).doesNotContainNull();
     }
 
@@ -236,12 +238,12 @@ public class SignavioTest {
     @Test
     void signavioConcatFunction() {
         DMNRuntime runtime = createRuntime("Signavio_Concat.dmn");
-        
+
         List<DMNModel> 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 @@ public class SignavioTest {
 
         
assertThat(evaluateAll.getDecisionResultByName("concatNames").getResult()).isEqualTo("JohnJaneDoe");
     }
-    
-    
+
+
     private void checkBothFunctionsAreWorking(DMNRuntime runtime) {
         List<DMNModel> 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 @@ public class SignavioTest {
     @Test
     void signavioIterateMultiinstanceWithComplexInputs() {
         DMNRuntime runtime = createRuntime("Iterate Complex List.dmn");
-        
+
         DMNContext context = runtime.newContext();
         Map<String, Object> johnDoe = new HashMap<>();
         johnDoe.put("iD", "id-john");
@@ -279,7 +281,7 @@ public class SignavioTest {
         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,41 @@ public class SignavioTest {
     @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");
+
+        assertThat(dmnRuntime.getModels())
+                .flatExtracting(DMNModel::getDecisions)
+                .extracting(DMNNode::getName)
+                .containsOnly("sumUp", "iterating", "determineModifier", 
"concatNames");
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to