package com.dji.sdk.config;
|
|
import com.dji.sdk.annotations.CloudSDKVersion;
|
import com.dji.sdk.common.*;
|
import com.dji.sdk.config.version.GatewayManager;
|
import com.dji.sdk.exception.CloudSDKErrorEnum;
|
import com.dji.sdk.exception.CloudSDKException;
|
import org.aspectj.lang.JoinPoint;
|
import org.aspectj.lang.annotation.AfterReturning;
|
import org.aspectj.lang.annotation.Aspect;
|
import org.aspectj.lang.annotation.Before;
|
import org.aspectj.lang.reflect.MethodSignature;
|
import org.springframework.stereotype.Component;
|
|
import java.lang.reflect.*;
|
import java.util.Collections;
|
import java.util.List;
|
import java.util.Objects;
|
|
/**
|
* @author sean
|
* @version 1.7
|
* @date 2023/5/22
|
*/
|
@Aspect
|
@Component
|
public class CloudSDKHandler {
|
|
@Before("execution(public * com.dji.sdk.cloudapi.*.api.*.*(com.dji.sdk.config.version.GatewayManager, ..))")
|
public void checkCloudSDK(JoinPoint point) {
|
GatewayManager deviceSDK = (GatewayManager) point.getArgs()[0];
|
CloudSDKVersion since = ((MethodSignature) point.getSignature()).getMethod().getDeclaredAnnotation(CloudSDKVersion.class);
|
if (Objects.isNull(since)) {
|
return;
|
}
|
if (!deviceSDK.isTypeSupport(since)) {
|
throw new CloudSDKException(CloudSDKErrorEnum.DEVICE_TYPE_NOT_SUPPORT);
|
}
|
if (!deviceSDK.isVersionSupport(since)) {
|
throw new CloudSDKException(CloudSDKErrorEnum.DEVICE_VERSION_NOT_SUPPORT);
|
}
|
}
|
|
@Before("execution(public * com.dji.sdk.cloudapi.*.api.*.*(com.dji.sdk.config.version.GatewayManager, com.dji.sdk.common.BaseModel+))")
|
public void checkRequest(JoinPoint point) {
|
Common.validateModel((BaseModel) point.getArgs()[1], (GatewayManager) point.getArgs()[0]);
|
}
|
|
@AfterReturning(value = "execution(public com.dji.sdk.common.HttpResultResponse+ com.dji.sdk.cloudapi.*.api.*.*(..))", returning = "response")
|
public void checkResponse(JoinPoint point, HttpResultResponse response) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
|
if (null == response) {
|
throw new CloudSDKException(CloudSDKErrorEnum.INVALID_PARAMETER, "The return value cannot be null.");
|
}
|
Method method = ((MethodSignature) point.getSignature()).getMethod();
|
if (method.getGenericReturnType() instanceof Class) {
|
if (null == response.getData()) {
|
response.setData("");
|
}
|
return;
|
}
|
checkClassType((ParameterizedType) method.getGenericReturnType(), response);
|
validData(response.getData(), point.getArgs()[0]);
|
}
|
|
private void checkClassType(ParameterizedType type, HttpResultResponse response) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
|
Type actualType = type.getActualTypeArguments()[0];
|
Class typeClass = actualType instanceof Class ? (Class) actualType : (Class) ((ParameterizedType) actualType).getRawType();
|
if (null == response.getData()) {
|
if (List.class.isAssignableFrom(typeClass)) {
|
response.setData(Collections.emptyList());
|
return;
|
}
|
response.setData(typeClass.getDeclaredConstructor().newInstance());
|
return;
|
}
|
boolean isAssignableFrom = typeClass.isAssignableFrom(response.getData().getClass());
|
if (!isAssignableFrom) {
|
throw new CloudSDKException(CloudSDKErrorEnum.INVALID_PARAMETER);
|
}
|
}
|
|
private void validData(Object data, Object arg) {
|
if (data instanceof BaseModel) {
|
Common.validateModel((BaseModel) data);
|
return;
|
}
|
if (data instanceof PaginationData) {
|
List<BaseModel> list = ((PaginationData) data).getList();
|
if (null == list) {
|
((PaginationData) data).setList(Collections.EMPTY_LIST);
|
try {
|
Field page = arg.getClass().getDeclaredField("page");
|
Field pageSize = arg.getClass().getDeclaredField("pageSize");
|
page.setAccessible(true);
|
pageSize.setAccessible(true);
|
((PaginationData) data).setPagination(
|
new Pagination().setPage((int) page.get(arg)).setPageSize((int) pageSize.get(arg)));
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
throw new CloudSDKException(CloudSDKErrorEnum.INVALID_PARAMETER, e.getMessage());
|
}
|
return;
|
}
|
for (BaseModel model : list) {
|
Common.validateModel(model);
|
}
|
}
|
}
|
}
|