From b73093967a8d1a6c4f68977ac04454c27c270452 Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Thu, 5 Jan 2023 16:21:22 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95):?= =?UTF-8?q?=20=E6=9C=AC=E5=9C=B0=E9=99=84=E4=BB=B6=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=AD=98=E5=85=A5MinIO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/definition/request/ElementUtil.java | 14 +- .../request/unknown/MsJmeterElement.java | 6 +- .../io/metersphere/api/dto/scenario/Body.java | 6 +- .../parse/scenario/ApiScenarioImportUtil.java | 8 +- .../commons/constants/ElementConstants.java | 5 +- .../commons/utils/ApiFileUtil.java | 175 ++++++++++++++++++ .../commons/utils/DataFormattingUtil.java | 2 +- .../commons/utils/HashTreeUtil.java | 2 +- .../commons/utils/JmeterDocumentParser.java | 3 +- .../sechedule/ApiScenarioTestJob.java | 5 +- .../sechedule/SwaggerUrlImportJob.java | 7 +- .../service/ApiJMeterFileService.java | 10 +- .../service/MsHashTreeService.java | 2 +- .../definition/ApiDefinitionService.java | 10 +- .../definition/ApiTestCaseService.java | 13 +- .../ApiScenarioReportStructureService.java | 2 +- .../service/scenario/ApiScenarioService.java | 18 +- .../metersphere/commons/utils/FileUtils.java | 52 ------ 18 files changed, 233 insertions(+), 107 deletions(-) diff --git a/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java b/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java index c02b3d405c..642d28859a 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java +++ b/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java @@ -135,9 +135,10 @@ public class ElementUtil { if (!config.isOperating() && !isRepository && !new File(path).exists()) { MSException.throwException(StringUtils.isEmpty(item.getName()) ? "CSVDataSet" : item.getName() + ":[ " + Translator.get("csv_no_exist") + " ]"); } - csvDataSet.setProperty("filename", path); - csvDataSet.setProperty("isRef", isRef); - csvDataSet.setProperty("fileId", fileId); + csvDataSet.setProperty(ElementConstants.FILENAME, path); + csvDataSet.setProperty(ElementConstants.IS_REF, isRef); + csvDataSet.setProperty(ElementConstants.FILE_ID, fileId); + csvDataSet.setProperty(ElementConstants.RESOURCE_ID, file.getId()); } csvDataSet.setIgnoreFirstLine(false); csvDataSet.setProperty("shareMode", shareMode); @@ -182,9 +183,10 @@ public class ElementUtil { MSException.throwException(StringUtils.isEmpty(item.getName()) ? "CSVDataSet" : item.getName() + ":[ " + Translator.get("csv_no_exist") + " ]"); } } - csvDataSet.setProperty("filename", path); - csvDataSet.setProperty("isRef", isRef); - csvDataSet.setProperty("fileId", fileId); + csvDataSet.setProperty(ElementConstants.FILENAME, path); + csvDataSet.setProperty(ElementConstants.IS_REF, isRef); + csvDataSet.setProperty(ElementConstants.FILE_ID, fileId); + csvDataSet.setProperty(ElementConstants.RESOURCE_ID, file.getId()); } csvDataSet.setIgnoreFirstLine(false); csvDataSet.setProperty("shareMode", shareMode); diff --git a/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/unknown/MsJmeterElement.java b/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/unknown/MsJmeterElement.java index faa6ed5643..d878270e39 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/unknown/MsJmeterElement.java +++ b/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/unknown/MsJmeterElement.java @@ -56,18 +56,18 @@ public class MsJmeterElement extends MsTestElement { } // csv 检查处理 if (!config.isOperating() && scriptWrapper instanceof CSVDataSet && ((CSVDataSet) scriptWrapper).isEnabled()) { - String path = ((CSVDataSet) scriptWrapper).getPropertyAsString("filename"); + String path = ((CSVDataSet) scriptWrapper).getPropertyAsString(ElementConstants.FILENAME); if (!new File(path).exists()) { // 检查场景变量中的csv文件是否存在 String pathArr[] = path.split("\\/"); String csvPath = this.getCSVPath(config, pathArr[pathArr.length - 1]); if (StringUtils.isNotEmpty(csvPath)) { - ((CSVDataSet) scriptWrapper).setProperty("filename", csvPath); + ((CSVDataSet) scriptWrapper).setProperty(ElementConstants.FILENAME, csvPath); } else { MSException.throwException(StringUtils.isEmpty(((CSVDataSet) scriptWrapper).getName()) ? "CSVDataSet" : ((CSVDataSet) scriptWrapper).getName() + ":[ CSV文件不存在 ]"); } } - String csvPath = ((CSVDataSet) scriptWrapper).getPropertyAsString("filename"); + String csvPath = ((CSVDataSet) scriptWrapper).getPropertyAsString(ElementConstants.FILENAME); if (config.getCsvFilePaths().contains(csvPath)) { return; } else { diff --git a/api-test/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java b/api-test/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java index f976244d43..35aaf9bd51 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java +++ b/api-test/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java @@ -1,6 +1,7 @@ package io.metersphere.api.dto.scenario; import io.metersphere.api.exec.generator.JSONSchemaRunTest; +import io.metersphere.commons.constants.ElementConstants; import io.metersphere.commons.constants.StorageConstants; import io.metersphere.commons.utils.FileUtils; import io.metersphere.commons.utils.JSON; @@ -202,8 +203,9 @@ public class Body { mimetype = ContentType.APPLICATION_OCTET_STREAM.getMimeType(); } HTTPFileArg fileArg = new HTTPFileArg(path, isBinary ? StringUtils.EMPTY : paramName, mimetype); - fileArg.setProperty("isRef", isRef); - fileArg.setProperty("fileId", fileId); + fileArg.setProperty(ElementConstants.IS_REF, isRef); + fileArg.setProperty(ElementConstants.FILE_ID, fileId); + fileArg.setProperty(ElementConstants.RESOURCE_ID, requestId); list.add(fileArg); }); } diff --git a/api-test/backend/src/main/java/io/metersphere/api/parse/scenario/ApiScenarioImportUtil.java b/api-test/backend/src/main/java/io/metersphere/api/parse/scenario/ApiScenarioImportUtil.java index cc0e8a3f16..5dcbbb2493 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/parse/scenario/ApiScenarioImportUtil.java +++ b/api-test/backend/src/main/java/io/metersphere/api/parse/scenario/ApiScenarioImportUtil.java @@ -183,7 +183,7 @@ public class ApiScenarioImportUtil { structureCaseByJson(object, testCaseService, apiDefinition, apiTestCaseMapper, apiIdCaseNameMap); } else { object.put("id", sameCase.getId()); - object.put("resourceId", sameCase.getId()); + object.put(ElementConstants.RESOURCE_ID, sameCase.getId()); object.put("projectId", projectId); object.put(PropertyConstant.ENVIRONMENT, StringUtils.EMPTY); object.put(PropertyConstant.ENVIRONMENT_ID, StringUtils.EMPTY); @@ -242,7 +242,7 @@ public class ApiScenarioImportUtil { test.setLatest(true); test.setVersionId(versionId); object.put("id", test.getId()); - object.put("resourceId", test.getId()); + object.put(ElementConstants.RESOURCE_ID, test.getId()); object.put("projectId", projectId); object.put(PropertyConstant.ENVIRONMENT, StringUtils.EMPTY); object.put(PropertyConstant.ENVIRONMENT_ID, StringUtils.EMPTY); @@ -298,7 +298,7 @@ public class ApiScenarioImportUtil { } ApiDefinitionImportUtilService apiDefinitionImportUtilService = CommonBeanFactory.getBean(ApiDefinitionImportUtilService.class); object.put("id", apiTestCase.getId()); - object.put("resourceId", apiTestCase.getId()); + object.put(ElementConstants.RESOURCE_ID, apiTestCase.getId()); object.put("projectId", projectId); object.put(PropertyConstant.ENVIRONMENT, StringUtils.EMPTY); object.put(PropertyConstant.ENVIRONMENT_ID, StringUtils.EMPTY); @@ -326,7 +326,7 @@ public class ApiScenarioImportUtil { for (int i = 0; i < hashTree.length(); i++) { JSONObject object = (JSONObject) hashTree.get(i); object.put("index", i + 1); - object.put("resourceId", UUID.randomUUID().toString()); + object.put(ElementConstants.RESOURCE_ID, UUID.randomUUID().toString()); hashTree.put(i, object); if (object.has(ElementConstants.HASH_TREE) && object.optJSONArray(ElementConstants.HASH_TREE) != null) { formatHashTree(object.optJSONArray(ElementConstants.HASH_TREE)); diff --git a/api-test/backend/src/main/java/io/metersphere/commons/constants/ElementConstants.java b/api-test/backend/src/main/java/io/metersphere/commons/constants/ElementConstants.java index f91a8448c6..e0ac55559d 100644 --- a/api-test/backend/src/main/java/io/metersphere/commons/constants/ElementConstants.java +++ b/api-test/backend/src/main/java/io/metersphere/commons/constants/ElementConstants.java @@ -52,5 +52,8 @@ public class ElementConstants { public static final String SCRIPT = "script"; public static final String BEANSHELL = "beanshell"; - + public static final String IS_REF = "isRef"; + public static final String FILE_ID = "fileId"; + public static final String RESOURCE_ID = "resourceId"; + public static final String FILENAME = "filename"; } diff --git a/api-test/backend/src/main/java/io/metersphere/commons/utils/ApiFileUtil.java b/api-test/backend/src/main/java/io/metersphere/commons/utils/ApiFileUtil.java index 8a646a6c9a..c262bddd6c 100644 --- a/api-test/backend/src/main/java/io/metersphere/commons/utils/ApiFileUtil.java +++ b/api-test/backend/src/main/java/io/metersphere/commons/utils/ApiFileUtil.java @@ -1,13 +1,29 @@ package io.metersphere.commons.utils; +import io.metersphere.base.domain.FileMetadata; +import io.metersphere.commons.constants.ElementConstants; +import io.metersphere.commons.constants.StorageConstants; import io.metersphere.dto.FileInfoDTO; +import io.metersphere.metadata.service.FileManagerService; +import io.metersphere.metadata.service.FileMetadataService; +import io.metersphere.metadata.vo.FileRequest; import io.metersphere.request.BodyFile; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.jmeter.config.CSVDataSet; +import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy; +import org.apache.jmeter.protocol.http.util.HTTPFileArg; +import org.apache.jorphan.collections.HashTree; +import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.List; public class ApiFileUtil extends FileUtils { + private static FileManagerService fileManagerService; + private static FileMetadataService fileMetadataService; + public static String getFilePath(BodyFile file) { String type = StringUtils.isNotEmpty(file.getFileType()) ? file.getFileType().toLowerCase() : null; String name = file.getName(); @@ -22,4 +38,163 @@ public class ApiFileUtil extends FileUtils { createFile(item.getPath(), item.getFileByte()); }); } + + public static void copyBodyFiles(String sourceId, String targetId) { + // 本地存储 + FileUtils.copyBodyFiles(sourceId, targetId); + } + + public static void createBodyFiles(String requestId, List bodyFiles) { + FileUtils.createBodyFiles(requestId, bodyFiles); + // MinIO存储 + if (fileManagerService == null) { + fileManagerService = CommonBeanFactory.getBean(FileManagerService.class); + } + for (MultipartFile bodyFile : bodyFiles) { + fileManagerService.upload(bodyFile, getRequest(requestId)); + } + } + + public static void createBodyFiles(List bodyUploadIds, List bodyFiles) { + if (CollectionUtils.isNotEmpty(bodyUploadIds) && CollectionUtils.isNotEmpty(bodyFiles) + && bodyUploadIds.size() == bodyFiles.size()) { + FileUtils.createBodyFiles(bodyUploadIds, bodyFiles); + // MinIO存储 + if (fileManagerService == null) { + fileManagerService = CommonBeanFactory.getBean(FileManagerService.class); + } + for (int i = 0; i < bodyUploadIds.size(); i++) { + MultipartFile bodyFile = bodyFiles.get(i); + fileManagerService.upload(bodyFile, getRequest(bodyUploadIds.get(i))); + } + } + } + + public static void deleteBodyFiles(String requestId) { + if (StringUtils.isBlank(requestId)) { + return; + } + FileUtils.deleteBodyFiles(requestId); + // MinIO文件删除 + if (fileManagerService == null) { + fileManagerService = CommonBeanFactory.getBean(FileManagerService.class); + } + fileManagerService.delete(getRequest(requestId)); + } + + private static FileRequest getRequest(String requestId) { + FileRequest request = new FileRequest(); + String path = StringUtils.join(BODY_FILE_DIR, File.separator, requestId); + request.setProjectId(path); + request.setFileName(requestId); + request.setStorage(StorageConstants.MINIO.name()); + return request; + } + + public static void downloadFile(String requestId, String path) { + // MinIO文件下载 + if (fileManagerService == null) { + fileManagerService = CommonBeanFactory.getBean(FileManagerService.class); + } + byte[] content = fileManagerService.downloadFile(getRequest(requestId)); + if (ArrayUtils.isNotEmpty(content)) { + FileUtils.createFile(path, content); + } + } + + /** + * 获取当前jmx 涉及到的文件 执行时 + * + * @param tree + */ + public static void getExecuteFiles(HashTree tree, String reportId, List files) { + if (fileMetadataService == null) { + fileMetadataService = CommonBeanFactory.getBean(FileMetadataService.class); + } + for (Object key : tree.keySet()) { + if (key == null) { + continue; + } + HashTree node = tree.get(key); + if (key instanceof HTTPSamplerProxy) { + dealWithHttp(key, reportId, files); + } else if (key instanceof CSVDataSet) { + dealWithCsv(key, reportId, files); + } + if (node != null) { + getExecuteFiles(node, reportId, files); + } + } + } + + private static void dealWithCsv(Object key, String reportId, List files) { + CSVDataSet source = (CSVDataSet) key; + if (StringUtils.isNotEmpty(source.getPropertyAsString(ElementConstants.FILENAME))) { + BodyFile file = new BodyFile(); + file.setId(source.getPropertyAsString(ElementConstants.FILENAME)); + file.setName(source.getPropertyAsString(ElementConstants.FILENAME)); + + if (source.getPropertyAsBoolean(ElementConstants.IS_REF)) { + FileMetadata fileMetadata = fileMetadataService.getFileMetadataById( + source.getPropertyAsString(ElementConstants.FILE_ID)); + + if (fileMetadata != null && !StringUtils.equals(fileMetadata.getStorage(), StorageConstants.LOCAL.name())) { + file.setStorage(fileMetadata.getStorage()); + file.setFileId(source.getPropertyAsString(ElementConstants.FILE_ID)); + String fileName = StringUtils.join(reportId, File.separator, fileMetadata.getName()); + file.setName(fileName); + + String path = StringUtils.join( + BODY_FILE_DIR, + File.separator, + reportId, + File.separator, + fileMetadata.getName()); + ((CSVDataSet) key).setProperty(ElementConstants.FILENAME, path); + } + } else if (!new File(source.getPropertyAsString(ElementConstants.FILENAME)).exists() + && StringUtils.isNotBlank(source.getPropertyAsString(ElementConstants.RESOURCE_ID))) { + // 从MinIO下载 + downloadFile(source.getPropertyAsString(ElementConstants.RESOURCE_ID), + source.getPropertyAsString(ElementConstants.FILENAME)); + } + files.add(file); + } + } + + private static void dealWithHttp(Object key, String reportId, List files) { + HTTPSamplerProxy source = (HTTPSamplerProxy) key; + if (source == null || source.getHTTPFiles().length == 0) { + return; + } + for (HTTPFileArg httpFileArg : source.getHTTPFiles()) { + BodyFile file = new BodyFile(); + file.setId(httpFileArg.getParamName()); + file.setName(httpFileArg.getPath()); + + if (httpFileArg.getPropertyAsBoolean(ElementConstants.IS_REF)) { + FileMetadata fileMetadata = fileMetadataService.getFileMetadataById( + httpFileArg.getPropertyAsString(ElementConstants.FILE_ID)); + + if (fileMetadata != null && !StringUtils.equals(fileMetadata.getStorage(), StorageConstants.LOCAL.name())) { + file.setStorage(fileMetadata.getStorage()); + file.setFileId(httpFileArg.getPropertyAsString(ElementConstants.FILE_ID)); + file.setName(reportId + File.separator + fileMetadata.getName()); + String path = StringUtils.join( + BODY_FILE_DIR, + File.separator, + reportId, + File.separator, + fileMetadata.getName()); + + httpFileArg.setPath(path); + } + } else if (!new File(httpFileArg.getPath()).exists() + && StringUtils.isNotBlank(httpFileArg.getPropertyAsString(ElementConstants.RESOURCE_ID))) { + // 从MinIO下载 + downloadFile(httpFileArg.getPropertyAsString(ElementConstants.RESOURCE_ID), httpFileArg.getPath()); + } + files.add(file); + } + } } diff --git a/api-test/backend/src/main/java/io/metersphere/commons/utils/DataFormattingUtil.java b/api-test/backend/src/main/java/io/metersphere/commons/utils/DataFormattingUtil.java index f97c127533..e655f9f52e 100644 --- a/api-test/backend/src/main/java/io/metersphere/commons/utils/DataFormattingUtil.java +++ b/api-test/backend/src/main/java/io/metersphere/commons/utils/DataFormattingUtil.java @@ -102,7 +102,7 @@ public class DataFormattingUtil { try { List propElementList = parentElement.elements(); for (Element propElement : propElementList) { - if (StringUtils.equals("filename", propElement.attributeValue("name"))) { + if (StringUtils.equals(ElementConstants.FILENAME, propElement.attributeValue("name"))) { String filePath = propElement.getText(); File file = new File(filePath); if (file.exists() && file.isFile()) { diff --git a/api-test/backend/src/main/java/io/metersphere/commons/utils/HashTreeUtil.java b/api-test/backend/src/main/java/io/metersphere/commons/utils/HashTreeUtil.java index 70017b3ff4..bbc9ab1fa6 100644 --- a/api-test/backend/src/main/java/io/metersphere/commons/utils/HashTreeUtil.java +++ b/api-test/backend/src/main/java/io/metersphere/commons/utils/HashTreeUtil.java @@ -237,7 +237,7 @@ public class HashTreeUtil { return; } List files = new LinkedList<>(); - FileUtils.getExecuteFiles(runRequest.getHashTree(), runRequest.getReportId(), files); + ApiFileUtil.getExecuteFiles(runRequest.getHashTree(), runRequest.getReportId(), files); if (CollectionUtils.isNotEmpty(files)) { Map repositoryFileMap = new HashMap<>(); for (BodyFile bodyFile : files) { diff --git a/api-test/backend/src/main/java/io/metersphere/commons/utils/JmeterDocumentParser.java b/api-test/backend/src/main/java/io/metersphere/commons/utils/JmeterDocumentParser.java index 59e0487ff0..381aaf6525 100644 --- a/api-test/backend/src/main/java/io/metersphere/commons/utils/JmeterDocumentParser.java +++ b/api-test/backend/src/main/java/io/metersphere/commons/utils/JmeterDocumentParser.java @@ -3,6 +3,7 @@ package io.metersphere.commons.utils; import io.metersphere.api.exec.engine.EngineSourceParser; import io.metersphere.api.exec.engine.EngineSourceParserFactory; import io.metersphere.base.domain.TestResourcePool; +import io.metersphere.commons.constants.ElementConstants; import io.metersphere.commons.exception.MSException; import io.metersphere.config.KafkaProperties; import io.metersphere.engine.EngineContext; @@ -227,7 +228,7 @@ public class JmeterDocumentParser implements EngineSourceParser { for (Element item : childNodes) { if (nodeNameEquals(item, STRING_PROP)) { String filenameTag = item.attributeValue("name"); - if (StringUtils.equals(filenameTag, "filename")) { + if (StringUtils.equals(filenameTag, ElementConstants.FILENAME)) { // 截取文件名 handleFilename(item); // 切割CSV文件 diff --git a/api-test/backend/src/main/java/io/metersphere/sechedule/ApiScenarioTestJob.java b/api-test/backend/src/main/java/io/metersphere/sechedule/ApiScenarioTestJob.java index 1e941d0d9c..c060f89c81 100644 --- a/api-test/backend/src/main/java/io/metersphere/sechedule/ApiScenarioTestJob.java +++ b/api-test/backend/src/main/java/io/metersphere/sechedule/ApiScenarioTestJob.java @@ -2,8 +2,8 @@ package io.metersphere.sechedule; import io.metersphere.api.dto.automation.ExecuteType; import io.metersphere.api.dto.automation.RunScenarioRequest; -import io.metersphere.service.scenario.ApiScenarioService; import io.metersphere.commons.constants.ApiRunMode; +import io.metersphere.commons.constants.ElementConstants; import io.metersphere.commons.constants.ReportTriggerMode; import io.metersphere.commons.constants.ScheduleGroup; import io.metersphere.commons.utils.CommonBeanFactory; @@ -11,6 +11,7 @@ import io.metersphere.commons.utils.JSON; import io.metersphere.commons.utils.LogUtil; import io.metersphere.constants.RunModeConstants; import io.metersphere.dto.RunModeConfigDTO; +import io.metersphere.service.scenario.ApiScenarioService; import org.apache.commons.lang3.StringUtils; import org.quartz.*; @@ -42,7 +43,7 @@ public class ApiScenarioTestJob extends MsScheduleJob { JobKey jobKey = context.getTrigger().getJobKey(); JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); - String resourceId = jobDataMap.getString("resourceId"); + String resourceId = jobDataMap.getString(ElementConstants.RESOURCE_ID); this.userId = jobDataMap.getString("userId"); this.expression = jobDataMap.getString("expression"); this.projectID = jobDataMap.getString("projectId"); diff --git a/api-test/backend/src/main/java/io/metersphere/sechedule/SwaggerUrlImportJob.java b/api-test/backend/src/main/java/io/metersphere/sechedule/SwaggerUrlImportJob.java index 7e4e2addef..d8798f6f2c 100644 --- a/api-test/backend/src/main/java/io/metersphere/sechedule/SwaggerUrlImportJob.java +++ b/api-test/backend/src/main/java/io/metersphere/sechedule/SwaggerUrlImportJob.java @@ -3,11 +3,12 @@ package io.metersphere.sechedule; import io.metersphere.api.dto.ApiTestImportRequest; import io.metersphere.api.dto.definition.request.auth.MsAuthManager; import io.metersphere.api.dto.scenario.KeyValue; -import io.metersphere.commons.utils.JSONUtil; -import io.metersphere.service.definition.ApiDefinitionService; import io.metersphere.base.domain.SwaggerUrlProject; +import io.metersphere.commons.constants.ElementConstants; import io.metersphere.commons.constants.ScheduleGroup; import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.commons.utils.JSONUtil; +import io.metersphere.service.definition.ApiDefinitionService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.json.JSONObject; @@ -28,7 +29,7 @@ public class SwaggerUrlImportJob extends MsScheduleJob { @Override protected void businessExecute(JobExecutionContext context) { JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); - String resourceId = jobDataMap.getString("resourceId"); + String resourceId = jobDataMap.getString(ElementConstants.RESOURCE_ID); SwaggerUrlProject swaggerUrlProject = apiDefinitionService.getSwaggerInfo(resourceId); ApiTestImportRequest request = new ApiTestImportRequest(); // 获取鉴权设置 diff --git a/api-test/backend/src/main/java/io/metersphere/service/ApiJMeterFileService.java b/api-test/backend/src/main/java/io/metersphere/service/ApiJMeterFileService.java index d6b85e7cf0..9baaf4b9b7 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/ApiJMeterFileService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/ApiJMeterFileService.java @@ -5,21 +5,17 @@ import io.metersphere.api.dto.EnvironmentType; import io.metersphere.api.dto.definition.request.MsTestPlan; import io.metersphere.api.exec.api.ApiCaseSerialService; import io.metersphere.base.domain.*; -import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.base.mapper.ApiExecutionQueueDetailMapper; +import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.base.mapper.plan.TestPlanApiScenarioMapper; import io.metersphere.commons.constants.ApiRunMode; import io.metersphere.commons.constants.StorageConstants; -import io.metersphere.commons.utils.CommonBeanFactory; -import io.metersphere.commons.utils.FileUtils; -import io.metersphere.commons.utils.JSON; -import io.metersphere.commons.utils.LogUtil; +import io.metersphere.commons.utils.*; import io.metersphere.dto.FileInfoDTO; import io.metersphere.dto.JmeterRunRequestDTO; import io.metersphere.environment.service.BaseEnvGroupProjectService; import io.metersphere.metadata.service.FileMetadataService; import io.metersphere.request.BodyFile; -import io.metersphere.commons.utils.GenerateHashTreeUtil; import io.metersphere.utils.LoggerUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; @@ -221,7 +217,7 @@ public class ApiJMeterFileService { Map multipartFiles = new LinkedHashMap<>(); // 获取附件 List files = new LinkedList<>(); - FileUtils.getExecuteFiles(hashTree, reportId, files); + ApiFileUtil.getExecuteFiles(hashTree, reportId, files); if (CollectionUtils.isNotEmpty(files)) { Map repositoryFileMap = new HashMap<>(); for (BodyFile bodyFile : files) { diff --git a/api-test/backend/src/main/java/io/metersphere/service/MsHashTreeService.java b/api-test/backend/src/main/java/io/metersphere/service/MsHashTreeService.java index 0bc9450aa9..7a0ac16be9 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/MsHashTreeService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/MsHashTreeService.java @@ -82,7 +82,7 @@ public class MsHashTreeService { public static final String CUSTOM_NUM = "customNum"; public static final String SHOW_CUSTOM_NUM = "showCustomNum"; public static final String VERSION_ID = "versionId"; - public static final String RESOURCE_ID = "resourceId"; + public static final String RESOURCE_ID = ElementConstants.RESOURCE_ID; public void setHashTree(JSONArray hashTree) { // 将引用转成复制 diff --git a/api-test/backend/src/main/java/io/metersphere/service/definition/ApiDefinitionService.java b/api-test/backend/src/main/java/io/metersphere/service/definition/ApiDefinitionService.java index aeb95c0e5c..26c3077c1f 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/definition/ApiDefinitionService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/definition/ApiDefinitionService.java @@ -389,9 +389,9 @@ public class ApiDefinitionService { } if (StringUtils.isNotEmpty(request.getSourceId())) { // 检查附件复制出附件 - FileUtils.copyBodyFiles(request.getSourceId(), request.getId()); + ApiFileUtil.copyBodyFiles(request.getSourceId(), request.getId()); } else { - FileUtils.createBodyFiles(request.getRequest().getId(), bodyFiles); + ApiFileUtil.createBodyFiles(request.getRequest().getId(), bodyFiles); } request.setNewCreate(true); return createTest(request); @@ -415,7 +415,7 @@ public class ApiDefinitionService { MockConfigService mockConfigService = CommonBeanFactory.getBean(MockConfigService.class); mockConfigService.updateMockReturnMsgByApi(returnModel); - FileUtils.createBodyFiles(request.getRequest().getId(), bodyFiles); + ApiFileUtil.createBodyFiles(request.getRequest().getId(), bodyFiles); String context = SessionUtils.getUserId().concat(Translator.get("update_api")).concat(":").concat(returnModel.getName()); BeanMap beanMap = new BeanMap(returnModel); Map paramMap = new HashMap<>(beanMap); @@ -456,7 +456,7 @@ public class ApiDefinitionService { customFieldApiService.deleteByResourceId(api.getId()); // 删除关系图 relationshipEdgeService.delete(api.getId()); - FileUtils.deleteBodyFiles(api.getId()); + ApiFileUtil.deleteBodyFiles(api.getId()); deleteFollows(api.getId()); }); // 删除附件关系 @@ -1822,7 +1822,7 @@ public class ApiDefinitionService { api.setUpdateTime(System.currentTimeMillis()); api.setRefId(api.getId()); // 检查附件复制出附件 - FileUtils.copyBodyFiles(sourceId, api.getId()); + ApiFileUtil.copyBodyFiles(sourceId, api.getId()); mapper.insert(api); if (i % 50 == 0) sqlSession.flushStatements(); diff --git a/api-test/backend/src/main/java/io/metersphere/service/definition/ApiTestCaseService.java b/api-test/backend/src/main/java/io/metersphere/service/definition/ApiTestCaseService.java index c742e48757..6c8dcddb7c 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/definition/ApiTestCaseService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/definition/ApiTestCaseService.java @@ -47,7 +47,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; -import org.aspectj.util.FileUtil; import org.json.JSONObject; import org.mybatis.spring.SqlSessionUtils; import org.springframework.scheduling.annotation.Async; @@ -56,7 +55,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.File; import java.util.*; import java.util.stream.Collectors; @@ -302,9 +300,9 @@ public class ApiTestCaseService { ApiTestCase test = updateTest(request); if (request.getRequest() != null) { // requestID 跟接口id 不一致的情况 - FileUtils.createBodyFiles(request.getRequest().getId(), bodyFiles); + ApiFileUtil.createBodyFiles(request.getRequest().getId(), bodyFiles); } else { - FileUtils.createBodyFiles(request.getId(), bodyFiles); + ApiFileUtil.createBodyFiles(request.getId(), bodyFiles); } // 发送通知 ApiCaseBatchSyncService apiCaseBatchSyncService = CommonBeanFactory.getBean(ApiCaseBatchSyncService.class); @@ -323,8 +321,7 @@ public class ApiTestCaseService { deleteFollows(testId); ApiTestCase apiTestCase = apiTestCaseMapper.selectByPrimaryKey(testId); if (apiTestCase != null) { - String filePath = StringUtils.join(BODY_FILE_DIR, File.separator, apiTestCase.getId()); - FileUtil.deleteContents(new File(filePath)); + ApiFileUtil.deleteBodyFiles(apiTestCase.getId()); } } @@ -439,9 +436,9 @@ public class ApiTestCaseService { private ApiTestCase createTest(SaveApiTestCaseRequest request, List bodyFiles) { checkNameExist(request); - FileUtils.createBodyFiles(request.getId(), bodyFiles); + ApiFileUtil.createBodyFiles(request.getId(), bodyFiles); request.setRequest(tcpApiParamService.parseMsTestElement(request.getRequest())); - FileUtils.copyBdyFile(request.getApiDefinitionId(), request.getId()); + ApiFileUtil.copyBdyFile(request.getApiDefinitionId(), request.getId()); final ApiTestCaseWithBLOBs test = new ApiTestCaseWithBLOBs(); test.setId(request.getId()); diff --git a/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioReportStructureService.java b/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioReportStructureService.java index e69e386e3c..d6504d4d88 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioReportStructureService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioReportStructureService.java @@ -48,7 +48,7 @@ public class ApiScenarioReportStructureService { ElementConstants.IF_CONTROLLER, ElementConstants.CONSTANT_TIMER ); - private static final String RESOURCE_ID = "resourceId"; + private static final String RESOURCE_ID = ElementConstants.RESOURCE_ID; private static final String REFERENCED = "referenced"; private static final String ERROR_CODE = "errorCode"; private static final String ID = "id"; diff --git a/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioService.java b/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioService.java index 85aa15dd4b..fa324afe06 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioService.java @@ -304,11 +304,11 @@ public class ApiScenarioService { } private void uploadFiles(SaveApiScenarioRequest request, List bodyFiles, List scenarioFiles) { - FileUtils.createBodyFiles(request.getScenarioFileIds(), scenarioFiles); + ApiFileUtil.createBodyFiles(request.getScenarioFileIds(), scenarioFiles); List bodyFileRequestIds = request.getBodyFileRequestIds(); if (CollectionUtils.isNotEmpty(bodyFileRequestIds)) { bodyFileRequestIds.forEach(requestId -> { - FileUtils.createBodyFiles(requestId, bodyFiles); + ApiFileUtil.createBodyFiles(requestId, bodyFiles); }); } } @@ -444,7 +444,7 @@ public class ApiScenarioService { List oldRequests = MsHTTPSamplerProxy.findHttpSampleFromHashTree(msTestElement); oldRequests.forEach(item -> { if (item.isCustomizeReq() && !newRequestIds.contains(item.getId())) { - FileUtils.deleteBodyFiles(item.getId()); + ApiFileUtil.deleteBodyFiles(item.getId()); } }); } catch (Exception e) { @@ -558,7 +558,7 @@ public class ApiScenarioService { List httpSampleFromHashTree = MsHTTPSamplerProxy.findHttpSampleFromHashTree(msTestElement); httpSampleFromHashTree.forEach((httpSamplerProxy) -> { if (httpSamplerProxy.isCustomizeReq()) { - FileUtils.deleteBodyFiles(httpSamplerProxy.getId()); + ApiFileUtil.deleteBodyFiles(httpSamplerProxy.getId()); } }); } @@ -831,7 +831,7 @@ public class ApiScenarioService { public byte[] loadFileAsBytes(FileOperationRequest fileOperationRequest) { if (fileOperationRequest.getId().contains("/") || fileOperationRequest.getName().contains("/")) MSException.throwException(Translator.get("invalid_parameter")); - File file = new File(FileUtils.BODY_FILE_DIR + "/" + fileOperationRequest.getId() + "_" + fileOperationRequest.getName()); + File file = new File(ApiFileUtil.BODY_FILE_DIR + "/" + fileOperationRequest.getId() + "_" + fileOperationRequest.getName()); try (FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);) { byte[] b = new byte[1000]; int n; @@ -889,7 +889,7 @@ public class ApiScenarioService { if (isUseElement) { scenario.toHashTree(jmeterHashTree, scenario.getHashTree(), config); ElementUtil.accuracyHashTree(jmeterHashTree); - repositoryMetadata = FileUtils.getRepositoryFileMetadata(jmeterHashTree); + repositoryMetadata = ApiFileUtil.getRepositoryFileMetadata(jmeterHashTree); jmx = scenario.getJmx(jmeterHashTree); } else { MsThreadGroup group = new MsThreadGroup(); @@ -902,7 +902,7 @@ public class ApiScenarioService { }}); testPlan.getHashTree().add(group); testPlan.toHashTree(jmeterHashTree, testPlan.getHashTree(), config); - repositoryMetadata = FileUtils.getRepositoryFileMetadata(jmeterHashTree); + repositoryMetadata = ApiFileUtil.getRepositoryFileMetadata(jmeterHashTree); jmx = testPlan.getJmx(jmeterHashTree); } @@ -1654,7 +1654,7 @@ public class ApiScenarioService { List ids = scenarios.stream().map(ApiScenarioWithBLOBs::getId).collect(Collectors.toList()); request.setId(JSON.toJSONString(ids)); } - return FileUtils.listBytesToZip(files); + return ApiFileUtil.listBytesToZip(files); } private void checkExportEnv(List scenarios) { @@ -2171,7 +2171,7 @@ public class ApiScenarioService { object.put("referenced", "Copy"); } else { object.put("id", bloBs.getId()); - object.put("resourceId", bloBs.getId()); + object.put(ElementConstants.RESOURCE_ID, bloBs.getId()); } } } diff --git a/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/utils/FileUtils.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/utils/FileUtils.java index 3ec25567de..daa8d17cc2 100644 --- a/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/utils/FileUtils.java +++ b/framework/sdk-parent/sdk/src/main/java/io/metersphere/commons/utils/FileUtils.java @@ -388,58 +388,6 @@ public class FileUtils { } } - /** - * 获取当前jmx 涉及到的文件 执行时 - * - * @param tree - */ - public static void getExecuteFiles(HashTree tree, String reportId, List files) { - FileMetadataService fileMetadataService = CommonBeanFactory.getBean(FileMetadataService.class); - for (Object key : tree.keySet()) { - HashTree node = tree.get(key); - if (key instanceof HTTPSamplerProxy) { - HTTPSamplerProxy source = (HTTPSamplerProxy) key; - if (source != null && source.getHTTPFiles().length > 0) { - for (HTTPFileArg arg : source.getHTTPFiles()) { - BodyFile file = new BodyFile(); - file.setId(arg.getParamName()); - file.setName(arg.getPath()); - if (arg.getPropertyAsBoolean("isRef") && fileMetadataService != null) { - FileMetadata fileMetadata = fileMetadataService.getFileMetadataById(arg.getPropertyAsString("fileId")); - if (fileMetadata != null && !StringUtils.equals(fileMetadata.getStorage(), StorageConstants.LOCAL.name())) { - file.setStorage(fileMetadata.getStorage()); - file.setFileId(arg.getPropertyAsString("fileId")); - file.setName(reportId + File.separator + fileMetadata.getName()); - arg.setPath(BODY_FILE_DIR + File.separator + reportId + File.separator + fileMetadata.getName()); - } - } - files.add(file); - } - } - } else if (key instanceof CSVDataSet) { - CSVDataSet source = (CSVDataSet) key; - if (source != null && StringUtils.isNotEmpty(source.getPropertyAsString("filename"))) { - BodyFile file = new BodyFile(); - file.setId(source.getPropertyAsString("filename")); - file.setName(source.getPropertyAsString("filename")); - if (source.getPropertyAsBoolean("isRef") && fileMetadataService != null) { - FileMetadata fileMetadata = fileMetadataService.getFileMetadataById(source.getPropertyAsString("fileId")); - if (fileMetadata != null && !StringUtils.equals(fileMetadata.getStorage(), StorageConstants.LOCAL.name())) { - file.setStorage(fileMetadata.getStorage()); - file.setFileId(source.getPropertyAsString("fileId")); - file.setName(reportId + File.separator + fileMetadata.getName()); - ((CSVDataSet) key).setProperty("filename", BODY_FILE_DIR + File.separator + reportId + File.separator + fileMetadata.getName()); - } - } - files.add(file); - } - } - if (node != null) { - getExecuteFiles(node, reportId, files); - } - } - } - public static byte[] fileToByte(File tradeFile) { byte[] buffer = null; try (FileInputStream fis = new FileInputStream(tradeFile);