Browse Source

Get rid of boilerplate in import services

pull/6357/head
Viacheslav Klimov 5 years ago
parent
commit
01ad35d864
  1. 14
      application/src/main/java/org/thingsboard/server/controller/EntitiesExportImportController.java
  2. 14
      application/src/main/java/org/thingsboard/server/service/expimp/DefaultEntitiesExportImportService.java
  3. 6
      application/src/main/java/org/thingsboard/server/service/expimp/EntitiesExportImportService.java
  4. 4
      application/src/main/java/org/thingsboard/server/service/expimp/ExportableEntitiesService.java
  5. 4
      application/src/main/java/org/thingsboard/server/service/expimp/exp/EntityExportService.java
  6. 4
      application/src/main/java/org/thingsboard/server/service/expimp/imp/EntityImportResult.java
  7. 5
      application/src/main/java/org/thingsboard/server/service/expimp/imp/EntityImportService.java
  8. 40
      application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/AbstractEntityImportService.java
  9. 22
      application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/AssetImportService.java
  10. 22
      application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/CustomerImportService.java
  11. 20
      application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/DashboardImportService.java
  12. 38
      application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/DeviceImportService.java
  13. 22
      application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/DeviceProfileImportService.java
  14. 27
      application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/RuleChainImportService.java
  15. 3
      common/data/src/main/java/org/thingsboard/server/common/data/Customer.java
  16. 3
      common/data/src/main/java/org/thingsboard/server/common/data/Dashboard.java
  17. 3
      common/data/src/main/java/org/thingsboard/server/common/data/Device.java
  18. 3
      common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java
  19. 3
      common/data/src/main/java/org/thingsboard/server/common/data/asset/Asset.java
  20. 3
      common/data/src/main/java/org/thingsboard/server/common/data/export/EntitiesExportResponse.java
  21. 3
      common/data/src/main/java/org/thingsboard/server/common/data/export/EntityExportData.java
  22. 39
      common/data/src/main/java/org/thingsboard/server/common/data/export/ExportableEntity.java
  23. 3
      common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleChain.java

14
application/src/main/java/org/thingsboard/server/controller/EntitiesExportImportController.java

