Browse Source

refactor relation service and dao(*), remove redundant todo's, refactor tests

(*): resolve immediate .get() invocation, which producing blocking (checkRelation method), by adding sync checkRelation method and refactor the usages of checkRelationAsync
pull/5873/head
desoliture 5 years ago
parent
commit
16753d2f62
  1. 2
      application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java
  2. 4
      common/dao-api/src/main/java/org/thingsboard/server/dao/relation/RelationService.java
  3. 1
      dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
  4. 1
      dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java
  5. 1
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
  6. 1
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java
  7. 1
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java
  8. 1
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java
  9. 1
      dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java
  10. 22
      dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java
  11. 17
      dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java
  12. 12
      dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
  13. 4
      dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java
  14. 1
      dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java
  15. 1
      dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
  16. 1
      dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java
  17. 8
      dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java
  18. 1
      dao/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateServiceImpl.java
  19. 1
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java
  20. 1
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java
  21. 36
      dao/src/test/java/org/thingsboard/server/dao/service/BaseOtaPackageServiceTest.java
  22. 16
      dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java
  23. 320
      dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantServiceTest.java
  24. 2
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java
  25. 2
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbDeleteRelationNode.java
  26. 2
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java
  27. 6
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeTest.java

2
application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java

@ -348,7 +348,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
if (entityViews != null && !entityViews.isEmpty()) { if (entityViews != null && !entityViews.isEmpty()) {
List<ListenableFuture<Boolean>> futures = new ArrayList<>(); List<ListenableFuture<Boolean>> futures = new ArrayList<>();
for (EntityView entityView : entityViews) { for (EntityView entityView : entityViews) {
ListenableFuture<Boolean> future = relationService.checkRelation(tenantId, edge.getId(), entityView.getId(), ListenableFuture<Boolean> future = relationService.checkRelationAsync(tenantId, edge.getId(), entityView.getId(),
EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE);
futures.add(future); futures.add(future);
Futures.addCallback(future, new FutureCallback<>() { Futures.addCallback(future, new FutureCallback<>() {

4
common/dao-api/src/main/java/org/thingsboard/server/dao/relation/RelationService.java

@ -34,7 +34,9 @@ import java.util.List;
*/ */
public interface RelationService { public interface RelationService {
ListenableFuture<Boolean> checkRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup); ListenableFuture<Boolean> checkRelationAsync(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
Boolean checkRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
EntityRelation getRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup); EntityRelation getRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);

1
dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java

@ -431,7 +431,6 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
throw new DataValidationException("Alarm should be assigned to tenant!"); throw new DataValidationException("Alarm should be assigned to tenant!");
} else { } else {
Tenant tenant = tenantService.findTenantById(alarm.getTenantId()); Tenant tenant = tenantService.findTenantById(alarm.getTenantId());
// TODO: 13.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Alarm is referencing to non-existent tenant!"); throw new DataValidationException("Alarm is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java

@ -412,7 +412,6 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ
throw new DataValidationException("Asset should be assigned to tenant!"); throw new DataValidationException("Asset should be assigned to tenant!");
} else { } else {
Tenant tenant = tenantService.findTenantById(asset.getTenantId()); Tenant tenant = tenantService.findTenantById(asset.getTenantId());
// TODO: 13.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Asset is referencing to non-existent tenant!"); throw new DataValidationException("Asset is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java

@ -211,7 +211,6 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom
throw new DataValidationException("Customer should be assigned to tenant!"); throw new DataValidationException("Customer should be assigned to tenant!");
} else { } else {
Tenant tenant = tenantService.findTenantById(customer.getTenantId()); Tenant tenant = tenantService.findTenantById(customer.getTenantId());
// TODO: 13.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Customer is referencing to non-existent tenant!"); throw new DataValidationException("Customer is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java

@ -309,7 +309,6 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb
throw new DataValidationException("Dashboard should be assigned to tenant!"); throw new DataValidationException("Dashboard should be assigned to tenant!");
} else { } else {
Tenant tenant = tenantService.findTenantById(dashboard.getTenantId()); Tenant tenant = tenantService.findTenantById(dashboard.getTenantId());
// TODO: 13.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Dashboard is referencing to non-existent tenant!"); throw new DataValidationException("Dashboard is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java

@ -376,7 +376,6 @@ public class DeviceProfileServiceImpl extends AbstractEntityService implements D
throw new DataValidationException("Device profile should be assigned to tenant!"); throw new DataValidationException("Device profile should be assigned to tenant!");
} else { } else {
Tenant tenant = tenantService.findTenantById(deviceProfile.getTenantId()); Tenant tenant = tenantService.findTenantById(deviceProfile.getTenantId());
// TODO: 13.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Device profile is referencing to non-existent tenant!"); throw new DataValidationException("Device profile is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java

@ -732,7 +732,6 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe
throw new DataValidationException("Device should be assigned to tenant!"); throw new DataValidationException("Device should be assigned to tenant!");
} else { } else {
Tenant tenant = tenantService.findTenantById(device.getTenantId()); Tenant tenant = tenantService.findTenantById(device.getTenantId());
// TODO: 13.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Device is referencing to non-existent tenant!"); throw new DataValidationException("Device is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java

@ -414,7 +414,6 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
throw new DataValidationException("Edge should be assigned to tenant!"); throw new DataValidationException("Edge should be assigned to tenant!");
} else { } else {
Tenant tenant = tenantService.findTenantById(edge.getTenantId()); Tenant tenant = tenantService.findTenantById(edge.getTenantId());
// TODO: 13.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Edge is referencing to non-existent tenant!"); throw new DataValidationException("Edge is referencing to non-existent tenant!");
} }

22
dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java

@ -82,20 +82,16 @@ public abstract class AbstractEntityService {
} }
protected void checkAssignedEntityViewsToEdge(TenantId tenantId, EntityId entityId, EdgeId edgeId) { protected void checkAssignedEntityViewsToEdge(TenantId tenantId, EntityId entityId, EdgeId edgeId) {
try { List<EntityView> entityViews = entityViewService.findEntityViewsByTenantIdAndEntityId(tenantId, entityId);
List<EntityView> entityViews = entityViewService.findEntityViewsByTenantIdAndEntityId(tenantId, entityId); if (entityViews != null && !entityViews.isEmpty()) {
if (entityViews != null && !entityViews.isEmpty()) { EntityView entityView = entityViews.get(0);
EntityView entityView = entityViews.get(0); Boolean relationExists = relationService.checkRelation(
// TODO: @voba - refactor this blocking operation tenantId, edgeId, entityView.getId(),
Boolean relationExists = relationService.checkRelation(tenantId, edgeId, entityView.getId(), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE
EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE).get(); );
if (relationExists) { if (relationExists) {
throw new DataValidationException("Can't unassign device/asset from edge that is related to entity view and entity view is assigned to edge!"); throw new DataValidationException("Can't unassign device/asset from edge that is related to entity view and entity view is assigned to edge!");
}
} }
} catch (Exception e) {
log.error("[{}] Exception while finding entity views for entityId [{}]", tenantId, entityId, e);
throw new RuntimeException("Exception while finding entity views for entityId [" + entityId + "]", e);
} }
} }

17
dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java

@ -308,9 +308,7 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
validateId(entityId.getId(), "Incorrect entityId" + entityId); validateId(entityId.getId(), "Incorrect entityId" + entityId);
List<Object> tenantIdAndEntityId = new ArrayList<>(); List<Object> tenantIdAndEntityId = List.of(tenantId, entityId);
tenantIdAndEntityId.add(tenantId);
tenantIdAndEntityId.add(entityId);
Cache cache = cacheManager.getCache(ENTITY_VIEW_CACHE); Cache cache = cacheManager.getCache(ENTITY_VIEW_CACHE);
List<EntityView> fromCache = cache.get(tenantIdAndEntityId, List.class); List<EntityView> fromCache = cache.get(tenantIdAndEntityId, List.class);
@ -366,15 +364,10 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti
throw new DataValidationException("Can't assign entityView to edge from different tenant!"); throw new DataValidationException("Can't assign entityView to edge from different tenant!");
} }
try { Boolean relationExists = relationService.checkRelation(tenantId, edgeId, entityView.getEntityId(),
Boolean relationExists = relationService.checkRelation(tenantId, edgeId, entityView.getEntityId(), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE);
EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE).get(); if (!relationExists) {
if (!relationExists) { throw new DataValidationException("Can't assign entity view to edge because related device/asset doesn't assigned to edge!");
throw new DataValidationException("Can't assign entity view to edge because related device/asset doesn't assigned to edge!");
}
} catch (ExecutionException | InterruptedException e) {
log.error("Exception during relation check", e);
throw new RuntimeException("Exception during relation check", e);
} }
try { try {

12
dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java

@ -30,11 +30,8 @@ import org.springframework.cache.annotation.Caching;
import org.springframework.dao.ConcurrencyFailureException; import org.springframework.dao.ConcurrencyFailureException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId; 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.relation.EntityRelation; import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.relation.EntityRelationInfo; import org.thingsboard.server.common.data.relation.EntityRelationInfo;
import org.thingsboard.server.common.data.relation.EntityRelationsQuery; import org.thingsboard.server.common.data.relation.EntityRelationsQuery;
@ -77,10 +74,15 @@ public class BaseRelationService implements RelationService {
private CacheManager cacheManager; private CacheManager cacheManager;
@Override @Override
public ListenableFuture<Boolean> checkRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) { public ListenableFuture<Boolean> checkRelationAsync(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
log.trace("Executing checkRelation [{}][{}][{}][{}]", from, to, relationType, typeGroup); log.trace("Executing checkRelation [{}][{}][{}][{}]", from, to, relationType, typeGroup);
validate(from, to, relationType, typeGroup); validate(from, to, relationType, typeGroup);
return relationDao.checkRelation(tenantId, from, to, relationType, typeGroup); return relationDao.checkRelationAsync(tenantId, from, to, relationType, typeGroup);
}
@Override
public Boolean checkRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
return null;
} }
@Cacheable(cacheNames = RELATIONS_CACHE, key = "{#from, #to, #relationType, #typeGroup}") @Cacheable(cacheNames = RELATIONS_CACHE, key = "{#from, #to, #relationType, #typeGroup}")

4
dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java

@ -41,7 +41,9 @@ public interface RelationDao {
ListenableFuture<List<EntityRelation>> findAllByToAndType(TenantId tenantId, EntityId to, String relationType, RelationTypeGroup typeGroup); ListenableFuture<List<EntityRelation>> findAllByToAndType(TenantId tenantId, EntityId to, String relationType, RelationTypeGroup typeGroup);
ListenableFuture<Boolean> checkRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup); ListenableFuture<Boolean> checkRelationAsync(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
Boolean checkRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
ListenableFuture<EntityRelation> getRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup); ListenableFuture<EntityRelation> getRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);

1
dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java

@ -184,7 +184,6 @@ public class BaseResourceService implements ResourceService {
} }
if (!resource.getTenantId().getId().equals(ModelConstants.NULL_UUID)) { if (!resource.getTenantId().getId().equals(ModelConstants.NULL_UUID)) {
Tenant tenant = tenantService.findTenantById(resource.getTenantId()); Tenant tenant = tenantService.findTenantById(resource.getTenantId());
// TODO: 12.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Resource is referencing to non-existent tenant!"); throw new DataValidationException("Resource is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java

@ -727,7 +727,6 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
throw new DataValidationException("Rule chain should be assigned to tenant!"); throw new DataValidationException("Rule chain should be assigned to tenant!");
} }
Tenant tenant = tenantService.findTenantById(ruleChain.getTenantId()); Tenant tenant = tenantService.findTenantById(ruleChain.getTenantId());
// TODO: 12.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Rule chain is referencing to non-existent tenant!"); throw new DataValidationException("Rule chain is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java

@ -20,7 +20,6 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.DeviceEntity;
import org.thingsboard.server.dao.model.sql.EntityViewEntity; import org.thingsboard.server.dao.model.sql.EntityViewEntity;
import org.thingsboard.server.dao.model.sql.EntityViewInfoEntity; import org.thingsboard.server.dao.model.sql.EntityViewInfoEntity;

8
dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java

@ -101,11 +101,17 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
} }
@Override @Override
public ListenableFuture<Boolean> checkRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) { public ListenableFuture<Boolean> checkRelationAsync(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
RelationCompositeKey key = getRelationCompositeKey(from, to, relationType, typeGroup); RelationCompositeKey key = getRelationCompositeKey(from, to, relationType, typeGroup);
return service.submit(() -> relationRepository.existsById(key)); return service.submit(() -> relationRepository.existsById(key));
} }
@Override
public Boolean checkRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
RelationCompositeKey key = getRelationCompositeKey(from, to, relationType, typeGroup);
return relationRepository.existsById(key);
}
@Override @Override
public ListenableFuture<EntityRelation> getRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) { public ListenableFuture<EntityRelation> getRelation(TenantId tenantId, EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
RelationCompositeKey key = getRelationCompositeKey(from, to, relationType, typeGroup); RelationCompositeKey key = getRelationCompositeKey(from, to, relationType, typeGroup);

1
dao/src/main/java/org/thingsboard/server/dao/usagerecord/ApiUsageStateServiceImpl.java

@ -165,7 +165,6 @@ public class ApiUsageStateServiceImpl extends AbstractEntityService implements A
throw new DataValidationException("ApiUsageState should be assigned to tenant!"); throw new DataValidationException("ApiUsageState should be assigned to tenant!");
} else { } else {
Tenant tenant = tenantService.findTenantById(apiUsageState.getTenantId()); Tenant tenant = tenantService.findTenantById(apiUsageState.getTenantId());
// TODO: 12.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null && !requestTenantId.equals(TenantId.SYS_TENANT_ID)) { if (tenant == null && !requestTenantId.equals(TenantId.SYS_TENANT_ID)) {
throw new DataValidationException("ApiUsageState is referencing to non-existent tenant!"); throw new DataValidationException("ApiUsageState is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java

@ -139,7 +139,6 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
} }
if (!widgetTypeDetails.getTenantId().getId().equals(ModelConstants.NULL_UUID)) { if (!widgetTypeDetails.getTenantId().getId().equals(ModelConstants.NULL_UUID)) {
Tenant tenant = tenantService.findTenantById(widgetTypeDetails.getTenantId()); Tenant tenant = tenantService.findTenantById(widgetTypeDetails.getTenantId());
// TODO: 12.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Widget type is referencing to non-existent tenant!"); throw new DataValidationException("Widget type is referencing to non-existent tenant!");
} }

1
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java

@ -163,7 +163,6 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
} }
if (!widgetsBundle.getTenantId().getId().equals(ModelConstants.NULL_UUID)) { if (!widgetsBundle.getTenantId().getId().equals(ModelConstants.NULL_UUID)) {
Tenant tenant = tenantService.findTenantById(widgetsBundle.getTenantId()); Tenant tenant = tenantService.findTenantById(widgetsBundle.getTenantId());
// TODO: 12.01.22 Instead of finding and checking for null need to create and use tenantService.exists()
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Widgets bundle is referencing to non-existent tenant!"); throw new DataValidationException("Widgets bundle is referencing to non-existent tenant!");
} }

