Copilot commented on code in PR #6427:
URL: 
https://github.com/apache/incubator-kie-drools/pull/6427#discussion_r2287894405


##########
kie-dmn/kie-dmn-validation/src/test/java/org/kie/dmn/validation/ValidatorTest.java:
##########
@@ -608,6 +616,42 @@ void validateAllValidSharedModels() throws IOException {
         }
     }
 
+    @Test
+    void validateValidModelsWitClashingInheritedImportAndInputNameSimpleData() 
{

Review Comment:
   Method name has a typo: 'Wit' should be 'With'
   ```suggestion
       void 
validateValidModelsWithClashingInheritedImportAndInputNameSimpleData() {
   ```



##########
kie-dmn/kie-dmn-validation/src/test/java/org/kie/dmn/validation/ValidatorTest.java:
##########
@@ -608,6 +616,42 @@ void validateAllValidSharedModels() throws IOException {
         }
     }
 
+    @Test
+    void validateValidModelsWitClashingInheritedImportAndInputNameSimpleData() 
{
+        String basePath = 
"valid_models/DMNv1_6/imports/same_import_and_input_name_simple_data";
+        String dmnImporting = String.format("%s/ImportingModel.dmn", basePath);
+        String dmnImported = String.format("%s/ImportedModel.dmn", basePath);
+        String[] modelFiles = new String[]{dmnImporting, dmnImported};
+        Resource[] resources = 
Arrays.stream(modelFiles).map(ClassPathResource::new).toArray(Resource[]::new);
+        List<DMNMessage> retrieved = validatorBuilder.theseModels(resources);
+        assertThat(retrieved).isNotNull().isEmpty();
+    }
+
+    @Test
+    void 
validateValidModelsWitClashingInheritedImportAndInputNameComplexData() {

Review Comment:
   Method name has a typo: 'Wit' should be 'With'
   ```suggestion
       void 
validateValidModelsWithClashingInheritedImportAndInputNameComplexData() {
   ```



##########
kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNRuntimeUtils.java:
##########
@@ -0,0 +1,276 @@
+/*
+ * 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.impl;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import org.kie.dmn.api.core.DMNContext;
+import org.kie.dmn.api.core.DMNType;
+import org.kie.dmn.api.core.ast.DMNNode;
+import org.kie.dmn.api.core.ast.InputDataNode;
+import org.kie.dmn.core.util.MsgUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class to support <code>DMNRuntimeImpl</code>
+ */
+public class DMNRuntimeUtils {
+
+    private static final Logger logger = 
LoggerFactory.getLogger(DMNRuntimeUtils.class);
+
+    private DMNRuntimeUtils() {
+        // singleton
+    }
+
+
+    public static Object coerceUsingType(Object value, DMNType type, boolean 
typeCheck,
+                                         BiConsumer<Object, DMNType> 
nullCallback) {
+        if (typeCheck) {
+            if (type.isAssignableValue(value)) {
+                return coerceSingleItemCollectionToValue(value, type);
+            } else {
+                nullCallback.accept(value, type);
+                return null;
+            }
+        } else {
+            return coerceSingleItemCollectionToValue(value, type);
+        }
+    }
+
+    static void populateResultContextWithTopmostParentsValues(DMNContext 
context, DMNModelImpl model) {
+        Optional<Set<DMNModelImpl.ModelImportTuple>> optionalTopmostModels = 
getTopmostModel(model);
+        optionalTopmostModels.ifPresent(topmostModels -> 
populateInputsFromTopmostModel(context, model, topmostModels));
+    }
+
+    static void populateInputsFromTopmostModel(DMNContext context, 
DMNModelImpl model,
+                                               
Set<DMNModelImpl.ModelImportTuple> topmostModels) {
+        for (DMNModelImpl.ModelImportTuple topmostModelTuple : topmostModels) {
+            processTopmostModelTuple(context, topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelTuple(DMNContext context, 
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                         DMNModelImpl model) {
+        DMNModelImpl topmostModel = topmostModelTuple.getModel();
+        for (InputDataNode topmostInput : topmostModel.getInputs()) {
+            processTopmostModelInputDataNode(context, topmostInput.getName(), 
topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelInputDataNode(DMNContext context, String 
topmostInputName,
+                                                 DMNModelImpl.ModelImportTuple 
topmostModelTuple, DMNModelImpl model) {
+        if (Objects.equals(topmostInputName, 
topmostModelTuple.getImportName())) {
+            processTopmostModelInputDataNodeWithClashingNames(context, 
topmostInputName,
+                                                              
topmostModelTuple, model);
+        } else {
+            processTopmostModelInputDataNodeWithoutClashingNames(context, 
topmostInputName,
+                                                                 
topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelInputDataNodeWithClashingNames(DMNContext 
context, String topmostInputName,
+                                                                  
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                                                  DMNModelImpl 
model) {
+        Object storedValue = context.get(topmostInputName); // This could be 
either a raw value, or a map
+        if (storedValue instanceof Map storedMap && 
storedMap.containsKey(topmostInputName)) { // THe check is needed to avoid 
looping reference

Review Comment:
   Comment has a typo: 'THe' should be 'The'
   ```suggestion
           if (storedValue instanceof Map storedMap && 
storedMap.containsKey(topmostInputName)) { // The check is needed to avoid 
looping reference
   ```



##########
kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNRuntimeUtils.java:
##########
@@ -0,0 +1,276 @@
+/*
+ * 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.impl;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import org.kie.dmn.api.core.DMNContext;
+import org.kie.dmn.api.core.DMNType;
+import org.kie.dmn.api.core.ast.DMNNode;
+import org.kie.dmn.api.core.ast.InputDataNode;
+import org.kie.dmn.core.util.MsgUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class to support <code>DMNRuntimeImpl</code>
+ */
+public class DMNRuntimeUtils {
+
+    private static final Logger logger = 
LoggerFactory.getLogger(DMNRuntimeUtils.class);
+
+    private DMNRuntimeUtils() {
+        // singleton
+    }
+
+
+    public static Object coerceUsingType(Object value, DMNType type, boolean 
typeCheck,
+                                         BiConsumer<Object, DMNType> 
nullCallback) {
+        if (typeCheck) {
+            if (type.isAssignableValue(value)) {
+                return coerceSingleItemCollectionToValue(value, type);
+            } else {
+                nullCallback.accept(value, type);
+                return null;
+            }
+        } else {
+            return coerceSingleItemCollectionToValue(value, type);
+        }
+    }
+
+    static void populateResultContextWithTopmostParentsValues(DMNContext 
context, DMNModelImpl model) {
+        Optional<Set<DMNModelImpl.ModelImportTuple>> optionalTopmostModels = 
getTopmostModel(model);
+        optionalTopmostModels.ifPresent(topmostModels -> 
populateInputsFromTopmostModel(context, model, topmostModels));
+    }
+
+    static void populateInputsFromTopmostModel(DMNContext context, 
DMNModelImpl model,
+                                               
Set<DMNModelImpl.ModelImportTuple> topmostModels) {
+        for (DMNModelImpl.ModelImportTuple topmostModelTuple : topmostModels) {
+            processTopmostModelTuple(context, topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelTuple(DMNContext context, 
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                         DMNModelImpl model) {
+        DMNModelImpl topmostModel = topmostModelTuple.getModel();
+        for (InputDataNode topmostInput : topmostModel.getInputs()) {
+            processTopmostModelInputDataNode(context, topmostInput.getName(), 
topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelInputDataNode(DMNContext context, String 
topmostInputName,
+                                                 DMNModelImpl.ModelImportTuple 
topmostModelTuple, DMNModelImpl model) {
+        if (Objects.equals(topmostInputName, 
topmostModelTuple.getImportName())) {
+            processTopmostModelInputDataNodeWithClashingNames(context, 
topmostInputName,
+                                                              
topmostModelTuple, model);
+        } else {
+            processTopmostModelInputDataNodeWithoutClashingNames(context, 
topmostInputName,
+                                                                 
topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelInputDataNodeWithClashingNames(DMNContext 
context, String topmostInputName,
+                                                                  
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                                                  DMNModelImpl 
model) {
+        Object storedValue = context.get(topmostInputName); // This could be 
either a raw value, or a map
+        if (storedValue instanceof Map storedMap && 
storedMap.containsKey(topmostInputName)) { // THe check is needed to avoid 
looping reference
+            return;
+        }
+        // Eventually, we need to create a map with the importing name and 
populate it with the input data
+        replaceContextMap(context, topmostModelTuple, topmostInputName,
+                          storedValue);
+    }
+
+    static void 
processTopmostModelInputDataNodeWithoutClashingNames(DMNContext context, String 
topmostInputName,
+                                                                     
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                                                     
DMNModelImpl model) {
+        Object storedValue = context.get(topmostInputName);
+        if (storedValue != null) {
+            Object parentData = context.get(topmostModelTuple.getImportName());
+            if (parentData instanceof Map mappedData) {
+                addValueInsideMap(mappedData, topmostInputName, storedValue);
+            } else if (parentData == null) {
+                updateContextMap(context, model.getImportChainAliases(), 
topmostModelTuple, topmostInputName,
+                                 storedValue);
+            }
+        }
+    }
+
+    static void replaceContextMap(DMNContext context,
+                                  DMNModelImpl.ModelImportTuple 
topmostModelTuple, String inputName,
+                                  Object storedValue) {
+        Map mappedData = new HashMap<>();
+        mappedData.put(inputName, storedValue);
+        context.set(topmostModelTuple.getImportName(), mappedData);
+    }
+
+    static void updateContextMap(DMNContext context, Map<String, 
Collection<List<String>>> importChainAliases,
+                                 DMNModelImpl.ModelImportTuple 
topmostModelTuple, String inputName,
+                                 Object storedValue) {
+        Map mappedData = new HashMap<>();
+        mappedData.put(inputName, storedValue);
+        populateContextWithInheritedData(context, mappedData,
+                                         topmostModelTuple.getImportName(),
+                                         
topmostModelTuple.getModel().getNamespace(), importChainAliases);
+    }
+
+    /**
+     * This method populate the given <code>DMNContext</code> with a new entry 
whose key is the import name and whose value is the provided <code>Map</code> 
<b>toStore</b>,
+     * if those are related with the namespace of the topmost parent
+     * @param toPopulate
+     * @param toStore
+     * @param importName
+     * @param topmostNamespace
+     * @param importChainAliases
+     */
+    static void populateContextWithInheritedData(DMNContext toPopulate, 
Map<String, Object> toStore,
+                                                 String importName, String 
topmostNamespace, Map<String,
+                    Collection<List<String>>> importChainAliases) {
+        for (List<String> chainedModels : 
importChainAliases.get(topmostNamespace)) {
+            // The order is: first one -> importing model; last one -> parent 
model
+            for (String chainedModel : chainedModels) {
+                if (chainedModel.equals(importName)) {
+                    continue;
+                }
+                if (toStore.get(chainedModel) != null && 
toStore.get(chainedModel) instanceof Map<?, ?> alreadyMapped) {
+                    addValueInsideMap(alreadyMapped, importName, toStore);
+                } else {
+                    addNewMapToContext(toPopulate, importName, toStore, 
chainedModel);
+                }
+            }
+        }
+    }
+
+    /**
+     * Create a new <code>Map</code> with the given <code>importName</code> 
value set to the given <code>Map</code> <b>toStore</b>.
+     * Then, set this newly-created Map in the given <code>DMNContext</code> 
as <b>chainedModel</b>
+     * @param toPopulate
+     * @param importName
+     * @param toStore
+     * @param chainedModel
+     */
+    static void addNewMapToContext(DMNContext toPopulate, String importName, 
Map<String, Object> toStore, String chainedModel) {
+        Map<String, Object> chainedMap = new HashMap<>();
+        chainedMap.put(importName, toStore);
+        toPopulate.set(chainedModel, chainedMap);
+    }
+
+    /**
+     * Depending on how the context has been instantiated, the provided 
<code>Map</code> could be unmodifiable, which
+     * is an expected condition
+     * @param mappedData
+     * @param inputName
+     * @param storedValue
+     */
+    static void addValueInsideMap(Map mappedData, String inputName, Object 
storedValue) {

Review Comment:
   Raw type usage. Should specify generic types: `Map<String, Object> 
mappedData`
   ```suggestion
       static void addValueInsideMap(Map<String, Object> mappedData, String 
inputName, Object storedValue) {
   ```



##########
kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNRuntimeUtils.java:
##########
@@ -0,0 +1,276 @@
+/*
+ * 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.impl;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import org.kie.dmn.api.core.DMNContext;
+import org.kie.dmn.api.core.DMNType;
+import org.kie.dmn.api.core.ast.DMNNode;
+import org.kie.dmn.api.core.ast.InputDataNode;
+import org.kie.dmn.core.util.MsgUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class to support <code>DMNRuntimeImpl</code>
+ */
+public class DMNRuntimeUtils {
+
+    private static final Logger logger = 
LoggerFactory.getLogger(DMNRuntimeUtils.class);
+
+    private DMNRuntimeUtils() {
+        // singleton
+    }
+
+
+    public static Object coerceUsingType(Object value, DMNType type, boolean 
typeCheck,
+                                         BiConsumer<Object, DMNType> 
nullCallback) {
+        if (typeCheck) {
+            if (type.isAssignableValue(value)) {
+                return coerceSingleItemCollectionToValue(value, type);
+            } else {
+                nullCallback.accept(value, type);
+                return null;
+            }
+        } else {
+            return coerceSingleItemCollectionToValue(value, type);
+        }
+    }
+
+    static void populateResultContextWithTopmostParentsValues(DMNContext 
context, DMNModelImpl model) {
+        Optional<Set<DMNModelImpl.ModelImportTuple>> optionalTopmostModels = 
getTopmostModel(model);
+        optionalTopmostModels.ifPresent(topmostModels -> 
populateInputsFromTopmostModel(context, model, topmostModels));
+    }
+
+    static void populateInputsFromTopmostModel(DMNContext context, 
DMNModelImpl model,
+                                               
Set<DMNModelImpl.ModelImportTuple> topmostModels) {
+        for (DMNModelImpl.ModelImportTuple topmostModelTuple : topmostModels) {
+            processTopmostModelTuple(context, topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelTuple(DMNContext context, 
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                         DMNModelImpl model) {
+        DMNModelImpl topmostModel = topmostModelTuple.getModel();
+        for (InputDataNode topmostInput : topmostModel.getInputs()) {
+            processTopmostModelInputDataNode(context, topmostInput.getName(), 
topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelInputDataNode(DMNContext context, String 
topmostInputName,
+                                                 DMNModelImpl.ModelImportTuple 
topmostModelTuple, DMNModelImpl model) {
+        if (Objects.equals(topmostInputName, 
topmostModelTuple.getImportName())) {
+            processTopmostModelInputDataNodeWithClashingNames(context, 
topmostInputName,
+                                                              
topmostModelTuple, model);
+        } else {
+            processTopmostModelInputDataNodeWithoutClashingNames(context, 
topmostInputName,
+                                                                 
topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelInputDataNodeWithClashingNames(DMNContext 
context, String topmostInputName,
+                                                                  
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                                                  DMNModelImpl 
model) {
+        Object storedValue = context.get(topmostInputName); // This could be 
either a raw value, or a map
+        if (storedValue instanceof Map storedMap && 
storedMap.containsKey(topmostInputName)) { // THe check is needed to avoid 
looping reference
+            return;
+        }
+        // Eventually, we need to create a map with the importing name and 
populate it with the input data
+        replaceContextMap(context, topmostModelTuple, topmostInputName,
+                          storedValue);
+    }
+
+    static void 
processTopmostModelInputDataNodeWithoutClashingNames(DMNContext context, String 
topmostInputName,
+                                                                     
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                                                     
DMNModelImpl model) {
+        Object storedValue = context.get(topmostInputName);
+        if (storedValue != null) {
+            Object parentData = context.get(topmostModelTuple.getImportName());
+            if (parentData instanceof Map mappedData) {
+                addValueInsideMap(mappedData, topmostInputName, storedValue);
+            } else if (parentData == null) {
+                updateContextMap(context, model.getImportChainAliases(), 
topmostModelTuple, topmostInputName,
+                                 storedValue);
+            }
+        }
+    }
+
+    static void replaceContextMap(DMNContext context,
+                                  DMNModelImpl.ModelImportTuple 
topmostModelTuple, String inputName,
+                                  Object storedValue) {
+        Map mappedData = new HashMap<>();

Review Comment:
   Raw type usage. Should specify generic types: `Map<String, Object> 
mappedData = new HashMap<>();`
   ```suggestion
           Map<String, Object> mappedData = new HashMap<>();
   ```



##########
kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/imports/ImportsTest.java:
##########
@@ -44,6 +45,97 @@ public class ImportsTest extends 
BaseInterpretedVsCompiledTest {
 
     public static final Logger LOG = 
LoggerFactory.getLogger(ImportsTest.class);
 
+    @ParameterizedTest
+    @MethodSource("params")
+    void importingModelsWithSameImportAndInputNameSimpledData(boolean 
useExecModelCompiler) {

Review Comment:
   Method name has a typo: 'Simpleddata' should be 'SimpleData'
   ```suggestion
       void importingModelsWithSameImportAndInputNameSimpleData(boolean 
useExecModelCompiler) {
   ```



##########
kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNRuntimeUtils.java:
##########
@@ -0,0 +1,276 @@
+/*
+ * 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.impl;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import org.kie.dmn.api.core.DMNContext;
+import org.kie.dmn.api.core.DMNType;
+import org.kie.dmn.api.core.ast.DMNNode;
+import org.kie.dmn.api.core.ast.InputDataNode;
+import org.kie.dmn.core.util.MsgUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class to support <code>DMNRuntimeImpl</code>
+ */
+public class DMNRuntimeUtils {
+
+    private static final Logger logger = 
LoggerFactory.getLogger(DMNRuntimeUtils.class);
+
+    private DMNRuntimeUtils() {
+        // singleton
+    }
+
+
+    public static Object coerceUsingType(Object value, DMNType type, boolean 
typeCheck,
+                                         BiConsumer<Object, DMNType> 
nullCallback) {
+        if (typeCheck) {
+            if (type.isAssignableValue(value)) {
+                return coerceSingleItemCollectionToValue(value, type);
+            } else {
+                nullCallback.accept(value, type);
+                return null;
+            }
+        } else {
+            return coerceSingleItemCollectionToValue(value, type);
+        }
+    }
+
+    static void populateResultContextWithTopmostParentsValues(DMNContext 
context, DMNModelImpl model) {
+        Optional<Set<DMNModelImpl.ModelImportTuple>> optionalTopmostModels = 
getTopmostModel(model);
+        optionalTopmostModels.ifPresent(topmostModels -> 
populateInputsFromTopmostModel(context, model, topmostModels));
+    }
+
+    static void populateInputsFromTopmostModel(DMNContext context, 
DMNModelImpl model,
+                                               
Set<DMNModelImpl.ModelImportTuple> topmostModels) {
+        for (DMNModelImpl.ModelImportTuple topmostModelTuple : topmostModels) {
+            processTopmostModelTuple(context, topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelTuple(DMNContext context, 
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                         DMNModelImpl model) {
+        DMNModelImpl topmostModel = topmostModelTuple.getModel();
+        for (InputDataNode topmostInput : topmostModel.getInputs()) {
+            processTopmostModelInputDataNode(context, topmostInput.getName(), 
topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelInputDataNode(DMNContext context, String 
topmostInputName,
+                                                 DMNModelImpl.ModelImportTuple 
topmostModelTuple, DMNModelImpl model) {
+        if (Objects.equals(topmostInputName, 
topmostModelTuple.getImportName())) {
+            processTopmostModelInputDataNodeWithClashingNames(context, 
topmostInputName,
+                                                              
topmostModelTuple, model);
+        } else {
+            processTopmostModelInputDataNodeWithoutClashingNames(context, 
topmostInputName,
+                                                                 
topmostModelTuple, model);
+        }
+    }
+
+    static void processTopmostModelInputDataNodeWithClashingNames(DMNContext 
context, String topmostInputName,
+                                                                  
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                                                  DMNModelImpl 
model) {
+        Object storedValue = context.get(topmostInputName); // This could be 
either a raw value, or a map
+        if (storedValue instanceof Map storedMap && 
storedMap.containsKey(topmostInputName)) { // THe check is needed to avoid 
looping reference
+            return;
+        }
+        // Eventually, we need to create a map with the importing name and 
populate it with the input data
+        replaceContextMap(context, topmostModelTuple, topmostInputName,
+                          storedValue);
+    }
+
+    static void 
processTopmostModelInputDataNodeWithoutClashingNames(DMNContext context, String 
topmostInputName,
+                                                                     
DMNModelImpl.ModelImportTuple topmostModelTuple,
+                                                                     
DMNModelImpl model) {
+        Object storedValue = context.get(topmostInputName);
+        if (storedValue != null) {
+            Object parentData = context.get(topmostModelTuple.getImportName());
+            if (parentData instanceof Map mappedData) {
+                addValueInsideMap(mappedData, topmostInputName, storedValue);
+            } else if (parentData == null) {
+                updateContextMap(context, model.getImportChainAliases(), 
topmostModelTuple, topmostInputName,
+                                 storedValue);
+            }
+        }
+    }
+
+    static void replaceContextMap(DMNContext context,
+                                  DMNModelImpl.ModelImportTuple 
topmostModelTuple, String inputName,
+                                  Object storedValue) {
+        Map mappedData = new HashMap<>();
+        mappedData.put(inputName, storedValue);
+        context.set(topmostModelTuple.getImportName(), mappedData);
+    }
+
+    static void updateContextMap(DMNContext context, Map<String, 
Collection<List<String>>> importChainAliases,
+                                 DMNModelImpl.ModelImportTuple 
topmostModelTuple, String inputName,
+                                 Object storedValue) {
+        Map mappedData = new HashMap<>();

Review Comment:
   Raw type usage. Should specify generic types: `Map<String, Object> 
mappedData = new HashMap<>();`
   ```suggestion
           Map<String, Object> mappedData = new HashMap<>();
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to