From 7983f0ee07e0d0f7ee86a8cf3093d1f6946e758e Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Mon, 13 Jun 2022 12:18:44 +0300 Subject: [PATCH] Performance improvements and refactoring --- .../DefaultEntitiesExportImportService.java | 7 +- .../sync/ie/EntitiesExportImportService.java | 3 +- .../DefaultExportableEntitiesService.java | 17 ---- .../exporting/ExportableEntitiesService.java | 5 -- .../impl/DefaultEntityExportService.java | 9 -- .../ie/importing/EntityImportService.java | 3 +- .../ie/importing/impl/AssetImportService.java | 3 +- .../impl/BaseEntityImportService.java | 90 ++++++++++--------- .../importing/impl/CustomerImportService.java | 7 +- .../impl/DashboardImportService.java | 12 +-- .../importing/impl/DeviceImportService.java | 5 +- .../impl/DeviceProfileImportService.java | 3 +- .../impl/RuleChainImportService.java | 15 ++-- .../impl/WidgetsBundleImportService.java | 11 +-- .../DefaultEntitiesVersionControlService.java | 27 +++--- .../sync/vc/data/EntitiesImportCtx.java | 75 ++++++++++++++++ 16 files changed, 174 insertions(+), 118 deletions(-) create mode 100644 application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesImportCtx.java diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java index 4e9e737076..b69fb5906c 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java @@ -36,6 +36,7 @@ import org.thingsboard.server.service.sync.ie.exporting.EntityExportService; import org.thingsboard.server.service.sync.ie.exporting.impl.BaseEntityExportService; import org.thingsboard.server.service.sync.ie.exporting.impl.DefaultEntityExportService; import org.thingsboard.server.service.sync.ie.importing.EntityImportService; +import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; import java.util.Collection; import java.util.Comparator; @@ -74,9 +75,9 @@ public class DefaultEntitiesExportImportService implements EntitiesExportImportS } @Override - public , I extends EntityId> EntityImportResult importEntity(SecurityUser user, EntityExportData exportData, EntityImportSettings importSettings, + public , I extends EntityId> EntityImportResult importEntity(EntitiesImportCtx ctx, EntityExportData exportData, boolean saveReferences, boolean sendEvents) throws ThingsboardException { - if (!rateLimitService.checkEntityImportLimit(user.getTenantId())) { + if (!rateLimitService.checkEntityImportLimit(ctx.getTenantId())) { throw new ThingsboardException("Rate limit for entities import is exceeded", ThingsboardErrorCode.TOO_MANY_REQUESTS); } if (exportData.getEntity() == null || exportData.getEntity().getId() == null) { @@ -86,7 +87,7 @@ public class DefaultEntitiesExportImportService implements EntitiesExportImportS EntityType entityType = exportData.getEntityType(); EntityImportService> importService = getImportService(entityType); - EntityImportResult importResult = importService.importEntity(user, exportData, importSettings); + EntityImportResult importResult = importService.importEntity(ctx, exportData); if (saveReferences) { importResult.getSaveReferencesCallback().run(); diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/EntitiesExportImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/EntitiesExportImportService.java index 45e6fccc73..221b29622c 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/EntitiesExportImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/EntitiesExportImportService.java @@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.sync.ie.EntityExportSettings; import org.thingsboard.server.common.data.sync.ie.EntityImportResult; import org.thingsboard.server.common.data.sync.ie.EntityImportSettings; import org.thingsboard.server.service.security.model.SecurityUser; +import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; import java.util.Comparator; @@ -31,7 +32,7 @@ public interface EntitiesExportImportService { , I extends EntityId> EntityExportData exportEntity(SecurityUser user, I entityId, EntityExportSettings exportSettings) throws ThingsboardException; - , I extends EntityId> EntityImportResult importEntity(SecurityUser user, EntityExportData exportData, EntityImportSettings importSettings, + , I extends EntityId> EntityImportResult importEntity(EntitiesImportCtx ctx, EntityExportData exportData, boolean saveReferences, boolean sendEvents) throws ThingsboardException; diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/DefaultExportableEntitiesService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/DefaultExportableEntitiesService.java index 9ea16477aa..fbc4dd4bc2 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/DefaultExportableEntitiesService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/DefaultExportableEntitiesService.java @@ -151,23 +151,6 @@ public class DefaultExportableEntitiesService implements ExportableEntitiesServi entityRemover.accept(tenantId, id); } - - @Override - public void checkPermission(SecurityUser user, HasId entity, EntityType entityType, Operation operation) throws ThingsboardException { - if (entity instanceof HasTenantId) { - accessControlService.checkPermission(user, Resource.of(entityType), operation, entity.getId(), (HasTenantId) entity); - } else { - accessControlService.checkPermission(user, Resource.of(entityType), operation); - } - } - - @Override - public void checkPermission(SecurityUser user, EntityId entityId, Operation operation) throws ThingsboardException { - HasId entity = findEntityByTenantIdAndId(user.getTenantId(), entityId); - checkPermission(user, entity, entityId.getEntityType(), operation); - } - - @SuppressWarnings("unchecked") private Dao getDao(EntityType entityType) { return (Dao) daos.get(entityType); diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/ExportableEntitiesService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/ExportableEntitiesService.java index 6ff2c96dcd..493ac0b9f2 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/ExportableEntitiesService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/ExportableEntitiesService.java @@ -40,9 +40,4 @@ public interface ExportableEntitiesService { void removeById(TenantId tenantId, I id); - - void checkPermission(SecurityUser user, HasId entity, EntityType entityType, Operation operation) throws ThingsboardException; - - void checkPermission(SecurityUser user, EntityId entityId, Operation operation) throws ThingsboardException; - } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java index f2ed8cd243..1c1d70b0ae 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java @@ -66,7 +66,6 @@ public class DefaultEntityExportService relations = new ArrayList<>(); List inboundRelations = relationService.findByTo(user.getTenantId(), entity.getId(), RelationTypeGroup.COMMON); - for (EntityRelation relation : inboundRelations) { - exportableEntitiesService.checkPermission(user, relation.getFrom(), Operation.READ); - } relations.addAll(inboundRelations); List outboundRelations = relationService.findByFrom(user.getTenantId(), entity.getId(), RelationTypeGroup.COMMON); - for (EntityRelation relation : outboundRelations) { - exportableEntitiesService.checkPermission(user, relation.getTo(), Operation.READ); - } relations.addAll(outboundRelations); return relations; } private Map> exportAttributes(SecurityUser user, E entity) throws ThingsboardException { - exportableEntitiesService.checkPermission(user, entity, entity.getId().getEntityType(), Operation.READ_ATTRIBUTES); - List scopes; if (entity.getId().getEntityType() == EntityType.DEVICE) { scopes = List.of(DataConstants.SERVER_SCOPE, DataConstants.SHARED_SCOPE); diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/EntityImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/EntityImportService.java index bf249937b9..4e7d4d8495 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/EntityImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/EntityImportService.java @@ -23,10 +23,11 @@ import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.common.data.sync.ie.EntityImportResult; import org.thingsboard.server.common.data.sync.ie.EntityImportSettings; import org.thingsboard.server.common.data.sync.ie.EntityExportData; +import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; public interface EntityImportService, D extends EntityExportData> { - EntityImportResult importEntity(SecurityUser user, D exportData, EntityImportSettings importSettings) throws ThingsboardException; + EntityImportResult importEntity(EntitiesImportCtx ctx, D exportData) throws ThingsboardException; EntityType getEntityType(); diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetImportService.java index 164dad6bcd..dd34160c6c 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetImportService.java @@ -28,6 +28,7 @@ import org.thingsboard.server.dao.asset.AssetService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.common.data.sync.ie.EntityExportData; +import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; @Service @TbCoreComponent @@ -43,7 +44,7 @@ public class AssetImportService extends BaseEntityImportService exportData, IdProvider idProvider, EntityImportSettings importSettings) { + protected Asset prepareAndSave(EntitiesImportCtx ctx, Asset asset, EntityExportData exportData, IdProvider idProvider) { return assetService.saveAsset(asset); } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/BaseEntityImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/BaseEntityImportService.java index 3ba5bfcdbd..7ba59bb3c4 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/BaseEntityImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/BaseEntityImportService.java @@ -53,6 +53,7 @@ import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.permission.Operation; import org.thingsboard.server.service.sync.ie.exporting.ExportableEntitiesService; import org.thingsboard.server.service.sync.ie.importing.EntityImportService; +import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService; import java.util.ArrayList; @@ -81,54 +82,53 @@ public abstract class BaseEntityImportService importEntity(SecurityUser user, D exportData, EntityImportSettings importSettings) throws ThingsboardException { + public EntityImportResult importEntity(EntitiesImportCtx ctx, D exportData) throws ThingsboardException { E entity = exportData.getEntity(); - E existingEntity = findExistingEntity(user.getTenantId(), entity, importSettings); + E existingEntity = findExistingEntity(ctx, entity); entity.setExternalId(entity.getId()); EntityImportResult importResult = new EntityImportResult<>(); - IdProvider idProvider = new IdProvider(user, importSettings, importResult); - setOwner(user.getTenantId(), entity, idProvider); + IdProvider idProvider = new IdProvider(ctx, importResult); + setOwner(ctx.getTenantId(), entity, idProvider); if (existingEntity == null) { entity.setId(null); - exportableEntitiesService.checkPermission(user, entity, getEntityType(), Operation.CREATE); } else { entity.setId(existingEntity.getId()); entity.setCreatedTime(existingEntity.getCreatedTime()); - exportableEntitiesService.checkPermission(user, existingEntity, getEntityType(), Operation.WRITE); } - E savedEntity = prepareAndSave(user.getTenantId(), entity, exportData, idProvider, importSettings); + E savedEntity = prepareAndSave(ctx, entity, exportData, idProvider); importResult.setSavedEntity(savedEntity); importResult.setOldEntity(existingEntity); importResult.setEntityType(getEntityType()); - processAfterSaved(user, importResult, exportData, idProvider, importSettings); + processAfterSaved(ctx, importResult, exportData, idProvider); + + ctx.putInternalId(exportData.getExternalId(), savedEntity.getId()); return importResult; } protected abstract void setOwner(TenantId tenantId, E entity, IdProvider idProvider); - protected abstract E prepareAndSave(TenantId tenantId, E entity, D exportData, IdProvider idProvider, EntityImportSettings importSettings); + protected abstract E prepareAndSave(EntitiesImportCtx ctx, E entity, D exportData, IdProvider idProvider); - protected void processAfterSaved(SecurityUser user, EntityImportResult importResult, D exportData, - IdProvider idProvider, EntityImportSettings importSettings) throws ThingsboardException { + protected void processAfterSaved(EntitiesImportCtx ctx, EntityImportResult importResult, D exportData, IdProvider idProvider) throws ThingsboardException { E savedEntity = importResult.getSavedEntity(); E oldEntity = importResult.getOldEntity(); importResult.addSendEventsCallback(() -> { - onEntitySaved(user, savedEntity, oldEntity); + onEntitySaved(ctx.getUser(), savedEntity, oldEntity); }); - if (importSettings.isUpdateRelations() && exportData.getRelations() != null) { - importRelations(user, exportData.getRelations(), importResult); + if (ctx.isUpdateRelations() && exportData.getRelations() != null) { + importRelations(ctx.getUser(), exportData.getRelations(), importResult); } - if (importSettings.isSaveAttributes() && exportData.getAttributes() != null) { - importAttributes(user, exportData.getAttributes(), importResult); + if (ctx.isSaveAttributes() && exportData.getAttributes() != null) { + importAttributes(ctx.getUser(), exportData.getAttributes(), importResult); } } @@ -138,12 +138,10 @@ public abstract class BaseEntityImportService to = findInternalEntity(user.getTenantId(), relation.getTo()); - exportableEntitiesService.checkPermission(user, to, to.getId().getEntityType(), Operation.WRITE); relation.setTo(to.getId()); } if (!relation.getFrom().equals(entity.getId())) { HasId from = findInternalEntity(user.getTenantId(), relation.getFrom()); - exportableEntitiesService.checkPermission(user, from, from.getId().getEntityType(), Operation.WRITE); relation.setFrom(from.getId()); } } @@ -155,15 +153,6 @@ public abstract class BaseEntityImportService { entityActionService.logEntityAction(user, existingRelation.getFrom(), null, null, @@ -234,12 +223,12 @@ public abstract class BaseEntityImportService Optional.ofNullable(exportableEntitiesService.findEntityByTenantIdAndId(tenantId, entity.getId()))) + protected E findExistingEntity(EntitiesImportCtx ctx, E entity) { + return (E) Optional.ofNullable(exportableEntitiesService.findEntityByTenantIdAndExternalId(ctx.getTenantId(), entity.getId())) + .or(() -> Optional.ofNullable(exportableEntitiesService.findEntityByTenantIdAndId(ctx.getTenantId(), entity.getId()))) .or(() -> { - if (importSettings.isFindExistingByName()) { - return Optional.ofNullable(exportableEntitiesService.findEntityByTenantIdAndName(tenantId, getEntityType(), entity.getName())); + if (ctx.isFindExistingByName()) { + return Optional.ofNullable(exportableEntitiesService.findEntityByTenantIdAndName(ctx.getTenantId(), getEntityType(), entity.getName())); } else { return Optional.empty(); } @@ -255,22 +244,27 @@ public abstract class BaseEntityImportService importResult; public ID getInternalId(ID externalId) { return getInternalId(externalId, true); - } + } public ID getInternalId(ID externalId, boolean throwExceptionIfNotFound) { if (externalId == null || externalId.isNullUid()) return null; + EntityId localId = ctx.getInternalId(externalId); + if (localId != null) { + return (ID) localId; + } + HasId entity; try { - entity = findInternalEntity(user.getTenantId(), externalId); + entity = findInternalEntity(ctx.getTenantId(), externalId); } catch (Exception e) { if (throwExceptionIfNotFound) { throw e; @@ -279,17 +273,26 @@ public abstract class BaseEntityImportService getInternalIdByUuid(UUID externalUuid) { if (externalUuid.equals(EntityId.NULL_UUID)) return Optional.empty(); + for (EntityType entityType : EntityType.values()) { + EntityId externalId; + try { + externalId = EntityIdFactory.getByTypeAndUuid(entityType, externalUuid); + } catch (Exception e) { + continue; + } + EntityId internalId = ctx.getInternalId(externalId); + if (internalId != null) { + return Optional.of(internalId); + } + } + for (EntityType entityType : EntityType.values()) { EntityId externalId; try { @@ -301,12 +304,13 @@ public abstract class BaseEntityImportService exportData, IdProvider idProvider, EntityImportSettings importSettings) { + protected Customer prepareAndSave(EntitiesImportCtx ctx, Customer customer, EntityExportData exportData, IdProvider idProvider) { if (!customer.isPublic()) { return customerService.saveCustomer(customer); } else { - Customer publicCustomer = customerService.findOrCreatePublicCustomer(tenantId); + Customer publicCustomer = customerService.findOrCreatePublicCustomer(ctx.getTenantId()); publicCustomer.setExternalId(customer.getExternalId()); - return customerDao.save(tenantId, publicCustomer); + return customerDao.save(ctx.getTenantId(), publicCustomer); } } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DashboardImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DashboardImportService.java index 9e681abd65..c720f6d0c2 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DashboardImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DashboardImportService.java @@ -34,6 +34,7 @@ import org.thingsboard.server.common.data.sync.ie.EntityImportSettings; import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; +import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; import org.thingsboard.server.utils.RegexUtils; import java.util.ArrayList; @@ -58,16 +59,17 @@ public class DashboardImportService extends BaseEntityImportService exportData, IdProvider idProvider, EntityImportSettings importSettings) { + protected Dashboard prepareAndSave(EntitiesImportCtx ctx, Dashboard dashboard, EntityExportData exportData, IdProvider idProvider) { + var tenantId = ctx.getTenantId(); JsonNode configuration = dashboard.getConfiguration(); JsonNode entityAliases = configuration.get("entityAliases"); if (entityAliases != null && entityAliases.isObject()) { diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceImportService.java index 9a3730bba9..0ad482e925 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceImportService.java @@ -27,6 +27,7 @@ import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.common.data.sync.ie.DeviceExportData; +import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; @Service @TbCoreComponent @@ -42,11 +43,11 @@ public class DeviceImportService extends BaseEntityImportService exportData, IdProvider idProvider, EntityImportSettings importSettings) { + protected DeviceProfile prepareAndSave(EntitiesImportCtx ctx, DeviceProfile deviceProfile, EntityExportData exportData, IdProvider idProvider) { deviceProfile.setDefaultRuleChainId(idProvider.getInternalId(deviceProfile.getDefaultRuleChainId())); deviceProfile.setDefaultDashboardId(idProvider.getInternalId(deviceProfile.getDefaultDashboardId())); deviceProfile.setFirmwareId(idProvider.getInternalId(deviceProfile.getFirmwareId())); diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/RuleChainImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/RuleChainImportService.java index 84d04959d9..f10377d005 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/RuleChainImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/RuleChainImportService.java @@ -33,6 +33,7 @@ import org.thingsboard.server.common.data.sync.ie.RuleChainExportData; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; +import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; import org.thingsboard.server.utils.RegexUtils; import java.util.Collections; @@ -52,16 +53,16 @@ public class RuleChainImportService extends BaseEntityImportService { @@ -85,8 +86,8 @@ public class RuleChainImportService extends BaseEntityImportService existingWidgets = widgetTypeService.findWidgetTypesInfosByTenantIdAndBundleAlias(tenantId, savedWidgetsBundle.getAlias()).stream() + Map existingWidgets = widgetTypeService.findWidgetTypesInfosByTenantIdAndBundleAlias(ctx.getTenantId(), savedWidgetsBundle.getAlias()).stream() .collect(Collectors.toMap(BaseWidgetType::getAlias, w -> w)); for (WidgetTypeDetails widget : exportData.getWidgets()) { WidgetTypeInfo existingWidget; @@ -70,13 +71,13 @@ public class WidgetsBundleImportService extends BaseEntityImportService widgetTypeService.deleteWidgetType(tenantId, widgetTypeId)); + .forEach(widgetTypeId -> widgetTypeService.deleteWidgetType(ctx.getTenantId(), widgetTypeId)); } return savedWidgetsBundle; } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java b/application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java index 6737bca5e8..2cc4e16b1a 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java @@ -77,6 +77,7 @@ import org.thingsboard.server.service.sync.ie.exporting.ExportableEntitiesServic import org.thingsboard.server.service.sync.ie.importing.impl.MissingEntityException; import org.thingsboard.server.service.sync.vc.autocommit.TbAutoCommitSettingsService; import org.thingsboard.server.service.sync.vc.data.CommitGitRequest; +import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; import org.thingsboard.server.service.sync.vc.repository.TbRepositorySettingsService; import javax.annotation.PostConstruct; @@ -244,13 +245,13 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont private VersionLoadResult loadSingleEntity(SecurityUser user, VersionLoadConfig config, EntityExportData entityData) { try { - EntityImportResult importResult = exportImportService.importEntity(user, entityData, - EntityImportSettings.builder() + var ctx = new EntitiesImportCtx(user, EntityImportSettings.builder() .updateRelations(config.isLoadRelations()) .saveAttributes(config.isLoadAttributes()) .saveCredentials(config.isLoadCredentials()) .findExistingByName(false) - .build(), true, true); + .build()); + EntityImportResult importResult = exportImportService.importEntity(ctx, entityData, true, true); return VersionLoadResult.success(EntityTypeLoadResult.builder() .entityType(importResult.getEntityType()) .created(importResult.getOldEntity() == null ? 1 : 0) @@ -269,6 +270,8 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont List saveReferencesCallbacks = new ArrayList<>(); List sendEventsCallbacks = new ArrayList<>(); + EntitiesImportCtx ctx = new EntitiesImportCtx(user); + List entityTypes = request.getEntityTypes().keySet().stream() .sorted(exportImportService.getEntityTypeComparatorForImport()).collect(Collectors.toList()); for (EntityType entityType : entityTypes) { @@ -285,21 +288,20 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } - EntityImportSettings importSettings = EntityImportSettings.builder() + ctx.setSettings(EntityImportSettings.builder() .updateRelations(config.isLoadRelations()) .saveAttributes(config.isLoadAttributes()) .findExistingByName(config.isFindExistingEntityByName()) - .build(); + .build()); for (EntityExportData entityData : entityDataList) { EntityImportResult importResult; try { - importResult = exportImportService.importEntity(user, entityData, - importSettings, false, false); + importResult = exportImportService.importEntity(ctx, entityData, false, false); } catch (Exception e) { throw new LoadEntityException(entityData, e); } if (importResult.getUpdatedAllExternalIds() != null && !importResult.getUpdatedAllExternalIds()) { - toReimport.put(entityData.getEntity().getExternalId(), importSettings); + toReimport.put(entityData.getEntity().getExternalId(), ctx.getSettings()); continue; } @@ -324,8 +326,8 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont try { EntityExportData entityData = gitServiceQueue.getEntity(user.getTenantId(), request.getVersionId(), externalId).get(); importSettings.setResetExternalIdsOfAnotherTenant(true); - EntityImportResult importResult = exportImportService.importEntity(user, entityData, - importSettings, false, false); + ctx.setSettings(importSettings); + EntityImportResult importResult = exportImportService.importEntity(ctx, entityData, false, false); EntityTypeLoadResult stats = results.get(externalId.getEntityType()); if (importResult.getOldEntity() == null) stats.setCreated(stats.getCreated() + 1); @@ -347,11 +349,6 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont return exportableEntitiesService.findEntitiesByTenantId(user.getTenantId(), entityType, pageLink); }, 100, entity -> { if (importedEntities.get(entityType) == null || !importedEntities.get(entityType).contains(entity.getId())) { - try { - exportableEntitiesService.checkPermission(user, entity, entityType, Operation.DELETE); - } catch (ThingsboardException e) { - throw new RuntimeException(e); - } exportableEntitiesService.removeById(user.getTenantId(), entity.getId()); sendEventsCallbacks.add(() -> { diff --git a/application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesImportCtx.java b/application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesImportCtx.java new file mode 100644 index 0000000000..4fbdb28257 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesImportCtx.java @@ -0,0 +1,75 @@ +/** + * 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.service.sync.vc.data; + +import lombok.Data; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.sync.ie.EntityImportSettings; +import org.thingsboard.server.service.security.model.SecurityUser; + +import java.util.HashMap; +import java.util.Map; + +@Data +public class EntitiesImportCtx { + + private final SecurityUser user; + private EntityImportSettings settings; + + private final Map externalToInternalIdMap = new HashMap<>(); + + public EntitiesImportCtx(SecurityUser user) { + this(user, null); + } + + public EntitiesImportCtx(SecurityUser user, EntityImportSettings settings) { + this.user = user; + this.settings = settings; + } + + public TenantId getTenantId() { + return user.getTenantId(); + } + + public boolean isFindExistingByName() { + return getSettings().isFindExistingByName(); + } + + public boolean isUpdateRelations() { + return getSettings().isUpdateRelations(); + } + + public boolean isSaveAttributes() { + return getSettings().isSaveAttributes(); + } + + public boolean isSaveCredentials() { + return getSettings().isSaveCredentials(); + } + + public boolean isResetExternalIdsOfAnotherTenant() { + return getSettings().isResetExternalIdsOfAnotherTenant(); + } + + public EntityId getInternalId(EntityId externalId) { + return externalToInternalIdMap.get(externalId); + } + + public void putInternalId(EntityId externalId, EntityId internalId) { + externalToInternalIdMap.put(externalId, internalId); + } +}