36
dao/src/test/java/org/thingsboard/server/dao/service/BaseOtaPackageServiceTest.java

@ -97,26 +97,26 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
Assert.assertEquals(0, otaPackageService.sumDataSizeByTenantId(tenantId)); Assert.assertEquals(0, otaPackageService.sumDataSizeByTenantId(tenantId));
createFirmware(tenantId, "1"); createAndSaveFirmware(tenantId, "1");
Assert.assertEquals(1, otaPackageService.sumDataSizeByTenantId(tenantId)); Assert.assertEquals(1, otaPackageService.sumDataSizeByTenantId(tenantId));
thrown.expect(DataValidationException.class); thrown.expect(DataValidationException.class);
thrown.expectMessage(String.format("Failed to create the ota package, files size limit is exhausted %d bytes!", DATA_SIZE)); thrown.expectMessage(String.format("Failed to create the ota package, files size limit is exhausted %d bytes!", DATA_SIZE));
createFirmware(tenantId, "2"); createAndSaveFirmware(tenantId, "2");
} }
@Test @Test
public void sumDataSizeByTenantId() { public void sumDataSizeByTenantId() {
Assert.assertEquals(0, otaPackageService.sumDataSizeByTenantId(tenantId)); Assert.assertEquals(0, otaPackageService.sumDataSizeByTenantId(tenantId));
createFirmware(tenantId, "0.1"); createAndSaveFirmware(tenantId, "0.1");
Assert.assertEquals(1, otaPackageService.sumDataSizeByTenantId(tenantId)); Assert.assertEquals(1, otaPackageService.sumDataSizeByTenantId(tenantId));
int maxSumDataSize = 8; int maxSumDataSize = 8;
List<OtaPackage> packages = new ArrayList<>(maxSumDataSize); List<OtaPackage> packages = new ArrayList<>(maxSumDataSize);
for (int i = 2; i <= maxSumDataSize; i++) { for (int i = 2; i <= maxSumDataSize; i++) {
packages.add(createFirmware(tenantId, "0." + i)); packages.add(createAndSaveFirmware(tenantId, "0." + i));
Assert.assertEquals(i, otaPackageService.sumDataSizeByTenantId(tenantId)); Assert.assertEquals(i, otaPackageService.sumDataSizeByTenantId(tenantId));
} }
@ -419,15 +419,15 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
@Test @Test
public void testSaveFirmwareWithExistingTitleAndVersion() { public void testSaveFirmwareWithExistingTitleAndVersion() {
createFirmware(tenantId, VERSION); createAndSaveFirmware(tenantId, VERSION);
thrown.expect(DataValidationException.class); thrown.expect(DataValidationException.class);
thrown.expectMessage("OtaPackage with such title and version already exists!"); thrown.expectMessage("OtaPackage with such title and version already exists!");
createFirmware(tenantId, VERSION); createAndSaveFirmware(tenantId, VERSION);
} }
@Test @Test
public void testDeleteFirmwareWithReferenceByDevice() { public void testDeleteFirmwareWithReferenceByDevice() {
OtaPackage savedFirmware = createFirmware(tenantId, VERSION); OtaPackage savedFirmware = createAndSaveFirmware(tenantId, VERSION);
Device device = new Device(); Device device = new Device();
device.setTenantId(tenantId); device.setTenantId(tenantId);
@ -448,7 +448,7 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
@Test @Test
public void testUpdateDeviceProfileId() { public void testUpdateDeviceProfileId() {
OtaPackage savedFirmware = createFirmware(tenantId, VERSION); OtaPackage savedFirmware = createAndSaveFirmware(tenantId, VERSION);
try { try {
thrown.expect(DataValidationException.class); thrown.expect(DataValidationException.class);
@ -494,7 +494,7 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindFirmwareById() { public void testFindFirmwareById() {
OtaPackage savedFirmware = createFirmware(tenantId, VERSION); OtaPackage savedFirmware = createAndSaveFirmware(tenantId, VERSION);
OtaPackage foundFirmware = otaPackageService.findOtaPackageById(tenantId, savedFirmware.getId()); OtaPackage foundFirmware = otaPackageService.findOtaPackageById(tenantId, savedFirmware.getId());
Assert.assertNotNull(foundFirmware); Assert.assertNotNull(foundFirmware);
@ -520,7 +520,7 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
@Test @Test
public void testDeleteFirmware() { public void testDeleteFirmware() {
OtaPackage savedFirmware = createFirmware(tenantId, VERSION); OtaPackage savedFirmware = createAndSaveFirmware(tenantId, VERSION);
OtaPackage foundFirmware = otaPackageService.findOtaPackageById(tenantId, savedFirmware.getId()); OtaPackage foundFirmware = otaPackageService.findOtaPackageById(tenantId, savedFirmware.getId());
Assert.assertNotNull(foundFirmware); Assert.assertNotNull(foundFirmware);
@ -533,7 +533,7 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
public void testFindTenantFirmwaresByTenantId() { public void testFindTenantFirmwaresByTenantId() {
List<OtaPackageInfo> firmwares = new ArrayList<>(); List<OtaPackageInfo> firmwares = new ArrayList<>();
for (int i = 0; i < 165; i++) { for (int i = 0; i < 165; i++) {
OtaPackageInfo info = new OtaPackageInfo(createFirmware(tenantId, VERSION + i)); OtaPackageInfo info = new OtaPackageInfo(createAndSaveFirmware(tenantId, VERSION + i));
info.setHasData(true); info.setHasData(true);
firmwares.add(info); firmwares.add(info);
} }
@ -580,7 +580,7 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
public void testFindTenantFirmwaresByTenantIdAndHasData() { public void testFindTenantFirmwaresByTenantIdAndHasData() {
List<OtaPackageInfo> firmwares = new ArrayList<>(); List<OtaPackageInfo> firmwares = new ArrayList<>();
for (int i = 0; i < 165; i++) { for (int i = 0; i < 165; i++) {
firmwares.add(new OtaPackageInfo(otaPackageService.saveOtaPackage(createFirmware(tenantId, VERSION + i)))); firmwares.add(new OtaPackageInfo(otaPackageService.saveOtaPackage(createAndSaveFirmware(tenantId, VERSION + i))));
} }
OtaPackageInfo firmwareWithUrl = new OtaPackageInfo(); OtaPackageInfo firmwareWithUrl = new OtaPackageInfo();
@ -696,7 +696,15 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
otaPackageService.saveOtaPackageInfo(firmwareInfo, true); otaPackageService.saveOtaPackageInfo(firmwareInfo, true);
} }
private OtaPackage createFirmware(TenantId tenantId, String version) { private OtaPackage createAndSaveFirmware(TenantId tenantId, String version) {
return otaPackageService.saveOtaPackage(createFirmware(tenantId, version, deviceProfileId));
}
public static OtaPackage createFirmware(
TenantId tenantId,
String version,
DeviceProfileId deviceProfileId
) {
OtaPackage firmware = new OtaPackage(); OtaPackage firmware = new OtaPackage();
firmware.setTenantId(tenantId); firmware.setTenantId(tenantId);
firmware.setDeviceProfileId(deviceProfileId); firmware.setDeviceProfileId(deviceProfileId);
@ -709,6 +717,6 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksum(CHECKSUM); firmware.setChecksum(CHECKSUM);
firmware.setData(DATA); firmware.setData(DATA);
firmware.setDataSize(DATA_SIZE); firmware.setDataSize(DATA_SIZE);
return otaPackageService.saveOtaPackage(firmware); return firmware;
} }
} }

16
dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java

@ -57,13 +57,13 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest {
Assert.assertTrue(saveRelation(relation)); Assert.assertTrue(saveRelation(relation));
Assert.assertTrue(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); Assert.assertTrue(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON));
Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, "NOT_EXISTING_TYPE", RelationTypeGroup.COMMON).get()); Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, "NOT_EXISTING_TYPE", RelationTypeGroup.COMMON));
Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, childId, parentId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, childId, parentId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON));
Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, childId, parentId, "NOT_EXISTING_TYPE", RelationTypeGroup.COMMON).get()); Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, childId, parentId, "NOT_EXISTING_TYPE", RelationTypeGroup.COMMON));
} }
@Test @Test
@ -80,9 +80,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest {
Assert.assertTrue(relationService.deleteRelationAsync(SYSTEM_TENANT_ID, relationA).get()); Assert.assertTrue(relationService.deleteRelationAsync(SYSTEM_TENANT_ID, relationA).get());
Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON));
Assert.assertTrue(relationService.checkRelation(SYSTEM_TENANT_ID, childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); Assert.assertTrue(relationService.checkRelation(SYSTEM_TENANT_ID, childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON));
Assert.assertTrue(relationService.deleteRelationAsync(SYSTEM_TENANT_ID, childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); Assert.assertTrue(relationService.deleteRelationAsync(SYSTEM_TENANT_ID, childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get());
} }
@ -118,9 +118,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest {
Assert.assertNull(relationService.deleteEntityRelationsAsync(SYSTEM_TENANT_ID, childId).get()); Assert.assertNull(relationService.deleteEntityRelationsAsync(SYSTEM_TENANT_ID, childId).get());
Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON));
Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON));
} }
@Test @Test

