From 34462a418c81d7b06941f332f32fd1a942eed8dd Mon Sep 17 00:00:00 2001 From: HuangXin Date: Sat, 10 Oct 2020 08:43:18 +0800 Subject: [PATCH] =?UTF-8?q?OCT=20REM:=201.=20=E5=A2=9E=E5=8A=A0startDispos?= =?UTF-8?q?e=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DisposeTaskController.java | 218 ++++++++++++------ .../pojo/dto/protocol/task/DisposeObject.java | 41 ++++ .../protocol/task/DisposeTaskStartReq.java | 69 ++++++ .../protocol/task/DisposeTaskStartRsp.java | 26 +++ .../pojo/dto/protocol/task/TaskStartInfo.java | 37 +++ .../validation/valids/ValidDisposeObject.java | 43 ++++ .../valids/impl/ValidDisposeObjectImpl.java | 70 ++++++ 7 files changed, 429 insertions(+), 75 deletions(-) create mode 100644 src/main/java/com/dispose/pojo/dto/protocol/task/DisposeObject.java create mode 100644 src/main/java/com/dispose/pojo/dto/protocol/task/DisposeTaskStartReq.java create mode 100644 src/main/java/com/dispose/pojo/dto/protocol/task/DisposeTaskStartRsp.java create mode 100644 src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartInfo.java create mode 100644 src/main/java/com/dispose/validation/valids/ValidDisposeObject.java create mode 100644 src/main/java/com/dispose/validation/valids/impl/ValidDisposeObjectImpl.java diff --git a/src/main/java/com/dispose/controller/DisposeTaskController.java b/src/main/java/com/dispose/controller/DisposeTaskController.java index 21356f6e..7f31bca0 100644 --- a/src/main/java/com/dispose/controller/DisposeTaskController.java +++ b/src/main/java/com/dispose/controller/DisposeTaskController.java @@ -13,11 +13,15 @@ import com.dispose.pojo.dto.protocol.base.IdArraysReq; import com.dispose.pojo.dto.protocol.base.ProtocolReqDTO; import com.dispose.pojo.dto.protocol.base.ProtocolRespDTO; import com.dispose.pojo.dto.protocol.device.manager.BasePagesGetReq; +import com.dispose.pojo.dto.protocol.task.DisposeObject; +import com.dispose.pojo.dto.protocol.task.DisposeTaskStartReq; +import com.dispose.pojo.dto.protocol.task.DisposeTaskStartRsp; import com.dispose.pojo.dto.protocol.task.GetDeviceTaskDetail; import com.dispose.pojo.dto.protocol.task.GetTaskDetail; import com.dispose.pojo.dto.protocol.task.GetTaskRsp; import com.dispose.pojo.dto.protocol.task.IpTaskStartReq; import com.dispose.pojo.dto.protocol.task.IpTaskStartRsp; +import com.dispose.pojo.dto.protocol.task.TaskStartInfo; import com.dispose.pojo.dto.protocol.task.TaskStartMulRsp; import com.dispose.pojo.dto.protocol.task.TaskStopItem; import com.dispose.pojo.dto.protocol.task.TaskStopRsp; @@ -80,6 +84,70 @@ public class DisposeTaskController { @Resource private UserAccountService userAccountService; + @PostMapping("/startDispose") + @ResponseBody + @ApiOperation("启动处置任务") + + public ProtocolRespDTO startDisposeTask(@Validated(ValidGroups.TaskStartReqValid.class) + @RequestBody ProtocolReqDTO mr, + @NotNull @RequestHeader HttpHeaders headers) { + DisposeTaskStartReq req = mr.getMsgContent(); + Long devId = Long.parseLong(Optional.ofNullable(req.getDeviceId()).orElse("-1")); + Long aId = userAccountService.getUserIdByAuthHead(Objects.requireNonNull(headers.get("Authorization")).get(0)); + DisposeCapacityType capType = CommonEnumHandler.codeOf(DisposeCapacityType.class, req.getType()); + String endTime = String.valueOf(req.getDisposeTime()); + NetflowDirection netDir = CommonEnumHandler.codeOf(NetflowDirection.class, + Optional.ofNullable(req.getFlowDirection()).orElse(2)); + Long attackType = DDoSAttackType.getTypeMaskFromAttackType(Optional.ofNullable(req.getAttackType()) + .orElse(new Integer[]{DDoSAttackType.ALL_ATTACKS.getValue()})); + Integer flowBand = Optional.ofNullable(req.getFlowBandwidth()) + .orElse(DisposeConfigValue.DEFAULT_DISPOSE_BANDWIDTH); + + DisposeTaskStartRsp rspInfo = DisposeTaskStartRsp.builder() + .items(new ArrayList<>()) + .build(); + + for (DisposeObject v : req.getDisposeObjects()) { + + DisposeObjectType t = CommonEnumHandler.codeOf(DisposeObjectType.class, v.getObjectType()); + // 构造处置任务参数 + DisposeTask task = DisposeTask.builder() + .deviceId(devId) + .accountId(aId) + .disposeCapacity(capType) + .disposeObject(Helper.ipAddressNormalize(v.getDisposeObject())) + .objectType(t) + .planEndTime(endTime) + .flowDirection(netDir) + .attackType(attackType) + .flowBandWidth(flowBand) + .build(); + + // 创建处置任务 + MulReturnType ret = disposeTaskService.createTask(task); + + // 设置返回消息 + TaskStartInfo rspItem = TaskStartInfo.builder() + .disposeObject(v.getDisposeObject()) + .objectType(v.getObjectType()) + .build(); + + // 启动任务成功 + if (ret.getFirstParam() == ErrorCode.ERR_OK || + ret.getFirstParam() == ErrorCode.ERR_TASKRUNNING) { + rspItem.setTaskId(ret.getSecondParam().getId().toString()); + rspItem.setExpireTime(ret.getSecondParam().getPlanEndTime()); + } + + rspItem.setStatus(ret.getFirstParam().getCode()); + rspItem.setMessage(new String[]{ret.getFirstParam().getMsg()}); + + rspInfo.getItems().add(rspItem); + } + + return ProtocolRespDTO.result(ErrorCode.ERR_OK, rspInfo); + } + /** * Start task protocol resp dto. * @@ -97,31 +165,31 @@ public class DisposeTaskController { // 构造处置任务参数 DisposeTask task = DisposeTask.builder() - .deviceId(Long.parseLong(Optional.ofNullable(req.getId()).orElse("-1"))) - .accountId(userAccountService.getUserIdByAuthHead(Objects.requireNonNull(headers.get("Authorization")) - .get(0))) - .disposeCapacity(CommonEnumHandler.codeOf(DisposeCapacityType.class, - req.getType())) - .disposeObject(Helper.ipAddressNormalize(req.getDisposeIp())) - .objectType(DisposeObjectType.IP) - .planEndTime(String.valueOf(req.getDisposeTime())) - .flowDirection(CommonEnumHandler.codeOf(NetflowDirection.class, - Optional.ofNullable(req.getFlowDirection()) - .orElse(2))) - .attackType(DDoSAttackType.getTypeMaskFromAttackType( - Optional.ofNullable(req.getAttackType()) - .orElse(new Integer[]{DDoSAttackType.ALL_ATTACKS.getValue()}))) - .flowBandWidth(Optional.ofNullable(req.getFlowBandwidth()) - .orElse(DisposeConfigValue.DEFAULT_DISPOSE_BANDWIDTH)) - .build(); + .deviceId(Long.parseLong(Optional.ofNullable(req.getId()).orElse("-1"))) + .accountId(userAccountService.getUserIdByAuthHead(Objects.requireNonNull(headers.get("Authorization")) + .get(0))) + .disposeCapacity(CommonEnumHandler.codeOf(DisposeCapacityType.class, + req.getType())) + .disposeObject(Helper.ipAddressNormalize(req.getDisposeIp())) + .objectType(DisposeObjectType.IP) + .planEndTime(String.valueOf(req.getDisposeTime())) + .flowDirection(CommonEnumHandler.codeOf(NetflowDirection.class, + Optional.ofNullable(req.getFlowDirection()) + .orElse(2))) + .attackType(DDoSAttackType.getTypeMaskFromAttackType( + Optional.ofNullable(req.getAttackType()) + .orElse(new Integer[]{DDoSAttackType.ALL_ATTACKS.getValue()}))) + .flowBandWidth(Optional.ofNullable(req.getFlowBandwidth()) + .orElse(DisposeConfigValue.DEFAULT_DISPOSE_BANDWIDTH)) + .build(); // 创建处置任务 MulReturnType ret = disposeTaskService.createTask(task); // 设置返回消息 IpTaskStartRsp rspInfo = IpTaskStartRsp.builder() - .disposeIp(task.getDisposeObject()) - .build(); + .disposeIp(task.getDisposeObject()) + .build(); rspInfo.setStatus(ret.getFirstParam().getCode()); rspInfo.setMessage(new String[]{ret.getFirstParam().getMsg()}); @@ -161,39 +229,39 @@ public class DisposeTaskController { NetflowDirection netDir = CommonEnumHandler.codeOf(NetflowDirection.class, Optional.ofNullable(req.getFlowDirection()).orElse(2)); Long attackType = DDoSAttackType.getTypeMaskFromAttackType(Optional.ofNullable(req.getAttackType()) - .orElse(new Integer[]{DDoSAttackType.ALL_ATTACKS.getValue()})); + .orElse(new Integer[]{DDoSAttackType.ALL_ATTACKS.getValue()})); Integer flowBand = Optional.ofNullable(req.getFlowBandwidth()) - .orElse(DisposeConfigValue.DEFAULT_DISPOSE_BANDWIDTH); + .orElse(DisposeConfigValue.DEFAULT_DISPOSE_BANDWIDTH); TaskStartMulRsp mulRsp = TaskStartMulRsp.builder() - .items(new ArrayList<>()) - .build(); + .items(new ArrayList<>()) + .build(); for (String ip : req.getMulDisposeIp()) { // 构造处置任务参数 DisposeTask task = DisposeTask.builder() - .deviceId(devId) - .accountId(aId) - .disposeCapacity(capType) - .disposeObject(Helper.ipAddressNormalize(ip)) - .objectType(DisposeObjectType.IP) - .planEndTime(endTime) - .flowDirection(netDir) - .attackType(attackType) - .flowBandWidth(flowBand) - .build(); + .deviceId(devId) + .accountId(aId) + .disposeCapacity(capType) + .disposeObject(Helper.ipAddressNormalize(ip)) + .objectType(DisposeObjectType.IP) + .planEndTime(endTime) + .flowDirection(netDir) + .attackType(attackType) + .flowBandWidth(flowBand) + .build(); // 创建处置任务 MulReturnType ret = disposeTaskService.createTask(task); // 设置返回消息 IpTaskStartRsp rspInfo = IpTaskStartRsp.builder() - .disposeIp(ip) - .build(); + .disposeIp(ip) + .build(); // 启动任务成功 if (ret.getFirstParam() == ErrorCode.ERR_OK || - ret.getFirstParam() == ErrorCode.ERR_TASKRUNNING) { + ret.getFirstParam() == ErrorCode.ERR_TASKRUNNING) { rspInfo.setTaskId(ret.getSecondParam().getId().toString()); rspInfo.setExpireTime(ret.getSecondParam().getPlanEndTime()); } @@ -234,13 +302,13 @@ public class DisposeTaskController { // 停止成功 if (ret.getFirstParam() == ErrorCode.ERR_OK) { rspInfo.setDisposeDevice(ret.getSecondParam().getDeviceTask().stream() - .map(DeviceTask::getDeviceId) - .map(String::valueOf) - .toArray(String[]::new)); + .map(DeviceTask::getDeviceId) + .map(String::valueOf) + .toArray(String[]::new)); rspInfo.setType(ret.getSecondParam().getDisposeCapacity().getValue()); rspInfo.setDisposeIp(ret.getSecondParam().getDisposeObject()); rspInfo.setLeftTime(String.valueOf(Math.abs( - Helper.getTimestampDiffNow(ret.getSecondParam().getPlanEndTime())) / 60)); + Helper.getTimestampDiffNow(ret.getSecondParam().getPlanEndTime())) / 60)); } rspInfo.setTaskId(tId); @@ -263,27 +331,27 @@ public class DisposeTaskController { @ResponseBody @ApiOperation("获取处置任务") public ProtocolRespDTO getAllDisposeTask( - @Validated(ValidGroups.ProtocolCommonValid.class) - @RequestBody ProtocolReqDTO mr + @Validated(ValidGroups.ProtocolCommonValid.class) + @RequestBody ProtocolReqDTO mr ) { GetTaskRsp rspInfo = GetTaskRsp.builder().build(); List getTaskDetail = new ArrayList<>(); //获取TaskId列表 List reqTaskIds = Arrays.stream(Optional.ofNullable(mr.getMsgContent().getTaskId()) - .orElse(new String[]{})). - map(Long::parseLong).collect(Collectors.toList()); + .orElse(new String[]{})). + map(Long::parseLong).collect(Collectors.toList()); //获取所有可用处置任务 List taskList = disposeTaskService.getAllDisposeTask(); List idArray = taskList.stream().filter(v -> reqTaskIds.size() == 0 || reqTaskIds.contains(v.getId())) - .map(DisposeTask::getId).collect(Collectors.toList()); + .map(DisposeTask::getId).collect(Collectors.toList()); if (idArray.size() > 0) { MulReturnType, List> ret = - disposeTaskService.getPageDisposeTask(idArray, - mr.getMsgContent().getStartPage(), - mr.getMsgContent().getPageSize()); + disposeTaskService.getPageDisposeTask(idArray, + mr.getMsgContent().getStartPage(), + mr.getMsgContent().getPageSize()); // 分页信息 rspInfo.setCurPageNumber(ret.getFirstParam().getPageNum()); @@ -293,29 +361,29 @@ public class DisposeTaskController { ret.getSecondParam().forEach(v -> { GetTaskDetail taskDetail = GetTaskDetail.builder() - .taskId(String.valueOf(v.getId())) - .accountId(String.valueOf(v.getAccountId())) - .disposeCapacity(v.getDisposeCapacity().getValue()) - .disposeIp(v.getDisposeObject()) - .createTime(v.getCreateTime()) - .planEndTime(v.getPlanEndTime()) - .endTime(v.getEndTime()) - .flowDirection(v.getFlowDirection().getValue()) - .attackType(v.getAttackType().toString()) - .flowBandWidth(v.getFlowBandWidth()) - .currentStatus(v.getCurrentStatus().getValue()) - .deviceTask(new ArrayList<>()) - .build(); + .taskId(String.valueOf(v.getId())) + .accountId(String.valueOf(v.getAccountId())) + .disposeCapacity(v.getDisposeCapacity().getValue()) + .disposeIp(v.getDisposeObject()) + .createTime(v.getCreateTime()) + .planEndTime(v.getPlanEndTime()) + .endTime(v.getEndTime()) + .flowDirection(v.getFlowDirection().getValue()) + .attackType(v.getAttackType().toString()) + .flowBandWidth(v.getFlowBandWidth()) + .currentStatus(v.getCurrentStatus().getValue()) + .deviceTask(new ArrayList<>()) + .build(); taskDetail.setStatus(ErrorCode.ERR_OK.getCode()); taskDetail.setMessage(new String[]{ErrorCode.ERR_OK.getMsg()}); v.getDeviceTask().forEach(k -> { GetDeviceTaskDetail deviceTaskDetail = GetDeviceTaskDetail.builder() - .devTaskId(String.valueOf(k.getId())) - .devId(String.valueOf(k.getDeviceId())) - .externId(String.valueOf(k.getExternId())) - .status(k.getStatus()) - .build(); + .devTaskId(String.valueOf(k.getId())) + .devId(String.valueOf(k.getDeviceId())) + .externId(String.valueOf(k.getExternId())) + .status(k.getStatus()) + .build(); taskDetail.getDeviceTask().add(deviceTaskDetail); }); @@ -326,19 +394,19 @@ public class DisposeTaskController { // 设置不存在taskId的错误码 if (reqTaskIds.stream().anyMatch(v -> taskList.stream().noneMatch(k -> k.getId().equals(v)))) { reqTaskIds.stream() - .filter(v -> taskList.stream().noneMatch(k -> k.getId().equals(v))) - .forEach(v -> { - GetTaskDetail td = GetTaskDetail.builder().build(); - td.setTaskId(String.valueOf(v)); - td.setStatus(ErrorCode.ERR_NOSUCHTASK.getCode()); - td.setMessage(new String[]{ErrorCode.ERR_NOSUCHTASK.getMsg()}); - getTaskDetail.add(td); - }); + .filter(v -> taskList.stream().noneMatch(k -> k.getId().equals(v))) + .forEach(v -> { + GetTaskDetail td = GetTaskDetail.builder().build(); + td.setTaskId(String.valueOf(v)); + td.setStatus(ErrorCode.ERR_NOSUCHTASK.getCode()); + td.setMessage(new String[]{ErrorCode.ERR_NOSUCHTASK.getMsg()}); + getTaskDetail.add(td); + }); } // 对返回的信息按照TaskID排序 rspInfo.setItems(getTaskDetail.stream().sorted(Comparator.comparing(GetTaskDetail::getTaskId)) - .collect(Collectors.toList())); + .collect(Collectors.toList())); return ProtocolRespDTO.result(ErrorCode.ERR_OK, rspInfo); } diff --git a/src/main/java/com/dispose/pojo/dto/protocol/task/DisposeObject.java b/src/main/java/com/dispose/pojo/dto/protocol/task/DisposeObject.java new file mode 100644 index 00000000..fa36a0e2 --- /dev/null +++ b/src/main/java/com/dispose/pojo/dto/protocol/task/DisposeObject.java @@ -0,0 +1,41 @@ +package com.dispose.pojo.dto.protocol.task; + +import com.dispose.common.DisposeObjectType; +import com.dispose.validation.group.ValidGroups; +import com.dispose.validation.valids.ValidBaseEnum; +import com.dispose.validation.valids.ValidDisposeObject; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.GroupSequence; +import javax.validation.constraints.NotNull; + +/** + * The type Dispose object. + * + * @author + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +@ValidDisposeObject(groups = ValidGroups.TaskStartReqValid.class) +@GroupSequence({ValidGroups.TaskStartReqValid.class, DisposeObject.class}) +public class DisposeObject { + /** + * The Dispose object. + */ + @NotNull(message = "disposeObject 处置对象不能为空", groups = ValidGroups.TaskStartReqValid.class) + private String disposeObject; + + /** + * The Object type. + */ + @NotNull(message = "objectType 处置类型不能为空", groups = ValidGroups.TaskStartReqValid.class) + @ValidBaseEnum(enumClass = DisposeObjectType.class, groups = ValidGroups.TaskStartReqValid.class) + private Integer objectType; +} diff --git a/src/main/java/com/dispose/pojo/dto/protocol/task/DisposeTaskStartReq.java b/src/main/java/com/dispose/pojo/dto/protocol/task/DisposeTaskStartReq.java new file mode 100644 index 00000000..11ee1302 --- /dev/null +++ b/src/main/java/com/dispose/pojo/dto/protocol/task/DisposeTaskStartReq.java @@ -0,0 +1,69 @@ +package com.dispose.pojo.dto.protocol.task; + +import com.dispose.common.DDoSAttackType; +import com.dispose.common.DisposeCapacityType; +import com.dispose.common.NetflowDirection; +import com.dispose.validation.group.ValidGroups; +import com.dispose.validation.valids.ValidBaseEnum; +import com.dispose.validation.valids.ValidBaseEnumArray; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * The type Dispose task start req. + * + * @author + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class DisposeTaskStartReq { + /** + * The Device id. + */ + private String deviceId; + /** + * The Type. + */ + @NotNull(message = "type 处置类型不能为空", groups = ValidGroups.TaskStartReqCommonValid.class) + @ValidBaseEnum(enumClass = DisposeCapacityType.class, groups = ValidGroups.TaskStartReqCommonValid.class) + private Integer type; + + /** + * The Dispose objects. + */ + @NotNull(message = "disposeObjects 处置对象不能为空", groups = ValidGroups.TaskStartReqCommonValid.class) + @Size(min = 1, message = "disposeObjects 至少需要有一个元素", groups = ValidGroups.TaskStartReqCommonValid.class) + @Valid + private DisposeObject[] disposeObjects; + + /** + * The Dispose time. + */ + @NotNull(message = "disposeTime 处置时间不能为空", groups = ValidGroups.TaskStartReqCommonValid.class) + private Integer disposeTime; + /** + * The Flow direction. + */ + @ValidBaseEnum(enumClass = NetflowDirection.class, groups = ValidGroups.TaskStartReqCommonValid.class) + private Integer flowDirection; + /** + * The Attack type. + */ + @ValidBaseEnumArray(enumClass = DDoSAttackType.class, groups = ValidGroups.TaskStartReqCommonValid.class) + @Size(min = 1, message = "attackType 必须指定最少一种攻击类型", groups = ValidGroups.TaskStartReqCommonValid.class) + private Integer[] attackType; + /** + * The Flow bandwidth. + */ + private Integer flowBandwidth; +} diff --git a/src/main/java/com/dispose/pojo/dto/protocol/task/DisposeTaskStartRsp.java b/src/main/java/com/dispose/pojo/dto/protocol/task/DisposeTaskStartRsp.java new file mode 100644 index 00000000..1062fe37 --- /dev/null +++ b/src/main/java/com/dispose/pojo/dto/protocol/task/DisposeTaskStartRsp.java @@ -0,0 +1,26 @@ +package com.dispose.pojo.dto.protocol.task; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * The type Dispose task start rsp. + * + * @author + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class DisposeTaskStartRsp { + /** + * The Items. + */ + List items; +} diff --git a/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartInfo.java b/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartInfo.java new file mode 100644 index 00000000..48b1b51a --- /dev/null +++ b/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartInfo.java @@ -0,0 +1,37 @@ +package com.dispose.pojo.dto.protocol.task; + +import com.dispose.pojo.dto.protocol.base.BaseIdResp; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * The type Dispose task start rsp. + * + * @author + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Builder +@AllArgsConstructor +@JsonPropertyOrder({"taskId", "disposeObject", "objectType", "expireTime", "status", "message"}) +@JsonInclude(JsonInclude.Include.NON_NULL) + +public class TaskStartInfo extends BaseIdResp { + /** + * The Dispose ip. + */ + private String disposeObject; + + /** + * The Object type. + */ + private Integer objectType; + /** + * The Expire time. + */ + private String expireTime; +} diff --git a/src/main/java/com/dispose/validation/valids/ValidDisposeObject.java b/src/main/java/com/dispose/validation/valids/ValidDisposeObject.java new file mode 100644 index 00000000..64a31233 --- /dev/null +++ b/src/main/java/com/dispose/validation/valids/ValidDisposeObject.java @@ -0,0 +1,43 @@ +package com.dispose.validation.valids; + +import com.dispose.validation.valids.impl.ValidDisposeObjectImpl; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The interface Valid dispose object. + * + * @author + */ +@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint(validatedBy = {ValidDisposeObjectImpl.class}) +public @interface ValidDisposeObject { + /** + * Message string. + * + * @return the string + */ + String message() default ""; + + /** + * Groups class [ ]. + * + * @return the class [ ] + */ + Class[] groups() default {}; + + /** + * Payload class [ ]. + * + * @return the class [ ] + */ + Class[] payload() default {}; +} diff --git a/src/main/java/com/dispose/validation/valids/impl/ValidDisposeObjectImpl.java b/src/main/java/com/dispose/validation/valids/impl/ValidDisposeObjectImpl.java new file mode 100644 index 00000000..44898ccc --- /dev/null +++ b/src/main/java/com/dispose/validation/valids/impl/ValidDisposeObjectImpl.java @@ -0,0 +1,70 @@ +package com.dispose.validation.valids.impl; + +import com.dispose.common.ConstValue; +import com.dispose.common.DisposeObjectType; +import com.dispose.pojo.dto.protocol.task.DisposeObject; +import com.dispose.validation.valids.ValidDisposeObject; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +/** + * The type Valid dispose object. + * + * @author + */ +public class ValidDisposeObjectImpl implements ConstraintValidator { + /** + * The Message. + */ + private String message; + + /** + * Initialize. + * + * @param constraintAnnotation the constraint annotation + */ + @Override + public void initialize(ValidDisposeObject constraintAnnotation) { + this.message = constraintAnnotation.message(); + } + + /** + * Is valid boolean. + * + * @param disposeObject the dispose object + * @param ctx the ctx + * @return the boolean + */ + @Override + public boolean isValid(DisposeObject disposeObject, ConstraintValidatorContext ctx) { + boolean ret = true; + + if (disposeObject == null || disposeObject.getDisposeObject() == null || disposeObject.getObjectType() == null) { + return true; + } + + if(disposeObject.getDisposeObject().length() == 0) { + return true; + } + + List errMsg = new ArrayList<>(); + + // 对 IP 地址进行验证 + if ((disposeObject.getObjectType() & DisposeObjectType.IP.getValue()) != 0) { + if (!Pattern.matches(ConstValue.ipAddrSegmentReg(), disposeObject.getDisposeObject())) { + errMsg.add("字段 disposeObject 包含非法值: " + disposeObject.getDisposeObject()); + ret = false; + } + } + + // 重新设置消息 + ctx.disableDefaultConstraintViolation(); + ctx.buildConstraintViolationWithTemplate(this.message + " " + errMsg.toString()).addConstraintViolation(); + + return ret; + } +}