diff --git a/sqlrest-common/src/main/java/org/dromara/sqlrest/common/service/DisplayRecord.java b/sqlrest-common/src/main/java/org/dromara/sqlrest/common/service/DisplayRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..fe3ec0a3730713a4d8e29cc8e2240688120e37d3 --- /dev/null +++ b/sqlrest-common/src/main/java/org/dromara/sqlrest/common/service/DisplayRecord.java @@ -0,0 +1,6 @@ +package org.dromara.sqlrest.common.service; + +public interface DisplayRecord { + + String getDisplayText(); +} diff --git a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/dto/ExecuteSqlRecord.java b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/dto/ExecuteSqlRecord.java index 866a39f62992e91b03f880db09b25fa5b60dfe8f..46c2459378ea095e346efffe96d9190cd68cd21d 100644 --- a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/dto/ExecuteSqlRecord.java +++ b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/dto/ExecuteSqlRecord.java @@ -18,12 +18,13 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.ibatis.reflection.ArrayUtil; +import org.dromara.sqlrest.common.service.DisplayRecord; @Data @Builder @NoArgsConstructor @AllArgsConstructor -public class ExecuteSqlRecord { +public class ExecuteSqlRecord implements DisplayRecord { private String sql; @@ -56,6 +57,7 @@ public class ExecuteSqlRecord { return value.toString(); } + @Override public String getDisplayText() { return "==> Preparing: " + sql.trim() + "\n" + "==> Parameters: " + getParameterValueString() + "\n" diff --git a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/dto/ScripDebugRecord.java b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/dto/ScripDebugRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..2a2374dce09feae0befd783dbd12921f2192587e --- /dev/null +++ b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/dto/ScripDebugRecord.java @@ -0,0 +1,26 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/sqlrest +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2024/3/31 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package org.dromara.sqlrest.core.dto; + +import org.dromara.sqlrest.common.service.DisplayRecord; + +public class ScripDebugRecord implements DisplayRecord { + + private String text; + + public ScripDebugRecord(String text) { + this.text = text; + } + + @Override + public String getDisplayText() { + return text; + } +} diff --git a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/engine/impl/ScriptExecutorService.java b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/engine/impl/ScriptExecutorService.java index b28b61a5604b8c41cc1893f9a2307a3b8544b0c3..db341cfb3a967c4cde997f94e17fb87d14e153f5 100644 --- a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/engine/impl/ScriptExecutorService.java +++ b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/engine/impl/ScriptExecutorService.java @@ -26,8 +26,10 @@ import org.dromara.sqlrest.core.exec.annotation.Module; import org.dromara.sqlrest.core.exec.engine.AbstractExecutorEngine; import org.dromara.sqlrest.core.exec.module.CacheVarModule; import org.dromara.sqlrest.core.exec.module.DbVarModule; +import org.dromara.sqlrest.core.exec.module.LogVarModule; import org.dromara.sqlrest.core.exec.module.DsVarModule; import org.dromara.sqlrest.core.exec.module.EnvVarModule; +import org.dromara.sqlrest.core.exec.module.HttpModule; import org.dromara.sqlrest.core.exec.module.ReqVarModule; import org.dromara.sqlrest.persistence.entity.ApiContextEntity; @@ -36,6 +38,8 @@ public class ScriptExecutorService extends AbstractExecutorEngine { public static List syntax = new ArrayList<>(); public static List modules = Arrays.asList( EnvVarModule.class, + HttpModule.class, + LogVarModule.class, DbVarModule.class, DsVarModule.class, ReqVarModule.class, diff --git a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/logger/SqlExecuteLogger.java b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/logger/DebugExecuteLogger.java similarity index 61% rename from sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/logger/SqlExecuteLogger.java rename to sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/logger/DebugExecuteLogger.java index 67be384340f03c3a16b6ba5ef9b713af30ecc627..22a7bdc40b9ce28ad8f7c6ef2d78ca31c8b4ff1f 100644 --- a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/logger/SqlExecuteLogger.java +++ b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/logger/DebugExecuteLogger.java @@ -12,25 +12,34 @@ package org.dromara.sqlrest.core.exec.logger; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.dromara.sqlrest.common.service.DisplayRecord; import org.dromara.sqlrest.core.dto.ExecuteSqlRecord; +import org.dromara.sqlrest.core.dto.ScripDebugRecord; -public final class SqlExecuteLogger { +public final class DebugExecuteLogger { - private static final ThreadLocal> threadLocal = new ThreadLocal<>(); + private static final ThreadLocal> threadLocal = new ThreadLocal<>(); public static void init() { threadLocal.set(new ArrayList<>()); } public static void add(String sql, List parameters, Long costs) { - List list = threadLocal.get(); + List list = threadLocal.get(); if (null != list) { list.add(new ExecuteSqlRecord(sql, parameters, costs)); } } - public static List get() { - List list = threadLocal.get(); + public static void add(String text) { + List list = threadLocal.get(); + if (null != list) { + list.add(new ScripDebugRecord(text)); + } + } + + public static List get() { + List list = threadLocal.get(); if (null == list) { return Collections.emptyList(); } diff --git a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/DbVarModule.java b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/DbVarModule.java index c5dac40790fa57f8d69a4acdaddf0c9741f297a5..16fecccc933cc2d55fe1effa6a6e9407d912a45e 100644 --- a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/DbVarModule.java +++ b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/DbVarModule.java @@ -27,7 +27,7 @@ import org.dromara.sqlrest.common.enums.ProductTypeEnum; import org.dromara.sqlrest.common.service.VarModuleInterface; import org.dromara.sqlrest.core.exec.annotation.Comment; import org.dromara.sqlrest.core.exec.annotation.Module; -import org.dromara.sqlrest.core.exec.logger.SqlExecuteLogger; +import org.dromara.sqlrest.core.exec.logger.DebugExecuteLogger; import org.dromara.sqlrest.core.util.ConvertUtils; import org.dromara.sqlrest.core.util.PageSizeUtils; import org.dromara.sqlrest.core.util.PageSqlUtils; @@ -102,7 +102,7 @@ public class DbVarModule implements VarModuleInterface { try { return build(jdbcTemplate.queryForList(sqlMeta.getSql(), sqlMeta.getParameter().toArray())); } finally { - SqlExecuteLogger.add(sqlMeta.getSql(), sqlMeta.getParameter(), System.currentTimeMillis() - start); + DebugExecuteLogger.add(sqlMeta.getSql(), sqlMeta.getParameter(), System.currentTimeMillis() - start); } } @@ -118,7 +118,7 @@ public class DbVarModule implements VarModuleInterface { try { return jdbcTemplate.queryForObject(countSql, Integer.class, sqlMeta.getParameter().toArray()); } finally { - SqlExecuteLogger.add(countSql, sqlMeta.getParameter(), System.currentTimeMillis() - start); + DebugExecuteLogger.add(countSql, sqlMeta.getParameter(), System.currentTimeMillis() - start); } } @@ -145,7 +145,7 @@ public class DbVarModule implements VarModuleInterface { }, sqlMeta.getParameter().toArray())); } finally { - SqlExecuteLogger.add(sqlMeta.getSql(), sqlMeta.getParameter(), System.currentTimeMillis() - start); + DebugExecuteLogger.add(sqlMeta.getSql(), sqlMeta.getParameter(), System.currentTimeMillis() - start); } } @@ -166,7 +166,7 @@ public class DbVarModule implements VarModuleInterface { try { return build(jdbcTemplate.queryForList(pageSql, parameters.toArray())); } finally { - SqlExecuteLogger.add(pageSql, parameters, System.currentTimeMillis() - start); + DebugExecuteLogger.add(pageSql, parameters, System.currentTimeMillis() - start); } } @@ -190,7 +190,7 @@ public class DbVarModule implements VarModuleInterface { keyHolder); return build(keyHolder.getKeys()); } finally { - SqlExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start); + DebugExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start); } } @@ -206,7 +206,7 @@ public class DbVarModule implements VarModuleInterface { try { return jdbcTemplate.update(sqlMeta.getSql(), parameters.toArray()); } finally { - SqlExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start); + DebugExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start); } } @@ -219,7 +219,7 @@ public class DbVarModule implements VarModuleInterface { try { return Arrays.stream(jdbcTemplate.batchUpdate(sqlList.toArray(new String[0]))).sum(); } finally { - SqlExecuteLogger.add(sqlList.stream().collect(Collectors.joining(";")), + DebugExecuteLogger.add(sqlList.stream().collect(Collectors.joining(";")), Collections.emptyList(), System.currentTimeMillis() - start); } } @@ -236,7 +236,7 @@ public class DbVarModule implements VarModuleInterface { try { return jdbcTemplate.update(sqlMeta.getSql(), parameters.toArray()); } finally { - SqlExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start); + DebugExecuteLogger.add(sqlMeta.getSql(), parameters, System.currentTimeMillis() - start); } } } diff --git a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/HttpModule.java b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/HttpModule.java new file mode 100644 index 0000000000000000000000000000000000000000..b7cd97bbfabffd090c3f52a28a737640c19263bd --- /dev/null +++ b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/HttpModule.java @@ -0,0 +1,192 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/sqlrest +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2024/3/31 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package org.dromara.sqlrest.core.exec.module; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.dromara.sqlrest.common.service.VarModuleInterface; +import org.dromara.sqlrest.core.exec.annotation.Comment; +import org.dromara.sqlrest.core.exec.annotation.Module; +import org.dromara.sqlrest.core.executor.AlarmHttpRequestFactory; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +@Service +@NoArgsConstructor +@Module(HttpModule.VAR_NAME) +public class HttpModule implements VarModuleInterface { + + protected static final String VAR_NAME = "http"; + protected static final RestTemplate template = new RestTemplate(new AlarmHttpRequestFactory()); + + private HttpHeaders httpHeaders = new HttpHeaders(); + private Class responseType = Object.class; + private MultiValueMap params = new LinkedMultiValueMap<>(); + private MultiValueMap data = new LinkedMultiValueMap<>(); + private Map variables = new HashMap<>(); + private String url; + private HttpMethod method = HttpMethod.GET; + private HttpEntity entity = null; + private Object requestBody; + + public HttpModule(String url) { + this.url = url; + } + + @Override + public String getVarModuleName() { + return VAR_NAME; + } + + @Comment("创建连接") + public HttpModule connect(@Comment("目标URL") String url) { + return new HttpModule(url); + } + + @Comment("设置URL参数") + public HttpModule param(@Comment("参数名") String key, @Comment("参数值") Object... values) { + if (values != null) { + for (Object value : values) { + this.params.add(key, value); + } + } + return this; + } + + @Comment("批量设置URL参数") + public HttpModule param(@Comment("参数值") Map values) { + values.forEach((key, value) -> param(key, Objects.toString(value, ""))); + return this; + } + + @Comment("设置form参数") + public HttpModule data(@Comment("参数名") String key, @Comment("参数值") Object... values) { + if (values != null) { + for (Object value : values) { + this.data.add(key, value); + } + } + return this; + } + + @Comment("批量设置form参数") + public HttpModule data(@Comment("参数值") Map values) { + values.forEach((key, value) -> data(key, Objects.toString(value, ""))); + return this; + } + + @Comment("设置header") + public HttpModule header(@Comment("header键") String key, @Comment("header值") String value) { + httpHeaders.add(key, value); + return this; + } + + @Comment("批量设置header") + public HttpModule header(@Comment("header值") Map values) { + values.entrySet() + .stream() + .filter(it -> it.getValue() != null) + .forEach(entry -> header(entry.getKey(), entry.getValue().toString())); + return this; + } + + @Comment("设置请求方法,默认GET") + public HttpModule method(@Comment("请求方法") HttpMethod method) { + this.method = method; + return this; + } + + @Comment("设置`RequestBody`") + public HttpModule body(@Comment("body值") Object requestBody) { + this.requestBody = requestBody; + this.contentType(MediaType.APPLICATION_JSON); + return this; + } + + @Comment("设置`ContentType`") + public HttpModule contentType(@Comment("Content-Type值") String contentType) { + return contentType(MediaType.parseMediaType(contentType)); + } + + @Comment("设置`ContentType`") + public HttpModule contentType(@Comment("Content-Type值") MediaType mediaType) { + this.httpHeaders.setContentType(mediaType); + return this; + } + + @Comment("设置返回值为`byte[]`") + public HttpModule expectBytes() { + this.responseType = byte[].class; + return this; + } + + @Comment("设置返回值为`String`") + public HttpModule expectString() { + this.responseType = String.class; + return this; + } + + @Comment("发送`GET`请求") + public ResponseEntity get() { + this.method(HttpMethod.GET); + return this.execute(); + } + + @Comment("发送`POST`请求") + public ResponseEntity post() { + this.method(HttpMethod.POST); + return this.execute(); + } + + @Comment("发送`PUT`请求") + public ResponseEntity put() { + this.method(HttpMethod.PUT); + return this.execute(); + } + + @Comment("发送`DELETE`请求") + public ResponseEntity delete() { + this.method(HttpMethod.DELETE); + return this.execute(); + } + + @Comment("执行请求") + public ResponseEntity execute() { + if (!this.params.isEmpty()) { + String queryString = this.params.entrySet().stream() + .map(it -> it.getValue().stream() + .map(value -> it.getKey() + "=" + value) + .collect(Collectors.joining("&")) + ).collect(Collectors.joining("&")); + if (StringUtils.isNotBlank(queryString)) { + this.url += (this.url.contains("?") ? "&" : "?") + queryString; + } + } + if (!this.data.isEmpty()) { + this.entity = new HttpEntity<>(this.data, this.httpHeaders); + } else if (this.entity == null && this.requestBody != null) { + this.entity = new HttpEntity<>(this.requestBody, this.httpHeaders); + } else { + this.entity = new HttpEntity<>(null, this.httpHeaders); + } + return template.exchange(url, this.method, entity, responseType, variables); + } +} \ No newline at end of file diff --git a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/LogVarModule.java b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/LogVarModule.java new file mode 100644 index 0000000000000000000000000000000000000000..1de988c17d5400d8adb10da159e67360ab843548 --- /dev/null +++ b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/exec/module/LogVarModule.java @@ -0,0 +1,36 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/sqlrest +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2024/3/31 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package org.dromara.sqlrest.core.exec.module; + +import java.text.MessageFormat; +import lombok.NoArgsConstructor; +import org.dromara.sqlrest.common.service.VarModuleInterface; +import org.dromara.sqlrest.core.exec.annotation.Comment; +import org.dromara.sqlrest.core.exec.annotation.Module; +import org.dromara.sqlrest.core.exec.logger.DebugExecuteLogger; +import org.springframework.stereotype.Service; + +@Service +@NoArgsConstructor +@Module(LogVarModule.VAR_NAME) +public class LogVarModule implements VarModuleInterface { + + protected static final String VAR_NAME = "log"; + + @Override + public String getVarModuleName() { + return VAR_NAME; + } + + @Comment("打印调试日志信息") + public void print(@Comment("message") String message, Object... arguments) { + DebugExecuteLogger.add(MessageFormat.format(message, arguments)); + } +} diff --git a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/service/ApiAssignmentService.java b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/service/ApiAssignmentService.java index 31fc606c6746819a675ab3ce893e8b39fed49425..8f95df5974961116b63fcd172270da39c8e3edb6 100644 --- a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/service/ApiAssignmentService.java +++ b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/service/ApiAssignmentService.java @@ -25,6 +25,7 @@ import org.dromara.sqlrest.common.enums.ParamLocationEnum; import org.dromara.sqlrest.common.enums.ParamTypeEnum; import org.dromara.sqlrest.common.exception.CommonException; import org.dromara.sqlrest.common.exception.ResponseErrorCode; +import org.dromara.sqlrest.common.service.DisplayRecord; import org.dromara.sqlrest.core.driver.DriverLoadService; import org.dromara.sqlrest.core.dto.ApiAssignmentBaseResponse; import org.dromara.sqlrest.core.dto.ApiAssignmentDetailResponse; @@ -32,10 +33,9 @@ import org.dromara.sqlrest.core.dto.ApiAssignmentSaveRequest; import org.dromara.sqlrest.core.dto.ApiDebugExecuteRequest; import org.dromara.sqlrest.core.dto.AssignmentSearchRequest; import org.dromara.sqlrest.core.dto.DataTypeFormatMapValue; -import org.dromara.sqlrest.core.dto.ExecuteSqlRecord; import org.dromara.sqlrest.core.dto.ScriptEditorCompletion; import org.dromara.sqlrest.core.dto.SqlParamParseResponse; -import org.dromara.sqlrest.core.exec.logger.SqlExecuteLogger; +import org.dromara.sqlrest.core.exec.logger.DebugExecuteLogger; import org.dromara.sqlrest.core.exec.annotation.Comment; import org.dromara.sqlrest.core.exec.engine.ApiExecutorEngineFactory; import org.dromara.sqlrest.core.exec.engine.impl.ScriptExecutorService; @@ -321,15 +321,15 @@ public class ApiAssignmentService { ResultEntity entity; try { - SqlExecuteLogger.init(); + DebugExecuteLogger.init(); HikariDataSource dataSource = DataSourceUtils.getHikariDataSource(dataSourceEntity, driverPath.getAbsolutePath()); List results = ApiExecutorEngineFactory .getExecutor(request.getEngine(), dataSource, dataSourceEntity.getType(), true) .execute(scripts, params, request.getNamingStrategy()); Object answer = results.size() > 1 ? results : (1 == results.size()) ? results.get(0) : null; List types = JacksonUtils.parseFiledTypesAndFillNullAsString(results); - String logs = Optional.ofNullable(SqlExecuteLogger.get()) - .orElseGet(ArrayList::new).stream().map(ExecuteSqlRecord::getDisplayText) + String logs = Optional.ofNullable(DebugExecuteLogger.get()) + .orElseGet(ArrayList::new).stream().map(DisplayRecord::getDisplayText) .collect(Collectors.toList()).stream().collect(Collectors.joining("\n\n")); Map respMap = new HashMap<>(4); respMap.put("answer", answer); @@ -340,7 +340,7 @@ public class ApiAssignmentService { log.warn("Failed to debug for error:{}", e.getMessage(), e); entity = ResultEntity.failed(ExceptionUtil.getMessage(e)); } finally { - SqlExecuteLogger.clear(); + DebugExecuteLogger.clear(); } response.setStatus(HttpServletResponse.SC_OK); diff --git a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/util/SqlJdbcUtils.java b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/util/SqlJdbcUtils.java index 92fa8f51f150b0e4f13d17420f5f145844ea008b..77919ca57d29202dabdb024b03019926103b4c9b 100644 --- a/sqlrest-core/src/main/java/org/dromara/sqlrest/core/util/SqlJdbcUtils.java +++ b/sqlrest-core/src/main/java/org/dromara/sqlrest/core/util/SqlJdbcUtils.java @@ -25,7 +25,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.sqlrest.common.enums.NamingStrategyEnum; import org.dromara.sqlrest.common.enums.ProductTypeEnum; import org.dromara.sqlrest.common.util.LambdaUtils; -import org.dromara.sqlrest.core.exec.logger.SqlExecuteLogger; +import org.dromara.sqlrest.core.exec.logger.DebugExecuteLogger; import org.dromara.sqlrest.template.SqlMeta; @Slf4j @@ -89,7 +89,7 @@ public class SqlJdbcUtils { return "(" + updateCount + ") rows affected"; } } finally { - SqlExecuteLogger.add(sql, paramValues, System.currentTimeMillis() - start); + DebugExecuteLogger.add(sql, paramValues, System.currentTimeMillis() - start); } }