Commit d27c721bbfd1613d00b79a050edcfb57299d0526

Authored by nickAS21
2 parents d8ea6ac3 43fe84a2

lwm2m: Merge branch 'develop/3.3' into add-models

Showing 23 changed files with 365 additions and 182 deletions
@@ -23,15 +23,15 @@ import org.springframework.web.bind.annotation.RequestMethod; @@ -23,15 +23,15 @@ import org.springframework.web.bind.annotation.RequestMethod;
23 import org.springframework.web.bind.annotation.RequestParam; 23 import org.springframework.web.bind.annotation.RequestParam;
24 import org.springframework.web.bind.annotation.ResponseBody; 24 import org.springframework.web.bind.annotation.ResponseBody;
25 import org.springframework.web.bind.annotation.RestController; 25 import org.springframework.web.bind.annotation.RestController;
  26 +import org.thingsboard.server.common.data.Resource;
  27 +import org.thingsboard.server.common.data.ResourceType;
26 import org.thingsboard.server.common.data.exception.ThingsboardException; 28 import org.thingsboard.server.common.data.exception.ThingsboardException;
27 import org.thingsboard.server.common.data.id.TenantId; 29 import org.thingsboard.server.common.data.id.TenantId;
28 -import org.thingsboard.server.common.data.transport.resource.Resource;  
29 -import org.thingsboard.server.common.data.transport.resource.ResourceType; 30 +import org.thingsboard.server.common.data.page.PageData;
  31 +import org.thingsboard.server.common.data.page.PageLink;
