From e97f6a41edd361d719f22d4952c392873eee4b15 Mon Sep 17 00:00:00 2001 From: Frank-Liao Date: Fri, 15 Mar 2024 17:33:18 +0800 Subject: [PATCH] Check whether the key exists when "start param to overwrite global param" (#15676) (#15677) Co-authored-by: Rick Cheng --- .../service/process/ProcessServiceImpl.java | 9 ++++-- .../service/process/ProcessServiceTest.java | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java index fc906491d1..261637529a 100644 --- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java +++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java @@ -601,9 +601,12 @@ public class ProcessServiceImpl implements ProcessService { if (MapUtils.isNotEmpty(startParamMap) && globalMap != null) { // start param to overwrite global param for (Map.Entry param : globalMap.entrySet()) { - String val = startParamMap.get(param.getKey()).getValue(); - if (val != null) { - param.setValue(val); + String globalKey = param.getKey(); + if (startParamMap.containsKey(globalKey)) { + String val = startParamMap.get(globalKey).getValue(); + if (val != null) { + param.setValue(val); + } } } // start param to create new global param if global not exist diff --git a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/process/ProcessServiceTest.java b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/process/ProcessServiceTest.java index 5e20c5ea2b..509f9a4cf1 100644 --- a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/process/ProcessServiceTest.java +++ b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/process/ProcessServiceTest.java @@ -71,11 +71,13 @@ import org.apache.dolphinscheduler.dao.repository.TaskDefinitionDao; import org.apache.dolphinscheduler.dao.repository.TaskDefinitionLogDao; import org.apache.dolphinscheduler.dao.repository.TaskInstanceDao; import org.apache.dolphinscheduler.plugin.task.api.TaskPluginManager; +import org.apache.dolphinscheduler.plugin.task.api.enums.Direct; import org.apache.dolphinscheduler.plugin.task.api.enums.dp.DataType; import org.apache.dolphinscheduler.plugin.task.api.enums.dp.DqTaskState; import org.apache.dolphinscheduler.plugin.task.api.enums.dp.ExecuteSqlType; import org.apache.dolphinscheduler.plugin.task.api.enums.dp.InputType; import org.apache.dolphinscheduler.plugin.task.api.enums.dp.OptionSourceType; +import org.apache.dolphinscheduler.plugin.task.api.model.Property; import org.apache.dolphinscheduler.plugin.task.api.model.ResourceInfo; import org.apache.dolphinscheduler.service.cron.CronUtilsTest; import org.apache.dolphinscheduler.service.exceptions.CronParseException; @@ -89,6 +91,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Map; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -612,6 +615,32 @@ public class ProcessServiceTest { return list; } + @Test + public void testSetGlobalParamIfCommanded() { + ProcessDefinition processDefinition = new ProcessDefinition(); + String globalParams = + "[{\"prop\":\"global_param\",\"value\":\"4\",\"direct\":\"IN\",\"type\":\"VARCHAR\"},{\"prop\":\"O_ERRCODE\",\"value\":\"\",\"direct\":\"OUT\",\"type\":\"VARCHAR\"}]"; + processDefinition.setGlobalParams(globalParams); + Map globalParamMap = processDefinition.getGlobalParamMap(); + Assertions.assertTrue(globalParamMap.size() == 2); + Assertions.assertTrue(processDefinition.getGlobalParamList().size() == 2); + + HashMap startParams = new HashMap<>(); + String expectValue = "6"; + startParams.put("global_param", expectValue); + HashMap commandParams = new HashMap<>(); + commandParams.put(CMD_PARAM_START_PARAMS, JSONUtils.toJsonString(startParams)); + Map mockStartParams = new HashMap<>(); + + mockStartParams.put("global_param", new Property("global_param", Direct.IN, + org.apache.dolphinscheduler.plugin.task.api.enums.DataType.VARCHAR, startParams.get("global_param"))); + when(curingGlobalParamsService.parseWorkflowStartParam(commandParams)).thenReturn(mockStartParams); + + processService.setGlobalParamIfCommanded(processDefinition, commandParams); + Assertions.assertTrue(globalParamMap.get("global_param").equals(expectValue)); + Assertions.assertTrue(globalParamMap.containsKey("O_ERRCODE")); + } + @Test public void testSaveTaskDefine() { User operator = new User();