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