From 6fbd51c279d137e34b38d13a1045f83c48a8e352 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Wed, 19 Feb 2025 11:30:02 +0530 Subject: [PATCH 01/13] TestCases for DMNCompilerImpl class --- .../core/compiler/DMNCompilerImplTest.java | 118 ++++++++++++++++-- 1 file changed, 110 insertions(+), 8 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java index bc11d10e568..26c6d0ae3b9 100644 --- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java +++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java @@ -18,29 +18,51 @@ */ package org.kie.dmn.core.compiler; + +import org.drools.io.ClassPathResource; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.kie.dmn.model.api.DMNElementReference; -import org.kie.dmn.model.api.Definitions; -import org.kie.dmn.model.api.InformationRequirement; -import org.kie.dmn.model.v1_5.TDMNElementReference; -import org.kie.dmn.model.v1_5.TDefinitions; -import org.kie.dmn.model.v1_5.TInformationRequirement; +import org.junit.jupiter.api.extension.ExtendWith; +import org.kie.api.io.Resource; +import org.kie.dmn.api.core.DMNCompiler; +import org.kie.dmn.api.core.DMNModel; + +import org.kie.dmn.model.api.*; +import org.kie.dmn.model.v1_5.*; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.*; +import java.util.*; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType; +@ExtendWith(MockitoExtension.class) class DMNCompilerImplTest { + private static DMNCompiler dMNCompiler; + + private static List drgCompilers = new ArrayList<>(); + { + drgCompilers.add( new InputDataCompiler() ); + drgCompilers.add( new BusinessKnowledgeModelCompiler() ); + drgCompilers.add( new DecisionCompiler() ); + drgCompilers.add( new DecisionServiceCompiler() ); + drgCompilers.add( new KnowledgeSourceCompiler() ); // keep last as it's a void compiler + } + private static final String nameSpace = "http://www.montera.com.au/spec/DMN/local-hrefs"; private static Definitions parent; @BeforeAll - static void setup() { + static void setup() throws IOException { String modelName = "LocalHrefs"; parent = new TDefinitions(); parent.setName(modelName); parent.setNamespace(nameSpace); + + dMNCompiler = new DMNCompilerImpl(); } @Test @@ -76,4 +98,84 @@ void getRootElement() { retrieved = DMNCompilerImpl.getRootElement(elementReference); assertThat(retrieved).isNotNull().isEqualTo(parent); } -} \ No newline at end of file + + @Test + void compileTest() { + List dmnModels = new ArrayList<>(); + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Sample.dmn", + this.getClass()); + DMNModel model = dMNCompiler.compile( resource, dmnModels); + assertThat(model).isNotNull(); + } + + @Test + void compileTestWithInvalidModelImports() { + List dmnModels = new ArrayList<>(); + String nameSpace = "https://kie.apache.org/dmn/_857FE424-BEDA-4772-AB8E-2F4CDDB864AB"; + String modelName = "loan_pre_qualification"; + String importType = String.valueOf(ImportDMNResolverUtil.ImportType.DMN); + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Sample.dmn", + this.getClass()); + DMNModel model = dMNCompiler.compile( resource, dmnModels); + assertThat(model).isNotNull(); + Definitions dmnDefn = model.getDefinitions(); + addImport(dmnDefn, importType, nameSpace, modelName); + dmnModels.add(model); + model = dMNCompiler.compile(dmnDefn, resource, dmnModels); + assertThat(model).isNotNull(); + + } + + @Test + void compileTestWithDmnModelImports() { + List dmnModels = new ArrayList<>(); + String nameSpace = "https://kie.apache.org/dmn/_857FE424-BEDA-4772-AB8E-2F4CDDB864AB"; + String modelName = "loan_pre_qualification"; + String URI_DMN = "http://www.omg.org/spec/DMN/20180521/MODEL/"; + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Sample.dmn", + this.getClass()); + DMNModel model = dMNCompiler.compile( resource, dmnModels); + assertThat(model).isNotNull(); + Definitions dmnDefn = model.getDefinitions(); + addImport(dmnDefn, URI_DMN, nameSpace, modelName); + + dmnModels.add(model); + model = dMNCompiler.compile(dmnDefn, resource, dmnModels); + assertThat(model).isNotNull(); + } + + @Test + void compileTestWithPmmlModelImports() { + List dmnModels = new ArrayList<>(); + String nameSpace = "https://github.com/kiegroup/drools/kie-dmn/_A4BCA8B8-CF08-433F-93B2-A2598F19ECFF"; + String modelName = "Traffic Violation"; + String location_pmml = "http://www.dmg.org/PMML-4_3"; + //String URI_DMN = "http://www.omg.org/spec/DMN/20180521/MODEL/"; + Resource resource = new ClassPathResource( "valid_models/DMNv1_x/Traffic Violation.dmn", + this.getClass()); + DMNModel model = dMNCompiler.compile( resource, dmnModels); + assertThat(model).isNotNull(); + Definitions dmnDefs = model.getDefinitions(); + addImport(dmnDefs, location_pmml, nameSpace, modelName); + + dmnModels.add(model); + model = dMNCompiler.compile(dmnDefs, resource, dmnModels); + assertThat(model).isNotNull(); + } + + private void addImport(Definitions dmnDefs, String importType, String nameSpace, String modelName) { + dmnDefs.setName(modelName); + Import import1 = new TImport(); + import1.setNamespace(nameSpace); + import1.setName(modelName); + import1.setImportType(importType); + import1.setParent(dmnDefs); + import1.setLocationURI(importType); + dmnDefs.getImport().add(import1); + } + +} + + + + From c952e1959541c0d63e784661126c25e4ad695e82 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Thu, 20 Feb 2025 16:47:57 +0530 Subject: [PATCH 02/13] TestCases for DMNCompilerImpl class --- .../core/compiler/DMNCompilerImplTest.java | 92 ++++++++++--------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java index 26c6d0ae3b9..eb9411b5db7 100644 --- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java +++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java @@ -1,5 +1,5 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one + + /* Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file @@ -22,14 +22,15 @@ import org.drools.io.ClassPathResource; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.kie.api.io.Resource; import org.kie.dmn.api.core.DMNCompiler; +import org.kie.dmn.api.core.DMNMessageType; import org.kie.dmn.api.core.DMNModel; import org.kie.dmn.model.api.*; import org.kie.dmn.model.v1_5.*; -import org.mockito.junit.jupiter.MockitoExtension; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.*; import java.util.*; @@ -38,20 +39,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType; -@ExtendWith(MockitoExtension.class) class DMNCompilerImplTest { - private static DMNCompiler dMNCompiler; - - private static List drgCompilers = new ArrayList<>(); - { - drgCompilers.add( new InputDataCompiler() ); - drgCompilers.add( new BusinessKnowledgeModelCompiler() ); - drgCompilers.add( new DecisionCompiler() ); - drgCompilers.add( new DecisionServiceCompiler() ); - drgCompilers.add( new KnowledgeSourceCompiler() ); // keep last as it's a void compiler - } + public static final Logger LOG = LoggerFactory.getLogger(DMNCompilerImplTest.class); + private static DMNCompiler dMNCompiler; private static final String nameSpace = "http://www.montera.com.au/spec/DMN/local-hrefs"; private static Definitions parent; @@ -100,21 +92,25 @@ void getRootElement() { } @Test - void compileTest() { + void compileTestWithDefinition() { List dmnModels = new ArrayList<>(); - Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Sample.dmn", + //imported model - Imported_Model_Unamed.dmn + String nameSpace = "http://www.trisotech.com/dmn/definitions/_f27bb64b-6fc7-4e1f-9848-11ba35e0df44"; + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Imported_Model_Unamed.dmn", this.getClass()); - DMNModel model = dMNCompiler.compile( resource, dmnModels); - assertThat(model).isNotNull(); + DMNModel importedModel = dMNCompiler.compile( resource, dmnModels); + assertThat(importedModel).isNotNull(); + assertThat(importedModel.getNamespace()).isNotNull().isEqualTo(nameSpace); + assertThat(importedModel.getMessages()).isEmpty(); } @Test - void compileTestWithInvalidModelImports() { + void compileTestWithUnknownModelImports() { List dmnModels = new ArrayList<>(); - String nameSpace = "https://kie.apache.org/dmn/_857FE424-BEDA-4772-AB8E-2F4CDDB864AB"; - String modelName = "loan_pre_qualification"; - String importType = String.valueOf(ImportDMNResolverUtil.ImportType.DMN); - Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Sample.dmn", + String nameSpace = "http://www.trisotech.com/dmn/definitions/_f27bb64b-6fc7-4e1f-9848-11ba35e0df44"; + String modelName = "Imported Model"; + String importType = String.valueOf(ImportDMNResolverUtil.ImportType.UNKNOWN); + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Imported_Model_Unamed.dmn", this.getClass()); DMNModel model = dMNCompiler.compile( resource, dmnModels); assertThat(model).isNotNull(); @@ -123,44 +119,50 @@ void compileTestWithInvalidModelImports() { dmnModels.add(model); model = dMNCompiler.compile(dmnDefn, resource, dmnModels); assertThat(model).isNotNull(); + assertThat(model.getName()).isNotNull().isEqualTo(modelName); + assertThat(model.getMessages()).isNotEmpty(); + assertThat(model.getMessages().get(0).getText()).isEqualTo("DMN: Import type unknown: 'UNKNOWN'. (Invalid FEEL syntax on the referenced expression) "); } @Test - void compileTestWithDmnModelImports() { + void compileTestWithImportingDmnModel() { List dmnModels = new ArrayList<>(); - String nameSpace = "https://kie.apache.org/dmn/_857FE424-BEDA-4772-AB8E-2F4CDDB864AB"; - String modelName = "loan_pre_qualification"; - String URI_DMN = "http://www.omg.org/spec/DMN/20180521/MODEL/"; - Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Sample.dmn", + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Imported_Model_Unamed.dmn", this.getClass()); - DMNModel model = dMNCompiler.compile( resource, dmnModels); - assertThat(model).isNotNull(); - Definitions dmnDefn = model.getDefinitions(); - addImport(dmnDefn, URI_DMN, nameSpace, modelName); + DMNModel importedModel = dMNCompiler.compile( resource, dmnModels); + assertThat(importedModel).isNotNull(); + dmnModels.add(importedModel); - dmnModels.add(model); - model = dMNCompiler.compile(dmnDefn, resource, dmnModels); - assertThat(model).isNotNull(); + //imported model - Importing_Named_Model.dmn + String nameSpace = "http://www.trisotech.com/dmn/definitions/_f79aa7a4-f9a3-410a-ac95-bea496edabgc"; + resource = new ClassPathResource( "valid_models/DMNv1_5/Importing_Named_Model.dmn", + this.getClass()); + + DMNModel importingModel = dMNCompiler.compile(resource, dmnModels); + assertThat(importingModel).isNotNull(); + assertThat(importingModel.getNamespace()).isNotNull().isEqualTo(nameSpace); + assertThat(importingModel.getMessages()).isEmpty(); } @Test - void compileTestWithPmmlModelImports() { + void compileImportingModelTestWithErrors() { List dmnModels = new ArrayList<>(); - String nameSpace = "https://github.com/kiegroup/drools/kie-dmn/_A4BCA8B8-CF08-433F-93B2-A2598F19ECFF"; - String modelName = "Traffic Violation"; - String location_pmml = "http://www.dmg.org/PMML-4_3"; - //String URI_DMN = "http://www.omg.org/spec/DMN/20180521/MODEL/"; - Resource resource = new ClassPathResource( "valid_models/DMNv1_x/Traffic Violation.dmn", + String modelName = "Importing named Model"; + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Importing_Named_Model.dmn", this.getClass()); DMNModel model = dMNCompiler.compile( resource, dmnModels); assertThat(model).isNotNull(); - Definitions dmnDefs = model.getDefinitions(); - addImport(dmnDefs, location_pmml, nameSpace, modelName); + assertThat(model.getName()).isNotNull().isEqualTo(modelName); + Definitions dmnDefn = model.getDefinitions(); dmnModels.add(model); - model = dMNCompiler.compile(dmnDefs, resource, dmnModels); + model = dMNCompiler.compile(dmnDefn, resource, dmnModels); assertThat(model).isNotNull(); + assertThat(model.getName()).isNotNull().isEqualTo(modelName); + assertThat(model.getMessages()).isNotEmpty(); + assertThat(model.getMessages().get(0).getMessageType()).isEqualTo(DMNMessageType.IMPORT_NOT_FOUND); + } private void addImport(Definitions dmnDefs, String importType, String nameSpace, String modelName) { From 3bc52b9271c62658f40de42c8938fe81cd6539b9 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Fri, 21 Feb 2025 16:11:16 +0530 Subject: [PATCH 03/13] TestCases for DMNCompilerImpl class - changes in assertions --- .../java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java index eb9411b5db7..5801503cad5 100644 --- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java +++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java @@ -84,8 +84,9 @@ void getRootElement() { InformationRequirement informationRequirement = new TInformationRequirement(); elementReference.setParent(informationRequirement); - assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> DMNCompilerImpl.getRootElement(elementReference)); - + assertThatExceptionOfType(RuntimeException.class).isThrownBy( + () -> DMNCompilerImpl.getRootElement(elementReference)).withMessageContaining + ("Failed to get Definitions parent for org.kie.dmn.model.v1_5"); informationRequirement.setParent(parent); retrieved = DMNCompilerImpl.getRootElement(elementReference); assertThat(retrieved).isNotNull().isEqualTo(parent); @@ -94,7 +95,6 @@ void getRootElement() { @Test void compileTestWithDefinition() { List dmnModels = new ArrayList<>(); - //imported model - Imported_Model_Unamed.dmn String nameSpace = "http://www.trisotech.com/dmn/definitions/_f27bb64b-6fc7-4e1f-9848-11ba35e0df44"; Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Imported_Model_Unamed.dmn", this.getClass()); From e9f25ca6d6917a1dc337edf5ae8b270a5cc8069b Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Fri, 21 Feb 2025 16:12:10 +0530 Subject: [PATCH 04/13] TestCases for DMNCompilerImpl class - changes in assertions --- .../java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java index 5801503cad5..d170d3e85e9 100644 --- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java +++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java @@ -32,7 +32,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.*; import java.util.*; import java.util.List; @@ -48,7 +47,7 @@ class DMNCompilerImplTest { private static Definitions parent; @BeforeAll - static void setup() throws IOException { + static void setup() { String modelName = "LocalHrefs"; parent = new TDefinitions(); parent.setName(modelName); From 91ecdbd90256ac6e76a2a3d5eeebbe2155d5d12d Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Mon, 24 Feb 2025 11:10:29 +0530 Subject: [PATCH 05/13] Changing Testcase names --- .../org/kie/dmn/core/compiler/DMNCompilerImplTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java index d170d3e85e9..eac7bfaf53e 100644 --- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java +++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java @@ -92,7 +92,7 @@ void getRootElement() { } @Test - void compileTestWithDefinition() { + void compile() { List dmnModels = new ArrayList<>(); String nameSpace = "http://www.trisotech.com/dmn/definitions/_f27bb64b-6fc7-4e1f-9848-11ba35e0df44"; Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Imported_Model_Unamed.dmn", @@ -104,7 +104,7 @@ void compileTestWithDefinition() { } @Test - void compileTestWithUnknownModelImports() { + void compileWithUnknownTypeModelImports() { List dmnModels = new ArrayList<>(); String nameSpace = "http://www.trisotech.com/dmn/definitions/_f27bb64b-6fc7-4e1f-9848-11ba35e0df44"; String modelName = "Imported Model"; @@ -125,7 +125,7 @@ void compileTestWithUnknownModelImports() { } @Test - void compileTestWithImportingDmnModel() { + void compileWithImportingDmnModel() { List dmnModels = new ArrayList<>(); Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Imported_Model_Unamed.dmn", this.getClass()); @@ -145,7 +145,7 @@ void compileTestWithImportingDmnModel() { } @Test - void compileImportingModelTestWithErrors() { + void compileImportingModelWithoutImportedModel() { List dmnModels = new ArrayList<>(); String modelName = "Importing named Model"; Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Importing_Named_Model.dmn", From 9eee2d859b6f43d74852453fe6d86582ee2f8935 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Mon, 24 Feb 2025 23:22:34 +0530 Subject: [PATCH 06/13] Refactoring Compile method --- .../dmn/core/compiler/DMNCompilerImpl.java | 84 ++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java index 4b6db70be71..d64b666d1d9 100644 --- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java +++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java @@ -203,7 +203,7 @@ public DMNModel compile(Definitions dmndefs, Resource resource, Collection dmnModels, Resource resource, Function relativeResolver) { + public DMNModel compileOld123(Definitions dmndefs, Collection dmnModels, Resource resource, Function relativeResolver) { if (dmndefs == null) { return null; } @@ -265,6 +265,88 @@ public DMNModel compile(Definitions dmndefs, Collection dmnModels, Res return model; } + public DMNModel compile(Definitions dmndefs, Collection dmnModels, Resource resource, Function relativeResolver) { + if (dmndefs == null) { + return null; + } + DMNModelImpl model = new DMNModelImpl(dmndefs, resource); + List toMerge = new ArrayList<>(); + DMNCompilerContext ctx = configureDMNCompiler(model, relativeResolver); + if (!dmndefs.getImport().isEmpty()) { + iterateImports(dmndefs, dmnModels, model, relativeResolver, toMerge ); + } + toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); + processItemDefinitions(ctx, model, dmndefs); + processDrgElements(ctx, model, dmndefs); + return model; + } + + private DMNCompilerContext configureDMNCompiler(DMNModelImpl model, Function relativeResolver) { + model.setRuntimeTypeCheck(((DMNCompilerConfigurationImpl) dmnCompilerConfig).getOption(RuntimeTypeCheckOption.class).isRuntimeTypeCheck()); + DMNCompilerConfigurationImpl cc = (DMNCompilerConfigurationImpl) dmnCompilerConfig; + List helperFEELProfiles = cc.getFeelProfiles(); + DMNFEELHelper feel = new DMNFEELHelper(cc.getRootClassLoader(), helperFEELProfiles, model.getFeelDialect()); + DMNCompilerContext ctx = new DMNCompilerContext(feel); + ctx.setRelativeResolver(relativeResolver); + return ctx; + } + + private void iterateImports(Definitions dmndefs, Collection dmnModels, DMNModelImpl model, Function relativeResolver, List toMerge ) { + for (Import i : dmndefs.getImport()) { + if (ImportDMNResolverUtil.whichImportType(i) == ImportType.DMN) { + resolveDMNImportType(i, dmnModels, model, toMerge); + } else if (ImportDMNResolverUtil.whichImportType(i) == ImportType.PMML) { + processPMMLImport(model, i, relativeResolver); + model.setImportAliasForNS(i.getName(), i.getNamespace(), i.getName()); + } else { + logErrorMessage(model, i.getImportType()); + } + } + } + + private void resolveDMNImportType(Import i, Collection dmnModels, DMNModelImpl model, List toMerge) { + Either resolvedResult = ImportDMNResolverUtil.resolveImportDMN(i, dmnModels, (DMNModel m) -> new QName(m.getNamespace(), m.getName())); + DMNModel located = resolvedResult.cata(msg -> { + MsgUtil.reportMessage(logger, + DMNMessage.Severity.ERROR, + i, + model, + null, + null, + Msg.IMPORT_NOT_FOUND_FOR_NODE, + msg, + i); + return null; + }, Function.identity()); + checkLocatedDMNModel(i, located, model, toMerge); + } + + private void logErrorMessage(DMNModelImpl model, String importType) { + MsgUtil.reportMessage(logger, + DMNMessage.Severity.ERROR, + null, + model, + null, + null, + Msg.IMPORT_TYPE_UNKNOWN, + importType); + } + + private void checkLocatedDMNModel(Import i, DMNModel located, DMNModelImpl model, List toMerge) { + if (located != null) { + String iAlias = Optional.ofNullable(i.getName()).orElse(located.getName()); + // incubator-kie-issues#852: The idea is to not treat the anonymous models as import, but to "merge" them + // with original one, + // because otherwise we would have to deal with clashing name aliases, or similar issues + if (iAlias != null && !iAlias.isEmpty()) { + model.setImportAliasForNS(iAlias, located.getNamespace(), located.getName()); + importFromModel(model, located, iAlias); + } else { + toMerge.add(located); + } + } + } + private void processPMMLImport(DMNModelImpl model, Import i, Function relativeResolver) { ClassLoader rootClassLoader = ((DMNCompilerConfigurationImpl) dmnCompilerConfig).getRootClassLoader(); Resource relativeResource = resolveRelativeResource(rootClassLoader, model, i, i, relativeResolver); From d540eceadb142a12881faf5aca8e8b24d2629da9 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Mon, 24 Feb 2025 23:27:13 +0530 Subject: [PATCH 07/13] Refactoring Compile method --- .../main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java index d64b666d1d9..6fdcc347bc2 100644 --- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java +++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java @@ -203,7 +203,7 @@ public DMNModel compile(Definitions dmndefs, Resource resource, Collection dmnModels, Resource resource, Function relativeResolver) { + public DMNModel compileOldd123(Definitions dmndefs, Collection dmnModels, Resource resource, Function relativeResolver) { if (dmndefs == null) { return null; } From 459a6052f0eed07f5c7efa96e6f7b1f4e1cb6de7 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Tue, 25 Feb 2025 14:20:21 +0530 Subject: [PATCH 08/13] Refactoring Compile method --- .../dmn/core/compiler/DMNCompilerImpl.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java index 6fdcc347bc2..4815e5b5fa0 100644 --- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java +++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java @@ -44,6 +44,7 @@ import javax.xml.namespace.QName; +import org.codehaus.plexus.util.CollectionUtils; import org.drools.io.FileSystemResource; import org.kie.api.io.Resource; import org.kie.dmn.api.core.DMNCompiler; @@ -270,12 +271,12 @@ public DMNModel compile(Definitions dmndefs, Collection dmnModels, Res return null; } DMNModelImpl model = new DMNModelImpl(dmndefs, resource); - List toMerge = new ArrayList<>(); + //List toMerge = new ArrayList<>(); DMNCompilerContext ctx = configureDMNCompiler(model, relativeResolver); if (!dmndefs.getImport().isEmpty()) { - iterateImports(dmndefs, dmnModels, model, relativeResolver, toMerge ); + iterateImports(dmndefs, dmnModels, model, relativeResolver ); } - toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); + //toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); processItemDefinitions(ctx, model, dmndefs); processDrgElements(ctx, model, dmndefs); return model; @@ -291,10 +292,10 @@ private DMNCompilerContext configureDMNCompiler(DMNModelImpl model, Function dmnModels, DMNModelImpl model, Function relativeResolver, List toMerge ) { + private void iterateImports(Definitions dmndefs, Collection dmnModels, DMNModelImpl model, Function relativeResolver ) { for (Import i : dmndefs.getImport()) { if (ImportDMNResolverUtil.whichImportType(i) == ImportType.DMN) { - resolveDMNImportType(i, dmnModels, model, toMerge); + resolveDMNImportType(i, dmnModels, model ); } else if (ImportDMNResolverUtil.whichImportType(i) == ImportType.PMML) { processPMMLImport(model, i, relativeResolver); model.setImportAliasForNS(i.getName(), i.getNamespace(), i.getName()); @@ -304,7 +305,7 @@ private void iterateImports(Definitions dmndefs, Collection dmnModels, } } - private void resolveDMNImportType(Import i, Collection dmnModels, DMNModelImpl model, List toMerge) { + static void resolveDMNImportType(Import i, Collection dmnModels, DMNModelImpl model) { Either resolvedResult = ImportDMNResolverUtil.resolveImportDMN(i, dmnModels, (DMNModel m) -> new QName(m.getNamespace(), m.getName())); DMNModel located = resolvedResult.cata(msg -> { MsgUtil.reportMessage(logger, @@ -318,7 +319,11 @@ private void resolveDMNImportType(Import i, Collection dmnModels, DMNM i); return null; }, Function.identity()); - checkLocatedDMNModel(i, located, model, toMerge); + List toMerge = checkLocatedDMNModel(i, located, model); + if(!toMerge.isEmpty()) { + toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); + } + } private void logErrorMessage(DMNModelImpl model, String importType) { @@ -332,7 +337,8 @@ private void logErrorMessage(DMNModelImpl model, String importType) { importType); } - private void checkLocatedDMNModel(Import i, DMNModel located, DMNModelImpl model, List toMerge) { + static List checkLocatedDMNModel(Import i, DMNModel located, DMNModelImpl model) { + List toMerge = new ArrayList<>(); if (located != null) { String iAlias = Optional.ofNullable(i.getName()).orElse(located.getName()); // incubator-kie-issues#852: The idea is to not treat the anonymous models as import, but to "merge" them @@ -345,6 +351,7 @@ private void checkLocatedDMNModel(Import i, DMNModel located, DMNModelImpl model toMerge.add(located); } } + return toMerge; } private void processPMMLImport(DMNModelImpl model, Import i, Function relativeResolver) { @@ -430,7 +437,7 @@ protected static URI resolveRelativeURI(DMNModelImpl model, String relative) thr } } - private void importFromModel(DMNModelImpl model, DMNModel m, String iAlias) { + static void importFromModel(DMNModelImpl model, DMNModel m, String iAlias) { model.addImportChainChild(((DMNModelImpl) m).getImportChain(), iAlias); for (ItemDefNode idn : m.getItemDefinitions()) { model.getTypeRegistry().registerType(idn.getType()); From 5f830acd74bef4d883adbc0be20bb3ac76d2bbe6 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Wed, 26 Feb 2025 16:42:46 +0530 Subject: [PATCH 09/13] Refactoring Compile method-Incorporating review comments, code cleanup --- .../dmn/core/compiler/DMNCompilerImpl.java | 88 +++---------------- 1 file changed, 11 insertions(+), 77 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java index 4815e5b5fa0..15a594f1600 100644 --- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java +++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java @@ -204,98 +204,36 @@ public DMNModel compile(Definitions dmndefs, Resource resource, Collection dmnModels, Resource resource, Function relativeResolver) { - if (dmndefs == null) { - return null; - } - DMNModelImpl model = new DMNModelImpl(dmndefs, resource); - model.setRuntimeTypeCheck(((DMNCompilerConfigurationImpl) dmnCompilerConfig).getOption(RuntimeTypeCheckOption.class).isRuntimeTypeCheck()); - DMNCompilerConfigurationImpl cc = (DMNCompilerConfigurationImpl) dmnCompilerConfig; - List helperFEELProfiles = cc.getFeelProfiles(); - DMNFEELHelper feel = new DMNFEELHelper(cc.getRootClassLoader(), helperFEELProfiles, model.getFeelDialect()); - DMNCompilerContext ctx = new DMNCompilerContext(feel); - ctx.setRelativeResolver(relativeResolver); - List toMerge = new ArrayList<>(); - if (!dmndefs.getImport().isEmpty()) { - for (Import i : dmndefs.getImport()) { - if (ImportDMNResolverUtil.whichImportType(i) == ImportType.DMN) { - Either resolvedResult = ImportDMNResolverUtil.resolveImportDMN(i, dmnModels, (DMNModel m) -> new QName(m.getNamespace(), m.getName())); - DMNModel located = resolvedResult.cata(msg -> { - MsgUtil.reportMessage(logger, - DMNMessage.Severity.ERROR, - i, - model, - null, - null, - Msg.IMPORT_NOT_FOUND_FOR_NODE, - msg, - i); - return null; - }, Function.identity()); - if (located != null) { - String iAlias = Optional.ofNullable(i.getName()).orElse(located.getName()); - // incubator-kie-issues#852: The idea is to not treat the anonymous models as import, but to "merge" them - // with original one, - // because otherwise we would have to deal with clashing name aliases, or similar issues - if (iAlias != null && !iAlias.isEmpty()) { - model.setImportAliasForNS(iAlias, located.getNamespace(), located.getName()); - importFromModel(model, located, iAlias); - } else { - toMerge.add(located); - } - } - } else if (ImportDMNResolverUtil.whichImportType(i) == ImportType.PMML) { - processPMMLImport(model, i, relativeResolver); - model.setImportAliasForNS(i.getName(), i.getNamespace(), i.getName()); - } else { - MsgUtil.reportMessage(logger, - DMNMessage.Severity.ERROR, - null, - model, - null, - null, - Msg.IMPORT_TYPE_UNKNOWN, - i.getImportType()); - } - } - } - - toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); - processItemDefinitions(ctx, model, dmndefs); - processDrgElements(ctx, model, dmndefs); - return model; - } - public DMNModel compile(Definitions dmndefs, Collection dmnModels, Resource resource, Function relativeResolver) { if (dmndefs == null) { return null; } DMNModelImpl model = new DMNModelImpl(dmndefs, resource); - //List toMerge = new ArrayList<>(); - DMNCompilerContext ctx = configureDMNCompiler(model, relativeResolver); + model.setRuntimeTypeCheck(((DMNCompilerConfigurationImpl) dmnCompilerConfig).getOption(RuntimeTypeCheckOption.class).isRuntimeTypeCheck()); + DMNCompilerContext ctx = configureDMNCompiler(model.getFeelDialect(), relativeResolver); if (!dmndefs.getImport().isEmpty()) { iterateImports(dmndefs, dmnModels, model, relativeResolver ); } - //toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); processItemDefinitions(ctx, model, dmndefs); processDrgElements(ctx, model, dmndefs); return model; } - private DMNCompilerContext configureDMNCompiler(DMNModelImpl model, Function relativeResolver) { - model.setRuntimeTypeCheck(((DMNCompilerConfigurationImpl) dmnCompilerConfig).getOption(RuntimeTypeCheckOption.class).isRuntimeTypeCheck()); + private DMNCompilerContext configureDMNCompiler(FEELDialect feeldialect, Function relativeResolver) { + DMNCompilerConfigurationImpl cc = (DMNCompilerConfigurationImpl) dmnCompilerConfig; List helperFEELProfiles = cc.getFeelProfiles(); - DMNFEELHelper feel = new DMNFEELHelper(cc.getRootClassLoader(), helperFEELProfiles, model.getFeelDialect()); + DMNFEELHelper feel = new DMNFEELHelper(cc.getRootClassLoader(), helperFEELProfiles, feeldialect); DMNCompilerContext ctx = new DMNCompilerContext(feel); ctx.setRelativeResolver(relativeResolver); return ctx; } private void iterateImports(Definitions dmndefs, Collection dmnModels, DMNModelImpl model, Function relativeResolver ) { + List toMerge = new ArrayList<>(); for (Import i : dmndefs.getImport()) { if (ImportDMNResolverUtil.whichImportType(i) == ImportType.DMN) { - resolveDMNImportType(i, dmnModels, model ); + resolveDMNImportType(i, dmnModels, model, toMerge ); } else if (ImportDMNResolverUtil.whichImportType(i) == ImportType.PMML) { processPMMLImport(model, i, relativeResolver); model.setImportAliasForNS(i.getName(), i.getNamespace(), i.getName()); @@ -303,9 +241,10 @@ private void iterateImports(Definitions dmndefs, Collection dmnModels, logErrorMessage(model, i.getImportType()); } } + toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); } - static void resolveDMNImportType(Import i, Collection dmnModels, DMNModelImpl model) { + static void resolveDMNImportType(Import i, Collection dmnModels, DMNModelImpl model, List toMerge) { Either resolvedResult = ImportDMNResolverUtil.resolveImportDMN(i, dmnModels, (DMNModel m) -> new QName(m.getNamespace(), m.getName())); DMNModel located = resolvedResult.cata(msg -> { MsgUtil.reportMessage(logger, @@ -319,10 +258,7 @@ static void resolveDMNImportType(Import i, Collection dmnModels, DMNMo i); return null; }, Function.identity()); - List toMerge = checkLocatedDMNModel(i, located, model); - if(!toMerge.isEmpty()) { - toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); - } + checkLocatedDMNModel(i, located, model, toMerge); } @@ -337,8 +273,7 @@ private void logErrorMessage(DMNModelImpl model, String importType) { importType); } - static List checkLocatedDMNModel(Import i, DMNModel located, DMNModelImpl model) { - List toMerge = new ArrayList<>(); + static void checkLocatedDMNModel(Import i, DMNModel located, DMNModelImpl model, List toMerge) { if (located != null) { String iAlias = Optional.ofNullable(i.getName()).orElse(located.getName()); // incubator-kie-issues#852: The idea is to not treat the anonymous models as import, but to "merge" them @@ -351,7 +286,6 @@ static List checkLocatedDMNModel(Import i, DMNModel located, DMNModelI toMerge.add(located); } } - return toMerge; } private void processPMMLImport(DMNModelImpl model, Import i, Function relativeResolver) { From 6c2886352f46f8b092fc1c28fc42ceb7c3f36e99 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Thu, 27 Feb 2025 18:15:11 +0530 Subject: [PATCH 10/13] Test cases for refactored method --- .../core/compiler/DMNCompilerImplTest.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java index eac7bfaf53e..8d9e22abac8 100644 --- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java +++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java @@ -27,6 +27,7 @@ import org.kie.dmn.api.core.DMNMessageType; import org.kie.dmn.api.core.DMNModel; +import org.kie.dmn.core.impl.DMNModelImpl; import org.kie.dmn.model.api.*; import org.kie.dmn.model.v1_5.*; import org.slf4j.Logger; @@ -164,6 +165,74 @@ void compileImportingModelWithoutImportedModel() { } + @Test + void resolveDMNImportType() { + List toMerge = new ArrayList<>(); + List dmnModels = new ArrayList<>(); + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Imported_Model_Unamed.dmn", + this.getClass()); + DMNModel importedModel = dMNCompiler.compile( resource, dmnModels); + assertThat(importedModel).isNotNull(); + dmnModels.add(importedModel); + + //imported model - Importing_Named_Model.dmn + String nameSpace = "http://www.trisotech.com/dmn/definitions/_f79aa7a4-f9a3-410a-ac95-bea496edabgc"; + resource = new ClassPathResource( "valid_models/DMNv1_5/Importing_Named_Model.dmn", + this.getClass()); + DMNModel importingModel = dMNCompiler.compile(resource, dmnModels); + assertThat(importingModel).isNotNull(); + assertThat(importingModel.getNamespace()).isNotNull().isEqualTo(nameSpace); + assertThat(importingModel.getMessages()).isEmpty(); + + Import input = importingModel.getDefinitions().getImport().get(0); + DMNModelImpl model = new DMNModelImpl(importingModel.getDefinitions(), resource); + DMNCompilerImpl.resolveDMNImportType(input, dmnModels, model, toMerge); + assertThat(model.getMessages()).isEmpty(); + assertThat(model.getImportAliasesForNS().entrySet().stream().findFirst().get().getValue().getLocalPart()).isNotNull().isEqualTo("Imported Model"); + + } + + @Test + void checkLocatedDMNModel() { + List toMerge = new ArrayList<>(); + List dmnModels = new ArrayList<>(); + String nameSpace = "http://www.trisotech.com/dmn/definitions/_f79aa7a4-f9a3-410a-ac95-bea496edabgc"; + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Importing_Named_Model.dmn", + this.getClass()); + DMNModel importingModel = dMNCompiler.compile(resource, dmnModels); + assertThat(importingModel).isNotNull(); + assertThat(importingModel.getNamespace()).isNotNull().isEqualTo(nameSpace); + + Import input = importingModel.getDefinitions().getImport().get(0); + DMNModelImpl model = new DMNModelImpl(importingModel.getDefinitions(), resource); + DMNModel located = new DMNModelImpl(importingModel.getDefinitions(), resource); + DMNCompilerImpl.checkLocatedDMNModel(input, located, model, toMerge); + assertThat(importingModel).isNotNull(); + assertThat(importingModel.getNamespace()).isNotNull().isEqualTo(nameSpace); + assertThat(toMerge.isEmpty()).isTrue(); + } + + @Test + void checkLocatedDMNModelWithAliasNull() { + String namespace="http://www.trisotech.com/dmn/definitions/_f79aa7a4-f9a3-410a-ac95-bea496edabgc"; + List toMerge = new ArrayList<>(); + List dmnModels = new ArrayList<>(); + Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Importing_EmptyNamed_Model_Without_Href_Namespace.dmn", + this.getClass()); + DMNModel emptyNamedModel = dMNCompiler.compile( resource, dmnModels); + assertThat(emptyNamedModel).isNotNull(); + dmnModels.add(emptyNamedModel); + + Import input = emptyNamedModel.getDefinitions().getImport().get(0); + DMNModelImpl model = new DMNModelImpl(emptyNamedModel.getDefinitions(), resource); + DMNModel located = new DMNModelImpl(emptyNamedModel.getDefinitions(), resource); + DMNCompilerImpl.checkLocatedDMNModel(input, located, model, toMerge); + assertThat(emptyNamedModel).isNotNull(); + assertThat(toMerge.isEmpty()).isFalse(); + assertThat(toMerge.get(0).getNamespace()).isNotNull().isEqualTo(namespace); + + } + private void addImport(Definitions dmnDefs, String importType, String nameSpace, String modelName) { dmnDefs.setName(modelName); Import import1 = new TImport(); From 45658fe88be443d74e9d05e9e06f3e6113ff30b6 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Fri, 7 Mar 2025 11:52:50 +0530 Subject: [PATCH 11/13] Review Comments fix --- .../kie/dmn/core/compiler/DMNCompilerImpl.java | 3 --- .../dmn/core/compiler/DMNCompilerImplTest.java | 17 +++++++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java index 15a594f1600..7bac725fbb4 100644 --- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java +++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java @@ -41,10 +41,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; - import javax.xml.namespace.QName; - -import org.codehaus.plexus.util.CollectionUtils; import org.drools.io.FileSystemResource; import org.kie.api.io.Resource; import org.kie.dmn.api.core.DMNCompiler; diff --git a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java index 8d9e22abac8..15f5f9442f3 100644 --- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java +++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java @@ -1,5 +1,4 @@ - - /* Licensed to the Apache Software Foundation (ASF) under one +/* Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file @@ -33,6 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.xml.namespace.QName; import java.util.*; import java.util.List; @@ -121,6 +121,7 @@ void compileWithUnknownTypeModelImports() { assertThat(model).isNotNull(); assertThat(model.getName()).isNotNull().isEqualTo(modelName); assertThat(model.getMessages()).isNotEmpty(); + assertThat(model.getMessages().size()).isEqualTo(1); assertThat(model.getMessages().get(0).getText()).isEqualTo("DMN: Import type unknown: 'UNKNOWN'. (Invalid FEEL syntax on the referenced expression) "); } @@ -161,12 +162,13 @@ void compileImportingModelWithoutImportedModel() { assertThat(model).isNotNull(); assertThat(model.getName()).isNotNull().isEqualTo(modelName); assertThat(model.getMessages()).isNotEmpty(); + assertThat(model.getMessages().size()).isEqualTo(5); assertThat(model.getMessages().get(0).getMessageType()).isEqualTo(DMNMessageType.IMPORT_NOT_FOUND); } @Test - void resolveDMNImportType() { + void resolveDMNImportType() { List toMerge = new ArrayList<>(); List dmnModels = new ArrayList<>(); Resource resource = new ClassPathResource( "valid_models/DMNv1_5/Imported_Model_Unamed.dmn", @@ -188,7 +190,9 @@ void resolveDMNImportType() { DMNModelImpl model = new DMNModelImpl(importingModel.getDefinitions(), resource); DMNCompilerImpl.resolveDMNImportType(input, dmnModels, model, toMerge); assertThat(model.getMessages()).isEmpty(); - assertThat(model.getImportAliasesForNS().entrySet().stream().findFirst().get().getValue().getLocalPart()).isNotNull().isEqualTo("Imported Model"); + assertThat(model.getImportAliasesForNS().entrySet().stream().findFirst()) + .isPresent().get().extracting(Map.Entry::getValue) + .extracting(QName::getLocalPart).isNotNull().isEqualTo("Imported Model"); } @@ -209,7 +213,7 @@ void checkLocatedDMNModel() { DMNCompilerImpl.checkLocatedDMNModel(input, located, model, toMerge); assertThat(importingModel).isNotNull(); assertThat(importingModel.getNamespace()).isNotNull().isEqualTo(nameSpace); - assertThat(toMerge.isEmpty()).isTrue(); + assertThat(toMerge).isEmpty(); } @Test @@ -228,7 +232,8 @@ void checkLocatedDMNModelWithAliasNull() { DMNModel located = new DMNModelImpl(emptyNamedModel.getDefinitions(), resource); DMNCompilerImpl.checkLocatedDMNModel(input, located, model, toMerge); assertThat(emptyNamedModel).isNotNull(); - assertThat(toMerge.isEmpty()).isFalse(); + assertThat(toMerge).isNotEmpty(); + assertThat(toMerge.size()).isEqualTo(1); assertThat(toMerge.get(0).getNamespace()).isNotNull().isEqualTo(namespace); } From bce987fc0b397e5ea4ceeaf0cf8844b006b0e4e1 Mon Sep 17 00:00:00 2001 From: ChinchuAjith Date: Fri, 7 Mar 2025 12:03:49 +0530 Subject: [PATCH 12/13] Review Comments fix:replace if/else with switch in DMNCompilerImpl class --- .../dmn/core/compiler/DMNCompilerImpl.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java index 7bac725fbb4..c75190e2232 100644 --- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java +++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java @@ -229,13 +229,18 @@ private DMNCompilerContext configureDMNCompiler(FEELDialect feeldialect, Functio private void iterateImports(Definitions dmndefs, Collection dmnModels, DMNModelImpl model, Function relativeResolver ) { List toMerge = new ArrayList<>(); for (Import i : dmndefs.getImport()) { - if (ImportDMNResolverUtil.whichImportType(i) == ImportType.DMN) { - resolveDMNImportType(i, dmnModels, model, toMerge ); - } else if (ImportDMNResolverUtil.whichImportType(i) == ImportType.PMML) { - processPMMLImport(model, i, relativeResolver); - model.setImportAliasForNS(i.getName(), i.getNamespace(), i.getName()); - } else { - logErrorMessage(model, i.getImportType()); + ImportType importType = ImportDMNResolverUtil.whichImportType(i); + switch(importType) { + case DMN : + resolveDMNImportType(i, dmnModels, model, toMerge); + break; + case PMML: + processPMMLImport(model, i, relativeResolver); + model.setImportAliasForNS(i.getName(), i.getNamespace(), i.getName()); + break; + default : + logErrorMessage(model, i.getImportType()); + break; } } toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); From 753815b322fd753f1a4cdb8857be2fffd13b0978 Mon Sep 17 00:00:00 2001 From: Gabriele-Cardosi Date: Fri, 7 Mar 2025 09:52:04 +0100 Subject: [PATCH 13/13] [incubator-kie-issues#1748] Refactoring and unit testing DMNCompilerImpl#resolvePMMLImportType --- .../dmn/core/compiler/DMNCompilerImpl.java | 96 ++++++++++--------- .../core/compiler/DMNCompilerImplTest.java | 20 +++- 2 files changed, 69 insertions(+), 47 deletions(-) diff --git a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java index c75190e2232..bc1bafe1eda 100644 --- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java +++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -216,36 +216,6 @@ public DMNModel compile(Definitions dmndefs, Collection dmnModels, Res return model; } - private DMNCompilerContext configureDMNCompiler(FEELDialect feeldialect, Function relativeResolver) { - - DMNCompilerConfigurationImpl cc = (DMNCompilerConfigurationImpl) dmnCompilerConfig; - List helperFEELProfiles = cc.getFeelProfiles(); - DMNFEELHelper feel = new DMNFEELHelper(cc.getRootClassLoader(), helperFEELProfiles, feeldialect); - DMNCompilerContext ctx = new DMNCompilerContext(feel); - ctx.setRelativeResolver(relativeResolver); - return ctx; - } - - private void iterateImports(Definitions dmndefs, Collection dmnModels, DMNModelImpl model, Function relativeResolver ) { - List toMerge = new ArrayList<>(); - for (Import i : dmndefs.getImport()) { - ImportType importType = ImportDMNResolverUtil.whichImportType(i); - switch(importType) { - case DMN : - resolveDMNImportType(i, dmnModels, model, toMerge); - break; - case PMML: - processPMMLImport(model, i, relativeResolver); - model.setImportAliasForNS(i.getName(), i.getNamespace(), i.getName()); - break; - default : - logErrorMessage(model, i.getImportType()); - break; - } - } - toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); - } - static void resolveDMNImportType(Import i, Collection dmnModels, DMNModelImpl model, List toMerge) { Either resolvedResult = ImportDMNResolverUtil.resolveImportDMN(i, dmnModels, (DMNModel m) -> new QName(m.getNamespace(), m.getName())); DMNModel located = resolvedResult.cata(msg -> { @@ -264,17 +234,6 @@ static void resolveDMNImportType(Import i, Collection dmnModels, DMNMo } - private void logErrorMessage(DMNModelImpl model, String importType) { - MsgUtil.reportMessage(logger, - DMNMessage.Severity.ERROR, - null, - model, - null, - null, - Msg.IMPORT_TYPE_UNKNOWN, - importType); - } - static void checkLocatedDMNModel(Import i, DMNModel located, DMNModelImpl model, List toMerge) { if (located != null) { String iAlias = Optional.ofNullable(i.getName()).orElse(located.getName()); @@ -290,17 +249,62 @@ static void checkLocatedDMNModel(Import i, DMNModel located, DMNModelImpl model, } } - private void processPMMLImport(DMNModelImpl model, Import i, Function relativeResolver) { - ClassLoader rootClassLoader = ((DMNCompilerConfigurationImpl) dmnCompilerConfig).getRootClassLoader(); + static void resolvePMMLImportType(DMNModelImpl model, Import i, Function relativeResolver, DMNCompilerConfigurationImpl dmnCompilerConfig) { + ClassLoader rootClassLoader = dmnCompilerConfig.getRootClassLoader(); Resource relativeResource = resolveRelativeResource(rootClassLoader, model, i, i, relativeResolver); + resolvePMMLImportType(model, i, relativeResource, dmnCompilerConfig); + } + + static void resolvePMMLImportType(DMNModelImpl model, Import i, Resource relativeResource, DMNCompilerConfigurationImpl dmnCompilerConfig) { try (InputStream pmmlIS = relativeResource.getInputStream()) { - DMNImportPMMLInfo.from(pmmlIS, (DMNCompilerConfigurationImpl) dmnCompilerConfig, model, i).consume(new PMMLImportErrConsumer(model, i), - model::addPMMLImportInfo); + DMNImportPMMLInfo.from(pmmlIS, dmnCompilerConfig, model, i).consume(new PMMLImportErrConsumer(model, i), + model::addPMMLImportInfo); } catch (IOException e) { new PMMLImportErrConsumer(model, i).accept(e); } } + static void logErrorMessage(DMNModelImpl model, String importType) { + MsgUtil.reportMessage(logger, + DMNMessage.Severity.ERROR, + null, + model, + null, + null, + Msg.IMPORT_TYPE_UNKNOWN, + importType); + } + + private DMNCompilerContext configureDMNCompiler(FEELDialect feeldialect, Function relativeResolver) { + + DMNCompilerConfigurationImpl cc = (DMNCompilerConfigurationImpl) dmnCompilerConfig; + List helperFEELProfiles = cc.getFeelProfiles(); + DMNFEELHelper feel = new DMNFEELHelper(cc.getRootClassLoader(), helperFEELProfiles, feeldialect); + DMNCompilerContext ctx = new DMNCompilerContext(feel); + ctx.setRelativeResolver(relativeResolver); + return ctx; + } + + private void iterateImports(Definitions dmndefs, Collection dmnModels, DMNModelImpl model, Function relativeResolver ) { + List toMerge = new ArrayList<>(); + for (Import i : dmndefs.getImport()) { + ImportType importType = ImportDMNResolverUtil.whichImportType(i); + switch(importType) { + case DMN : + resolveDMNImportType(i, dmnModels, model, toMerge); + break; + case PMML: + resolvePMMLImportType(model, i, relativeResolver, (DMNCompilerConfigurationImpl) dmnCompilerConfig); + model.setImportAliasForNS(i.getName(), i.getNamespace(), i.getName()); + break; + default : + logErrorMessage(model, i.getImportType()); + break; + } + } + toMerge.forEach(mergedModel -> processMergedModel(model, (DMNModelImpl) mergedModel)); + } + public static class PMMLImportErrConsumer implements Consumer { private final DMNModelImpl model; diff --git a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java index 15f5f9442f3..dc000bbe8f8 100644 --- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java +++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java @@ -17,7 +17,6 @@ */ package org.kie.dmn.core.compiler; - import org.drools.io.ClassPathResource; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -235,7 +234,26 @@ void checkLocatedDMNModelWithAliasNull() { assertThat(toMerge).isNotEmpty(); assertThat(toMerge.size()).isEqualTo(1); assertThat(toMerge.get(0).getNamespace()).isNotNull().isEqualTo(namespace); + } + + @Test + void resolvePMMLImportType() { + List dmnModels = new ArrayList<>(); + Resource dmnResource = new ClassPathResource( "../pmml/KiePMMLNewTree.dmn", + this.getClass()); + DMNModel importingModel = dMNCompiler.compile( dmnResource, dmnModels); + assertThat(importingModel).isNotNull(); + + Import input = importingModel.getDefinitions().getImport().get(0); + DMNModelImpl model = new DMNModelImpl(importingModel.getDefinitions(), dmnResource); + + Resource relativeResource = new ClassPathResource( "../pmml/test_tree_new.pmml", + this.getClass()); + assertThat(model.getPmmlImportInfo()).isEmpty(); + DMNCompilerConfigurationImpl dmnCompilerConfig = (DMNCompilerConfigurationImpl)((DMNCompilerImpl)dMNCompiler).getDmnCompilerConfig(); + DMNCompilerImpl.resolvePMMLImportType(model, input, relativeResource, dmnCompilerConfig); + assertThat(model.getPmmlImportInfo()).hasSize(1).containsOnlyKeys("test_tree"); } private void addImport(Definitions dmnDefs, String importType, String nameSpace, String modelName) {