From 449e641e07a421f1ea649acc47e464eec4b5550f Mon Sep 17 00:00:00 2001 From: jsonwan Date: Wed, 26 Feb 2025 17:35:34 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=96=87=E4=BB=B6=E5=88=86=E5=8F=91Ope?= =?UTF-8?q?nAPI=E6=8E=A5=E5=8F=A3=E8=87=AA=E5=8A=A8=E5=8E=BB=E9=99=A4?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=8F=82=E6=95=B0=E9=A6=96=E5=B0=BE=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC=20#3441?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Web接口、OpenAPI接口中的源与目标路径参数都添加了trim处理。 --- .../tencent/bk/job/common/util/ListUtil.java | 21 +++++++++++++++++++ .../bk/job/common/util/ListUtilTest.java | 14 +++++++++++++ .../esb/model/job/v3/EsbFileSourceV3DTO.java | 7 +++++++ .../request/EsbFastTransferFileV3Request.java | 6 ++++++ .../web/vo/ExecuteFileDestinationInfoVO.java | 6 ++++++ .../model/web/vo/ExecuteFileSourceInfoVO.java | 7 +++++++ .../v3/EsbFastTransferFileV3ResourceImpl.java | 12 +++++------ .../web/impl/WebExecuteTaskResourceImpl.java | 12 +++++------ 8 files changed, 73 insertions(+), 12 deletions(-) diff --git a/src/backend/commons/common-utils/src/main/java/com/tencent/bk/job/common/util/ListUtil.java b/src/backend/commons/common-utils/src/main/java/com/tencent/bk/job/common/util/ListUtil.java index 9ed916d1a4..91b96f2e23 100644 --- a/src/backend/commons/common-utils/src/main/java/com/tencent/bk/job/common/util/ListUtil.java +++ b/src/backend/commons/common-utils/src/main/java/com/tencent/bk/job/common/util/ListUtil.java @@ -8,6 +8,7 @@ import java.util.Collections; import java.util.List; import java.util.function.Function; +import java.util.stream.Collectors; public class ListUtil { @@ -72,4 +73,24 @@ public static List union(Collection collection1, Collection< return result; } + /** + * 去除字符串列表中各元素首尾的空字符串,null元素不处理原样返回 + * + * @param list 字符串列表 + * @return 处理后的字符串列表 + */ + public static List trimStringList(List list) { + if (list == null) { + return null; + } + return list.stream().map( + str -> { + if (str == null) { + return null; + } else { + return str.trim(); + } + } + ).collect(Collectors.toList()); + } } diff --git a/src/backend/commons/common-utils/src/test/java/com/tencent/bk/job/common/util/ListUtilTest.java b/src/backend/commons/common-utils/src/test/java/com/tencent/bk/job/common/util/ListUtilTest.java index 2a36ffac35..43d9660ed7 100644 --- a/src/backend/commons/common-utils/src/test/java/com/tencent/bk/job/common/util/ListUtilTest.java +++ b/src/backend/commons/common-utils/src/test/java/com/tencent/bk/job/common/util/ListUtilTest.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @@ -54,4 +55,17 @@ void testUnion() { assertThat(result).containsOnly("a", "b", "c", "d"); } + @Test + void testTrimStringList() { + assertThat(ListUtil.trimStringList(null)).isNull(); + assertThat(ListUtil.trimStringList(Collections.emptyList())).isNotNull(); + assertThat(ListUtil.trimStringList(Collections.emptyList())).size().isEqualTo(0); + + List list1 = Lists.newArrayList(null, " a ", " b b ", ""); + assertThat(ListUtil.trimStringList(list1)).size().isEqualTo(4); + assertThat(ListUtil.trimStringList(list1).get(0)).isNull(); + assertThat(ListUtil.trimStringList(list1).get(1)).isEqualTo("a"); + assertThat(ListUtil.trimStringList(list1).get(2)).isEqualTo("b b"); + assertThat(ListUtil.trimStringList(list1).get(3)).isEqualTo(""); + } } diff --git a/src/backend/commons/esb-sdk/src/main/java/com/tencent/bk/job/common/esb/model/job/v3/EsbFileSourceV3DTO.java b/src/backend/commons/esb-sdk/src/main/java/com/tencent/bk/job/common/esb/model/job/v3/EsbFileSourceV3DTO.java index f0d4497642..d1ac0e2dca 100644 --- a/src/backend/commons/esb-sdk/src/main/java/com/tencent/bk/job/common/esb/model/job/v3/EsbFileSourceV3DTO.java +++ b/src/backend/commons/esb-sdk/src/main/java/com/tencent/bk/job/common/esb/model/job/v3/EsbFileSourceV3DTO.java @@ -24,7 +24,9 @@ package com.tencent.bk.job.common.esb.model.job.v3; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.tencent.bk.job.common.util.ListUtil; import lombok.Data; import java.util.List; @@ -67,4 +69,9 @@ public class EsbFileSourceV3DTO { */ @JsonProperty("file_source_code") private String fileSourceCode; + + @JsonIgnore + public List getTrimmedFiles() { + return ListUtil.trimStringList(files); + } } diff --git a/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/esb/v3/request/EsbFastTransferFileV3Request.java b/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/esb/v3/request/EsbFastTransferFileV3Request.java index 1f80c9aa1b..bcd4ac6af2 100644 --- a/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/esb/v3/request/EsbFastTransferFileV3Request.java +++ b/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/esb/v3/request/EsbFastTransferFileV3Request.java @@ -24,6 +24,7 @@ package com.tencent.bk.job.execute.model.esb.v3.request; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.tencent.bk.job.common.constant.JobConstants; import com.tencent.bk.job.common.esb.model.EsbAppScopeReq; @@ -140,6 +141,11 @@ private void trimIps(List ips) { }); } } + + @JsonIgnore + public String getTrimmedTargetPath(){ + return targetPath == null ? null : targetPath.trim(); + } } diff --git a/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/web/vo/ExecuteFileDestinationInfoVO.java b/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/web/vo/ExecuteFileDestinationInfoVO.java index 2e00074604..dd635739a0 100644 --- a/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/web/vo/ExecuteFileDestinationInfoVO.java +++ b/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/web/vo/ExecuteFileDestinationInfoVO.java @@ -24,6 +24,7 @@ package com.tencent.bk.job.execute.model.web.vo; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.tencent.bk.job.common.model.vo.TaskTargetVO; import io.swagger.annotations.ApiModelProperty; @@ -43,4 +44,9 @@ public class ExecuteFileDestinationInfoVO { @ApiModelProperty("目标机器列表") private TaskTargetVO server; + + @JsonIgnore + public String getTrimmedPath() { + return path == null ? null : path.trim(); + } } diff --git a/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/web/vo/ExecuteFileSourceInfoVO.java b/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/web/vo/ExecuteFileSourceInfoVO.java index fd6ace0acc..1217db2467 100644 --- a/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/web/vo/ExecuteFileSourceInfoVO.java +++ b/src/backend/job-execute/api-job-execute/src/main/java/com/tencent/bk/job/execute/model/web/vo/ExecuteFileSourceInfoVO.java @@ -24,8 +24,10 @@ package com.tencent.bk.job.execute.model.web.vo; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.tencent.bk.job.common.model.vo.TaskTargetVO; +import com.tencent.bk.job.common.util.ListUtil; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -60,4 +62,9 @@ public class ExecuteFileSourceInfoVO { @ApiModelProperty(value = "文件源ID") private Integer fileSourceId; + + @JsonIgnore + public List getTrimmedFileLocation() { + return ListUtil.trimStringList(fileLocation); + } } diff --git a/src/backend/job-execute/service-job-execute/src/main/java/com/tencent/bk/job/execute/api/esb/v3/EsbFastTransferFileV3ResourceImpl.java b/src/backend/job-execute/service-job-execute/src/main/java/com/tencent/bk/job/execute/api/esb/v3/EsbFastTransferFileV3ResourceImpl.java index e6518da92f..63a7d9c4e9 100644 --- a/src/backend/job-execute/service-job-execute/src/main/java/com/tencent/bk/job/execute/api/esb/v3/EsbFastTransferFileV3ResourceImpl.java +++ b/src/backend/job-execute/service-job-execute/src/main/java/com/tencent/bk/job/execute/api/esb/v3/EsbFastTransferFileV3ResourceImpl.java @@ -146,7 +146,7 @@ private ValidateResult checkFileSource(EsbFileSourceV3DTO fileSource) { if (fileType != null && !TaskFileTypeEnum.isValid(fileType)) { return ValidateResult.fail(ErrorCode.ILLEGAL_PARAM_WITH_PARAM_NAME, "file_source.file_type"); } - List files = fileSource.getFiles(); + List files = fileSource.getTrimmedFiles(); if (files == null || files.isEmpty()) { log.warn("File source contains empty file list"); return ValidateResult.fail(ErrorCode.MISSING_PARAM_WITH_PARAM_NAME, "file_source.file_list"); @@ -188,8 +188,8 @@ private ValidateResult checkFileSource(EsbFileSourceV3DTO fileSource) { } private ValidateResult checkFastTransferFileRequest(EsbFastTransferFileV3Request request) { - if (!FilePathValidateUtil.validateFileSystemAbsolutePath(request.getTargetPath())) { - log.warn("Fast transfer file, target path is invalid!path={}", request.getTargetPath()); + if (!FilePathValidateUtil.validateFileSystemAbsolutePath(request.getTrimmedTargetPath())) { + log.warn("Fast transfer file, target path is invalid!path={}", request.getTrimmedTargetPath()); return ValidateResult.fail(ErrorCode.MISSING_OR_ILLEGAL_PARAM_WITH_PARAM_NAME, "file_target_path"); } if ((request.getAccountId() == null || request.getAccountId() <= 0L) @@ -249,7 +249,7 @@ private StepInstanceDTO buildFastFileStepInstance(String username, stepInstance.setAccountAlias(request.getAccountAlias()); stepInstance.setStepId(-1L); stepInstance.setExecuteType(StepExecuteTypeEnum.SEND_FILE); - stepInstance.setFileTargetPath(request.getTargetPath()); + stepInstance.setFileTargetPath(request.getTrimmedTargetPath()); stepInstance.setFileTargetName(request.getTargetName()); stepInstance.setFileSourceList(convertFileSource(request.getAppId(), request.getFileSources())); stepInstance.setAppId(request.getAppId()); @@ -300,8 +300,8 @@ private List convertFileSource(Long appId, List files = new ArrayList<>(); - if (fileSource.getFiles() != null) { - for (String file : fileSource.getFiles()) { + if (fileSource.getTrimmedFiles() != null) { + for (String file : fileSource.getTrimmedFiles()) { FileDetailDTO fileDetailDTO; if (fileType == TaskFileTypeEnum.LOCAL.getType()) { // 从制品库获取本地文件信息 diff --git a/src/backend/job-execute/service-job-execute/src/main/java/com/tencent/bk/job/execute/api/web/impl/WebExecuteTaskResourceImpl.java b/src/backend/job-execute/service-job-execute/src/main/java/com/tencent/bk/job/execute/api/web/impl/WebExecuteTaskResourceImpl.java index 24a8e9c92b..2b051c59bd 100644 --- a/src/backend/job-execute/service-job-execute/src/main/java/com/tencent/bk/job/execute/api/web/impl/WebExecuteTaskResourceImpl.java +++ b/src/backend/job-execute/service-job-execute/src/main/java/com/tencent/bk/job/execute/api/web/impl/WebExecuteTaskResourceImpl.java @@ -426,7 +426,7 @@ private boolean checkFastPushFileRequest(WebFastPushFileRequest request) { return false; } for (ExecuteFileSourceInfoVO fileSource : request.getFileSourceList()) { - if (CollectionUtils.isEmpty(fileSource.getFileLocation())) { + if (CollectionUtils.isEmpty(fileSource.getTrimmedFileLocation())) { log.warn("Fast send file ,files are empty"); return false; } @@ -435,7 +435,7 @@ private boolean checkFastPushFileRequest(WebFastPushFileRequest request) { log.warn("Fast send file, account is empty!"); return false; } - for (String file : fileSource.getFileLocation()) { + for (String file : fileSource.getTrimmedFileLocation()) { if (!FilePathValidateUtil.validateFileSystemAbsolutePath(file)) { log.warn("Fast send file, fileLocation is null or illegal!"); return false; @@ -443,7 +443,7 @@ private boolean checkFastPushFileRequest(WebFastPushFileRequest request) { } } } - if (!FilePathValidateUtil.validateFileSystemAbsolutePath(fileDestination.getPath())) { + if (!FilePathValidateUtil.validateFileSystemAbsolutePath(fileDestination.getTrimmedPath())) { log.warn("Fast send file, fileDestinationPath is null or illegal!"); return false; } @@ -476,7 +476,7 @@ private StepInstanceDTO buildFastFileStepInstance(String userName, Long appId, W ExecuteFileDestinationInfoVO fileDestination = request.getFileDestination(); stepInstance.setAccountId(fileDestination.getAccountId()); stepInstance.setTargetExecuteObjects(ExecuteTargetDTO.fromTaskTargetVO(fileDestination.getServer())); - stepInstance.setFileTargetPath(fileDestination.getPath()); + stepInstance.setFileTargetPath(fileDestination.getTrimmedPath()); stepInstance.setStepId(-1L); stepInstance.setExecuteType(StepExecuteTypeEnum.SEND_FILE); stepInstance.setFileSourceList(convertFileSource(request.getFileSourceList())); @@ -512,8 +512,8 @@ private List convertFileSource(List file fileSourceDTO.setFileType(fileType.getType()); fileSourceDTO.setFileSourceId(fileSource.getFileSourceId()); List files = new ArrayList<>(); - if (fileSource.getFileLocation() != null) { - for (String file : fileSource.getFileLocation()) { + if (fileSource.getTrimmedFileLocation() != null) { + for (String file : fileSource.getTrimmedFileLocation()) { if (TaskFileTypeEnum.LOCAL == fileType) { files.add(new FileDetailDTO(true, file, fileSource.getFileHash(), Long.valueOf(fileSource.getFileSize())));