@ -24,13 +24,11 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.HasName;
import org.thingsboard.server.common.data.HasTenantId;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.export.EntityExportData;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EntityIdFactory;
import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.expimp.EntitiesExportImportService;
import org.thingsboard.server.service.expimp.imp.EntityImportResult;
@ -88,7 +86,7 @@ public class EntitiesExportImportController extends BaseController {
@PostMapping("/import")
@PreAuthorize("hasAuthority('TENANT_ADMIN')")
public <E extends HasId<I> & HasName & HasTenantId, I extends EntityId, D extends EntityExportData<E>> EntityImportResult<E> importEntity(@RequestBody D exportData) throws ThingsboardException {
public EntityImportResult<ExportableEntity<EntityId>> importEntity(@RequestBody EntityExportData<ExportableEntity<EntityId>> exportData) throws ThingsboardException {
try {
return importEntity(getCurrentUser(), exportData);
} catch (Exception e) {
@ -97,20 +95,20 @@ public class EntitiesExportImportController extends BaseController {
}
private <E extends HasId<I>, I extends EntityId> EntityExportData<HasId<EntityId>> exportEntity(SecurityUser user, I entityId) throws ThingsboardException {
private EntityExportData<ExportableEntity<EntityId>> exportEntity(SecurityUser user, EntityId entityId) throws ThingsboardException {
checkEntityId(entityId, Operation.READ);
return exportImportService.exportEntity(getTenantId(), entityId);
}
private <E extends HasId<I> & HasName & HasTenantId, I extends EntityId, D extends EntityExportData<E>> EntityImportResult<E> importEntity(SecurityUser user, D exportData) throws ThingsboardException {
E existingEntity = exportImportService.findEntityByExternalId(user.getTenantId(), exportData.getMainEntity().getId());
private EntityImportResult<ExportableEntity<EntityId>> importEntity(SecurityUser user, EntityExportData<ExportableEntity<EntityId>> exportData) throws ThingsboardException {
ExportableEntity<?> existingEntity = exportImportService.findEntityByExternalId(user.getTenantId(), exportData.getMainEntity().getId());
if (existingEntity != null) {
checkEntityId(existingEntity.getId(), Operation.WRITE); // todo maybe need to extract permission check to BaseController and put there permission checks from other controllers
} else {
checkEntity(null, exportData.getMainEntity(), Resource.of(exportData.getEntityType()));
}
EntityImportResult<E> importResult = exportImportService.importEntity(getTenantId(), exportData);
EntityImportResult<ExportableEntity<EntityId>> importResult = exportImportService.importEntity(getTenantId(), exportData);
onEntityUpdatedOrCreated(user, importResult.getSavedEntity(), importResult.getOldEntity(), importResult.getOldEntity() == null);
return importResult;

14
application/src/main/java/org/thingsboard/server/service/expimp/DefaultEntitiesExportImportService.java

@ -19,8 +19,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.export.EntityExportData;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.ExportableEntityDao;
import org.thingsboard.server.queue.util.TbCoreComponent;
@ -47,7 +47,7 @@ public class DefaultEntitiesExportImportService implements EntitiesExportImportS
// TODO: export and import of the whole customer ?
// TODO: relations export and import
@Override
public <E extends HasId<I>, I extends EntityId> EntityExportData<E> exportEntity(TenantId tenantId, I entityId) {
public <E extends ExportableEntity<I>, I extends EntityId> EntityExportData<E> exportEntity(TenantId tenantId, I entityId) {
EntityType entityType = entityId.getEntityType();
EntityExportService<I, E> exportService = getExportService(entityType);
@ -56,16 +56,16 @@ public class DefaultEntitiesExportImportService implements EntitiesExportImportS
// FIXME: somehow validate export data
@Override
public <E extends HasId<I>, I extends EntityId, D extends EntityExportData<E>> EntityImportResult<E> importEntity(TenantId tenantId, D exportData) {
public <E extends ExportableEntity<I>, I extends EntityId> EntityImportResult<E> importEntity(TenantId tenantId, EntityExportData<E> exportData) {
EntityType entityType = exportData.getEntityType();
EntityImportService<I, E, D> importService = getImportService(entityType);
EntityImportService<I, E, EntityExportData<E>> importService = getImportService(entityType);
return importService.importEntity(tenantId, exportData);
}
@Override
public <E extends HasId<I>, I extends EntityId> E findEntityByExternalId(TenantId tenantId, I externalId) {
public <E extends ExportableEntity<I>, I extends EntityId> E findEntityByExternalId(TenantId tenantId, I externalId) {
ExportableEntityDao<E> dao = getDao(externalId.getEntityType());
return Optional.ofNullable(dao.findByTenantIdAndExternalId(tenantId.getId(), externalId.getId()))
.orElseGet(() -> dao.findByTenantIdAndId(tenantId.getId(), externalId.getId()));
@ -73,12 +73,12 @@ public class DefaultEntitiesExportImportService implements EntitiesExportImportS
@SuppressWarnings("unchecked")
private <I extends EntityId, E extends HasId<I>> EntityExportService<I, E> getExportService(EntityType entityType) {
private <I extends EntityId, E extends ExportableEntity<I>> EntityExportService<I, E> getExportService(EntityType entityType) {
return (EntityExportService<I, E>) exportServices.get(entityType);
}
@SuppressWarnings("unchecked")
private <I extends EntityId, E extends HasId<I>, D extends EntityExportData<E>> EntityImportService<I, E, D> getImportService(EntityType entityType) {
private <I extends EntityId, E extends ExportableEntity<I>, D extends EntityExportData<E>> EntityImportService<I, E, D> getImportService(EntityType entityType) {
return (EntityImportService<I, E, D>) importServices.get(entityType);
}

6
application/src/main/java/org/thingsboard/server/service/expimp/EntitiesExportImportService.java

@ -16,15 +16,15 @@
package org.thingsboard.server.service.expimp;
import org.thingsboard.server.common.data.export.EntityExportData;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.service.expimp.imp.EntityImportResult;
public interface EntitiesExportImportService extends ExportableEntitiesService {
<E extends HasId<I>, I extends EntityId> EntityExportData<E> exportEntity(TenantId tenantId, I entityId);
<E extends ExportableEntity<I>, I extends EntityId> EntityExportData<E> exportEntity(TenantId tenantId, I entityId);
<E extends HasId<I>, I extends EntityId, D extends EntityExportData<E>> EntityImportResult<E> importEntity(TenantId tenantId, D exportData);
<E extends ExportableEntity<I>, I extends EntityId> EntityImportResult<E> importEntity(TenantId tenantId, EntityExportData<E> exportData);
}

4
application/src/main/java/org/thingsboard/server/service/expimp/ExportableEntitiesService.java

@ -15,12 +15,12 @@
*/
package org.thingsboard.server.service.expimp;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
public interface ExportableEntitiesService {
<E extends HasId<I>, I extends EntityId> E findEntityByExternalId(TenantId tenantId, I externalId);
<E extends ExportableEntity<I>, I extends EntityId> E findEntityByExternalId(TenantId tenantId, I externalId);
}

4
application/src/main/java/org/thingsboard/server/service/expimp/exp/EntityExportService.java

@ -17,11 +17,11 @@ package org.thingsboard.server.service.expimp.exp;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.export.EntityExportData;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
public interface EntityExportService<I extends EntityId, E extends HasId<I>> {
public interface EntityExportService<I extends EntityId, E extends ExportableEntity<I>> {
// FIXME: export relations
// FIXME: get rid of boilerplate

4
application/src/main/java/org/thingsboard/server/service/expimp/imp/EntityImportResult.java

@ -16,11 +16,11 @@
package org.thingsboard.server.service.expimp.imp;
import lombok.Data;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
@Data
public class EntityImportResult<E extends HasId<? extends EntityId>> {
public class EntityImportResult<E extends ExportableEntity<? extends EntityId>> {
private E savedEntity;
private E oldEntity;
}

5
application/src/main/java/org/thingsboard/server/service/expimp/imp/EntityImportService.java

@ -17,13 +17,12 @@ package org.thingsboard.server.service.expimp.imp;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.export.EntityExportData;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
public interface EntityImportService<I extends EntityId, E extends HasId<I>, D extends EntityExportData<E>> {
public interface EntityImportService<I extends EntityId, E extends ExportableEntity<I>, D extends EntityExportData<E>> {
// FIXME: get rid of boilerplate for import result creation and everything else
EntityImportResult<E> importEntity(TenantId tenantId, D exportData);
EntityType getEntityType();

40
application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/AbstractEntityImportService.java

@ -18,22 +18,58 @@ package org.thingsboard.server.service.expimp.imp.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.thingsboard.server.common.data.export.EntityExportData;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.service.expimp.ExportableEntitiesService;
import org.thingsboard.server.service.expimp.imp.EntityImportResult;
import org.thingsboard.server.service.expimp.imp.EntityImportService;
public abstract class AbstractEntityImportService<I extends EntityId, E extends HasId<I>, D extends EntityExportData<E>> implements EntityImportService<I, E, D> {
public abstract class AbstractEntityImportService<I extends EntityId, E extends ExportableEntity<I>, D extends EntityExportData<E>> implements EntityImportService<I, E, D> {
@Autowired @Lazy
private ExportableEntitiesService exportableEntitiesService;
// FIXME what if exporting and importing back already exported entity ? (save version and then load it back)
/*
* export entity -> id from env1 -> import this entity -> ...
*
* maybe find not only by external id but by internal too ? but then what if we will try
* */
@Override
public final EntityImportResult<E> importEntity(TenantId tenantId, D exportData) {
E entity = exportData.getMainEntity();
E existingEntity = findByExternalId(tenantId, entity.getId());
protected final E findByExternalId(TenantId tenantId, I externalId) {
entity.setExternalId(entity.getId());
entity.setTenantId(tenantId);
if (existingEntity == null) {
entity.setId(null);
} else {
entity.setId(existingEntity.getId());
}
E savedEntity = prepareAndSaveEntity(tenantId, entity, existingEntity, exportData);
EntityImportResult<E> importResult = new EntityImportResult<>();
importResult.setSavedEntity(savedEntity);
importResult.setOldEntity(existingEntity);
return importResult;
}
protected abstract E prepareAndSaveEntity(TenantId tenantId, E entity, E existingEntity, D exportData);
private E findByExternalId(TenantId tenantId, I externalId) {
return exportableEntitiesService.findEntityByExternalId(tenantId, externalId);
}
// TODO or maybe set as additional config whether to update related entities when device already exists ?
// TODO: or also whether to ignore not found internal ids
// FIXME: review use cases for version controlling: in the same tenant, between tenants, between environments and different tenants
protected final <ID extends EntityId> ID getInternalId(TenantId tenantId, ID externalId) {
if (externalId == null) {
return null;

22
application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/AssetImportService.java

@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.asset.AssetService;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.expimp.imp.EntityImportResult;
@Service
@TbCoreComponent
@ -35,27 +34,10 @@ public class AssetImportService extends AbstractEntityImportService<AssetId, Ass
@Override
public EntityImportResult<Asset> importEntity(TenantId tenantId, AssetExportData exportData) {
Asset asset = exportData.getAsset();
Asset existingAsset = findByExternalId(tenantId, asset.getId()); // TODO: extract boiler plate to abstract class ...
asset.setExternalId(asset.getId());
asset.setTenantId(tenantId);
if (existingAsset == null) {
asset.setId(null);
} else {
asset.setId(existingAsset.getId());
}
protected Asset prepareAndSaveEntity(TenantId tenantId, Asset asset, Asset existingAsset, AssetExportData exportData) {
asset.setCustomerId(getInternalId(tenantId, asset.getCustomerId()));
Asset savedAsset = assetService.saveAsset(asset);
EntityImportResult<Asset> importResult = new EntityImportResult<>();
importResult.setSavedEntity(savedAsset);
importResult.setOldEntity(existingAsset);
return importResult;
return assetService.saveAsset(asset);
}
@Override

22
application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/CustomerImportService.java

@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.expimp.imp.EntityImportResult;
@Service
@TbCoreComponent
@ -35,25 +34,8 @@ public class CustomerImportService extends AbstractEntityImportService<CustomerI
@Override
public EntityImportResult<Customer> importEntity(TenantId tenantId, CustomerExportData exportData) {
Customer customer = exportData.getCustomer();
Customer existingCustomer = findByExternalId(tenantId, customer.getId());
customer.setExternalId(customer.getId());
customer.setTenantId(tenantId);
if (existingCustomer == null) {
customer.setId(null);
} else {
customer.setId(existingCustomer.getId());
}
Customer savedCustomer = customerService.saveCustomer(customer);
EntityImportResult<Customer> importResult = new EntityImportResult<>();
importResult.setSavedEntity(savedCustomer);
importResult.setOldEntity(existingCustomer);
return importResult;
protected Customer prepareAndSaveEntity(TenantId tenantId, Customer customer, Customer existingCustomer, CustomerExportData exportData) {
return customerService.saveCustomer(customer);
}
@Override

20
application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/DashboardImportService.java

@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.dashboard.DashboardService;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.expimp.imp.EntityImportResult;
@Service
@TbCoreComponent
@ -35,27 +34,14 @@ public class DashboardImportService extends AbstractEntityImportService<Dashboar
@Override
public EntityImportResult<Dashboard> importEntity(TenantId tenantId, DashboardExportData exportData) {
Dashboard dashboard = exportData.getDashboard();
Dashboard existingDashboard = findByExternalId(tenantId, dashboard.getId());
dashboard.setExternalId(dashboard.getId());
dashboard.setTenantId(tenantId);
protected Dashboard prepareAndSaveEntity(TenantId tenantId, Dashboard dashboard, Dashboard existingDashboard, DashboardExportData exportData) {
if (existingDashboard == null) {
dashboard.setId(null);
dashboard.setAssignedCustomers(null); // FIXME: need to assign dashboard to customers ?
} else {
dashboard.setId(existingDashboard.getId());
dashboard.setAssignedCustomers(existingDashboard.getAssignedCustomers()); // we left them untouched (FIXME)
dashboard.setAssignedCustomers(existingDashboard.getAssignedCustomers());
}
Dashboard savedDashboard = dashboardService.saveDashboard(dashboard);
EntityImportResult<Dashboard> importResult = new EntityImportResult<>();
importResult.setSavedEntity(savedDashboard);
importResult.setOldEntity(existingDashboard);
return importResult;
return dashboardService.saveDashboard(dashboard);
}
@Override

38
application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/DeviceImportService.java

@ -17,7 +17,6 @@ package org.thingsboard.server.service.expimp.imp.impl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.export.impl.DeviceExportData;
@ -25,7 +24,6 @@ import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.expimp.imp.EntityImportResult;
@Service
@TbCoreComponent
@ -35,44 +33,14 @@ public class DeviceImportService extends AbstractEntityImportService<DeviceId, D
private final DeviceService deviceService;
@Transactional
@Override
public EntityImportResult<Device> importEntity(TenantId tenantId, DeviceExportData exportData) {
Device device = exportData.getDevice();
Device existingDevice = findByExternalId(tenantId, device.getId()); // FIXME: !!!
// what if exporting and importing back already exported entity ? (save version and then load it back)
/*
* export entity -> id from env1 -> import this entity -> ...
*
* maybe find not only by external id but by internal too ? but then what if we will try
* */
device.setExternalId(device.getId());
device.setTenantId(tenantId);
if (existingDevice == null) {
device.setId(null);
device.setCustomerId(null); // FIXME: find and set customer
} else {
device.setId(existingDevice.getId());
device.setCustomerId(existingDevice.getCustomerId());
}
// TODO or maybe set as additional config whether to update related entities when device already exists ?
// TODO: or also whether to ignore not found internal ids
// FIXME: review use cases for version controlling: in the same tenant, between tenants, between environments and different tenants
protected Device prepareAndSaveEntity(TenantId tenantId, Device device, Device existingDevice, DeviceExportData exportData) {
device.setCustomerId(getInternalId(tenantId, device.getCustomerId()));
device.setDeviceProfileId(getInternalId(tenantId, device.getDeviceProfileId()));
device.setFirmwareId(getInternalId(tenantId, device.getFirmwareId()));
device.setSoftwareId(getInternalId(tenantId, device.getSoftwareId()));
Device savedDevice = deviceService.saveDeviceWithCredentials(device, exportData.getCredentials());
EntityImportResult<Device> importResult = new EntityImportResult<>();
importResult.setSavedEntity(savedDevice);
importResult.setOldEntity(existingDevice);
return importResult;
return deviceService.saveDeviceWithCredentials(device, exportData.getCredentials());
}
@Override

22
application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/DeviceProfileImportService.java

@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.device.DeviceProfileService;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.expimp.imp.EntityImportResult;
@Service
@TbCoreComponent
@ -35,30 +34,13 @@ public class DeviceProfileImportService extends AbstractEntityImportService<Devi
@Override
public EntityImportResult<DeviceProfile> importEntity(TenantId tenantId, DeviceProfileExportData exportData) {
DeviceProfile deviceProfile = exportData.getDeviceProfile();
DeviceProfile existingDeviceProfile = findByExternalId(tenantId, deviceProfile.getId());
deviceProfile.setExternalId(deviceProfile.getId());
deviceProfile.setTenantId(tenantId);
if (existingDeviceProfile == null) {
deviceProfile.setId(null);
} else {
deviceProfile.setId(existingDeviceProfile.getId());
}
protected DeviceProfile prepareAndSaveEntity(TenantId tenantId, DeviceProfile deviceProfile, DeviceProfile existingDeviceProfile, DeviceProfileExportData exportData) {
deviceProfile.setDefaultRuleChainId(getInternalId(tenantId, deviceProfile.getDefaultRuleChainId()));
deviceProfile.setDefaultDashboardId(getInternalId(tenantId, deviceProfile.getDefaultDashboardId()));
deviceProfile.setFirmwareId(getInternalId(tenantId, deviceProfile.getFirmwareId()));
deviceProfile.setSoftwareId(getInternalId(tenantId, deviceProfile.getSoftwareId()));
DeviceProfile savedDeviceProfile = deviceProfileService.saveDeviceProfile(deviceProfile);
EntityImportResult<DeviceProfile> importResult = new EntityImportResult<>();
importResult.setSavedEntity(savedDeviceProfile);
importResult.setOldEntity(existingDeviceProfile);
return importResult;
return deviceProfileService.saveDeviceProfile(deviceProfile);
}
@Override

27
application/src/main/java/org/thingsboard/server/service/expimp/imp/impl/RuleChainImportService.java

@ -26,7 +26,6 @@ import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.dao.rule.RuleChainService;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.expimp.imp.EntityImportResult;
@Service
@TbCoreComponent
@ -38,27 +37,16 @@ public class RuleChainImportService extends AbstractEntityImportService<RuleChai
@Transactional
@Override
public EntityImportResult<RuleChain> importEntity(TenantId tenantId, RuleChainExportData exportData) {
RuleChain ruleChain = exportData.getRuleChain();
RuleChain existingRuleChain = findByExternalId(tenantId, ruleChain.getId());
ruleChain.setExternalId(ruleChain.getId());
ruleChain.setTenantId(tenantId);
protected RuleChain prepareAndSaveEntity(TenantId tenantId, RuleChain ruleChain, RuleChain existingRuleChain, RuleChainExportData exportData) {
ruleChain.setFirstRuleNodeId(null); // will be set during metadata persisting
if (existingRuleChain == null) {
ruleChain.setId(null);
} else {
ruleChain.setId(existingRuleChain.getId());
if (existingRuleChain != null) {
ruleChainService.deleteRuleNodes(tenantId, existingRuleChain.getId());
}
RuleChain savedRuleChain = ruleChainService.saveRuleChain(ruleChain);
ruleChain = ruleChainService.saveRuleChain(ruleChain);
if (ruleChain.getId() != null) {
ruleChainService.deleteRuleNodes(tenantId, ruleChain.getId());
}
RuleChainMetaData metaData = exportData.getMetaData();
metaData.setRuleChainId(savedRuleChain.getId());
metaData.setRuleChainId(ruleChain.getId());
metaData.getNodes().forEach(ruleNode -> {
ruleNode.setId(null);
ruleNode.setRuleChainId(null);
@ -70,10 +58,7 @@ public class RuleChainImportService extends AbstractEntityImportService<RuleChai
});
ruleChainService.saveRuleChainMetaData(tenantId, metaData);
EntityImportResult<RuleChain> importResult = new EntityImportResult<>();
importResult.setSavedEntity(savedRuleChain);
importResult.setOldEntity(existingRuleChain);
return importResult;
return ruleChain;
}
@Override

3
common/data/src/main/java/org/thingsboard/server/common/data/Customer.java

@ -22,12 +22,13 @@ import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.validation.Length;
import org.thingsboard.server.common.data.validation.NoXss;
public class Customer extends ContactBased<CustomerId> implements HasTenantId {
public class Customer extends ContactBased<CustomerId> implements HasTenantId, ExportableEntity<CustomerId> {
private static final long serialVersionUID = -1599722990298929275L;

3
common/data/src/main/java/org/thingsboard/server/common/data/Dashboard.java

@ -19,9 +19,10 @@ import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.DashboardId;
public class Dashboard extends DashboardInfo {
public class Dashboard extends DashboardInfo implements ExportableEntity<DashboardId> {
private static final long serialVersionUID = 872682138346187503L;

3
common/data/src/main/java/org/thingsboard/server/common/data/Device.java

@ -25,6 +25,7 @@ import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.device.data.DeviceData;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.DeviceProfileId;
@ -40,7 +41,7 @@ import java.util.Optional;
@ApiModel
@EqualsAndHashCode(callSuper = true)
@Slf4j
public class Device extends SearchTextBasedWithAdditionalInfo<DeviceId> implements HasName, HasTenantId, HasCustomerId, HasOtaPackage {
public class Device extends SearchTextBasedWithAdditionalInfo<DeviceId> implements HasName, HasTenantId, HasCustomerId, HasOtaPackage, ExportableEntity<DeviceId> {
private static final long serialVersionUID = 2807343040519543363L;

3
common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java

@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.id.OtaPackageId;
@ -43,7 +44,7 @@ import static org.thingsboard.server.common.data.SearchTextBasedWithAdditionalIn
@ToString(exclude = {"image", "profileDataBytes"})
@EqualsAndHashCode(callSuper = true)
@Slf4j
public class DeviceProfile extends SearchTextBased<DeviceProfileId> implements HasName, HasTenantId, HasOtaPackage {
public class DeviceProfile extends SearchTextBased<DeviceProfileId> implements HasName, HasTenantId, HasOtaPackage, ExportableEntity<DeviceProfileId> {
private static final long serialVersionUID = 6998485460273302018L;

3
common/data/src/main/java/org/thingsboard/server/common/data/asset/Asset.java

@ -25,6 +25,7 @@ import org.thingsboard.server.common.data.HasCustomerId;
import org.thingsboard.server.common.data.HasName;
import org.thingsboard.server.common.data.HasTenantId;
import org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
@ -35,7 +36,7 @@ import java.util.Optional;
@ApiModel
@EqualsAndHashCode(callSuper = true)
public class Asset extends SearchTextBasedWithAdditionalInfo<AssetId> implements HasName, HasTenantId, HasCustomerId {
public class Asset extends SearchTextBasedWithAdditionalInfo<AssetId> implements HasName, HasTenantId, HasCustomerId, ExportableEntity<AssetId> {
private static final long serialVersionUID = 2807343040519543363L;

3
common/data/src/main/java/org/thingsboard/server/common/data/export/EntitiesExportResponse.java

@ -18,12 +18,11 @@ package org.thingsboard.server.common.data.export;
import lombok.Data;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
import java.util.List;
import java.util.Map;
@Data
public class EntitiesExportResponse {
private Map<EntityType, List<EntityExportData<HasId<EntityId>>>> exportData;
private Map<EntityType, List<EntityExportData<ExportableEntity<EntityId>>>> exportData;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/export/EntityExportData.java

@ -28,7 +28,6 @@ import org.thingsboard.server.common.data.export.impl.DeviceExportData;
import org.thingsboard.server.common.data.export.impl.DeviceProfileExportData;
import org.thingsboard.server.common.data.export.impl.RuleChainExportData;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(property = "entityType", use = JsonTypeInfo.Id.NAME)
@ -40,7 +39,7 @@ import org.thingsboard.server.common.data.id.HasId;
@Type(name = "DASHBOARD", value = DashboardExportData.class),
@Type(name = "CUSTOMER", value = CustomerExportData.class)
})
public interface EntityExportData<E extends HasId<? extends EntityId>> {
public interface EntityExportData<E extends ExportableEntity<? extends EntityId>> {
@JsonIgnore
E getMainEntity();

39
common/data/src/main/java/org/thingsboard/server/common/data/export/ExportableEntity.java

@ -0,0 +1,39 @@
/**
* 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.common.data.export;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.data.annotation.Transient;
import org.thingsboard.server.common.data.HasName;
import org.thingsboard.server.common.data.HasTenantId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
public interface ExportableEntity<I extends EntityId> extends HasId<I>, HasTenantId, HasName {
@Transient @JsonIgnore
I getId();
@Transient @JsonIgnore
void setId(I id);
I getExternalId();
void setExternalId(I externalId);
TenantId getTenantId();
void setTenantId(TenantId tenantId);
}

3
common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleChain.java

@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.HasName;
import org.thingsboard.server.common.data.HasTenantId;
import org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo;
import org.thingsboard.server.common.data.export.ExportableEntity;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.id.TenantId;
@ -35,7 +36,7 @@ import org.thingsboard.server.common.data.validation.NoXss;
@Data
@EqualsAndHashCode(callSuper = true)
@Slf4j
public class RuleChain extends SearchTextBasedWithAdditionalInfo<RuleChainId> implements HasName, HasTenantId {
public class RuleChain extends SearchTextBasedWithAdditionalInfo<RuleChainId> implements HasName, HasTenantId, ExportableEntity<RuleChainId> {
private static final long serialVersionUID = -5656679015121935465L;

Loading…
Cancel
Save