diff --git a/application/src/main/java/org/thingsboard/server/controller/ResourceController.java b/application/src/main/java/org/thingsboard/server/controller/ResourceController.java index b1c709a811..1277a32fd6 100644 --- a/application/src/main/java/org/thingsboard/server/controller/ResourceController.java +++ b/application/src/main/java/org/thingsboard/server/controller/ResourceController.java @@ -23,15 +23,15 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.transport.resource.Resource; -import org.thingsboard.server.common.data.transport.resource.ResourceType; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.queue.util.TbCoreComponent; -import java.util.List; - @Slf4j @RestController @TbCoreComponent @@ -61,21 +61,14 @@ public class ResourceController extends BaseController { @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") @RequestMapping(value = "/resource", method = RequestMethod.GET) @ResponseBody - public List getResources(@RequestParam(required = false) boolean system) throws ThingsboardException { + public PageData getResources(@RequestParam(required = false) boolean system, + @RequestParam int pageSize, + @RequestParam int page, + @RequestParam(required = false) String sortProperty, + @RequestParam(required = false) String sortOrder) throws ThingsboardException { try { - return checkNotNull(resourceService.findResourcesByTenantId(system ? TenantId.SYS_TENANT_ID : getTenantId())); - } catch (Exception e) { - throw handleException(e); - } - } - - @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") - @RequestMapping(value = "/resource/{resourceType}", method = RequestMethod.GET) - @ResponseBody - public List getResources(@RequestParam(required = false) boolean system, - @PathVariable("resourceType") ResourceType resourceType) throws ThingsboardException { - try { - return checkNotNull(resourceService.findResourcesByTenantIdResourceType(system ? TenantId.SYS_TENANT_ID : getTenantId(), resourceType)); + PageLink pageLink = createPageLink(pageSize, page, null, sortProperty, sortOrder); + return checkNotNull(resourceService.findResourcesByTenantId(system ? TenantId.SYS_TENANT_ID : getTenantId(), pageLink)); } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java index 2fc832129f..4cb4fbd059 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java +++ b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java @@ -22,14 +22,14 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.Dashboard; +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChainMetaData; -import org.thingsboard.server.common.data.transport.resource.Resource; -import org.thingsboard.server.common.data.transport.resource.ResourceType; import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.dao.dashboard.DashboardService; @@ -251,7 +251,6 @@ public class InstallScripts { } } - public void loadDemoRuleChains(TenantId tenantId) throws Exception { try { createDefaultRuleChains(tenantId); diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java index 3405ab28d8..c70e123e4a 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java @@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.HasName; +import org.thingsboard.server.common.data.Resource; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.id.DeviceId; @@ -34,7 +35,6 @@ import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; -import org.thingsboard.server.common.data.transport.resource.Resource; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; import org.thingsboard.server.common.msg.queue.ServiceType; diff --git a/application/src/main/java/org/thingsboard/server/service/queue/TbClusterService.java b/application/src/main/java/org/thingsboard/server/service/queue/TbClusterService.java index c1cafa3379..a2391a73e4 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/TbClusterService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/TbClusterService.java @@ -19,12 +19,12 @@ import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg; import org.thingsboard.server.common.data.ApiUsageState; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; +import org.thingsboard.server.common.data.Resource; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; -import org.thingsboard.server.common.data.transport.resource.Resource; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; import org.thingsboard.server.gen.transport.TransportProtos; diff --git a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java index 21a96c1bf9..9110bf07ba 100644 --- a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java +++ b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java @@ -31,6 +31,8 @@ import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials; import org.thingsboard.server.common.data.device.credentials.ProvisionDeviceCredentialsData; @@ -42,8 +44,6 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentialsType; -import org.thingsboard.server.common.data.transport.resource.Resource; -import org.thingsboard.server.common.data.transport.resource.ResourceType; import org.thingsboard.server.common.msg.EncryptionUtil; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgDataType; @@ -64,7 +64,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequ import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg; import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg; import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayResponseMsg; -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesRequestMsg; +import org.thingsboard.server.gen.transport.TransportProtos.GetResourceRequestMsg; import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceRequestMsg; import org.thingsboard.server.gen.transport.TransportProtos.ProvisionResponseStatus; import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg; @@ -81,14 +81,11 @@ import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.queue.TbClusterService; import org.thingsboard.server.service.state.DeviceStateService; -import java.util.Collections; -import java.util.List; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import java.util.stream.Collectors; /** * Created by ashvayka on 05.10.18. @@ -166,8 +163,8 @@ public class DefaultTransportApiService implements TransportApiService { } else if (transportApiRequestMsg.hasProvisionDeviceRequestMsg()) { return Futures.transform(handle(transportApiRequestMsg.getProvisionDeviceRequestMsg()), value -> new TbProtoQueueMsg<>(tbProtoQueueMsg.getKey(), value, tbProtoQueueMsg.getHeaders()), MoreExecutors.directExecutor()); - } else if (transportApiRequestMsg.hasResourcesRequestMsg()) { - return Futures.transform(handle(transportApiRequestMsg.getResourcesRequestMsg()), + } else if (transportApiRequestMsg.hasResourceRequestMsg()) { + return Futures.transform(handle(transportApiRequestMsg.getResourceRequestMsg()), value -> new TbProtoQueueMsg<>(tbProtoQueueMsg.getKey(), value, tbProtoQueueMsg.getHeaders()), MoreExecutors.directExecutor()); } return Futures.transform(getEmptyTransportApiResponseFuture(), @@ -365,41 +362,22 @@ public class DefaultTransportApiService implements TransportApiService { return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setEntityProfileResponseMsg(builder).build()); } - private ListenableFuture handle(GetResourcesRequestMsg requestMsg) { + private ListenableFuture handle(GetResourceRequestMsg requestMsg) { TenantId tenantId = new TenantId(new UUID(requestMsg.getTenantIdMSB(), requestMsg.getTenantIdLSB())); - TransportProtos.GetResourcesResponseMsg.Builder builder = TransportProtos.GetResourcesResponseMsg.newBuilder(); - String resourceType = requestMsg.getResourceType(); + ResourceType resourceType = ResourceType.valueOf(requestMsg.getResourceType()); String resourceId = requestMsg.getResourceId(); + TransportProtos.GetResourceResponseMsg.Builder builder = TransportProtos.GetResourceResponseMsg.newBuilder(); + Resource resource = resourceService.getResource(tenantId, resourceType, resourceId); - List resources; - - if (resourceType != null && resourceId != null && !resourceId.isEmpty()) { - resources = Collections.singletonList(toProto( - resourceService.getResource(tenantId, ResourceType.valueOf(resourceType), resourceId))); - } else if (resourceType != null && !resourceType.isEmpty()) { - resources = resourceService.findResourcesByTenantIdResourceType(tenantId, ResourceType.valueOf(resourceType)) - .stream() - .map(this::toProto) - .collect(Collectors.toList()); - } else { - resources = resourceService.findResourcesByTenantId(tenantId) - .stream() - .map(this::toProto) - .collect(Collectors.toList()); + if (resource == null && !tenantId.equals(TenantId.SYS_TENANT_ID)) { + resource = resourceService.getResource(TenantId.SYS_TENANT_ID, resourceType, resourceId); } - builder.addAllResources(resources); - return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setResourcesResponseMsg(builder).build()); - } + if (resource != null) { + builder.setResource(ByteString.copyFrom(dataDecodingEncodingService.encode(resource))); + } - private TransportProtos.ResourceMsg toProto(Resource resource) { - return TransportProtos.ResourceMsg.newBuilder() - .setTenantIdMSB(resource.getTenantId().getId().getMostSignificantBits()) - .setTenantIdLSB(resource.getTenantId().getId().getLeastSignificantBits()) - .setResourceType(resource.getResourceType().name()) - .setResourceId(resource.getResourceId()) - .setValue(resource.getValue()) - .build(); + return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setResourceResponseMsg(builder).build()); } private ListenableFuture getDeviceInfo(DeviceId deviceId, DeviceCredentials credentials) { diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java index e88b276d1c..8d84af6e6c 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java @@ -15,9 +15,11 @@ */ package org.thingsboard.server.dao.resource; +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.transport.resource.Resource; -import org.thingsboard.server.common.data.transport.resource.ResourceType; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; import java.util.List; @@ -27,7 +29,7 @@ public interface ResourceService { Resource getResource(TenantId tenantId, ResourceType resourceType, String resourceId); - List findResourcesByTenantId(TenantId tenantId); + PageData findResourcesByTenantId(TenantId tenantId, PageLink pageLink); List findResourcesByTenantIdResourceType(TenantId tenantId, ResourceType resourceType); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/Resource.java b/common/data/src/main/java/org/thingsboard/server/common/data/Resource.java new file mode 100644 index 0000000000..2e7cde8185 --- /dev/null +++ b/common/data/src/main/java/org/thingsboard/server/common/data/Resource.java @@ -0,0 +1,41 @@ +/** + * Copyright © 2016-2021 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.common.data; + +import lombok.Data; +import org.thingsboard.server.common.data.id.TenantId; + +import java.io.Serializable; + +@Data +public class Resource implements HasTenantId, Serializable { + + private static final long serialVersionUID = 7379609705527272306L; + + private TenantId tenantId; + private ResourceType resourceType; + private String resourceId; + private String value; + + @Override + public String toString() { + return "Resource{" + + "tenantId=" + tenantId + + ", resourceType=" + resourceType + + ", resourceId='" + resourceId + '\'' + + '}'; + } +} diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/ResourceType.java b/common/data/src/main/java/org/thingsboard/server/common/data/ResourceType.java new file mode 100644 index 0000000000..a9bb27432a --- /dev/null +++ b/common/data/src/main/java/org/thingsboard/server/common/data/ResourceType.java @@ -0,0 +1,20 @@ +/** + * Copyright © 2016-2021 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.common.data; + +public enum ResourceType { + LWM2M_MODEL, JKS, PKCS_12 +} diff --git a/common/queue/src/main/proto/queue.proto b/common/queue/src/main/proto/queue.proto index 42f6267d42..0a9e6d7652 100644 --- a/common/queue/src/main/proto/queue.proto +++ b/common/queue/src/main/proto/queue.proto @@ -201,23 +201,15 @@ message LwM2MResponseMsg { LwM2MRegistrationResponseMsg registrationMsg = 1; } -message ResourceMsg { - int64 tenantIdMSB = 1; - int64 tenantIdLSB = 2; - string resourceType = 3; - string resourceId = 4; - string value = 5; -} - -message GetResourcesRequestMsg { +message GetResourceRequestMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; string resourceType = 3; string resourceId = 4; } -message GetResourcesResponseMsg { - repeated ResourceMsg resources = 1; +message GetResourceResponseMsg { + bytes resource = 1; } message ValidateDeviceLwM2MCredentialsRequestMsg { @@ -558,7 +550,7 @@ message TransportApiRequestMsg { ValidateBasicMqttCredRequestMsg validateBasicMqttCredRequestMsg = 6; ProvisionDeviceRequestMsg provisionDeviceRequestMsg = 7; ValidateDeviceLwM2MCredentialsRequestMsg validateDeviceLwM2MCredentialsRequestMsg = 8; - GetResourcesRequestMsg resourcesRequestMsg = 9; + GetResourceRequestMsg resourceRequestMsg = 9; } /* Response from ThingsBoard Core Service to Transport Service */ @@ -568,7 +560,7 @@ message TransportApiResponseMsg { GetEntityProfileResponseMsg entityProfileResponseMsg = 3; ProvisionDeviceResponseMsg provisionDeviceResponseMsg = 4; LwM2MResponseMsg lwM2MResponseMsg = 6; - GetResourcesResponseMsg resourcesResponseMsg = 7; + GetResourceResponseMsg resourceResponseMsg = 7; } /* Messages that are handled by ThingsBoard Core Service */ diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportContextServer.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportContextServer.java index bc7737aebb..92db005094 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportContextServer.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportContextServer.java @@ -41,8 +41,6 @@ import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportServiceCallback; import org.thingsboard.server.common.transport.adaptor.AdaptorException; import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigServer; -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesRequestMsg; -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesResponseMsg; import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg; import org.thingsboard.server.gen.transport.TransportProtos.PostTelemetryMsg; import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; @@ -51,9 +49,6 @@ import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.transport.lwm2m.server.adaptors.LwM2MJsonAdaptor; import java.util.List; -import java.util.UUID; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.LOG_LW2M_TELEMETRY; @@ -147,56 +142,56 @@ public class LwM2mTransportContextServer extends TransportContext { - /** - * ResourcesRequestMsg - * - * @param resourceType - * @return - */ - public GetResourcesResponseMsg getResourceTenant (UUID tenantId, String resourceType) { - CountDownLatch latch = new CountDownLatch(1); - GetResourcesResponseMsg responseMsg = - this.getTransportService() - .getResources(GetResourcesRequestMsg.newBuilder() - .setResourceType(resourceType) - .setTenantIdLSB(tenantId.getLeastSignificantBits()) - .setTenantIdMSB(tenantId.getMostSignificantBits()) - .build()); - latch.countDown(); - try { - latch.await(this.getLwM2MTransportConfigServer().getTimeout(), TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - log.error("Failed to await credentials!", e); - } +// /** +// * ResourcesRequestMsg +// * +// * @param resourceType +// * @return +// */ +// public GetResourcesResponseMsg getResourceTenant (UUID tenantId, String resourceType) { +// CountDownLatch latch = new CountDownLatch(1); +// GetResourcesResponseMsg responseMsg = +// this.getTransportService() +// .getResources(GetResourcesRequestMsg.newBuilder() +// .setResourceType(resourceType) +// .setTenantIdLSB(tenantId.getLeastSignificantBits()) +// .setTenantIdMSB(tenantId.getMostSignificantBits()) +// .build()); +// latch.countDown(); +// try { +// latch.await(this.getLwM2MTransportConfigServer().getTimeout(), TimeUnit.MILLISECONDS); +// } catch (InterruptedException e) { +// log.error("Failed to await credentials!", e); +// } +// +// return responseMsg; +// } - return responseMsg; - } - - public GetResourcesResponseMsg getResourceTenantProcess (UUID tenantId, String resourceType) { - CountDownLatch latch = new CountDownLatch(2); - final GetResourcesResponseMsg[] responseMsg = {null}; - this.getTransportService().process(GetResourcesRequestMsg.newBuilder() - .setResourceType(resourceType) - .setTenantIdLSB(tenantId.getLeastSignificantBits()) - .setTenantIdMSB(tenantId.getMostSignificantBits()) - .build(), - new TransportServiceCallback<>() { - @Override - public void onSuccess(GetResourcesResponseMsg msg) { responseMsg[0] = msg; - latch.countDown(); - } - - @Override - public void onError(Throwable e) { - log.trace("[{}] [{}] Failed to process credentials ", tenantId, e); - latch.countDown(); - } - }); - try { - latch.await(this.getLwM2MTransportConfigServer().getTimeout(), TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - log.error("Failed to await credentials!", e); - } - return responseMsg[0]; - } +// public GetResourcesResponseMsg getResourceTenantProcess (UUID tenantId, String resourceType) { +// CountDownLatch latch = new CountDownLatch(2); +// final GetResourcesResponseMsg[] responseMsg = {null}; +// this.getTransportService().process(GetResourcesRequestMsg.newBuilder() +// .setResourceType(resourceType) +// .setTenantIdLSB(tenantId.getLeastSignificantBits()) +// .setTenantIdMSB(tenantId.getMostSignificantBits()) +// .build(), +// new TransportServiceCallback<>() { +// @Override +// public void onSuccess(GetResourcesResponseMsg msg) { responseMsg[0] = msg; +// latch.countDown(); +// } +// +// @Override +// public void onError(Throwable e) { +// log.trace("[{}] [{}] Failed to process credentials ", tenantId, e); +// latch.countDown(); +// } +// }); +// try { +// latch.await(this.getLwM2MTransportConfigServer().getTimeout(), TimeUnit.MILLISECONDS); +// } catch (InterruptedException e) { +// log.error("Failed to await credentials!", e); +// } +// return responseMsg[0]; +// } } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServerConfiguration.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServerConfiguration.java index df29c435bd..7fa417b145 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServerConfiguration.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServerConfiguration.java @@ -30,9 +30,6 @@ import org.eclipse.leshan.server.security.SecurityChecker; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; -import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.transport.resource.ResourceType; -import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl; @@ -101,7 +98,7 @@ public class LwM2mTransportServerConfiguration { builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort)); /** Define model provider (Create Models )*/ - TransportProtos.GetResourcesResponseMsg responseMsg= this.context.getResourceTenantProcess(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); +// TransportProtos.GetResourcesResponseMsg responseMsg= this.context.getResourceTenantProcess(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); // TransportProtos.GetResourcesResponseMsg responseMsg= this.context.getResourceTenant(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); // LwM2mModelProvider modelProvider = new VersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueCommon()); LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueServer(), this.lwM2mClientContext); diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServiceImpl.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServiceImpl.java index 0032946302..df469d5a96 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServiceImpl.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServiceImpl.java @@ -40,8 +40,6 @@ import org.springframework.stereotype.Service; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; -import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.transport.resource.ResourceType; import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.adaptor.AdaptorException; import org.thingsboard.server.common.transport.adaptor.JsonConverter; @@ -156,7 +154,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { try { log.warn("[{}] [{{}] Client: create after Registration", registration.getEndpoint(), registration.getId()); ((LwM2mVersionedModelProvider)leshanServer.getModelProvider()).setRepository(this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getModelsValueCommon()); - TransportProtos.GetResourcesResponseMsg responseMsg= this.lwM2mTransportContextServer.getResourceTenantProcess(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); +// TransportProtos.GetResourcesResponseMsg responseMsg= this.lwM2mTransportContextServer.getResourceTenantProcess(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); // TransportProtos.GetResourcesResponseMsg responseMsg= this.lwM2mTransportContextServer.getResourceTenant(TenantId.SYS_TENANT_ID.getId(), ResourceType.LWM2M_MODEL.name()); // (((VersionedModelProvider) (leshanServer)).modelProvider).repository; diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportResourceCache.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportResourceCache.java new file mode 100644 index 0000000000..34e95189fa --- /dev/null +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportResourceCache.java @@ -0,0 +1,29 @@ +/** + * Copyright © 2016-2021 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.common.transport; + +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; +import org.thingsboard.server.common.data.id.TenantId; + +public interface TransportResourceCache { + + Resource get(TenantId tenantId, ResourceType resourceType, String resourceId); + + void update(TenantId tenantId, ResourceType resourceType, String resourceI); + + void evict(TenantId tenantId, ResourceType resourceType, String resourceId); +} diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportService.java index cce43b3995..04b08272b1 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportService.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportService.java @@ -25,8 +25,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestM import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequestMsg; import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg; import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg; -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesRequestMsg; -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesResponseMsg; +import org.thingsboard.server.gen.transport.TransportProtos.GetResourceRequestMsg; +import org.thingsboard.server.gen.transport.TransportProtos.GetResourceResponseMsg; import org.thingsboard.server.gen.transport.TransportProtos.LwM2MRequestMsg; import org.thingsboard.server.gen.transport.TransportProtos.LwM2MResponseMsg; import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg; @@ -53,7 +53,7 @@ public interface TransportService { GetEntityProfileResponseMsg getEntityProfile(GetEntityProfileRequestMsg msg); - GetResourcesResponseMsg getResources(GetResourcesRequestMsg msg); + GetResourceResponseMsg getResource(GetResourceRequestMsg msg); void process(DeviceTransportType transportType, ValidateDeviceTokenRequestMsg msg, TransportServiceCallback callback); @@ -75,9 +75,8 @@ public interface TransportService { void onProfileUpdate(DeviceProfile deviceProfile); - void process(LwM2MRequestMsg msg, TransportServiceCallback callback); - - void process(GetResourcesRequestMsg msg, TransportServiceCallback callback); + void process(LwM2MRequestMsg msg, + TransportServiceCallback callback); void process(SessionInfoProto sessionInfo, SessionEventMsg msg, TransportServiceCallback callback); diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportResourceCache.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportResourceCache.java new file mode 100644 index 0000000000..5160479d1e --- /dev/null +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportResourceCache.java @@ -0,0 +1,130 @@ +/** + * Copyright © 2016-2021 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.common.transport.service; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.transport.TransportResourceCache; +import org.thingsboard.server.common.transport.TransportService; +import org.thingsboard.server.common.transport.util.DataDecodingEncodingService; +import org.thingsboard.server.gen.transport.TransportProtos; +import org.thingsboard.server.queue.util.TbTransportComponent; + +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@Slf4j +@Component +@TbTransportComponent +public class DefaultTransportResourceCache implements TransportResourceCache { + + private final Lock resourceFetchLock = new ReentrantLock(); + private final ConcurrentMap resources = new ConcurrentHashMap<>(); + private final Set keys = ConcurrentHashMap.newKeySet(); + private final DataDecodingEncodingService dataDecodingEncodingService; + private final TransportService transportService; + + public DefaultTransportResourceCache(DataDecodingEncodingService dataDecodingEncodingService, @Lazy TransportService transportService) { + this.dataDecodingEncodingService = dataDecodingEncodingService; + this.transportService = transportService; + } + + @Override + public Resource get(TenantId tenantId, ResourceType resourceType, String resourceId) { + ResourceKey resourceKey = new ResourceKey(tenantId, resourceType, resourceId); + Resource resource; + + if (keys.contains(resourceKey)) { + resource = resources.get(resourceKey); + if (resource == null) { + resource = resources.get(resourceKey.getSystemKey()); + } + } else { + resourceFetchLock.lock(); + try { + if (keys.contains(resourceKey)) { + resource = resources.get(resourceKey); + if (resource == null) { + resource = resources.get(resourceKey.getSystemKey()); + } + } else { + resource = fetchResource(resourceKey); + keys.add(resourceKey); + } + } finally { + resourceFetchLock.unlock(); + } + } + + return resource; + } + + private Resource fetchResource(ResourceKey resourceKey) { + UUID tenantId = resourceKey.getTenantId().getId(); + TransportProtos.GetResourceRequestMsg.Builder builder = TransportProtos.GetResourceRequestMsg.newBuilder(); + builder + .setTenantIdLSB(tenantId.getLeastSignificantBits()) + .setTenantIdMSB(tenantId.getMostSignificantBits()) + .setResourceType(resourceKey.resourceType.name()) + .setResourceId(resourceKey.resourceId); + TransportProtos.GetResourceResponseMsg responseMsg = transportService.getResource(builder.build()); + + Optional optionalResource = dataDecodingEncodingService.decode(responseMsg.getResource().toByteArray()); + if (optionalResource.isPresent()) { + Resource resource = optionalResource.get(); + resources.put(new ResourceKey(resource.getTenantId(), resource.getResourceType(), resource.getResourceId()), resource); + return resource; + } + + return null; + } + + @Override + public void update(TenantId tenantId, ResourceType resourceType, String resourceId) { + ResourceKey resourceKey = new ResourceKey(tenantId, resourceType, resourceId); + if (keys.contains(resourceKey) || resources.containsKey(resourceKey)) { + fetchResource(resourceKey); + } + } + + @Override + public void evict(TenantId tenantId, ResourceType resourceType, String resourceId) { + ResourceKey resourceKey = new ResourceKey(tenantId, resourceType, resourceId); + keys.remove(resourceKey); + resources.remove(resourceKey); + } + + @Data + private static class ResourceKey { + private final TenantId tenantId; + private final ResourceType resourceType; + private final String resourceId; + + public ResourceKey getSystemKey() { + return new ResourceKey(TenantId.SYS_TENANT_ID, resourceType, resourceId); + } + } +} diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java index 1f1d6c6c26..6a8526f543 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java @@ -31,6 +31,7 @@ import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceProfileId; @@ -49,6 +50,7 @@ import org.thingsboard.server.common.stats.StatsFactory; import org.thingsboard.server.common.stats.StatsType; import org.thingsboard.server.common.transport.SessionMsgListener; import org.thingsboard.server.common.transport.TransportDeviceProfileCache; +import org.thingsboard.server.common.transport.TransportResourceCache; import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportServiceCallback; import org.thingsboard.server.common.transport.TransportTenantProfileCache; @@ -130,6 +132,7 @@ public class DefaultTransportService implements TransportService { private final TransportRateLimitService rateLimitService; private final DataDecodingEncodingService dataDecodingEncodingService; private final SchedulerComponent scheduler; + private final TransportResourceCache transportResourceCache; protected TbQueueRequestTemplate, TbProtoQueueMsg> transportApiRequestTemplate; protected TbQueueProducer> ruleEngineMsgProducer; @@ -156,7 +159,7 @@ public class DefaultTransportService implements TransportService { TransportDeviceProfileCache deviceProfileCache, TransportTenantProfileCache tenantProfileCache, TbApiUsageClient apiUsageClient, TransportRateLimitService rateLimitService, - DataDecodingEncodingService dataDecodingEncodingService, SchedulerComponent scheduler) { + DataDecodingEncodingService dataDecodingEncodingService, SchedulerComponent scheduler, TransportResourceCache transportResourceCache) { this.serviceInfoProvider = serviceInfoProvider; this.queueProvider = queueProvider; this.producerProvider = producerProvider; @@ -168,6 +171,7 @@ public class DefaultTransportService implements TransportService { this.rateLimitService = rateLimitService; this.dataDecodingEncodingService = dataDecodingEncodingService; this.scheduler = scheduler; + this.transportResourceCache = transportResourceCache; } @PostConstruct @@ -254,27 +258,17 @@ public class DefaultTransportService implements TransportService { } @Override - public TransportProtos.GetResourcesResponseMsg getResources(TransportProtos.GetResourcesRequestMsg msg) { + public TransportProtos.GetResourceResponseMsg getResource(TransportProtos.GetResourceRequestMsg msg) { TbProtoQueueMsg protoMsg = - new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setResourcesRequestMsg(msg).build()); + new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setResourceRequestMsg(msg).build()); try { TbProtoQueueMsg response = transportApiRequestTemplate.send(protoMsg).get(); - return response.getValue().getResourcesResponseMsg(); + return response.getValue().getResourceResponseMsg(); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } } - @Override - public void process(TransportProtos.GetResourcesRequestMsg msg, TransportServiceCallback callback) { - log.trace("Processing msg: {}", msg); - TbProtoQueueMsg protoMsg = - new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setResourcesRequestMsg(msg).build()); - AsyncCallbackTemplate.withCallback(transportApiRequestTemplate.send(protoMsg), - response -> callback.onSuccess(response.getValue().getResourcesResponseMsg()), callback::onError, transportCallbackExecutor); - } - - @Override public void process(DeviceTransportType transportType, TransportProtos.ValidateDeviceTokenRequestMsg msg, TransportServiceCallback callback) { @@ -711,9 +705,17 @@ public class DefaultTransportService implements TransportService { rateLimitService.remove(new DeviceId(entityUuid)); } } else if (toSessionMsg.hasResourceUpdateMsg()) { - //TODO: update resource cache + TransportProtos.ResourceUpdateMsg msg = toSessionMsg.getResourceUpdateMsg(); + TenantId tenantId = new TenantId(new UUID(msg.getTenantIdMSB(), msg.getTenantIdLSB())); + ResourceType resourceType = ResourceType.valueOf(msg.getResourceType()); + String resourceId = msg.getResourceId(); + transportResourceCache.update(tenantId, resourceType, resourceId); } else if (toSessionMsg.hasResourceDeleteMsg()) { - //TODO: remove resource from cache + TransportProtos.ResourceDeleteMsg msg = toSessionMsg.getResourceDeleteMsg(); + TenantId tenantId = new TenantId(new UUID(msg.getTenantIdMSB(), msg.getTenantIdLSB())); + ResourceType resourceType = ResourceType.valueOf(msg.getResourceType()); + String resourceId = msg.getResourceId(); + transportResourceCache.evict(tenantId, resourceType, resourceId); } else { //TODO: should we notify the device actor about missed session? log.debug("[{}] Missing session.", sessionId); diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/util/ProtoWithFSTService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/util/ProtoWithFSTService.java index a3b65c2248..4d0b8bb86a 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/util/ProtoWithFSTService.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/util/ProtoWithFSTService.java @@ -18,8 +18,6 @@ package org.thingsboard.server.common.transport.util; import lombok.extern.slf4j.Slf4j; import org.nustaq.serialization.FSTConfiguration; import org.springframework.stereotype.Service; -import org.thingsboard.server.common.msg.TbActorMsg; -import org.thingsboard.server.common.transport.util.DataDecodingEncodingService; import java.util.Optional; @@ -33,8 +31,8 @@ public class ProtoWithFSTService implements DataDecodingEncodingService { public Optional decode(byte[] byteArray) { try { @SuppressWarnings("unchecked") - T msg = (T) config.asObject(byteArray); - return Optional.of(msg); + T msg = byteArray != null && byteArray.length > 0 ? (T) config.asObject(byteArray) : null; + return Optional.ofNullable(msg); } catch (IllegalArgumentException e) { log.error("Error during deserialization message, [{}]", e.getMessage()); return Optional.empty(); diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ResourceCompositeKey.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ResourceCompositeKey.java index 828f1f4341..6592cf757d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ResourceCompositeKey.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ResourceCompositeKey.java @@ -18,8 +18,7 @@ package org.thingsboard.server.dao.model.sql; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.thingsboard.server.common.data.relation.EntityRelation; -import org.thingsboard.server.common.data.transport.resource.Resource; +import org.thingsboard.server.common.data.Resource; import javax.persistence.Transient; import java.io.Serializable; diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ResourceEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ResourceEntity.java index a877afa027..fdb24e6159 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ResourceEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ResourceEntity.java @@ -16,9 +16,9 @@ package org.thingsboard.server.dao.model.sql; import lombok.Data; +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.transport.resource.Resource; -import org.thingsboard.server.common.data.transport.resource.ResourceType; import org.thingsboard.server.dao.model.ToData; import javax.persistence.Column; diff --git a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java index c33c1b1b7e..a451a4e627 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java @@ -17,9 +17,11 @@ package org.thingsboard.server.dao.resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.transport.resource.Resource; -import org.thingsboard.server.common.data.transport.resource.ResourceType; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.exception.DataValidationException; import java.util.List; @@ -59,12 +61,13 @@ public class BaseResourceService implements ResourceService { } @Override - public List findResourcesByTenantId(TenantId tenantId) { + public PageData findResourcesByTenantId(TenantId tenantId, PageLink pageLink) { log.trace("Executing findByTenantId [{}]", tenantId); validateId(tenantId, INCORRECT_TENANT_ID + tenantId); - return resourceDao.findAllByTenantId(tenantId); + return resourceDao.findAllByTenantId(tenantId, pageLink); } + @Override public List findResourcesByTenantIdResourceType(TenantId tenantId, ResourceType resourceType) { log.trace("Executing findByTenantId [{}]", tenantId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/resource/ResourceDao.java b/dao/src/main/java/org/thingsboard/server/dao/resource/ResourceDao.java index defca18533..68ad4db4fb 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/resource/ResourceDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/resource/ResourceDao.java @@ -15,9 +15,11 @@ */ package org.thingsboard.server.dao.resource; +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.transport.resource.Resource; -import org.thingsboard.server.common.data.transport.resource.ResourceType; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; import java.util.List; @@ -29,7 +31,8 @@ public interface ResourceDao { void deleteResource(TenantId tenantId, ResourceType resourceType, String resourceId); - List findAllByTenantId(TenantId tenantId); + PageData findAllByTenantId(TenantId tenantId, PageLink pageLink); + List findAllByTenantIdResourceType(TenantId tenantId, ResourceType resourceType); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/ResourceDaoImpl.java b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/ResourceDaoImpl.java index e1137562da..e0cddcc555 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/ResourceDaoImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/ResourceDaoImpl.java @@ -18,9 +18,11 @@ package org.thingsboard.server.dao.sql.resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import org.thingsboard.server.common.data.Resource; +import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.transport.resource.Resource; -import org.thingsboard.server.common.data.transport.resource.ResourceType; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.model.sql.ResourceCompositeKey; import org.thingsboard.server.dao.model.sql.ResourceEntity; @@ -66,8 +68,8 @@ public class ResourceDaoImpl implements ResourceDao { } @Override - public List findAllByTenantId(TenantId tenantId) { - return DaoUtil.convertDataList(resourceRepository.findAllByTenantId(tenantId.getId())); + public PageData findAllByTenantId(TenantId tenantId, PageLink pageLink) { + return DaoUtil.toPageData(resourceRepository.findAllByTenantId(tenantId.getId(), DaoUtil.toPageable(pageLink))); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/ResourceRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/ResourceRepository.java index 49cc71b972..c33c9786bd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/ResourceRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/ResourceRepository.java @@ -15,6 +15,8 @@ */ package org.thingsboard.server.dao.sql.resource; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.repository.CrudRepository; import org.thingsboard.server.dao.model.sql.ResourceCompositeKey; import org.thingsboard.server.dao.model.sql.ResourceEntity; @@ -24,7 +26,8 @@ import java.util.UUID; public interface ResourceRepository extends CrudRepository { - List findAllByTenantId(UUID tenantId); + Page findAllByTenantId(UUID tenantId, Pageable pageable); + List findAllByTenantIdAndResourceType(UUID tenantId, String resourceType);