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 | ... | ... |