perf : 引擎优化
This commit is contained in:
@@ -69,10 +69,11 @@ public class DataAdapter extends BaseEntity {
|
||||
this.code = "\n" +
|
||||
"import java.util.*;\n" +
|
||||
"import java.util.stream.*;\n" +
|
||||
"import com.alibaba.fastjson2.*;\n" +
|
||||
"\n" +
|
||||
"public class DataAdapter {\n" +
|
||||
"\n" +
|
||||
" public static Object execute(List<Map<String, Object>> data) {\n" +
|
||||
" public static Object execute(Object data) {\n" +
|
||||
" return data;\n" +
|
||||
" }\n" +
|
||||
"}\n";
|
||||
|
||||
@@ -29,7 +29,6 @@ public class PortalBo implements Serializable {
|
||||
private Boolean createDataAdapter;
|
||||
private Boolean page;
|
||||
private String path;
|
||||
private String url;
|
||||
private Integer state;
|
||||
private List<PortalMapping> mappings;
|
||||
|
||||
|
||||
@@ -29,5 +29,7 @@ public class MockParam {
|
||||
private String key;
|
||||
|
||||
private Object value;
|
||||
|
||||
private String type;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ public abstract class AbstractDataAdapterHandler implements DataAdapterHandler {
|
||||
this.handlerReader = handlerReader;
|
||||
}
|
||||
|
||||
protected Object execute(Long adapterId, Object data, boolean development) {
|
||||
protected Object execute(Long adapterId, Object data) {
|
||||
if (ObjectUtils.isEmpty(adapterId)) {
|
||||
return data;
|
||||
}
|
||||
@@ -33,15 +33,15 @@ public abstract class AbstractDataAdapterHandler implements DataAdapterHandler {
|
||||
throw new RuntimeException("dataAdapter is null");
|
||||
}
|
||||
handlerReader.preconditioning(dataAdapter);
|
||||
EngineResult execute = handlerReader.execute(dataAdapter, data, development);
|
||||
if (ObjectUtils.isEmpty(execute)) {
|
||||
Object result = handlerReader.execute(dataAdapter, data);
|
||||
if (ObjectUtils.isEmpty(result)) {
|
||||
throw new RuntimeException("执行结果错误");
|
||||
}
|
||||
return execute.getResult();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
protected EngineResult mockExecute(Long adapterId, String code, Object data, boolean development) {
|
||||
protected EngineResult mockExecute(Long adapterId, String code, Object data) {
|
||||
//获取当当前接口对应的数据适配器
|
||||
DataAdapter dataAdapter = dataAdapterMapper.selectById(adapterId);
|
||||
if (ObjectUtils.isEmpty(dataAdapter)) {
|
||||
@@ -49,7 +49,7 @@ public abstract class AbstractDataAdapterHandler implements DataAdapterHandler {
|
||||
}
|
||||
dataAdapter.setCode(code);
|
||||
handlerReader.preconditioning(dataAdapter);
|
||||
EngineResult execute = handlerReader.execute(dataAdapter, data, development);
|
||||
EngineResult execute = handlerReader.mockExecute(dataAdapter, data);
|
||||
if (ObjectUtils.isEmpty(execute)) {
|
||||
throw new RuntimeException("执行结果错误");
|
||||
}
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
package cn.fateverse.query.handler.adapter.impl;
|
||||
|
||||
import cn.fateverse.common.core.exception.CustomException;
|
||||
import cn.fateverse.query.entity.PortalInterface;
|
||||
import cn.fateverse.query.entity.PortalMapping;
|
||||
import cn.fateverse.query.entity.dto.MockParam;
|
||||
import cn.fateverse.query.entity.bo.PortalBo;
|
||||
import cn.fateverse.query.enums.PortalEnum;
|
||||
import cn.fateverse.query.handler.adapter.AbstractDataAdapterHandler;
|
||||
import cn.fateverse.query.handler.reader.EngineExecuteHandlerReader;
|
||||
import cn.fateverse.query.mapper.DataAdapterMapper;
|
||||
import cn.fateverse.query.mapper.PortalInterfaceMapper;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
@@ -17,6 +20,7 @@ import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Clay
|
||||
@@ -31,11 +35,15 @@ public class ExternalDataAdapterHandler extends AbstractDataAdapterHandler {
|
||||
*/
|
||||
private final RestTemplate restTemplate;
|
||||
|
||||
public ExternalDataAdapterHandler(DataAdapterMapper dataAdapterMapper,
|
||||
private final PortalInterfaceMapper portalInterfaceMapper;
|
||||
|
||||
public ExternalDataAdapterHandler(RestTemplate restTemplate,
|
||||
DataAdapterMapper dataAdapterMapper,
|
||||
EngineExecuteHandlerReader handlerReader,
|
||||
RestTemplate restTemplate) {
|
||||
PortalInterfaceMapper portalInterfaceMapper) {
|
||||
super(dataAdapterMapper, handlerReader);
|
||||
this.restTemplate = restTemplate;
|
||||
this.portalInterfaceMapper = portalInterfaceMapper;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,18 +52,28 @@ public class ExternalDataAdapterHandler extends AbstractDataAdapterHandler {
|
||||
if (!PortalEnum.EXTERNAL.equals(portal.getType())) {
|
||||
return null;
|
||||
}
|
||||
PortalInterface portalInterface = portalInterfaceMapper.selectById(portal.getInterfaceId());
|
||||
if (ObjectUtils.isEmpty(portalInterface)) {
|
||||
throw new CustomException("接口不存在");
|
||||
}
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
|
||||
MediaType type = MediaType.parseMediaType(portalInterface.getContentType());
|
||||
headers.setContentType(type);
|
||||
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
Map<String, Object> requestParams = new HashMap<>();
|
||||
if (!ObjectUtils.isEmpty(mockParam.getParams())) {
|
||||
for (MockParam.Param param : mockParam.getParams()) {
|
||||
if (!ObjectUtils.isEmpty(param.getKey()) && !ObjectUtils.isEmpty(param.getValue())) {
|
||||
requestParams.put(param.getKey(), param.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
JSONObject response = null;
|
||||
switch (portal.getRequestMethod()) {
|
||||
switch (portalInterface.getRequestMethod()) {
|
||||
case "GET":
|
||||
response = restTemplate.getForObject(portal.getUrl(), JSONObject.class, map);
|
||||
response = restTemplate.getForObject(portalInterface.getUrl(), JSONObject.class, requestParams);
|
||||
break;
|
||||
case "POST":
|
||||
response = restTemplate.postForObject(portal.getUrl(), map, JSONObject.class);
|
||||
response = restTemplate.postForObject(portalInterface.getUrl(), requestParams, JSONObject.class);
|
||||
break;
|
||||
default:
|
||||
throw new CustomException("请求方式错误");
|
||||
@@ -63,12 +81,49 @@ public class ExternalDataAdapterHandler extends AbstractDataAdapterHandler {
|
||||
if (ObjectUtils.isEmpty(portal.getAdapterId()) || !portal.getCreateDataAdapter()) {
|
||||
return response;
|
||||
} else {
|
||||
return super.mockExecute(portal.getAdapterId(), mockParam.getCode(), response, true);
|
||||
return super.mockExecute(portal.getAdapterId(), mockParam.getCode(), response);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object execute(PortalBo portal, HttpServletRequest request) {
|
||||
return null;
|
||||
if (!PortalEnum.EXTERNAL.equals(portal.getType())) {
|
||||
return null;
|
||||
}
|
||||
PortalInterface portalInterface = portalInterfaceMapper.selectById(portal.getInterfaceId());
|
||||
if (ObjectUtils.isEmpty(portalInterface)) {
|
||||
throw new CustomException("接口不存在");
|
||||
}
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
MediaType type = MediaType.parseMediaType(portalInterface.getContentType());
|
||||
headers.setContentType(type);
|
||||
Map<String, Object> requestParams = new HashMap<>();
|
||||
for (PortalMapping mapping : portal.getMappings()) {
|
||||
String mappingValue = mapping.getMappingValue();
|
||||
String mappingKey = mapping.getMappingKey();
|
||||
if (mapping.getMappingType() == 0) {
|
||||
requestParams.put(mappingKey, request.getParameter(mappingValue));
|
||||
} else if (mapping.getMappingType() == 1) {
|
||||
headers.add(mappingKey, request.getHeader(mappingValue));
|
||||
} else {
|
||||
requestParams.put(mappingKey, request.getParameter(mappingValue));
|
||||
}
|
||||
}
|
||||
JSONObject response = null;
|
||||
switch (portalInterface.getRequestMethod()) {
|
||||
case "GET":
|
||||
response = restTemplate.getForObject(portalInterface.getUrl(), JSONObject.class, requestParams);
|
||||
break;
|
||||
case "POST":
|
||||
response = restTemplate.postForObject(portalInterface.getUrl(), requestParams, JSONObject.class);
|
||||
break;
|
||||
default:
|
||||
throw new CustomException("请求方式错误");
|
||||
}
|
||||
if (ObjectUtils.isEmpty(portal.getAdapterId()) || !portal.getCreateDataAdapter()) {
|
||||
return response;
|
||||
} else {
|
||||
return super.execute(portal.getAdapterId(), response);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ public class LocalDataAdapterHandler extends AbstractDataAdapterHandler {
|
||||
if (ObjectUtils.isEmpty(portal.getAdapterId()) || !portal.getCreateDataAdapter()) {
|
||||
return tableDataInfo.getRows();
|
||||
} else {
|
||||
return super.mockExecute(portal.getAdapterId(), mockParam.getCode(), tableDataInfo.getRows(), true);
|
||||
return super.mockExecute(portal.getAdapterId(), mockParam.getCode(), tableDataInfo.getRows());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ public class LocalDataAdapterHandler extends AbstractDataAdapterHandler {
|
||||
//根据设置的参数动态调整当前是否需要分页操作
|
||||
TableDataInfo<Map<String, Object>> tableDataInfo = dynamicDataSearchService.searchData(uniConList, query, null, Boolean.TRUE);
|
||||
if (portal.getCreateDataAdapter()) {
|
||||
return super.execute(portal.getAdapterId(), tableDataInfo.getRows(), false);
|
||||
return super.execute(portal.getAdapterId(), tableDataInfo.getRows());
|
||||
} else {
|
||||
return tableDataInfo.getRows();
|
||||
}
|
||||
|
||||
@@ -11,10 +11,18 @@ public interface EngineExecuteHandler {
|
||||
*
|
||||
* @param dataAdapter 数据适配器
|
||||
* @param data 数据列表
|
||||
* @param development
|
||||
* @return JSONObject对象
|
||||
*/
|
||||
EngineResult execute(DataAdapter dataAdapter, Object data, boolean development);
|
||||
Object execute(DataAdapter dataAdapter, Object data);
|
||||
|
||||
/**
|
||||
* 模拟执行方法
|
||||
*
|
||||
* @param dataAdapter 数据适配器
|
||||
* @param data 数据列表
|
||||
* @return JSONObject对象
|
||||
*/
|
||||
EngineResult mockExecute(DataAdapter dataAdapter, Object data);
|
||||
|
||||
/**
|
||||
* 预处理数据适配器
|
||||
@@ -31,4 +39,5 @@ public interface EngineExecuteHandler {
|
||||
* @return 删除结果
|
||||
*/
|
||||
Boolean remove(DataAdapter dataAdapter);
|
||||
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ import cn.fateverse.query.handler.engine.EngineExecuteHandler;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@@ -32,12 +31,18 @@ public class JavaEngineExecuteHandler implements EngineExecuteHandler {
|
||||
|
||||
|
||||
@Override
|
||||
public EngineResult execute(DataAdapter dataAdapter, Object data, boolean development) {
|
||||
public Object execute(DataAdapter dataAdapter, Object data) {
|
||||
if (!DataAdapterType.JAVA.equals(dataAdapter.getType())) {
|
||||
return null;
|
||||
}
|
||||
return javaCodeEngine.execute(dataAdapter.getExecuteCode(), getClassName(dataAdapter),
|
||||
"execute", new Class[]{List.class}, new Object[]{data}, development);
|
||||
"execute", new Object[]{data});
|
||||
}
|
||||
|
||||
@Override
|
||||
public EngineResult mockExecute(DataAdapter dataAdapter, Object data) {
|
||||
return javaCodeEngine.mockExecute(dataAdapter.getExecuteCode(), getClassName(dataAdapter),
|
||||
"execute", new Object[]{data});
|
||||
}
|
||||
|
||||
private static String getClassName(DataAdapter dataAdapter) {
|
||||
@@ -53,7 +58,8 @@ public class JavaEngineExecuteHandler implements EngineExecuteHandler {
|
||||
String modifiedCode = modifiedCode(dataAdapter.getCode());
|
||||
String replacedCode = replacedClass(modifiedCode, getClassName(dataAdapter));
|
||||
String IMPORT_CODE = "import java.util.*;\n" +
|
||||
"import java.util.stream.*;\n";
|
||||
"import java.util.stream.*;\n" +
|
||||
"import com.alibaba.fastjson2.*;";
|
||||
dataAdapter.setExecuteCode(IMPORT_CODE + replacedCode);
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
@@ -23,11 +23,20 @@ import java.util.regex.Pattern;
|
||||
public class JavaScriptEngineExecuteHandler implements EngineExecuteHandler {
|
||||
|
||||
@Override
|
||||
public EngineResult execute(DataAdapter dataAdapter, Object data, boolean development) {
|
||||
public Object execute(DataAdapter dataAdapter, Object data) {
|
||||
if (!DataAdapterType.JAVA_SCRIPT.equals(dataAdapter.getType())) {
|
||||
return null;
|
||||
}
|
||||
return JavaScriptEngine.execute(dataAdapter.getExecuteCode(), "execute" + dataAdapter.getAdapterId(), development, data);
|
||||
return JavaScriptEngine.execute(dataAdapter.getExecuteCode(), "execute" + dataAdapter.getAdapterId(), data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EngineResult mockExecute(DataAdapter dataAdapter, Object data) {
|
||||
if (!DataAdapterType.JAVA_SCRIPT.equals(dataAdapter.getType())) {
|
||||
return null;
|
||||
}
|
||||
return JavaScriptEngine.mockExecute(dataAdapter.getExecuteCode(), "execute" + dataAdapter.getAdapterId(), data);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -48,11 +48,11 @@ public class EngineExecuteHandlerReader {
|
||||
* @param data 数据列表
|
||||
* @return 执行结果
|
||||
*/
|
||||
public EngineResult execute(DataAdapter dataAdapter, Object data, boolean development) {
|
||||
public Object execute(DataAdapter dataAdapter, Object data) {
|
||||
// 遍历引擎执行处理器列表
|
||||
for (EngineExecuteHandler engineExecuteHandler : handlerList) {
|
||||
// 执行数据适配器的处理方法
|
||||
EngineResult result = engineExecuteHandler.execute(dataAdapter, data, development);
|
||||
Object result = engineExecuteHandler.execute(dataAdapter, data);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
@@ -60,6 +60,22 @@ public class EngineExecuteHandlerReader {
|
||||
// 若未找到匹配的数据适配器处理器,则返回null
|
||||
return null;
|
||||
}
|
||||
public EngineResult mockExecute(DataAdapter dataAdapter, Object data) {
|
||||
// 遍历引擎执行处理器列表
|
||||
for (EngineExecuteHandler engineExecuteHandler : handlerList) {
|
||||
// 执行数据适配器的处理方法
|
||||
EngineResult result = engineExecuteHandler.mockExecute(dataAdapter, data);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
// 若未找到匹配的数据适配器处理器,则返回null
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public Boolean remove(DataAdapter dataAdapter) {
|
||||
|
||||
@@ -3,12 +3,9 @@ package cn.fateverse.query.portal;
|
||||
import cn.fateverse.common.core.result.Result;
|
||||
import cn.fateverse.common.security.utils.ResponseRender;
|
||||
import cn.fateverse.query.constant.QueryConstant;
|
||||
import cn.fateverse.query.entity.DataAdapter;
|
||||
import cn.fateverse.query.entity.Portal;
|
||||
import cn.fateverse.query.entity.PortalMapping;
|
||||
import cn.fateverse.query.entity.bo.PortalBo;
|
||||
import cn.fateverse.query.entity.dto.SearchInfo;
|
||||
import cn.fateverse.query.entity.dto.UniConDto;
|
||||
import cn.fateverse.query.handler.reader.DataAdapterHandlerReader;
|
||||
import cn.fateverse.query.mapper.DataAdapterMapper;
|
||||
import cn.fateverse.query.mapper.PortalMapper;
|
||||
@@ -20,7 +17,6 @@ import org.springframework.stereotype.Component;
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
||||
@@ -77,7 +77,7 @@ public class PortalServiceImpl implements PortalService {
|
||||
this.handlerReader = handlerReader;
|
||||
taskExecuteExecutor.execute(() -> {
|
||||
PortalQuery query = new PortalQuery();
|
||||
query.setState(QueryConstant.PORTAL_PUBLISH);
|
||||
// query.setState(QueryConstant.PORTAL_PUBLISH);
|
||||
List<Portal> portalList = portalMapper.selectList(query);
|
||||
if (ObjectUtils.isEmpty(portalList)) {
|
||||
log.info("portal is empty!");
|
||||
@@ -247,9 +247,13 @@ public class PortalServiceImpl implements PortalService {
|
||||
if (!ObjectUtils.isEmpty(old)) {
|
||||
throw new CustomException("系统中存在当前请求路径");
|
||||
}
|
||||
UniQuery uniQuery = queryMapper.selectById(portal.getQueryId());
|
||||
if (ObjectUtils.isEmpty(uniQuery)) {
|
||||
throw new CustomException("未找到对应的查询接口!");
|
||||
if (PortalEnum.EXTERNAL.equals(portal.getType())) {
|
||||
createPortalInterface(portalDto, portal);
|
||||
}else {
|
||||
UniQuery uniQuery = queryMapper.selectById(portal.getQueryId());
|
||||
if (ObjectUtils.isEmpty(uniQuery)) {
|
||||
throw new CustomException("未找到对应的查询接口!");
|
||||
}
|
||||
}
|
||||
portal.setState(QueryConstant.PORTAL_DEV);
|
||||
// 判断是否需要创建数据适配器
|
||||
@@ -261,9 +265,6 @@ public class PortalServiceImpl implements PortalService {
|
||||
throw new CustomException("未找到对应的数据适配器!");
|
||||
}
|
||||
}
|
||||
if (PortalEnum.EXTERNAL.equals(portal.getType())) {
|
||||
createPortalInterface(portalDto, portal);
|
||||
}
|
||||
portalMapper.insert(portal);
|
||||
List<PortalMapping> mappings = portalDto.getMappings();
|
||||
if (!ObjectUtils.isEmpty(mappings)) {
|
||||
|
||||
@@ -5,19 +5,20 @@
|
||||
<mapper namespace="cn.fateverse.query.mapper.PortalInterfaceMapper">
|
||||
|
||||
<select id="selectById" resultType="cn.fateverse.query.entity.PortalInterface">
|
||||
select interface_id, content_type, request_method
|
||||
select interface_id, url, content_type, request_method
|
||||
from portal_interface
|
||||
where interface_id = #{interfaceId}
|
||||
</select>
|
||||
|
||||
<insert id="insert" useGeneratedKeys="true" keyColumn="interface_id" keyProperty="interfaceId">
|
||||
insert into portal_interface (interface_id, content_type, request_method)
|
||||
values (#{interfaceId}, #{contentType}, #{requestMethod})
|
||||
insert into portal_interface (interface_id, url, content_type, request_method)
|
||||
values (#{interfaceId}, #{url}, #{contentType}, #{requestMethod})
|
||||
</insert>
|
||||
|
||||
<update id="update">
|
||||
update portal_interface
|
||||
set content_type = #{contentType},
|
||||
url = #{url},
|
||||
request_method = #{requestMethod}
|
||||
where interface_id = #{interfaceId}
|
||||
</update>
|
||||
|
||||
Reference in New Issue
Block a user