feat: ESB接口导入和模板下载

ESB接口导入和模板下载
This commit is contained in:
song.tianyang 2021-03-23 17:25:20 +08:00
parent a106b22faf
commit d83df6e1cc
19 changed files with 1058 additions and 38 deletions

View File

@ -13,6 +13,7 @@ import io.metersphere.api.dto.swaggerurl.SwaggerTaskResult;
import io.metersphere.api.dto.swaggerurl.SwaggerUrlRequest;
import io.metersphere.api.service.ApiDefinitionService;
import io.metersphere.api.service.EsbApiParamService;
import io.metersphere.api.service.EsbImportService;
import io.metersphere.base.domain.ApiDefinition;
import io.metersphere.base.domain.Schedule;
import io.metersphere.commons.constants.RoleConstants;
@ -32,6 +33,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.net.MalformedURLException;
import java.util.Date;
import java.util.List;
@ -49,6 +51,8 @@ public class ApiDefinitionController {
private CheckPermissionService checkPermissionService;
@Resource
private EsbApiParamService esbApiParamService;
@Resource
private EsbImportService esbImportService;
@PostMapping("/list/{goPage}/{pageSize}")
public Pager<List<ApiDefinitionResult>> list(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody ApiDefinitionRequest request) {
@ -63,6 +67,7 @@ public class ApiDefinitionController {
request.setWorkspaceId(SessionUtils.getCurrentWorkspaceId());
return PageUtils.setPageInfo(page, apiDefinitionService.listRelevance(request));
}
@PostMapping("/list/relevance/review/{goPage}/{pageSize}")
public Pager<List<ApiDefinitionResult>> listRelevanceReview(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody ApiDefinitionRequest request) {
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
@ -103,7 +108,7 @@ public class ApiDefinitionController {
@PostMapping(value = "/updateEsbRequest")
public SaveApiDefinitionRequest updateEsbRequest(@RequestBody SaveApiDefinitionRequest request) {
if(StringUtils.equals(request.getMethod(),"ESB")){
if (StringUtils.equals(request.getMethod(), "ESB")) {
//ESB的接口类型数据采用TCP方式去发送并将方法类型改为TCP 并修改发送数据
request = esbApiParamService.updateEsbRequest(request);
}
@ -180,15 +185,18 @@ public class ApiDefinitionController {
public void createSchedule(@RequestBody ScheduleRequest request) throws MalformedURLException {
apiDefinitionService.createSchedule(request);
}
@PostMapping(value = "/schedule/update")
public void updateSchedule(@RequestBody Schedule request){
public void updateSchedule(@RequestBody Schedule request) {
apiDefinitionService.updateSchedule(request);
}
//查找定时任务资源Id
@PostMapping(value = "/getResourceId")
public String getResourceId(@RequestBody SwaggerUrlRequest swaggerUrlRequest){
public String getResourceId(@RequestBody SwaggerUrlRequest swaggerUrlRequest) {
return apiDefinitionService.getResourceId(swaggerUrlRequest);
}
//查找定时任务列表
@GetMapping("/scheduleTask/{projectId}")
public List<SwaggerTaskResult> getSwaggerScheduleList(@PathVariable String projectId) {
@ -198,12 +206,13 @@ public class ApiDefinitionController {
resultList) {
swaggerTaskResult.setIndex(dataIndex++);
Date nextExecutionTime = CronUtils.getNextTriggerTime(swaggerTaskResult.getRule());
if(nextExecutionTime!=null){
if (nextExecutionTime != null) {
swaggerTaskResult.setNextExecutionTime(nextExecutionTime.getTime());
}
}
return resultList;
return resultList;
}
//更新定时任务
@PostMapping(value = "/schedule/updateByPrimyKey")
public void updateScheduleEnableByPrimyKey(@RequestBody ScheduleInfoSwaggerUrlRequest request) {
@ -211,11 +220,13 @@ public class ApiDefinitionController {
schedule.setEnable(request.getTaskStatus());
apiDefinitionService.updateSchedule(schedule);
}
//删除定时任务和swaggereUrl
@PostMapping("/schedule/deleteByPrimyKey")
public void deleteSchedule(@RequestBody ScheduleInfoSwaggerUrlRequest request) {
apiDefinitionService.deleteSchedule(request);
}
@PostMapping("/getReference")
public ReferenceDTO getReference(@RequestBody ApiScenarioRequest request) {
return apiDefinitionService.getReference(request);
@ -237,8 +248,9 @@ public class ApiDefinitionController {
public void testPlanRelevance(@RequestBody ApiCaseRelevanceRequest request) {
apiDefinitionService.testPlanRelevance(request);
}
@PostMapping("/relevance/review")
public void testCaseReviewRelevance(@RequestBody ApiCaseRelevanceRequest request){
public void testCaseReviewRelevance(@RequestBody ApiCaseRelevanceRequest request) {
apiDefinitionService.testCaseReviewRelevance(request);
}
@ -246,4 +258,10 @@ public class ApiDefinitionController {
public String preview(@RequestBody String jsonSchema) {
return JSONSchemaGenerator.getJson(jsonSchema);
}
@GetMapping("/export/esbExcelTemplate")
@RequiresRoles(value = {RoleConstants.ADMIN, RoleConstants.ORG_ADMIN, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
public void testCaseTemplateExport(HttpServletResponse response) {
esbImportService.templateExport(response);
}
}

View File

@ -8,6 +8,7 @@ import org.dom4j.Element;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* //ESB数据格式
@ -19,15 +20,69 @@ import java.util.List;
@Getter
@Setter
public class EsbDataStruct {
private String uuid;
private String name;
private String value;
private String type;
private String systemName;
private String contentType;
private String required;
private boolean required;
private String description;
private List<EsbDataStruct> children;
public void init(){
this.uuid = UUID.randomUUID().toString();
this.systemName = "";
this.description = "";
this.value="";
this.required = true;
this.contentType = "";
this.type = "";
this.children = new ArrayList<>();
}
public boolean initDefaultData(String name, String typeLength,String chineseName,String desc){
this.init();
if(StringUtils.isEmpty(name)){return false; }
if(typeLength == null){
typeLength = "";
}else{
typeLength = typeLength.trim();
typeLength = typeLength.toLowerCase();
}
this.name = name;
if(typeLength.startsWith("string")){
this.type = "string";
String lengthStr = typeLength.substring(6);
if(lengthStr.startsWith("(") && lengthStr.endsWith(")")){
try {
int length = Integer.parseInt(lengthStr.substring(1,lengthStr.length()-1));
this.contentType = String.valueOf(length);
}catch (Exception e){ }
}
}else if(typeLength.startsWith("array")){
this.type = "array";
}else{
this.type = "object";
}
if(StringUtils.isEmpty(desc)){desc = "";}
if(StringUtils.isNotEmpty(chineseName)){
this.description = chineseName+":"+desc;
}else{
this.description =desc;
}
if(this.description.endsWith(":")){
this.description = this.description.substring(0,this.description.length()-1);
}
return true;
}
public EsbDataStruct copy(boolean copyChildren) {
EsbDataStruct returnObj = new EsbDataStruct();
returnObj.name = this.name;

View File

@ -1,12 +1,12 @@
package io.metersphere.api.dto.definition.parse;
import io.metersphere.api.dto.definition.request.MsScenario;
import io.metersphere.base.domain.ApiDefinitionWithBLOBs;
import io.metersphere.base.domain.ApiScenarioWithBLOBs;
import io.metersphere.base.domain.ApiTestCaseWithBLOBs;
import io.metersphere.base.domain.EsbApiParamsWithBLOBs;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class ApiDefinitionImport {
@ -16,4 +16,7 @@ public class ApiDefinitionImport {
// 新版本带用例导出
private List<ApiTestCaseWithBLOBs> cases;
//ESB文件导入的附属数据类
private Map<String,EsbApiParamsWithBLOBs> esbApiParamsMap;
}

View File

@ -14,6 +14,8 @@ public class ApiDefinitionImportParserFactory {
return new Swagger2Parser();
}else if (StringUtils.equals(ApiImportPlatform.Har.name(), platform)) {
return new HarParser();
}else if (StringUtils.equals(ApiImportPlatform.ESB.name(), platform)) {
return new ESBParser();
}
return null;
}

View File

@ -0,0 +1,663 @@
package io.metersphere.api.dto.definition.parse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import io.metersphere.api.dto.ApiTestImportRequest;
import io.metersphere.api.dto.automation.EsbDataStruct;
import io.metersphere.api.dto.definition.parse.esb.EsbExcelDataStruct;
import io.metersphere.api.dto.definition.parse.esb.EsbSheetDataStruct;
import io.metersphere.api.dto.definition.request.processors.pre.MsJSR223PreProcessor;
import io.metersphere.api.dto.definition.request.sampler.MsTCPSampler;
import io.metersphere.api.dto.scenario.request.RequestType;
import io.metersphere.base.domain.ApiDefinitionWithBLOBs;
import io.metersphere.base.domain.ApiModule;
import io.metersphere.base.domain.EsbApiParamsWithBLOBs;
import io.metersphere.commons.utils.SessionUtils;
import io.swagger.models.Model;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.util.*;
import java.util.regex.Pattern;
/**
* @author song.tianyang
* @Date 2021/3/10 11:14 上午
* @Description
*/
public class ESBParser extends EsbAbstractParser {
private final int REQUEST_MESSAGE_ROW = 5;
private Map<String, Model> definitions = null;
public static void export(HttpServletResponse response, String fileName) {
XSSFWorkbook wb = null;
ServletOutputStream out = null;
try {
wb = getTemplate();
out = response.getOutputStream();
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
wb.write(out);
wb.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (Exception e) {
}
}
if (wb != null) {
try {
wb.close();
} catch (Exception e) {
}
}
}
}
private static XSSFWorkbook getTemplate() {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 9);
Map<String, XSSFCellStyle> cellStyleMap = createCellStle(workbook);
XSSFSheet headSheet = workbook.createSheet("公共报文头");
generateSheet(headSheet, font,cellStyleMap);
XSSFSheet bodySheet = workbook.createSheet("接口报文信息");
generateSheet(bodySheet, font,cellStyleMap);
return workbook;
}
private static Map<String, XSSFCellStyle> createCellStle(XSSFWorkbook workbook) {
Map<String, XSSFCellStyle> cellStype = new HashMap<>();
short[] colorIndexArr = {IndexedColors.LIGHT_GREEN.getIndex(), IndexedColors.ORCHID.getIndex(), IndexedColors.YELLOW.getIndex()};
for (short colorIndex : colorIndexArr) {
XSSFCellStyle style = workbook.createCellStyle();
// style.setFillForegroundColor(IndexedColors.VIOLET.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
String name = "";
if(colorIndex == IndexedColors.LIGHT_GREEN.getIndex()){
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(204, 255, 204)));
name = "green";
}else if(colorIndex == IndexedColors.ORCHID.getIndex()){
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(151, 50, 101)));
name = "pop";
}else if(colorIndex == IndexedColors.YELLOW.getIndex()){
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(255, 255, 153)));
name = "yellow";
}else{
name = "default";
}
cellStype.put(name,style);
}
return cellStype;
}
private static void generateSheet(XSSFSheet sheet, XSSFFont font,Map<String, XSSFCellStyle> cellStyleMap) {
if (sheet == null) {
return;
}
sheet.setColumnWidth(0, 4000);
sheet.setColumnWidth(1, 4000);
sheet.setColumnWidth(2, 4000);
sheet.setColumnWidth(3, 4000);
sheet.setColumnWidth(4, 4000);
sheet.setColumnWidth(5, 880);
sheet.setColumnWidth(6, 4000);
sheet.setColumnWidth(7, 4000);
sheet.setColumnWidth(8, 4000);
sheet.setColumnWidth(9, 4000);
sheet.setColumnWidth(10, 4000);
/**
* 模版生成:
* 字体大小9
* row1: 1交易码 2交易名称 6(紫色[pop]背景空白单元格,下同) 7服务名称 8服务场景
* row2: 1.请输入交易码(必填) 2请输入交易名称(必填) 7请输入服务名称(如果不填则以交易名称为主) 8请输入服务场景(选填)
* row3: 合并7-10单元格输入请输入系统名称 背景色:黄色[yellow]
* row4: 1.英文名称2.中文名称3.数据类型/长度4.是否必输5.备注 7.英文名称8.数据类型/长度9.中文名称 10备注 背景色:黄色
* row5: 整行都是青色green1:输入
* row6: 3请输入STRING(具体长度) ARRAY; 8:同3
* row7:
* row8: 整行都是青色1:输出
* row9: 3请输入STRING(具体长度) ARRAY; 8:同3
*/
XSSFRow row1 = sheet.createRow(0);
setCellValue("交易码", row1.createCell(0), font,cellStyleMap.get("default"));
setCellValue("交易名称", row1.createCell(1), font,cellStyleMap.get("default"));
setCellValue("", row1.createCell(2), font,cellStyleMap.get("default"));
setCellValue("", row1.createCell(3), font,cellStyleMap.get("default"));
setCellValue("", row1.createCell(4), font,cellStyleMap.get("default"));
setCellValue("", row1.createCell(5), font,cellStyleMap.get("pop"));
setCellValue("服务名称", row1.createCell(6), font,cellStyleMap.get("default"));
setCellValue("服务场景", row1.createCell(7), font,cellStyleMap.get("default"));
setCellValue("", row1.createCell(8), font,cellStyleMap.get("default"));
setCellValue("", row1.createCell(9), font,cellStyleMap.get("default"));
setCellValue("", row1.createCell(10), font,cellStyleMap.get("default"));
XSSFRow row2 = sheet.createRow(1);
setCellValue("请输入交易码(必填)", row2.createCell(0), font,cellStyleMap.get("default"));
setCellValue("请输入交易名称(必填)", row2.createCell(1), font,cellStyleMap.get("default"));
setCellValue("", row2.createCell(2), font,cellStyleMap.get("default"));
setCellValue("", row2.createCell(3), font,cellStyleMap.get("default"));
setCellValue("", row2.createCell(4), font,cellStyleMap.get("default"));
setCellValue("", row2.createCell(5), font,cellStyleMap.get("pop"));
setCellValue("请输入服务名称(如果不填,则以交易名称为主)", row2.createCell(6), font,null);
setCellValue("请输入服务场景(选填)", row2.createCell(7), font,cellStyleMap.get("default"));
setCellValue("", row2.createCell(8), font,cellStyleMap.get("default"));
setCellValue("", row2.createCell(9), font,cellStyleMap.get("default"));
setCellValue("", row2.createCell(10), font,cellStyleMap.get("default"));
XSSFRow row3 = sheet.createRow(2);
setCellValue("", row3.createCell(0), font,cellStyleMap.get("yellow"));
setCellValue("", row3.createCell(1), font,cellStyleMap.get("yellow"));
setCellValue("", row3.createCell(2), font,cellStyleMap.get("yellow"));
setCellValue("", row3.createCell(3), font,cellStyleMap.get("yellow"));
setCellValue("", row3.createCell(4), font,cellStyleMap.get("yellow"));
setCellValue("", row3.createCell(5), font,cellStyleMap.get("yellow"));
setCellValue("请输入系统名称", row3.createCell(6), font,cellStyleMap.get("yellow"));
setCellValue("", row3.createCell(7), font,cellStyleMap.get("yellow"));
setCellValue("", row3.createCell(8), font,cellStyleMap.get("yellow"));
setCellValue("", row3.createCell(9), font,cellStyleMap.get("yellow"));
setCellValue("", row3.createCell(10), font,cellStyleMap.get("yellow"));
CellRangeAddress region1 = new CellRangeAddress(2, 2, 0, 4);
sheet.addMergedRegion(region1);
CellRangeAddress region2 = new CellRangeAddress(2, 2, 6, 10);
sheet.addMergedRegion(region2);
XSSFRow row4 = sheet.createRow(3);
setCellValue("英文名称", row4.createCell(0), font,cellStyleMap.get("yellow"));
setCellValue("中文名称", row4.createCell(1), font,cellStyleMap.get("yellow"));
setCellValue("数据类型/长度", row4.createCell(2), font,cellStyleMap.get("yellow"));
setCellValue("是否必输", row4.createCell(3), font,cellStyleMap.get("yellow"));
setCellValue("备注", row4.createCell(4), font,cellStyleMap.get("yellow"));
setCellValue("", row4.createCell(5), font,cellStyleMap.get("pop"));
setCellValue("英文名称", row4.createCell(6), font,cellStyleMap.get("yellow"));
setCellValue("数据类型/长度", row4.createCell(7), font,cellStyleMap.get("yellow"));
setCellValue("中文名称", row4.createCell(8), font,cellStyleMap.get("yellow"));
setCellValue("备注", row4.createCell(9), font,cellStyleMap.get("yellow"));
setCellValue("所在报文位置", row4.createCell(10), font,cellStyleMap.get("yellow"));
XSSFRow row5 = sheet.createRow(4);
setCellValue("输入", row5.createCell(0), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(1), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(2), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(3), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(4), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(5), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(6), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(7), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(8), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(9), font,cellStyleMap.get("green"));
setCellValue("", row5.createCell(10), font,cellStyleMap.get("green"));
XSSFRow row6 = sheet.createRow(5);
setCellValue("", row6.createCell(1), font,cellStyleMap.get("default"));
setCellValue("请输入STRING(具体长度) 或 ARRAY", row6.createCell(2), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(3), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(4), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(5), font,cellStyleMap.get("pop"));
setCellValue("", row6.createCell(6), font,cellStyleMap.get("default"));
setCellValue("请输入STRING(具体长度) 或 ARRAY", row6.createCell(7), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(8), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(9), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(10), font,cellStyleMap.get("default"));
XSSFRow row7 = sheet.createRow(6);
setCellValue("", row6.createCell(1), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(2), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(3), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(4), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(5), font,cellStyleMap.get("pop"));
setCellValue("", row6.createCell(6), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(7), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(8), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(9), font,cellStyleMap.get("default"));
setCellValue("", row6.createCell(10), font,cellStyleMap.get("default"));
XSSFRow row8 = sheet.createRow(7);
setCellValue("输出", row8.createCell(0), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(1), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(2), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(3), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(4), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(5), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(6), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(7), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(8), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(9), font,cellStyleMap.get("green"));
setCellValue("", row8.createCell(10), font,cellStyleMap.get("green"));
XSSFRow row9 = sheet.createRow(8);
setCellValue("", row9.createCell(1), font,cellStyleMap.get("default"));
setCellValue("请输入STRING(具体长度) 或 ARRAY", row9.createCell(2), font,cellStyleMap.get("default"));
setCellValue("", row9.createCell(3), font,cellStyleMap.get("default"));
setCellValue("", row9.createCell(4), font,cellStyleMap.get("default"));
setCellValue("", row9.createCell(5), font,cellStyleMap.get("pop"));
setCellValue("", row9.createCell(6), font,cellStyleMap.get("default"));
setCellValue("请输入STRING(具体长度) 或 ARRAY", row9.createCell(7), font,cellStyleMap.get("default"));
setCellValue("", row9.createCell(7), font,cellStyleMap.get("default"));
setCellValue("", row9.createCell(8), font,cellStyleMap.get("default"));
setCellValue("", row9.createCell(9), font,cellStyleMap.get("default"));
setCellValue("", row9.createCell(10), font,cellStyleMap.get("default"));
}
private static void setCellValue(String textValue, Cell cell, XSSFFont font,XSSFCellStyle cellStyle) {
// HSSFRichTextString richString = new HSSFRichTextString(textValue);
XSSFRichTextString richString = new XSSFRichTextString(textValue);
richString.applyFont(font);
if(cellStyle!=null){
cell.setCellStyle(cellStyle);
}
cell.setCellValue(richString);
}
@Override
public ApiDefinitionImport parse(InputStream source, ApiTestImportRequest request) throws Exception {
EsbSheetDataStruct esbImportDataStruct = new EsbSheetDataStruct();
EsbExcelDataStruct excelDataStruct = this.esbImport(source);
this.projectId = request.getProjectId();
ApiDefinitionImport definitionImport = this.parseApiDefinitionImport(excelDataStruct, request);
return definitionImport;
}
public EsbExcelDataStruct esbImport(InputStream source) throws IOException, InvalidFormatException {
Workbook workbook = WorkbookFactory.create(source);
int sheetCount = workbook.getNumberOfSheets();
EsbSheetDataStruct headStruct = null;
List<EsbSheetDataStruct> interfaceStruct = new ArrayList<>();
if (sheetCount > 0) {
Sheet headSheet = workbook.getSheetAt(0);
headStruct = this.parseExcelSheet(headSheet, true);
for (int index = 1; index < sheetCount; index++) {
Sheet dataSheet = workbook.getSheetAt(index);
EsbSheetDataStruct bodyStruct = this.parseExcelSheet(dataSheet, false);
interfaceStruct.add(bodyStruct);
}
}
EsbExcelDataStruct excelData = new EsbExcelDataStruct();
excelData.setHeadData(headStruct);
excelData.setInterfaceList(interfaceStruct);
return excelData;
}
private EsbSheetDataStruct parseExcelSheet(Sheet headSheet, boolean isHeadSheet) {
EsbSheetDataStruct importDataStruct = new EsbSheetDataStruct();
if (headSheet == null) {
return importDataStruct;
}
int rowCount = headSheet.getLastRowNum();
//根据模版样式如果不是报文头则要取接口信息
if (!isHeadSheet) {
Row interfaceInfoRow = headSheet.getRow(1);
if (interfaceInfoRow != null) {
List<String> rowDataArr = this.getRowDataByStartIndexAndEndIndex(interfaceInfoRow, 0, 9);
if (rowDataArr.size() > 8) {
String interfaceCode = rowDataArr.get(0);
String interfaceName = rowDataArr.get(6);
String interfaceDesc = rowDataArr.get(7);
if (StringUtils.isEmpty(interfaceName)) {
interfaceName = rowDataArr.get(1);
}
importDataStruct.setInterfaceInfo(interfaceCode, interfaceName, interfaceDesc);
}
}
}
//超过5行为空白直接退出
//部分office/wpf生成的文件会出现几万多空行容易造成内存溢出这里进行判断连续五行为空白时认为读取结束
int blankRowCount = 0;
boolean isRequest = true;
for (int startRow = REQUEST_MESSAGE_ROW; startRow < rowCount; startRow++) {
Row row = headSheet.getRow(startRow);
List<String> rowDataArr = this.getRowDataByStartIndexAndEndIndex(row, 0, 9);
boolean isBlankRow = this.checkBlankRow(rowDataArr, 10);
if (!isBlankRow) {
String cellFlag = rowDataArr.get(0);
if (StringUtils.equals(cellFlag, "输出")) {
isRequest = false;
}
}
if (isBlankRow) {
if (isRequest) {
isRequest = false;
}
blankRowCount++;
if (blankRowCount > 5) {
break;
}
} else {
blankRowCount = 0;
EsbDataStruct dataStruct = new EsbDataStruct();
boolean initDataSuccess = dataStruct.initDefaultData(rowDataArr.get(6), rowDataArr.get(7), rowDataArr.get(8), rowDataArr.get(9));
if (!initDataSuccess) {
continue;
}
boolean isHead = isHeadSheet;
if (rowDataArr.size() > 10) {
if (StringUtils.equals(rowDataArr.get(10), "SYS_HEAD")) {
isHead = true;
}
}
if (isRequest) {
if (isHead) {
importDataStruct.getReqHeadList().add(dataStruct);
} else {
importDataStruct.getRequestList().add(dataStruct);
}
} else {
if (isHead) {
importDataStruct.getRspHeadList().add(dataStruct);
} else {
importDataStruct.getResponseList().add(dataStruct);
}
}
}
}
return importDataStruct;
}
private boolean checkBlankRow(List<String> rowDataArr, int rowCheckLength) {
if (rowDataArr == null || rowDataArr.size() < rowCheckLength) {
return true;
}
for (String str : rowDataArr) {
if (StringUtils.isNotEmpty(str)) {
return false;
}
}
return true;
}
private List<String> getRowDataByStartIndexAndEndIndex(Row row, int startCell, int endCell) {
List<String> returnArray = new ArrayList<>();
if (row == null) {
return returnArray;
}
for (int i = startCell; i <= endCell; i++) {
Cell cell = row.getCell(i);
if (cell != null) {
returnArray.add(getCellValue(cell));
}
}
return returnArray;
}
private String getCellValue(Cell cell) {
String returnCellValue = "";
int cellType = cell.getCellType();
switch (cellType) {
case Cell.CELL_TYPE_BLANK:
returnCellValue = "";
break;
case Cell.CELL_TYPE_BOOLEAN:
returnCellValue = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
returnCellValue = "";
break;
case Cell.CELL_TYPE_NUMERIC:
returnCellValue = getValueOfNumericCell(cell);
break;
case Cell.CELL_TYPE_FORMULA:
try {
returnCellValue = getValueOfNumericCell(cell);
} catch (IllegalStateException e) {
try {
returnCellValue = cell.getRichStringCellValue().toString();
} catch (IllegalStateException e2) {
}
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
returnCellValue = cell.getRichStringCellValue().getString();
}
if (returnCellValue == null) {
returnCellValue = "";
}
return returnCellValue;
}
private String getValueOfNumericCell(Cell cell) {
Boolean isDate = DateUtil.isCellDateFormatted(cell);
Double d = cell.getNumericCellValue();
String o = null;
if (isDate) {
o = DateFormat.getDateTimeInstance()
.format(cell.getDateCellValue());
} else {
o = getRealStringValueOfDouble(d);
}
return o;
}
// 处理科学计数法与普通计数法的字符串显示尽最大努力保持精度
private static String getRealStringValueOfDouble(Double d) {
String doubleStr = d.toString();
boolean b = doubleStr.contains("E");
int indexOfPoint = doubleStr.indexOf('.');
if (b) {
int indexOfE = doubleStr.indexOf('E');
// 小数部分
BigInteger xs = new BigInteger(doubleStr.substring(indexOfPoint
+ BigInteger.ONE.intValue(), indexOfE));
// 指数
int pow = Integer.valueOf(doubleStr.substring(indexOfE
+ BigInteger.ONE.intValue()));
int xsLen = xs.toByteArray().length;
int scale = xsLen - pow > 0 ? xsLen - pow : 0;
doubleStr = String.format("%." + scale + "f", d);
} else {
java.util.regex.Pattern p = Pattern.compile(".0$");
java.util.regex.Matcher m = p.matcher(doubleStr);
if (m.find()) {
doubleStr = doubleStr.replace(".0", "");
}
}
return doubleStr;
}
private ApiDefinitionImport parseApiDefinitionImport(EsbExcelDataStruct esbExcelDataStruct, ApiTestImportRequest importRequest) {
ApiDefinitionImport resultModel = new ApiDefinitionImport();
List<ApiDefinitionWithBLOBs> apiDataList = new ArrayList<>();
ApiModule parentNode = ApiDefinitionImportUtil.getSelectModule(importRequest.getModuleId());
EsbSheetDataStruct headSheetData = esbExcelDataStruct.getHeadData();
List<EsbSheetDataStruct> interfaceDataList = esbExcelDataStruct.getInterfaceList();
List<String> savedNames = new ArrayList<>();
Map<String, EsbApiParamsWithBLOBs> esbApiParams = new HashMap<>();
for (EsbSheetDataStruct interfaceData : interfaceDataList) {
String reqName = interfaceData.getServiceName();
if (savedNames.contains(reqName)) {
continue;
} else {
savedNames.add(reqName);
}
String apiId = UUID.randomUUID().toString();
ApiDefinitionWithBLOBs apiDefinition = new ApiDefinitionWithBLOBs();
apiDefinition.setName(reqName);
apiDefinition.setMethod("ESB");
apiDefinition.setId(apiId);
apiDefinition.setProjectId(this.projectId);
apiDefinition.setRequest(genTCPSampler());
if (StringUtils.equalsIgnoreCase("schedule", importRequest.getType())) {
apiDefinition.setUserId(importRequest.getUserId());
} else {
apiDefinition.setUserId(SessionUtils.getUserId());
}
apiDefinition.setProtocol(RequestType.TCP);
buildModule(parentNode, apiDefinition, null);
apiDataList.add(apiDefinition);
EsbApiParamsWithBLOBs apiParams = new EsbApiParamsWithBLOBs();
apiParams.setId(UUID.randomUUID().toString());
apiParams.setResourceId(apiId);
String reqDataStructStr = generateDataStrcut(headSheetData, interfaceData, true);
String respDataStrutStr = generateDataStrcut(headSheetData, interfaceData, false);
apiParams.setDataStruct(reqDataStructStr);
apiParams.setResponseDataStruct(respDataStrutStr);
esbApiParams.put(apiId, apiParams);
}
resultModel.setData(apiDataList);
resultModel.setEsbApiParamsMap(esbApiParams);
return resultModel;
}
private String genTCPSampler() {
MsTCPSampler tcpSampler = new MsTCPSampler();
MsJSR223PreProcessor preProcessor = new MsJSR223PreProcessor();
tcpSampler.setTcpPreProcessor(preProcessor);
tcpSampler.setProtocol("ESB");
tcpSampler.setClassname("TCPSampler");
return JSON.toJSONString(tcpSampler);
}
private String generateDataStrcut(EsbSheetDataStruct head, EsbSheetDataStruct body, boolean isRequest) {
EsbDataStruct dataStruct = new EsbDataStruct();
dataStruct.initDefaultData("SERVICE", null, null, null);
List<EsbDataStruct> headList = new ArrayList<>();
List<EsbDataStruct> bodyList = new ArrayList<>();
if (head != null) {
if (isRequest) {
headList.addAll(head.getReqHeadList());
bodyList.addAll(head.getRequestList());
} else {
headList.addAll(head.getRspHeadList());
bodyList.addAll(head.getResponseList());
}
}
if (body != null) {
if (isRequest) {
headList.addAll(body.getReqHeadList());
bodyList.addAll(body.getRequestList());
} else {
headList.addAll(body.getRspHeadList());
bodyList.addAll(body.getResponseList());
}
}
if (!headList.isEmpty()) {
EsbDataStruct headStruct = new EsbDataStruct();
headStruct.initDefaultData("SYS_HEAD", null, null, null);
dataStruct.getChildren().add(headStruct);
Map<String, EsbDataStruct> childrenEsbDataStructMap = new HashMap<>();
//用来判断节点有没有在array节点内
String lastArrayDataStrcutName = null;
for (EsbDataStruct headData : headList) {
if (StringUtils.equalsIgnoreCase("array", headData.getType())) {
if (lastArrayDataStrcutName == null) {
lastArrayDataStrcutName = headData.getName();
EsbDataStruct arrayStrcut = new EsbDataStruct();
arrayStrcut.initDefaultData(headData.getName(), headData.getType(), headData.getContentType(), headData.getDescription());
headStruct.getChildren().add(arrayStrcut);
childrenEsbDataStructMap.put(lastArrayDataStrcutName, arrayStrcut);
} else {
lastArrayDataStrcutName = null;
}
} else {
if (lastArrayDataStrcutName == null) {
headStruct.getChildren().add(headData);
} else {
EsbDataStruct arrayStrcut = childrenEsbDataStructMap.get(lastArrayDataStrcutName);
if (arrayStrcut != null) {
arrayStrcut.getChildren().add(headData);
}
}
}
}
}
if (!bodyList.isEmpty()) {
EsbDataStruct bodyStruct = new EsbDataStruct();
bodyStruct.initDefaultData("SYS_BODY", null, null, null);
dataStruct.getChildren().add(bodyStruct);
Map<String, EsbDataStruct> childrenEsbDataStructMap = new HashMap<>();
//用来判断节点有没有在array节点内
String lastArrayDataStrcutName = null;
for (EsbDataStruct bodyData : bodyList) {
if (StringUtils.equalsIgnoreCase("array", bodyData.getType())) {
if (lastArrayDataStrcutName == null) {
lastArrayDataStrcutName = bodyData.getName();
EsbDataStruct arrayStrcut = new EsbDataStruct();
arrayStrcut.initDefaultData(bodyData.getName(), bodyData.getType(), bodyData.getContentType(), bodyData.getDescription());
bodyStruct.getChildren().add(arrayStrcut);
childrenEsbDataStructMap.put(lastArrayDataStrcutName, arrayStrcut);
} else {
lastArrayDataStrcutName = null;
}
} else {
if (lastArrayDataStrcutName == null) {
bodyStruct.getChildren().add(bodyData);
} else {
EsbDataStruct arrayStrcut = childrenEsbDataStructMap.get(lastArrayDataStrcutName);
if (arrayStrcut != null) {
arrayStrcut.getChildren().add(bodyData);
}
}
}
}
}
List<EsbDataStruct> list = new ArrayList<>();
list.add(dataStruct);
return JSONArray.toJSONString(list);
}
// private void parseParameters(HarRequest harRequest, MsHTTPSamplerProxy request) {
// List<HarQueryParm> queryStringList = harRequest.queryString;
// queryStringList.forEach(harQueryParm -> {
// parseQueryParameters(harQueryParm, request.getArguments());
// });
// List<HarHeader> harHeaderList = harRequest.headers;
// harHeaderList.forEach(harHeader -> {
// parseHeaderParameters(harHeader, request.getHeaders());
// });
// List<HarCookie> harCookieList = harRequest.cookies;
// harCookieList.forEach(harCookie -> {
// parseCookieParameters(harCookie, request.getHeaders());
// });
// }
private String getDefaultStringValue(String val) {
return StringUtils.isBlank(val) ? "" : val;
}
}

View File

@ -0,0 +1,28 @@
package io.metersphere.api.dto.definition.parse;
import io.metersphere.api.parse.ApiImportAbstractParser;
import io.metersphere.base.domain.ApiDefinitionWithBLOBs;
import io.metersphere.base.domain.ApiModule;
import java.util.List;
/**
* @author song.tianyang
* @Date 2021/3/10 11:15 上午
* @Description
*/
public abstract class EsbAbstractParser extends ApiImportAbstractParser<ApiDefinitionImport> {
protected void buildModule(ApiModule parentModule, ApiDefinitionWithBLOBs apiDefinition, List<String> tags) {
if (tags != null) {
tags.forEach(tag -> {
ApiModule module = ApiDefinitionImportUtil.buildModule(parentModule, tag, this.projectId);
apiDefinition.setModuleId(module.getId());
});
}else {
apiDefinition.setModuleId(parentModule.getId());
}
}
}

View File

@ -0,0 +1,19 @@
package io.metersphere.api.dto.definition.parse.esb;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
/**
* @author song.tianyang
* @Date 2021/3/23 12:55 下午
* @Description
*/
@Getter
@Setter
public class EsbExcelDataStruct {
private EsbSheetDataStruct headData;
private List<EsbSheetDataStruct> interfaceList = new ArrayList<>();
}

View File

@ -0,0 +1,44 @@
package io.metersphere.api.dto.definition.parse.esb;
import io.metersphere.api.dto.automation.EsbDataStruct;
import io.metersphere.commons.exception.MSException;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @author song.tianyang
* @Date 2021/3/22 9:42 下午
* @Description
*/
@Getter
@Setter
public class EsbSheetDataStruct {
private String serviceName;
private String serviceDesc;
private List<EsbDataStruct> requestList = new ArrayList<>();
private List<EsbDataStruct> responseList = new ArrayList<>();
//单个接口内也可能有报文头中要增加的数据
private List<EsbDataStruct> reqHeadList = new ArrayList<>();
private List<EsbDataStruct> rspHeadList = new ArrayList<>();
public void setInterfaceInfo(String interfaceCode, String interfaceName, String interfaceDesc) {
if(StringUtils.isEmpty(interfaceCode) && StringUtils.isEmpty(interfaceName)){
MSException.throwException("接口的交易码或服务名称不能都为空");
}
if(StringUtils.isNotEmpty(interfaceCode)){
this.serviceName = interfaceCode+":"+interfaceName;
}else {
this.serviceName = interfaceName;
}
if (this.serviceName.endsWith(":")){
this.serviceName = this.serviceName.substring(0,this.serviceName.length()-1);
}
this.serviceDesc = interfaceDesc;
}
}

View File

@ -1,9 +1,11 @@
package io.metersphere.api.parse;
import io.metersphere.api.dto.ApiTestImportRequest;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import java.io.IOException;
import java.io.InputStream;
public interface ApiImportParser<T> {
T parse(InputStream source, ApiTestImportRequest request);
T parse(InputStream source, ApiTestImportRequest request) throws IOException, InvalidFormatException, Exception;
}

View File

@ -14,6 +14,7 @@ import io.metersphere.api.dto.definition.parse.Swagger3Parser;
import io.metersphere.api.dto.definition.request.ParameterConfig;
import io.metersphere.api.dto.definition.request.ScheduleInfoSwaggerUrlRequest;
import io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy;
import io.metersphere.api.dto.definition.request.sampler.MsTCPSampler;
import io.metersphere.api.dto.scenario.environment.EnvironmentConfig;
import io.metersphere.api.dto.scenario.request.RequestType;
import io.metersphere.api.dto.swaggerurl.SwaggerTaskResult;
@ -347,26 +348,43 @@ public class ApiDefinitionService {
private void _importCreate(List<ApiDefinition> sameRequest, ApiDefinitionMapper batchMapper, ApiDefinitionWithBLOBs apiDefinition,
ApiTestCaseMapper apiTestCaseMapper, ApiTestImportRequest apiTestImportRequest, List<ApiTestCaseWithBLOBs> cases) {
if (CollectionUtils.isEmpty(sameRequest)) {
String request = setImportHashTree(apiDefinition);
batchMapper.insert(apiDefinition);
apiDefinition.setRequest(request);
importApiCase(apiDefinition, apiTestCaseMapper, apiTestImportRequest, true);
if(StringUtils.equalsIgnoreCase(apiDefinition.getProtocol(),RequestType.HTTP)){
String request = setImportHashTree(apiDefinition);
batchMapper.insert(apiDefinition);
apiDefinition.setRequest(request);
importApiCase(apiDefinition, apiTestCaseMapper, apiTestImportRequest, true);
}else{
if(StringUtils.equalsAnyIgnoreCase(apiDefinition.getProtocol(),RequestType.TCP)){
String request = setImportTCPHashTree(apiDefinition);
}
batchMapper.insert(apiDefinition);
}
} else {
String originId = apiDefinition.getId();
//如果存在则修改
apiDefinition.setId(sameRequest.get(0).getId());
String request = setImportHashTree(apiDefinition);
apiDefinitionMapper.updateByPrimaryKeyWithBLOBs(apiDefinition);
apiDefinition.setRequest(request);
importApiCase(apiDefinition, apiTestCaseMapper, apiTestImportRequest, false);
// 如果是带用例导出重新设置接口id
if (CollectionUtils.isNotEmpty(cases)) {
cases.forEach(item -> {
if (StringUtils.equals(item.getApiDefinitionId(), originId)) {
item.setApiDefinitionId(apiDefinition.getId());
}
});
if(StringUtils.equalsIgnoreCase(apiDefinition.getProtocol(),RequestType.HTTP)){
//如果存在则修改
apiDefinition.setId(sameRequest.get(0).getId());
String request = setImportHashTree(apiDefinition);
apiDefinitionMapper.updateByPrimaryKeyWithBLOBs(apiDefinition);
apiDefinition.setRequest(request);
importApiCase(apiDefinition, apiTestCaseMapper, apiTestImportRequest, false);
// 如果是带用例导出重新设置接口id
if (CollectionUtils.isNotEmpty(cases)) {
cases.forEach(item -> {
if (StringUtils.equals(item.getApiDefinitionId(), originId)) {
item.setApiDefinitionId(apiDefinition.getId());
}
});
}
}else {
apiDefinition.setId(sameRequest.get(0).getId());
if(StringUtils.equalsAnyIgnoreCase(apiDefinition.getProtocol(),RequestType.TCP)){
String request = setImportTCPHashTree(apiDefinition);
}
apiDefinitionMapper.updateByPrimaryKeyWithBLOBs(apiDefinition);
}
}
}
@ -378,6 +396,14 @@ public class ApiDefinitionService {
apiDefinition.setRequest(JSONObject.toJSONString(msHTTPSamplerProxy));
return request;
}
private String setImportTCPHashTree(ApiDefinitionWithBLOBs apiDefinition) {
String request = apiDefinition.getRequest();
MsTCPSampler tcpSampler = JSONObject.parseObject(request, MsTCPSampler.class);
tcpSampler.setId(apiDefinition.getId());
tcpSampler.setHashTree(new LinkedList<>());
apiDefinition.setRequest(JSONObject.toJSONString(tcpSampler));
return request;
}
private void importMsCase(ApiDefinitionImport apiImport, SqlSession sqlSession, ApiTestCaseMapper apiTestCaseMapper) {
List<ApiTestCaseWithBLOBs> cases = apiImport.getCases();
@ -571,11 +597,40 @@ public class ApiDefinitionService {
item.setName(item.getName().substring(0, 255));
}
item.setNum(num++);
importCreate(item, batchMapper, apiTestCaseMapper, request, apiImport.getCases());
//如果EsbData需要存储,则需要进行接口是否更新的判断
if(apiImport.getEsbApiParamsMap()!= null){
String apiId = item.getId();
EsbApiParamsWithBLOBs model = apiImport.getEsbApiParamsMap().get(apiId);
importCreate(item, batchMapper, apiTestCaseMapper, request, apiImport.getCases());
if(model!=null){
apiImport.getEsbApiParamsMap().remove(apiId);
model.setResourceId(item.getId());
apiImport.getEsbApiParamsMap().put(item.getId(),model);
}
}else {
importCreate(item, batchMapper, apiTestCaseMapper, request, apiImport.getCases());
}
if (i % 300 == 0) {
sqlSession.flushStatements();
}
}
//判断EsbData是否需要存储
if(apiImport.getEsbApiParamsMap()!= null && apiImport.getEsbApiParamsMap().size() > 0){
EsbApiParamsMapper esbApiParamsMapper = sqlSession.getMapper(EsbApiParamsMapper.class);
for (EsbApiParamsWithBLOBs model : apiImport.getEsbApiParamsMap().values()) {
EsbApiParamsExample example = new EsbApiParamsExample();
example.createCriteria().andResourceIdEqualTo(model.getResourceId());
List<EsbApiParamsWithBLOBs> exiteModelList = esbApiParamsMapper.selectByExampleWithBLOBs(example);
if(exiteModelList.isEmpty()){
esbApiParamsMapper.insert(model);
}else{
model.setId(exiteModelList.get(0).getId());
esbApiParamsMapper.updateByPrimaryKeyWithBLOBs(model);
}
}
}
if (!CollectionUtils.isEmpty(apiImport.getCases())) {
for (int i = 0; i < apiImport.getCases().size(); i++) {
importMsCase(apiImport, sqlSession, apiTestCaseMapper);

View File

@ -75,7 +75,7 @@ public class EsbApiParamService {
kv.setType(request.getType());
kv.setDescription(request.getDescription());
kv.setContentType(request.getContentType());
kv.setRequired(Boolean.parseBoolean(request.getRequired()));
kv.setRequired(request.isRequired());
returnList.add(kv);
if (request.getChildren() != null) {
List<KeyValue> childValueList = this.genKeyValueByEsbDataStruct(request.getChildren(), itemName);
@ -351,4 +351,5 @@ public class EsbApiParamService {
example.createCriteria().andResourceIdIn(apiIds);
esbApiParamsMapper.deleteByExample(example);
}
}

View File

@ -0,0 +1,80 @@
package io.metersphere.api.service;
import io.metersphere.api.dto.definition.parse.ESBParser;
import io.metersphere.commons.constants.TestCaseConstants;
import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.user.SessionUser;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.excel.domain.UserExcelData;
import io.metersphere.excel.domain.UserExcelDataFactory;
import io.metersphere.excel.utils.EasyExcelExporter;
import io.metersphere.i18n.Translator;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* @author song.tianyang
* @Date 2021/3/22 7:02 下午
* @Description
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class EsbImportService {
public void esbTemplateExport(HttpServletResponse response) {
try {
EasyExcelExporter easyExcelExporter = new EasyExcelExporter(new UserExcelDataFactory().getExcelDataByLocal());
easyExcelExporter.export(response, generateExportTemplate(),
Translator.get("user_import_template_name"), Translator.get("user_import_template_sheet"));
} catch (Exception e) {
MSException.throwException(e);
}
}
private List<UserExcelData> generateExportTemplate() {
List<UserExcelData> list = new ArrayList<>();
List<String> types = TestCaseConstants.Type.getValues();
List<String> methods = TestCaseConstants.Method.getValues();
SessionUser user = SessionUtils.getUser();
for (int i = 1; i <= 2; i++) {
UserExcelData data = new UserExcelData();
data.setId("user_id_" + i);
data.setName(Translator.get("user") + i);
String workspace = "";
for (int workspaceIndex = 1; workspaceIndex <= i; workspaceIndex++) {
if (workspaceIndex == 1) {
workspace = "workspace" + workspaceIndex;
} else {
workspace = workspace + "\n" + "workspace" + workspaceIndex;
}
}
data.setUserIsAdmin(Translator.get("options_no"));
data.setUserIsTester(Translator.get("options_no"));
data.setUserIsOrgMember(Translator.get("options_no"));
data.setUserIsViewer(Translator.get("options_no"));
data.setUserIsTestManager(Translator.get("options_no"));
data.setUserIsOrgAdmin(Translator.get("options_yes"));
data.setOrgAdminOrganization(workspace);
list.add(data);
}
list.add(new UserExcelData());
UserExcelData explain = new UserExcelData();
explain.setName(Translator.get("do_not_modify_header_order"));
explain.setOrgAdminOrganization("多个工作空间请换行展示");
list.add(explain);
return list;
}
public void templateExport(HttpServletResponse response) {
try {
ESBParser.export(response,"EsbTemplate");
} catch (Exception e) {
MSException.throwException(e);
}
}
}

View File

@ -1,5 +1,5 @@
package io.metersphere.commons.constants;
public enum ApiImportPlatform {
Metersphere, Postman, Swagger2, Plugin, Jmeter, Har
Metersphere, Postman, Swagger2, Plugin, Jmeter, Har,ESB
}

View File

@ -0,0 +1,9 @@
package io.metersphere.excel.domain;
/**
* @author song.tianyang
* @Date 2021/3/22 7:04 下午
* @Description
*/
public class EsbExcelData {
}

View File

@ -29,11 +29,17 @@
<el-option v-for="item in moduleOptions" :key="item.id" :label="item.path" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item v-if="!isScenarioModel&&!isHar" :label="$t('commons.import_mode')" prop="modeId">
<el-form-item v-if="!isScenarioModel&&showImportModel" :label="$t('commons.import_mode')" prop="modeId">
<el-select size="small" v-model="formData.modeId" class="project-select" clearable>
<el-option v-for="item in modeOptions" :key="item.id" :label="item.name" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item v-if="showTemplate">
<el-link type="primary" class="download-template"
@click="downloadTemplate"
>{{$t('test_track.case.import.download_template')}}
</el-link>
</el-form-item>
<el-form-item v-if="isSwagger2">
<el-switch
v-model="swaggerUrlEnable"
@ -106,6 +112,7 @@ export default {
default: true,
},
moduleOptions: {},
propotal:String,
model: {
type: String,
default: 'definition'
@ -192,13 +199,36 @@ export default {
}
}
},
propotal(){
if(this.propotal === 'TCP'){
if(this.platforms.length < 5){
let esbElement = {
name: 'ESB',
value: 'ESB',
tip: this.$t('api_test.api_import.esb_tip'),
exportTip: this.$t('api_test.api_import.esb_export_tip'),
suffixes: new Set(['xlsx','xls'])
};
this.platforms.push(esbElement);
}
return true;
}else{
if(this.platforms.length == 5){
this.platforms.pop();
}
return false;
}
}
},
computed: {
isSwagger2() {
return this.selectedPlatformValue === 'Swagger2';
},
isHar() {
return this.selectedPlatformValue === 'Har';
showImportModel() {
return this.selectedPlatformValue != 'Har' && this.selectedPlatformValue != 'ESB';
},
showTemplate() {
return this.selectedPlatformValue === 'ESB';
},
isScenarioModel() {
return this.model === 'scenario';
@ -233,6 +263,11 @@ export default {
handleRemove(file, fileList) {
this.formData.file = undefined;
},
downloadTemplate(){
if(this.selectedPlatformValue == "ESB"){
this.$fileDownload('/api/definition/export/esbExcelTemplate');
}
},
uploadValidate(file, fileList) {
let suffix = file.name.substring(file.name.lastIndexOf('.') + 1);
if (this.selectedPlatform.suffixes && !this.selectedPlatform.suffixes.has(suffix)) {
@ -305,7 +340,7 @@ export default {
<style scoped>
.api-import >>> .el-dialog {
min-width: 700px;
min-width: 750px;
}
.format-tip {

View File

@ -49,7 +49,7 @@
@saveAsEdit="saveAsEdit"
@refresh="refresh"
ref="basisApi"/>
<api-import ref="apiImport" :moduleOptions="moduleOptions" @refresh="$emit('refresh')"/>
<api-import :propotal="condition.protocol" ref="apiImport" :moduleOptions="moduleOptions" @refresh="$emit('refresh')"/>
</div>
</template>
@ -108,8 +108,8 @@ export default {
this.$warning(this.$t('commons.check_project_tip'));
return;
}
this.protocol = "HTTP";
this.result = this.$get("/api/module/list/" + getCurrentProjectID() + "/" + this.protocol, response => {
// this.protocol = "HTTP";
this.result = this.$get("/api/module/list/" + getCurrentProjectID() + "/" + this.condition.protocol, response => {
if (response.data != undefined && response.data != null) {
this.data = response.data;
let moduleOptions = [];
@ -118,8 +118,8 @@ export default {
});
this.moduleOptions = moduleOptions
}
this.$refs.apiImport.open(this.moduleOptions);
});
this.$refs.apiImport.open(this.currentModule);
break;
}
},

View File

@ -946,8 +946,10 @@ export default {
ms_tip: "Support for MeterSphere JSON format",
ms_export_tip: "Export jSON-formatted files via MeterSphere website or browser plug-ins",
har_export_tip: "Export Har files by browser dev-tool",
esb_export_tip: "Can not export esb files now",
swagger_tip: "Swagger 2.0 and 3.0 json files are supported",
har_tip: "Only Har files are supported",
esb_tip: "Only ESB xlsx files are supported",
postman_tip: "Only Postman Collection V2.1 json files are supported",
postman_export_tip: "Export the test collection by Postman",
swagger_export_tip: "Export jSON-formatted files via Swagger website",

View File

@ -949,9 +949,11 @@ export default {
ms_tip: "支持 MeterSphere json 格式",
ms_export_tip: "通过 MeterSphere 接口测试页面或者浏览器插件导出 json 格式文件",
har_export_tip: "通过 浏览器的开发者工具 导出 Har 格式文件",
esb_export_tip: "暂时不支持ESB文件的导出",
postman_tip: "只支持 Postman Collection v2.1 格式的 json 文件",
swagger_tip: "支持 Swagger 2.0 与 3.0 版本的 json 文件",
har_tip: "只支持 Har 文件",
esb_tip: "只支持 ESB 模版的xlsx文件",
post_export_tip: "通过 Postman 导出测试集合",
swagger_export_tip: "通过 Swagger 页面导出",
jmeter_export_tip: "通过 JMeter 生成JMX文件",

View File

@ -948,9 +948,11 @@ export default {
ms_tip: "支持 MeterSphere json 格式",
ms_export_tip: "通過 MeterSphere 接口測試頁面或者瀏覽器插件導出 json 格式文件",
har_export_tip: "通过 瀏覽器到開發者工具 导出 Har 格式文件",
esb_export_tip: "暫時不支持ESB文件的导出",
postman_tip: "只支持 Postman Collection v2.1 格式的 json 文件",
swagger_tip: "支持 Swagger 2.0 與 3.0 版本的 json 文件",
har_tip: "只支持 Har 文件",
esb_tip: "只支持 ESB 模板的xlsx文件",
post_export_tip: "通過 Postman 導出測試集合",
swagger_export_tip: "通過 Swagger 頁面導出",
jmeter_export_tip: "通過 JMeter 生成JMX文件",