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 23 import org.springframework.web.bind.annotation.RequestParam;
24 24 import org.springframework.web.bind.annotation.ResponseBody;
25 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 28 import org.thingsboard.server.common.data.exception.ThingsboardException;
27 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 32 import org.thingsboard.server.dao.resource.ResourceService;
31 33 import org.thingsboard.server.queue.util.TbCoreComponent;
32 34
33   -import java.util.List;
34   -
35 35 @Slf4j
36 36 @RestController
37 37 @TbCoreComponent
... ... @@ -61,21 +61,14 @@ public class ResourceController extends BaseController {
61 61 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
62 62 @RequestMapping(value = "/resource", method = RequestMethod.GET)
63 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 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 72 } catch (Exception e) {
80 73 throw handleException(e);
81 74 }
... ...
... ... @@ -22,14 +22,14 @@ import org.springframework.beans.factory.annotation.Value;
22 22 import org.springframework.stereotype.Component;
23 23 import org.springframework.util.StringUtils;
24 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 27 import org.thingsboard.server.common.data.id.CustomerId;
26 28 import org.thingsboard.server.common.data.id.EntityId;
27 29 import org.thingsboard.server.common.data.id.TenantId;
28 30 import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate;
29 31 import org.thingsboard.server.common.data.rule.RuleChain;
30 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 33 import org.thingsboard.server.common.data.widget.WidgetType;
34 34 import org.thingsboard.server.common.data.widget.WidgetsBundle;
35 35 import org.thingsboard.server.dao.dashboard.DashboardService;
... ... @@ -251,7 +251,6 @@ public class InstallScripts {
251 251 }
252 252 }
253 253
254   -
255 254 public void loadDemoRuleChains(TenantId tenantId) throws Exception {
256 255 try {
257 256 createDefaultRuleChains(tenantId);
... ...
... ... @@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.Device;
26 26 import org.thingsboard.server.common.data.DeviceProfile;
27 27 import org.thingsboard.server.common.data.EntityType;
28 28 import org.thingsboard.server.common.data.HasName;
  29 +import org.thingsboard.server.common.data.Resource;
29 30 import org.thingsboard.server.common.data.Tenant;
30 31 import org.thingsboard.server.common.data.TenantProfile;
31 32 import org.thingsboard.server.common.data.id.DeviceId;
... ... @@ -34,7 +35,6 @@ import org.thingsboard.server.common.data.id.EntityId;
34 35 import org.thingsboard.server.common.data.id.RuleChainId;
35 36 import org.thingsboard.server.common.data.id.TenantId;
36 37 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
37   -import org.thingsboard.server.common.data.transport.resource.Resource;
38 38 import org.thingsboard.server.common.msg.TbMsg;
39 39 import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
40 40 import org.thingsboard.server.common.msg.queue.ServiceType;
... ...
... ... @@ -19,12 +19,12 @@ import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg;
19 19 import org.thingsboard.server.common.data.ApiUsageState;
20 20 import org.thingsboard.server.common.data.Device;
21 21 import org.thingsboard.server.common.data.DeviceProfile;
  22 +import org.thingsboard.server.common.data.Resource;
22 23 import org.thingsboard.server.common.data.Tenant;
23 24 import org.thingsboard.server.common.data.TenantProfile;
24 25 import org.thingsboard.server.common.data.id.EntityId;
25 26 import org.thingsboard.server.common.data.id.TenantId;
26 27 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
27   -import org.thingsboard.server.common.data.transport.resource.Resource;
28 28 import org.thingsboard.server.common.msg.TbMsg;
29 29 import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
30 30 import org.thingsboard.server.gen.transport.TransportProtos;
... ...
... ... @@ -31,6 +31,8 @@ import org.thingsboard.server.common.data.DataConstants;
31 31 import org.thingsboard.server.common.data.Device;
32 32 import org.thingsboard.server.common.data.DeviceProfile;
33 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 36 import org.thingsboard.server.common.data.TenantProfile;
35 37 import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
36 38 import org.thingsboard.server.common.data.device.credentials.ProvisionDeviceCredentialsData;
... ... @@ -42,8 +44,6 @@ import org.thingsboard.server.common.data.id.TenantId;
42 44 import org.thingsboard.server.common.data.relation.EntityRelation;
43 45 import org.thingsboard.server.common.data.security.DeviceCredentials;
44 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 47 import org.thingsboard.server.common.msg.EncryptionUtil;
48 48 import org.thingsboard.server.common.msg.TbMsg;
49 49 import org.thingsboard.server.common.msg.TbMsgDataType;
... ... @@ -64,7 +64,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequ
64 64 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg;
65 65 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg;
66 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 68 import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceRequestMsg;
69 69 import org.thingsboard.server.gen.transport.TransportProtos.ProvisionResponseStatus;
70 70 import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg;
... ... @@ -81,14 +81,11 @@ import org.thingsboard.server.service.profile.TbDeviceProfileCache;
81 81 import org.thingsboard.server.service.queue.TbClusterService;
82 82 import org.thingsboard.server.service.state.DeviceStateService;
83 83
84   -import java.util.Collections;
85   -import java.util.List;
86 84 import java.util.UUID;
87 85 import java.util.concurrent.ConcurrentHashMap;
88 86 import java.util.concurrent.ConcurrentMap;
89 87 import java.util.concurrent.locks.Lock;
90 88 import java.util.concurrent.locks.ReentrantLock;
91   -import java.util.stream.Collectors;
92 89
93 90 /**
94 91 * Created by ashvayka on 05.10.18.
... ... @@ -166,8 +163,8 @@ public class DefaultTransportApiService implements TransportApiService {
166 163 } else if (transportApiRequestMsg.hasProvisionDeviceRequestMsg()) {
167 164 return Futures.transform(handle(transportApiRequestMsg.getProvisionDeviceRequestMsg()),
168 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 168 value -> new TbProtoQueueMsg<>(tbProtoQueueMsg.getKey(), value, tbProtoQueueMsg.getHeaders()), MoreExecutors.directExecutor());
172 169 }
173 170 return Futures.transform(getEmptyTransportApiResponseFuture(),
... ... @@ -365,41 +362,22 @@ public class DefaultTransportApiService implements TransportApiService {
365 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 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 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 383 private ListenableFuture<TransportApiResponseMsg> getDeviceInfo(DeviceId deviceId, DeviceCredentials credentials) {
... ...
... ... @@ -15,9 +15,11 @@
15 15 */
16 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 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 24 import java.util.List;
23 25
... ... @@ -27,7 +29,7 @@ public interface ResourceService {
27 29
28 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 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 201 LwM2MRegistrationResponseMsg registrationMsg = 1;
202 202 }
203 203
204   -message ResourceMsg {
  204 +message GetResourceRequestMsg {
205 205 int64 tenantIdMSB = 1;
206 206 int64 tenantIdLSB = 2;
207 207 string resourceType = 3;
208 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 215 message ValidateDeviceLwM2MCredentialsRequestMsg {
... ... @@ -558,7 +550,7 @@ message TransportApiRequestMsg {
558 550 ValidateBasicMqttCredRequestMsg validateBasicMqttCredRequestMsg = 6;
559 551 ProvisionDeviceRequestMsg provisionDeviceRequestMsg = 7;
560 552 ValidateDeviceLwM2MCredentialsRequestMsg validateDeviceLwM2MCredentialsRequestMsg = 8;
561   - GetResourcesRequestMsg resourcesRequestMsg = 9;
  553 + GetResourceRequestMsg resourceRequestMsg = 9;
562 554 }
563 555
564 556 /* Response from ThingsBoard Core Service to Transport Service */
... ... @@ -568,7 +560,7 @@ message TransportApiResponseMsg {
568 560 GetEntityProfileResponseMsg entityProfileResponseMsg = 3;
569 561 ProvisionDeviceResponseMsg provisionDeviceResponseMsg = 4;
570 562 LwM2MResponseMsg lwM2MResponseMsg = 6;
571   - GetResourcesResponseMsg resourcesResponseMsg = 7;
  563 + GetResourceResponseMsg resourceResponseMsg = 7;
572 564 }
573 565
574 566 /* Messages that are handled by ThingsBoard Core Service */
... ...
... ... @@ -41,8 +41,6 @@ import org.thingsboard.server.common.transport.TransportService;
41 41 import org.thingsboard.server.common.transport.TransportServiceCallback;
42 42 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
43 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 44 import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg;
47 45 import org.thingsboard.server.gen.transport.TransportProtos.PostTelemetryMsg;
48 46 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
... ... @@ -51,9 +49,6 @@ import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
51 49 import org.thingsboard.server.transport.lwm2m.server.adaptors.LwM2MJsonAdaptor;
52 50
53 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 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 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 30 import org.springframework.beans.factory.annotation.Autowired;
31 31 import org.springframework.context.annotation.Bean;
32 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 33 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
37 34 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
38 35 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
... ... @@ -101,7 +98,7 @@ public class LwM2mTransportServerConfiguration {
101 98 builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort));
102 99
103 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 102 // TransportProtos.GetResourcesResponseMsg responseMsg= this.context.getResourceTenant(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name());
106 103 // LwM2mModelProvider modelProvider = new VersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueCommon());
107 104 LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueServer(), this.lwM2mClientContext);
... ...
... ... @@ -40,8 +40,6 @@ import org.springframework.stereotype.Service;
40 40 import org.thingsboard.common.util.JacksonUtil;
41 41 import org.thingsboard.server.common.data.Device;
42 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 43 import org.thingsboard.server.common.transport.TransportService;
46 44 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
47 45 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
... ... @@ -156,7 +154,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
156 154 try {
157 155 log.warn("[{}] [{{}] Client: create after Registration", registration.getEndpoint(), registration.getId());
158 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 158 // TransportProtos.GetResourcesResponseMsg responseMsg= this.lwM2mTransportContextServer.getResourceTenant(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name());
161 159
162 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 25 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequestMsg;
26 26 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg;
27 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 30 import org.thingsboard.server.gen.transport.TransportProtos.LwM2MRequestMsg;
31 31 import org.thingsboard.server.gen.transport.TransportProtos.LwM2MResponseMsg;
32 32 import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg;
... ... @@ -53,7 +53,7 @@ public interface TransportService {
53 53
54 54 GetEntityProfileResponseMsg getEntityProfile(GetEntityProfileRequestMsg msg);
55 55
56   - GetResourcesResponseMsg getResources(GetResourcesRequestMsg msg);
  56 + GetResourceResponseMsg getResource(GetResourceRequestMsg msg);
57 57
58 58 void process(DeviceTransportType transportType, ValidateDeviceTokenRequestMsg msg,
59 59 TransportServiceCallback<ValidateDeviceCredentialsResponse> callback);
... ... @@ -75,9 +75,8 @@ public interface TransportService {
75 75
76 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 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 31 import org.thingsboard.server.common.data.DeviceProfile;
32 32 import org.thingsboard.server.common.data.DeviceTransportType;
33 33 import org.thingsboard.server.common.data.EntityType;
  34 +import org.thingsboard.server.common.data.ResourceType;
34 35 import org.thingsboard.server.common.data.Tenant;
35 36 import org.thingsboard.server.common.data.id.DeviceId;
36 37 import org.thingsboard.server.common.data.id.DeviceProfileId;
... ... @@ -49,6 +50,7 @@ import org.thingsboard.server.common.stats.StatsFactory;
49 50 import org.thingsboard.server.common.stats.StatsType;
50 51 import org.thingsboard.server.common.transport.SessionMsgListener;
51 52 import org.thingsboard.server.common.transport.TransportDeviceProfileCache;
  53 +import org.thingsboard.server.common.transport.TransportResourceCache;
52 54 import org.thingsboard.server.common.transport.TransportService;
53 55 import org.thingsboard.server.common.transport.TransportServiceCallback;
54 56 import org.thingsboard.server.common.transport.TransportTenantProfileCache;
... ... @@ -130,6 +132,7 @@ public class DefaultTransportService implements TransportService {
130 132 private final TransportRateLimitService rateLimitService;
131 133 private final DataDecodingEncodingService dataDecodingEncodingService;
132 134 private final SchedulerComponent scheduler;
  135 + private final TransportResourceCache transportResourceCache;
133 136
134 137 protected TbQueueRequestTemplate<TbProtoQueueMsg<TransportApiRequestMsg>, TbProtoQueueMsg<TransportApiResponseMsg>> transportApiRequestTemplate;
135 138 protected TbQueueProducer<TbProtoQueueMsg<ToRuleEngineMsg>> ruleEngineMsgProducer;
... ... @@ -156,7 +159,7 @@ public class DefaultTransportService implements TransportService {
156 159 TransportDeviceProfileCache deviceProfileCache,
157 160 TransportTenantProfileCache tenantProfileCache,
158 161 TbApiUsageClient apiUsageClient, TransportRateLimitService rateLimitService,
159   - DataDecodingEncodingService dataDecodingEncodingService, SchedulerComponent scheduler) {
  162 + DataDecodingEncodingService dataDecodingEncodingService, SchedulerComponent scheduler, TransportResourceCache transportResourceCache) {
160 163 this.serviceInfoProvider = serviceInfoProvider;
161 164 this.queueProvider = queueProvider;
162 165 this.producerProvider = producerProvider;
... ... @@ -168,6 +171,7 @@ public class DefaultTransportService implements TransportService {
168 171 this.rateLimitService = rateLimitService;
169 172 this.dataDecodingEncodingService = dataDecodingEncodingService;
170 173 this.scheduler = scheduler;
  174 + this.transportResourceCache = transportResourceCache;
171 175 }
172 176
173 177 @PostConstruct
... ... @@ -254,28 +258,18 @@ public class DefaultTransportService implements TransportService {
254 258 }
255 259
256 260 @Override
257   - public TransportProtos.GetResourcesResponseMsg getResources(TransportProtos.GetResourcesRequestMsg msg) {
  261 + public TransportProtos.GetResourceResponseMsg getResource(TransportProtos.GetResourceRequestMsg msg) {
258 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 264 try {
261 265 TbProtoQueueMsg<TransportApiResponseMsg> response = transportApiRequestTemplate.send(protoMsg).get();
262   - return response.getValue().getResourcesResponseMsg();
  266 + return response.getValue().getResourceResponseMsg();
263 267 } catch (InterruptedException | ExecutionException e) {
264 268 throw new RuntimeException(e);
265 269 }
266 270 }
267 271
268 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 273 public void process(DeviceTransportType transportType, TransportProtos.ValidateDeviceTokenRequestMsg msg,
280 274 TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
281 275 log.trace("Processing msg: {}", msg);
... ... @@ -711,9 +705,17 @@ public class DefaultTransportService implements TransportService {
711 705 rateLimitService.remove(new DeviceId(entityUuid));
712 706 }
713 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 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 719 } else {
718 720 //TODO: should we notify the device actor about missed session?
719 721 log.debug("[{}] Missing session.", sessionId);
... ...
... ... @@ -18,8 +18,6 @@ package org.thingsboard.server.common.transport.util;
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.nustaq.serialization.FSTConfiguration;
20 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 22 import java.util.Optional;
25 23
... ... @@ -33,8 +31,8 @@ public class ProtoWithFSTService implements DataDecodingEncodingService {
33 31 public <T> Optional<T> decode(byte[] byteArray) {
34 32 try {
35 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 36 } catch (IllegalArgumentException e) {
39 37 log.error("Error during deserialization message, [{}]", e.getMessage());
40 38 return Optional.empty();
... ...
... ... @@ -18,8 +18,7 @@ package org.thingsboard.server.dao.model.sql;
18 18 import lombok.AllArgsConstructor;
19 19 import lombok.Data;
20 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 23 import javax.persistence.Transient;
25 24 import java.io.Serializable;
... ...
... ... @@ -16,9 +16,9 @@
16 16 package org.thingsboard.server.dao.model.sql;
17 17
18 18 import lombok.Data;
  19 +import org.thingsboard.server.common.data.Resource;
  20 +import org.thingsboard.server.common.data.ResourceType;
19 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 22 import org.thingsboard.server.dao.model.ToData;
23 23
24 24 import javax.persistence.Column;
... ...
... ... @@ -17,9 +17,11 @@ package org.thingsboard.server.dao.resource;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.springframework.stereotype.Service;
  20 +import org.thingsboard.server.common.data.Resource;
  21 +import org.thingsboard.server.common.data.ResourceType;
20 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 25 import org.thingsboard.server.dao.exception.DataValidationException;
24 26
25 27 import java.util.List;
... ... @@ -59,12 +61,13 @@ public class BaseResourceService implements ResourceService {
59 61 }
60 62
61 63 @Override
62   - public List<Resource> findResourcesByTenantId(TenantId tenantId) {
  64 + public PageData<Resource> findResourcesByTenantId(TenantId tenantId, PageLink pageLink) {
63 65 log.trace("Executing findByTenantId [{}]", tenantId);
64 66 validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
65   - return resourceDao.findAllByTenantId(tenantId);
  67 + return resourceDao.findAllByTenantId(tenantId, pageLink);
66 68 }
67 69
  70 +
68 71 @Override
69 72 public List<Resource> findResourcesByTenantIdResourceType(TenantId tenantId, ResourceType resourceType) {
70 73 log.trace("Executing findByTenantId [{}]", tenantId);
... ...
... ... @@ -15,9 +15,11 @@
15 15 */
16 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 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 24 import java.util.List;
23 25
... ... @@ -29,7 +31,8 @@ public interface ResourceDao {
29 31
30 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 37 List<Resource> findAllByTenantIdResourceType(TenantId tenantId, ResourceType resourceType);
35 38
... ...
... ... @@ -18,9 +18,11 @@ package org.thingsboard.server.dao.sql.resource;
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.springframework.stereotype.Component;
20 20 import org.springframework.transaction.annotation.Transactional;
  21 +import org.thingsboard.server.common.data.Resource;
  22 +import org.thingsboard.server.common.data.ResourceType;
21 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 26 import org.thingsboard.server.dao.DaoUtil;
25 27 import org.thingsboard.server.dao.model.sql.ResourceCompositeKey;
26 28 import org.thingsboard.server.dao.model.sql.ResourceEntity;
... ... @@ -66,8 +68,8 @@ public class ResourceDaoImpl implements ResourceDao {
66 68 }
67 69
68 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 75 @Override
... ...
... ... @@ -15,6 +15,8 @@
15 15 */
16 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 20 import org.springframework.data.repository.CrudRepository;
19 21 import org.thingsboard.server.dao.model.sql.ResourceCompositeKey;
20 22 import org.thingsboard.server.dao.model.sql.ResourceEntity;
... ... @@ -24,7 +26,8 @@ import java.util.UUID;
24 26
25 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 32 List<ResourceEntity> findAllByTenantIdAndResourceType(UUID tenantId, String resourceType);
30 33
... ...