320
dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantServiceTest.java

@ -17,6 +17,7 @@ package org.thingsboard.server.dao.service;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -46,9 +47,7 @@ import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.device.profile.DeviceProfileData; import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration;
import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.rpc.Rpc; import org.thingsboard.server.common.data.rpc.Rpc;
@ -62,7 +61,6 @@ import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.tenant.TenantDao; import org.thingsboard.server.dao.tenant.TenantDao;
import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -71,9 +69,8 @@ import java.util.Set;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE; import static org.assertj.core.api.Assertions.assertThat;
public abstract class BaseTenantServiceTest extends AbstractServiceTest { public abstract class BaseTenantServiceTest extends AbstractServiceTest {
@ -85,6 +82,13 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
@Autowired @Autowired
CacheManager cacheManager; CacheManager cacheManager;
private Cache tenantCache;
@Before
public void setup() {
tenantCache = cacheManager.getCache(CacheConstants.TENANTS_CACHE);
}
@Test @Test
public void testSaveTenant() { public void testSaveTenant() {
Tenant tenant = new Tenant(); Tenant tenant = new Tenant();
@ -330,15 +334,15 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
tenant.setTitle("My tenant"); tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant); Tenant savedTenant = tenantService.saveTenant(tenant);
reset(tenantDao); Mockito.reset(tenantDao);
Objects.requireNonNull(cacheManager.getCache(CacheConstants.TENANTS_CACHE), "Tenant cache manager is null").evict(savedTenant.getId()); Objects.requireNonNull(tenantCache, "Tenant cache manager is null").evict(savedTenant.getId());
verify(tenantDao, Mockito.times(0)).findById(any(), any()); verify(tenantDao, Mockito.times(0)).findById(any(), any());
tenantService.findTenantById(savedTenant.getId()); tenantService.findTenantById(savedTenant.getId());
verify(tenantDao, Mockito.times(1)).findById(eq(savedTenant.getId()), eq(savedTenant.getId().getId())); verify(tenantDao, Mockito.times(1)).findById(eq(savedTenant.getId()), eq(savedTenant.getId().getId()));
Cache.ValueWrapper cachedTenant = Cache.ValueWrapper cachedTenant =
Objects.requireNonNull(cacheManager.getCache(CacheConstants.TENANTS_CACHE), "Cache manager is null!").get(savedTenant.getId()); Objects.requireNonNull(tenantCache, "Cache manager is null!").get(savedTenant.getId());
Assert.assertNotNull("Getting an existing Tenant doesn't add it to the cache!", cachedTenant); Assert.assertNotNull("Getting an existing Tenant doesn't add it to the cache!", cachedTenant);
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
@ -356,15 +360,15 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
Tenant savedTenant = tenantService.saveTenant(tenant); Tenant savedTenant = tenantService.saveTenant(tenant);
Cache.ValueWrapper cachedTenant = Cache.ValueWrapper cachedTenant =
Objects.requireNonNull(cacheManager.getCache(CacheConstants.TENANTS_CACHE), "Cache manager is null!").get(savedTenant.getId()); Objects.requireNonNull(tenantCache, "Cache manager is null!").get(savedTenant.getId());
Assert.assertNotNull("Saving a Tenant doesn't add it to the cache!", cachedTenant); Assert.assertNotNull("Saving a Tenant doesn't add it to the cache!", cachedTenant);
savedTenant.setTitle("My new tenant"); savedTenant.setTitle("My new tenant");
savedTenant = tenantService.saveTenant(savedTenant); savedTenant = tenantService.saveTenant(savedTenant);
reset(tenantDao); Mockito.reset(tenantDao);
cachedTenant = Objects.requireNonNull(cacheManager.getCache(CacheConstants.TENANTS_CACHE), "Cache manager is null!").get(savedTenant.getId()); cachedTenant = Objects.requireNonNull(tenantCache, "Cache manager is null!").get(savedTenant.getId());
Assert.assertNull("Updating a Tenant doesn't evict the cache!", cachedTenant); Assert.assertNull("Updating a Tenant doesn't evict the cache!", cachedTenant);
verify(tenantDao, Mockito.times(0)).findById(any(), any()); verify(tenantDao, Mockito.times(0)).findById(any(), any());
@ -381,184 +385,168 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
Tenant savedTenant = tenantService.saveTenant(tenant); Tenant savedTenant = tenantService.saveTenant(tenant);
Cache.ValueWrapper cachedTenant = Cache.ValueWrapper cachedTenant =
Objects.requireNonNull(cacheManager.getCache(CacheConstants.TENANTS_CACHE), "Cache manager is null!").get(savedTenant.getId()); Objects.requireNonNull(tenantCache, "Cache manager is null!").get(savedTenant.getId());
Assert.assertNotNull("Saving a Tenant doesn't add it to the cache!", cachedTenant); Assert.assertNotNull("Saving a Tenant doesn't add it to the cache!", cachedTenant);
tenantService.deleteTenant(savedTenant.getId()); tenantService.deleteTenant(savedTenant.getId());
cachedTenant = Objects.requireNonNull(cacheManager.getCache(CacheConstants.TENANTS_CACHE), "Cache manager is null!").get(savedTenant.getId()); cachedTenant = Objects.requireNonNull(tenantCache, "Cache manager is null!").get(savedTenant.getId());
Assert.assertNull("Removing a Tenant doesn't evict the cache!", cachedTenant); Assert.assertNull("Removing a Tenant doesn't evict the cache!", cachedTenant);
} }
@Test @Test
public void testDeleteTenantDeletingAllRelatedEntities() throws Exception { public void testDeleteTenantDeletingAllRelatedEntities() throws Exception {
TenantProfile savedProfile = createAndSaveTenantProfile(); TenantProfile profile = createAndSaveTenantProfile();
Tenant savedTenant = createAndSaveTenant(savedProfile); Tenant tenant = createAndSaveTenant(profile);
User savedUser = createAndSaveUserFor(savedTenant); User user = createAndSaveUserFor(tenant);
Customer savedCustomer = createAndSaveCustomerFor(savedTenant); Customer customer = createAndSaveCustomerFor(tenant);
WidgetsBundle savedWidgetsBundle = createAndSaveWidgetBundleFor(savedTenant); WidgetsBundle widgetsBundle = createAndSaveWidgetBundleFor(tenant);
DeviceProfile savedDeviceProfile = createAndSaveDeviceProfileWithProfileDataFor(savedTenant); DeviceProfile deviceProfile = createAndSaveDeviceProfileWithProfileDataFor(tenant);
Device savedDevice = createAndSaveDeviceFor(savedTenant, savedCustomer, savedDeviceProfile); Device device = createAndSaveDeviceFor(tenant, customer, deviceProfile);
EntityView savedEntityView = createAndSaveEntityViewFor(savedTenant, savedCustomer, savedDevice); EntityView entityView = createAndSaveEntityViewFor(tenant, customer, device);
Asset savedAsset = createAndSaveAssetFor(savedTenant, savedCustomer); Asset asset = createAndSaveAssetFor(tenant, customer);
Dashboard savedDashboard = createAndSaveDashboardFor(savedTenant, savedCustomer); Dashboard dashboard = createAndSaveDashboardFor(tenant, customer);
RuleChain savedRuleChain = createAndSaveRuleChainFor(savedTenant); RuleChain ruleChain = createAndSaveRuleChainFor(tenant);
Edge savedEdge = createAndSaveEdgeFor(savedTenant); Edge edge = createAndSaveEdgeFor(tenant);
OtaPackage savedOtaPackage = createAndSaveOtaPackageFor(savedTenant, savedDeviceProfile); OtaPackage otaPackage = createAndSaveOtaPackageFor(tenant, deviceProfile);
TbResource savedResource = createAndSaveResourceFor(savedTenant); TbResource resource = createAndSaveResourceFor(tenant);
Rpc savedRpc = createAndSaveRpcFor(savedTenant, savedDevice); Rpc rpc = createAndSaveRpcFor(tenant, device);
tenantService.deleteTenant(savedTenant.getId()); tenantService.deleteTenant(tenant.getId());
Assert.assertNull(tenantService.findTenantById(savedTenant.getId())); Assert.assertNull(tenantService.findTenantById(tenant.getId()));
assertCustomerIsDeleted(savedTenant, savedCustomer); assertCustomerIsDeleted(tenant, customer);
assertWidgetsBundleIsDeleted(savedTenant, savedWidgetsBundle); assertWidgetsBundleIsDeleted(tenant, widgetsBundle);
assertEntityViewIsDeleted(savedTenant, savedDevice, savedEntityView); assertEntityViewIsDeleted(tenant, device, entityView);
assertAssetIsDeleted(savedTenant, savedAsset); assertAssetIsDeleted(tenant, asset);
assertDeviceIsDeleted(savedTenant, savedDevice); assertDeviceIsDeleted(tenant, device);
assertDeviceProfileIsDeleted(savedTenant, savedDeviceProfile); assertDeviceProfileIsDeleted(tenant, deviceProfile);
assertDashboardIsDeleted(savedTenant, savedDashboard); assertDashboardIsDeleted(tenant, dashboard);
assertEdgeIsDeleted(savedTenant, savedEdge); assertEdgeIsDeleted(tenant, edge);
assertTenantAdminIsDeleted(savedTenant); assertTenantAdminIsDeleted(tenant);
assertUserIsDeleted(savedTenant, savedUser); assertUserIsDeleted(tenant, user);
Assert.assertNull(ruleChainService.findRuleChainById(savedTenant.getId(), savedRuleChain.getId())); Assert.assertNull(ruleChainService.findRuleChainById(tenant.getId(), ruleChain.getId()));
Assert.assertNull(apiUsageStateService.findTenantApiUsageState(savedTenant.getId())); Assert.assertNull(apiUsageStateService.findTenantApiUsageState(tenant.getId()));
assertResourceIsDeleted(savedTenant, savedResource); assertResourceIsDeleted(tenant, resource);
assertOtaPackageIsDeleted(savedTenant, savedOtaPackage); assertOtaPackageIsDeleted(tenant, otaPackage);
Assert.assertNull(rpcService.findById(savedTenant.getId(), savedRpc.getId())); Assert.assertNull(rpcService.findById(tenant.getId(), rpc.getId()));
tenantProfileService.deleteTenantProfile(TenantId.SYS_TENANT_ID, savedProfile.getId()); tenantProfileService.deleteTenantProfile(TenantId.SYS_TENANT_ID, profile.getId());
} }
private void assertOtaPackageIsDeleted(Tenant savedTenant, OtaPackage savedOtaPackage) { private void assertOtaPackageIsDeleted(Tenant tenant, OtaPackage otaPackage) {
Assert.assertNull( assertThat(otaPackageService.findOtaPackageById(tenant.getId(), otaPackage.getId()))
otaPackageService.findOtaPackageById( .as("otaPackage").isNull();
savedTenant.getId(), savedOtaPackage.getId() PageLink pageLinkOta = new PageLink(1);
) PageData<OtaPackageInfo> pageDataOta = otaPackageService.findTenantOtaPackagesByTenantId(tenant.getId(), pageLinkOta);
);
PageLink pageLinkOta = new PageLink(1000);
PageData<OtaPackageInfo> pageDataOta = otaPackageService.findTenantOtaPackagesByTenantId(savedTenant.getId(), pageLinkOta);
Assert.assertFalse(pageDataOta.hasNext());
Assert.assertEquals(0, pageDataOta.getTotalElements()); Assert.assertEquals(0, pageDataOta.getTotalElements());
} }
private void assertResourceIsDeleted(Tenant savedTenant, TbResource savedResource) { private void assertResourceIsDeleted(Tenant tenant, TbResource resource) {
Assert.assertNull(resourceService.findResourceById(savedTenant.getId(), savedResource.getId())); assertThat(resourceService.findResourceById(tenant.getId(), resource.getId()))
PageLink pageLinkResources = new PageLink(1000); .as("resource").isNull();
PageLink pageLinkResources = new PageLink(1);
PageData<TbResourceInfo> tenantResources = PageData<TbResourceInfo> tenantResources =
resourceService.findAllTenantResourcesByTenantId(savedTenant.getId(), pageLinkResources); resourceService.findAllTenantResourcesByTenantId(tenant.getId(), pageLinkResources);
Assert.assertFalse(tenantResources.hasNext());
Assert.assertEquals(0, tenantResources.getTotalElements()); Assert.assertEquals(0, tenantResources.getTotalElements());
} }
private void assertUserIsDeleted(Tenant savedTenant, User savedUser) { private void assertUserIsDeleted(Tenant tenant, User user) {
Assert.assertNull(userService.findUserById(savedTenant.getId(), savedUser.getId())); assertThat(userService.findUserById(tenant.getId(), user.getId()))
PageLink pageLinkUsers = new PageLink(1000); .as("user").isNull();
PageLink pageLinkUsers = new PageLink(1);
PageData<User> users = PageData<User> users =
userService.findUsersByTenantId(savedTenant.getId(), pageLinkUsers); userService.findUsersByTenantId(tenant.getId(), pageLinkUsers);
Assert.assertFalse(users.hasNext());
Assert.assertEquals(0, users.getTotalElements()); Assert.assertEquals(0, users.getTotalElements());
} }
private void assertTenantAdminIsDeleted(Tenant savedTenant) { private void assertTenantAdminIsDeleted(Tenant savedTenant) {
PageLink pageLinkTenantAdmins = new PageLink(1000); PageLink pageLinkTenantAdmins = new PageLink(1);
PageData<User> tenantAdmins = PageData<User> tenantAdmins =
userService.findTenantAdmins(savedTenant.getId(), pageLinkTenantAdmins); userService.findTenantAdmins(savedTenant.getId(), pageLinkTenantAdmins);
Assert.assertFalse(tenantAdmins.hasNext());
Assert.assertEquals(0, tenantAdmins.getTotalElements()); Assert.assertEquals(0, tenantAdmins.getTotalElements());
} }
private void assertEdgeIsDeleted(Tenant savedTenant, Edge savedEdge) { private void assertEdgeIsDeleted(Tenant tenant, Edge edge) {
Assert.assertNull(edgeService.findEdgeById(savedTenant.getId(), savedEdge.getId())); assertThat(edgeService.findEdgeById(tenant.getId(), edge.getId()))
PageLink pageLinkEdges = new PageLink(1000); .as("edge").isNull();
PageData<Edge> edges = edgeService.findEdgesByTenantId(savedTenant.getId(), pageLinkEdges); PageLink pageLinkEdges = new PageLink(1);
Assert.assertFalse(edges.hasNext()); PageData<Edge> edges = edgeService.findEdgesByTenantId(tenant.getId(), pageLinkEdges);
Assert.assertEquals(0, edges.getTotalElements()); Assert.assertEquals(0, edges.getTotalElements());
} }
private void assertDashboardIsDeleted(Tenant savedTenant, Dashboard savedDashboard) { private void assertDashboardIsDeleted(Tenant tenant, Dashboard dashboard) {
Assert.assertNull(dashboardService.findDashboardById( assertThat(dashboardService.findDashboardById(tenant.getId(), dashboard.getId()))
savedTenant.getId(), savedDashboard.getId() .as("dashboard").isNull();
)); PageLink pageLinkDashboards = new PageLink(1);
PageLink pageLinkDashboards = new PageLink(1000);
PageData<DashboardInfo> dashboards = PageData<DashboardInfo> dashboards =
dashboardService.findDashboardsByTenantId(savedTenant.getId(), pageLinkDashboards); dashboardService.findDashboardsByTenantId(tenant.getId(), pageLinkDashboards);
Assert.assertFalse(dashboards.hasNext());
Assert.assertEquals(0, dashboards.getTotalElements()); Assert.assertEquals(0, dashboards.getTotalElements());
} }
private void assertDeviceProfileIsDeleted(Tenant savedTenant, DeviceProfile savedDeviceProfile) { private void assertDeviceProfileIsDeleted(Tenant tenant, DeviceProfile deviceProfile) {
Assert.assertNull(deviceProfileService.findDeviceProfileById( assertThat(deviceProfileService.findDeviceProfileById(tenant.getId(), deviceProfile.getId()))
savedTenant.getId(), savedDeviceProfile.getId() .as("deviceProfile").isNull();
)); PageLink pageLinkDeviceProfiles = new PageLink(1);
PageLink pageLinkDeviceProfiles = new PageLink(1000);
PageData<DeviceProfile> profiles = PageData<DeviceProfile> profiles =
deviceProfileService.findDeviceProfiles(savedTenant.getId(), pageLinkDeviceProfiles); deviceProfileService.findDeviceProfiles(tenant.getId(), pageLinkDeviceProfiles);
Assert.assertFalse(profiles.hasNext());
Assert.assertEquals(0, profiles.getTotalElements()); Assert.assertEquals(0, profiles.getTotalElements());
} }
private void assertDeviceIsDeleted(Tenant savedTenant, Device savedDevice) { private void assertDeviceIsDeleted(Tenant tenant, Device device) {
Assert.assertNull(deviceService.findDeviceById( assertThat(deviceService.findDeviceById(tenant.getId(), device.getId()))
savedTenant.getId(), savedDevice.getId() .as("device").isNull();
)); PageLink pageLinkDevices = new PageLink(1);
PageLink pageLinkDevices = new PageLink(1000);
PageData<Device> devices = PageData<Device> devices =
deviceService.findDevicesByTenantId(savedTenant.getId(), pageLinkDevices); deviceService.findDevicesByTenantId(tenant.getId(), pageLinkDevices);
Assert.assertFalse(devices.hasNext());
Assert.assertEquals(0, devices.getTotalElements()); Assert.assertEquals(0, devices.getTotalElements());
} }
private void assertAssetIsDeleted(Tenant savedTenant, Asset savedAsset) { private void assertAssetIsDeleted(Tenant tenant, Asset asset) {
Assert.assertNull(assetService.findAssetById( assertThat(assetService.findAssetById(tenant.getId(), asset.getId()))
savedTenant.getId(), savedAsset.getId() .as("asset").isNull();
)); PageLink pageLinkAssets = new PageLink(1);
PageLink pageLinkAssets = new PageLink(1000);
PageData<Asset> assets = PageData<Asset> assets =
assetService.findAssetsByTenantId(savedTenant.getId(), pageLinkAssets); assetService.findAssetsByTenantId(tenant.getId(), pageLinkAssets);
Assert.assertFalse(assets.hasNext());
Assert.assertEquals(0, assets.getTotalElements()); Assert.assertEquals(0, assets.getTotalElements());
} }
private void assertEntityViewIsDeleted(Tenant savedTenant, Device savedDevice, EntityView savedEntityView) { private void assertEntityViewIsDeleted(Tenant tenant, Device device, EntityView entityView) {
Assert.assertNull(entityViewService.findEntityViewById( assertThat(entityViewService.findEntityViewById(tenant.getId(), entityView.getId()))
savedTenant.getId(), savedEntityView.getId() .as("entityView").isNull();
));
List<EntityView> entityViews = List<EntityView> entityViews =
entityViewService.findEntityViewsByTenantIdAndEntityId( entityViewService.findEntityViewsByTenantIdAndEntityId(tenant.getId(), device.getId());
savedTenant.getId(), savedDevice.getId());
Assert.assertTrue(entityViews.isEmpty()); Assert.assertTrue(entityViews.isEmpty());
} }
private void assertWidgetsBundleIsDeleted(Tenant savedTenant, WidgetsBundle savedWidgetsBundle) { private void assertWidgetsBundleIsDeleted(Tenant tenant, WidgetsBundle widgetsBundle) {
Assert.assertNull( assertThat(widgetsBundleService.findWidgetsBundleById(tenant.getId(), widgetsBundle.getId()))
widgetsBundleService.findWidgetsBundleById(savedTenant.getId(), savedWidgetsBundle.getId()) .as("widgetBundle").isNull();
);
List<WidgetsBundle> widgetsBundlesByTenantId = List<WidgetsBundle> widgetsBundlesByTenantId =
widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(savedTenant.getId()); widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(tenant.getId());
Assert.assertTrue(widgetsBundlesByTenantId.isEmpty()); Assert.assertTrue(widgetsBundlesByTenantId.isEmpty());
} }
private void assertCustomerIsDeleted(Tenant savedTenant, Customer savedCustomer) { private void assertCustomerIsDeleted(Tenant tenant, Customer customer) {
Assert.assertNull(customerService.findCustomerById(savedTenant.getId(), savedCustomer.getId())); assertThat(customerService.findCustomerById(tenant.getId(), customer.getId()))
PageLink pageLinkCustomer = new PageLink(1000); .as("customer").isNull();
PageLink pageLinkCustomer = new PageLink(1);
PageData<Customer> pageDataCustomer = customerService PageData<Customer> pageDataCustomer = customerService
.findCustomersByTenantId(savedTenant.getId(), pageLinkCustomer); .findCustomersByTenantId(tenant.getId(), pageLinkCustomer);
Assert.assertFalse(pageDataCustomer.hasNext());
Assert.assertEquals(0, pageDataCustomer.getTotalElements()); Assert.assertEquals(0, pageDataCustomer.getTotalElements());
} }
private Rpc createAndSaveRpcFor(Tenant savedTenant, Device savedDevice) { private Rpc createAndSaveRpcFor(Tenant tenant, Device device) {
Rpc rpc = new Rpc(); Rpc rpc = new Rpc();
rpc.setTenantId(savedTenant.getId()); rpc.setTenantId(tenant.getId());
rpc.setDeviceId(savedDevice.getId()); rpc.setDeviceId(device.getId());
rpc.setStatus(RpcStatus.QUEUED); rpc.setStatus(RpcStatus.QUEUED);
rpc.setRequest(JacksonUtil.toJsonNode("{}")); rpc.setRequest(JacksonUtil.toJsonNode("{}"));
return rpcService.save(rpc); return rpcService.save(rpc);
} }
private TbResource createAndSaveResourceFor(Tenant savedTenant) { private TbResource createAndSaveResourceFor(Tenant tenant) {
TbResource resource = new TbResource(); TbResource resource = new TbResource();
resource.setTenantId(savedTenant.getId()); resource.setTenantId(tenant.getId());
resource.setTitle("Test resource"); resource.setTitle("Test resource");
resource.setResourceType(ResourceType.LWM2M_MODEL); resource.setResourceType(ResourceType.LWM2M_MODEL);
resource.setFileName("filename.txt"); resource.setFileName("filename.txt");
@ -567,47 +555,49 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
return resourceService.saveResource(resource); return resourceService.saveResource(resource);
} }
private OtaPackage createAndSaveOtaPackageFor(Tenant savedTenant, DeviceProfile savedDeviceProfile) { private OtaPackage createAndSaveOtaPackageFor(Tenant tenant, DeviceProfile deviceProfile) {
OtaPackage otaPackage = createFirmware(savedTenant.getId(), savedDeviceProfile.getId()); return otaPackageService.saveOtaPackage(
return otaPackageService.saveOtaPackage(otaPackage); BaseOtaPackageServiceTest.createFirmware(
tenant.getId(), "2", deviceProfile.getId())
);
} }
private Edge createAndSaveEdgeFor(Tenant savedTenant) { private Edge createAndSaveEdgeFor(Tenant tenant) {
Edge edge = constructEdge(savedTenant.getId(), "Test edge", "Simple"); Edge edge = constructEdge(tenant.getId(), "Test edge", "Simple");
return edgeService.saveEdge(edge, false); return edgeService.saveEdge(edge, false);
} }
private RuleChain createAndSaveRuleChainFor(Tenant savedTenant) { private RuleChain createAndSaveRuleChainFor(Tenant tenant) {
RuleChain ruleChain = new RuleChain(); RuleChain ruleChain = new RuleChain();
ruleChain.setTenantId(savedTenant.getId()); ruleChain.setTenantId(tenant.getId());
ruleChain.setName("Test rule chain"); ruleChain.setName("Test rule chain");
ruleChain.setType(RuleChainType.CORE); ruleChain.setType(RuleChainType.CORE);
return ruleChainService.saveRuleChain(ruleChain); return ruleChainService.saveRuleChain(ruleChain);
} }
private Dashboard createAndSaveDashboardFor(Tenant savedTenant, Customer savedCustomer) { private Dashboard createAndSaveDashboardFor(Tenant tenant, Customer customer) {
Dashboard dashboard = new Dashboard(); Dashboard dashboard = new Dashboard();
dashboard.setTenantId(savedTenant.getId()); dashboard.setTenantId(tenant.getId());
dashboard.setTitle("Test dashboard"); dashboard.setTitle("Test dashboard");
dashboard.setAssignedCustomers(Set.of(savedCustomer.toShortCustomerInfo())); dashboard.setAssignedCustomers(Set.of(customer.toShortCustomerInfo()));
return dashboardService.saveDashboard(dashboard); return dashboardService.saveDashboard(dashboard);
} }
private Asset createAndSaveAssetFor(Tenant savedTenant, Customer savedCustomer) { private Asset createAndSaveAssetFor(Tenant tenant, Customer customer) {
Asset asset = new Asset(); Asset asset = new Asset();
asset.setTenantId(savedTenant.getId()); asset.setTenantId(tenant.getId());
asset.setCustomerId(savedCustomer.getId()); asset.setCustomerId(customer.getId());
asset.setType("Test asset type"); asset.setType("Test asset type");
asset.setName("Test asset type"); asset.setName("Test asset type");
asset.setLabel("Test asset type"); asset.setLabel("Test asset type");
return assetService.saveAsset(asset); return assetService.saveAsset(asset);
} }
private EntityView createAndSaveEntityViewFor(Tenant savedTenant, Customer savedCustomer, Device savedDevice) { private EntityView createAndSaveEntityViewFor(Tenant tenant, Customer customer, Device device) {
EntityView entityView = new EntityView(); EntityView entityView = new EntityView();
entityView.setEntityId(savedDevice.getId()); entityView.setEntityId(device.getId());
entityView.setTenantId(savedTenant.getId()); entityView.setTenantId(tenant.getId());
entityView.setCustomerId(savedCustomer.getId()); entityView.setCustomerId(customer.getId());
entityView.setType("Test type"); entityView.setType("Test type");
entityView.setName("Test entity view"); entityView.setName("Test entity view");
entityView.setStartTimeMs(0); entityView.setStartTimeMs(0);
@ -615,20 +605,20 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
return entityViewService.saveEntityView(entityView); return entityViewService.saveEntityView(entityView);
} }
private Device createAndSaveDeviceFor(Tenant savedTenant, Customer savedCustomer, DeviceProfile savedDeviceProfile) { private Device createAndSaveDeviceFor(Tenant tenant, Customer customer, DeviceProfile deviceProfile) {
Device device = new Device(); Device device = new Device();
device.setCustomerId(savedCustomer.getId()); device.setCustomerId(customer.getId());
device.setTenantId(savedTenant.getId()); device.setTenantId(tenant.getId());
device.setType("Test type"); device.setType("Test type");
device.setName("TestType"); device.setName("TestType");
device.setLabel("Test type"); device.setLabel("Test type");
device.setDeviceProfileId(savedDeviceProfile.getId()); device.setDeviceProfileId(deviceProfile.getId());
return deviceService.saveDevice(device); return deviceService.saveDevice(device);
} }
private DeviceProfile createAndSaveDeviceProfileWithProfileDataFor(Tenant savedTenant) { private DeviceProfile createAndSaveDeviceProfileWithProfileDataFor(Tenant tenant) {
DeviceProfile deviceProfile = new DeviceProfile(); DeviceProfile deviceProfile = new DeviceProfile();
deviceProfile.setTenantId(savedTenant.getId()); deviceProfile.setTenantId(tenant.getId());
deviceProfile.setTransportType(DeviceTransportType.MQTT); deviceProfile.setTransportType(DeviceTransportType.MQTT);
deviceProfile.setName("Test device profile"); deviceProfile.setName("Test device profile");
deviceProfile.setType(DeviceProfileType.DEFAULT); deviceProfile.setType(DeviceProfileType.DEFAULT);
@ -638,37 +628,37 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
return deviceProfileService.saveDeviceProfile(deviceProfile); return deviceProfileService.saveDeviceProfile(deviceProfile);
} }
private WidgetsBundle createAndSaveWidgetBundleFor(Tenant savedTenant) { private WidgetsBundle createAndSaveWidgetBundleFor(Tenant tenant) {
WidgetsBundle widgetsBundle = new WidgetsBundle(); WidgetsBundle widgetsBundle = new WidgetsBundle();
widgetsBundle.setTenantId(savedTenant.getId()); widgetsBundle.setTenantId(tenant.getId());
widgetsBundle.setTitle("Test widgets bundle"); widgetsBundle.setTitle("Test widgets bundle");
widgetsBundle.setAlias("TestWidgetsBundle"); widgetsBundle.setAlias("TestWidgetsBundle");
widgetsBundle.setDescription("Just a simple widgets bundle"); widgetsBundle.setDescription("Just a simple widgets bundle");
return widgetsBundleService.saveWidgetsBundle(widgetsBundle); return widgetsBundleService.saveWidgetsBundle(widgetsBundle);
} }
private Customer createAndSaveCustomerFor(Tenant savedTenant) { private Customer createAndSaveCustomerFor(Tenant tenant) {
Customer customer = new Customer(); Customer customer = new Customer();
customer.setTitle("Test customer"); customer.setTitle("Test customer");
customer.setTenantId(savedTenant.getId()); customer.setTenantId(tenant.getId());
customer.setEmail("testCustomer@test.com"); customer.setEmail("testCustomer@test.com");
return customerService.saveCustomer(customer); return customerService.saveCustomer(customer);
} }
private User createAndSaveUserFor(Tenant savedTenant) { private User createAndSaveUserFor(Tenant tenant) {
User user = new User(); User user = new User();
user.setAuthority(Authority.TENANT_ADMIN); user.setAuthority(Authority.TENANT_ADMIN);
user.setEmail("tenantAdmin@test.com"); user.setEmail("tenantAdmin@test.com");
user.setFirstName("tenantAdmin"); user.setFirstName("tenantAdmin");
user.setLastName("tenantAdmin"); user.setLastName("tenantAdmin");
user.setTenantId(savedTenant.getId()); user.setTenantId(tenant.getId());
return userService.saveUser(user); return userService.saveUser(user);
} }
private Tenant createAndSaveTenant(TenantProfile savedProfile) { private Tenant createAndSaveTenant(TenantProfile tenantProfile) {
Tenant tenant = new Tenant(); Tenant tenant = new Tenant();
tenant.setTitle("My tenant"); tenant.setTitle("My tenant");
tenant.setTenantProfileId(savedProfile.getId()); tenant.setTenantProfileId(tenantProfile.getId());
return tenantService.saveTenant(tenant); return tenantService.saveTenant(tenant);
} }
@ -677,20 +667,4 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
tenantProfile.setName("Test tenant profile"); tenantProfile.setName("Test tenant profile");
return tenantProfileService.saveTenantProfile(TenantId.SYS_TENANT_ID, tenantProfile); return tenantProfileService.saveTenantProfile(TenantId.SYS_TENANT_ID, tenantProfile);
} }
private OtaPackage createFirmware(TenantId tenantId, DeviceProfileId deviceProfileId) {
OtaPackage firmware = new OtaPackage();
firmware.setTenantId(tenantId);
firmware.setDeviceProfileId(deviceProfileId);
firmware.setType(FIRMWARE);
firmware.setTitle("My firmware");
firmware.setVersion("1");
firmware.setFileName("filename.txt");
firmware.setContentType("text/plain");
firmware.setChecksumAlgorithm(ChecksumAlgorithm.SHA256);
firmware.setChecksum("4bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a");
firmware.setData(ByteBuffer.wrap(new byte[]{(int) 1L}));
firmware.setDataSize(1L);
return otaPackageService.saveOtaPackage(firmware);
}
} }

