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 fed30f8880 [Incubator-kie-issues#1356] DMN Elements with null IDs are
not correctly managed (#6033)
fed30f8880 is described below
commit fed30f8880a261a2f3dd59d6a5c1c3d7dadf7c2f
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Thu Aug 1 12:02:52 2024 +0200
[Incubator-kie-issues#1356] DMN Elements with null IDs are not correctly
managed (#6033)
* [incubator-kie-issues#1356] Implemented TupleIdentifier as key for nods
maps inside DMNModelImpl
* [incubator-kie-issues#1356] Working with tests
* [incubator-kie-issues#1356] Fix null management inside TupleIdentifier.
Add tests.
* [incubator-kie-issues#1356] Add symmetrical equality tests for
TupleIdentifier
---------
Co-authored-by: Gabriele-Cardosi <[email protected]>
---
.../java/org/kie/dmn/core/ast/DMNBaseNode.java | 20 ++-
.../java/org/kie/dmn/core/ast/ItemDefNodeImpl.java | 4 -
.../org/kie/dmn/core/compiler/DMNCompilerImpl.java | 9 +-
.../dmn/core/compiler/DMNTypeRegistryAbstract.java | 23 +--
.../kie/dmn/core/compiler/DMNTypeRegistryV11.java | 4 +-
.../kie/dmn/core/compiler/DMNTypeRegistryV12.java | 3 +-
.../kie/dmn/core/compiler/DMNTypeRegistryV13.java | 3 +-
.../kie/dmn/core/compiler/DMNTypeRegistryV14.java | 3 +-
.../kie/dmn/core/compiler/DMNTypeRegistryV15.java | 3 +-
.../java/org/kie/dmn/core/impl/DMNModelImpl.java | 123 +++++++--------
.../org/kie/dmn/core/impl/TupleIdentifier.java | 86 +++++++++++
.../java/org/kie/dmn/core/DMNCompilerTest.java | 58 ++++++-
.../test/java/org/kie/dmn/core/DMNRuntimeTest.java | 15 +-
.../org/kie/dmn/core/impl/DMNModelImplTest.java | 171 +++++++++++++++++++++
.../org/kie/dmn/core/impl/TupleIdentifierTest.java | 101 ++++++++++++
.../kie/dmn/core/0089-nested-inputdata-imports.dmn | 38 +++++
.../test/resources/org/kie/dmn/core/Model_B.dmn | 31 ++++
.../test/resources/org/kie/dmn/core/Model_B2.dmn | 31 ++++
.../resources/org/kie/dmn/core/Say_hello_1ID1D.dmn | 30 ++++
.../legacy/tests/core/v1_1/DMNCompilerTest.java | 2 +-
.../dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java | 15 +-
.../java/org/kie/dmn/model/api/DMNElement.java | 2 +-
22 files changed, 667 insertions(+), 108 deletions(-)
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNBaseNode.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNBaseNode.java
index 3ceb7742de..0ca078e34c 100644
--- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNBaseNode.java
+++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNBaseNode.java
@@ -7,7 +7,7 @@
* "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
+ * 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
@@ -24,6 +24,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.UUID;
import javax.xml.namespace.QName;
@@ -45,17 +46,21 @@ public abstract class DMNBaseNode implements DMNNode {
private Map<String, QName> importAliases = new HashMap<>();
+ private final String id;
+
public DMNBaseNode() {
+ id = UUID.randomUUID().toString();
}
public DMNBaseNode(NamedElement source) {
this.source = source;
+ id = source != null && source.getId() != null ? source.getId() :
UUID.randomUUID().toString();
}
public abstract DMNType getType();
public String getId() {
- return source != null ? source.getId() : null;
+ return id;
}
public String getName() {
@@ -88,7 +93,7 @@ public abstract class DMNBaseNode implements DMNNode {
public String getIdentifierString() {
String identifier = "[unnamed]";
- if( source != null ) {
+ if (source != null) {
identifier = source.getName() != null ? source.getName() :
source.getId();
}
return identifier;
@@ -107,11 +112,11 @@ public abstract class DMNBaseNode implements DMNNode {
}
public void addDependency(String name, DMNNode dependency) {
- this.dependencies.put( name, dependency );
+ this.dependencies.put(name, dependency);
}
public List<InformationRequirement> getInformationRequirement() {
- if ( source instanceof Decision ) {
+ if (source instanceof Decision) {
return ((Decision) source).getInformationRequirement();
} else {
return Collections.emptyList();
@@ -119,9 +124,9 @@ public abstract class DMNBaseNode implements DMNNode {
}
public List<KnowledgeRequirement> getKnowledgeRequirement() {
- if ( source instanceof Decision ) {
+ if (source instanceof Decision) {
return ((Decision) source).getKnowledgeRequirement();
- } else if( source instanceof BusinessKnowledgeModel ) {
+ } else if (source instanceof BusinessKnowledgeModel) {
return ((BusinessKnowledgeModel) source).getKnowledgeRequirement();
} else {
return Collections.emptyList();
@@ -148,5 +153,4 @@ public abstract class DMNBaseNode implements DMNNode {
builder.append("]");
return builder.toString();
}
-
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/ItemDefNodeImpl.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/ItemDefNodeImpl.java
index 05fcddb2d1..ddbaa2b90a 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/ItemDefNodeImpl.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/ItemDefNodeImpl.java
@@ -47,10 +47,6 @@ public class ItemDefNodeImpl
this.itemDef = itemDef;
}
- public String getId() {
- return itemDef.getId();
- }
-
public String getName() {
return itemDef.getName();
}
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 8cc1eb40c2..823084f4b6 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
@@ -384,7 +384,7 @@ public class DMNCompilerImpl implements DMNCompiler {
Msg.DUPLICATED_ITEM_DEFINITION,
id.getName());
}
- if (id.getItemComponent() != null && id.getItemComponent().size()
> 0) {
+ 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);
@@ -402,6 +402,9 @@ public class DMNCompilerImpl implements DMNCompiler {
private void processDrgElements(DMNCompilerContext ctx, DMNModelImpl
model, Definitions dmndefs) {
for ( DRGElement e : dmndefs.getDrgElement() ) {
boolean foundIt = false;
+ if (e.getId() == null) {
+ e.setId(UUID.randomUUID().toString());
+ }
for( DRGElementCompiler dc : drgCompilers ) {
if ( dc.accept( e ) ) {
foundIt = true;
@@ -436,10 +439,8 @@ public class DMNCompilerImpl implements DMNCompiler {
ds.setVariable(variable);
}
// continuing with normal compilation of Decision Service:
- boolean foundIt = false;
for (DRGElementCompiler dc : drgCompilers) {
if (dc.accept(ds)) {
- foundIt = true;
dc.compileNode(ds, this, model);
}
}
@@ -487,7 +488,7 @@ public class DMNCompilerImpl implements DMNCompiler {
}
@FunctionalInterface
- public static interface AfterProcessDrgElements {
+ public interface AfterProcessDrgElements {
void callback(DMNCompilerImpl compiler, DMNCompilerContext ctx,
DMNModelImpl model);
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryAbstract.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryAbstract.java
index a902e7b0b1..5aac998a9c 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryAbstract.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryAbstract.java
@@ -30,6 +30,7 @@ import org.kie.dmn.api.core.DMNType;
import org.kie.dmn.core.impl.BaseDMNTypeImpl;
import org.kie.dmn.core.impl.CompositeTypeImpl;
import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
import org.kie.dmn.feel.lang.Scope;
import org.kie.dmn.feel.lang.Type;
import org.kie.dmn.feel.lang.types.BuiltInType;
@@ -41,12 +42,12 @@ import org.kie.dmn.feel.lang.types.WrappingScopeImpl;
public abstract class DMNTypeRegistryAbstract implements DMNTypeRegistry,
FEELTypeRegistry {
protected Map<String, Map<String, DMNType>> types = new HashMap<>();
- protected Map<String, QName> aliases;
+ protected Map<TupleIdentifier, QName> aliases;
protected ScopeImpl feelTypesScope = new ScopeImpl(); // no parent scope,
intentional.
- protected Map<String, ScopeImpl> feelTypesScopeChildLU = new HashMap<>();
+ protected Map<TupleIdentifier, ScopeImpl> feelTypesScopeChildLU = new
HashMap<>();
- public DMNTypeRegistryAbstract(Map<String, QName> aliases) {
+ public DMNTypeRegistryAbstract(Map<TupleIdentifier, QName> aliases) {
this.aliases = aliases;
String feelNamespace = feelNS();
Map<String, DMNType> feelTypes = new HashMap<>( );
@@ -85,10 +86,10 @@ public abstract class DMNTypeRegistryAbstract implements
DMNTypeRegistry, FEELTy
public Type resolveFEELType(List<String> qns) {
if (qns.size() == 1) {
return feelTypesScope.resolve(qns.get(0)).getType();
- } else if (qns.size() == 2 &&
feelTypesScopeChildLU.containsKey(qns.get(0))) {
- return
feelTypesScopeChildLU.get(qns.get(0)).resolve(qns.get(1)).getType();
+ } else if (qns.size() == 2 && feelTypesScopeChildLU.containsKey(new
TupleIdentifier(null, qns.get(0)))) {
+ return feelTypesScopeChildLU.get(new TupleIdentifier(null,
qns.get(0))).resolve(qns.get(1)).getType();
} else {
- throw new IllegalStateException("Inconsistent state when resolving
for qns: " + qns.toString());
+ throw new IllegalStateException("Inconsistent state when resolving
for qns: " + qns);
}
}
@@ -98,21 +99,21 @@ public abstract class DMNTypeRegistryAbstract implements
DMNTypeRegistry, FEELTy
}
protected void registerAsFEELType(DMNType dmnType) {
- Optional<String> optAliasKey = keyfromNS(dmnType.getNamespace());
+ Optional<TupleIdentifier> optAliasKey =
keyfromNS(dmnType.getNamespace());
Type feelType = ((BaseDMNTypeImpl) dmnType).getFeelType();
if (optAliasKey.isEmpty()) {
feelTypesScope.define(new TypeSymbol(dmnType.getName(), feelType));
} else {
- String aliasKey = optAliasKey.get();
+ TupleIdentifier aliasKey = optAliasKey.get();
feelTypesScopeChildLU.computeIfAbsent(aliasKey, k -> {
- ScopeImpl importScope = new ScopeImpl(k, feelTypesScope);
- feelTypesScope.define(new TypeSymbol(k, null));
+ ScopeImpl importScope = new ScopeImpl(k.getName(),
feelTypesScope);
+ feelTypesScope.define(new TypeSymbol(k.getName(), null));
return importScope;
}).define(new TypeSymbol(dmnType.getName(), feelType));
}
}
- private Optional<String> keyfromNS(String ns) {
+ private Optional<TupleIdentifier> keyfromNS(String ns) {
return aliases == null ? Optional.empty() :
aliases.entrySet().stream().filter(kv ->
kv.getValue().getNamespaceURI().equals(ns)).map(kv -> kv.getKey()).findFirst();
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV11.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV11.java
index cee46ab767..e8bd031899 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV11.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV11.java
@@ -24,12 +24,12 @@ import javax.xml.namespace.QName;
import org.kie.dmn.api.core.DMNType;
import org.kie.dmn.core.impl.SimpleTypeImpl;
-import org.kie.dmn.feel.lang.types.BuiltInType;
+import org.kie.dmn.core.impl.TupleIdentifier;
import org.kie.dmn.model.v1_1.KieDMNModelInstrumentedBase;
public class DMNTypeRegistryV11 extends DMNTypeRegistryAbstract {
- public DMNTypeRegistryV11(Map<String, QName> aliases) {
+ public DMNTypeRegistryV11(Map<TupleIdentifier, QName> aliases) {
super(aliases);
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV12.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV12.java
index f146d2e1a2..ade5a60fc3 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV12.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV12.java
@@ -27,6 +27,7 @@ import javax.xml.namespace.QName;
import org.kie.dmn.api.core.DMNType;
import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
import org.kie.dmn.feel.lang.types.BuiltInType;
import org.kie.dmn.model.v1_2.KieDMNModelInstrumentedBase;
@@ -38,7 +39,7 @@ public class DMNTypeRegistryV12 extends
DMNTypeRegistryAbstract {
super(Collections.emptyMap());
}
- public DMNTypeRegistryV12(Map<String, QName> aliases) {
+ public DMNTypeRegistryV12(Map<TupleIdentifier, QName> aliases) {
super(aliases);
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV13.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV13.java
index 45c0ed87f8..4cf902bf1f 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV13.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV13.java
@@ -24,13 +24,14 @@ import javax.xml.namespace.QName;
import org.kie.dmn.api.core.DMNType;
import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
import org.kie.dmn.model.v1_3.KieDMNModelInstrumentedBase;
public class DMNTypeRegistryV13 extends DMNTypeRegistryAbstract {
private static final DMNType UNKNOWN =
SimpleTypeImpl.UNKNOWN_DMNTYPE(KieDMNModelInstrumentedBase.URI_FEEL);
- public DMNTypeRegistryV13(Map<String, QName> aliases) {
+ public DMNTypeRegistryV13(Map<TupleIdentifier, QName> aliases) {
super(aliases);
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV14.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV14.java
index a39b5aeb42..2c7d99d719 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV14.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV14.java
@@ -24,13 +24,14 @@ import javax.xml.namespace.QName;
import org.kie.dmn.api.core.DMNType;
import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
import org.kie.dmn.model.v1_4.KieDMNModelInstrumentedBase;
public class DMNTypeRegistryV14 extends DMNTypeRegistryAbstract {
private static final DMNType UNKNOWN =
SimpleTypeImpl.UNKNOWN_DMNTYPE(KieDMNModelInstrumentedBase.URI_FEEL);
- public DMNTypeRegistryV14(Map<String, QName> aliases) {
+ public DMNTypeRegistryV14(Map<TupleIdentifier, QName> aliases) {
super(aliases);
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV15.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV15.java
index 332fe992b9..359edde31b 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV15.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV15.java
@@ -20,6 +20,7 @@ package org.kie.dmn.core.compiler;
import org.kie.dmn.api.core.DMNType;
import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
import org.kie.dmn.model.v1_5.KieDMNModelInstrumentedBase;
import javax.xml.namespace.QName;
@@ -30,7 +31,7 @@ public class DMNTypeRegistryV15 extends
DMNTypeRegistryAbstract {
private static final DMNType UNKNOWN =
SimpleTypeImpl.UNKNOWN_DMNTYPE(KieDMNModelInstrumentedBase.URI_FEEL);
- public DMNTypeRegistryV15(Map<String, QName> aliases) {
+ public DMNTypeRegistryV15(Map<TupleIdentifier, QName> aliases) {
super(aliases);
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNModelImpl.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNModelImpl.java
index d100cbbc85..6cd1b3a4b6 100644
--- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNModelImpl.java
+++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNModelImpl.java
@@ -72,36 +72,39 @@ import org.kie.dmn.model.api.DMNModelInstrumentedBase;
import org.kie.dmn.model.api.Definitions;
import static org.kie.dmn.core.compiler.UnnamedImportUtils.isInUnnamedImport;
+import static org.kie.dmn.core.impl.TupleIdentifier.createTupleIdentifier;
+import static org.kie.dmn.core.impl.TupleIdentifier.createTupleIdentifierById;
+import static
org.kie.dmn.core.impl.TupleIdentifier.createTupleIdentifierByName;
public class DMNModelImpl
implements DMNModel, DMNMessageManager, Externalizable {
- private static enum SerializationFormat {
+ private enum SerializationFormat {
// To ensure backward compatibility, append only:
DMN_XML
}
-
private SerializationFormat serializedAs = SerializationFormat.DMN_XML;
private Resource resource;
private Definitions definitions;
- private Map<String, InputDataNode> inputs = new
LinkedHashMap<>();
- private Map<String, DecisionNode> decisions = new
LinkedHashMap<>();
- private Map<String, BusinessKnowledgeModelNode> bkms = new
LinkedHashMap<>();
- private Map<String, ItemDefNode> itemDefs = new
LinkedHashMap<>();
- private Map<String, DecisionServiceNode> decisionServices = new
LinkedHashMap<>();
+ private Map<TupleIdentifier, InputDataNode> inputs =
new LinkedHashMap<>();
+ private Map<TupleIdentifier, DecisionNode> decisions =
new LinkedHashMap<>();
+ private Map<TupleIdentifier, BusinessKnowledgeModelNode> bkms =
new LinkedHashMap<>();
+ private Map<TupleIdentifier, ItemDefNode> itemDefs =
new LinkedHashMap<>();
+ private Map<TupleIdentifier, DecisionServiceNode> decisionServices =
new LinkedHashMap<>();
+ private Map<TupleIdentifier, DMNImportPMMLInfo> pmmlImportInfo = new
HashMap<>();
+ private Map<TupleIdentifier, QName> importAliases = new HashMap<>();
// these are messages created at loading/compilation time
private DMNMessageManager messages;
private DMNTypeRegistry types;
/**
- * a compile-time preference to indicate if type-check should be performed
during runtime evaluation.
+ * a compile-time preference to indicate if type-check should be performed
during runtime evaluation.
*/
private boolean runtimeTypeCheck = false;
- private Map<String, QName> importAliases = new HashMap<>();
private ImportChain importChain;
public DMNModelImpl() {
@@ -173,12 +176,12 @@ public class DMNModelImpl
}
public void addInput(InputDataNode idn) {
- computeDRGElementModelLocalId(idn).forEach(id -> inputs.put(id, idn));
+ computeDRGElementModelLocalId(idn).forEach(id ->
inputs.put(createTupleIdentifier(id, nameInCurrentModel(idn)), idn));
}
@Override
public InputDataNode getInputById(String id) {
- return this.inputs.get( id );
+ return this.inputs.get( new TupleIdentifier(id, null) );
}
@Override
@@ -186,12 +189,7 @@ public class DMNModelImpl
if ( name == null ) {
return null;
}
- for ( InputDataNode in : this.inputs.values() ) {
- if (Objects.equals(name, nameInCurrentModel(in))) {
- return in;
- }
- }
- return null;
+ return inputs.get(new TupleIdentifier(null, name));
}
@Override
@@ -200,7 +198,7 @@ public class DMNModelImpl
}
public void addDecision(DecisionNode dn) {
- computeDRGElementModelLocalId(dn).forEach(id -> decisions.put(id, dn));
+ computeDRGElementModelLocalId(dn).forEach(id ->
decisions.put(createTupleIdentifier(id, nameInCurrentModel(dn)), dn));
}
private List<String> computeDRGElementModelLocalId(DMNNode node) {
@@ -220,7 +218,7 @@ public class DMNModelImpl
@Override
public DecisionNode getDecisionById(String id) {
- return this.decisions.get(id);
+ return id != null ? this.decisions.get(new TupleIdentifier(id, null))
: null;
}
@Override
@@ -228,12 +226,7 @@ public class DMNModelImpl
if ( name == null ) {
return null;
}
- for ( DecisionNode dn : this.decisions.values() ) {
- if (Objects.equals(name, nameInCurrentModel(dn))) {
- return dn;
- }
- }
- return null;
+ return decisions.get(new TupleIdentifier(null, name));
}
@Override
@@ -262,23 +255,18 @@ public class DMNModelImpl
}
public void addDecisionService(DecisionServiceNode dsn) {
- computeDRGElementModelLocalId(dsn).forEach(id ->
decisionServices.put(id, dsn));
+ computeDRGElementModelLocalId(dsn).forEach(id ->
decisionServices.put(createTupleIdentifier(id, dsn.getName()), dsn));
}
public DecisionServiceNode getDecisionServiceById(String id) {
- return this.decisionServices.get(id);
+ return this.decisionServices.get(new TupleIdentifier(id, null));
}
public DecisionServiceNode getDecisionServiceByName(String name) {
if (name == null) {
return null;
}
- for (DecisionServiceNode dn : this.decisionServices.values()) {
- if (Objects.equals(name, dn.getName())) {
- return dn;
- }
- }
- return null;
+ return decisionServices.get(new TupleIdentifier(null, name));
}
@Override
@@ -287,12 +275,12 @@ public class DMNModelImpl
}
public void addBusinessKnowledgeModel(BusinessKnowledgeModelNode bkm) {
- computeDRGElementModelLocalId(bkm).forEach(id -> bkms.put(id, bkm));
+ computeDRGElementModelLocalId(bkm).forEach(id ->
bkms.put(createTupleIdentifier(id, bkm.getName()), bkm));
}
@Override
public BusinessKnowledgeModelNode getBusinessKnowledgeModelById(String id)
{
- return this.bkms.get( id );
+ return this.bkms.get( new TupleIdentifier(id, null) );
}
@Override
@@ -300,17 +288,12 @@ public class DMNModelImpl
if ( name == null ) {
return null;
}
- for ( BusinessKnowledgeModelNode bkm : this.bkms.values() ) {
- if (Objects.equals(name, bkm.getName())) {
- return bkm;
- }
- }
- return null;
+ return bkms.get(new TupleIdentifier(null, name));
}
@Override
public Set<BusinessKnowledgeModelNode> getBusinessKnowledgeModels() {
- return
this.bkms.values().stream().collect(Collectors.toCollection(LinkedHashSet::new));
+ return new LinkedHashSet<>(this.bkms.values());
}
private void collectRequiredInputs(Collection<DMNNode> deps,
Set<InputDataNode> inputs) {
@@ -327,12 +310,13 @@ public class DMNModelImpl
public void addItemDefinition(ItemDefNode idn) {
// if ID is null, generate an ID for it
- this.itemDefs.put( idn.getId() != null ? idn.getId() :
"_"+this.itemDefs.size(), idn );
+ String id = idn.getId() != null ? idn.getId() : "_" +
this.itemDefs.size();
+ this.itemDefs.put( createTupleIdentifier(id, idn.getName()), idn );
}
@Override
public ItemDefNode getItemDefinitionById(String id) {
- return this.itemDefs.get( id );
+ return this.itemDefs.get( new TupleIdentifier(id, null) );
}
@Override
@@ -340,17 +324,12 @@ public class DMNModelImpl
if ( name == null ) {
return null;
}
- for ( ItemDefNode in : this.itemDefs.values() ) {
- if (Objects.equals(name, in.getName())) {
- return in;
- }
- }
- return null;
+ return itemDefs.get(new TupleIdentifier(null, name));
}
@Override
public Set<ItemDefNode> getItemDefinitions() {
- return this.itemDefs.values().stream().collect(
Collectors.toCollection(LinkedHashSet::new) );
+ return new LinkedHashSet<>(this.itemDefs.values());
}
@Override
@@ -477,21 +456,23 @@ public class DMNModelImpl
public void setImportAliasForNS(String iAlias, String iNS, String
iModelName) {
if (getImportAliasFor(iNS, iModelName).isEmpty()) {
- this.importAliases.put(iAlias, new QName(iNS, iModelName));
+ this.importAliases.put(createTupleIdentifierByName(iAlias), new
QName(iNS, iModelName));
}
}
public Map<String, QName> getImportAliasesForNS() {
- return Collections.unmodifiableMap(this.importAliases);
+ return importAliases.entrySet()
+ .stream().collect(Collectors.toMap(tupleIdentifierQNameEntry
-> tupleIdentifierQNameEntry.getKey().getName(),
+ Entry::getValue));
}
public Optional<String> getImportAliasFor(String ns, String iModelName) {
QName lookup = new QName(ns, iModelName);
- return this.importAliases.entrySet().stream().filter(kv ->
kv.getValue().equals(lookup)).map(kv -> kv.getKey()).findFirst();
+ return this.importAliases.entrySet().stream().filter(kv ->
kv.getValue().equals(lookup)).map(kv -> kv.getKey().getName()).findFirst();
}
public QName getImportNamespaceAndNameforAlias(String iAlias) {
- return this.importAliases.get(iAlias);
+ return this.importAliases.get(createTupleIdentifierByName(iAlias));
}
public void addImportChainChild(ImportChain child, String alias) {
@@ -510,6 +491,23 @@ public class DMNModelImpl
return this.importChain.getImportChainDirectChildModels();
}
+
+ @Override
+ public void addAllUnfiltered(List<? extends DMNMessage> messages) {
+ this.messages.addAllUnfiltered( messages );
+ }
+
+ public void addPMMLImportInfo(DMNImportPMMLInfo info) {
+
this.pmmlImportInfo.put(createTupleIdentifierByName(info.getImportName()),
info);
+ }
+
+ public Map<String, DMNImportPMMLInfo> getPmmlImportInfo() {
+ return pmmlImportInfo.entrySet()
+ .stream().collect(Collectors.toMap(tupleIdentifierQNameEntry
-> tupleIdentifierQNameEntry.getKey().getName(),
+ Entry::getValue));
+
+ }
+
private static class ImportChain {
private final String alias;
private final DMNModel node;
@@ -565,19 +563,4 @@ public class DMNModelImpl
}
}
- @Override
- public void addAllUnfiltered(List<? extends DMNMessage> messages) {
- this.messages.addAllUnfiltered( messages );
- }
-
- private Map<String, DMNImportPMMLInfo> pmmlImportInfo = new HashMap<>();
-
- public void addPMMLImportInfo(DMNImportPMMLInfo info) {
- this.pmmlImportInfo.put(info.getImportName(), info);
- }
-
- public Map<String, DMNImportPMMLInfo> getPmmlImportInfo() {
- return Collections.unmodifiableMap(pmmlImportInfo);
- }
-
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/TupleIdentifier.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/TupleIdentifier.java
new file mode 100644
index 0000000000..16b3758d79
--- /dev/null
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/TupleIdentifier.java
@@ -0,0 +1,86 @@
+/**
+ * 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.Objects;
+
+public class TupleIdentifier {
+
+ private final String id;
+ private final String name;
+
+ static final String AUTO_GENERATED_ID_PREFIX = "auto-generated-id";
+ static final String AUTO_GENERATED_NAME_PREFIX = "auto-generated-name";
+
+ static TupleIdentifier createTupleIdentifier(String id, String name) {
+ return new TupleIdentifier(id, name);
+ }
+
+ static TupleIdentifier createTupleIdentifierById(String id) {
+ return new TupleIdentifier(id, generateNameFromId(id));
+ }
+
+ static TupleIdentifier createTupleIdentifierByName(String name) {
+ return new TupleIdentifier(generateIdFromName(name), name);
+ }
+
+ static String generateIdFromName(String name) {
+ return String.format("%s-%s", AUTO_GENERATED_ID_PREFIX,
Objects.hash(name));
+ }
+
+ static String generateNameFromId(String id) {
+ return String.format("%s-%s", AUTO_GENERATED_NAME_PREFIX,
Objects.hash(id));
+ }
+
+ public TupleIdentifier(String id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof TupleIdentifier that)) {
+ return false;
+ }
+ // This "null" availability it is to allow for search based only on id
or name
+ if (id == null || that.id == null) {
+ return Objects.equals(name, that.name);
+ } else if (name == null || that.name == null) {
+ return Objects.equals(id, that.id);
+ } else {
+ return Objects.equals(id, that.id) && Objects.equals(name,
that.name);
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(1); // we have to consider "null" comparisons, so
everything should go in same "bucket"
+ }
+}
\ No newline at end of file
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 fcaadef883..8b3776593e 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
@@ -20,10 +20,12 @@ package org.kie.dmn.core;
import java.util.Arrays;
import java.util.Map;
+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;
@@ -37,6 +39,7 @@ 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;
@@ -47,6 +50,8 @@ 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;
import static org.kie.dmn.core.util.DynamicTypeUtils.prototype;
@@ -164,7 +169,7 @@ public class DMNCompilerTest extends BaseVariantTest {
final ItemDefNode itemDef =
dmnModel.getItemDefinitionByName("tEmploymentStatus" );
assertThat(itemDef.getName()).isEqualTo("tEmploymentStatus");
- assertThat(itemDef.getId()).isNull();
+ assertThat(itemDef.getId()).isNotNull();
final DMNType type = itemDef.getType();
@@ -286,6 +291,57 @@ public class DMNCompilerTest extends BaseVariantTest {
}
}
+ @ParameterizedTest
+ @MethodSource("params")
+ void testNestedImports(VariantTestConf conf) {
+ testConfig = conf;
+ final DMNRuntime runtime =
createRuntimeWithAdditionalResources("0089-nested-inputdata-imports.dmn",
+
this.getClass(),
+
"Model_B.dmn",
+
"Model_B2.dmn",
+
"Say_hello_1ID1D.dmn");
+
+ final DMNModel importedModelB =
runtime.getModel("http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c",
+ "Model B");
+ assertThat(importedModelB).isNotNull();
+ for (final DMNMessage message : importedModelB.getMessages()) {
+ LOG.debug("{}", message);
+ }
+
+ final DMNModel importedModelB2 =
runtime.getModel("http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768",
+ "Model B2");
+ assertThat(importedModelB2).isNotNull();
+ for (final DMNMessage message : importedModelB2.getMessages()) {
+ LOG.debug("{}", message);
+ }
+
+ final DMNModel importedModelA=
runtime.getModel("http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9",
+ "Say hello 1ID1D");
+ assertThat(importedModelA).isNotNull();
+ for (final DMNMessage message : importedModelA.getMessages()) {
+ LOG.debug("{}", message);
+ }
+
+ final DMNModel modelC =
runtime.getModel("http://www.trisotech.com/definitions/_10435dcd-8774-4575-a338-49dd554a0928",
+ "Model C");
+ assertThat(modelC).isNotNull();
+ for (final DMNMessage message : modelC.getMessages()) {
+ LOG.debug("{}", message);
+ }
+
+ final DMNContext context = runtime.newContext();
+ context.set("Model B", mapOf(entry("modelA", mapOf(entry("Person
name", "B.A.John")))));
+ context.set("Model B2", mapOf(entry("modelA", mapOf(entry("Person
name", "B2.A.John2")))));
+
+ final DMNResult evaluateModelCDecision =
runtime.evaluateByName(modelC, context, "Model C Decision based on Bs");
+ for (final DMNMessage message : evaluateModelCDecision.getMessages()) {
+ LOG.debug("{}", message);
+ }
+ LOG.debug("{}", evaluateModelCDecision);
+
assertThat(evaluateModelCDecision.getDecisionResults()).size().isEqualTo(3);
+ evaluateModelCDecision.getDecisionResults().forEach(dmnDecisionResult
-> assertThat(dmnDecisionResult.getEvaluationStatus()).isEqualTo(SUCCEEDED));
+ }
+
@ParameterizedTest
@MethodSource("params")
void emptyNamedModelImportWithHrefNamespace(VariantTestConf conf) {
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNRuntimeTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNRuntimeTest.java
index 5489113177..5ade865fb2 100644
--- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNRuntimeTest.java
+++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNRuntimeTest.java
@@ -63,9 +63,12 @@ import
org.kie.dmn.api.core.event.BeforeEvaluateDecisionEvent;
import org.kie.dmn.api.core.event.BeforeEvaluateDecisionTableEvent;
import org.kie.dmn.api.core.event.DMNRuntimeEventListener;
import org.kie.dmn.core.api.DMNFactory;
+import org.kie.dmn.core.api.EvaluatorResult;
import org.kie.dmn.core.ast.DMNContextEvaluator;
import org.kie.dmn.core.ast.DecisionNodeImpl;
+import org.kie.dmn.core.ast.EvaluatorResultImpl;
import org.kie.dmn.core.impl.DMNModelImpl;
+import org.kie.dmn.core.impl.SimpleTypeImpl;
import org.kie.dmn.core.model.Person;
import org.kie.dmn.core.util.DMNRuntimeUtil;
import org.kie.dmn.core.util.KieHelper;
@@ -76,9 +79,11 @@ import org.kie.dmn.feel.marshaller.FEELStringMarshaller;
import org.kie.dmn.feel.util.NumberEvalHelper;
import org.kie.dmn.model.api.Decision;
import org.kie.dmn.model.api.Definitions;
+import org.kie.dmn.model.api.InformationItem;
import org.kie.dmn.model.api.ItemDefinition;
import org.kie.dmn.model.v1_1.TDecision;
import org.kie.dmn.model.v1_1.TDefinitions;
+import org.kie.dmn.model.v1_1.TInformationItem;
import org.mockito.ArgumentCaptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -1724,6 +1729,9 @@ public class DMNRuntimeTest extends
BaseInterpretedVsCompiledTest {
for (final String d : decisions) {
final Decision dec = new TDecision();
dec.setName(d);
+ InformationItem variable = new TInformationItem();
+ variable.setName("variable-" + d);
+ dec.setVariable(variable);
def.getDrgElement().add(dec);
def.addChildren(dec);
dec.setParent(def);
@@ -1732,7 +1740,12 @@ public class DMNRuntimeTest extends
BaseInterpretedVsCompiledTest {
}
private DecisionNodeImpl buildSimplifiedDecisionNode(final Definitions
def, final String name) {
- return new DecisionNodeImpl(def.getDrgElement().stream().filter(drg ->
drg.getName().equals(name)).filter(Decision.class::isInstance).map(Decision.class::cast).findFirst().get());
+ DecisionNodeImpl toReturn = new
DecisionNodeImpl(def.getDrgElement().stream().filter(drg ->
drg.getName().equals(name)).filter(Decision.class::isInstance)
+
.map(Decision.class::cast)
+
.findFirst().get());
+ toReturn.setEvaluator((eventManager, result) -> new
EvaluatorResultImpl(name, EvaluatorResult.ResultType.SUCCESS));
+ toReturn.setResultType(SimpleTypeImpl.UNKNOWN_DMNTYPE(""));
+ return toReturn;
}
@ParameterizedTest
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNModelImplTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNModelImplTest.java
new file mode 100644
index 0000000000..7663612df4
--- /dev/null
+++
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNModelImplTest.java
@@ -0,0 +1,171 @@
+/**
+ * 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.ArrayList;
+import java.util.List;
+import java.util.stream.IntStream;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.kie.dmn.api.core.ast.DecisionNode;
+import org.kie.dmn.core.ast.DecisionNodeImpl;
+import org.kie.dmn.model.api.Decision;
+import org.kie.dmn.model.api.Definitions;
+import org.kie.dmn.model.v1_5.TDecision;
+import org.kie.dmn.model.v1_5.TDefinitions;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class DMNModelImplTest {
+
+ private DMNModelImpl model;
+ private static final String MODEL_NAMESPACE = "model_namespace";
+
+ @BeforeEach
+ public void init() {
+ model = new DMNModelImpl();
+ model.setDefinitions(getDefinitions(MODEL_NAMESPACE));
+ }
+
+ @Test
+ void addDecisionSameModel() {
+ List<DecisionNode> decisionNodeList = new ArrayList<>();
+ IntStream.range(0, 3).forEach(i -> {
+ DecisionNode toAdd = getDecisionNode("id_" + i, "decision_" + i,
model.getDefinitions());
+ model.addDecision(toAdd);
+ decisionNodeList.add(toAdd);
+ });
+
+ decisionNodeList.forEach(decisionNode -> {
+ assertThat(model.getDecisionByName(decisionNode.getName()))
+ .isNotNull()
+ .isEqualTo(decisionNode);
+ assertThat(model.getDecisionById(decisionNode.getId()))
+ .isNotNull()
+ .isEqualTo(decisionNode);
+ });
+ }
+
+ @Test
+ void addDecisionWithoutIdSameModel() {
+ List<DecisionNode> decisionNodeList = new ArrayList<>();
+ IntStream.range(0, 3).forEach(i -> {
+ DecisionNode toAdd = getDecisionNode(null, "decision_" + i,
model.getDefinitions());
+ model.addDecision(toAdd);
+ decisionNodeList.add(toAdd);
+ });
+
+ decisionNodeList.forEach(decisionNode ->
+
assertThat(model.getDecisionByName(decisionNode.getName()))
+ .isNotNull()
+ .isEqualTo(decisionNode));
+ }
+
+ @Test
+ void addDecisionWithoutNameSameModel() {
+ List<DecisionNode> decisionNodeList = new ArrayList<>();
+ IntStream.range(0, 3).forEach(i -> {
+ DecisionNode toAdd = getDecisionNode("id_" + i, null,
model.getDefinitions());
+ model.addDecision(toAdd);
+ decisionNodeList.add(toAdd);
+ });
+ decisionNodeList.forEach(decisionNode ->
+
assertThat(model.getDecisionById(decisionNode.getId()))
+ .isNotNull()
+ .isEqualTo(decisionNode));
+ }
+
+ @Test
+ void addDecisionImportedModel() {
+ List<DecisionNode> decisionNodeList = new ArrayList<>();
+ String importedNameSpace = "imported_namespace";
+ Definitions definitions = getDefinitions(importedNameSpace);
+ model.setImportAliasForNS(importedNameSpace,
definitions.getNamespace(), definitions.getName());
+ IntStream.range(0, 3).forEach(i -> {
+ DecisionNode toAdd = getDecisionNode("id_" + i, "decision_" + i,
definitions);
+ model.addDecision(toAdd);
+ decisionNodeList.add(toAdd);
+ });
+
+ decisionNodeList.forEach(decisionNode -> {
+ assertThat(model.getDecisionByName(String.format("%s.%s",
importedNameSpace, decisionNode.getName())))
+ .isNotNull()
+ .isEqualTo(decisionNode);
+ assertThat(model.getDecisionById(String.format("%s#%s",
importedNameSpace, decisionNode.getId())))
+ .isNotNull()
+ .isEqualTo(decisionNode);
+ });
+ }
+
+ @Test
+ void addDecisionWithoutIdImportedModel() {
+ List<DecisionNode> decisionNodeList = new ArrayList<>();
+ String importedNameSpace = "imported_namespace";
+ Definitions definitions = getDefinitions(importedNameSpace);
+ model.setImportAliasForNS(importedNameSpace,
definitions.getNamespace(), definitions.getName());
+ IntStream.range(0, 3).forEach(i -> {
+ DecisionNode toAdd = getDecisionNode(null, "decision_" +
i,definitions);
+ model.addDecision(toAdd);
+ decisionNodeList.add(toAdd);
+ });
+
+ decisionNodeList.forEach(decisionNode ->
+
assertThat(model.getDecisionByName(String.format("%s.%s", importedNameSpace,
decisionNode.getName())))
+ .isNotNull()
+ .isEqualTo(decisionNode));
+ }
+
+ @Test
+ void addDecisionWithoutNameImportedModel() {
+ List<DecisionNode> decisionNodeList = new ArrayList<>();
+ String importedNameSpace = "imported_namespace";
+ Definitions definitions = getDefinitions(importedNameSpace);
+ model.setImportAliasForNS(importedNameSpace,
definitions.getNamespace(), definitions.getName());
+ IntStream.range(0, 3).forEach(i -> {
+ DecisionNode toAdd = getDecisionNode("id_" + i, null, definitions);
+ model.addDecision(toAdd);
+ decisionNodeList.add(toAdd);
+ });
+ decisionNodeList.forEach(decisionNode ->
+
assertThat(model.getDecisionById(String.format("%s#%s", importedNameSpace,
decisionNode.getId())))
+ .isNotNull()
+ .isEqualTo(decisionNode));
+ }
+
+ private Definitions getDefinitions(String nameSpace) {
+ Definitions toReturn = new TDefinitions();
+ toReturn.setNamespace(nameSpace);
+ toReturn.setName("Definitions_" + nameSpace);
+ return toReturn;
+ }
+
+ private DecisionNode getDecisionNode(String id, String name, Definitions
parent) {
+ Decision decision = getDecision(id, name, parent);
+ return new DecisionNodeImpl(decision);
+ }
+
+ private Decision getDecision(String id, String name, Definitions parent) {
+ Decision toReturn = new TDecision();
+ toReturn.setId(id);
+ toReturn.setName(name);
+ toReturn.setParent(parent);
+ return toReturn;
+ }
+}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/TupleIdentifierTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/TupleIdentifierTest.java
new file mode 100644
index 0000000000..af5f2eed2b
--- /dev/null
+++
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/TupleIdentifierTest.java
@@ -0,0 +1,101 @@
+/**
+ * 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 org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class TupleIdentifierTest {
+
+ @Test
+ void createTupleIdentifier() {
+ String id = "123124";
+ String name = "name";
+ TupleIdentifier retrieved = TupleIdentifier.createTupleIdentifier(id,
name);
+ assertThat(retrieved).isNotNull();
+ assertThat(retrieved.getId()).isEqualTo(id);
+ assertThat(retrieved.getName()).isEqualTo(name);
+ }
+
+ @Test
+ void createTupleIdentifierById() {
+ String id = "123124";
+ TupleIdentifier retrieved =
TupleIdentifier.createTupleIdentifierById(id);
+ assertThat(retrieved).isNotNull();
+ assertThat(retrieved.getId()).isEqualTo(id);
+ assertThat(retrieved.getName()).isNotNull();
+ }
+
+ @Test
+ void createTupleIdentifierByName() {
+ String name = "name";
+ TupleIdentifier retrieved =
TupleIdentifier.createTupleIdentifierByName(name);
+ assertThat(retrieved).isNotNull();
+ assertThat(retrieved.getName()).isEqualTo(name);
+ assertThat(retrieved.getId()).isNotNull();
+ }
+
+ @Test
+ void generateIdFromName() {
+ String name = "name";
+ String wrongName = "wrong-name";
+ String retrieved = TupleIdentifier.generateIdFromName(name);
+
assertThat(retrieved).isEqualTo(TupleIdentifier.generateIdFromName(name))
+ .isNotEqualTo(TupleIdentifier.generateIdFromName(wrongName));
+ }
+
+ @Test
+ void generateNameFromId() {
+ String id = "123124";
+ String wrongId = "423423";
+ String retrieved = TupleIdentifier.generateNameFromId(id);
+ assertThat(retrieved).isEqualTo(TupleIdentifier.generateNameFromId(id))
+ .isNotEqualTo(TupleIdentifier.generateNameFromId(wrongId));
+ }
+
+ @Test
+ void testTupleIdentifierEquality() {
+ String id = "123124";
+ String wrongId = "3242342";
+ String name = "name";
+ String wrongName = "wrong-name";
+ TupleIdentifier original = new TupleIdentifier(id, name);
+ commonTestEquality(original, new TupleIdentifier(id, name), true);
+ commonTestEquality(original, new TupleIdentifier(id, name), true);
+ commonTestEquality(original, new TupleIdentifier(null, name), true);
+ commonTestEquality(original, new TupleIdentifier(id, null), true);
+
+ commonTestEquality(original, new TupleIdentifier(id, wrongName),
false);
+ commonTestEquality(original, new TupleIdentifier(wrongId, name),
false);
+ commonTestEquality(original, new TupleIdentifier(wrongId, wrongName),
false);
+ commonTestEquality(original, new TupleIdentifier(null, wrongName),
false);
+ commonTestEquality(original, new TupleIdentifier(wrongId, null),
false);
+ }
+
+ private void commonTestEquality(TupleIdentifier original, TupleIdentifier
comparison, boolean shouldBeEqual) {
+ if (shouldBeEqual) {
+ assertThat(original).isEqualTo(comparison);
+ assertThat(comparison).isEqualTo(original);
+ } else {
+ assertThat(original).isNotEqualTo(comparison);
+ assertThat(comparison).isNotEqualTo(original);
+ }
+ }
+}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/0089-nested-inputdata-imports.dmn
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/0089-nested-inputdata-imports.dmn
new file mode 100644
index 0000000000..e158a08647
--- /dev/null
+++
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/0089-nested-inputdata-imports.dmn
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<definitions xmlns:semantic="https://www.omg.org/spec/DMN/20211108/MODEL/"
+
xmlns:dmn11="http://www.omg.org/spec/DMN/20151101/dmn.xsd"
+ xmlns:rss="http://purl.org/rss/2.0/"
+ xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"
+ xmlns:drools="http://www.drools.org/kie/dmn/1.1"
+ xmlns:trisofeed="http://trisotech.com/feed"
+
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"
+ xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"
+
xmlns:triso="http://www.trisotech.com/2015/triso/modeling"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:feel="https://www.omg.org/spec/DMN/20211108/FEEL/"
+
xmlns:include1="http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c"
+
xmlns:include2="http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768"
+ xmlns:trisodmn="http://www.trisotech.com/2016/triso/dmn"
+ xmlns:tc="http://www.omg.org/spec/DMN/20160719/testcase"
+ xmlns="https://www.omg.org/spec/DMN/20211108/MODEL/"
+ id="_10435dcd-8774-4575-a338-49dd554a0928" name="Model
C"
+
namespace="http://www.trisotech.com/definitions/_10435dcd-8774-4575-a338-49dd554a0928"
exporter="DMN Modeler" exporterVersion="6.2.4.2" triso:logoChoice="Default">
+ <import
namespace="http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c"
+ name="Model B"
+ importType="https://www.omg.org/spec/DMN/20211108/MODEL/"
/>
+ <import
namespace="http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768"
+ name="Model B2"
+ importType="https://www.omg.org/spec/DMN/20211108/MODEL/"
/>
+ <decision id="_fc1bff6c-b1ca-4a10-ba9a-23b8f5e86e6a" name="Model C
Decision based on Bs" triso:useOutputTypeAsAnswer="false">
+ <variable name="Model C Decision based on Bs"
id="_2e323310-3d83-4c51-a256-3082e0ccacea" typeRef="Any"/>
+ <informationRequirement id="_e848f84a-25ef-432b-b944-2848f11ea91c">
+ <requiredDecision
href="http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768#_96df766e-23e1-4aa6-9d5d-545fbe2f1e23"/>
+ </informationRequirement>
+ <informationRequirement id="_dc7aa090-f5ce-4552-a467-2adb36d7e263">
+ <requiredDecision
href="http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c#_96df766e-23e1-4aa6-9d5d-545fbe2f1e23"/>
+ </informationRequirement>
+ <literalExpression id="_05fab753-c3c4-41a9-8984-e078f4aabe32"
typeRef="Any" triso:expressionId="_66b680ec-9fc3-497d-831b-39708a930a1b">
+ <text>"B: " + Model B.Evaluating Say Hello + "; B2: " + Model
B2.Evaluating B2 Say Hello</text>
+ </literalExpression>
+ </decision>
+</definitions>
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B.dmn
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B.dmn
new file mode 100644
index 0000000000..9cf1c88443
--- /dev/null
+++ b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B.dmn
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<definitions xmlns:semantic="https://www.omg.org/spec/DMN/20211108/MODEL/"
+
xmlns:dmn11="http://www.omg.org/spec/DMN/20151101/dmn.xsd"
+ xmlns:rss="http://purl.org/rss/2.0/"
+ xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"
+ xmlns:drools="http://www.drools.org/kie/dmn/1.1"
+ xmlns:trisofeed="http://trisotech.com/feed"
+
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"
+ xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"
+
xmlns:triso="http://www.trisotech.com/2015/triso/modeling"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:feel="https://www.omg.org/spec/DMN/20211108/FEEL/"
+
xmlns:include1="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9"
+ xmlns:trisodmn="http://www.trisotech.com/2016/triso/dmn"
+ xmlns:tc="http://www.omg.org/spec/DMN/20160719/testcase"
+ xmlns="https://www.omg.org/spec/DMN/20211108/MODEL/"
+ id="_2a1d771a-a899-4fef-abd6-fc894332337c" name="Model
B"
+
namespace="http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c"
exporter="DMN Modeler" exporterVersion="6.2.4.2" triso:logoChoice="Default">
+ <import
namespace="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9"
+ name="modelA"
+ importType="https://www.omg.org/spec/DMN/20211108/MODEL/"
/>
+ <decision id="_96df766e-23e1-4aa6-9d5d-545fbe2f1e23" name="Evaluating Say
Hello" triso:useOutputTypeAsAnswer="false">
+ <variable name="Evaluating Say Hello"
id="_0a5ade68-3746-4022-99e3-e15e42216725" typeRef="string"/>
+ <informationRequirement id="_d3627327-056c-4117-b167-df7029d21511">
+ <requiredDecision
href="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9#_f7fdaec4-d669-4797-b3b4-12b860de2eb5"/>
+ </informationRequirement>
+ <literalExpression typeRef="string"
id="_026e05fb-6c07-4046-9c52-716ba5619a69"
triso:expressionId="_5d8ea0f4-1c32-450d-a141-60df64654436">
+ <text>"Evaluating Say Hello to: "+modelA.Greet the Person</text>
+ </literalExpression>
+ </decision>
+</definitions>
diff --git
a/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B2.dmn
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B2.dmn
new file mode 100644
index 0000000000..74f588ebdf
--- /dev/null
+++ b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B2.dmn
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<definitions xmlns:semantic="https://www.omg.org/spec/DMN/20211108/MODEL/"
+
xmlns:dmn11="http://www.omg.org/spec/DMN/20151101/dmn.xsd"
+ xmlns:rss="http://purl.org/rss/2.0/"
+ xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"
+ xmlns:drools="http://www.drools.org/kie/dmn/1.1"
+ xmlns:trisofeed="http://trisotech.com/feed"
+
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"
+ xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"
+
xmlns:triso="http://www.trisotech.com/2015/triso/modeling"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:feel="https://www.omg.org/spec/DMN/20211108/FEEL/"
+
xmlns:include1="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9"
+ xmlns:trisodmn="http://www.trisotech.com/2016/triso/dmn"
+ xmlns:tc="http://www.omg.org/spec/DMN/20160719/testcase"
+ xmlns="https://www.omg.org/spec/DMN/20211108/MODEL/"
+ id="_9d46ece4-a96c-4cb0-abc0-0ca121ac3768" name="Model
B2"
+
namespace="http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768"
exporter="DMN Modeler" exporterVersion="6.2.4.2" triso:logoChoice="Default">
+ <import
namespace="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9"
+ name="modelA"
+ importType="https://www.omg.org/spec/DMN/20211108/MODEL/" />
+ <decision id="_96df766e-23e1-4aa6-9d5d-545fbe2f1e23" name="Evaluating B2
Say Hello" triso:useOutputTypeAsAnswer="false">
+ <variable name="Evaluating B2 Say Hello"
id="_0a5ade68-3746-4022-99e3-e15e42216725" typeRef="string"/>
+ <informationRequirement id="_3eb95d84-08de-4497-9827-5dcd5cb5927e">
+ <requiredDecision
href="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9#_f7fdaec4-d669-4797-b3b4-12b860de2eb5"/>
+ </informationRequirement>
+ <literalExpression typeRef="string"
id="_026e05fb-6c07-4046-9c52-716ba5619a69"
triso:expressionId="_8ff85959-661b-4674-8a9a-f20ca598f7b1">
+ <text>"Evaluating Say Hello to: "+modelA.Greet the Person</text>
+ </literalExpression>
+ </decision>
+</definitions>
diff --git
a/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Say_hello_1ID1D.dmn
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Say_hello_1ID1D.dmn
new file mode 100644
index 0000000000..3db63e9121
--- /dev/null
+++
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Say_hello_1ID1D.dmn
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<definitions xmlns:semantic="https://www.omg.org/spec/DMN/20211108/MODEL/"
+
xmlns:dmn11="http://www.omg.org/spec/DMN/20151101/dmn.xsd"
+ xmlns:rss="http://purl.org/rss/2.0/"
+ xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"
+ xmlns:trisofeed="http://trisotech.com/feed"
+
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"
+ xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"
+
xmlns:triso="http://www.trisotech.com/2015/triso/modeling"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:feel="https://www.omg.org/spec/DMN/20211108/FEEL/"
+ xmlns:trisodmn="http://www.trisotech.com/2016/triso/dmn"
+ xmlns:tc="http://www.omg.org/spec/DMN/20160719/testcase"
+ xmlns:drools="http://www.drools.org/kie/dmn/1.1"
+ xmlns="https://www.omg.org/spec/DMN/20211108/MODEL/"
+ id="_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9" name="Say
hello 1ID1D"
+
namespace="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9"
exporter="DMN Modeler" exporterVersion="6.2.4.2" triso:logoChoice="Default">
+ <inputData id="_4f6c136c-8512-4d71-8bbf-7c9eb6e74063" name="Person name">
+ <variable name="Person name"
id="_46b6677b-4a26-4bca-9532-9a57dd55b8ec" typeRef="string"/>
+ </inputData>
+ <decision id="_f7fdaec4-d669-4797-b3b4-12b860de2eb5" name="Greet the
Person" triso:useOutputTypeAsAnswer="false">
+ <variable name="Greet the Person"
id="_85193e88-cb32-41da-9181-fb8e5450753a" typeRef="string"/>
+ <informationRequirement id="b1507384-44a9-4da7-8223-fa49ffa65410">
+ <requiredInput href="#_4f6c136c-8512-4d71-8bbf-7c9eb6e74063"/>
+ </informationRequirement>
+ <literalExpression typeRef="string"
id="_429b0c63-31e0-4f79-b457-32f565167702"
triso:expressionId="_28c34a9a-ebce-4ae4-ae8e-7eb062aa35d3">
+ <text>"Hello, "+Person name</text>
+ </literalExpression>
+ </decision>
+</definitions>
diff --git
a/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNCompilerTest.java
b/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNCompilerTest.java
index 0cbb307653..51d4eb3aef 100644
---
a/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNCompilerTest.java
+++
b/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNCompilerTest.java
@@ -59,7 +59,7 @@ public class DMNCompilerTest extends BaseDMN1_1VariantTest {
final ItemDefNode itemDef =
dmnModel.getItemDefinitionByName("tEmploymentStatus" );
assertThat(itemDef.getName()).isEqualTo("tEmploymentStatus");
- assertThat(itemDef.getId()).isNull();
+ assertThat(itemDef.getId()).isNotNull();
final DMNType type = itemDef.getType();
diff --git
a/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java
b/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java
index 8c944344a4..550a7817e2 100644
---
a/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java
+++
b/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java
@@ -58,9 +58,12 @@ import
org.kie.dmn.api.core.event.BeforeEvaluateDecisionEvent;
import org.kie.dmn.api.core.event.BeforeEvaluateDecisionTableEvent;
import org.kie.dmn.api.core.event.DMNRuntimeEventListener;
import org.kie.dmn.core.api.DMNFactory;
+import org.kie.dmn.core.api.EvaluatorResult;
import org.kie.dmn.core.ast.DMNContextEvaluator;
import org.kie.dmn.core.ast.DecisionNodeImpl;
+import org.kie.dmn.core.ast.EvaluatorResultImpl;
import org.kie.dmn.core.impl.DMNModelImpl;
+import org.kie.dmn.core.impl.SimpleTypeImpl;
import org.kie.dmn.core.model.Person;
import org.kie.dmn.core.util.DMNRuntimeUtil;
import org.kie.dmn.core.util.KieHelper;
@@ -70,9 +73,11 @@ import org.kie.dmn.feel.marshaller.FEELStringMarshaller;
import org.kie.dmn.feel.util.NumberEvalHelper;
import org.kie.dmn.model.api.Decision;
import org.kie.dmn.model.api.Definitions;
+import org.kie.dmn.model.api.InformationItem;
import org.kie.dmn.model.api.ItemDefinition;
import org.kie.dmn.model.v1_1.TDecision;
import org.kie.dmn.model.v1_1.TDefinitions;
+import org.kie.dmn.model.v1_1.TInformationItem;
import org.mockito.ArgumentCaptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -1592,6 +1597,9 @@ public class DMNRuntimeTest extends BaseDMN1_1VariantTest
{
for (final String d : decisions) {
final Decision dec = new TDecision();
dec.setName(d);
+ InformationItem variable = new TInformationItem();
+ variable.setName("variable-" + d);
+ dec.setVariable(variable);
def.getDrgElement().add(dec);
def.addChildren(dec);
dec.setParent(def);
@@ -1600,7 +1608,12 @@ public class DMNRuntimeTest extends
BaseDMN1_1VariantTest {
}
private DecisionNodeImpl buildSimplifiedDecisionNode(final Definitions
def, final String name) {
- return new DecisionNodeImpl(def.getDrgElement().stream().filter(drg ->
drg.getName().equals(name)).filter(Decision.class::isInstance).map(Decision.class::cast).findFirst().get());
+ DecisionNodeImpl toReturn = new
DecisionNodeImpl(def.getDrgElement().stream().filter(drg ->
drg.getName().equals(name)).filter(Decision.class::isInstance)
+
.map(Decision.class::cast)
+
.findFirst().get());
+ toReturn.setEvaluator((eventManager, result) -> new
EvaluatorResultImpl(name, EvaluatorResult.ResultType.SUCCESS));
+ toReturn.setResultType(SimpleTypeImpl.UNKNOWN_DMNTYPE(""));
+ return toReturn;
}
@ParameterizedTest(name = "{0}")
diff --git
a/kie-dmn/kie-dmn-model/src/main/java/org/kie/dmn/model/api/DMNElement.java
b/kie-dmn/kie-dmn-model/src/main/java/org/kie/dmn/model/api/DMNElement.java
index 5d32a16846..17c91a40e4 100644
--- a/kie-dmn/kie-dmn-model/src/main/java/org/kie/dmn/model/api/DMNElement.java
+++ b/kie-dmn/kie-dmn-model/src/main/java/org/kie/dmn/model/api/DMNElement.java
@@ -22,7 +22,7 @@ import java.util.List;
public interface DMNElement extends DMNModelInstrumentedBase {
- public static interface ExtensionElements {
+ interface ExtensionElements {
List<Object> getAny();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]