From 449c3202619b2a55ad315815294d1679932c0860 Mon Sep 17 00:00:00 2001 From: EnderByEndera <707475564@qq.com> Date: Fri, 19 Jan 2024 15:09:23 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9setDataMap=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=B8=BAaddDataMap=E4=BB=A5=E9=98=B2=E6=AD=A2swagger?= =?UTF-8?q?=E5=B0=86DataMap=E8=A7=86=E4=B8=BA=E4=B8=80=E7=A7=8D=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=202.=20=E5=BD=93=E4=BB=BB=E5=8A=A1=E6=9C=AA=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=AE=A1=E6=A0=B8=E6=97=B6=EF=BC=8C=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E4=BC=9A=E7=AB=8B=E5=88=BB=E6=8A=A5=E9=94=99=E8=80=8C=E4=B8=8D?= =?UTF-8?q?=E6=98=AF=E8=BF=94=E5=9B=9Efalse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +- qodana.yaml | 31 +++++++++++++ .../protection/ProtectionApplication.java | 1 - .../configuration/cors/CorsFilter.java | 18 -------- .../configuration/response/ResponseData.java | 17 +++++++ .../response/ResponseResult.java | 12 ++--- .../server/command/CommandMapper.java | 2 + .../server/command/CommandService.java | 15 ++++++- .../object/ProtectObjectController.java | 7 ++- .../defense/template/TemplateController.java | 3 +- .../rule/staticrule/StaticRuleController.java | 2 +- .../server/task/TaskController.java | 3 +- .../server/task/TaskControllerApi.java | 8 +++- .../server/task/status/StateHandler.java | 4 +- .../task/status/states/PendingState.java | 3 +- .../server/whitelist/WhiteListController.java | 2 +- src/main/resources/config/application-dev.yml | 18 +++++--- .../resources/config/application-prod.yml | 11 +++-- .../resources/config/application-test.yml | 9 ++-- src/main/resources/mappers/CommandMapper.xml | 25 +++++++++-- .../server/task/TaskServiceTest.java | 44 ++++++++++++++----- .../task/status/CommandServiceTest.java | 13 +++++- 22 files changed, 176 insertions(+), 75 deletions(-) create mode 100644 qodana.yaml delete mode 100644 src/main/java/com/realtime/protection/configuration/cors/CorsFilter.java create mode 100644 src/main/java/com/realtime/protection/configuration/response/ResponseData.java diff --git a/build.gradle b/build.gradle index 6b7eb99..124e4b9 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'com.realtime' -version = '0.0.1-SNAPSHOT' +version = '0.0.2-SNAPSHOT' java { sourceCompatibility = '17' @@ -43,6 +43,7 @@ dependencies { implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'com.alibaba:easyexcel:3.3.3' implementation 'com.baomidou:dynamic-datasource-spring-boot3-starter:4.3.0' + implementation 'com.github.xiaoymin:knife4j-openapi3-jakarta-spring-boot-starter:4.4.0' } tasks.named('test') { diff --git a/qodana.yaml b/qodana.yaml new file mode 100644 index 0000000..08a316b --- /dev/null +++ b/qodana.yaml @@ -0,0 +1,31 @@ +#-------------------------------------------------------------------------------# +# Qodana analysis is configured by qodana.yaml file # +# https://www.jetbrains.com/help/qodana/qodana-yaml.html # +#-------------------------------------------------------------------------------# +version: "1.0" + +#Specify inspection profile for code analysis +profile: + name: qodana.starter + +#Enable inspections +#include: +# - name: + +#Disable inspections +#exclude: +# - name: +# paths: +# - + +projectJDK: 17 #(Applied in CI/CD pipeline) + +#Execute shell command before Qodana execution (Applied in CI/CD pipeline) +#bootstrap: sh ./prepare-qodana.sh + +#Install IDE plugins before Qodana execution (Applied in CI/CD pipeline) +#plugins: +# - id: #(plugin id can be found at https://plugins.jetbrains.com) + +#Specify Qodana linter for analysis (Applied in CI/CD pipeline) +linter: jetbrains/qodana-jvm:latest diff --git a/src/main/java/com/realtime/protection/ProtectionApplication.java b/src/main/java/com/realtime/protection/ProtectionApplication.java index 1132087..4effcda 100644 --- a/src/main/java/com/realtime/protection/ProtectionApplication.java +++ b/src/main/java/com/realtime/protection/ProtectionApplication.java @@ -2,7 +2,6 @@ package com.realtime.protection; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication public class ProtectionApplication { diff --git a/src/main/java/com/realtime/protection/configuration/cors/CorsFilter.java b/src/main/java/com/realtime/protection/configuration/cors/CorsFilter.java deleted file mode 100644 index e193321..0000000 --- a/src/main/java/com/realtime/protection/configuration/cors/CorsFilter.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.realtime.protection.configuration.cors; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class CorsFilter implements WebMvcConfigurer { - @Override - public void addCorsMappings(CorsRegistry corsRegistry) { - corsRegistry.addMapping("/**") - .allowedOrigins("http://localhost:8000") - .allowCredentials(true) - .allowedMethods("GET", "POST", "DELETE", "PUT") - .allowedHeaders("*") - .exposedHeaders("*"); - } -} diff --git a/src/main/java/com/realtime/protection/configuration/response/ResponseData.java b/src/main/java/com/realtime/protection/configuration/response/ResponseData.java new file mode 100644 index 0000000..652a0bc --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/response/ResponseData.java @@ -0,0 +1,17 @@ +package com.realtime.protection.configuration.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.HashMap; + +@EqualsAndHashCode(callSuper = true) +@Data +@Schema(description = "xxx") +public class ResponseData extends HashMap { + + public Object put(String key, Object value, String description) { + return super.put(key, value); + } +} diff --git a/src/main/java/com/realtime/protection/configuration/response/ResponseResult.java b/src/main/java/com/realtime/protection/configuration/response/ResponseResult.java index 7277cb8..4ed8114 100644 --- a/src/main/java/com/realtime/protection/configuration/response/ResponseResult.java +++ b/src/main/java/com/realtime/protection/configuration/response/ResponseResult.java @@ -18,12 +18,12 @@ public class ResponseResult implements Serializable { private String message; @Schema(description = "封装数据") - private Map data; + private ResponseData data; @Schema(description = "返回对象链接的另外一个返回对象") private ResponseResult another; - public ResponseResult(int code, String message, LinkedHashMap data) { + public ResponseResult(int code, String message, ResponseData data) { this.code = code; this.message = message; this.data = data; @@ -31,13 +31,13 @@ public class ResponseResult implements Serializable { public ResponseResult(int code) { this.code = code; - this.data = new LinkedHashMap<>(); + this.data = new ResponseData(); } public ResponseResult(int code, String message) { this.code = code; this.message = message; - this.data = new LinkedHashMap<>(); + this.data = new ResponseData(); } public static ResponseResult ok() { @@ -83,8 +83,8 @@ public class ResponseResult implements Serializable { return this; } - public ResponseResult setDataMap(Map data) { - this.data = data; + public ResponseResult addDataMap(Map data) { + this.data = (ResponseData) data; return this; } } diff --git a/src/main/java/com/realtime/protection/server/command/CommandMapper.java b/src/main/java/com/realtime/protection/server/command/CommandMapper.java index 01c96d7..9c75370 100644 --- a/src/main/java/com/realtime/protection/server/command/CommandMapper.java +++ b/src/main/java/com/realtime/protection/server/command/CommandMapper.java @@ -23,4 +23,6 @@ public interface CommandMapper { Boolean setCommandInvalid(@Param("command_id") String commandId); List queryCommandInfoByTaskId(@Param("task_id") Long taskId); + + TaskCommandInfo queryCommandInfoByUUID(@Param("uuid") String uuid); } diff --git a/src/main/java/com/realtime/protection/server/command/CommandService.java b/src/main/java/com/realtime/protection/server/command/CommandService.java index 955c891..0e02c1f 100644 --- a/src/main/java/com/realtime/protection/server/command/CommandService.java +++ b/src/main/java/com/realtime/protection/server/command/CommandService.java @@ -6,8 +6,10 @@ import com.realtime.protection.configuration.entity.task.TaskCommandInfo; import com.realtime.protection.configuration.utils.SqlSessionWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.UUID; import java.util.function.Function; @Service @@ -24,14 +26,19 @@ public class CommandService { this.sqlSessionWrapper = sqlSessionWrapper; } - public Boolean createCommand(TaskCommandInfo commandInfo) { - return commandMapper.createCommand(commandInfo); + @Transactional + public String createCommand(TaskCommandInfo commandInfo) { + commandInfo.setUUID(UUID.randomUUID().toString()); + commandMapper.createCommand(commandInfo); + return commandInfo.getUUID(); + } public void createCommands(List taskCommandInfos) { Function, Boolean>> function = mapper -> list -> { List taskCommandInfoBatch = ListUtils.newArrayListWithExpectedSize(BatchSize); for (TaskCommandInfo info : list) { + info.setUUID(UUID.randomUUID().toString()); taskCommandInfoBatch.add(info); if (taskCommandInfoBatch.size() < BatchSize) { continue; @@ -56,6 +63,10 @@ public class CommandService { return commandMapper.queryCommandInfoByTaskId(taskId); } + public TaskCommandInfo queryCommandInfoByUUID(String uuid) { + return commandMapper.queryCommandInfoByUUID(uuid); + } + public Boolean startCommandsByTaskId(Long taskId) { return commandMapper.startCommandsByTaskId(taskId); } diff --git a/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectController.java b/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectController.java index f181cb7..d3ca031 100644 --- a/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectController.java +++ b/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectController.java @@ -83,14 +83,13 @@ public class ProtectObjectController implements ProtectObjectControllerApi { @Override @GetMapping("/{protectObjectId}/query") - public ResponseResult queryProtectObject(@PathVariable Integer protectObjectId) throws IllegalAccessException { + public ResponseResult queryProtectObject(@PathVariable Integer protectObjectId) { ProtectObject protectObject = protectObjectService.queryProtectObject(protectObjectId); if (protectObject == null) { return ResponseResult.invalid() .setMessage("无效的防护对象ID,也许该ID指定的防护对象不存在?"); } - return ResponseResult.ok() - .setDataMap(EntityUtils.entityToMap(protectObject)); + return ResponseResult.ok().setData("protect_object", protectObject); } @Override @@ -124,7 +123,7 @@ public class ProtectObjectController implements ProtectObjectControllerApi { public ResponseResult changeProtectObjectAuditStatus(@PathVariable Integer protectObjectId, @PathVariable Integer auditStatus) { return ResponseResult.ok() - .setDataMap(protectObjectService.changeProtectObjectAuditStatus(protectObjectId, auditStatus)) + .addDataMap(protectObjectService.changeProtectObjectAuditStatus(protectObjectId, auditStatus)) .setData("proobj_id", protectObjectId); } } diff --git a/src/main/java/com/realtime/protection/server/defense/template/TemplateController.java b/src/main/java/com/realtime/protection/server/defense/template/TemplateController.java index 38ccd06..ab065cd 100644 --- a/src/main/java/com/realtime/protection/server/defense/template/TemplateController.java +++ b/src/main/java/com/realtime/protection/server/defense/template/TemplateController.java @@ -55,8 +55,7 @@ public class TemplateController implements TemplateControllerApi { return ResponseResult.invalid() .setMessage("无效的策略模板ID,也许该模板不存在?"); } - return ResponseResult.ok() - .setDataMap(EntityUtils.entityToMap(template)); + return ResponseResult.ok().setData("template", template); } @Override diff --git a/src/main/java/com/realtime/protection/server/rule/staticrule/StaticRuleController.java b/src/main/java/com/realtime/protection/server/rule/staticrule/StaticRuleController.java index 9b07c6f..2361df9 100644 --- a/src/main/java/com/realtime/protection/server/rule/staticrule/StaticRuleController.java +++ b/src/main/java/com/realtime/protection/server/rule/staticrule/StaticRuleController.java @@ -152,7 +152,7 @@ public class StaticRuleController implements StaticRuleControllerApi { .setData("success", false); } return ResponseResult.ok() - .setDataMap(staticRuleService.updateAuditStatus(id, auditStatus)) + .addDataMap(staticRuleService.updateAuditStatus(id, auditStatus)) .setData("staticRule_id", id); } diff --git a/src/main/java/com/realtime/protection/server/task/TaskController.java b/src/main/java/com/realtime/protection/server/task/TaskController.java index 78e9c98..d0fc282 100644 --- a/src/main/java/com/realtime/protection/server/task/TaskController.java +++ b/src/main/java/com/realtime/protection/server/task/TaskController.java @@ -87,8 +87,7 @@ public class TaskController implements TaskControllerApi { return ResponseResult.invalid().setMessage("无效Task ID,也许该ID对应的任务不存在?"); } - return ResponseResult.ok() - .setDataMap(EntityUtils.entityToMap(task)); + return ResponseResult.ok().setData("task", task); } @Override diff --git a/src/main/java/com/realtime/protection/server/task/TaskControllerApi.java b/src/main/java/com/realtime/protection/server/task/TaskControllerApi.java index ef8038e..5f0fe40 100644 --- a/src/main/java/com/realtime/protection/server/task/TaskControllerApi.java +++ b/src/main/java/com/realtime/protection/server/task/TaskControllerApi.java @@ -4,6 +4,7 @@ import com.realtime.protection.configuration.entity.task.Task; import com.realtime.protection.configuration.entity.task.TaskCommandInfo; import com.realtime.protection.configuration.exception.DorisStartException; import com.realtime.protection.configuration.response.ResponseResult; +import io.netty.channel.ChannelHandler; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; @@ -16,6 +17,10 @@ import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import org.springframework.web.bind.annotation.*; +import java.util.Map; + +import static com.fasterxml.jackson.databind.type.LogicalType.Map; + @Tag(name = "任务控制器API", description = "任务管理模块相关的所有接口") public interface TaskControllerApi { @PostMapping("/new") @@ -28,7 +33,8 @@ public interface TaskControllerApi { content = @Content( mediaType = "application/json", schema = @Schema(implementation = ResponseResult.class) - ) + ), + responseCode = "200" ) }, requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "任务信息") diff --git a/src/main/java/com/realtime/protection/server/task/status/StateHandler.java b/src/main/java/com/realtime/protection/server/task/status/StateHandler.java index 0d2ce6d..18c4853 100644 --- a/src/main/java/com/realtime/protection/server/task/status/StateHandler.java +++ b/src/main/java/com/realtime/protection/server/task/status/StateHandler.java @@ -35,9 +35,9 @@ public class StateHandler { throw new IllegalArgumentException("无效的task_id,因为task_audit_status为空"); } - // 如果审核状态不为已通过审核,则无效 + // 如果审核状态不为已通过审核,则报错 if (taskAuditStatus != AuditStatus.AUDITED.getAuditStatus()) { - return false; + throw new IllegalArgumentException("无效的task_id,因为未通过审核"); } return switch (TaskTypeEnum.getTaskTypeByNum(task.getTaskType())) { diff --git a/src/main/java/com/realtime/protection/server/task/status/states/PendingState.java b/src/main/java/com/realtime/protection/server/task/status/states/PendingState.java index a09327a..75feda7 100644 --- a/src/main/java/com/realtime/protection/server/task/status/states/PendingState.java +++ b/src/main/java/com/realtime/protection/server/task/status/states/PendingState.java @@ -14,7 +14,8 @@ public class PendingState extends StateHandler implements State { case FAILED -> handleFailed(commandService, taskId); case RUNNING -> handleStart(taskService, commandService, taskId); case FINISHED -> handleFinish(commandService, taskId); - default -> throw new IllegalStateException("Unexpected value: " + StateEnum.getStateEnumByState(newState)); + default -> throw new IllegalStateException(taskId + " meets unexpected value: " + + StateEnum.getStateEnumByState(newState)); }; } } diff --git a/src/main/java/com/realtime/protection/server/whitelist/WhiteListController.java b/src/main/java/com/realtime/protection/server/whitelist/WhiteListController.java index 5a7c285..daae83f 100644 --- a/src/main/java/com/realtime/protection/server/whitelist/WhiteListController.java +++ b/src/main/java/com/realtime/protection/server/whitelist/WhiteListController.java @@ -165,7 +165,7 @@ public class WhiteListController implements WhiteListControllerApi { // } return ResponseResult.ok() - .setDataMap(whiteListService.updateWhiteListObjectAuditStatus(id, auditStatus)) + .addDataMap(whiteListService.updateWhiteListObjectAuditStatus(id, auditStatus)) .setData("whiteobj_id", id); } diff --git a/src/main/resources/config/application-dev.yml b/src/main/resources/config/application-dev.yml index 592b8e4..ea08a1e 100644 --- a/src/main/resources/config/application-dev.yml +++ b/src/main/resources/config/application-dev.yml @@ -1,5 +1,7 @@ server: - port: 8080 + port: 8081 + servlet: + context-path: /api/v1 logging: level: @@ -29,9 +31,6 @@ spring: primary: mysql strict: true grace-destroy: true - mvc: - servlet: - path: /api/v1 jackson: default-property-inclusion: non_null @@ -49,7 +48,12 @@ task: springdoc: api-docs: enabled: true - path: /api-docs + path: /v3/api-docs swagger-ui: - path: /swagger - packages-to-scan: com.realtime.protection.server \ No newline at end of file + path: /swagger-ui.html + packages-to-scan: com.realtime.protection.server + +knife4j: + enable: true + setting: + language: zh_cn \ No newline at end of file diff --git a/src/main/resources/config/application-prod.yml b/src/main/resources/config/application-prod.yml index 29111bb..693daa0 100644 --- a/src/main/resources/config/application-prod.yml +++ b/src/main/resources/config/application-prod.yml @@ -1,5 +1,7 @@ server: - port: 80 + port: 8081 + servlet: + context-path: /api/v1 logging: level: @@ -29,9 +31,6 @@ spring: primary: mysql strict: true grace-destroy: true - mvc: - servlet: - path: /api/v1 jackson: default-property-inclusion: non_null @@ -41,8 +40,8 @@ mybatis: task: pool: core-pool-size: 20 - max-pool-size: 100 - queue-capacity: 100 + max-pool-size: 400 + queue-capacity: 400 keep-alive-seconds: 120 springdoc: diff --git a/src/main/resources/config/application-test.yml b/src/main/resources/config/application-test.yml index 5e790ed..f59f1ab 100644 --- a/src/main/resources/config/application-test.yml +++ b/src/main/resources/config/application-test.yml @@ -1,5 +1,7 @@ server: port: 8081 + servlet: + context-path: /api/v1 logging: level: @@ -29,9 +31,6 @@ spring: primary: mysql strict: false grace-destroy: true - mvc: - servlet: - path: /api/v1 jackson: default-property-inclusion: non_null @@ -40,9 +39,9 @@ mybatis: task: pool: - core-pool-size: 20 + core-pool-size: 50 max-pool-size: 100 - queue-capacity: 100 + queue-capacity: 50 keep-alive-seconds: 120 springdoc: diff --git a/src/main/resources/mappers/CommandMapper.xml b/src/main/resources/mappers/CommandMapper.xml index 0ff2b16..cfd2efb 100644 --- a/src/main/resources/mappers/CommandMapper.xml +++ b/src/main/resources/mappers/CommandMapper.xml @@ -9,8 +9,8 @@ MASK_SRC_IP, MASK_SRC_PORT, MASK_DST_IP, MASK_DST_PORT, MASK_PROTOCOL, VALID_TIME, INVALID_TIME, IS_VALID, SEND_TIMES, SUCCESS_TIMES, CREATE_TIME, LAST_UPDATE, IS_DELETED) - values (UUID(), #{info.taskId}, #{info.taskAct}, #{info.frequency}, - #{info.fiveTupleWithMask.addrType}, + values (#{info.UUID}, #{info.taskId}, #{info.taskAct}, #{info.frequency}, + DEFAULT, #{info.fiveTupleWithMask.sourceIP}, #{info.fiveTupleWithMask.sourcePort}, #{info.fiveTupleWithMask.destinationIP}, #{info.fiveTupleWithMask.destinationPort}, #{info.fiveTupleWithMask.protocolNum}, @@ -28,8 +28,8 @@ SEND_TIMES, SUCCESS_TIMES, CREATE_TIME, LAST_UPDATE, IS_DELETED) values - (UUID(), #{info.taskId}, #{info.taskAct}, #{info.frequency}, - #{info.fiveTupleWithMask.addrType}, + (#{info.UUID}, #{info.taskId}, #{info.taskAct}, #{info.frequency}, + DEFAULT, #{info.fiveTupleWithMask.sourceIP}, #{info.fiveTupleWithMask.sourcePort}, #{info.fiveTupleWithMask.destinationIP}, #{info.fiveTupleWithMask.destinationPort}, #{info.fiveTupleWithMask.protocolNum}, @@ -59,6 +59,23 @@ + +