diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java index f421d88dea..270604afb3 100644 --- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java +++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java @@ -17,6 +17,7 @@ package org.apache.dolphinscheduler.service.process; +import static java.util.stream.Collectors.toSet; import static org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_END_DATE; import static org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_START_DATE; import static org.apache.dolphinscheduler.common.Constants.CMD_PARAM_EMPTY_SUB_PROCESS; @@ -27,8 +28,6 @@ import static org.apache.dolphinscheduler.common.Constants.CMD_PARAM_SUB_PROCESS import static org.apache.dolphinscheduler.common.Constants.CMD_PARAM_SUB_PROCESS_PARENT_INSTANCE_ID; import static org.apache.dolphinscheduler.common.Constants.LOCAL_PARAMS; -import static java.util.stream.Collectors.toSet; - import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.enums.AuthorizationType; import org.apache.dolphinscheduler.common.enums.CommandType; @@ -1002,17 +1001,21 @@ public class ProcessService { */ private String joinGlobalParams(String parentGlobalParams, String subGlobalParams) { - List parentPropertyList = JSONUtils.toList(parentGlobalParams, Property.class); - List subPropertyList = JSONUtils.toList(subGlobalParams, Property.class); - - Map subMap = subPropertyList.stream().collect(Collectors.toMap(Property::getProp, Property::getValue)); - - for (Property parent : parentPropertyList) { - if (!subMap.containsKey(parent.getProp())) { - subPropertyList.add(parent); - } - } - return JSONUtils.toJsonString(subPropertyList); + // Since JSONUtils.toList return unmodified list, we need to creat a new List here. + List parentParams = Lists.newArrayList(JSONUtils.toList(parentGlobalParams, Property.class)); + List subParams = JSONUtils.toList(subGlobalParams, Property.class); + + Set parentParamKeys = parentParams.stream().map(Property::getProp).collect(toSet()); + + // We will combine the params of parent workflow and sub workflow + // If the params are defined in both, we will use parent's params to override the sub workflow(ISSUE-7962) + // todo: Do we need to consider the other attribute of Property? + // e.g. the subProp's type is not equals with parent, or subProp's direct is not equals with parent + // It's suggested to add node name in property, this kind of problem can be solved. + List extraSubParams = subParams.stream() + .filter(subProp -> !parentParamKeys.contains(subProp.getProp())).collect(Collectors.toList()); + parentParams.addAll(extraSubParams); + return JSONUtils.toJsonString(parentParams); } /**