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 3dac669d24 [incubator-kie-issues#1411] Adapting code to deal with full 
href definition (namespace#local_part) for local elements. (#6050)
3dac669d24 is described below

commit 3dac669d24a5e2d2ccfc0981ef01a04b1c7685a4
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Tue Aug 20 10:57:55 2024 +0200

    [incubator-kie-issues#1411] Adapting code to deal with full href definition 
(namespace#local_part) for local elements. (#6050)
    
    Co-authored-by: Gabriele-Cardosi <[email protected]>
---
 .../org/kie/dmn/core/compiler/DMNCompilerImpl.java | 28 +++++++-
 .../java/org/kie/dmn/core/DMNCompilerTest.java     | 33 ++++++++-
 .../kie/dmn/core/compiler/DMNCompilerImplTest.java | 79 ++++++++++++++++++++++
 .../resources/valid_models/DMNv1_5/LocalHrefs.dmn  | 46 +++++++++++++
 .../DMNv1x/dmn-validation-rules-dmnelementref.drl  |  7 +-
 .../dmn/validation/v1_5/DMN15ValidationsTest.java  |  6 ++
 6 files changed, 192 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 823084f4b6..078a115803 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
@@ -387,7 +387,7 @@ public class DMNCompilerImpl implements DMNCompiler {
             if (id.getItemComponent() != null && 
!id.getItemComponent().isEmpty()) {
                 DMNCompilerHelper.checkVariableName(model, id, id.getName());
                 CompositeTypeImpl compType = new 
CompositeTypeImpl(model.getNamespace(), id.getName(), id.getId(), 
id.isIsCollection());
-                DMNType preregistered = 
model.getTypeRegistry().registerType(compType);
+                model.getTypeRegistry().registerType(compType);
             }
         }
 
@@ -598,7 +598,31 @@ public class DMNCompilerImpl implements DMNCompiler {
      */
     public static String getId(DMNElementReference er) {
         String href = er.getHref();
-        return href.startsWith("#") ? href.substring(1) : href;
+        if (href.startsWith("#")) {
+            return href.substring(1);
+        } else {
+            Definitions rootElement = getRootElement(er);
+            String toRemove = String.format("%s#", rootElement.getNamespace());
+            return href.replace(toRemove, "");
+        }
+    }
+
+    /**
+     * Recursively navigate the given <code>DMNModelInstrumentedBase</code> 
until it gets to the root <code>Definitions</code> element.
+     * it throws a <code>RuntimeException</code> if such element could not be 
found.
+     *
+     * @param toNavigate
+     * @return
+     * @throws RuntimeException
+     */
+    public static Definitions getRootElement(DMNModelInstrumentedBase 
toNavigate) {
+        if ( toNavigate instanceof Definitions ) {
+            return (Definitions) toNavigate;
+        } else if ( toNavigate.getParent() != null ) {
+            return getRootElement(toNavigate.getParent());
+        } else {
+            throw new RuntimeException("Failed to get Definitions parent for " 
+ toNavigate);
+        }
     }
 
     /**
diff --git 
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java 
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
index 8b3776593e..daf7518dbb 100644
--- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
+++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
@@ -25,13 +25,13 @@ import java.util.function.Consumer;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.kie.dmn.api.core.DMNContext;
-import org.kie.dmn.api.core.DMNDecisionResult;
 import org.kie.dmn.api.core.DMNMessage;
 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.DMNType;
 import org.kie.dmn.api.core.FEELPropertyAccessible;
+import org.kie.dmn.api.core.ast.DecisionNode;
 import org.kie.dmn.api.core.ast.ItemDefNode;
 import org.kie.dmn.core.api.DMNFactory;
 import org.kie.dmn.core.compiler.DMNTypeRegistry;
@@ -39,18 +39,19 @@ import org.kie.dmn.core.impl.BaseDMNTypeImpl;
 import org.kie.dmn.core.impl.CompositeTypeImpl;
 import org.kie.dmn.core.impl.DMNContextFPAImpl;
 import org.kie.dmn.core.impl.DMNModelImpl;
-import org.kie.dmn.core.impl.DMNResultImpl;
 import org.kie.dmn.core.impl.SimpleTypeImpl;
 import org.kie.dmn.core.util.DMNRuntimeUtil;
 import org.kie.dmn.feel.lang.EvaluationContext;
 import org.kie.dmn.feel.lang.types.AliasFEELType;
 import org.kie.dmn.feel.lang.types.BuiltInType;
+import org.kie.dmn.model.api.Decision;
+import org.kie.dmn.model.api.InformationRequirement;
+import org.kie.dmn.model.api.KnowledgeRequirement;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.fail;
-import static org.assertj.core.api.InstanceOfAssertFactories.map;
 import static 
org.kie.dmn.api.core.DMNDecisionResult.DecisionEvaluationStatus.SUCCEEDED;
 import static org.kie.dmn.core.util.DynamicTypeUtils.entry;
 import static org.kie.dmn.core.util.DynamicTypeUtils.mapOf;
@@ -470,6 +471,32 @@ public class DMNCompilerTest extends BaseVariantTest {
         
assertThat(dmnAdultBobPerson.isAssignableValue(instanceYoungJoe)).isFalse();
     }
 
+    @ParameterizedTest
+    @MethodSource("params")
+    void localHrefs(VariantTestConf conf) {
+        testConfig = conf;
+        String nameSpace = "http://www.montera.com.au/spec/DMN/local-hrefs";;
+        final DMNRuntime runtime = 
DMNRuntimeUtil.createRuntime("valid_models/DMNv1_5/LocalHrefs.dmn", 
this.getClass());
+        final DMNModel dmnModel = runtime.getModel(
+                nameSpace,
+                "LocalHrefs");
+        assertThat(dmnModel).isNotNull();
+        
assertThat(dmnModel.hasErrors()).as(DMNRuntimeUtil.formatMessages(dmnModel.getMessages())).isFalse();
+        DecisionNode retrievedDecisionNode = 
dmnModel.getDecisionByName("decision_002");
+        assertThat(retrievedDecisionNode).isNotNull();
+        Decision retrievedDecision = retrievedDecisionNode.getDecision();
+        assertThat(retrievedDecision).isNotNull();
+        assertThat(retrievedDecision.getInformationRequirement())
+                .isNotNull()
+                .isNotEmpty()
+                .allSatisfy((Consumer<InformationRequirement>) 
informationRequirement -> assertThat(informationRequirement).isNotNull());
+        assertThat(retrievedDecision.getKnowledgeRequirement())
+                .isNotNull()
+                .isNotEmpty()
+                .allSatisfy((Consumer<KnowledgeRequirement>) 
knowledgeRequirement -> assertThat(knowledgeRequirement).isNotNull());
+
+    }
+
     private void commonValidateUnnamedImport(String importingModelRef, String 
importedModelRef) {
         final DMNRuntime runtime = 
createRuntimeWithAdditionalResources(importingModelRef,
                                                                         
this.getClass(),
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
new file mode 100644
index 0000000000..f67f8fc155
--- /dev/null
+++ 
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNCompilerImplTest.java
@@ -0,0 +1,79 @@
+/**
+ * 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
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.dmn.core.compiler;
+
+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 static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.*;
+
+class DMNCompilerImplTest {
+
+    private static final String nameSpace = 
"http://www.montera.com.au/spec/DMN/local-hrefs";;
+    private static Definitions parent;
+
+    @BeforeAll
+    static void setup() {
+        String modelName = "LocalHrefs";
+        parent = new TDefinitions();
+        parent.setName(modelName);
+        parent.setNamespace(nameSpace);
+    }
+
+    @Test
+    void getId() {
+        String localPart = "reference";
+        DMNElementReference elementReference = new TDMNElementReference();
+        elementReference.setHref(String.format("%s#%s", nameSpace, localPart));
+        elementReference.setParent(parent);
+        String retrieved = DMNCompilerImpl.getId(elementReference);
+        assertThat(retrieved).isNotNull().isEqualTo(localPart);
+
+        String expected = String.format("%s#%s", 
"http://a-different-namespace";, localPart);
+        elementReference.setHref(expected);
+        retrieved = DMNCompilerImpl.getId(elementReference);
+        assertThat(retrieved).isNotNull().isEqualTo(expected);
+    }
+
+    @Test
+    void getRootElement() {
+        String localPart = "reference";
+        DMNElementReference elementReference = new TDMNElementReference();
+        String href = String.format("%s#%s", nameSpace, localPart);
+        elementReference.setHref(href);
+        elementReference.setParent(parent);
+        Definitions retrieved = 
DMNCompilerImpl.getRootElement(elementReference);
+        assertThat(retrieved).isNotNull().isEqualTo(parent);
+
+        InformationRequirement informationRequirement = new 
TInformationRequirement();
+        elementReference.setParent(informationRequirement);
+        assertThrows(RuntimeException.class, () -> 
DMNCompilerImpl.getRootElement(elementReference));
+
+        informationRequirement.setParent(parent);
+        retrieved = DMNCompilerImpl.getRootElement(elementReference);
+        assertThat(retrieved).isNotNull().isEqualTo(parent);
+    }
+}
\ No newline at end of file
diff --git 
a/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_5/LocalHrefs.dmn
 
b/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_5/LocalHrefs.dmn
new file mode 100644
index 0000000000..33542ce25c
--- /dev/null
+++ 
b/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_5/LocalHrefs.dmn
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<definitions namespace="http://www.montera.com.au/spec/DMN/local-hrefs";
+             name="LocalHrefs"
+             xmlns="https://www.omg.org/spec/DMN/20230324/MODEL/";>
+
+  <description>Local (non-imported) qualified hrefs</description>
+
+  <inputData name="input_001" id="_input_001">
+    <variable name="input_001" typeRef="string"/>
+  </inputData>
+
+  <decision name="decision_001" id="_decision_001">
+    <variable name="decision_001" typeRef="string"/>
+    <literalExpression>
+      <text>"decision_001"</text>
+    </literalExpression>
+  </decision>
+
+  <businessKnowledgeModel name="bkm_001" id="_bkm_001">
+    <variable name="bkm_001"/>
+    <encapsulatedLogic>
+      <literalExpression>
+        <text>"bkm_001"</text>
+      </literalExpression>
+    </encapsulatedLogic>
+  </businessKnowledgeModel>
+
+  <!-- requirements hrefs refer to elements in this model -->
+  <decision name="decision_002" id="_decision_002">
+    <variable name="decision_002" typeRef="string"/>
+    <informationRequirement>
+      <requiredDecision 
href="http://www.montera.com.au/spec/DMN/local-hrefs#_decision_001"/>
+    </informationRequirement>
+    <informationRequirement>
+      <requiredInput 
href="http://www.montera.com.au/spec/DMN/local-hrefs#_input_001"/>
+    </informationRequirement>
+    <knowledgeRequirement>
+      <requiredKnowledge 
href="http://www.montera.com.au/spec/DMN/local-hrefs#_bkm_001"/>
+    </knowledgeRequirement>
+    <literalExpression>
+      <text>decision_001 + " " + input_001 + " " + bkm_001()</text>
+    </literalExpression>
+  </decision>
+
+</definitions>
+
diff --git 
a/kie-dmn/kie-dmn-validation/src/main/resources/org/kie/dmn/validation/DMNv1x/dmn-validation-rules-dmnelementref.drl
 
b/kie-dmn/kie-dmn-validation/src/main/resources/org/kie/dmn/validation/DMNv1x/dmn-validation-rules-dmnelementref.drl
index 5bedd9639b..07e619bf13 100644
--- 
a/kie-dmn/kie-dmn-validation/src/main/resources/org/kie/dmn/validation/DMNv1x/dmn-validation-rules-dmnelementref.drl
+++ 
b/kie-dmn/kie-dmn-validation/src/main/resources/org/kie/dmn/validation/DMNv1x/dmn-validation-rules-dmnelementref.drl
@@ -20,8 +20,11 @@
 package org.kie.dmn.validation.DMNv1x;
 
 import org.kie.dmn.model.api.*;
+import org.kie.dmn.model.api.DMNElement;
+import org.kie.dmn.model.api.DMNElementReference;
 import org.kie.dmn.api.core.DMNMessage;
 import org.kie.dmn.core.impl.DMNMessageImpl;
+import org.kie.dmn.core.compiler.DMNCompilerImpl;
 import org.kie.dmn.core.util.MsgUtil;
 import org.kie.dmn.feel.lang.types.BuiltInType;
 import org.kie.dmn.feel.parser.feel11.FEELParser;
@@ -45,7 +48,7 @@ end
 rule ELEMREF_NOHASH_p2
 when
   not( Import() )
-  $oc : DMNElementReference(href contains ":", 
!href.substring(href.indexOf(":") + 1).startsWith('#'))
+  $oc : DMNElementReference(href contains ":", !(href contains "#"))
 then
   reporter.report( DMNMessage.Severity.ERROR,  $oc , Msg.ELEMREF_NOHASH, 
$oc.getParentDRDElement().getIdentifierString() );
 end
@@ -60,7 +63,7 @@ end
 
 rule ELEMREF_MISSING_p2
 when
-  $elemRef: DMNElementReference(!href.startsWith("#"), $href: href, 
href.contains("#"), $targetId : rightOfHash(href), $targetNS : leftOfHash(href))
+  $elemRef: DMNElementReference(!href.startsWith("#"), $href: href, 
href.contains("#"), $targetId : rightOfHash(href), $targetNS : 
leftOfHash(href), $rootElement: DMNCompilerImpl.getRootElement(this), 
!$rootElement.namespace.equals($targetNS))
   (not (and Import( $importedNS : namespace )
             $importDef : Definitions( namespace == $importedNS, namespace == 
$targetNS ) from entry-point "DMNImports"
             DMNElement( id == $targetId ) from $importDef.drgElement
diff --git 
a/kie-dmn/kie-dmn-validation/src/test/java/org/kie/dmn/validation/v1_5/DMN15ValidationsTest.java
 
b/kie-dmn/kie-dmn-validation/src/test/java/org/kie/dmn/validation/v1_5/DMN15ValidationsTest.java
index 7eb5e6774d..e8a27da03f 100644
--- 
a/kie-dmn/kie-dmn-validation/src/test/java/org/kie/dmn/validation/v1_5/DMN15ValidationsTest.java
+++ 
b/kie-dmn/kie-dmn-validation/src/test/java/org/kie/dmn/validation/v1_5/DMN15ValidationsTest.java
@@ -132,6 +132,12 @@ public class DMN15ValidationsTest {
         evaluate(modelNamespace, modelName, modelFileName, inputData);
     }
 
+    @Test
+    void localHrefsValidation() {
+        String modelFileName = "valid_models/DMNv1_5/LocalHrefs.dmn";
+        validate(modelFileName);
+    }
+
     private void commonUnnamedImportValidation(String importingModelRef, 
String importedModelRef) {
         String modelName = "Importing empty-named Model";
         String modelNamespace = 
"http://www.trisotech.com/dmn/definitions/_f79aa7a4-f9a3-410a-ac95-bea496edabgc";;


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

Reply via email to