parent
51a331c757
commit
7220882d7d
backend/src/main/java/io/metersphere
frontend/src/business/components/api/definition/components/complete
|
@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import io.metersphere.api.dto.ApiTestImportRequest;
|
import io.metersphere.api.dto.ApiTestImportRequest;
|
||||||
import io.metersphere.api.dto.automation.EsbDataStruct;
|
import io.metersphere.api.dto.automation.EsbDataStruct;
|
||||||
|
import io.metersphere.api.dto.definition.parse.esb.ESBExcelSheetInfo;
|
||||||
import io.metersphere.api.dto.definition.parse.esb.EsbExcelDataStruct;
|
import io.metersphere.api.dto.definition.parse.esb.EsbExcelDataStruct;
|
||||||
import io.metersphere.api.dto.definition.parse.esb.EsbSheetDataStruct;
|
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.processors.pre.MsJSR223PreProcessor;
|
||||||
|
@ -40,10 +41,14 @@ import java.util.regex.Pattern;
|
||||||
*/
|
*/
|
||||||
public class ESBParser extends EsbAbstractParser {
|
public class ESBParser extends EsbAbstractParser {
|
||||||
|
|
||||||
private final int REQUEST_MESSAGE_ROW = 5;
|
|
||||||
|
|
||||||
private Map<String, Model> definitions = null;
|
private Map<String, Model> definitions = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出模板
|
||||||
|
*
|
||||||
|
* @param response
|
||||||
|
* @param fileName
|
||||||
|
*/
|
||||||
public static void export(HttpServletResponse response, String fileName) {
|
public static void export(HttpServletResponse response, String fileName) {
|
||||||
|
|
||||||
XSSFWorkbook wb = null;
|
XSSFWorkbook wb = null;
|
||||||
|
@ -94,7 +99,6 @@ public class ESBParser extends EsbAbstractParser {
|
||||||
short[] colorIndexArr = {IndexedColors.LIGHT_GREEN.getIndex(), IndexedColors.ORCHID.getIndex(), IndexedColors.YELLOW.getIndex()};
|
short[] colorIndexArr = {IndexedColors.LIGHT_GREEN.getIndex(), IndexedColors.ORCHID.getIndex(), IndexedColors.YELLOW.getIndex()};
|
||||||
for (short colorIndex : colorIndexArr) {
|
for (short colorIndex : colorIndexArr) {
|
||||||
XSSFCellStyle style = workbook.createCellStyle();
|
XSSFCellStyle style = workbook.createCellStyle();
|
||||||
// style.setFillForegroundColor(IndexedColors.VIOLET.getIndex());
|
|
||||||
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||||
style.setBorderBottom(BorderStyle.THIN);
|
style.setBorderBottom(BorderStyle.THIN);
|
||||||
style.setBorderLeft(BorderStyle.THIN);
|
style.setBorderLeft(BorderStyle.THIN);
|
||||||
|
@ -123,7 +127,6 @@ public class ESBParser extends EsbAbstractParser {
|
||||||
if (sheet == null) {
|
if (sheet == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sheet.setColumnWidth(0, 4000);
|
sheet.setColumnWidth(0, 4000);
|
||||||
sheet.setColumnWidth(1, 4000);
|
sheet.setColumnWidth(1, 4000);
|
||||||
sheet.setColumnWidth(2, 4000);
|
sheet.setColumnWidth(2, 4000);
|
||||||
|
@ -349,7 +352,6 @@ public class ESBParser extends EsbAbstractParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setCellValue(String textValue, Cell cell, XSSFFont font, XSSFCellStyle cellStyle) {
|
private static void setCellValue(String textValue, Cell cell, XSSFFont font, XSSFCellStyle cellStyle) {
|
||||||
// HSSFRichTextString richString = new HSSFRichTextString(textValue);
|
|
||||||
XSSFRichTextString richString = new XSSFRichTextString(textValue);
|
XSSFRichTextString richString = new XSSFRichTextString(textValue);
|
||||||
richString.applyFont(font);
|
richString.applyFont(font);
|
||||||
if (cellStyle != null) {
|
if (cellStyle != null) {
|
||||||
|
@ -393,35 +395,21 @@ public class ESBParser extends EsbAbstractParser {
|
||||||
if (headSheet == null) {
|
if (headSheet == null) {
|
||||||
return importDataStruct;
|
return importDataStruct;
|
||||||
}
|
}
|
||||||
int simpleCodeIndex = 0;
|
ESBExcelSheetInfo sheetInfo = this.getEsbExcelSheetInfo(headSheet);
|
||||||
int simpleNameIndex = 1;
|
|
||||||
int apiNameIndex = 6;
|
|
||||||
int apiDescIndex = 7;
|
|
||||||
int chineNameIndex = 8;
|
|
||||||
int descIndex = 9;
|
|
||||||
int apiPositionIndex = 10;
|
|
||||||
int cellCount = 11;
|
|
||||||
// if (isHeadSheet) {
|
|
||||||
apiNameIndex = 5;
|
|
||||||
apiDescIndex = 6;
|
|
||||||
chineNameIndex = 7;
|
|
||||||
descIndex = 8;
|
|
||||||
apiPositionIndex = 9;
|
|
||||||
cellCount = 10;
|
|
||||||
// }
|
|
||||||
|
|
||||||
int rowCount = headSheet.getLastRowNum();
|
int rowCount = headSheet.getLastRowNum();
|
||||||
|
|
||||||
//根据模版样式,如果不是报文头,则要取接口信息
|
//根据模版样式,如果不是报文头,则要取接口信息
|
||||||
if (!isHeadSheet) {
|
if (!isHeadSheet) {
|
||||||
Row interfaceInfoRow = headSheet.getRow(1);
|
Row interfaceInfoRow = headSheet.getRow(1);
|
||||||
if (interfaceInfoRow != null) {
|
if (interfaceInfoRow != null) {
|
||||||
List<String> rowDataArr = this.getRowDataByStartIndexAndEndIndex(interfaceInfoRow, 0, cellCount - 1);
|
List<String> rowDataArr = this.getRowDataByStartIndexAndEndIndex(interfaceInfoRow, 0, sheetInfo.getCellCount() - 1);
|
||||||
if (rowDataArr.size() >= cellCount) {
|
if (rowDataArr.size() >= sheetInfo.getCellCount()) {
|
||||||
String interfaceCode = rowDataArr.get(simpleCodeIndex);
|
String interfaceCode = rowDataArr.get(sheetInfo.getSimpleCodeIndex());
|
||||||
String interfaceName = rowDataArr.get(apiNameIndex);
|
String interfaceName = rowDataArr.get(sheetInfo.getServiceNameIndex());
|
||||||
String interfaceDesc = rowDataArr.get(apiDescIndex);
|
String interfaceDesc = rowDataArr.get(sheetInfo.getServiceScenarioIndex());
|
||||||
if (StringUtils.isEmpty(interfaceName)) {
|
if (StringUtils.isEmpty(interfaceName)) {
|
||||||
interfaceName = rowDataArr.get(simpleNameIndex);
|
interfaceName = rowDataArr.get(sheetInfo.getSimpleNameIndex());
|
||||||
}
|
}
|
||||||
importDataStruct.setInterfaceInfo(interfaceCode, interfaceName, interfaceDesc);
|
importDataStruct.setInterfaceInfo(interfaceCode, interfaceName, interfaceDesc);
|
||||||
}
|
}
|
||||||
|
@ -431,10 +419,11 @@ public class ESBParser extends EsbAbstractParser {
|
||||||
//部分office/wpf生成的文件会出现几万多空行,容易造成内存溢出。这里进行判断,连续五行为空白时认为读取结束。
|
//部分office/wpf生成的文件会出现几万多空行,容易造成内存溢出。这里进行判断,连续五行为空白时认为读取结束。
|
||||||
int blankRowCount = 0;
|
int blankRowCount = 0;
|
||||||
boolean isRequest = true;
|
boolean isRequest = true;
|
||||||
for (int startRow = REQUEST_MESSAGE_ROW; startRow < rowCount; startRow++) {
|
|
||||||
|
for (int startRow = sheetInfo.getRequestMessageRow(); startRow < rowCount; startRow++) {
|
||||||
Row row = headSheet.getRow(startRow);
|
Row row = headSheet.getRow(startRow);
|
||||||
List<String> rowDataArr = this.getRowDataByStartIndexAndEndIndex(row, 0, cellCount - 1);
|
List<String> rowDataArr = this.getRowDataByStartIndexAndEndIndex(row, 0, sheetInfo.getCellCount() - 1);
|
||||||
boolean isBlankRow = this.checkBlankRow(rowDataArr, cellCount);
|
boolean isBlankRow = this.checkBlankRow(rowDataArr, sheetInfo.getCellCount());
|
||||||
if (!isBlankRow) {
|
if (!isBlankRow) {
|
||||||
String cellFlag = rowDataArr.get(0);
|
String cellFlag = rowDataArr.get(0);
|
||||||
if (StringUtils.equals(cellFlag, "输出")) {
|
if (StringUtils.equals(cellFlag, "输出")) {
|
||||||
|
@ -452,13 +441,14 @@ public class ESBParser extends EsbAbstractParser {
|
||||||
} else {
|
} else {
|
||||||
blankRowCount = 0;
|
blankRowCount = 0;
|
||||||
EsbDataStruct dataStruct = new EsbDataStruct();
|
EsbDataStruct dataStruct = new EsbDataStruct();
|
||||||
boolean initDataSuccess = dataStruct.initDefaultData(rowDataArr.get(apiNameIndex), rowDataArr.get(apiDescIndex), rowDataArr.get(chineNameIndex), rowDataArr.get(descIndex));
|
boolean initDataSuccess = dataStruct.initDefaultData(
|
||||||
|
rowDataArr.get(sheetInfo.getApiNameIndex()), rowDataArr.get(sheetInfo.getDataTypeIndex()), rowDataArr.get(sheetInfo.getChineNameIndex()), rowDataArr.get(sheetInfo.getDescIndex()));
|
||||||
if (!initDataSuccess) {
|
if (!initDataSuccess) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
boolean isHead = isHeadSheet;
|
boolean isHead = isHeadSheet;
|
||||||
if (rowDataArr.size() > cellCount) {
|
if (rowDataArr.size() > sheetInfo.getCellCount()) {
|
||||||
if (StringUtils.equals(rowDataArr.get(apiPositionIndex), "SYS_HEAD")) {
|
if (StringUtils.equals(rowDataArr.get(sheetInfo.getApiPositionIndex()), "SYS_HEAD")) {
|
||||||
isHead = true;
|
isHead = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -769,5 +759,96 @@ public class ESBParser extends EsbAbstractParser {
|
||||||
return StringUtils.isBlank(val) ? "" : val;
|
return StringUtils.isBlank(val) ? "" : val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ESBExcelSheetInfo getEsbExcelSheetInfo(Sheet sheet) {
|
||||||
|
String apiCodeCellName = "交易码";
|
||||||
|
String apiNameCellName = "交易名称";
|
||||||
|
String serviceNameCellName = "服务名称";
|
||||||
|
String serviceScenarioCellName = "服务场景";
|
||||||
|
|
||||||
|
String englishCellName = "英文名称";
|
||||||
|
String chineseCellName = "中文名称";
|
||||||
|
String dataTypeCellName = "数据类型";
|
||||||
|
String descCellName = "备注";
|
||||||
|
|
||||||
|
int maxContinuityEmptyCellCount = 10;
|
||||||
|
|
||||||
|
ESBExcelSheetInfo sheetInfo = new ESBExcelSheetInfo();
|
||||||
|
|
||||||
|
int lastRowNum = sheet.getLastRowNum();
|
||||||
|
|
||||||
|
rowForeach:
|
||||||
|
for (int rowIndex = 0; rowIndex <= lastRowNum; rowIndex++) {
|
||||||
|
Row row = sheet.getRow(rowIndex);
|
||||||
|
if (row != null) {
|
||||||
|
if (rowIndex == 0) {
|
||||||
|
int lastCellNumber = row.getLastCellNum();
|
||||||
|
|
||||||
|
//连续空白数据的统计:超过连续maxContinuityEmptyCellCount个空白数据时,停止读取当前行。
|
||||||
|
// (某些Excel进行读取时会有缺陷:单元格没有数据,但是因为格式进行过设置,会一直读取,容易造成内存溢出)
|
||||||
|
int continuityEmptyCount = 0;
|
||||||
|
|
||||||
|
cellForeach:
|
||||||
|
for (int i = 0; i <= lastCellNumber; i++) {
|
||||||
|
Cell cell = row.getCell(i);
|
||||||
|
if (cell != null) {
|
||||||
|
String cellValue = this.getCellValue(cell).trim();
|
||||||
|
if (StringUtils.isEmpty(cellValue)) {
|
||||||
|
continuityEmptyCount++;
|
||||||
|
if (continuityEmptyCount > maxContinuityEmptyCellCount) {
|
||||||
|
break cellForeach;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
continuityEmptyCount = 0;
|
||||||
|
if (StringUtils.equals(cellValue, apiCodeCellName)) {
|
||||||
|
sheetInfo.setSimpleCodeIndex(i);
|
||||||
|
} else if (StringUtils.equals(cellValue, apiNameCellName)) {
|
||||||
|
sheetInfo.setSimpleNameIndex(i);
|
||||||
|
} else if (StringUtils.equals(cellValue, serviceNameCellName)) {
|
||||||
|
sheetInfo.setServiceNameIndex(i);
|
||||||
|
} else if (StringUtils.equals(cellValue, serviceScenarioCellName)) {
|
||||||
|
sheetInfo.setServiceScenarioIndex(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//根据第一行《服务名称》的起始列下标开始读取, 进行匹配(英文名称、数据类型/长度、中文名称、备注)
|
||||||
|
int startReadIndex = sheetInfo.getApiNameIndex();
|
||||||
|
int lastCellNumber = row.getLastCellNum();
|
||||||
|
|
||||||
|
int continuityEmptyCount = 0;
|
||||||
|
cellForeach:
|
||||||
|
for (int i = startReadIndex; i < lastCellNumber; i++) {
|
||||||
|
Cell cell = row.getCell(i);
|
||||||
|
if (cell != null) {
|
||||||
|
String cellValue = this.getCellValue(cell).trim();
|
||||||
|
if (StringUtils.isEmpty(cellValue)) {
|
||||||
|
continuityEmptyCount++;
|
||||||
|
if (continuityEmptyCount > maxContinuityEmptyCellCount) {
|
||||||
|
break cellForeach;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
continuityEmptyCount = 0;
|
||||||
|
if (StringUtils.equals(cellValue, englishCellName)) {
|
||||||
|
sheetInfo.setApiNameIndex(i);
|
||||||
|
} else if (StringUtils.equals(cellValue, chineseCellName)) {
|
||||||
|
sheetInfo.setChineNameIndex(i);
|
||||||
|
} else if (StringUtils.contains(cellValue, dataTypeCellName)) {
|
||||||
|
sheetInfo.setDataTypeIndex(i);
|
||||||
|
} else if (StringUtils.equals(cellValue, descCellName)) {
|
||||||
|
sheetInfo.setDescIndex(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sheetInfo.installedApiInfoIndex()) {
|
||||||
|
sheetInfo.countApiPosisionIndex();
|
||||||
|
sheetInfo.setRequestMessageRow(rowIndex + 1);
|
||||||
|
break rowForeach;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sheetInfo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
package io.metersphere.api.dto.definition.parse.esb;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author song.tianyang
|
||||||
|
* @Date 2021/5/6 3:25 下午
|
||||||
|
* @Description
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class ESBExcelSheetInfo {
|
||||||
|
//交易码下标
|
||||||
|
private int simpleCodeIndex = 0;
|
||||||
|
//交易名称下标
|
||||||
|
private int simpleNameIndex = 0;
|
||||||
|
//服务名下标
|
||||||
|
private int serviceNameIndex = 0;
|
||||||
|
//服务场景下标
|
||||||
|
private int serviceScenarioIndex = 0;
|
||||||
|
|
||||||
|
//接口名字下标
|
||||||
|
private int apiNameIndex = 0;
|
||||||
|
//数据类型下标
|
||||||
|
private int dataTypeIndex = 0;
|
||||||
|
//中文名称
|
||||||
|
private int chineNameIndex = 0;
|
||||||
|
//描述
|
||||||
|
private int descIndex = 0;
|
||||||
|
//api位置
|
||||||
|
private int apiPositionIndex = 0;
|
||||||
|
//每一行的单元格最大长度
|
||||||
|
private int cellCount = 0;
|
||||||
|
//请求信息起始行
|
||||||
|
private int requestMessageRow = 0;
|
||||||
|
//允许的最大空白行数(连续超过这个数字的空白行则认为sheet读取结束)
|
||||||
|
private int maxEmptyRowCount = 20;
|
||||||
|
|
||||||
|
public boolean installedApiInfoIndex() {
|
||||||
|
return (apiNameIndex != 0 && dataTypeIndex != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void countApiPosisionIndex() {
|
||||||
|
apiPositionIndex = apiNameIndex > apiPositionIndex ? apiNameIndex : apiPositionIndex;
|
||||||
|
apiPositionIndex = dataTypeIndex > apiPositionIndex ? dataTypeIndex : apiPositionIndex;
|
||||||
|
apiPositionIndex = chineNameIndex > apiPositionIndex ? chineNameIndex : apiPositionIndex;
|
||||||
|
apiPositionIndex = descIndex > apiPositionIndex ? descIndex : apiPositionIndex;
|
||||||
|
apiPositionIndex++;
|
||||||
|
cellCount = apiPositionIndex;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +0,0 @@
|
||||||
package io.metersphere.excel.domain;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author song.tianyang
|
|
||||||
* @Date 2021/3/22 7:04 下午
|
|
||||||
* @Description
|
|
||||||
*/
|
|
||||||
public class EsbExcelData {
|
|
||||||
}
|
|
|
@ -142,6 +142,22 @@ export default {
|
||||||
if (this.basisData.tags instanceof Array) {
|
if (this.basisData.tags instanceof Array) {
|
||||||
this.basisData.tags = JSON.stringify(this.basisData.tags);
|
this.basisData.tags = JSON.stringify(this.basisData.tags);
|
||||||
}
|
}
|
||||||
|
if (this.basisData.method == 'ESB') {
|
||||||
|
let validataResult = this.$refs.esbDefinition.validateEsbDataStruct(this.request.esbDataStruct);
|
||||||
|
if (!validataResult) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.request.esbDataStruct != null) {
|
||||||
|
this.esbDataStruct = JSON.stringify(this.request.esbDataStruct);
|
||||||
|
this.basisData.esbDataStruct = this.esbDataStruct;
|
||||||
|
}
|
||||||
|
if (this.request.backEsbDataStruct != null) {
|
||||||
|
this.basisData.backEsbDataStruct = JSON.stringify(this.request.backEsbDataStruct);
|
||||||
|
}
|
||||||
|
if (this.request.backScript != null) {
|
||||||
|
this.basisData.backScript = JSON.stringify(this.request.backScript);
|
||||||
|
}
|
||||||
|
}
|
||||||
this.$emit('runTest', this.basisData);
|
this.$emit('runTest', this.basisData);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue