Commit f9713c4fce9f67a8ef0971970e480ad7347536b4

Authored by AndrewVolosytnykhThingsboard
Committed by GitHub
1 parent b978f0f7

Rest client resources and firmware methods (#4522)

* Added methods to RestClient from Resources and Firmware Controllers

* Improvements according to last master

* Refactored for new entity names, added new method from device profile controller
... ... @@ -19,18 +19,25 @@ import com.fasterxml.jackson.databind.JsonNode;
19 19 import com.fasterxml.jackson.databind.ObjectMapper;
20 20 import com.fasterxml.jackson.databind.node.ObjectNode;
21 21 import org.springframework.core.ParameterizedTypeReference;
  22 +import org.springframework.core.io.ByteArrayResource;
  23 +import org.springframework.core.io.Resource;
22 24 import org.springframework.http.HttpEntity;
  25 +import org.springframework.http.HttpHeaders;
23 26 import org.springframework.http.HttpMethod;
24 27 import org.springframework.http.HttpRequest;
25 28 import org.springframework.http.HttpStatus;
  29 +import org.springframework.http.MediaType;
26 30 import org.springframework.http.ResponseEntity;
27 31 import org.springframework.http.client.ClientHttpRequestExecution;
28 32 import org.springframework.http.client.ClientHttpRequestInterceptor;
29 33 import org.springframework.http.client.ClientHttpResponse;
30 34 import org.springframework.http.client.support.HttpRequestWrapper;
  35 +import org.springframework.util.LinkedMultiValueMap;
  36 +import org.springframework.util.MultiValueMap;
31 37 import org.springframework.util.StringUtils;
32 38 import org.springframework.web.client.HttpClientErrorException;
33 39 import org.springframework.web.client.RestTemplate;
  40 +import org.springframework.web.multipart.MultipartFile;
34 41 import org.thingsboard.common.util.ThingsBoardExecutors;
35 42 import org.thingsboard.rest.client.utils.RestJsonConverter;
36 43 import org.thingsboard.server.common.data.AdminSettings;
... ... @@ -48,6 +55,10 @@ import org.thingsboard.server.common.data.EntitySubtype;
48 55 import org.thingsboard.server.common.data.EntityView;
49 56 import org.thingsboard.server.common.data.EntityViewInfo;
50 57 import org.thingsboard.server.common.data.Event;
  58 +import org.thingsboard.server.common.data.OtaPackage;
  59 +import org.thingsboard.server.common.data.OtaPackageInfo;
  60 +import org.thingsboard.server.common.data.TbResource;
  61 +import org.thingsboard.server.common.data.TbResourceInfo;
51 62 import org.thingsboard.server.common.data.Tenant;
52 63 import org.thingsboard.server.common.data.TenantInfo;
53 64 import org.thingsboard.server.common.data.TenantProfile;
... ... @@ -78,8 +89,10 @@ import org.thingsboard.server.common.data.id.EdgeId;
78 89 import org.thingsboard.server.common.data.id.EntityId;
79 90 import org.thingsboard.server.common.data.id.EntityViewId;
80 91 import org.thingsboard.server.common.data.id.OAuth2ClientRegistrationTemplateId;
  92 +import org.thingsboard.server.common.data.id.OtaPackageId;
81 93 import org.thingsboard.server.common.data.id.RuleChainId;
82 94 import org.thingsboard.server.common.data.id.RuleNodeId;
  95 +import org.thingsboard.server.common.data.id.TbResourceId;
83 96 import org.thingsboard.server.common.data.id.TenantId;
84 97 import org.thingsboard.server.common.data.id.TenantProfileId;
85 98 import org.thingsboard.server.common.data.id.UserId;
... ... @@ -91,6 +104,8 @@ import org.thingsboard.server.common.data.kv.TsKvEntry;
91 104 import org.thingsboard.server.common.data.oauth2.OAuth2ClientInfo;
92 105 import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate;
93 106 import org.thingsboard.server.common.data.oauth2.OAuth2ClientsParams;
  107 +import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
  108 +import org.thingsboard.server.common.data.ota.OtaPackageType;
94 109 import org.thingsboard.server.common.data.page.PageData;
95 110 import org.thingsboard.server.common.data.page.PageLink;
96 111 import org.thingsboard.server.common.data.page.SortOrder;
... ... @@ -127,9 +142,9 @@ import java.util.HashMap;
127 142 import java.util.List;
128 143 import java.util.Map;
129 144 import java.util.Optional;
  145 +import java.util.UUID;
130 146 import java.util.concurrent.ConcurrentHashMap;
131 147 import java.util.concurrent.ExecutorService;
132   -import java.util.concurrent.Executors;
133 148 import java.util.concurrent.Future;
134 149 import java.util.stream.Collectors;
135 150
... ... @@ -147,7 +162,6 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
147 162 private final ObjectMapper objectMapper = new ObjectMapper();
148 163 private ExecutorService service = ThingsBoardExecutors.newWorkStealingPool(10, getClass());
149 164
150   -
151 165 protected static final String ACTIVATE_TOKEN_REGEX = "/api/noauth/activate?activateToken=";
152 166
153 167 public RestClient(String baseURL) {
... ... @@ -1238,6 +1252,21 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
1238 1252 HttpEntity.EMPTY, Device.class, tenantId, deviceId).getBody();
1239 1253 }
1240 1254
  1255 + public Long countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(OtaPackageType otaPackageType, DeviceProfileId deviceProfileId) {
  1256 + Map<String, String> params = new HashMap<>();
  1257 + params.put("otaPackageType", otaPackageType.name());
  1258 + params.put("deviceProfileId", deviceProfileId.getId().toString());
  1259 +
  1260 + return restTemplate.exchange(
  1261 + baseURL + "/api/devices/count/{otaPackageType}?deviceProfileId={deviceProfileId}",
  1262 + HttpMethod.GET,
  1263 + HttpEntity.EMPTY,
  1264 + new ParameterizedTypeReference<Long>() {
  1265 + },
  1266 + params
  1267 + ).getBody();
  1268 + }
  1269 +
