Browse Source

Fix dashboard import to update entity aliases

pull/6357/head
Viacheslav Klimov 4 years ago
parent
commit
cecf49a67d
  1. 7
      application/src/main/java/org/thingsboard/server/service/sync/DefaultEntitiesExportImportService.java
  2. 33
      application/src/main/java/org/thingsboard/server/service/sync/importing/impl/DashboardImportService.java
  3. 2
      application/src/main/java/org/thingsboard/server/service/sync/importing/impl/DeviceImportService.java
  4. 2
      dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java
  5. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java

7
application/src/main/java/org/thingsboard/server/service/sync/DefaultEntitiesExportImportService.java

@ -28,6 +28,7 @@ import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.ExportableEntityDao;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.security.model.SecurityUser;
import org.thingsboard.server.service.security.permission.AccessControlService;
@ -74,13 +75,17 @@ public class DefaultEntitiesExportImportService implements EntitiesExportImportS
}
// TODO [viacheslav]: validate export data
@Transactional(rollbackFor = Exception.class)
@Override
public <E extends ExportableEntity<I>, I extends EntityId> EntityImportResult<E> importEntity(SecurityUser user, EntityExportData<E> exportData, EntityImportSettings importSettings) throws ThingsboardException {
if (exportData.getEntity() == null || exportData.getEntity().getId() == null) {
throw new DataValidationException("Invalid entity data");
}
EntityType entityType = exportData.getEntityType();
EntityImportService<I, E, EntityExportData<E>> importService = getImportService(entityType);
// TODO [viacheslav]: might throw DataIntegrityViolationException with cause of ConstraintViolationException: need to give normal error
return importService.importEntity(user, exportData, importSettings);
}

33
application/src/main/java/org/thingsboard/server/service/sync/importing/impl/DashboardImportService.java

@ -15,15 +15,22 @@
*/
package org.thingsboard.server.service.sync.importing.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.ShortCustomerInfo;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EntityIdFactory;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.query.EntityFilter;
import org.thingsboard.server.dao.dashboard.DashboardService;
import org.thingsboard.server.dao.sql.query.DefaultEntityQueryRepository;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.sync.exporting.data.DashboardExportData;
@ -31,6 +38,8 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Service
@ -40,14 +49,36 @@ public class DashboardImportService extends BaseEntityImportService<DashboardId,
private final DashboardService dashboardService;
private static final Pattern UUID_PATTERN = Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}");
@Override
protected void setOwner(TenantId tenantId, Dashboard dashboard, NewIdProvider idProvider) {
dashboard.setTenantId(tenantId);
}
// TODO [viacheslav]: improve the code
@Override
protected Dashboard prepareAndSave(TenantId tenantId, Dashboard dashboard, DashboardExportData exportData, NewIdProvider idProvider) {
Optional.ofNullable(dashboard.getConfiguration())
.flatMap(configuration -> Optional.ofNullable(configuration.get("entityAliases")))
.filter(JsonNode::isObject)
.ifPresent(entityAliases -> entityAliases.forEach(entityAlias -> {
Optional.ofNullable(entityAlias.get("filter"))
.filter(JsonNode::isObject)
.ifPresent(filter -> {
EntityFilter entityFilter = JacksonUtil.treeToValue(filter, EntityFilter.class);
EntityType entityType = DefaultEntityQueryRepository.resolveEntityType(entityFilter);
String filterJson = filter.toString();
String newFilterJson = UUID_PATTERN.matcher(filterJson).replaceAll(matchResult -> {
String uuid = matchResult.group();
EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, uuid);
return idProvider.get(d -> entityId).toString();
});
((ObjectNode) entityAlias).set("filter", JacksonUtil.toJsonNode(newFilterJson));
});
}));
// TODO [viacheslav]: improve the code below
if (dashboard.getId() == null) {
Set<ShortCustomerInfo> assignedCustomers = idProvider.get(Dashboard::getAssignedCustomers, ShortCustomerInfo::getCustomerId, ShortCustomerInfo::setCustomerId);
dashboard.setAssignedCustomers(null);

2
application/src/main/java/org/thingsboard/server/service/sync/importing/impl/DeviceImportService.java

@ -47,7 +47,7 @@ public class DeviceImportService extends BaseEntityImportService<DeviceId, Devic
exportData.getCredentials().setId(null);
exportData.getCredentials().setDeviceId(null);
return deviceService.saveDeviceWithCredentials(device, exportData.getCredentials());
} else { // TODO [viacheslav]: add option not to export device credentials
} else {
return deviceService.saveDevice(device);
}
}

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

@ -25,7 +25,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.thingsboard.server.common.data.EntitySubtype;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.EntityView;
@ -111,7 +110,6 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ
.orElse(null);
}
@Transactional
@CacheEvict(cacheNames = ASSET_CACHE, key = "{#asset.tenantId, #asset.name}")
@Override
public Asset saveAsset(Asset asset) {

2
dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java

@ -821,7 +821,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
return "e.type = :entity_filter_type_query_type and lower(e.search_text) like lower(concat(:entity_filter_type_query_name, '%%'))";
}
private EntityType resolveEntityType(EntityFilter entityFilter) {
public static EntityType resolveEntityType(EntityFilter entityFilter) {
switch (entityFilter.getType()) {
case SINGLE_ENTITY:
return ((SingleEntityFilter) entityFilter).getSingleEntity().getEntityType();

Loading…
Cancel
Save