package com.dji.sdk.cloudapi.property.api; import com.dji.sdk.annotations.CloudSDKVersion; import com.dji.sdk.cloudapi.property.PropertySetEnum; import com.dji.sdk.common.BaseModel; import com.dji.sdk.common.Common; import com.dji.sdk.config.version.GatewayManager; import com.dji.sdk.config.version.GatewayTypeEnum; import com.dji.sdk.exception.CloudSDKErrorEnum; import com.dji.sdk.exception.CloudSDKException; import com.dji.sdk.mqtt.property.PropertySetPublish; import com.dji.sdk.mqtt.property.PropertySetReplyResultEnum; import com.fasterxml.jackson.annotation.JsonProperty; import javax.annotation.Resource; import javax.validation.Valid; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; /** * @author sean * @version 1.7 * @date 2023/6/30 */ public abstract class AbstractPropertyService { @Resource private PropertySetPublish propertySetPublish; /** * Device property set * @param gateway * @param propertyEnum * @param request * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public PropertySetReplyResultEnum propertySet(GatewayManager gateway, PropertySetEnum propertyEnum, BaseModel request) { checkCondition(gateway, propertyEnum, request); Common.validateModel(request); Field[] fields = request.getClass().getDeclaredFields(); if (fields.length > 1 || null == fields[0].getDeclaredAnnotation(Valid.class)) { return propertySetPublish.publish(gateway.getGatewaySn(), request); } try { Map map = new HashMap<>(); fields[0].setAccessible(true); Object child = fields[0].get(request); for (Field field : ((Class) fields[0].getGenericType()).getDeclaredFields()) { field.setAccessible(true); Object value = field.get(child); if (Objects.isNull(value)) { continue; } map.put(Optional.ofNullable(field.getDeclaredAnnotation(JsonProperty.class)) .map(JsonProperty::value).orElse(field.getName()), value); field.setAccessible(false); PropertySetReplyResultEnum result = propertySetPublish.publish( gateway.getGatewaySn(), Map.of(propertyEnum.getProperty(), map)); if (PropertySetReplyResultEnum.SUCCESS != result) { return result; } map.clear(); } fields[0].setAccessible(false); } catch (IllegalAccessException e) { throw new CloudSDKException(e); } return PropertySetReplyResultEnum.SUCCESS; } private void checkCondition(GatewayManager gateway, PropertySetEnum propertyEnum, BaseModel request) { if (Objects.isNull(request) || propertyEnum.getClazz() != request.getClass()) { throw new CloudSDKException(CloudSDKErrorEnum.INVALID_PARAMETER); } if (!propertyEnum.getSupportedDevices().contains(gateway.getType())) { throw new CloudSDKException(CloudSDKErrorEnum.DEVICE_TYPE_NOT_SUPPORT); } if (propertyEnum.isDeprecated() || !gateway.getSdkVersion().isSupported(propertyEnum.getSince())) { throw new CloudSDKException(CloudSDKErrorEnum.DEVICE_VERSION_NOT_SUPPORT); } } }