1241 1270 @Deprecated
1242 1271 public Device createDevice(String name, String type) {
1243 1272 Device device = new Device();
... ... @@ -2830,6 +2859,176 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
2830 2859 restTemplate.postForEntity(baseURL + "/api/edge/sync/{edgeId}", null, EdgeId.class, params);
2831 2860 }
2832 2861
  2862 + public ResponseEntity<Resource> downloadResource(TbResourceId resourceId) {
  2863 + Map<String, String> params = new HashMap<>();
  2864 + params.put("resourceId", resourceId.getId().toString());
  2865 +
  2866 + return restTemplate.exchange(
  2867 + baseURL + "/api/resource/{resourceId}/download",
  2868 + HttpMethod.GET,
  2869 + HttpEntity.EMPTY,
  2870 + new ParameterizedTypeReference<>() {},
  2871 + params
  2872 + );
  2873 + }
  2874 +
  2875 + public TbResourceInfo getResourceInfoById(TbResourceId resourceId) {
  2876 + Map<String, String> params = new HashMap<>();
  2877 + params.put("resourceId", resourceId.getId().toString());
  2878 +
  2879 + return restTemplate.exchange(
  2880 + baseURL + "/api/resource/info/{resourceId}",
  2881 + HttpMethod.GET,
  2882 + HttpEntity.EMPTY,
  2883 + new ParameterizedTypeReference<TbResourceInfo>() {},
  2884 + params
  2885 + ).getBody();
  2886 + }
  2887 +
  2888 + public TbResource getResourceId(TbResourceId resourceId) {
  2889 + Map<String, String> params = new HashMap<>();
  2890 + params.put("resourceId", resourceId.getId().toString());
  2891 +
  2892 + return restTemplate.exchange(
  2893 + baseURL + "/api/resource/{resourceId}",
  2894 + HttpMethod.GET,
  2895 + HttpEntity.EMPTY,
  2896 + new ParameterizedTypeReference<TbResource>() {},
  2897 + params
  2898 + ).getBody();
  2899 + }
  2900 +
  2901 + public TbResource saveResource(TbResource resource) {
  2902 + return restTemplate.postForEntity(
  2903 + baseURL + "/api/resource",
  2904 + resource,
  2905 + TbResource.class
  2906 + ).getBody();
  2907 + }
  2908 +
  2909 + public PageData<TbResourceInfo> getResources(PageLink pageLink) {
  2910 + Map<String, String> params = new HashMap<>();
  2911 + addPageLinkToParam(params, pageLink);
  2912 + return restTemplate.exchange(
  2913 + baseURL + "/api/resource?" + getUrlParams(pageLink),
  2914 + HttpMethod.GET,
  2915 + HttpEntity.EMPTY,
  2916 + new ParameterizedTypeReference<PageData<TbResourceInfo>>() {},
  2917 + params
  2918 + ).getBody();
  2919 + }
  2920 +
  2921 + public void deleteResource(TbResourceId resourceId) {
  2922 + restTemplate.delete("/api/resource/{resourceId}", resourceId.getId().toString());
  2923 + }
  2924 +
  2925 + public ResponseEntity<Resource> downloadOtaPackage(OtaPackageId otaPackageId) {
  2926 + Map<String, String> params = new HashMap<>();
  2927 + params.put("otaPackageId", otaPackageId.getId().toString());
  2928 +
  2929 + return restTemplate.exchange(
  2930 + baseURL + "/api/otaPackage/{otaPackageId}/download",
  2931 + HttpMethod.GET,
  2932 + HttpEntity.EMPTY,
  2933 + new ParameterizedTypeReference<>() {},
  2934 + params
  2935 + );
  2936 + }
  2937 +
  2938 + public OtaPackageInfo getOtaPackageInfoById(OtaPackageId otaPackageId) {
  2939 + Map<String, String> params = new HashMap<>();
  2940 + params.put("otaPackageId", otaPackageId.getId().toString());
  2941 +
  2942 + return restTemplate.exchange(
  2943 + baseURL + "/api/otaPackage/info/{otaPackageId}",
  2944 + HttpMethod.GET,
  2945 + HttpEntity.EMPTY,
  2946 + new ParameterizedTypeReference<OtaPackageInfo>() {},
  2947 + params
  2948 + ).getBody();
  2949 + }
  2950 +
  2951 + public OtaPackage getOtaPackageById(OtaPackageId otaPackageId) {
  2952 + Map<String, String> params = new HashMap<>();
  2953 + params.put("otaPackageId", otaPackageId.getId().toString());
  2954 +
  2955 + return restTemplate.exchange(
  2956 + baseURL + "/api/otaPackage/{otaPackageId}",
  2957 + HttpMethod.GET,
  2958 + HttpEntity.EMPTY,
  2959 + new ParameterizedTypeReference<OtaPackage>() {},
  2960 + params
  2961 + ).getBody();
  2962 + }
  2963 +
  2964 + public OtaPackageInfo saveOtaPackageInfo(OtaPackageInfo otaPackageInfo) {
  2965 + return restTemplate.postForEntity(baseURL + "/api/otaPackage", otaPackageInfo, OtaPackageInfo.class).getBody();
  2966 + }
  2967 +
  2968 + public OtaPackage saveOtaPackageData(OtaPackageId otaPackageId, String checkSum, ChecksumAlgorithm checksumAlgorithm, MultipartFile file) throws Exception {
  2969 + HttpHeaders header = new HttpHeaders();
  2970 + header.setContentType(MediaType.MULTIPART_FORM_DATA);
  2971 +
  2972 + MultiValueMap<String, String> fileMap = new LinkedMultiValueMap<>();
  2973 + fileMap.add(HttpHeaders.CONTENT_DISPOSITION, "form-data; name=file; filename=" + file.getName());
  2974 + HttpEntity<ByteArrayResource> fileEntity = new HttpEntity<>(new ByteArrayResource(file.getBytes()), fileMap);
  2975 +
  2976 + MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
  2977 + body.add("file", fileEntity);
  2978 + HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, header);
  2979 +
  2980 + Map<String, String> params = new HashMap<>();
  2981 + params.put("otaPackageId", otaPackageId.getId().toString());
  2982 + params.put("checksumAlgorithm", checksumAlgorithm.name());
  2983 + String url = "/api/otaPackage/{otaPackageId}?checksumAlgorithm={checksumAlgorithm}";
  2984 +
  2985 + if(checkSum != null) {
  2986 + url += "&checkSum={checkSum}";
  2987 + }
  2988 +
  2989 + return restTemplate.postForEntity(
  2990 + baseURL + url, requestEntity, OtaPackage.class, params
  2991 + ).getBody();
  2992 + }
  2993 +
  2994 + public PageData<OtaPackageInfo> getOtaPackages(PageLink pageLink) {
  2995 + Map<String, String> params = new HashMap<>();
  2996 + addPageLinkToParam(params, pageLink);
  2997 +
  2998 + return restTemplate.exchange(
  2999 + baseURL + "/api/otaPackages?" + getUrlParams(pageLink),
  3000 + HttpMethod.GET,
  3001 + HttpEntity.EMPTY,
  3002 + new ParameterizedTypeReference<PageData<OtaPackageInfo>>() {
  3003 + },
  3004 + params
  3005 + ).getBody();
  3006 + }
  3007 +
  3008 + public PageData<OtaPackageInfo> getOtaPackages(DeviceProfileId deviceProfileId,
  3009 + OtaPackageType otaPackageType,
  3010 + boolean hasData,
  3011 + PageLink pageLink) {
  3012 + Map<String, String> params = new HashMap<>();
  3013 + params.put("hasData", String.valueOf(hasData));
  3014 + params.put("deviceProfileId", deviceProfileId.getId().toString());
  3015 + params.put("type", otaPackageType.name());
  3016 + addPageLinkToParam(params, pageLink);
  3017 +
  3018 + return restTemplate.exchange(
  3019 + baseURL + "/api/otaPackages/{deviceProfileId}/{type}/{hasData}?" + getUrlParams(pageLink),
  3020 + HttpMethod.GET,
  3021 + HttpEntity.EMPTY,
  3022 + new ParameterizedTypeReference<PageData<OtaPackageInfo>>() {
  3023 + },
  3024 + params
  3025 + ).getBody();
  3026 + }
  3027 +
  3028 + public void deleteOtaPackage(OtaPackageId otaPackageId) {
  3029 + restTemplate.delete(baseURL + "/api/otaPackage/{otaPackageId}", otaPackageId.getId().toString());
  3030 + }
  3031 +
2833 3032 @Deprecated
2834 3033 public Optional<JsonNode> getAttributes(String accessToken, String clientKeys, String sharedKeys) {
2835 3034 Map<String, String> params = new HashMap<>();
... ...