You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kie.apache.org by mw...@apache.org on 2026/10/13 20:39:17 UTC
(incubator-kie) branch main updated: [incubator-kie#7147] NullPointerException in embedded job service whe… (#7148)
This is an automated email from the ASF dual-hosted git repository.
martinweiler pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie.git
The following commit(s) were added to refs/heads/main by this push:
new a0899a7d1c2 [incubator-kie#7147] NullPointerException in embedded job service whe… (#7148)
a0899a7d1c2 is described below
commit a0899a7d1c235929c811742cb78ed2e86cd9d2e3
Author: abhijithumbe <ab...@gmail.com>
AuthorDate: Wed Oct 14 02:09:12 2026 +0530
[incubator-kie#7147] NullPointerException in embedded job service whe… (#7148)
* [incubator-kie#7147] NullPointerException in embedded job service when sladuedate format is not correct for the usertask node
* additional tests
---------
Co-authored-by: abhijithumbe <Ab...@ibm.com>
---
.../core/validation/RuleFlowProcessValidator.java | 63 ++++++++
.../validation/RuleFlowProcessValidatorTest.java | 165 +++++++++++++++++++++
2 files changed, 228 insertions(+)
diff --git a/kogito-jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/validation/RuleFlowProcessValidator.java b/kogito-jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/validation/RuleFlowProcessValidator.java
index ae89938bbae..46a57041080 100755
--- a/kogito-jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/validation/RuleFlowProcessValidator.java
+++ b/kogito-jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/validation/RuleFlowProcessValidator.java
@@ -18,6 +18,7 @@
*/
package org.jbpm.ruleflow.core.validation;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -86,6 +87,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static java.lang.String.format;
+import static org.jbpm.ruleflow.core.Metadata.CUSTOM_SLA_DUE_DATE;
import static org.jbpm.ruleflow.core.Metadata.EVENT_TYPE;
import static org.jbpm.ruleflow.core.Metadata.EVENT_TYPE_MESSAGE;
import static org.jbpm.ruleflow.core.Metadata.EVENT_TYPE_SIGNAL;
@@ -138,6 +140,8 @@ public class RuleFlowProcessValidator implements ProcessValidator {
"Process has no end node."));
}
+ validateProcessSlaDueDate(process, errors);
+
validateNodes(process.getNodes(), errors, process);
validateVariables(errors, process);
@@ -164,6 +168,7 @@ public class RuleFlowProcessValidator implements ProcessValidator {
String isForCompensation = "isForCompensation";
for (int i = 0; i < nodes.length; i++) {
final org.kie.api.definition.process.Node node = nodes[i];
+ validateSlaDueDate(node, process, errors);
if (node instanceof StartNode) {
final StartNode startNode = (StartNode) node;
if (startNode.getTo() == null) {
@@ -763,6 +768,64 @@ public class RuleFlowProcessValidator implements ProcessValidator {
}
}
+ private void validateSlaDueDate(org.kie.api.definition.process.Node node,
+ RuleFlowProcess process,
+ List<ProcessValidationError> errors) {
+
+ Object slaDueDateObj = node.getMetaData().get(CUSTOM_SLA_DUE_DATE);
+
+ if (slaDueDateObj == null) {
+ return;
+ }
+
+ String slaDueDate = slaDueDateObj.toString().trim();
+ if (!isValidSlaDueDate(slaDueDate)) {
+ addErrorMessage(process,
+ node,
+ errors,
+ "Invalid SLA due date '" + slaDueDate +
+ "' configured for node '" + node.getName() + "'.");
+ }
+ }
+
+ private void validateProcessSlaDueDate(RuleFlowProcess process,
+ List<ProcessValidationError> errors) {
+
+ Object slaDueDateObj = process.getMetaData().get(CUSTOM_SLA_DUE_DATE);
+ if (slaDueDateObj == null) {
+ return;
+ }
+
+ String slaDueDate = slaDueDateObj.toString().trim();
+ if (!isValidSlaDueDate(slaDueDate)) {
+ errors.add(new ProcessValidationErrorImpl(
+ process,
+ "Invalid SLA due date '" + slaDueDate +
+ "' configured for process '" + process.getName() + "'."));
+ }
+ }
+
+ private boolean isValidSlaDueDate(String slaDueDate) {
+ if (slaDueDate == null || slaDueDate.isEmpty()) {
+ return true;
+ }
+
+ if (slaDueDate.startsWith("#{")) {
+ return true;
+ }
+
+ try {
+ if (slaDueDate.startsWith("P")) {
+ Duration.parse(slaDueDate);
+ } else {
+ DateTimeUtils.parseDuration(slaDueDate);
+ }
+ return true;
+ } catch (RuntimeException e) {
+ return false;
+ }
+ }
+
private void checkAllNodesConnectedToStart(final NodeContainer container,
boolean isDynamic,
final List<ProcessValidationError> errors,
diff --git a/kogito-jbpm/jbpm-flow/src/test/java/org/jbpm/ruleflow/core/validation/RuleFlowProcessValidatorTest.java b/kogito-jbpm/jbpm-flow/src/test/java/org/jbpm/ruleflow/core/validation/RuleFlowProcessValidatorTest.java
index a2d99b7a714..e7e88ebabf4 100755
--- a/kogito-jbpm/jbpm-flow/src/test/java/org/jbpm/ruleflow/core/validation/RuleFlowProcessValidatorTest.java
+++ b/kogito-jbpm/jbpm-flow/src/test/java/org/jbpm/ruleflow/core/validation/RuleFlowProcessValidatorTest.java
@@ -32,12 +32,18 @@ import org.jbpm.workflow.core.node.ActionNode;
import org.jbpm.workflow.core.node.CompositeNode;
import org.jbpm.workflow.core.node.DynamicNode;
import org.jbpm.workflow.core.node.EndNode;
+import org.jbpm.workflow.core.node.ForEachNode;
+import org.jbpm.workflow.core.node.RuleSetNode;
import org.jbpm.workflow.core.node.StartNode;
+import org.jbpm.workflow.core.node.SubProcessNode;
+import org.jbpm.workflow.core.node.WorkItemNode;
+import org.jbpm.workflow.instance.rule.RuleType;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.kie.api.definition.process.WorkflowElementIdentifier;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.jbpm.ruleflow.core.Metadata.CUSTOM_SLA_DUE_DATE;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -242,4 +248,163 @@ public class RuleFlowProcessValidatorTest {
assertThat(errors).isNotNull().hasSize(1);
assertThat(errors[0].getMessage()).isEqualTo("Node 'ActionNode1' [3] mvel script language is not supported in Kogito.");
}
+
+ @Test
+ public void testInvalidSlaDueDateForServiceTask() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("test");
+ process.setName("test");
+
+ WorkItemNode node = new WorkItemNode();
+ node.setName("Service Task");
+ node.setMetaData("customSLADueDate", "2026-09-18T18:00:00Z");
+
+ process.addNode(node);
+
+ assertInvalidSlaDueDate(process, "Service Task");
+ }
+
+ @Test
+ public void testInvalidSlaDueDateForBusinessRuleTask() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("test");
+ process.setName("test");
+
+ RuleSetNode node = new RuleSetNode();
+ node.setName("Business Rule Task");
+ node.setRuleType(RuleType.ruleFlowGroup("test-group"));
+ node.setMetaData("customSLADueDate", "2026-09-18T18:00:00Z");
+
+ process.addNode(node);
+
+ assertInvalidSlaDueDate(process, "Business Rule Task");
+ }
+
+ @Test
+ public void testInvalidSlaDueDateForSubProcess() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("test");
+ process.setName("test");
+
+ SubProcessNode node = new SubProcessNode();
+ node.setName("Sub Process");
+ node.setMetaData("customSLADueDate", "2026-09-18T18:00:00Z");
+
+ process.addNode(node);
+
+ assertInvalidSlaDueDate(process, "Sub Process");
+ }
+
+ @Test
+ public void testInvalidSlaDueDateForForEachNode() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("test");
+ process.setName("test");
+
+ ForEachNode node = new ForEachNode();
+ node.setName("Multi Instance Sub Process");
+ node.setMetaData("customSLADueDate", "2026-09-18T18:00:00Z");
+
+ process.addNode(node);
+
+ assertInvalidSlaDueDate(process, "Multi Instance Sub Process");
+ }
+
+ @Test
+ public void testValidSlaDueDateForDifferentNodeTypes() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("test");
+ process.setName("test");
+
+ WorkItemNode humanTask = new WorkItemNode();
+ humanTask.setName("Human Task");
+ humanTask.setMetaData("customSLADueDate", "10s");
+ process.addNode(humanTask);
+
+ RuleSetNode businessRuleTask = new RuleSetNode();
+ businessRuleTask.setName("Business Rule Task");
+ businessRuleTask.setRuleType(RuleType.ruleFlowGroup("test-group"));
+ businessRuleTask.setMetaData("customSLADueDate", "PT10S");
+
+ assertThat(businessRuleTask.getRuleType()).isNotNull();
+
+ SubProcessNode subProcess = new SubProcessNode();
+ subProcess.setName("Sub Process");
+ subProcess.setMetaData("customSLADueDate", "10m");
+ process.addNode(subProcess);
+
+ ForEachNode forEachNode = new ForEachNode();
+ forEachNode.setName("Multi Instance Sub Process");
+ forEachNode.setMetaData("customSLADueDate", "PT10M");
+ process.addNode(forEachNode);
+
+ ProcessValidationError[] errors = RuleFlowProcessValidator.getInstance().validateProcess(process);
+
+ assertThat(errors)
+ .extracting(ProcessValidationError::getMessage)
+ .noneMatch(message -> message.contains("Invalid SLA due date"));
+ }
+
+ @Test
+ public void testInvalidProcessSlaDueDate() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("test");
+ process.setName("test");
+ process.setMetaData(
+ CUSTOM_SLA_DUE_DATE,
+ "2026-09-18T18:00:00Z");
+
+ ProcessValidationError[] errors = RuleFlowProcessValidator.getInstance().validateProcess(process);
+
+ assertThat(errors)
+ .extracting(ProcessValidationError::getMessage)
+ .anyMatch(message -> message.contains(
+ "Invalid SLA due date '2026-09-18T18:00:00Z' configured for process 'test'"));
+ }
+
+ @Test
+ public void testValidIsoProcessSlaDueDate() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("test");
+ process.setName("test");
+ process.setMetaData(
+ CUSTOM_SLA_DUE_DATE,
+ "PT10S");
+
+ ProcessValidationError[] errors =
+ RuleFlowProcessValidator.getInstance().validateProcess(process);
+
+ assertThat(errors)
+ .extracting(ProcessValidationError::getMessage)
+ .noneMatch(message -> message.contains("Invalid SLA due date"));
+ }
+
+ @Test
+ public void testValidProcessSlaDueDate() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("test");
+ process.setName("test");
+ process.setMetaData(
+ CUSTOM_SLA_DUE_DATE,
+ "10s");
+
+ ProcessValidationError[] errors =
+ RuleFlowProcessValidator.getInstance().validateProcess(process);
+
+ assertThat(errors)
+ .extracting(ProcessValidationError::getMessage)
+ .noneMatch(message -> message.contains("Invalid SLA due date"));
+ }
+
+ private void assertInvalidSlaDueDate(RuleFlowProcess process,
+ String nodeName) {
+
+ ProcessValidationError[] errors = RuleFlowProcessValidator.getInstance().validateProcess(process);
+
+ assertThat(errors)
+ .extracting(ProcessValidationError::getMessage)
+ .anyMatch(message -> message.contains(
+ "Invalid SLA due date '2026-09-18T18:00:00Z' configured for node '" +
+ nodeName + "'"));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org