2
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java

@ -124,7 +124,7 @@ public class TbCreateRelationNode extends TbAbstractRelationActionNode<TbCreateR
} }
private ListenableFuture<Boolean> checkRelation(TbContext ctx, SearchDirectionIds sdId, String relationType) { private ListenableFuture<Boolean> checkRelation(TbContext ctx, SearchDirectionIds sdId, String relationType) {
return ctx.getRelationService().checkRelation(ctx.getTenantId(), sdId.getFromId(), sdId.getToId(), relationType, RelationTypeGroup.COMMON); return ctx.getRelationService().checkRelationAsync(ctx.getTenantId(), sdId.getFromId(), sdId.getToId(), relationType, RelationTypeGroup.COMMON);
} }
private ListenableFuture<Boolean> processCreateRelation(TbContext ctx, EntityContainer entityContainer, SearchDirectionIds sdId, String relationType) { private ListenableFuture<Boolean> processCreateRelation(TbContext ctx, EntityContainer entityContainer, SearchDirectionIds sdId, String relationType) {

2
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbDeleteRelationNode.java

@ -98,7 +98,7 @@ public class TbDeleteRelationNode extends TbAbstractRelationActionNode<TbDeleteR
private ListenableFuture<Boolean> processSingle(TbContext ctx, TbMsg msg, EntityContainer entityContainer, String relationType) { private ListenableFuture<Boolean> processSingle(TbContext ctx, TbMsg msg, EntityContainer entityContainer, String relationType) {
SearchDirectionIds sdId = processSingleSearchDirection(msg, entityContainer); SearchDirectionIds sdId = processSingleSearchDirection(msg, entityContainer);
return Futures.transformAsync(ctx.getRelationService().checkRelation(ctx.getTenantId(), sdId.getFromId(), sdId.getToId(), relationType, RelationTypeGroup.COMMON), return Futures.transformAsync(ctx.getRelationService().checkRelationAsync(ctx.getTenantId(), sdId.getFromId(), sdId.getToId(), relationType, RelationTypeGroup.COMMON),
result -> { result -> {
if (result) { if (result) {
return processSingleDeleteRelation(ctx, sdId, relationType); return processSingleDeleteRelation(ctx, sdId, relationType);

2
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java

@ -82,7 +82,7 @@ public class TbCheckRelationNode implements TbNode {
to = EntityIdFactory.getByTypeAndId(config.getEntityType(), config.getEntityId()); to = EntityIdFactory.getByTypeAndId(config.getEntityType(), config.getEntityId());
from = msg.getOriginator(); from = msg.getOriginator();
} }
return ctx.getRelationService().checkRelation(ctx.getTenantId(), from, to, config.getRelationType(), RelationTypeGroup.COMMON); return ctx.getRelationService().checkRelationAsync(ctx.getTenantId(), from, to, config.getRelationType(), RelationTypeGroup.COMMON);
} }
private ListenableFuture<Boolean> processList(TbContext ctx, TbMsg msg) { private ListenableFuture<Boolean> processList(TbContext ctx, TbMsg msg) {

6
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeTest.java

@ -113,7 +113,7 @@ public class TbCreateRelationNodeTest {
metaData.putValue("type", "AssetType"); metaData.putValue("type", "AssetType");
msg = TbMsg.newMsg(DataConstants.ENTITY_CREATED, deviceId, metaData, TbMsgDataType.JSON, "{}", ruleChainId, ruleNodeId); msg = TbMsg.newMsg(DataConstants.ENTITY_CREATED, deviceId, metaData, TbMsgDataType.JSON, "{}", ruleChainId, ruleNodeId);
when(ctx.getRelationService().checkRelation(any(), eq(assetId), eq(deviceId), eq(RELATION_TYPE_CONTAINS), eq(RelationTypeGroup.COMMON))) when(ctx.getRelationService().checkRelationAsync(any(), eq(assetId), eq(deviceId), eq(RELATION_TYPE_CONTAINS), eq(RelationTypeGroup.COMMON)))
.thenReturn(Futures.immediateFuture(false)); .thenReturn(Futures.immediateFuture(false));
when(ctx.getRelationService().saveRelationAsync(any(), eq(new EntityRelation(assetId, deviceId, RELATION_TYPE_CONTAINS, RelationTypeGroup.COMMON)))) when(ctx.getRelationService().saveRelationAsync(any(), eq(new EntityRelation(assetId, deviceId, RELATION_TYPE_CONTAINS, RelationTypeGroup.COMMON))))
.thenReturn(Futures.immediateFuture(true)); .thenReturn(Futures.immediateFuture(true));
@ -144,7 +144,7 @@ public class TbCreateRelationNodeTest {
when(ctx.getRelationService().findByToAndTypeAsync(any(), eq(msg.getOriginator()), eq(RELATION_TYPE_CONTAINS), eq(RelationTypeGroup.COMMON))) when(ctx.getRelationService().findByToAndTypeAsync(any(), eq(msg.getOriginator()), eq(RELATION_TYPE_CONTAINS), eq(RelationTypeGroup.COMMON)))
.thenReturn(Futures.immediateFuture(Collections.singletonList(relation))); .thenReturn(Futures.immediateFuture(Collections.singletonList(relation)));
when(ctx.getRelationService().deleteRelationAsync(any(), eq(relation))).thenReturn(Futures.immediateFuture(true)); when(ctx.getRelationService().deleteRelationAsync(any(), eq(relation))).thenReturn(Futures.immediateFuture(true));
when(ctx.getRelationService().checkRelation(any(), eq(assetId), eq(deviceId), eq(RELATION_TYPE_CONTAINS), eq(RelationTypeGroup.COMMON))) when(ctx.getRelationService().checkRelationAsync(any(), eq(assetId), eq(deviceId), eq(RELATION_TYPE_CONTAINS), eq(RelationTypeGroup.COMMON)))
.thenReturn(Futures.immediateFuture(false)); .thenReturn(Futures.immediateFuture(false));
when(ctx.getRelationService().saveRelationAsync(any(), eq(new EntityRelation(assetId, deviceId, RELATION_TYPE_CONTAINS, RelationTypeGroup.COMMON)))) when(ctx.getRelationService().saveRelationAsync(any(), eq(new EntityRelation(assetId, deviceId, RELATION_TYPE_CONTAINS, RelationTypeGroup.COMMON))))
.thenReturn(Futures.immediateFuture(true)); .thenReturn(Futures.immediateFuture(true));
@ -171,7 +171,7 @@ public class TbCreateRelationNodeTest {
metaData.putValue("type", "AssetType"); metaData.putValue("type", "AssetType");
msg = TbMsg.newMsg(DataConstants.ENTITY_CREATED, deviceId, metaData, TbMsgDataType.JSON, "{}", ruleChainId, ruleNodeId); msg = TbMsg.newMsg(DataConstants.ENTITY_CREATED, deviceId, metaData, TbMsgDataType.JSON, "{}", ruleChainId, ruleNodeId);
when(ctx.getRelationService().checkRelation(any(), eq(assetId), eq(deviceId), eq(RELATION_TYPE_CONTAINS), eq(RelationTypeGroup.COMMON))) when(ctx.getRelationService().checkRelationAsync(any(), eq(assetId), eq(deviceId), eq(RELATION_TYPE_CONTAINS), eq(RelationTypeGroup.COMMON)))
.thenReturn(Futures.immediateFuture(false)); .thenReturn(Futures.immediateFuture(false));
when(ctx.getRelationService().saveRelationAsync(any(), eq(new EntityRelation(assetId, deviceId, RELATION_TYPE_CONTAINS, RelationTypeGroup.COMMON)))) when(ctx.getRelationService().saveRelationAsync(any(), eq(new EntityRelation(assetId, deviceId, RELATION_TYPE_CONTAINS, RelationTypeGroup.COMMON))))
.thenReturn(Futures.immediateFuture(true)); .thenReturn(Futures.immediateFuture(true));

Loading…
Cancel
Save