30 import org.thingsboard.server.dao.resource.ResourceService; 32 import org.thingsboard.server.dao.resource.ResourceService;
31 import org.thingsboard.server.queue.util.TbCoreComponent; 33 import org.thingsboard.server.queue.util.TbCoreComponent;
32 34
33 -import java.util.List;  
34 -  
35 @Slf4j 35 @Slf4j
36 @RestController 36 @RestController
37 @TbCoreComponent 37 @TbCoreComponent
@@ -61,21 +61,14 @@ public class ResourceController extends BaseController { @@ -61,21 +61,14 @@ public class ResourceController extends BaseController {
61 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") 61 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
62 @RequestMapping(value = "/resource", method = RequestMethod.GET) 62 @RequestMapping(value = "/resource", method = RequestMethod.GET)
63 @ResponseBody 63 @ResponseBody
64 - public List<Resource> getResources(@RequestParam(required = false) boolean system) throws ThingsboardException {  
65 - try {  
66 - return checkNotNull(resourceService.findResourcesByTenantId(system ? TenantId.SYS_TENANT_ID : getTenantId()));  
67 - } catch (Exception e) {  
68 - throw handleException(e);  
69 - }  
70 - }  
71 -  
72 - @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")  
73 - @RequestMapping(value = "/resource/{resourceType}", method = RequestMethod.GET)  
74 - @ResponseBody  
75 - public List<Resource> getResources(@RequestParam(required = false) boolean system,  
76 - @PathVariable("resourceType") ResourceType resourceType) throws ThingsboardException { 64 + public PageData<Resource> getResources(@RequestParam(required = false) boolean system,
  65 + @RequestParam int pageSize,
  66 + @RequestParam int page,
  67 + @RequestParam(required = false) String sortProperty,
  68 + @RequestParam(required = false) String sortOrder) throws ThingsboardException {
77 try { 69 try {
78 - return checkNotNull(resourceService.findResourcesByTenantIdResourceType(system ? TenantId.SYS_TENANT_ID : getTenantId(), resourceType)); 70 + PageLink pageLink = createPageLink(pageSize, page, null, sortProperty, sortOrder);
  71 + return checkNotNull(resourceService.findResourcesByTenantId(system ? TenantId.SYS_TENANT_ID : getTenantId(), pageLink));
79 } catch (Exception e) { 72 } catch (Exception e) {
80 throw handleException(e); 73 throw handleException(e);
81 } 74 }
@@ -22,14 +22,14 @@ import org.springframework.beans.factory.annotation.Value; @@ -22,14 +22,14 @@ import org.springframework.beans.factory.annotation.Value;
22 import org.springframework.stereotype.Component; 22 import org.springframework.stereotype.Component;
23 import org.springframework.util.StringUtils; 23 import org.springframework.util.StringUtils;
24 import org.thingsboard.server.common.data.Dashboard; 24 import org.thingsboard.server.common.data.Dashboard;
  25 +import org.thingsboard.server.common.data.Resource;
  26 +import org.thingsboard.server.common.data.ResourceType;
25 import org.thingsboard.server.common.data.id.CustomerId; 27 import org.thingsboard.server.common.data.id.CustomerId;
26 import org.thingsboard.server.common.data.id.EntityId; 28 import org.thingsboard.server.common.data.id.EntityId;
27 import org.thingsboard.server.common.data.id.TenantId; 29 import org.thingsboard.server.common.data.id.TenantId;
28 import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate; 30 import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate;
29 import org.thingsboard.server.common.data.rule.RuleChain; 31 import org.thingsboard.server.common.data.rule.RuleChain;
30 import org.thingsboard.server.common.data.rule.RuleChainMetaData; 32 import org.thingsboard.server.common.data.rule.RuleChainMetaData;
31 -import org.thingsboard.server.common.data.transport.resource.Resource;  
32 -import org.thingsboard.server.common.data.transport.resource.ResourceType;  
33 import org.thingsboard.server.common.data.widget.WidgetType; 33 import org.thingsboard.server.common.data.widget.WidgetType;
34 import org.thingsboard.server.common.data.widget.WidgetsBundle; 34 import org.thingsboard.server.common.data.widget.WidgetsBundle;
35 import org.thingsboard.server.dao.dashboard.DashboardService; 35 import org.thingsboard.server.dao.dashboard.DashboardService;
@@ -251,7 +251,6 @@ public class InstallScripts { @@ -251,7 +251,6 @@ public class InstallScripts {
251 } 251 }
252 } 252 }
253 253
254 -  
255 public void loadDemoRuleChains(TenantId tenantId) throws Exception { 254 public void loadDemoRuleChains(TenantId tenantId) throws Exception {
256 try { 255 try {
257 createDefaultRuleChains(tenantId); 256 createDefaultRuleChains(tenantId);
@@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.Device; @@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.Device;
26 import org.thingsboard.server.common.data.DeviceProfile; 26 import org.thingsboard.server.common.data.DeviceProfile;
27 import org.thingsboard.server.common.data.EntityType; 27 import org.thingsboard.server.common.data.EntityType;
28 import org.thingsboard.server.common.data.HasName; 28 import org.thingsboard.server.common.data.HasName;
  29 +import org.thingsboard.server.common.data.Resource;
29 import org.thingsboard.server.common.data.Tenant; 30 import org.thingsboard.server.common.data.Tenant;
30 import org.thingsboard.server.common.data.TenantProfile; 31 import org.thingsboard.server.common.data.TenantProfile;
31 import org.thingsboard.server.common.data.id.DeviceId; 32 import org.thingsboard.server.common.data.id.DeviceId;
@@ -34,7 +35,6 @@ import org.thingsboard.server.common.data.id.EntityId; @@ -34,7 +35,6 @@ import org.thingsboard.server.common.data.id.EntityId;
34 import org.thingsboard.server.common.data.id.RuleChainId; 35 import org.thingsboard.server.common.data.id.RuleChainId;
35 import org.thingsboard.server.common.data.id.TenantId; 36 import org.thingsboard.server.common.data.id.TenantId;
36 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; 37 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
37 -import org.thingsboard.server.common.data.transport.resource.Resource;  
38 import org.thingsboard.server.common.msg.TbMsg; 38 import org.thingsboard.server.common.msg.TbMsg;
39 import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; 39 import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
40 import org.thingsboard.server.common.msg.queue.ServiceType; 40 import org.thingsboard.server.common.msg.queue.ServiceType;
@@ -19,12 +19,12 @@ import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg; @@ -19,12 +19,12 @@ import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg;
19 import org.thingsboard.server.common.data.ApiUsageState; 19 import org.thingsboard.server.common.data.ApiUsageState;
20 import org.thingsboard.server.common.data.Device; 20 import org.thingsboard.server.common.data.Device;
21 import org.thingsboard.server.common.data.DeviceProfile; 21 import org.thingsboard.server.common.data.DeviceProfile;
  22 +import org.thingsboard.server.common.data.Resource;
22 import org.thingsboard.server.common.data.Tenant; 23 import org.thingsboard.server.common.data.Tenant;
23 import org.thingsboard.server.common.data.TenantProfile; 24 import org.thingsboard.server.common.data.TenantProfile;
24 import org.thingsboard.server.common.data.id.EntityId; 25 import org.thingsboard.server.common.data.id.EntityId;
25 import org.thingsboard.server.common.data.id.TenantId; 26 import org.thingsboard.server.common.data.id.TenantId;
26 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; 27 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
27 -import org.thingsboard.server.common.data.transport.resource.Resource;  
28 import org.thingsboard.server.common.msg.TbMsg; 28 import org.thingsboard.server.common.msg.TbMsg;
29 import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; 29 import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
30 import org.thingsboard.server.gen.transport.TransportProtos; 30 import org.thingsboard.server.gen.transport.TransportProtos;
@@ -31,6 +31,8 @@ import org.thingsboard.server.common.data.DataConstants; @@ -31,6 +31,8 @@ import org.thingsboard.server.common.data.DataConstants;
31 import org.thingsboard.server.common.data.Device; 31 import org.thingsboard.server.common.data.Device;
32 import org.thingsboard.server.common.data.DeviceProfile; 32 import org.thingsboard.server.common.data.DeviceProfile;
33 import org.thingsboard.server.common.data.EntityType; 33 import org.thingsboard.server.common.data.EntityType;
  34 +import org.thingsboard.server.common.data.Resource;
  35 +import org.thingsboard.server.common.data.ResourceType;
34 import org.thingsboard.server.common.data.TenantProfile; 36 import org.thingsboard.server.common.data.TenantProfile;
35 import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials; 37 import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
36 import org.thingsboard.server.common.data.device.credentials.ProvisionDeviceCredentialsData; 38 import org.thingsboard.server.common.data.device.credentials.ProvisionDeviceCredentialsData;
@@ -42,8 +44,6 @@ import org.thingsboard.server.common.data.id.TenantId; @@ -42,8 +44,6 @@ import org.thingsboard.server.common.data.id.TenantId;
42 import org.thingsboard.server.common.data.relation.EntityRelation; 44 import org.thingsboard.server.common.data.relation.EntityRelation;
43 import org.thingsboard.server.common.data.security.DeviceCredentials; 45 import org.thingsboard.server.common.data.security.DeviceCredentials;
44 import org.thingsboard.server.common.data.security.DeviceCredentialsType; 46 import org.thingsboard.server.common.data.security.DeviceCredentialsType;
45 -import org.thingsboard.server.common.data.transport.resource.Resource;  
46 -import org.thingsboard.server.common.data.transport.resource.ResourceType;  
47 import org.thingsboard.server.common.msg.EncryptionUtil; 47 import org.thingsboard.server.common.msg.EncryptionUtil;
48 import org.thingsboard.server.common.msg.TbMsg; 48 import org.thingsboard.server.common.msg.TbMsg;
49 import org.thingsboard.server.common.msg.TbMsgDataType; 49 import org.thingsboard.server.common.msg.TbMsgDataType;
@@ -64,7 +64,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequ @@ -64,7 +64,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequ
64 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg; 64 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg;
65 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg; 65 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg;
66 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayResponseMsg; 66 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayResponseMsg;
67 -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesRequestMsg; 67 +import org.thingsboard.server.gen.transport.TransportProtos.GetResourceRequestMsg;
68 import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceRequestMsg; 68 import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceRequestMsg;
69 import org.thingsboard.server.gen.transport.TransportProtos.ProvisionResponseStatus; 69 import org.thingsboard.server.gen.transport.TransportProtos.ProvisionResponseStatus;
70 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg; 70 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg;
@@ -81,14 +81,11 @@ import org.thingsboard.server.service.profile.TbDeviceProfileCache; @@ -81,14 +81,11 @@ import org.thingsboard.server.service.profile.TbDeviceProfileCache;
81 import org.thingsboard.server.service.queue.TbClusterService; 81 import org.thingsboard.server.service.queue.TbClusterService;
82 import org.thingsboard.server.service.state.DeviceStateService; 82 import org.thingsboard.server.service.state.DeviceStateService;
83 83
84 -import java.util.Collections;  
85 -import java.util.List;  
86 import java.util.UUID; 84 import java.util.UUID;
87 import java.util.concurrent.ConcurrentHashMap; 85 import java.util.concurrent.ConcurrentHashMap;
88 import java.util.concurrent.ConcurrentMap; 86 import java.util.concurrent.ConcurrentMap;
89 import java.util.concurrent.locks.Lock; 87 import java.util.concurrent.locks.Lock;
90 import java.util.concurrent.locks.ReentrantLock; 88 import java.util.concurrent.locks.ReentrantLock;
91 -import java.util.stream.Collectors;  
92 89
93 /** 90 /**
94 * Created by ashvayka on 05.10.18. 91 * Created by ashvayka on 05.10.18.
@@ -166,8 +163,8 @@ public class DefaultTransportApiService implements TransportApiService { @@ -166,8 +163,8 @@ public class DefaultTransportApiService implements TransportApiService {
166 } else if (transportApiRequestMsg.hasProvisionDeviceRequestMsg()) { 163 } else if (transportApiRequestMsg.hasProvisionDeviceRequestMsg()) {
167 return Futures.transform(handle(transportApiRequestMsg.getProvisionDeviceRequestMsg()), 164 return Futures.transform(handle(transportApiRequestMsg.getProvisionDeviceRequestMsg()),
168 value -> new TbProtoQueueMsg<>(tbProtoQueueMsg.getKey(), value, tbProtoQueueMsg.getHeaders()), MoreExecutors.directExecutor()); 165 value -> new TbProtoQueueMsg<>(tbProtoQueueMsg.getKey(), value, tbProtoQueueMsg.getHeaders()), MoreExecutors.directExecutor());
169 - } else if (transportApiRequestMsg.hasResourcesRequestMsg()) {  
170 - return Futures.transform(handle(transportApiRequestMsg.getResourcesRequestMsg()), 166 + } else if (transportApiRequestMsg.hasResourceRequestMsg()) {
  167 + return Futures.transform(handle(transportApiRequestMsg.getResourceRequestMsg()),
171 value -> new TbProtoQueueMsg<>(tbProtoQueueMsg.getKey(), value, tbProtoQueueMsg.getHeaders()), MoreExecutors.directExecutor()); 168 value -> new TbProtoQueueMsg<>(tbProtoQueueMsg.getKey(), value, tbProtoQueueMsg.getHeaders()), MoreExecutors.directExecutor());
172 } 169 }
173 return Futures.transform(getEmptyTransportApiResponseFuture(), 170 return Futures.transform(getEmptyTransportApiResponseFuture(),
@@ -365,41 +362,22 @@ public class DefaultTransportApiService implements TransportApiService { @@ -365,41 +362,22 @@ public class DefaultTransportApiService implements TransportApiService {
365 return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setEntityProfileResponseMsg(builder).build()); 362 return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setEntityProfileResponseMsg(builder).build());
366 } 363 }
367 364
368 - private ListenableFuture<TransportApiResponseMsg> handle(GetResourcesRequestMsg requestMsg) { 365 + private ListenableFuture<TransportApiResponseMsg> handle(GetResourceRequestMsg requestMsg) {
369 TenantId tenantId = new TenantId(new UUID(requestMsg.getTenantIdMSB(), requestMsg.getTenantIdLSB())); 366 TenantId tenantId = new TenantId(new UUID(requestMsg.getTenantIdMSB(), requestMsg.getTenantIdLSB()));
370 - TransportProtos.GetResourcesResponseMsg.Builder builder = TransportProtos.GetResourcesResponseMsg.newBuilder();  
371 - String resourceType = requestMsg.getResourceType(); 367 + ResourceType resourceType = ResourceType.valueOf(requestMsg.getResourceType());
372 String resourceId = requestMsg.getResourceId(); 368 String resourceId = requestMsg.getResourceId();
  369 + TransportProtos.GetResourceResponseMsg.Builder builder = TransportProtos.GetResourceResponseMsg.newBuilder();
  370 + Resource resource = resourceService.getResource(tenantId, resourceType, resourceId);
373 371
374 - List<TransportProtos.ResourceMsg> resources;  
375 -  
376 - if (resourceType != null && resourceId != null && !resourceId.isEmpty()) {  
377 - resources = Collections.singletonList(toProto(  
378 - resourceService.getResource(tenantId, ResourceType.valueOf(resourceType), resourceId)));  
379 - } else if (resourceType != null && !resourceType.isEmpty()) {  
380 - resources = resourceService.findResourcesByTenantIdResourceType(tenantId, ResourceType.valueOf(resourceType))  
381 - .stream()  
382 - .map(this::toProto)  
383 - .collect(Collectors.toList());  
384 - } else {  
385 - resources = resourceService.findResourcesByTenantId(tenantId)  
386 - .stream()  
387 - .map(this::toProto)  
388 - .collect(Collectors.toList()); 372 + if (resource == null && !tenantId.equals(TenantId.SYS_TENANT_ID)) {
  373 + resource = resourceService.getResource(TenantId.SYS_TENANT_ID, resourceType, resourceId);
389 } 374 }
390 375
391 - builder.addAllResources(resources);  
392 - return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setResourcesResponseMsg(builder).build());  
393 - } 376 + if (resource != null) {
  377 + builder.setResource(ByteString.copyFrom(dataDecodingEncodingService.encode(resource)));
  378 + }
394 379
395 - private TransportProtos.ResourceMsg toProto(Resource resource) {  
396 - return TransportProtos.ResourceMsg.newBuilder()  
397 - .setTenantIdMSB(resource.getTenantId().getId().getMostSignificantBits())  
398 - .setTenantIdLSB(resource.getTenantId().getId().getLeastSignificantBits())  
399 - .setResourceType(resource.getResourceType().name())  
400 - .setResourceId(resource.getResourceId())  
401 - .setValue(resource.getValue())  
402 - .build(); 380 + return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setResourceResponseMsg(builder).build());
403 } 381 }
404 382
405 private ListenableFuture<TransportApiResponseMsg> getDeviceInfo(DeviceId deviceId, DeviceCredentials credentials) { 383 private ListenableFuture<TransportApiResponseMsg> getDeviceInfo(DeviceId deviceId, DeviceCredentials credentials) {
@@ -15,9 +15,11 @@ @@ -15,9 +15,11 @@
15 */ 15 */
16 package org.thingsboard.server.dao.resource; 16 package org.thingsboard.server.dao.resource;
17 17
  18 +import org.thingsboard.server.common.data.Resource;
  19 +import org.thingsboard.server.common.data.ResourceType;
18 import org.thingsboard.server.common.data.id.TenantId; 20 import org.thingsboard.server.common.data.id.TenantId;
19 -import org.thingsboard.server.common.data.transport.resource.Resource;  
20 -import org.thingsboard.server.common.data.transport.resource.ResourceType; 21 +import org.thingsboard.server.common.data.page.PageData;
  22 +import org.thingsboard.server.common.data.page.PageLink;
21 23
22 import java.util.List; 24 import java.util.List;
23 25
@@ -27,7 +29,7 @@ public interface ResourceService { @@ -27,7 +29,7 @@ public interface ResourceService {
27 29
28 Resource getResource(TenantId tenantId, ResourceType resourceType, String resourceId); 30 Resource getResource(TenantId tenantId, ResourceType resourceType, String resourceId);
29 31
30 - List<Resource> findResourcesByTenantId(TenantId tenantId); 32 + PageData<Resource> findResourcesByTenantId(TenantId tenantId, PageLink pageLink);
31 33
32 List<Resource> findResourcesByTenantIdResourceType(TenantId tenantId, ResourceType resourceType); 34 List<Resource> findResourcesByTenantIdResourceType(TenantId tenantId, ResourceType resourceType);
33 35
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.common.data;
  17 +
  18 +import lombok.Data;
  19 +import org.thingsboard.server.common.data.id.TenantId;
  20 +
  21 +import java.io.Serializable;
  22 +
  23 +@Data
  24 +public class Resource implements HasTenantId, Serializable {
  25 +
  26 + private static final long serialVersionUID = 7379609705527272306L;
  27 +
  28 + private TenantId tenantId;
  29 + private ResourceType resourceType;
  30 + private String resourceId;
  31 + private String value;
  32 +
  33 + @Override
  34 + public String toString() {
  35 + return "Resource{" +
  36 + "tenantId=" + tenantId +
  37 + ", resourceType=" + resourceType +
  38 + ", resourceId='" + resourceId + '\'' +
  39 + '}';
  40 + }
  41 +}
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.common.data;
  17 +
  18 +public enum ResourceType {
  19 + LWM2M_MODEL, JKS, PKCS_12
  20 +}
@@ -201,23 +201,15 @@ message LwM2MResponseMsg { @@ -201,23 +201,15 @@ message LwM2MResponseMsg {
201 LwM2MRegistrationResponseMsg registrationMsg = 1; 201 LwM2MRegistrationResponseMsg registrationMsg = 1;
202 } 202 }
203 203
204 -message ResourceMsg { 204 +message GetResourceRequestMsg {
205 int64 tenantIdMSB = 1; 205 int64 tenantIdMSB = 1;
206 int64 tenantIdLSB = 2; 206 int64 tenantIdLSB = 2;
207 string resourceType = 3; 207 string resourceType = 3;
208 string resourceId = 4; 208 string resourceId = 4;
209 - string value = 5;  
210 } 209 }
211 210
212 -message GetResourcesRequestMsg {  
213 - int64 tenantIdMSB = 1;  
214 - int64 tenantIdLSB = 2;  
215 - string resourceType = 3;  
216 - string resourceId = 4;  
217 -}  
218 -  
219 -message GetResourcesResponseMsg {  
220 - repeated ResourceMsg resources = 1; 211 +message GetResourceResponseMsg {
  212 + bytes resource = 1;
221 } 213 }
222 214
223 message ValidateDeviceLwM2MCredentialsRequestMsg { 215 message ValidateDeviceLwM2MCredentialsRequestMsg {
@@ -558,7 +550,7 @@ message TransportApiRequestMsg { @@ -558,7 +550,7 @@ message TransportApiRequestMsg {
558 ValidateBasicMqttCredRequestMsg validateBasicMqttCredRequestMsg = 6; 550 ValidateBasicMqttCredRequestMsg validateBasicMqttCredRequestMsg = 6;
559 ProvisionDeviceRequestMsg provisionDeviceRequestMsg = 7; 551 ProvisionDeviceRequestMsg provisionDeviceRequestMsg = 7;
560 ValidateDeviceLwM2MCredentialsRequestMsg validateDeviceLwM2MCredentialsRequestMsg = 8; 552 ValidateDeviceLwM2MCredentialsRequestMsg validateDeviceLwM2MCredentialsRequestMsg = 8;
561 - GetResourcesRequestMsg resourcesRequestMsg = 9; 553 + GetResourceRequestMsg resourceRequestMsg = 9;
562 } 554 }
563 555
564 /* Response from ThingsBoard Core Service to Transport Service */ 556 /* Response from ThingsBoard Core Service to Transport Service */
@@ -568,7 +560,7 @@ message TransportApiResponseMsg { @@ -568,7 +560,7 @@ message TransportApiResponseMsg {
568 GetEntityProfileResponseMsg entityProfileResponseMsg = 3; 560 GetEntityProfileResponseMsg entityProfileResponseMsg = 3;
569 ProvisionDeviceResponseMsg provisionDeviceResponseMsg = 4; 561 ProvisionDeviceResponseMsg provisionDeviceResponseMsg = 4;
570 LwM2MResponseMsg lwM2MResponseMsg = 6; 562 LwM2MResponseMsg lwM2MResponseMsg = 6;
571 - GetResourcesResponseMsg resourcesResponseMsg = 7; 563 + GetResourceResponseMsg resourceResponseMsg = 7;
572 } 564 }
573 565
574 /* Messages that are handled by ThingsBoard Core Service */ 566 /* Messages that are handled by ThingsBoard Core Service */
@@ -41,8 +41,6 @@ import org.thingsboard.server.common.transport.TransportService; @@ -41,8 +41,6 @@ import org.thingsboard.server.common.transport.TransportService;
41 import org.thingsboard.server.common.transport.TransportServiceCallback; 41 import org.thingsboard.server.common.transport.TransportServiceCallback;
42 import org.thingsboard.server.common.transport.adaptor.AdaptorException; 42 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
43 import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigServer; 43 import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigServer;
44 -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesRequestMsg;  
45 -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesResponseMsg;  
46 import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg; 44 import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg;
47 import org.thingsboard.server.gen.transport.TransportProtos.PostTelemetryMsg; 45 import org.thingsboard.server.gen.transport.TransportProtos.PostTelemetryMsg;
48 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; 46 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
@@ -51,9 +49,6 @@ import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; @@ -51,9 +49,6 @@ import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
51 import org.thingsboard.server.transport.lwm2m.server.adaptors.LwM2MJsonAdaptor; 49 import org.thingsboard.server.transport.lwm2m.server.adaptors.LwM2MJsonAdaptor;
52 50
53 import java.util.List; 51 import java.util.List;
54 -import java.util.UUID;  
55 -import java.util.concurrent.CountDownLatch;  
56 -import java.util.concurrent.TimeUnit;  
57 52
58 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.LOG_LW2M_TELEMETRY; 53 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.LOG_LW2M_TELEMETRY;
59 54
@@ -147,56 +142,56 @@ public class LwM2mTransportContextServer extends TransportContext { @@ -147,56 +142,56 @@ public class LwM2mTransportContextServer extends TransportContext {
147 142
148 143
149 144
150 - /**  
151 - * ResourcesRequestMsg  
152 - *  
153 - * @param resourceType  
154 - * @return  
155 - */  
156 - public GetResourcesResponseMsg getResourceTenant (UUID tenantId, String resourceType) {  
157 - CountDownLatch latch = new CountDownLatch(1);  
158 - GetResourcesResponseMsg responseMsg =  
159 - this.getTransportService()  
160 - .getResources(GetResourcesRequestMsg.newBuilder()  
161 - .setResourceType(resourceType)  
162 - .setTenantIdLSB(tenantId.getLeastSignificantBits())  
163 - .setTenantIdMSB(tenantId.getMostSignificantBits())  
164 - .build());  
165 - latch.countDown();  
166 - try {  
167 - latch.await(this.getLwM2MTransportConfigServer().getTimeout(), TimeUnit.MILLISECONDS);  
168 - } catch (InterruptedException e) {  
169 - log.error("Failed to await credentials!", e);  
170 - }  
171 -  
172 - return responseMsg;  
173 - }  
174 -  
175 - public GetResourcesResponseMsg getResourceTenantProcess (UUID tenantId, String resourceType) {  
176 - CountDownLatch latch = new CountDownLatch(2);  
177 - final GetResourcesResponseMsg[] responseMsg = {null};  
178 - this.getTransportService().process(GetResourcesRequestMsg.newBuilder()  
179 - .setResourceType(resourceType)  
180 - .setTenantIdLSB(tenantId.getLeastSignificantBits())  
181 - .setTenantIdMSB(tenantId.getMostSignificantBits())  
182 - .build(),  
183 - new TransportServiceCallback<>() {  
184 - @Override  
185 - public void onSuccess(GetResourcesResponseMsg msg) { responseMsg[0] = msg;  
186 - latch.countDown();  
187 - }  
188 -  
189 - @Override  
190 - public void onError(Throwable e) {  
191 - log.trace("[{}] [{}] Failed to process credentials ", tenantId, e);  
192 - latch.countDown();  
193 - }  
194 - });  
195 - try {  
196 - latch.await(this.getLwM2MTransportConfigServer().getTimeout(), TimeUnit.MILLISECONDS);  
197 - } catch (InterruptedException e) {  
198 - log.error("Failed to await credentials!", e);  
199 - }  
200 - return responseMsg[0];  
201 - } 145 +// /**
  146 +// * ResourcesRequestMsg
  147 +// *
  148 +// * @param resourceType
  149 +// * @return
  150 +// */
  151 +// public GetResourcesResponseMsg getResourceTenant (UUID tenantId, String resourceType) {
  152 +// CountDownLatch latch = new CountDownLatch(1);
  153 +// GetResourcesResponseMsg responseMsg =
  154 +// this.getTransportService()
  155 +// .getResources(GetResourcesRequestMsg.newBuilder()
  156 +// .setResourceType(resourceType)
  157 +// .setTenantIdLSB(tenantId.getLeastSignificantBits())
  158 +// .setTenantIdMSB(tenantId.getMostSignificantBits())
  159 +// .build());
  160 +// latch.countDown();
  161 +// try {
  162 +// latch.await(this.getLwM2MTransportConfigServer().getTimeout(), TimeUnit.MILLISECONDS);
  163 +// } catch (InterruptedException e) {
  164 +// log.error("Failed to await credentials!", e);
  165 +// }
  166 +//
  167 +// return responseMsg;
  168 +// }
  169 +
  170 +// public GetResourcesResponseMsg getResourceTenantProcess (UUID tenantId, String resourceType) {
  171 +// CountDownLatch latch = new CountDownLatch(2);
  172 +// final GetResourcesResponseMsg[] responseMsg = {null};
  173 +// this.getTransportService().process(GetResourcesRequestMsg.newBuilder()
  174 +// .setResourceType(resourceType)
  175 +// .setTenantIdLSB(tenantId.getLeastSignificantBits())
  176 +// .setTenantIdMSB(tenantId.getMostSignificantBits())
  177 +// .build(),
  178 +// new TransportServiceCallback<>() {
  179 +// @Override
  180 +// public void onSuccess(GetResourcesResponseMsg msg) { responseMsg[0] = msg;
  181 +// latch.countDown();
  182 +// }
  183 +//
  184 +// @Override
  185 +// public void onError(Throwable e) {
  186 +// log.trace("[{}] [{}] Failed to process credentials ", tenantId, e);
  187 +// latch.countDown();
  188 +// }
  189 +// });
  190 +// try {
  191 +// latch.await(this.getLwM2MTransportConfigServer().getTimeout(), TimeUnit.MILLISECONDS);
  192 +// } catch (InterruptedException e) {
  193 +// log.error("Failed to await credentials!", e);
  194 +// }
  195 +// return responseMsg[0];
  196 +// }
202 } 197 }
@@ -30,9 +30,6 @@ import org.eclipse.leshan.server.security.SecurityChecker; @@ -30,9 +30,6 @@ import org.eclipse.leshan.server.security.SecurityChecker;
30 import org.springframework.beans.factory.annotation.Autowired; 30 import org.springframework.beans.factory.annotation.Autowired;
31 import org.springframework.context.annotation.Bean; 31 import org.springframework.context.annotation.Bean;
32 import org.springframework.stereotype.Component; 32 import org.springframework.stereotype.Component;
33 -import org.thingsboard.server.common.data.id.TenantId;  
34 -import org.thingsboard.server.common.data.transport.resource.ResourceType;  
35 -import org.thingsboard.server.gen.transport.TransportProtos;  
36 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; 33 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
37 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; 34 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
38 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl; 35 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
@@ -101,7 +98,7 @@ public class LwM2mTransportServerConfiguration { @@ -101,7 +98,7 @@ public class LwM2mTransportServerConfiguration {
101 builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort)); 98 builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort));
102 99
103 /** Define model provider (Create Models )*/ 100 /** Define model provider (Create Models )*/
104 - TransportProtos.GetResourcesResponseMsg responseMsg= this.context.getResourceTenantProcess(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); 101 +// TransportProtos.GetResourcesResponseMsg responseMsg= this.context.getResourceTenantProcess(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name());
105 // TransportProtos.GetResourcesResponseMsg responseMsg= this.context.getResourceTenant(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); 102 // TransportProtos.GetResourcesResponseMsg responseMsg= this.context.getResourceTenant(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name());
106 // LwM2mModelProvider modelProvider = new VersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueCommon()); 103 // LwM2mModelProvider modelProvider = new VersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueCommon());
107 LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueServer(), this.lwM2mClientContext); 104 LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueServer(), this.lwM2mClientContext);
@@ -40,8 +40,6 @@ import org.springframework.stereotype.Service; @@ -40,8 +40,6 @@ import org.springframework.stereotype.Service;
40 import org.thingsboard.common.util.JacksonUtil; 40 import org.thingsboard.common.util.JacksonUtil;
41 import org.thingsboard.server.common.data.Device; 41 import org.thingsboard.server.common.data.Device;
42 import org.thingsboard.server.common.data.DeviceProfile; 42 import org.thingsboard.server.common.data.DeviceProfile;
43 -import org.thingsboard.server.common.data.id.TenantId;  
44 -import org.thingsboard.server.common.data.transport.resource.ResourceType;  
45 import org.thingsboard.server.common.transport.TransportService; 43 import org.thingsboard.server.common.transport.TransportService;
46 import org.thingsboard.server.common.transport.adaptor.AdaptorException; 44 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
47 import org.thingsboard.server.common.transport.adaptor.JsonConverter; 45 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
@@ -156,7 +154,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -156,7 +154,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
156 try { 154 try {
157 log.warn("[{}] [{{}] Client: create after Registration", registration.getEndpoint(), registration.getId()); 155 log.warn("[{}] [{{}] Client: create after Registration", registration.getEndpoint(), registration.getId());
158 ((LwM2mVersionedModelProvider)leshanServer.getModelProvider()).setRepository(this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getModelsValueCommon()); 156 ((LwM2mVersionedModelProvider)leshanServer.getModelProvider()).setRepository(this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getModelsValueCommon());
159 - TransportProtos.GetResourcesResponseMsg responseMsg= this.lwM2mTransportContextServer.getResourceTenantProcess(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); 157 +// TransportProtos.GetResourcesResponseMsg responseMsg= this.lwM2mTransportContextServer.getResourceTenantProcess(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name());
160 // TransportProtos.GetResourcesResponseMsg responseMsg= this.lwM2mTransportContextServer.getResourceTenant(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); 158 // TransportProtos.GetResourcesResponseMsg responseMsg= this.lwM2mTransportContextServer.getResourceTenant(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name());
161 159
162 // (((VersionedModelProvider) (leshanServer)).modelProvider).repository; 160 // (((VersionedModelProvider) (leshanServer)).modelProvider).repository;
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.common.transport;
  17 +
  18 +import org.thingsboard.server.common.data.Resource;
  19 +import org.thingsboard.server.common.data.ResourceType;
  20 +import org.thingsboard.server.common.data.id.TenantId;
  21 +
  22 +public interface TransportResourceCache {
  23 +
  24 + Resource get(TenantId tenantId, ResourceType resourceType, String resourceId);
  25 +
  26 + void update(TenantId tenantId, ResourceType resourceType, String resourceI);
  27 +
  28 + void evict(TenantId tenantId, ResourceType resourceType, String resourceId);
  29 +}
@@ -25,8 +25,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestM @@ -25,8 +25,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestM
25 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequestMsg; 25 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequestMsg;
26 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg; 26 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg;
27 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg; 27 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg;
28 -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesRequestMsg;  
29 -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesResponseMsg; 28 +import org.thingsboard.server.gen.transport.TransportProtos.GetResourceRequestMsg;
  29 +import org.thingsboard.server.gen.transport.TransportProtos.GetResourceResponseMsg;
30 import org.thingsboard.server.gen.transport.TransportProtos.LwM2MRequestMsg; 30 import org.thingsboard.server.gen.transport.TransportProtos.LwM2MRequestMsg;
31 import org.thingsboard.server.gen.transport.TransportProtos.LwM2MResponseMsg; 31 import org.thingsboard.server.gen.transport.TransportProtos.LwM2MResponseMsg;
32 import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg; 32 import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg;
@@ -53,7 +53,7 @@ public interface TransportService { @@ -53,7 +53,7 @@ public interface TransportService {
53 53
54 GetEntityProfileResponseMsg getEntityProfile(GetEntityProfileRequestMsg msg); 54 GetEntityProfileResponseMsg getEntityProfile(GetEntityProfileRequestMsg msg);
55 55
56 - GetResourcesResponseMsg getResources(GetResourcesRequestMsg msg); 56 + GetResourceResponseMsg getResource(GetResourceRequestMsg msg);
57 57
58 void process(DeviceTransportType transportType, ValidateDeviceTokenRequestMsg msg, 58 void process(DeviceTransportType transportType, ValidateDeviceTokenRequestMsg msg,
59 TransportServiceCallback<ValidateDeviceCredentialsResponse> callback); 59 TransportServiceCallback<ValidateDeviceCredentialsResponse> callback);
@@ -75,9 +75,8 @@ public interface TransportService { @@ -75,9 +75,8 @@ public interface TransportService {
75 75
76 void onProfileUpdate(DeviceProfile deviceProfile); 76 void onProfileUpdate(DeviceProfile deviceProfile);
77 77
78 - void process(LwM2MRequestMsg msg, TransportServiceCallback<LwM2MResponseMsg> callback);  
79 -  
80 - void process(GetResourcesRequestMsg msg, TransportServiceCallback<GetResourcesResponseMsg> callback); 78 + void process(LwM2MRequestMsg msg,
  79 + TransportServiceCallback<LwM2MResponseMsg> callback);
81 80
82 void process(SessionInfoProto sessionInfo, SessionEventMsg msg, TransportServiceCallback<Void> callback); 81 void process(SessionInfoProto sessionInfo, SessionEventMsg msg, TransportServiceCallback<Void> callback);
83 82
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.common.transport.service;
  17 +
  18 +import lombok.Data;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.springframework.context.annotation.Lazy;
  21 +import org.springframework.stereotype.Component;
  22 +import org.thingsboard.server.common.data.Resource;
  23 +import org.thingsboard.server.common.data.ResourceType;
  24 +import org.thingsboard.server.common.data.id.TenantId;
  25 +import org.thingsboard.server.common.transport.TransportResourceCache;
  26 +import org.thingsboard.server.common.transport.TransportService;
  27 +import org.thingsboard.server.common.transport.util.DataDecodingEncodingService;
  28 +import org.thingsboard.server.gen.transport.TransportProtos;
  29 +import org.thingsboard.server.queue.util.TbTransportComponent;
  30 +
  31 +import java.util.Optional;
  32 +import java.util.Set;
  33 +import java.util.UUID;
  34 +import java.util.concurrent.ConcurrentHashMap;
  35 +import java.util.concurrent.ConcurrentMap;
  36 +import java.util.concurrent.locks.Lock;
  37 +import java.util.concurrent.locks.ReentrantLock;
  38 +
  39 +@Slf4j
  40 +@Component
  41 +@TbTransportComponent
  42 +public class DefaultTransportResourceCache implements TransportResourceCache {
  43 +
  44 + private final Lock resourceFetchLock = new ReentrantLock();
  45 + private final ConcurrentMap<ResourceKey, Resource> resources = new ConcurrentHashMap<>();
  46 + private final Set<ResourceKey> keys = ConcurrentHashMap.newKeySet();
  47 + private final DataDecodingEncodingService dataDecodingEncodingService;
  48 + private final TransportService transportService;
  49 +
  50 + public DefaultTransportResourceCache(DataDecodingEncodingService dataDecodingEncodingService, @Lazy TransportService transportService) {
  51 + this.dataDecodingEncodingService = dataDecodingEncodingService;
  52 + this.transportService = transportService;
  53 + }
  54 +
  55 + @Override
  56 + public Resource get(TenantId tenantId, ResourceType resourceType, String resourceId) {
  57 + ResourceKey resourceKey = new ResourceKey(tenantId, resourceType, resourceId);
  58 + Resource resource;
  59 +
  60 + if (keys.contains(resourceKey)) {
  61 + resource = resources.get(resourceKey);
  62 + if (resource == null) {
  63 + resource = resources.get(resourceKey.getSystemKey());
  64 + }
  65 + } else {
  66 + resourceFetchLock.lock();
  67 + try {
  68 + if (keys.contains(resourceKey)) {
  69 + resource = resources.get(resourceKey);
  70 + if (resource == null) {
  71 + resource = resources.get(resourceKey.getSystemKey());
  72 + }
  73 + } else {
  74 + resource = fetchResource(resourceKey);
  75 + keys.add(resourceKey);
  76 + }
  77 + } finally {
  78 + resourceFetchLock.unlock();
  79 + }
  80 + }
  81 +
  82 + return resource;
  83 + }
  84 +
  85 + private Resource fetchResource(ResourceKey resourceKey) {
  86 + UUID tenantId = resourceKey.getTenantId().getId();
  87 + TransportProtos.GetResourceRequestMsg.Builder builder = TransportProtos.GetResourceRequestMsg.newBuilder();
  88 + builder
  89 + .setTenantIdLSB(tenantId.getLeastSignificantBits())
  90 + .setTenantIdMSB(tenantId.getMostSignificantBits())
  91 + .setResourceType(resourceKey.resourceType.name())
  92 + .setResourceId(resourceKey.resourceId);
  93 + TransportProtos.GetResourceResponseMsg responseMsg = transportService.getResource(builder.build());
  94 +
  95 + Optional<Resource> optionalResource = dataDecodingEncodingService.decode(responseMsg.getResource().toByteArray());
  96 + if (optionalResource.isPresent()) {
  97 + Resource resource = optionalResource.get();
  98 + resources.put(new ResourceKey(resource.getTenantId(), resource.getResourceType(), resource.getResourceId()), resource);
  99 + return resource;
  100 + }
  101 +
  102 + return null;
  103 + }
  104 +
  105 + @Override
  106 + public void update(TenantId tenantId, ResourceType resourceType, String resourceId) {
  107 + ResourceKey resourceKey = new ResourceKey(tenantId, resourceType, resourceId);
  108 + if (keys.contains(resourceKey) || resources.containsKey(resourceKey)) {
  109 + fetchResource(resourceKey);
  110 + }
  111 + }
  112 +
  113 + @Override
  114 + public void evict(TenantId tenantId, ResourceType resourceType, String resourceId) {
  115 + ResourceKey resourceKey = new ResourceKey(tenantId, resourceType, resourceId);
  116 + keys.remove(resourceKey);
  117 + resources.remove(resourceKey);
  118 + }
  119 +
  120 + @Data
  121 + private static class ResourceKey {
  122 + private final TenantId tenantId;
  123 + private final ResourceType resourceType;
  124 + private final String resourceId;
  125 +
  126 + public ResourceKey getSystemKey() {
  127 + return new ResourceKey(TenantId.SYS_TENANT_ID, resourceType, resourceId);
  128 + }
  129 + }
  130 +}
@@ -31,6 +31,7 @@ import org.thingsboard.server.common.data.Device; @@ -31,6 +31,7 @@ import org.thingsboard.server.common.data.Device;
31 import org.thingsboard.server.common.data.DeviceProfile; 31 import org.thingsboard.server.common.data.DeviceProfile;
32 import org.thingsboard.server.common.data.DeviceTransportType; 32 import org.thingsboard.server.common.data.DeviceTransportType;
33 import org.thingsboard.server.common.data.EntityType; 33 import org.thingsboard.server.common.data.EntityType;
  34 +import org.thingsboard.server.common.data.ResourceType;
34 import org.thingsboard.server.common.data.Tenant; 35 import org.thingsboard.server.common.data.Tenant;
35 import org.thingsboard.server.common.data.id.DeviceId; 36 import org.thingsboard.server.common.data.id.DeviceId;
36 import org.thingsboard.server.common.data.id.DeviceProfileId; 37 import org.thingsboard.server.common.data.id.DeviceProfileId;
@@ -49,6 +50,7 @@ import org.thingsboard.server.common.stats.StatsFactory; @@ -49,6 +50,7 @@ import org.thingsboard.server.common.stats.StatsFactory;
49 import org.thingsboard.server.common.stats.StatsType; 50 import org.thingsboard.server.common.stats.StatsType;
50 import org.thingsboard.server.common.transport.SessionMsgListener; 51 import org.thingsboard.server.common.transport.SessionMsgListener;
51 import org.thingsboard.server.common.transport.TransportDeviceProfileCache; 52 import org.thingsboard.server.common.transport.TransportDeviceProfileCache;
  53 +import org.thingsboard.server.common.transport.TransportResourceCache;
52 import org.thingsboard.server.common.transport.TransportService; 54 import org.thingsboard.server.common.transport.TransportService;
53 import org.thingsboard.server.common.transport.TransportServiceCallback; 55 import org.thingsboard.server.common.transport.TransportServiceCallback;
54 import org.thingsboard.server.common.transport.TransportTenantProfileCache; 56 import org.thingsboard.server.common.transport.TransportTenantProfileCache;
@@ -130,6 +132,7 @@ public class DefaultTransportService implements TransportService { @@ -130,6 +132,7 @@ public class DefaultTransportService implements TransportService {
130 private final TransportRateLimitService rateLimitService; 132 private final TransportRateLimitService rateLimitService;
131 private final DataDecodingEncodingService dataDecodingEncodingService; 133 private final DataDecodingEncodingService dataDecodingEncodingService;
132 private final SchedulerComponent scheduler; 134 private final SchedulerComponent scheduler;
  135 + private final TransportResourceCache transportResourceCache;
133 136
134 protected TbQueueRequestTemplate<TbProtoQueueMsg<TransportApiRequestMsg>, TbProtoQueueMsg<TransportApiResponseMsg>> transportApiRequestTemplate; 137 protected TbQueueRequestTemplate<TbProtoQueueMsg<TransportApiRequestMsg>, TbProtoQueueMsg<TransportApiResponseMsg>> transportApiRequestTemplate;
135 protected TbQueueProducer<TbProtoQueueMsg<ToRuleEngineMsg>> ruleEngineMsgProducer; 138 protected TbQueueProducer<TbProtoQueueMsg<ToRuleEngineMsg>> ruleEngineMsgProducer;
@@ -156,7 +159,7 @@ public class DefaultTransportService implements TransportService { @@ -156,7 +159,7 @@ public class DefaultTransportService implements TransportService {
156 TransportDeviceProfileCache deviceProfileCache, 159 TransportDeviceProfileCache deviceProfileCache,
157 TransportTenantProfileCache tenantProfileCache, 160 TransportTenantProfileCache tenantProfileCache,
158 TbApiUsageClient apiUsageClient, TransportRateLimitService rateLimitService, 161 TbApiUsageClient apiUsageClient, TransportRateLimitService rateLimitService,
159 - DataDecodingEncodingService dataDecodingEncodingService, SchedulerComponent scheduler) { 162 + DataDecodingEncodingService dataDecodingEncodingService, SchedulerComponent scheduler, TransportResourceCache transportResourceCache) {
160 this.serviceInfoProvider = serviceInfoProvider; 163 this.serviceInfoProvider = serviceInfoProvider;
161 this.queueProvider = queueProvider; 164 this.queueProvider = queueProvider;
162 this.producerProvider = producerProvider; 165 this.producerProvider = producerProvider;
@@ -168,6 +171,7 @@ public class DefaultTransportService implements TransportService { @@ -168,6 +171,7 @@ public class DefaultTransportService implements TransportService {
168 this.rateLimitService = rateLimitService; 171 this.rateLimitService = rateLimitService;
169 this.dataDecodingEncodingService = dataDecodingEncodingService; 172 this.dataDecodingEncodingService = dataDecodingEncodingService;
170 this.scheduler = scheduler; 173 this.scheduler = scheduler;
  174 + this.transportResourceCache = transportResourceCache;
171 } 175 }
172 176
173 @PostConstruct 177 @PostConstruct
@@ -254,28 +258,18 @@ public class DefaultTransportService implements TransportService { @@ -254,28 +258,18 @@ public class DefaultTransportService implements TransportService {
254 } 258 }
255 259
256 @Override 260 @Override
257 - public TransportProtos.GetResourcesResponseMsg getResources(TransportProtos.GetResourcesRequestMsg msg) { 261 + public TransportProtos.GetResourceResponseMsg getResource(TransportProtos.GetResourceRequestMsg msg) {
258 TbProtoQueueMsg<TransportProtos.TransportApiRequestMsg> protoMsg = 262 TbProtoQueueMsg<TransportProtos.TransportApiRequestMsg> protoMsg =
259 - new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setResourcesRequestMsg(msg).build()); 263 + new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setResourceRequestMsg(msg).build());
260 try { 264 try {
261 TbProtoQueueMsg<TransportApiResponseMsg> response = transportApiRequestTemplate.send(protoMsg).get(); 265 TbProtoQueueMsg<TransportApiResponseMsg> response = transportApiRequestTemplate.send(protoMsg).get();
262 - return response.getValue().getResourcesResponseMsg(); 266 + return response.getValue().getResourceResponseMsg();
263 } catch (InterruptedException | ExecutionException e) { 267 } catch (InterruptedException | ExecutionException e) {
264 throw new RuntimeException(e); 268 throw new RuntimeException(e);
265 } 269 }
266 } 270 }
267 271
268 @Override 272 @Override
269 - public void process(TransportProtos.GetResourcesRequestMsg msg, TransportServiceCallback<TransportProtos.GetResourcesResponseMsg> callback) {  
270 - log.trace("Processing msg: {}", msg);  
271 - TbProtoQueueMsg<TransportProtos.TransportApiRequestMsg> protoMsg =  
272 - new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setResourcesRequestMsg(msg).build());  
273 - AsyncCallbackTemplate.withCallback(transportApiRequestTemplate.send(protoMsg),  
274 - response -> callback.onSuccess(response.getValue().getResourcesResponseMsg()), callback::onError, transportCallbackExecutor);  
275 - }  
276 -  
277 -  
278 - @Override  
279 public void process(DeviceTransportType transportType, TransportProtos.ValidateDeviceTokenRequestMsg msg, 273 public void process(DeviceTransportType transportType, TransportProtos.ValidateDeviceTokenRequestMsg msg,
280 TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) { 274 TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
281 log.trace("Processing msg: {}", msg); 275 log.trace("Processing msg: {}", msg);
@@ -711,9 +705,17 @@ public class DefaultTransportService implements TransportService { @@ -711,9 +705,17 @@ public class DefaultTransportService implements TransportService {
711 rateLimitService.remove(new DeviceId(entityUuid)); 705 rateLimitService.remove(new DeviceId(entityUuid));
712 } 706 }
713 } else if (toSessionMsg.hasResourceUpdateMsg()) { 707 } else if (toSessionMsg.hasResourceUpdateMsg()) {
714 - //TODO: update resource cache 708 + TransportProtos.ResourceUpdateMsg msg = toSessionMsg.getResourceUpdateMsg();
  709 + TenantId tenantId = new TenantId(new UUID(msg.getTenantIdMSB(), msg.getTenantIdLSB()));
  710 + ResourceType resourceType = ResourceType.valueOf(msg.getResourceType());
  711 + String resourceId = msg.getResourceId();
  712 + transportResourceCache.update(tenantId, resourceType, resourceId);
715 } else if (toSessionMsg.hasResourceDeleteMsg()) { 713 } else if (toSessionMsg.hasResourceDeleteMsg()) {
716 - //TODO: remove resource from cache 714 + TransportProtos.ResourceDeleteMsg msg = toSessionMsg.getResourceDeleteMsg();
  715 + TenantId tenantId = new TenantId(new UUID(msg.getTenantIdMSB(), msg.getTenantIdLSB()));
  716 + ResourceType resourceType = ResourceType.valueOf(msg.getResourceType());
  717 + String resourceId = msg.getResourceId();
  718 + transportResourceCache.evict(tenantId, resourceType, resourceId);
717 } else { 719 } else {
718 //TODO: should we notify the device actor about missed session? 720 //TODO: should we notify the device actor about missed session?
719 log.debug("[{}] Missing session.", sessionId); 721 log.debug("[{}] Missing session.", sessionId);
@@ -18,8 +18,6 @@ package org.thingsboard.server.common.transport.util; @@ -18,8 +18,6 @@ package org.thingsboard.server.common.transport.util;
18 import lombok.extern.slf4j.Slf4j; 18 import lombok.extern.slf4j.Slf4j;
19 import org.nustaq.serialization.FSTConfiguration; 19 import org.nustaq.serialization.FSTConfiguration;
20 import org.springframework.stereotype.Service; 20 import org.springframework.stereotype.Service;
21 -import org.thingsboard.server.common.msg.TbActorMsg;  
22 -import org.thingsboard.server.common.transport.util.DataDecodingEncodingService;  
23 21
24 import java.util.Optional; 22 import java.util.Optional;
25 23
@@ -33,8 +31,8 @@ public class ProtoWithFSTService implements DataDecodingEncodingService { @@ -33,8 +31,8 @@ public class ProtoWithFSTService implements DataDecodingEncodingService {
33 public <T> Optional<T> decode(byte[] byteArray) { 31 public <T> Optional<T> decode(byte[] byteArray) {
34 try { 32 try {
35 @SuppressWarnings("unchecked") 33 @SuppressWarnings("unchecked")
36 - T msg = (T) config.asObject(byteArray);  
37 - return Optional.of(msg); 34 + T msg = byteArray != null && byteArray.length > 0 ? (T) config.asObject(byteArray) : null;
  35 + return Optional.ofNullable(msg);
38 } catch (IllegalArgumentException e) { 36 } catch (IllegalArgumentException e) {
39 log.error("Error during deserialization message, [{}]", e.getMessage()); 37 log.error("Error during deserialization message, [{}]", e.getMessage());
40 return Optional.empty(); 38 return Optional.empty();
@@ -18,8 +18,7 @@ package org.thingsboard.server.dao.model.sql; @@ -18,8 +18,7 @@ package org.thingsboard.server.dao.model.sql;
18 import lombok.AllArgsConstructor; 18 import lombok.AllArgsConstructor;
19 import lombok.Data; 19 import lombok.Data;
20 import lombok.NoArgsConstructor; 20 import lombok.NoArgsConstructor;
21 -import org.thingsboard.server.common.data.relation.EntityRelation;  
22 -import org.thingsboard.server.common.data.transport.resource.Resource; 21 +import org.thingsboard.server.common.data.Resource;
23 22
24 import javax.persistence.Transient; 23 import javax.persistence.Transient;
25 import java.io.Serializable; 24 import java.io.Serializable;
@@ -16,9 +16,9 @@ @@ -16,9 +16,9 @@
16 package org.thingsboard.server.dao.model.sql; 16 package org.thingsboard.server.dao.model.sql;
17 17
18 import lombok.Data; 18 import lombok.Data;
  19 +import org.thingsboard.server.common.data.Resource;
  20 +import org.thingsboard.server.common.data.ResourceType;
19 import org.thingsboard.server.common.data.id.TenantId; 21 import org.thingsboard.server.common.data.id.TenantId;
20 -import org.thingsboard.server.common.data.transport.resource.Resource;  
21 -import org.thingsboard.server.common.data.transport.resource.ResourceType;  
22 import org.thingsboard.server.dao.model.ToData; 22 import org.thingsboard.server.dao.model.ToData;
23 23
24 import javax.persistence.Column; 24 import javax.persistence.Column;
@@ -17,9 +17,11 @@ package org.thingsboard.server.dao.resource; @@ -17,9 +17,11 @@ package org.thingsboard.server.dao.resource;
17 17
18 import lombok.extern.slf4j.Slf4j; 18 import lombok.extern.slf4j.Slf4j;
19 import org.springframework.stereotype.Service; 19 import org.springframework.stereotype.Service;
  20 +import org.thingsboard.server.common.data.Resource;
  21 +import org.thingsboard.server.common.data.ResourceType;
20 import org.thingsboard.server.common.data.id.TenantId; 22 import org.thingsboard.server.common.data.id.TenantId;
21 -import org.thingsboard.server.common.data.transport.resource.Resource;  
22 -import org.thingsboard.server.common.data.transport.resource.ResourceType; 23 +import org.thingsboard.server.common.data.page.PageData;
  24 +import org.thingsboard.server.common.data.page.PageLink;
23 import org.thingsboard.server.dao.exception.DataValidationException; 25 import org.thingsboard.server.dao.exception.DataValidationException;
24 26
25 import java.util.List; 27 import java.util.List;
@@ -59,12 +61,13 @@ public class BaseResourceService implements ResourceService { @@ -59,12 +61,13 @@ public class BaseResourceService implements ResourceService {
59 } 61 }
60 62
61 @Override 63 @Override
62 - public List<Resource> findResourcesByTenantId(TenantId tenantId) { 64 + public PageData<Resource> findResourcesByTenantId(TenantId tenantId, PageLink pageLink) {
63 log.trace("Executing findByTenantId [{}]", tenantId); 65 log.trace("Executing findByTenantId [{}]", tenantId);
64 validateId(tenantId, INCORRECT_TENANT_ID + tenantId); 66 validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
65 - return resourceDao.findAllByTenantId(tenantId); 67 + return resourceDao.findAllByTenantId(tenantId, pageLink);
66 } 68 }
67 69
  70 +
68 @Override 71 @Override
69 public List<Resource> findResourcesByTenantIdResourceType(TenantId tenantId, ResourceType resourceType) { 72 public List<Resource> findResourcesByTenantIdResourceType(TenantId tenantId, ResourceType resourceType) {
70 log.trace("Executing findByTenantId [{}]", tenantId); 73 log.trace("Executing findByTenantId [{}]", tenantId);
@@ -15,9 +15,11 @@ @@ -15,9 +15,11 @@
15 */ 15 */
16 package org.thingsboard.server.dao.resource; 16 package org.thingsboard.server.dao.resource;
17 17
  18 +import org.thingsboard.server.common.data.Resource;
  19 +import org.thingsboard.server.common.data.ResourceType;
18 import org.thingsboard.server.common.data.id.TenantId; 20 import org.thingsboard.server.common.data.id.TenantId;
19 -import org.thingsboard.server.common.data.transport.resource.Resource;  
20 -import org.thingsboard.server.common.data.transport.resource.ResourceType; 21 +import org.thingsboard.server.common.data.page.PageData;
  22 +import org.thingsboard.server.common.data.page.PageLink;
21 23
22 import java.util.List; 24 import java.util.List;
23 25
@@ -29,7 +31,8 @@ public interface ResourceDao { @@ -29,7 +31,8 @@ public interface ResourceDao {
29 31
30 void deleteResource(TenantId tenantId, ResourceType resourceType, String resourceId); 32 void deleteResource(TenantId tenantId, ResourceType resourceType, String resourceId);
31 33
32 - List<Resource> findAllByTenantId(TenantId tenantId); 34 + PageData<Resource> findAllByTenantId(TenantId tenantId, PageLink pageLink);
  35 +
33 36
34 List<Resource> findAllByTenantIdResourceType(TenantId tenantId, ResourceType resourceType); 37 List<Resource> findAllByTenantIdResourceType(TenantId tenantId, ResourceType resourceType);
35 38
@@ -18,9 +18,11 @@ package org.thingsboard.server.dao.sql.resource; @@ -18,9 +18,11 @@ package org.thingsboard.server.dao.sql.resource;
18 import lombok.extern.slf4j.Slf4j; 18 import lombok.extern.slf4j.Slf4j;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.springframework.transaction.annotation.Transactional; 20 import org.springframework.transaction.annotation.Transactional;
  21 +import org.thingsboard.server.common.data.Resource;
  22 +import org.thingsboard.server.common.data.ResourceType;
21 import org.thingsboard.server.common.data.id.TenantId; 23 import org.thingsboard.server.common.data.id.TenantId;
22 -import org.thingsboard.server.common.data.transport.resource.Resource;  
23 -import org.thingsboard.server.common.data.transport.resource.ResourceType; 24 +import org.thingsboard.server.common.data.page.PageData;
  25 +import org.thingsboard.server.common.data.page.PageLink;
24 import org.thingsboard.server.dao.DaoUtil; 26 import org.thingsboard.server.dao.DaoUtil;
25 import org.thingsboard.server.dao.model.sql.ResourceCompositeKey; 27 import org.thingsboard.server.dao.model.sql.ResourceCompositeKey;
26 import org.thingsboard.server.dao.model.sql.ResourceEntity; 28 import org.thingsboard.server.dao.model.sql.ResourceEntity;
@@ -66,8 +68,8 @@ public class ResourceDaoImpl implements ResourceDao { @@ -66,8 +68,8 @@ public class ResourceDaoImpl implements ResourceDao {
66 } 68 }
67 69
68 @Override 70 @Override
69 - public List<Resource> findAllByTenantId(TenantId tenantId) {  
70 - return DaoUtil.convertDataList(resourceRepository.findAllByTenantId(tenantId.getId())); 71 + public PageData<Resource> findAllByTenantId(TenantId tenantId, PageLink pageLink) {
  72 + return DaoUtil.toPageData(resourceRepository.findAllByTenantId(tenantId.getId(), DaoUtil.toPageable(pageLink)));
71 } 73 }
72 74
73 @Override 75 @Override
@@ -15,6 +15,8 @@ @@ -15,6 +15,8 @@
15 */ 15 */
16 package org.thingsboard.server.dao.sql.resource; 16 package org.thingsboard.server.dao.sql.resource;
17 17
  18 +import org.springframework.data.domain.Page;
  19 +import org.springframework.data.domain.Pageable;
18 import org.springframework.data.repository.CrudRepository; 20 import org.springframework.data.repository.CrudRepository;
19 import org.thingsboard.server.dao.model.sql.ResourceCompositeKey; 21 import org.thingsboard.server.dao.model.sql.ResourceCompositeKey;
20 import org.thingsboard.server.dao.model.sql.ResourceEntity; 22 import org.thingsboard.server.dao.model.sql.ResourceEntity;
@@ -24,7 +26,8 @@ import java.util.UUID; @@ -24,7 +26,8 @@ import java.util.UUID;
24 26
25 public interface ResourceRepository extends CrudRepository<ResourceEntity, ResourceCompositeKey> { 27 public interface ResourceRepository extends CrudRepository<ResourceEntity, ResourceCompositeKey> {
26 28
27 - List<ResourceEntity> findAllByTenantId(UUID tenantId); 29 + Page<ResourceEntity> findAllByTenantId(UUID tenantId, Pageable pageable);
  30 +
28 31
29 List<ResourceEntity> findAllByTenantIdAndResourceType(UUID tenantId, String resourceType); 32 List<ResourceEntity> findAllByTenantIdAndResourceType(UUID tenantId, String resourceType);
30 33