package com.dji.sdk.common; import com.dji.sdk.annotations.CloudSDKVersion; import com.dji.sdk.config.version.GatewayManager; import com.dji.sdk.exception.CloudSDKErrorEnum; import com.dji.sdk.exception.CloudSDKException; import org.springframework.util.CollectionUtils; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.lang.reflect.Field; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; /** * @author sean * @version 1.7 * @date 2023/5/23 */ public class BaseModel { private final static Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator(); public void valid() { this.valid(null); } public void checkProperty(String fieldName, GatewayManager gateway) { try { Field field = this.getClass().getDeclaredField(fieldName); CloudSDKVersion annotation = field.getDeclaredAnnotation(CloudSDKVersion.class); if (!gateway.isTypeSupport(annotation) || !gateway.isVersionSupport(annotation)) { throw new CloudSDKException(CloudSDKErrorEnum.DEVICE_PROPERTY_NOT_SUPPORT, fieldName); } } catch (NoSuchFieldException e) { throw new CloudSDKException(e); } } public void valid(GatewayManager gateway) { Set<ConstraintViolation<BaseModel>> violations = VALIDATOR.validate(this); if (null != gateway) { Set<String> names = new HashSet<>(); violations = violations.stream().filter(violation -> filterProperty(gateway, violation.getRootBeanClass(), violation.getPropertyPath().toString().split("\\."), 0, true, names)) .collect(Collectors.toSet()); } if (CollectionUtils.isEmpty(violations)) { return; } throw new CloudSDKException(CloudSDKErrorEnum.INVALID_PARAMETER, violations.stream() .map(violation -> violation.getPropertyPath().toString() + violation.getMessage() + ", Current value is: " + violation.getInvalidValue()) .collect(Collectors.joining("; "))); } private boolean filterProperty(GatewayManager gateway, Class clazz, String[] fields, int index, boolean isValid, Set<String> names) { if (!isValid || index == fields.length) { return isValid; } String name = String.join(".", Arrays.copyOf(fields, index + 1)); if (names.contains(name)) { return false; } try { Field field = clazz.getDeclaredField(fields[index]); isValid = gateway.isPropertyValid(field.getAnnotation(CloudSDKVersion.class)); if (!isValid) { names.add(name); } return filterProperty(gateway, field.getType(), fields, index + 1, isValid, names); } catch (NoSuchFieldException e) { throw new CloudSDKException(e); } } }