diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml
index 527249e999..a748c33ac6 100644
--- a/common/dao-api/pom.xml
+++ b/common/dao-api/pom.xml
@@ -115,6 +115,10 @@
awaitility
test
+
+ org.apache.commons
+ commons-text
+
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java
index b8041aa3fc..4bd1eb79fc 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java
@@ -30,13 +30,14 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AlarmData;
import org.thingsboard.server.common.data.query.AlarmDataQuery;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.Collection;
/**
* Created by ashvayka on 11.05.17.
*/
-public interface AlarmService {
+public interface AlarmService extends TbEntityService {
AlarmOperationResult createOrUpdateAlarm(Alarm alarm);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/asset/AssetProfileService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/asset/AssetProfileService.java
index c86463336a..c8200812dc 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/asset/AssetProfileService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/asset/AssetProfileService.java
@@ -21,8 +21,9 @@ import org.thingsboard.server.common.data.id.AssetProfileId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
-public interface AssetProfileService {
+public interface AssetProfileService extends TbEntityService {
AssetProfile findAssetProfileById(TenantId tenantId, AssetProfileId assetProfileId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/asset/AssetService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/asset/AssetService.java
index 955444ac52..fc8f8ca88e 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/asset/AssetService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/asset/AssetService.java
@@ -27,10 +27,11 @@ import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
-public interface AssetService {
+public interface AssetService extends TbEntityService {
AssetInfo findAssetInfoById(TenantId tenantId, AssetId assetId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/audit/AuditLogService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/audit/AuditLogService.java
index 01b3bf4b5e..c810971ee5 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/audit/AuditLogService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/audit/AuditLogService.java
@@ -25,10 +25,11 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.TimePageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
-public interface AuditLogService {
+public interface AuditLogService extends TbEntityService {
PageData findAuditLogsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, List actionTypes, TimePageLink pageLink);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/customer/CustomerService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/customer/CustomerService.java
index 3f28512946..d8a904d7c1 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/customer/CustomerService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/customer/CustomerService.java
@@ -21,10 +21,11 @@ import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.Optional;
-public interface CustomerService {
+public interface CustomerService extends TbEntityService {
Customer findCustomerById(TenantId tenantId, CustomerId customerId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java
index 4032797b5b..9f7f3ae3e0 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java
@@ -24,10 +24,11 @@ import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
-public interface DashboardService {
+public interface DashboardService extends TbEntityService {
Dashboard findDashboardById(TenantId tenantId, DashboardId dashboardId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceProfileService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceProfileService.java
index fdf3b8e594..ec5673ce15 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceProfileService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceProfileService.java
@@ -17,13 +17,13 @@ package org.thingsboard.server.dao.device;
import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.DeviceProfileInfo;
-import org.thingsboard.server.common.data.EntityInfo;
import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
-public interface DeviceProfileService {
+public interface DeviceProfileService extends TbEntityService {
DeviceProfile findDeviceProfileById(TenantId tenantId, DeviceProfileId deviceProfileId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceService.java
index d68e8e1bf6..9ce266e12a 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceService.java
@@ -33,11 +33,12 @@ import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.dao.device.provision.ProvisionRequest;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
import java.util.UUID;
-public interface DeviceService {
+public interface DeviceService extends TbEntityService {
DeviceInfo findDeviceInfoById(TenantId tenantId, DeviceId deviceId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java
index b3372bf30c..b9fb6d8fcf 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java
@@ -26,11 +26,12 @@ import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
import java.util.Optional;
-public interface EdgeService {
+public interface EdgeService extends TbEntityService {
Edge findEdgeById(TenantId tenantId, EdgeId edgeId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java
index 986da96d46..9362dbef7a 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java
@@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.entity;
-import com.google.common.util.concurrent.ListenableFuture;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
@@ -24,9 +23,11 @@ import org.thingsboard.server.common.data.query.EntityCountQuery;
import org.thingsboard.server.common.data.query.EntityData;
import org.thingsboard.server.common.data.query.EntityDataQuery;
+import java.util.Optional;
+
public interface EntityService {
- ListenableFuture fetchEntityNameAsync(TenantId tenantId, EntityId entityId);
+ Optional fetchEntityName(TenantId tenantId, EntityId entityId);
CustomerId fetchEntityCustomerId(TenantId tenantId, EntityId entityId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityServiceBeanFactory.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityServiceBeanFactory.java
new file mode 100644
index 0000000000..ff91d16d72
--- /dev/null
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityServiceBeanFactory.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright © 2016-2022 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.dao.entity;
+
+import org.apache.commons.text.CaseUtils;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.stereotype.Service;
+import org.thingsboard.server.common.data.EntityType;
+
+@Service
+public class EntityServiceBeanFactory {
+
+ private static final String SERVICE_SUFFIX = "DaoService";
+
+ private final BeanFactory beanFactory;
+
+ public EntityServiceBeanFactory(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ public TbEntityService getServiceByEntityType(EntityType entityType) {
+ String beanName = EntityType.RULE_NODE.equals(entityType) ? getBeanName(EntityType.RULE_CHAIN) : getBeanName(entityType);
+ return beanFactory.getBean(beanName, TbEntityService.class);
+ }
+
+ private String getBeanName(EntityType entityType) {
+ return CaseUtils.toCamelCase(entityType.name(), true, '_') + SERVICE_SUFFIX;
+ }
+
+}
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/TbEntityService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/TbEntityService.java
new file mode 100644
index 0000000000..0ce6a75b80
--- /dev/null
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/entity/TbEntityService.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright © 2016-2022 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.dao.entity;
+
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
+import org.thingsboard.server.common.data.id.TenantId;
+
+import java.util.Optional;
+
+public interface TbEntityService {
+
+ Optional> fetchEntity(TenantId tenantId, EntityId entityId);
+
+}
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java
index bb790c78cb..7d0cb1211d 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java
@@ -27,13 +27,14 @@ import org.thingsboard.server.common.data.id.EntityViewId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
/**
* Created by Victor Basanets on 8/27/2017.
*/
-public interface EntityViewService {
+public interface EntityViewService extends TbEntityService {
EntityView saveEntityView(EntityView entityView);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/event/EventService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/event/EventService.java
index 3b0de80811..00e6bea2de 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/event/EventService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/event/EventService.java
@@ -24,10 +24,11 @@ import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.TimePageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
-public interface EventService {
+public interface EventService extends TbEntityService {
ListenableFuture saveAsync(Event event);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java
index c643ae4797..fe44038ccb 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java
@@ -25,10 +25,11 @@ import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
import org.thingsboard.server.common.data.ota.OtaPackageType;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.nio.ByteBuffer;
-public interface OtaPackageService {
+public interface OtaPackageService extends TbEntityService {
OtaPackageInfo saveOtaPackageInfo(OtaPackageInfo otaPackageInfo, boolean isUrl);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/queue/QueueService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/queue/QueueService.java
index acc3190da9..02b465602e 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/queue/QueueService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/queue/QueueService.java
@@ -20,10 +20,11 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.queue.Queue;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
-public interface QueueService {
+public interface QueueService extends TbEntityService {
Queue saveQueue(Queue queue);
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 1cce5ae62a..1f6cba7062 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
@@ -23,10 +23,11 @@ import org.thingsboard.server.common.data.id.TbResourceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
-public interface ResourceService {
+public interface ResourceService extends TbEntityService {
TbResource saveResource(TbResource resource);
TbResource getResource(TenantId tenantId, ResourceType resourceType, String resourceId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/rpc/RpcService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/rpc/RpcService.java
index 25a82e6113..431fdb5bda 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/rpc/RpcService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/rpc/RpcService.java
@@ -23,8 +23,9 @@ import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.rpc.Rpc;
import org.thingsboard.server.common.data.rpc.RpcStatus;
+import org.thingsboard.server.dao.entity.TbEntityService;
-public interface RpcService {
+public interface RpcService extends TbEntityService {
Rpc save(Rpc rpc);
void deleteRpc(TenantId tenantId, RpcId id);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java
index 9a856ae66a..8baf3783e7 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java
@@ -31,6 +31,7 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.common.data.rule.RuleChainUpdateResult;
import org.thingsboard.server.common.data.rule.RuleNode;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.Collection;
import java.util.List;
@@ -38,7 +39,7 @@ import java.util.List;
/**
* Created by igor on 3/12/18.
*/
-public interface RuleChainService {
+public interface RuleChainService extends TbEntityService {
RuleChain saveRuleChain(RuleChain ruleChain);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileService.java
index c15ac84b3a..91b1d70a61 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileService.java
@@ -21,8 +21,9 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.TenantProfileId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
-public interface TenantProfileService {
+public interface TenantProfileService extends TbEntityService {
TenantProfile findTenantProfileById(TenantId tenantId, TenantProfileId tenantProfileId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java
index 2dcccc843f..8186623ed2 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java
@@ -22,10 +22,11 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.TenantProfileId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
-public interface TenantService {
+public interface TenantService extends TbEntityService {
Tenant findTenantById(TenantId tenantId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateService.java
index 44950d2803..93fd1d1f00 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateService.java
@@ -19,8 +19,9 @@ import org.thingsboard.server.common.data.ApiUsageState;
import org.thingsboard.server.common.data.id.ApiUsageStateId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
+import org.thingsboard.server.dao.entity.TbEntityService;
-public interface ApiUsageStateService {
+public interface ApiUsageStateService extends TbEntityService {
ApiUsageState createDefaultApiUsageState(TenantId id, EntityId entityId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java
index 76891e950f..53e89d7a51 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java
@@ -24,8 +24,9 @@ import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.security.UserCredentials;
+import org.thingsboard.server.dao.entity.TbEntityService;
-public interface UserService {
+public interface UserService extends TbEntityService {
User findUserById(TenantId tenantId, UserId userId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java
index 15875bfb9a..d2a4e8ee2a 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java
@@ -20,10 +20,11 @@ import org.thingsboard.server.common.data.id.WidgetTypeId;
import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
import org.thingsboard.server.common.data.widget.WidgetTypeInfo;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
-public interface WidgetTypeService {
+public interface WidgetTypeService extends TbEntityService {
WidgetType findWidgetTypeById(TenantId tenantId, WidgetTypeId widgetTypeId);
diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java
index f9a5844606..d0ef55a91e 100644
--- a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java
+++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java
@@ -20,10 +20,11 @@ import org.thingsboard.server.common.data.id.WidgetsBundleId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.widget.WidgetsBundle;
+import org.thingsboard.server.dao.entity.TbEntityService;
import java.util.List;
-public interface WidgetsBundleService {
+public interface WidgetsBundleService extends TbEntityService {
WidgetsBundle findWidgetsBundleById(TenantId tenantId, WidgetsBundleId widgetsBundleId);
diff --git a/dao/pom.xml b/dao/pom.xml
index 8de92c3640..7ccd82eb80 100644
--- a/dao/pom.xml
+++ b/dao/pom.xml
@@ -108,6 +108,10 @@
org.apache.commons
commons-lang3
+
+ org.apache.commons
+ commons-text
+
commons-collections
commons-collections
diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
index e6012602f1..abc2712bbc 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
@@ -38,6 +38,7 @@ import org.thingsboard.server.common.data.exception.ApiUsageLimitsExceededExcept
import org.thingsboard.server.common.data.id.AlarmId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AlarmData;
@@ -58,6 +59,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@@ -67,7 +69,7 @@ import java.util.stream.Stream;
import static org.thingsboard.server.dao.service.Validator.validateId;
-@Service
+@Service("AlarmDaoService")
@Slf4j
public class BaseAlarmService extends AbstractEntityService implements AlarmService {
@@ -279,14 +281,12 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
public ListenableFuture findAlarmInfoByIdAsync(TenantId tenantId, AlarmId alarmId) {
log.trace("Executing findAlarmInfoByIdAsync [{}]", alarmId);
validateId(alarmId, "Incorrect alarmId " + alarmId);
- return Futures.transformAsync(alarmDao.findAlarmByIdAsync(tenantId, alarmId.getId()),
+ return Futures.transform(alarmDao.findAlarmByIdAsync(tenantId, alarmId.getId()),
a -> {
AlarmInfo alarmInfo = new AlarmInfo(a);
- return Futures.transform(
- entityService.fetchEntityNameAsync(tenantId, alarmInfo.getOriginator()), originatorName -> {
- alarmInfo.setOriginatorName(originatorName);
- return alarmInfo;
- }, MoreExecutors.directExecutor());
+ Optional originatorNameOpt = entityService.fetchEntityName(tenantId, alarmInfo.getOriginator());
+ alarmInfo.setOriginatorName(originatorNameOpt.isEmpty() ? "N/A" : originatorNameOpt.get());
+ return alarmInfo;
}, MoreExecutors.directExecutor());
}
@@ -311,15 +311,9 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
private ListenableFuture> fetchAlarmsOriginators(TenantId tenantId, PageData alarms) {
List> alarmFutures = new ArrayList<>(alarms.getData().size());
for (AlarmInfo alarmInfo : alarms.getData()) {
- alarmFutures.add(Futures.transform(
- entityService.fetchEntityNameAsync(tenantId, alarmInfo.getOriginator()), originatorName -> {
- if (originatorName == null) {
- originatorName = "Deleted";
- }
- alarmInfo.setOriginatorName(originatorName);
- return alarmInfo;
- }, MoreExecutors.directExecutor()
- ));
+ Optional originatorNameOpt = entityService.fetchEntityName(tenantId, alarmInfo.getOriginator());
+ alarmInfo.setOriginatorName(originatorNameOpt.isEmpty() ? "Deleted" : originatorNameOpt.get());
+ alarmFutures.add(Futures.immediateFuture(alarmInfo));
}
return Futures.transform(Futures.successfulAsList(alarmFutures),
alarmInfos -> new PageData<>(alarmInfos, alarms.getTotalPages(), alarms.getTotalElements(),
@@ -409,4 +403,10 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
Alarm entity = alarmDao.findAlarmById(tenantId, alarmId.getId());
return function.apply(entity);
}
+
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findAlarmById(tenantId, new AlarmId(entityId.getId())));
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java
index 58470cfc6b..75de5ba5d0 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileServiceImpl.java
@@ -26,6 +26,8 @@ import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.asset.AssetProfile;
import org.thingsboard.server.common.data.asset.AssetProfileInfo;
import org.thingsboard.server.common.data.id.AssetProfileId;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@@ -38,10 +40,11 @@ import org.thingsboard.server.dao.service.Validator;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;
-@Service
+@Service("AssetProfileDaoService")
@Slf4j
public class AssetProfileServiceImpl extends AbstractCachedEntityService implements AssetProfileService {
@@ -264,6 +267,11 @@ public class AssetProfileServiceImpl extends AbstractCachedEntityService> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findAssetProfileById(tenantId, new AssetProfileId(entityId.getId())));
+ }
+
private PaginatedRemover tenantAssetProfilesRemover =
new PaginatedRemover<>() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java
index 15d6df1327..e65a886833 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java
@@ -38,6 +38,7 @@ import org.thingsboard.server.common.data.id.AssetProfileId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@@ -53,6 +54,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.Optional;
import java.util.stream.Collectors;
import static org.thingsboard.server.dao.DaoUtil.toUUIDs;
@@ -61,7 +63,7 @@ import static org.thingsboard.server.dao.service.Validator.validateIds;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
import static org.thingsboard.server.dao.service.Validator.validateString;
-@Service
+@Service("AssetDaoService")
@Slf4j
public class BaseAssetService extends AbstractCachedEntityService implements AssetService {
@@ -429,4 +431,10 @@ public class BaseAssetService extends AbstractCachedEntityService> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findAssetById(tenantId, new AssetId(entityId.getId())));
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java
index 8bb862bea5..2ee07fd30c 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java
@@ -36,6 +36,7 @@ import org.thingsboard.server.common.data.audit.AuditLog;
import org.thingsboard.server.common.data.id.AuditLogId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
@@ -53,6 +54,7 @@ import org.thingsboard.server.dao.service.DataValidator;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;
+import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -60,7 +62,7 @@ import static org.thingsboard.server.dao.service.Validator.validateEntityId;
import static org.thingsboard.server.dao.service.Validator.validateId;
@Slf4j
-@Service
+@Service("AuditLogDaoService")
@ConditionalOnProperty(prefix = "audit-log", value = "enabled", havingValue = "true")
public class AuditLogServiceImpl implements AuditLogService {
@@ -121,13 +123,14 @@ public class AuditLogServiceImpl implements AuditLogService {
JsonNode actionData = constructActionData(entityId, entity, actionType, additionalInfo);
ActionStatus actionStatus = ActionStatus.SUCCESS;
String failureDetails = "";
- String entityName = "";
+ String entityName = "N/A";
if (entity != null) {
entityName = entity.getName();
} else {
try {
- entityName = entityService.fetchEntityNameAsync(tenantId, entityId).get();
- } catch (Exception ex) {
+ Optional entityNameOpt = entityService.fetchEntityName(tenantId, entityId);
+ entityName = entityNameOpt.orElse(entityName);
+ } catch (Exception ignored) {
}
}
if (e != null) {
@@ -403,4 +406,9 @@ public class AuditLogServiceImpl implements AuditLogService {
return Futures.allAsList(futures);
}
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.empty();
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/audit/DummyAuditLogServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/audit/DummyAuditLogServiceImpl.java
index 8f4ebb9102..40b3b77c2e 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/audit/DummyAuditLogServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/audit/DummyAuditLogServiceImpl.java
@@ -23,14 +23,16 @@ import org.thingsboard.server.common.data.audit.ActionType;
import org.thingsboard.server.common.data.audit.AuditLog;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.TimePageLink;
import java.util.List;
+import java.util.Optional;
-@Service
+@Service("AuditLogDaoService")
@ConditionalOnProperty(prefix = "audit-log", value = "enabled", havingValue = "false")
public class DummyAuditLogServiceImpl implements AuditLogService {
@@ -58,4 +60,10 @@ public class DummyAuditLogServiceImpl implements AuditLogService {
public ListenableFuture> logEntityAction(TenantId tenantId, CustomerId customerId, UserId userId, String userName, I entityId, E entity, ActionType actionType, Exception e, Object... additionalInfo) {
return null;
}
+
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.empty();
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
index 093ad4b65c..aad5de33f7 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
@@ -25,6 +25,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.id.CustomerId;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@@ -44,7 +46,7 @@ import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;
-@Service
+@Service("CustomerDaoService")
@Slf4j
public class CustomerServiceImpl extends AbstractEntityService implements CustomerService {
@@ -178,4 +180,10 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom
deleteCustomer(tenantId, new CustomerId(entity.getUuidId()));
}
};
+
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findCustomerById(tenantId, new CustomerId(entityId.getId())));
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java
index 2de73826e3..d40c559856 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java
@@ -28,6 +28,8 @@ import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.EdgeId;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@@ -42,10 +44,11 @@ import org.thingsboard.server.dao.service.PaginatedRemover;
import org.thingsboard.server.dao.service.Validator;
import java.util.List;
+import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;
-@Service
+@Service("DashboardDaoService")
@Slf4j
public class DashboardServiceImpl extends AbstractEntityService implements DashboardService {
@@ -307,6 +310,11 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb
}
};
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findDashboardById(tenantId, new DashboardId(entityId.getId())));
+ }
+
private class CustomerDashboardsUnassigner extends PaginatedRemover {
private Customer customer;
diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java
index 40d190162f..e459d3f48d 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java
@@ -34,6 +34,8 @@ import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileTra
import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
import org.thingsboard.server.common.data.device.profile.DisabledDeviceProfileProvisionConfiguration;
import org.thingsboard.server.common.data.id.DeviceProfileId;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@@ -47,10 +49,11 @@ import org.thingsboard.server.dao.service.Validator;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;
-@Service
+@Service("DeviceProfileDaoService")
@Slf4j
public class DeviceProfileServiceImpl extends AbstractCachedEntityService implements DeviceProfileService {
@@ -286,6 +289,11 @@ public class DeviceProfileServiceImpl extends AbstractCachedEntityService> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findDeviceProfileById(tenantId, new DeviceProfileId(entityId.getId())));
+ }
+
private PaginatedRemover tenantDeviceProfilesRemover =
new PaginatedRemover<>() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java
index 486570dc2e..d095e3d96c 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java
@@ -53,6 +53,7 @@ import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.ota.OtaPackageType;
import org.thingsboard.server.common.data.page.PageData;
@@ -76,6 +77,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -85,7 +87,7 @@ import static org.thingsboard.server.dao.service.Validator.validateIds;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
import static org.thingsboard.server.dao.service.Validator.validateString;
-@Service
+@Service("DeviceDaoService")
@Slf4j
public class DeviceServiceImpl extends AbstractCachedEntityService implements DeviceService {
@@ -705,4 +707,10 @@ public class DeviceServiceImpl extends AbstractCachedEntityService> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findDeviceById(tenantId, new DeviceId(entityId.getId())));
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java
index 3ab3f6d905..68763786ef 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java
@@ -40,6 +40,7 @@ import org.thingsboard.server.common.data.edge.EdgeSearchQuery;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.IdBased;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.TenantId;
@@ -75,7 +76,7 @@ import static org.thingsboard.server.dao.service.Validator.validateIds;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
import static org.thingsboard.server.dao.service.Validator.validateString;
-@Service
+@Service("EdgeDaoService")
@Slf4j
public class EdgeServiceImpl extends AbstractCachedEntityService implements EdgeService {
@@ -519,4 +520,10 @@ public class EdgeServiceImpl extends AbstractCachedEntityService> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findEdgeById(tenantId, new EdgeId(entityId.getId())));
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java b/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java
index 49cea353fb..6d76785792 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java
@@ -15,29 +15,16 @@
*/
package org.thingsboard.server.dao.entity;
-import com.google.common.base.Function;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.thingsboard.server.common.data.HasCustomerId;
import org.thingsboard.server.common.data.HasName;
-import org.thingsboard.server.common.data.id.AlarmId;
-import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.CustomerId;
-import org.thingsboard.server.common.data.id.DashboardId;
-import org.thingsboard.server.common.data.id.DeviceId;
-import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.EntityId;
-import org.thingsboard.server.common.data.id.EntityViewId;
-import org.thingsboard.server.common.data.id.OtaPackageId;
-import org.thingsboard.server.common.data.id.RuleChainId;
-import org.thingsboard.server.common.data.id.TbResourceId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.EntityCountQuery;
import org.thingsboard.server.common.data.query.EntityData;
@@ -45,20 +32,11 @@ import org.thingsboard.server.common.data.query.EntityDataPageLink;
import org.thingsboard.server.common.data.query.EntityDataQuery;
import org.thingsboard.server.common.data.query.EntityFilterType;
import org.thingsboard.server.common.data.query.RelationsQueryFilter;
-import org.thingsboard.server.dao.alarm.AlarmService;
-import org.thingsboard.server.dao.asset.AssetService;
-import org.thingsboard.server.dao.customer.CustomerService;
-import org.thingsboard.server.dao.dashboard.DashboardService;
-import org.thingsboard.server.dao.device.DeviceService;
-import org.thingsboard.server.dao.entityview.EntityViewService;
import org.thingsboard.server.dao.exception.IncorrectParameterException;
-import org.thingsboard.server.dao.ota.OtaPackageService;
-import org.thingsboard.server.dao.resource.ResourceService;
-import org.thingsboard.server.dao.rule.RuleChainService;
-import org.thingsboard.server.dao.tenant.TenantService;
-import org.thingsboard.server.dao.user.UserService;
-import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
+import java.util.Optional;
+
+import static org.thingsboard.server.common.data.id.EntityId.NULL_UUID;
import static org.thingsboard.server.dao.service.Validator.validateId;
/**
@@ -70,42 +48,13 @@ public class BaseEntityService extends AbstractEntityService implements EntitySe
public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId ";
-
- @Autowired
- private AssetService assetService;
-
- @Autowired
- private DeviceService deviceService;
-
- @Autowired
- private EntityViewService entityViewService;
-
- @Autowired
- private TenantService tenantService;
-
- @Autowired
- private CustomerService customerService;
-
- @Autowired
- private UserService userService;
-
- @Autowired
- private DashboardService dashboardService;
-
- @Autowired
- private AlarmService alarmService;
-
- @Autowired
- private RuleChainService ruleChainService;
+ public static final CustomerId NULL_CUSTOMER_ID = new CustomerId(NULL_UUID);
@Autowired
private EntityQueryDao entityQueryDao;
@Autowired
- private ResourceService resourceService;
-
- @Autowired
- private OtaPackageService otaPackageService;
+ EntityServiceBeanFactory entityServiceBeanFactory;
@Override
public long countEntitiesByQuery(TenantId tenantId, CustomerId customerId, EntityCountQuery query) {
@@ -125,100 +74,34 @@ public class BaseEntityService extends AbstractEntityService implements EntitySe
return this.entityQueryDao.findEntityDataByQuery(tenantId, customerId, query);
}
- //TODO: 3.1 Remove this from project.
@Override
- public ListenableFuture fetchEntityNameAsync(TenantId tenantId, EntityId entityId) {
- log.trace("Executing fetchEntityNameAsync [{}]", entityId);
- ListenableFuture entityName;
- ListenableFuture extends HasName> hasName;
- switch (entityId.getEntityType()) {
- case ASSET:
- hasName = assetService.findAssetByIdAsync(tenantId, new AssetId(entityId.getId()));
- break;
- case DEVICE:
- hasName = deviceService.findDeviceByIdAsync(tenantId, new DeviceId(entityId.getId()));
- break;
- case ENTITY_VIEW:
- hasName = entityViewService.findEntityViewByIdAsync(tenantId, new EntityViewId(entityId.getId()));
- break;
- case TENANT:
- hasName = tenantService.findTenantByIdAsync(tenantId, TenantId.fromUUID(entityId.getId()));
- break;
- case CUSTOMER:
- hasName = customerService.findCustomerByIdAsync(tenantId, new CustomerId(entityId.getId()));
- break;
- case USER:
- hasName = userService.findUserByIdAsync(tenantId, new UserId(entityId.getId()));
- break;
- case DASHBOARD:
- hasName = dashboardService.findDashboardInfoByIdAsync(tenantId, new DashboardId(entityId.getId()));
- break;
- case ALARM:
- hasName = alarmService.findAlarmByIdAsync(tenantId, new AlarmId(entityId.getId()));
- break;
- case RULE_CHAIN:
- hasName = ruleChainService.findRuleChainByIdAsync(tenantId, new RuleChainId(entityId.getId()));
- break;
- case EDGE:
- hasName = edgeService.findEdgeByIdAsync(tenantId, new EdgeId(entityId.getId()));
- break;
- case TB_RESOURCE:
- hasName = resourceService.findResourceInfoByIdAsync(tenantId, new TbResourceId(entityId.getId()));
- break;
- case OTA_PACKAGE:
- hasName = otaPackageService.findOtaPackageInfoByIdAsync(tenantId, new OtaPackageId(entityId.getId()));
- break;
- default:
- throw new IllegalStateException("Not Implemented!");
+ public Optional fetchEntityName(TenantId tenantId, EntityId entityId) {
+ log.trace("Executing fetchEntityName [{}]", entityId);
+ TbEntityService tbEntityService = entityServiceBeanFactory.getServiceByEntityType(entityId.getEntityType());
+ Optional> hasIdOpt = tbEntityService.fetchEntity(tenantId, entityId);
+ if (hasIdOpt.isPresent()) {
+ HasId> hasId = hasIdOpt.get();
+ if (hasId instanceof HasName) {
+ HasName hasName = (HasName) hasId;
+ return Optional.ofNullable(hasName.getName());
+ }
}
- entityName = Futures.transform(hasName, (Function) hasName1 -> hasName1 != null ? hasName1.getName() : null, MoreExecutors.directExecutor());
- return entityName;
+ return Optional.empty();
}
@Override
public CustomerId fetchEntityCustomerId(TenantId tenantId, EntityId entityId) {
log.trace("Executing fetchEntityCustomerId [{}]", entityId);
- HasCustomerId hasCustomerId = null;
- switch (entityId.getEntityType()) {
- case TENANT:
- case RULE_CHAIN:
- case RULE_NODE:
- case DASHBOARD:
- case WIDGETS_BUNDLE:
- case WIDGET_TYPE:
- case TENANT_PROFILE:
- case DEVICE_PROFILE:
- case ASSET_PROFILE:
- case API_USAGE_STATE:
- case TB_RESOURCE:
- case OTA_PACKAGE:
- break;
- case CUSTOMER:
- hasCustomerId = () -> new CustomerId(entityId.getId());
- break;
- case USER:
- hasCustomerId = userService.findUserById(tenantId, new UserId(entityId.getId()));
- break;
- case ASSET:
- hasCustomerId = assetService.findAssetById(tenantId, new AssetId(entityId.getId()));
- break;
- case DEVICE:
- hasCustomerId = deviceService.findDeviceById(tenantId, new DeviceId(entityId.getId()));
- break;
- case ALARM:
- try {
- hasCustomerId = alarmService.findAlarmByIdAsync(tenantId, new AlarmId(entityId.getId())).get();
- } catch (Exception e) {
- }
- break;
- case ENTITY_VIEW:
- hasCustomerId = entityViewService.findEntityViewById(tenantId, new EntityViewId(entityId.getId()));
- break;
- case EDGE:
- hasCustomerId = edgeService.findEdgeById(tenantId, new EdgeId(entityId.getId()));
- break;
+ TbEntityService tbEntityService = entityServiceBeanFactory.getServiceByEntityType(entityId.getEntityType());
+ Optional> hasIdOpt = tbEntityService.fetchEntity(tenantId, entityId);
+ if (hasIdOpt.isPresent()) {
+ HasId> hasId = hasIdOpt.get();
+ if (hasId instanceof HasCustomerId) {
+ HasCustomerId hasCustomerId = (HasCustomerId) hasId;
+ return hasCustomerId.getCustomerId();
+ }
}
- return hasCustomerId != null ? hasCustomerId.getCustomerId() : new CustomerId(NULL_UUID);
+ return NULL_CUSTOMER_ID;
}
private static void validateEntityCountQuery(EntityCountQuery query) {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java
index f9b6ee076a..f828be9235 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java
@@ -35,6 +35,7 @@ import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EntityViewId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@@ -52,6 +53,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.Optional;
import java.util.stream.Collectors;
import static org.thingsboard.server.dao.service.Validator.validateId;
@@ -61,7 +63,7 @@ import static org.thingsboard.server.dao.service.Validator.validateString;
/**
* Created by Victor Basanets on 8/28/2017.
*/
-@Service
+@Service("EntityViewDaoService")
@Slf4j
public class EntityViewServiceImpl extends AbstractCachedEntityService implements EntityViewService {
@@ -408,4 +410,10 @@ public class EntityViewServiceImpl extends AbstractCachedEntityService> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findEntityViewById(tenantId, new EntityViewId(entityId.getId())));
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java b/dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java
index 26e6b611ec..de4683f6b4 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java
@@ -31,17 +31,19 @@ import org.thingsboard.server.common.data.event.LifecycleEvent;
import org.thingsboard.server.common.data.event.RuleChainDebugEvent;
import org.thingsboard.server.common.data.event.RuleNodeDebugEvent;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.service.DataValidator;
import java.util.List;
+import java.util.Optional;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;
-@Service
+@Service("EventDaoService")
@Slf4j
public class BaseEventService implements EventService {
@@ -148,4 +150,10 @@ public class BaseEventService implements EventService {
private List convert(EntityType entityType, List extends Event> list) {
return list == null ? null : list.stream().map(e -> e.toInfo(entityType)).collect(Collectors.toList());
}
+
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.empty();
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java b/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java
index 841ff82441..0345ed2369 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java
@@ -28,6 +28,8 @@ import org.thingsboard.server.common.data.OtaPackage;
import org.thingsboard.server.common.data.OtaPackageInfo;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.id.DeviceProfileId;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.OtaPackageId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
@@ -45,7 +47,7 @@ import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
-@Service
+@Service("OtaPackageDaoService")
@Slf4j
@RequiredArgsConstructor
public class BaseOtaPackageService extends AbstractCachedEntityService implements OtaPackageService {
@@ -234,4 +236,9 @@ public class BaseOtaPackageService extends AbstractCachedEntityService> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findOtaPackageInfoById(tenantId, new OtaPackageId(entityId.getId())));
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java b/dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java
index 45b5b2cc7e..a05eb12218 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/queue/BaseQueueService.java
@@ -22,6 +22,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.TenantProfile;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.QueueId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
@@ -35,8 +37,9 @@ import org.thingsboard.server.dao.service.Validator;
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
import java.util.List;
+import java.util.Optional;
-@Service
+@Service("QueueDaoService")
@Slf4j
@RequiredArgsConstructor
public class BaseQueueService extends AbstractEntityService implements QueueService {
@@ -119,6 +122,11 @@ public class BaseQueueService extends AbstractEntityService implements QueueServ
tenantQueuesRemover.removeEntities(tenantId, tenantId);
}
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findQueueById(tenantId, new QueueId(entityId.getId())));
+ }
+
private PaginatedRemover tenantQueuesRemover =
new PaginatedRemover<>() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
index ceda7eb52c..320e7661fc 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
@@ -57,6 +57,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -374,12 +375,10 @@ public class BaseRelationService implements RelationService {
private ListenableFuture fetchRelationInfoAsync(TenantId tenantId, EntityRelation relation,
Function entityIdGetter,
BiConsumer entityNameSetter) {
- ListenableFuture entityName = entityService.fetchEntityNameAsync(tenantId, entityIdGetter.apply(relation));
- return Futures.transform(entityName, entityName1 -> {
- EntityRelationInfo entityRelationInfo1 = new EntityRelationInfo(relation);
- entityNameSetter.accept(entityRelationInfo1, entityName1);
- return entityRelationInfo1;
- }, MoreExecutors.directExecutor());
+ Optional entityNameOpt = entityService.fetchEntityName(tenantId, entityIdGetter.apply(relation));
+ EntityRelationInfo relationInfo = new EntityRelationInfo(relation);
+ entityNameSetter.accept(relationInfo, entityNameOpt.orElse("N/A"));
+ return Futures.immediateFuture(relationInfo);
}
@Override
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 dd13f5b200..9d72a331de 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
@@ -23,6 +23,8 @@ import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.TbResource;
import org.thingsboard.server.common.data.TbResourceInfo;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TbResourceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
@@ -38,7 +40,7 @@ import java.util.Optional;
import static org.thingsboard.server.dao.device.DeviceServiceImpl.INCORRECT_TENANT_ID;
import static org.thingsboard.server.dao.service.Validator.validateId;
-@Service
+@Service("TbResourceDaoService")
@Slf4j
@AllArgsConstructor
public class BaseResourceService implements ResourceService {
@@ -134,6 +136,11 @@ public class BaseResourceService implements ResourceService {
tenantResourcesRemover.removeEntities(tenantId, tenantId);
}
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findResourceInfoById(tenantId, new TbResourceId(entityId.getId())));
+ }
+
@Override
public long sumDataSizeByTenantId(TenantId tenantId) {
return resourceDao.sumDataSizeByTenantId(tenantId);
diff --git a/dao/src/main/java/org/thingsboard/server/dao/rpc/BaseRpcService.java b/dao/src/main/java/org/thingsboard/server/dao/rpc/BaseRpcService.java
index 13afd60aba..e56fd832ec 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/rpc/BaseRpcService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/rpc/BaseRpcService.java
@@ -20,6 +20,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.id.DeviceId;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.RpcId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
@@ -28,10 +30,12 @@ import org.thingsboard.server.common.data.rpc.Rpc;
import org.thingsboard.server.common.data.rpc.RpcStatus;
import org.thingsboard.server.dao.service.PaginatedRemover;
+import java.util.Optional;
+
import static org.thingsboard.server.dao.service.Validator.validateId;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
-@Service
+@Service("RpcDaoService")
@Slf4j
@RequiredArgsConstructor
public class BaseRpcService implements RpcService {
@@ -93,6 +97,11 @@ public class BaseRpcService implements RpcService {
return rpcDao.findAllByDeviceId(tenantId, deviceId, pageLink);
}
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findById(tenantId, new RpcId(entityId.getId())));
+ }
+
private PaginatedRemover tenantRpcRemover =
new PaginatedRemover<>() {
@Override
diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
index 1d11d34b2d..d6b9e123fb 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
@@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.id.TenantId;
@@ -77,7 +78,7 @@ import static org.thingsboard.server.dao.service.Validator.validateString;
/**
* Created by igor on 3/12/18.
*/
-@Service
+@Service("RuleChainDaoService")
@Slf4j
public class BaseRuleChainService extends AbstractEntityService implements RuleChainService {
@@ -758,6 +759,15 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
deleteEntityRelations(tenantId, ruleChainId);
}
+
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ HasId> hasId = EntityType.RULE_NODE.equals(entityId.getEntityType()) ?
+ findRuleNodeById(tenantId, new RuleNodeId(entityId.getId())) :
+ findRuleChainById(tenantId, new RuleChainId(entityId.getId()));
+ return Optional.ofNullable(hasId);
+ }
+
private List getRuleChainToNodeRelations(TenantId tenantId, RuleChainId ruleChainId) {
return relationService.findByFrom(tenantId, ruleChainId, RelationTypeGroup.RULE_CHAIN);
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileServiceImpl.java
index a1ffde92d5..03479e4483 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantProfileServiceImpl.java
@@ -22,6 +22,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.event.TransactionalEventListener;
import org.thingsboard.server.common.data.EntityInfo;
import org.thingsboard.server.common.data.TenantProfile;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.TenantProfileId;
import org.thingsboard.server.common.data.page.PageData;
@@ -36,10 +38,11 @@ import org.thingsboard.server.dao.service.Validator;
import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;
-@Service
+@Service("TenantProfileDaoService")
@Slf4j
public class TenantProfileServiceImpl extends AbstractCachedEntityService implements TenantProfileService {
@@ -204,6 +207,11 @@ public class TenantProfileServiceImpl extends AbstractCachedEntityService> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findTenantProfileById(tenantId, new TenantProfileId(entityId.getId())));
+ }
+
private final PaginatedRemover tenantProfilesRemover =
new PaginatedRemover<>() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java
index 7c5d951c2a..04f42ed3e2 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java
@@ -26,6 +26,8 @@ import org.thingsboard.server.cache.TbTransactionalCache;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantInfo;
import org.thingsboard.server.common.data.TenantProfile;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.TenantProfileId;
import org.thingsboard.server.common.data.page.PageData;
@@ -51,10 +53,11 @@ import org.thingsboard.server.dao.user.UserService;
import org.thingsboard.server.dao.widget.WidgetsBundleService;
import java.util.List;
+import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;
-@Service
+@Service("TenantDaoService")
@Slf4j
public class TenantServiceImpl extends AbstractCachedEntityService implements TenantService {
@@ -256,4 +259,9 @@ public class TenantServiceImpl extends AbstractCachedEntityService> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findTenantById(new TenantId(entityId.getId())));
+ }
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateServiceImpl.java
index f2bd8e47c1..4c6a3472ee 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateServiceImpl.java
@@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.id.ApiUsageStateId;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
import org.thingsboard.server.common.data.kv.LongDataEntry;
@@ -42,10 +43,11 @@ import org.thingsboard.server.dao.timeseries.TimeseriesService;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;
-@Service
+@Service("ApiUsageStateDaoService")
@Slf4j
public class ApiUsageStateServiceImpl extends AbstractEntityService implements ApiUsageStateService {
public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
@@ -161,4 +163,8 @@ public class ApiUsageStateServiceImpl extends AbstractEntityService implements A
return apiUsageStateDao.findById(tenantId, id.getId());
}
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findApiUsageStateById(tenantId, new ApiUsageStateId(entityId.getId())));
+ }
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java
index 41d121b889..28912d3571 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java
@@ -31,6 +31,8 @@ import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.id.CustomerId;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserCredentialsId;
import org.thingsboard.server.common.data.id.UserId;
@@ -45,12 +47,13 @@ import org.thingsboard.server.dao.service.PaginatedRemover;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
import static org.thingsboard.server.dao.service.Validator.validateString;
-@Service
+@Service("UserDaoService")
@Slf4j
@RequiredArgsConstructor
public class UserServiceImpl extends AbstractEntityService implements UserService {
@@ -397,4 +400,9 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic
}
};
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findUserById(tenantId, new UserId(entityId.getId())));
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/util/AbstractBufferedRateExecutor.java b/dao/src/main/java/org/thingsboard/server/dao/util/AbstractBufferedRateExecutor.java
index 4c45239921..26ae0de259 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/util/AbstractBufferedRateExecutor.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/util/AbstractBufferedRateExecutor.java
@@ -44,6 +44,7 @@ import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
@@ -327,7 +328,8 @@ public abstract class AbstractBufferedRateExecutor {
try {
- return entityService.fetchEntityNameAsync(TenantId.SYS_TENANT_ID, tenantId).get();
+ Optional entityNameOpt = entityService.fetchEntityName(TenantId.SYS_TENANT_ID, tenantId);
+ return entityNameOpt.orElse("N/A");
} catch (Exception e) {
log.error("[{}] Failed to get tenant name", tenantId, e);
return "N/A";
diff --git a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java
index 9b64dc0d68..e5e9360698 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java
@@ -18,6 +18,8 @@ package org.thingsboard.server.dao.widget;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.WidgetTypeId;
import org.thingsboard.server.common.data.widget.WidgetType;
@@ -27,8 +29,9 @@ import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.Validator;
import java.util.List;
+import java.util.Optional;
-@Service
+@Service("WidgetTypeDaoService")
@Slf4j
public class WidgetTypeServiceImpl implements WidgetTypeService {
@@ -112,4 +115,9 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
}
}
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findWidgetTypeById(tenantId, new WidgetTypeId(entityId.getId())));
+ }
+
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java
index 737043ccba..474ac247ba 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java
@@ -18,6 +18,8 @@ package org.thingsboard.server.dao.widget;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.WidgetsBundleId;
import org.thingsboard.server.common.data.page.PageData;
@@ -31,8 +33,9 @@ import org.thingsboard.server.dao.service.Validator;
import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
-@Service
+@Service("WidgetsBundleDaoService")
@Slf4j
public class WidgetsBundleServiceImpl implements WidgetsBundleService {
@@ -151,6 +154,11 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
tenantWidgetsBundleRemover.removeEntities(tenantId, tenantId);
}
+ @Override
+ public Optional> fetchEntity(TenantId tenantId, EntityId entityId) {
+ return Optional.ofNullable(findWidgetsBundleById(tenantId, new WidgetsBundleId(entityId.getId())));
+ }
+
private PaginatedRemover tenantWidgetsBundleRemover =
new PaginatedRemover() {
diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseEntityServiceBeanFactoryTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseEntityServiceBeanFactoryTest.java
new file mode 100644
index 0000000000..d9b907d825
--- /dev/null
+++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseEntityServiceBeanFactoryTest.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright © 2016-2022 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.dao.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.assertj.core.api.Assertions;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.thingsboard.server.common.data.EntityType;
+import org.thingsboard.server.dao.entity.EntityServiceBeanFactory;
+import org.thingsboard.server.dao.rule.BaseRuleChainService;
+
+@Slf4j
+public abstract class BaseEntityServiceBeanFactoryTest extends AbstractServiceTest {
+
+ @Autowired
+ private EntityServiceBeanFactory entityServiceBeanFactory;
+
+ @Test
+ public void givenAllEntityTypes_whenGetServiceByEntityTypeCalled_thenNoExceptionsThrows() {
+ for (EntityType entityType : EntityType.values()) {
+ Assertions.assertThatCode(() -> entityServiceBeanFactory.getServiceByEntityType(entityType))
+ .doesNotThrowAnyException();
+ }
+ }
+
+ @Test
+ public void givenRuleNodeEntityType_whenGetServiceByEntityTypeCalled_thenReturnedRuleChainDaoService() {
+ Assert.assertTrue(entityServiceBeanFactory.getServiceByEntityType(EntityType.RULE_NODE) instanceof BaseRuleChainService);
+ }
+
+}
diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/sql/EntityServiceBeanFactorySqlTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/sql/EntityServiceBeanFactorySqlTest.java
new file mode 100644
index 0000000000..48fd73db75
--- /dev/null
+++ b/dao/src/test/java/org/thingsboard/server/dao/service/sql/EntityServiceBeanFactorySqlTest.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright © 2016-2022 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.dao.service.sql;
+
+import org.thingsboard.server.dao.service.BaseEntityServiceBeanFactoryTest;
+import org.thingsboard.server.dao.service.DaoSqlTest;
+
+@DaoSqlTest
+public class EntityServiceBeanFactorySqlTest extends BaseEntityServiceBeanFactoryTest {
+
+}
diff --git a/pom.xml b/pom.xml
index 3493d15a48..9ca78be0a3 100755
--- a/pom.xml
+++ b/pom.xml
@@ -61,6 +61,7 @@
2.11.0
1.2
1.4
+ 1.9
4.5.13
4.4.14
2.8.1
@@ -1364,6 +1365,11 @@
commons-csv
${commons-csv.version}
+
+ org.apache.commons
+ commons-text
+ ${commons-text.version}
+
org.apache.httpcomponents
httpclient