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 655d49b4c7 [Incubator kie issues#2013] Deprecates use of time types
with timezones. (#6385)
655d49b4c7 is described below
commit 655d49b4c77d28029113afd2526dae85c437b2ef
Author: ChinchuAjith <[email protected]>
AuthorDate: Tue Jul 1 21:26:22 2025 +0530
[Incubator kie issues#2013] Deprecates use of time types with timezones.
(#6385)
* Deprecate type time with timezone
* [incubator-kie-issues#2011] Implemented support for 1.6. Refactored to
avoid duplication and moved common code to abstract classes
* [incubator-kie-issues#2011] Remove leftover xsd
* Added code changes to get the current model version
* [incubator-kie-issues#2011] Fixed license headers
* [incubator-kie-issues#2011] Fixed license headers
* get dmn model version changes
* code changes to get dmn model version
* DMN Engine 1.6 changes
* Fixing Review comments fix
* Fixing Review comments
* seperating group imports
---------
Co-authored-by: Gabriele-Cardosi <[email protected]>
---
.../main/java/org/kie/dmn/api/core/DMNVersion.java | 71 ++++++++++++++++++++++
.../core/jsr223/JSR223DTExpressionEvaluator.java | 13 +++-
.../kie/dmn/core/ast/DMNInvocationEvaluator.java | 7 ++-
.../org/kie/dmn/core/compiler/DMNCompilerImpl.java | 12 ++--
.../org/kie/dmn/core/compiler/DMNFEELHelper.java | 13 ++--
.../kie/dmn/core/compiler/DMNTypeRegistryV16.java} | 34 ++++++-----
.../java/org/kie/dmn/core/impl/DMNModelImpl.java | 17 +++++-
.../org/kie/dmn/core/pmml/DMNImportPMMLInfo.java | 3 +-
.../test/java/org/kie/dmn/core/DMNRuntimeTest.java | 42 +++++++++++++
.../core/compiler/DMNEvaluatorCompilerTest.java | 3 +-
.../kie/dmn/core/compiler/DMNFEELHelperTest.java | 3 +-
.../core/impl/DMNContextFEELCtxWrapperTest.java | 6 ++
.../org/kie/dmn/feel/lang/EvaluationContext.java | 3 +
.../dmn/feel/lang/impl/EvaluationContextImpl.java | 27 +++++---
.../org/kie/dmn/feel/lang/impl/FEELBuilder.java | 10 ++-
.../java/org/kie/dmn/feel/lang/impl/FEELImpl.java | 11 +++-
.../impl/SilentWrappingEvaluationContextImpl.java | 6 ++
.../feel/runtime/functions/BaseFEELFunction.java | 20 ++++++
.../dmn/feel/runtime/functions/FEELFnResult.java | 16 +++++
.../dmn/feel/runtime/functions/RangeFunction.java | 3 +-
.../dmn/feel/runtime/functions/TimeFunction.java | 8 ++-
.../src/main/java/org/kie/dmn/feel/util/Msg.java | 2 +-
.../dmn/feel/runtime/FEELDateTimeDurationTest.java | 32 +++++-----
.../feel/runtime/functions/FEELFnResultTest.java} | 59 ++++++------------
.../dmn/feel/util/EvaluationContextTestUtil.java | 5 +-
.../legacy/tests/core/v1_1/DMNCompilerTest.java | 9 +--
.../kie/dmn/openapi/impl/BaseNodeSchemaMapper.java | 3 +-
.../org/kie/dmn/openapi/impl/MapperHelper.java | 5 +-
.../valid_models/DMNv1_5/timeFunction.dmn | 54 ++++++++++++++++
.../valid_models/DMNv1_6/timeFunction.dmn | 60 ++++++++++++++++++
30 files changed, 438 insertions(+), 119 deletions(-)
diff --git
a/kie-dmn/kie-dmn-api/src/main/java/org/kie/dmn/api/core/DMNVersion.java
b/kie-dmn/kie-dmn-api/src/main/java/org/kie/dmn/api/core/DMNVersion.java
new file mode 100644
index 0000000000..1510b14cd1
--- /dev/null
+++ b/kie-dmn/kie-dmn-api/src/main/java/org/kie/dmn/api/core/DMNVersion.java
@@ -0,0 +1,71 @@
+/*
+ * 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.api.core;
+
+import java.util.Collection;
+
+public enum DMNVersion {
+
+ V1_1(11),
+ V1_2(12),
+ V1_3(13),
+ V1_4(14),
+ V1_5(15),
+ V1_6(16);
+
+ private final int dmnVersion;
+
+
+ DMNVersion(int dmnVersion) {
+ this.dmnVersion = dmnVersion;
+ }
+
+ public int getDmnVersion() {
+ return dmnVersion;
+ }
+
+ public static DMNVersion getLatest() {
+ DMNVersion latest = null;
+ for (DMNVersion version : DMNVersion.values()) {
+ if (latest == null || version.dmnVersion > latest.dmnVersion) {
+ latest = version;
+ }
+ }
+ return latest;
+ }
+
+ public static DMNVersion inferDMNVersion(Collection<String>
nsContextValues) {
+ DMNVersion toReturn = DMNVersion.getLatest();
+ if
(nsContextValues.stream().anyMatch(org.kie.dmn.model.v1_6.KieDMNModelInstrumentedBase.URI_DMN::equals))
{
+ toReturn = DMNVersion.V1_6;
+ }else if
(nsContextValues.stream().anyMatch(org.kie.dmn.model.v1_5.KieDMNModelInstrumentedBase.URI_DMN::equals))
{
+ toReturn = DMNVersion.V1_5;
+ } else if
(nsContextValues.stream().anyMatch(org.kie.dmn.model.v1_4.KieDMNModelInstrumentedBase.URI_DMN::equals))
{
+ toReturn = DMNVersion.V1_4;
+ } else if
(nsContextValues.stream().anyMatch(org.kie.dmn.model.v1_3.KieDMNModelInstrumentedBase.URI_DMN::equals))
{
+ toReturn = DMNVersion.V1_3;
+ } else if
(nsContextValues.stream().anyMatch(org.kie.dmn.model.v1_2.KieDMNModelInstrumentedBase.URI_DMN::equals))
{
+ toReturn = DMNVersion.V1_2;
+ } else if
(nsContextValues.stream().anyMatch(org.kie.dmn.model.v1_1.KieDMNModelInstrumentedBase.URI_DMN::equals))
{
+ toReturn = DMNVersion.V1_1;
+ }
+ return toReturn;
+ }
+
+}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-core-jsr223/src/main/java/org/kie/dmn/core/jsr223/JSR223DTExpressionEvaluator.java
b/kie-dmn/kie-dmn-core-jsr223/src/main/java/org/kie/dmn/core/jsr223/JSR223DTExpressionEvaluator.java
index 73f77b7c4a..7cac3907f1 100644
---
a/kie-dmn/kie-dmn-core-jsr223/src/main/java/org/kie/dmn/core/jsr223/JSR223DTExpressionEvaluator.java
+++
b/kie-dmn/kie-dmn-core-jsr223/src/main/java/org/kie/dmn/core/jsr223/JSR223DTExpressionEvaluator.java
@@ -30,6 +30,7 @@ import javax.script.ScriptException;
import org.drools.model.functions.Function1;
import org.kie.dmn.api.core.DMNResult;
import org.kie.dmn.api.core.DMNRuntime;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.core.ast.DMNNode;
import org.kie.dmn.api.core.event.DMNRuntimeEventManager;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
@@ -98,7 +99,7 @@ public class JSR223DTExpressionEvaluator implements
DMNExpressionEvaluator {
results.addResult(rIndex, "", new
Fn(rule.outLiteralExpr.getEval()));
}
}
- Object dtr = results.applyHitPolicy(new
JSR223WrappingEC(contextValues, events), hitPolicy, decisionTableModel);
+ Object dtr = results.applyHitPolicy(new
JSR223WrappingEC(contextValues, events, DMNVersion.getLatest()), hitPolicy,
decisionTableModel);
r = DMNDTExpressionEvaluator.processEvents( events, dmrem, result,
node );
return new EvaluatorResultImpl( dtr, r.hasErrors ?
ResultType.FAILURE : ResultType.SUCCESS );
@@ -171,10 +172,12 @@ public class JSR223DTExpressionEvaluator implements
DMNExpressionEvaluator {
private final List<FEELEvent> events;
// Defaulting FEELDialect to FEEL
private final FEELDialect dialect = FEELDialect.FEEL;
+ private final DMNVersion dmnVersion;
- public JSR223WrappingEC(Map<String, Object> values, List<FEELEvent>
events) {
+ public JSR223WrappingEC(Map<String, Object> values, List<FEELEvent>
events, DMNVersion dmnVersion) {
this.values = Collections.unmodifiableMap(values);
this.events = events;
+ this.dmnVersion = dmnVersion;
}
@Override
@@ -256,6 +259,12 @@ public class JSR223DTExpressionEvaluator implements
DMNExpressionEvaluator {
public FEELDialect getFEELDialect() {
return dialect;
}
+
+ @Override
+ public DMNVersion getDMNVersion() {
+ return dmnVersion;
+ }
+
}
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNInvocationEvaluator.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNInvocationEvaluator.java
index 7ea11a4169..5370103ee2 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNInvocationEvaluator.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNInvocationEvaluator.java
@@ -26,13 +26,14 @@ import java.util.function.BiFunction;
import javax.xml.namespace.QName;
import org.kie.dmn.api.core.DMNContext;
-import org.kie.dmn.api.core.DMNMessage;
import org.kie.dmn.api.core.DMNResult;
import org.kie.dmn.api.core.DMNType;
+import org.kie.dmn.api.core.EvaluatorResult;
+import org.kie.dmn.api.core.DMNMessage;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.core.event.DMNRuntimeEventManager;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.core.api.DMNExpressionEvaluator;
-import org.kie.dmn.api.core.EvaluatorResult;
import org.kie.dmn.api.core.EvaluatorResult.ResultType;
import org.kie.dmn.core.impl.DMNModelImpl;
import org.kie.dmn.core.impl.DMNResultImpl;
@@ -188,7 +189,7 @@ public class DMNInvocationEvaluator
FEELEventListenersManager listenerMgr = new
FEELEventListenersManager();
listenerMgr.addListener(events::add);
- EvaluationContextImpl ctx = new EvaluationContextImpl(listenerMgr,
eventManager.getRuntime(), FEELDialect.FEEL);
+ EvaluationContextImpl ctx = new EvaluationContextImpl(listenerMgr,
eventManager.getRuntime(), FEELDialect.FEEL, DMNVersion.getLatest());
invocationResult = function.invokeReflectively( ctx, namedParams );
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 f5e2c8560e..3bd3bffe2f 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
@@ -37,11 +37,12 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.xml.namespace.QName;
import org.kie.api.io.Resource;
-import org.kie.dmn.api.core.DMNCompiler;
-import org.kie.dmn.api.core.DMNCompilerConfiguration;
import org.kie.dmn.api.core.DMNMessage;
import org.kie.dmn.api.core.DMNModel;
import org.kie.dmn.api.core.DMNType;
+import org.kie.dmn.api.core.DMNVersion;
+import org.kie.dmn.api.core.DMNCompiler;
+import org.kie.dmn.api.core.DMNCompilerConfiguration;
import org.kie.dmn.api.core.ast.BusinessKnowledgeModelNode;
import org.kie.dmn.api.core.ast.DMNNode;
import org.kie.dmn.api.core.ast.DecisionNode;
@@ -203,7 +204,7 @@ public class DMNCompilerImpl implements DMNCompiler {
}
DMNModelImpl model = new DMNModelImpl(dmndefs, resource);
model.setRuntimeTypeCheck(((DMNCompilerConfigurationImpl)
dmnCompilerConfig).getOption(RuntimeTypeCheckOption.class).isRuntimeTypeCheck());
- DMNCompilerContext ctx = configureDMNCompiler(model.getFeelDialect(),
relativeResolver);
+ DMNCompilerContext ctx = configureDMNCompiler(model.getFeelDialect(),
model.getDMNVersion(), relativeResolver);
if (!dmndefs.getImport().isEmpty()) {
iterateImports(dmndefs, dmnModels, model, relativeResolver );
}
@@ -215,13 +216,14 @@ public class DMNCompilerImpl implements DMNCompiler {
/**
* This method will Configures and creates a DMNCompilerContext for the
DMN compiler, setting up the FEEL helper and relative resolver.
* @param feeldialect : It used by the DMN compiler for parsing and
evaluating FEEL expressions.
+ * @param dmnVersion : DMN version of the model.
* @param relativeResolver : A Function that resolves relative paths to
resources as Reader.
* @return A configured DMNCompilerContext instance that can be used in
the DMN compilation process.
*/
- private DMNCompilerContext configureDMNCompiler(FEELDialect feeldialect,
Function<String, Reader> relativeResolver) {
+ private DMNCompilerContext configureDMNCompiler(FEELDialect feeldialect,
DMNVersion dmnVersion, Function<String, Reader> relativeResolver) {
DMNCompilerConfigurationImpl cc = (DMNCompilerConfigurationImpl)
dmnCompilerConfig;
List<FEELProfile> helperFEELProfiles = cc.getFeelProfiles();
- DMNFEELHelper feel = new DMNFEELHelper(cc.getRootClassLoader(),
helperFEELProfiles, feeldialect);
+ DMNFEELHelper feel = new DMNFEELHelper(cc.getRootClassLoader(),
helperFEELProfiles, feeldialect, dmnVersion);
DMNCompilerContext ctx = new DMNCompilerContext(feel);
ctx.setRelativeResolver(relativeResolver);
return ctx;
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNFEELHelper.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNFEELHelper.java
index 87e954201a..33187ab0a9 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNFEELHelper.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNFEELHelper.java
@@ -35,6 +35,7 @@ import org.antlr.v4.runtime.CommonToken;
import org.kie.dmn.api.core.DMNContext;
import org.kie.dmn.api.core.DMNMessage;
import org.kie.dmn.api.core.DMNType;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.api.feel.runtime.events.FEELEventListener;
import org.kie.dmn.core.impl.BaseDMNTypeImpl;
@@ -74,17 +75,19 @@ public class DMNFEELHelper {
private final FEELEventsListenerImpl listener;
private final List<FEELProfile> feelProfiles = new ArrayList<>();
private final FEELDialect feelDialect;
+ private final DMNVersion dmnVersion;
- public DMNFEELHelper(List<FEELProfile> feelProfiles, FEELDialect
feelDialect) {
- this(ClassLoaderUtil.findDefaultClassLoader(), feelProfiles,
feelDialect);
+ public DMNFEELHelper(List<FEELProfile> feelProfiles, FEELDialect
feelDialect, DMNVersion dmnVersion) {
+ this(ClassLoaderUtil.findDefaultClassLoader(), feelProfiles,
feelDialect, dmnVersion);
}
- public DMNFEELHelper(ClassLoader classLoader, List<FEELProfile>
feelProfiles, FEELDialect feelDialect) {
+ public DMNFEELHelper(ClassLoader classLoader, List<FEELProfile>
feelProfiles, FEELDialect feelDialect, DMNVersion dmnVersion) {
this.classLoader = classLoader;
this.feelProfiles.addAll(feelProfiles);
this.listener = new FEELEventsListenerImpl();
this.feelDialect = feelDialect;
this.feel = createFEELInstance();
+ this.dmnVersion = dmnVersion;
}
private FEEL createFEELInstance() {
@@ -101,6 +104,7 @@ public class DMNFEELHelper {
return FEELBuilder.builder().withClassloader(classLoader)
.withProfiles(feelProfiles)
.withFEELDialect(feelDialect)
+ .withDMNVersion(dmnVersion)
.build();
}
@@ -114,6 +118,7 @@ public class DMNFEELHelper {
return FEELBuilder.builder().withClassloader(classLoader)
.withProfiles(feelProfiles)
.withFEELDialect(overridingFeelDialect)
+ .withDMNVersion(dmnVersion)
.build();
}
@@ -122,7 +127,7 @@ public class DMNFEELHelper {
FEELEventsListenerImpl listener = new FEELEventsListenerImpl();
manager.addListener( listener );
// Defaulting FEELDialect to FEEL
- EvaluationContextImpl ctx = new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), manager,
FEELDialect.FEEL);
+ EvaluationContextImpl ctx = new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), manager,
FEELDialect.FEEL, DMNVersion.getLatest());
try {
ctx.enterFrame();
if ( dmnContext != null ) {
diff --git
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvaluationContextTestUtil.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV16.java
similarity index 50%
copy from
kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvaluationContextTestUtil.java
copy to
kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV16.java
index f530daa76f..db6c0915dc 100644
---
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvaluationContextTestUtil.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV16.java
@@ -16,26 +16,32 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.dmn.feel.util;
+package org.kie.dmn.core.compiler;
-import org.kie.dmn.feel.lang.EvaluationContext;
-import org.kie.dmn.feel.lang.FEELDialect;
-import org.kie.dmn.feel.lang.impl.EvaluationContextImpl;
-import org.kie.dmn.feel.lang.impl.FEELEventListenersManager;
+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_6.KieDMNModelInstrumentedBase;
-public class EvaluationContextTestUtil {
+import javax.xml.namespace.QName;
+import java.util.Map;
- private EvaluationContextTestUtil() {
- // only static methods for util class.
+public class DMNTypeRegistryV16 extends DMNTypeRegistryAbstract {
+
+ private static final DMNType UNKNOWN =
SimpleTypeImpl.UNKNOWN_DMNTYPE(KieDMNModelInstrumentedBase.URI_FEEL);
+
+
+ public DMNTypeRegistryV16(Map<TupleIdentifier, QName> aliases) {
+ super(aliases);
}
- public static EvaluationContext
newEmptyEvaluationContext(FEELEventListenersManager mgr) {
- // Defaulting FEELDialect to FEEL
- return new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), mgr,
FEELDialect.FEEL);
+ @Override
+ public DMNType unknown() {
+ return UNKNOWN;
}
- public static EvaluationContext newEmptyEvaluationContext() {
- // Defaulting FEELDialect to FEEL
- return new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), null,
FEELDialect.FEEL);
+ @Override
+ public String feelNS() {
+ return KieDMNModelInstrumentedBase.URI_FEEL;
}
}
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 3d918943df..48728e1b33 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
@@ -44,6 +44,7 @@ import org.kie.api.io.Resource;
import org.kie.dmn.api.core.DMNMessage;
import org.kie.dmn.api.core.DMNMessageType;
import org.kie.dmn.api.core.DMNModel;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.core.ast.BusinessKnowledgeModelNode;
import org.kie.dmn.api.core.ast.DMNNode;
import org.kie.dmn.api.core.ast.DecisionNode;
@@ -59,11 +60,12 @@ import org.kie.dmn.core.ast.BusinessKnowledgeModelNodeImpl;
import org.kie.dmn.core.ast.DecisionNodeImpl;
import org.kie.dmn.core.compiler.DMNCompilerImpl;
import org.kie.dmn.core.compiler.DMNTypeRegistry;
-import org.kie.dmn.core.compiler.DMNTypeRegistryV11;
+import org.kie.dmn.core.compiler.DMNTypeRegistryV14;
import org.kie.dmn.core.compiler.DMNTypeRegistryV12;
+import org.kie.dmn.core.compiler.DMNTypeRegistryV11;
import org.kie.dmn.core.compiler.DMNTypeRegistryV13;
-import org.kie.dmn.core.compiler.DMNTypeRegistryV14;
import org.kie.dmn.core.compiler.DMNTypeRegistryV15;
+import org.kie.dmn.core.compiler.DMNTypeRegistryV16;
import org.kie.dmn.core.pmml.DMNImportPMMLInfo;
import org.kie.dmn.core.util.DefaultDMNMessagesManager;
import org.kie.dmn.feel.lang.FEELDialect;
@@ -107,6 +109,8 @@ public class DMNModelImpl
private FEELDialect feelDialect;
+ private DMNVersion dmnVersion;
+
public DMNModelImpl() {
// needed because Externalizable.
}
@@ -119,6 +123,7 @@ public class DMNModelImpl
String expressionLanguage = definitions.getExpressionLanguage() !=
null ? definitions.getExpressionLanguage() : "";
try {
feelDialect = FEELDialect.fromNamespace(expressionLanguage);
+ dmnVersion =
DMNVersion.inferDMNVersion(definitions.getNsContext().values());
} catch (IllegalArgumentException e) {
feelDialect = FEELDialect.FEEL;
}
@@ -134,6 +139,10 @@ public class DMNModelImpl
return feelDialect;
}
+ public DMNVersion getDMNVersion() {
+ return dmnVersion;
+ }
+
private void wireTypeRegistry(Definitions definitions) {
if (definitions instanceof org.kie.dmn.model.v1_1.TDefinitions) {
types = new
DMNTypeRegistryV11(Collections.unmodifiableMap(importAliases));
@@ -143,8 +152,10 @@ public class DMNModelImpl
types = new
DMNTypeRegistryV13(Collections.unmodifiableMap(importAliases));
} else if (definitions instanceof org.kie.dmn.model.v1_4.TDefinitions)
{
types = new
DMNTypeRegistryV14(Collections.unmodifiableMap(importAliases));
- } else {
+ } else if (definitions instanceof org.kie.dmn.model.v1_5.TDefinitions)
{
types = new
DMNTypeRegistryV15(Collections.unmodifiableMap(importAliases));
+ } else {
+ types = new
DMNTypeRegistryV16(Collections.unmodifiableMap(importAliases));
}
}
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/pmml/DMNImportPMMLInfo.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/pmml/DMNImportPMMLInfo.java
index a623c9918f..e89aa0f977 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/pmml/DMNImportPMMLInfo.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/pmml/DMNImportPMMLInfo.java
@@ -35,6 +35,7 @@ import org.dmg.pmml.OutputField;
import org.dmg.pmml.PMML;
import org.dmg.pmml.Value;
import org.kie.dmn.api.core.DMNType;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.core.compiler.DMNCompilerConfigurationImpl;
import org.kie.dmn.core.compiler.DMNFEELHelper;
import org.kie.dmn.core.impl.CompositeTypeImpl;
@@ -67,7 +68,7 @@ public class DMNImportPMMLInfo extends
PMMLInfo<DMNPMMLModelInfo> {
String dfName =df.getName();
BuiltInType ft = getBuiltInTypeByDataType(df.getDataType());
List<FEELProfile> helperFEELProfiles = cc.getFeelProfiles();
- DMNFEELHelper feel = new
DMNFEELHelper(cc.getRootClassLoader(), helperFEELProfiles,
model.getFeelDialect());
+ DMNFEELHelper feel = new
DMNFEELHelper(cc.getRootClassLoader(), helperFEELProfiles,
model.getFeelDialect(), model.getDMNVersion());
List<UnaryTest> av = new ArrayList<>();
if (df.getValues() != null && !df.getValues().isEmpty() && ft
!= BuiltInType.UNKNOWN) {
final BuiltInType feelType = ft;
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 b59610dcb4..c1d1f8a781 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
@@ -62,6 +62,7 @@ import
org.kie.dmn.api.core.event.BeforeEvaluateContextEntryEvent;
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.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.core.api.DMNFactory;
import org.kie.dmn.api.core.EvaluatorResult;
import org.kie.dmn.core.ast.DMNContextEvaluator;
@@ -76,7 +77,9 @@ import org.kie.dmn.feel.lang.FEELProperty;
import org.kie.dmn.feel.lang.types.BuiltInType;
import org.kie.dmn.feel.lang.types.impl.ComparablePeriod;
import org.kie.dmn.feel.marshaller.FEELStringMarshaller;
+import org.kie.dmn.feel.runtime.events.FEELEventBase;
import org.kie.dmn.feel.util.BuiltInTypeUtils;
+import org.kie.dmn.feel.util.Msg;
import org.kie.dmn.feel.util.NumberEvalHelper;
import org.kie.dmn.model.api.Decision;
import org.kie.dmn.model.api.Definitions;
@@ -770,6 +773,45 @@ public class DMNRuntimeTest extends
BaseInterpretedVsCompiledTest {
assertThat(dmnResult.getContext().get("time")).as(DMNRuntimeUtil.formatMessages(dmnResult.getMessages())).isEqualTo(LocalTime.of(5,
48, 23));
}
+ @ParameterizedTest
+ @MethodSource("params")
+ void timeFunctionWithoutWarningEvent(boolean useExecModelCompiler) {
+ init(useExecModelCompiler);
+ final DMNRuntime runtime =
DMNRuntimeUtil.createRuntime("valid_models/DMNv1_5/timeFunction.dmn",
getClass());
+ runtime.addListener(DMNRuntimeUtil.createListener());
+
+ final DMNModel dmnModel =
runtime.getModel("https://kie.org/dmn/_72913353-6A25-4439-AE70-4383A0544F31",
"DMN_50C0E61A-D1F2-41F0-8BD4-CE42BA135F43");
+ assertThat(dmnModel).isNotNull();
+
assertThat(dmnModel.hasErrors()).as(DMNRuntimeUtil.formatMessages(dmnModel.getMessages())).isFalse();
+
+ final DMNContext context = DMNFactory.newContext();
+ context.set("a_time", "00:01:00@Etc/UTC");
+ final DMNResult dmnResult = runtime.evaluateAll(dmnModel, context);
+ assertThat(dmnResult).isNotNull();
+ assertThat(dmnResult.getMessages().size()).isEqualTo(0);
+ }
+
+ @ParameterizedTest
+ @MethodSource("params")
+ void timeFunctionWithWarningEvent(boolean useExecModelCompiler) {
+ init(useExecModelCompiler);
+ String expectedMessage =
Msg.createMessage(Msg.DEPRECATE_TIME_WITH_TIMEZONE);
+ final DMNRuntime runtime =
DMNRuntimeUtil.createRuntime("valid_models/DMNv1_6/timeFunction.dmn",
getClass());
+ runtime.addListener(DMNRuntimeUtil.createListener());
+
+ final DMNModel dmnModel =
runtime.getModel("https://kie.org/dmn/_72913353-6A25-4439-AE70-4383A0544F31",
"DMN_50C0E61A-D1F2-41F0-8BD4-CE42BA135F43");
+ assertThat(dmnModel).isNotNull();
+
assertThat(dmnModel.hasErrors()).as(DMNRuntimeUtil.formatMessages(dmnModel.getMessages())).isFalse();
+
+ final DMNContext context = DMNFactory.newContext();
+ context.set("a_time", "00:01:00@Etc/UTC");
+ final DMNResult dmnResult = runtime.evaluateAll(dmnModel, context);
+ assertThat(dmnResult).isNotNull();
+ assertThat(dmnResult.getMessages().size()).isEqualTo(1);
+
assertThat(dmnResult.getMessages().get(0).getFeelEvent().getMessage()).isEqualTo(expectedMessage);
+ }
+
+
@ParameterizedTest
@MethodSource("params")
void alternativeNSDecl(boolean useExecModelCompiler) {
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNEvaluatorCompilerTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNEvaluatorCompilerTest.java
index d316b3bea3..0d5c577351 100644
---
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNEvaluatorCompilerTest.java
+++
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNEvaluatorCompilerTest.java
@@ -28,6 +28,7 @@ import org.kie.api.io.Resource;
import org.kie.dmn.api.core.DMNModel;
import org.kie.dmn.api.core.DMNRuntime;
import org.kie.dmn.api.core.DMNType;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.core.api.DMNExpressionEvaluator;
import org.kie.dmn.core.ast.DMNBaseNode;
import org.kie.dmn.core.ast.DMNConditionalEvaluator;
@@ -62,7 +63,7 @@ class DMNEvaluatorCompilerTest {
@BeforeAll
static void setUp() {
- DMN_FEEL_HELPER = new DMNFEELHelper(Collections.emptyList(),
DEFAULT_FEEL_DIALECT);
+ DMN_FEEL_HELPER = new DMNFEELHelper(Collections.emptyList(),
DEFAULT_FEEL_DIALECT, DMNVersion.getLatest());
DMN_COMPILER_CONTEXT = new DMNCompilerContext(DMN_FEEL_HELPER);
DMNCompilerImpl compiler = new DMNCompilerImpl();
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNFEELHelperTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNFEELHelperTest.java
index 7de9cdba7a..9aca7b6c3a 100644
---
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNFEELHelperTest.java
+++
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/DMNFEELHelperTest.java
@@ -22,6 +22,7 @@ import java.util.Collections;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.feel.FEEL;
import org.kie.dmn.feel.lang.FEELDialect;
import org.kie.dmn.feel.lang.impl.FEELImpl;
@@ -35,7 +36,7 @@ class DMNFEELHelperTest {
@BeforeAll
static void setUp() {
- DMN_FEEL_HELPER = new DMNFEELHelper(Collections.emptyList(),
DEFAULT_FEEL_DIALECT);
+ DMN_FEEL_HELPER = new DMNFEELHelper(Collections.emptyList(),
DEFAULT_FEEL_DIALECT, DMNVersion.getLatest());
}
@Test
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNContextFEELCtxWrapperTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNContextFEELCtxWrapperTest.java
index a2b59ef19c..d5322832cf 100644
---
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNContextFEELCtxWrapperTest.java
+++
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNContextFEELCtxWrapperTest.java
@@ -26,6 +26,7 @@ import java.util.function.Supplier;
import org.junit.jupiter.api.Test;
import org.kie.dmn.api.core.DMNRuntime;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.api.feel.runtime.events.FEELEventListener;
import org.kie.dmn.core.BaseDMNContextTest;
@@ -167,6 +168,11 @@ class DMNContextFEELCtxWrapperTest extends
BaseDMNContextTest {
// Defaulting FEELDialect to FEEL
return FEELDialect.FEEL;
}
+
+ @Override
+ public DMNVersion getDMNVersion() {
+ return DMNVersion.getLatest();
+ }
}
}
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/EvaluationContext.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/EvaluationContext.java
index 622412cb83..b521f0dcf0 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/EvaluationContext.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/EvaluationContext.java
@@ -23,6 +23,7 @@ import java.util.Map;
import java.util.function.Supplier;
import org.kie.dmn.api.core.DMNRuntime;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.api.feel.runtime.events.FEELEventListener;
@@ -60,4 +61,6 @@ public interface EvaluationContext {
Object getRootObject();
FEELDialect getFEELDialect();
+
+ DMNVersion getDMNVersion();
}
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/EvaluationContextImpl.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/EvaluationContextImpl.java
index 9fb8b396c2..bbd79af6d4 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/EvaluationContextImpl.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/EvaluationContextImpl.java
@@ -27,6 +27,7 @@ import java.util.Map;
import java.util.function.Supplier;
import org.kie.dmn.api.core.DMNRuntime;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.api.feel.runtime.events.FEELEventListener;
import org.kie.dmn.feel.lang.EvaluationContext;
@@ -45,20 +46,22 @@ public class EvaluationContextImpl implements
EvaluationContext {
private boolean performRuntimeTypeCheck = false;
private ClassLoader rootClassLoader;
private final FEELDialect feelDialect;
+ private final DMNVersion dmnVersion;
- private EvaluationContextImpl(ClassLoader cl, FEELEventListenersManager
eventsManager, Deque<ExecutionFrame> stack, FEELDialect feelDialect) {
+ private EvaluationContextImpl(ClassLoader cl, FEELEventListenersManager
eventsManager, Deque<ExecutionFrame> stack, FEELDialect feelDialect, DMNVersion
dmnVersion) {
this.eventsManager = eventsManager;
this.rootClassLoader = cl;
this.stack = new ArrayDeque<>(stack);
this.feelDialect = feelDialect;
+ this.dmnVersion = dmnVersion;
}
- public EvaluationContextImpl(ClassLoader cl, FEELEventListenersManager
eventsManager, FEELDialect feelDialect) {
- this(cl, eventsManager, 32, feelDialect);
+ public EvaluationContextImpl(ClassLoader cl, FEELEventListenersManager
eventsManager, FEELDialect feelDialect, DMNVersion dmnVersion) {
+ this(cl, eventsManager, 32, feelDialect, dmnVersion);
}
- public EvaluationContextImpl(ClassLoader cl, FEELEventListenersManager
eventsManager, int size, FEELDialect feelDialect) {
- this(cl, eventsManager, new ArrayDeque<>(), feelDialect);
+ public EvaluationContextImpl(ClassLoader cl, FEELEventListenersManager
eventsManager, int size, FEELDialect feelDialect, DMNVersion dmnVersion) {
+ this(cl, eventsManager, new ArrayDeque<>(), feelDialect, dmnVersion);
// we create a rootFrame to hold all the built in functions
push( RootExecutionFrame.INSTANCE );
// and then create a global frame to be the starting frame
@@ -68,19 +71,20 @@ public class EvaluationContextImpl implements
EvaluationContext {
}
@Deprecated
- public EvaluationContextImpl(FEELEventListenersManager eventsManager,
DMNRuntime dmnRuntime, FEELDialect feelDialect) {
- this(dmnRuntime.getRootClassLoader(), eventsManager, feelDialect);
+ public EvaluationContextImpl(FEELEventListenersManager eventsManager,
DMNRuntime dmnRuntime, FEELDialect feelDialect, DMNVersion dmnVersion) {
+ this(dmnRuntime.getRootClassLoader(), eventsManager, feelDialect,
dmnVersion);
this.dmnRuntime = dmnRuntime;
}
- private EvaluationContextImpl(FEELEventListenersManager eventsManager,
FEELDialect feelDialect) {
+ private EvaluationContextImpl(FEELEventListenersManager eventsManager,
FEELDialect feelDialect, DMNVersion dmnVersion) {
this.eventsManager = eventsManager;
this.feelDialect = feelDialect;
+ this.dmnVersion = dmnVersion;
}
@Override
public EvaluationContext current() {
- EvaluationContextImpl ec = new EvaluationContextImpl(eventsManager,
feelDialect);
+ EvaluationContextImpl ec = new EvaluationContextImpl(eventsManager,
feelDialect, dmnVersion);
ec.stack = stack.clone();
ec.rootClassLoader = this.rootClassLoader;
ec.dmnRuntime = this.dmnRuntime;
@@ -238,4 +242,9 @@ public class EvaluationContextImpl implements
EvaluationContext {
public FEELDialect getFEELDialect() {
return feelDialect;
}
+
+ @Override
+ public DMNVersion getDMNVersion() {
+ return dmnVersion;
+ }
}
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/FEELBuilder.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/FEELBuilder.java
index deb4841665..d53c834e0c 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/FEELBuilder.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/FEELBuilder.java
@@ -21,6 +21,7 @@ package org.kie.dmn.feel.lang.impl;
import java.util.Collections;
import java.util.List;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.feel.FEEL;
import org.kie.dmn.feel.lang.FEELDialect;
import org.kie.dmn.feel.lang.FEELProfile;
@@ -40,6 +41,7 @@ public class FEELBuilder {
private ClassLoader classLoader;
private List<FEELProfile> profiles;
private FEELDialect feelDialect;
+ private DMNVersion dmnVersion;
private Builder() {
}
@@ -59,11 +61,17 @@ public class FEELBuilder {
return this;
}
+ public Builder withDMNVersion(DMNVersion dmnVersion) {
+ this.dmnVersion = dmnVersion;
+ return this;
+ }
+
public FEEL build() {
ClassLoader classLoaderToUse = classLoader != null ? classLoader :
ClassLoaderUtil.findDefaultClassLoader();
List<FEELProfile> profilesToUse = profiles != null ? profiles :
Collections.emptyList();
FEELDialect feelDialectToUse = feelDialect != null ? feelDialect :
FEELDialect.FEEL;
- return new FEELImpl(classLoaderToUse, profilesToUse,
feelDialectToUse);
+ DMNVersion dmnVersionToUse = dmnVersion != null ? dmnVersion :
DMNVersion.getLatest();
+ return new FEELImpl(classLoaderToUse, profilesToUse,
feelDialectToUse, dmnVersionToUse);
}
}
}
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/FEELImpl.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/FEELImpl.java
index f825fcd7b3..aadea6e4c4 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/FEELImpl.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/FEELImpl.java
@@ -27,6 +27,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.feel.runtime.events.FEELEventListener;
import org.kie.dmn.feel.FEEL;
import org.kie.dmn.feel.codegen.feel11.CompiledFEELExpression;
@@ -60,8 +61,9 @@ public class FEELImpl
private final Collection<FEELFunction> customFunctions;
private final boolean doCompile;
private final FEELDialect feelDialect;
+ private final DMNVersion dmnVersion;
- FEELImpl(ClassLoader cl, List<FEELProfile> profiles, FEELDialect
feelDialect) {
+ FEELImpl(ClassLoader cl, List<FEELProfile> profiles, FEELDialect
feelDialect, DMNVersion dmnVersion) {
this.classLoader = cl;
this.profiles = Collections.unmodifiableList(profiles);
ExecutionFrameImpl frame = null;
@@ -85,6 +87,7 @@ public class FEELImpl
customFrame = Optional.ofNullable(frame);
customFunctions =
Collections.unmodifiableCollection(functions.values());
this.feelDialect = feelDialect;
+ this.dmnVersion = dmnVersion;
}
@Override
@@ -174,7 +177,7 @@ public class FEELImpl
*/
public EvaluationContextImpl newEvaluationContext(ClassLoader cl,
Collection<FEELEventListener> listeners, Map<String, Object> inputVariables) {
FEELEventListenersManager eventsManager = getEventsManager(listeners);
- EvaluationContextImpl ctx = new EvaluationContextImpl(cl,
eventsManager, inputVariables.size(), feelDialect);
+ EvaluationContextImpl ctx = new EvaluationContextImpl(cl,
eventsManager, inputVariables.size(), feelDialect, dmnVersion);
if (customFrame.isPresent()) {
ExecutionFrameImpl globalFrame = (ExecutionFrameImpl) ctx.pop();
ExecutionFrameImpl interveawedFrame = customFrame.get();
@@ -228,4 +231,8 @@ public class FEELImpl
public FEELDialect getFeelDialect() {
return feelDialect;
}
+
+ public DMNVersion getDMNVersion() {
+ return dmnVersion;
+ }
}
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/SilentWrappingEvaluationContextImpl.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/SilentWrappingEvaluationContextImpl.java
index 8b9da824c3..621b45948f 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/SilentWrappingEvaluationContextImpl.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/impl/SilentWrappingEvaluationContextImpl.java
@@ -24,6 +24,7 @@ import java.util.Map;
import java.util.function.Supplier;
import org.kie.dmn.api.core.DMNRuntime;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.api.feel.runtime.events.FEELEventListener;
import org.kie.dmn.feel.lang.EvaluationContext;
@@ -122,4 +123,9 @@ public class SilentWrappingEvaluationContextImpl implements
EvaluationContext {
public FEELDialect getFEELDialect() {
return wrapped.getFEELDialect();
}
+
+ @Override
+ public DMNVersion getDMNVersion() {
+ return wrapped.getDMNVersion();
+ }
}
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/BaseFEELFunction.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/BaseFEELFunction.java
index fc2e701775..1ead0a7bdd 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/BaseFEELFunction.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/BaseFEELFunction.java
@@ -20,6 +20,7 @@ package org.kie.dmn.feel.runtime.functions;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -50,6 +51,7 @@ public abstract class BaseFEELFunction
implements FEELFunction {
private final Logger logger = LoggerFactory.getLogger(getClass());
+ private static final int DMN_VERSION = 15;
private String name;
private Symbol symbol;
@@ -268,6 +270,7 @@ public abstract class BaseFEELFunction
Supplier<List<String>>
parameterNamesSupplier,
Supplier<List<Object>>
parameterValuesSupplier) {
source = getFEELDialectAdaptedEither(ctx, source);
+ source = getEventedValueEither(ctx, source);
return source.cata((left) -> {
ctx.notifyEvt(() -> {
if (left instanceof InvalidParametersEvent
invalidParametersEvent) {
@@ -299,6 +302,23 @@ public abstract class BaseFEELFunction
}
}
+ /**
+ * Resolves a value from the given Either, notifying the EvaluationContext
+ * if it contains a FEELEvent from a FEELFnResult
+ * @param ctx the evaluation context to notify of events
+ * @param source the input value, possibly a FEELFnResult with an event
+ * @return a right Either with the resolved value if an event is present,
else the original source
+ */
+ private Either<FEELEvent, Object> getEventedValueEither(EvaluationContext
ctx, Either<FEELEvent, Object> source) {
+ if(ctx.getDMNVersion().getDmnVersion() > DMN_VERSION && source
instanceof FEELFnResult<Object> feelFnresult && feelFnresult.getEvent() != null
) {
+ ctx.notifyEvt(feelFnresult::getEvent);
+ return Either.ofRight(feelFnresult.getOrElse(null));
+ } else {
+ return source;
+ }
+
+ }
+
/**
* Adapt the given <code>Object</code> to FEEL-Dialect-specific value, if
needed
*
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/FEELFnResult.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/FEELFnResult.java
index f68e345b89..154fe8d52d 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/FEELFnResult.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/FEELFnResult.java
@@ -26,8 +26,16 @@ import org.kie.dmn.feel.util.Either;
public class FEELFnResult<T> extends Either<FEELEvent, T> {
+ private FEELEvent event;
+
protected FEELFnResult(Optional<FEELEvent> left, Optional<T> right) {
super(left, right);
+ event = null;
+ }
+
+ protected FEELFnResult(Optional<FEELEvent> left, Optional<T> right,
FEELEvent warningEvent) {
+ this(left, right);
+ this.event = warningEvent;
}
public static <T> FEELFnResult<T> ofError(FEELEvent event) {
@@ -37,6 +45,10 @@ public class FEELFnResult<T> extends Either<FEELEvent, T> {
public static <T> FEELFnResult<T> ofResult(T value) {
return new FEELFnResult<>(Optional.empty(),
Optional.ofNullable(value));
}
+
+ public static <T> FEELFnResult<T> ofEventedResult(T value, FEELEvent
warningEvent) {
+ return new FEELFnResult<>(Optional.empty(),
Optional.ofNullable(value), warningEvent);
+ }
public <X> FEELFnResult<X> map(Function<T, X> rightFn) {
return isLeft()
@@ -50,4 +62,8 @@ public class FEELFnResult<T> extends Either<FEELEvent, T> {
: rightFn.apply(this.getRight().get());
}
+ public FEELEvent getEvent() {
+ return event;
+ }
+
}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/RangeFunction.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/RangeFunction.java
index b4429da1a0..309e8699cc 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/RangeFunction.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/RangeFunction.java
@@ -34,6 +34,7 @@ import java.util.Objects;
import java.util.function.Predicate;
import org.antlr.v4.runtime.tree.ParseTree;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.feel.lang.EvaluationContext;
import org.kie.dmn.feel.lang.FEELDialect;
@@ -200,7 +201,7 @@ public class RangeFunction extends BaseFEELFunction {
if (STUBBED == null) {
// Defaulting FEELDialect to FEEL
STUBBED = new
EvaluationContextImpl(Thread.currentThread().getContextClassLoader(),
- new
FEELEventListenersManager(), 0, FEELDialect.FEEL);
+ new
FEELEventListenersManager(), 0, FEELDialect.FEEL, DMNVersion.getLatest());
}
return STUBBED;
}
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/TimeFunction.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/TimeFunction.java
index dc1e6813be..776d704f3a 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/TimeFunction.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/TimeFunction.java
@@ -39,7 +39,9 @@ import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.api.feel.runtime.events.FEELEvent.Severity;
import org.kie.dmn.feel.runtime.FEELTimeFunction;
import org.kie.dmn.feel.runtime.custom.ZoneTime;
+import org.kie.dmn.feel.runtime.events.FEELEventBase;
import org.kie.dmn.feel.runtime.events.InvalidParametersEvent;
+import org.kie.dmn.feel.util.Msg;
import static org.kie.dmn.feel.util.NumberEvalHelper.coerceIntegerNumber;
@@ -94,7 +96,8 @@ public class TimeFunction
if (parsed.query(TemporalQueries.offset()) != null) {
// it is an offset-zoned time, so I can know for certain an
OffsetTime
OffsetTime asOffSetTime = parsed.query(OffsetTime::from);
- return FEELFnResult.ofResult(asOffSetTime);
+ return FEELFnResult.ofEventedResult( asOffSetTime, new
FEELEventBase( Severity.WARN,
+ Msg.createMessage(Msg.DEPRECATE_TIME_WITH_TIMEZONE),
null));
} else if (parsed.query(TemporalQueries.zone()) == null) {
// if it does not contain any zone information at all, then I
know for certain is a local time.
LocalTime asLocalTime = parsed.query(LocalTime::from);
@@ -104,7 +107,8 @@ public class TimeFunction
LocalTime asLocalTime = parsed.query(LocalTime::from);
ZoneId zoneId = parsed.query(TemporalQueries.zone());
ZoneTime zoneTime = ZoneTime.of(asLocalTime, zoneId,
hasSeconds);
- return FEELFnResult.ofResult(zoneTime);
+ return FEELFnResult.ofEventedResult( zoneTime, new
FEELEventBase( Severity.WARN,
+ Msg.createMessage(Msg.DEPRECATE_TIME_WITH_TIMEZONE)
,null));
}
return FEELFnResult.ofResult(parsed);
} catch (DateTimeException e) {
diff --git a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/Msg.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/Msg.java
index 4f23ab3bd3..885168af56 100644
--- a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/Msg.java
+++ b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/Msg.java
@@ -68,7 +68,7 @@ public final class Msg {
public static final Message0 OPERATION_IS_UNDEFINED_FOR_PARAMETERS = new
Message0("Based on the specification, the operation is undefined for the
specified parameter set.");
public static final Message3 INVALID_PARAMETERS_FOR_OPERATION = new
Message3("Based on the specification, the '%s' operation is not applicable with
the specified parameters '%s' and '%s'");
-
+ public static final Message0 DEPRECATE_TIME_WITH_TIMEZONE = new
Message0("Usage of 'time' with a timezone is deprecated in DMN 1.6. This usage
may be removed in future versions.");
public static String createMessage( Message0 message) {
return Msg.buildMessage(message);
}
diff --git
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELDateTimeDurationTest.java
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELDateTimeDurationTest.java
index 4cdd38cdaf..26293715be 100644
---
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELDateTimeDurationTest.java
+++
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELDateTimeDurationTest.java
@@ -89,13 +89,13 @@ public class FEELDateTimeDurationTest extends BaseFEELTest {
{ "duration( \"P26M\" )", ComparablePeriod.parse( "P2Y2M" ) ,
null},
{ "years and months duration( date(\"2011-12-22\"),
date(\"2013-08-24\") )", ComparablePeriod.parse( "P1Y8M" ) , null},
{ "@\"xyz\"", null , FEELEvent.Severity.ERROR },
- { "(@\"13:20:00@Europe/Rome\").timezone", "Europe/Rome" ,
null},
- { "(@\"13:20:00@Etc/UTC\").timezone", "Etc/UTC" , null},
- { "(@\"13:20:00@Etc/GMT\").timezone", "Etc/GMT" , null},
+ { "(@\"13:20:00@Europe/Rome\").timezone", "Europe/Rome" ,
FEELEvent.Severity.WARN},
+ { "(@\"13:20:00@Etc/UTC\").timezone", "Etc/UTC" ,
FEELEvent.Severity.WARN},
+ { "(@\"13:20:00@Etc/GMT\").timezone", "Etc/GMT" ,
FEELEvent.Severity.WARN},
{ "-duration( \"P2Y2M\" )", ComparablePeriod.parse( "-P2Y2M" )
, null},
{"@\"2023-10-10T10:31:00@Australia/Melbourne\"",
DateTimeFormatter.ISO_DATE_TIME.parse("2023-10-10T10" +
":31+11:00[Australia/Melbourne]",
ZonedDateTime::from), null},
- {"@\"10:15:00@Australia/Melbourne\"",
ZoneTime.of(LocalTime.of(10, 15), ZoneId.of("Australia/Melbourne"), true),
null},
+ {"@\"10:15:00@Australia/Melbourne\"",
ZoneTime.of(LocalTime.of(10, 15), ZoneId.of("Australia/Melbourne"), true),
FEELEvent.Severity.WARN},
// comparison operators
{ "duration( \"P1Y6M\" ) = duration( \"P1Y6M\" )",
Boolean.TRUE , null},
@@ -196,21 +196,21 @@ public class FEELDateTimeDurationTest extends
BaseFEELTest {
":31+11:00[Australia/Melbourne]",
ZonedDateTime::from), null},
{ "@\"-P1D\" + @\"2023-10-10T10:31:00@Australia/Melbourne\"",
DateTimeFormatter.ISO_DATE_TIME.parse("2023-10-09T10" +
":31+11:00[Australia/Melbourne]",
ZonedDateTime::from), null},
- { "@\"P1D\" + @\"10:15:00@Australia/Melbourne\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), null},
- { "@\"-P1D\" + @\"10:15:00@Australia/Melbourne\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), null},
- { "@\"PT1H\" + @\"10:15:00@Australia/Melbourne\"",
getCorrectZoneTime("11:15", "Australia/Melbourne"), null},
- { "@\"-PT1H\" + @\"10:15:00@Australia/Melbourne\"",
getCorrectZoneTime("09:15", "Australia/Melbourne"), null},
+ { "@\"P1D\" + @\"10:15:00@Australia/Melbourne\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
+ { "@\"-P1D\" + @\"10:15:00@Australia/Melbourne\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
+ { "@\"PT1H\" + @\"10:15:00@Australia/Melbourne\"",
getCorrectZoneTime("11:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
+ { "@\"-PT1H\" + @\"10:15:00@Australia/Melbourne\"",
getCorrectZoneTime("09:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
- { "@\"10:15:00@Australia/Melbourne\" + @\"P1D\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), null},
- { "@\"10:15:00@Australia/Melbourne\" - @\"P1D\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), null},
- { "@\"10:15:00@Australia/Melbourne\" + @\"-P1D\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), null},
- { "@\"10:15:00@Australia/Melbourne\" + @\"PT1H\"",
getCorrectZoneTime("11:15", "Australia/Melbourne"), null},
- { "@\"10:15:00@Australia/Melbourne\" - @\"PT1H\"",
getCorrectZoneTime("09:15", "Australia/Melbourne"), null},
- { "@\"10:15:00@Australia/Melbourne\" + @\"-PT1H\"",
getCorrectZoneTime("09:15", "Australia/Melbourne"), null},
+ { "@\"10:15:00@Australia/Melbourne\" + @\"P1D\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
+ { "@\"10:15:00@Australia/Melbourne\" - @\"P1D\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
+ { "@\"10:15:00@Australia/Melbourne\" + @\"-P1D\"",
getCorrectZoneTime("10:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
+ { "@\"10:15:00@Australia/Melbourne\" + @\"PT1H\"",
getCorrectZoneTime("11:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
+ { "@\"10:15:00@Australia/Melbourne\" - @\"PT1H\"",
getCorrectZoneTime("09:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
+ { "@\"10:15:00@Australia/Melbourne\" + @\"-PT1H\"",
getCorrectZoneTime("09:15", "Australia/Melbourne"), FEELEvent.Severity.WARN},
- {"string(@\"10:10@Australia/Melbourne\" + @\"PT1H\")",
"11:10@Australia/Melbourne", null},
- {"string(@\"10:10:00@Australia/Melbourne\" + @\"PT1H\")",
"11:10:00@Australia/Melbourne", null},
+ {"string(@\"10:10@Australia/Melbourne\" + @\"PT1H\")",
"11:10@Australia/Melbourne", FEELEvent.Severity.WARN},
+ {"string(@\"10:10:00@Australia/Melbourne\" + @\"PT1H\")",
"11:10:00@Australia/Melbourne", FEELEvent.Severity.WARN},
// TODO support for zones - fix when timezones solved out
(currently returns ZonedDateTime)
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/EvaluationContext.java
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/FEELFnResultTest.java
similarity index 50%
copy from
kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/EvaluationContext.java
copy to
kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/FEELFnResultTest.java
index 622412cb83..05a41d4182 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/EvaluationContext.java
+++
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/FEELFnResultTest.java
@@ -16,48 +16,25 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.dmn.feel.lang;
+package org.kie.dmn.feel.runtime.functions;
-import java.util.Collection;
-import java.util.Map;
-import java.util.function.Supplier;
-import org.kie.dmn.api.core.DMNRuntime;
+import org.junit.jupiter.api.Test;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
-import org.kie.dmn.api.feel.runtime.events.FEELEventListener;
-
-public interface EvaluationContext {
-
- void enterFrame();
-
- void exitFrame();
-
- EvaluationContext current();
-
- void setValue(String name, Object value );
-
- Object getValue(String name );
-
- Object getValue(String[] name );
-
- boolean isDefined( String name );
-
- boolean isDefined( String[] name );
-
- Map<String, Object> getAllValues();
-
- DMNRuntime getDMNRuntime();
-
- ClassLoader getRootClassLoader();
-
- void notifyEvt(Supplier<FEELEvent> event);
-
-
- Collection<FEELEventListener> getListeners();
-
- void setRootObject(Object v);
-
- Object getRootObject();
-
- FEELDialect getFEELDialect();
+import org.kie.dmn.feel.runtime.events.FEELEventBase;
+import org.kie.dmn.feel.util.Msg;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class FEELFnResultTest {
+
+ @Test
+ void testOfWarnedResult() {
+ FEELEvent warningEvent = new FEELEventBase( FEELEvent.Severity.WARN,
Msg.createMessage(Msg.DEPRECATE_TIME_WITH_TIMEZONE), null);
+ String value = "test";
+ FEELFnResult<String> result = FEELFnResult.ofEventedResult(value,
warningEvent);
+ assertThat(result).isNotNull();
+ assertThat(result.getEvent()).isEqualTo(warningEvent);
+ assertThat(result.getOrElse(null)).isEqualTo(value);
+ }
}
diff --git
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvaluationContextTestUtil.java
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvaluationContextTestUtil.java
index f530daa76f..0468db5f6d 100644
---
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvaluationContextTestUtil.java
+++
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvaluationContextTestUtil.java
@@ -18,6 +18,7 @@
*/
package org.kie.dmn.feel.util;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.feel.lang.EvaluationContext;
import org.kie.dmn.feel.lang.FEELDialect;
import org.kie.dmn.feel.lang.impl.EvaluationContextImpl;
@@ -31,11 +32,11 @@ public class EvaluationContextTestUtil {
public static EvaluationContext
newEmptyEvaluationContext(FEELEventListenersManager mgr) {
// Defaulting FEELDialect to FEEL
- return new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), mgr,
FEELDialect.FEEL);
+ return new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), mgr,
FEELDialect.FEEL, DMNVersion.getLatest());
}
public static EvaluationContext newEmptyEvaluationContext() {
// Defaulting FEELDialect to FEEL
- return new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), null,
FEELDialect.FEEL);
+ return new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), null,
FEELDialect.FEEL, DMNVersion.getLatest());
}
}
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 66dc085476..91fe9a70e1 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
@@ -20,12 +20,7 @@ package org.kie.dmn.legacy.tests.core.v1_1;
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.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.*;
import org.kie.dmn.api.core.ast.ItemDefNode;
import org.kie.dmn.core.api.DMNFactory;
import org.kie.dmn.core.impl.CompositeTypeImpl;
@@ -71,7 +66,7 @@ public class DMNCompilerTest extends BaseDMN1_1VariantTest {
final SimpleTypeImpl feelType = (SimpleTypeImpl) type;
// Defaulting FEELDialect to FEEL
- final EvaluationContext ctx = new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), null,
FEELDialect.FEEL);
+ final EvaluationContext ctx = new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), null,
FEELDialect.FEEL, DMNVersion.getLatest());
assertThat(feelType.getFeelType()).isInstanceOf(AliasFEELType.class);
assertThat(feelType.getFeelType().getName()).isEqualTo("tEmploymentStatus");
assertThat(feelType.getAllowedValuesFEEL()).hasSize(4);
diff --git
a/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/BaseNodeSchemaMapper.java
b/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/BaseNodeSchemaMapper.java
index 6a4411ffb1..4d47b226db 100644
---
a/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/BaseNodeSchemaMapper.java
+++
b/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/BaseNodeSchemaMapper.java
@@ -26,6 +26,7 @@ import java.util.Set;
import java.util.function.BiConsumer;
import org.eclipse.microprofile.openapi.models.media.Schema;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.feel.lang.FEELDialect;
import org.kie.dmn.feel.lang.ast.AtLiteralNode;
import org.kie.dmn.feel.lang.ast.BaseNode;
@@ -51,7 +52,7 @@ public class BaseNodeSchemaMapper {
private static BiConsumer<BaseNode, Schema> ATLITERALNODE_CONSUMER =
(node, schema) -> {
// Defaulting FEELDialect to FEEL
EvaluationContextImpl emptyEvalCtx =
- new
EvaluationContextImpl(BaseNodeSchemaMapper.class.getClassLoader(), new
FEELEventListenersManager(), FEELDialect.FEEL);
+ new
EvaluationContextImpl(BaseNodeSchemaMapper.class.getClassLoader(), new
FEELEventListenersManager(), FEELDialect.FEEL, DMNVersion.getLatest());
Object evaluated = node.evaluate(emptyEvalCtx);
Object toStore = evaluated != null ? evaluated : ((AtLiteralNode)
node).getStringLiteral().toString();
populateEnumSchema(schema, toStore);
diff --git
a/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/MapperHelper.java
b/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/MapperHelper.java
index ff27d9e78d..07f7c6393e 100644
---
a/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/MapperHelper.java
+++
b/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/MapperHelper.java
@@ -18,6 +18,7 @@
*/
package org.kie.dmn.openapi.impl;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.feel.lang.FEELDialect;
import org.kie.dmn.feel.lang.ast.AtLiteralNode;
import org.kie.dmn.feel.lang.ast.InfixOpNode;
@@ -31,12 +32,12 @@ public class MapperHelper {
static Object evaluateInfixOpNode(InfixOpNode toEvaluate) {
// Defaulting FEELDialect to FEEL
- return toEvaluate.evaluate(new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), null,
FEELDialect.FEEL));
+ return toEvaluate.evaluate(new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), null,
FEELDialect.FEEL, DMNVersion.getLatest()));
}
static Object evaluateAtLiteralNode(AtLiteralNode toEvaluate) {
// Defaulting FEELDialect to FEEL
- return toEvaluate.evaluate(new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), null,
FEELDialect.FEEL));
+ return toEvaluate.evaluate(new
EvaluationContextImpl(ClassLoaderUtil.findDefaultClassLoader(), null,
FEELDialect.FEEL, DMNVersion.getLatest()));
}
private MapperHelper() {
diff --git
a/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_5/timeFunction.dmn
b/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_5/timeFunction.dmn
new file mode 100644
index 0000000000..e6e0875eaf
--- /dev/null
+++
b/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_5/timeFunction.dmn
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ 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.
+-->
+<definitions xmlns="https://www.omg.org/spec/DMN/20230324/MODEL/"
xmlns:dmndi="https://www.omg.org/spec/DMN/20230324/DMNDI/"
xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"
xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"
xmlns:kie="https://kie.org/dmn/extensions/1.0"
expressionLanguage="https://www.omg.org/spec/DMN/20230324/FEEL/"
namespace="https://kie.org/dmn/_72913353-6A25-4439-AE70-4383A0544F31"
id="_150E738D-C81A-4BE8-8595-D85A63A8D60B"
name="DMN_50C0E61A-D1F2-41F0-8BD4-CE42 [...]
+ <decision name="time" id="_13CBFAD6-3811-459A-930D-026239B0B26E">
+ <variable name="time" id="_8809F755-F0B3-4A31-9E10-02AE1C54B2A2"
typeRef="time" />
+ <informationRequirement id="_F0D8BBA6-6707-4433-8212-0324F8CB927E">
+ <requiredInput href="#_CD0AF8FB-4B6D-41C9-A5E2-8B01D4731B20" />
+ </informationRequirement>
+ <literalExpression id="_6A50752C-AFA3-4497-8F04-693338815A09"
typeRef="time" label="time">
+ <text>time(a_time)</text>
+ </literalExpression>
+ </decision>
+ <inputData name="a_time" id="_CD0AF8FB-4B6D-41C9-A5E2-8B01D4731B20">
+ <variable name="a_time" id="_85F94F9C-49AF-4AB2-A772-6A0326280049"
typeRef="string" />
+ </inputData>
+ <dmndi:DMNDI>
+ <dmndi:DMNDiagram id="_4CF8B0C0-E536-4E12-B339-B3DD51296C11" name="Default
DRD" useAlternativeInputDataShape="false">
+ <di:extension>
+ <kie:ComponentsWidthsExtension>
+ <kie:ComponentWidths
dmnElementRef="_6A50752C-AFA3-4497-8F04-693338815A09">
+ <kie:width>190</kie:width>
+ </kie:ComponentWidths>
+ </kie:ComponentsWidthsExtension>
+ </di:extension>
+ <dmndi:DMNShape id="_6C6FB1EF-3A38-4A39-ADC2-A685725800AE"
dmnElementRef="_13CBFAD6-3811-459A-930D-026239B0B26E" isCollapsed="false"
isListedInputData="false">
+ <dc:Bounds x="320" y="40" width="160" height="80" />
+ </dmndi:DMNShape>
+ <dmndi:DMNShape id="_C2DBDC70-E1CE-452C-BF2C-99E9F25AD0CA"
dmnElementRef="_CD0AF8FB-4B6D-41C9-A5E2-8B01D4731B20" isCollapsed="false"
isListedInputData="false">
+ <dc:Bounds x="340" y="280" width="160" height="80" />
+ </dmndi:DMNShape>
+ <dmndi:DMNEdge id="_14682216-2859-4037-9FA4-6019EA3A3F88"
dmnElementRef="_F0D8BBA6-6707-4433-8212-0324F8CB927E"
sourceElement="_C2DBDC70-E1CE-452C-BF2C-99E9F25AD0CA"
targetElement="_6C6FB1EF-3A38-4A39-ADC2-A685725800AE">
+ <di:waypoint x="420" y="320" />
+ <di:waypoint x="400" y="120" />
+ </dmndi:DMNEdge>
+ </dmndi:DMNDiagram>
+ </dmndi:DMNDI>
+</definitions>
diff --git
a/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_6/timeFunction.dmn
b/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_6/timeFunction.dmn
new file mode 100644
index 0000000000..c0efdd1f34
--- /dev/null
+++
b/kie-dmn/kie-dmn-test-resources/src/test/resources/valid_models/DMNv1_6/timeFunction.dmn
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ 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.
+-->
+<definitions xmlns="https://www.omg.org/spec/DMN/20240513/MODEL/"
+ xmlns:dmndi="https://www.omg.org/spec/DMN/20230324/DMNDI/"
+ xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"
+ xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"
+ xmlns:kie="https://kie.org/dmn/extensions/1.0"
+ expressionLanguage="https://www.omg.org/spec/DMN/20240513/FEEL/"
+
namespace="https://kie.org/dmn/_72913353-6A25-4439-AE70-4383A0544F31"
id="_150E738D-C81A-4BE8-8595-D85A63A8D60B"
name="DMN_50C0E61A-D1F2-41F0-8BD4-CE42BA135F43">
+ <decision name="time" id="_13CBFAD6-3811-459A-930D-026239B0B26E">
+ <variable name="time" id="_8809F755-F0B3-4A31-9E10-02AE1C54B2A2"
typeRef="time" />
+ <informationRequirement id="_F0D8BBA6-6707-4433-8212-0324F8CB927E">
+ <requiredInput href="#_CD0AF8FB-4B6D-41C9-A5E2-8B01D4731B20" />
+ </informationRequirement>
+ <literalExpression id="_6A50752C-AFA3-4497-8F04-693338815A09"
typeRef="time" label="time">
+ <text>time(a_time)</text>
+ </literalExpression>
+ </decision>
+ <inputData name="a_time" id="_CD0AF8FB-4B6D-41C9-A5E2-8B01D4731B20">
+ <variable name="a_time" id="_85F94F9C-49AF-4AB2-A772-6A0326280049"
typeRef="string" />
+ </inputData>
+ <dmndi:DMNDI>
+ <dmndi:DMNDiagram id="_4CF8B0C0-E536-4E12-B339-B3DD51296C11" name="Default
DRD" useAlternativeInputDataShape="false">
+ <di:extension>
+ <kie:ComponentsWidthsExtension>
+ <kie:ComponentWidths
dmnElementRef="_6A50752C-AFA3-4497-8F04-693338815A09">
+ <kie:width>190</kie:width>
+ </kie:ComponentWidths>
+ </kie:ComponentsWidthsExtension>
+ </di:extension>
+ <dmndi:DMNShape id="_6C6FB1EF-3A38-4A39-ADC2-A685725800AE"
dmnElementRef="_13CBFAD6-3811-459A-930D-026239B0B26E" isCollapsed="false"
isListedInputData="false">
+ <dc:Bounds x="320" y="40" width="160" height="80" />
+ </dmndi:DMNShape>
+ <dmndi:DMNShape id="_C2DBDC70-E1CE-452C-BF2C-99E9F25AD0CA"
dmnElementRef="_CD0AF8FB-4B6D-41C9-A5E2-8B01D4731B20" isCollapsed="false"
isListedInputData="false">
+ <dc:Bounds x="340" y="280" width="160" height="80" />
+ </dmndi:DMNShape>
+ <dmndi:DMNEdge id="_14682216-2859-4037-9FA4-6019EA3A3F88"
dmnElementRef="_F0D8BBA6-6707-4433-8212-0324F8CB927E"
sourceElement="_C2DBDC70-E1CE-452C-BF2C-99E9F25AD0CA"
targetElement="_6C6FB1EF-3A38-4A39-ADC2-A685725800AE">
+ <di:waypoint x="420" y="320" />
+ <di:waypoint x="400" y="120" />
+ </dmndi:DMNEdge>
+ </dmndi:DMNDiagram>
+ </dmndi:DMNDI>
+</definitions>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]