Merge branch 'fix/bulk-import' of https://github.com/ViacheslavKlimov/thingsboard
This commit is contained in:
commit
9aecb1463a
@ -17,78 +17,69 @@ package org.thingsboard.server.service.asset;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import com.fasterxml.jackson.databind.node.TextNode;
|
import com.fasterxml.jackson.databind.node.TextNode;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.cluster.TbClusterService;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
import org.thingsboard.server.common.data.asset.Asset;
|
||||||
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.dao.asset.AssetService;
|
import org.thingsboard.server.dao.asset.AssetService;
|
||||||
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
|
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
import org.thingsboard.server.service.action.EntityActionService;
|
|
||||||
import org.thingsboard.server.service.importing.AbstractBulkImportService;
|
import org.thingsboard.server.service.importing.AbstractBulkImportService;
|
||||||
import org.thingsboard.server.service.importing.BulkImportColumnType;
|
import org.thingsboard.server.service.importing.BulkImportColumnType;
|
||||||
import org.thingsboard.server.service.importing.BulkImportRequest;
|
|
||||||
import org.thingsboard.server.service.importing.ImportedEntityInfo;
|
|
||||||
import org.thingsboard.server.service.security.AccessValidator;
|
|
||||||
import org.thingsboard.server.service.security.model.SecurityUser;
|
import org.thingsboard.server.service.security.model.SecurityUser;
|
||||||
import org.thingsboard.server.service.security.permission.AccessControlService;
|
|
||||||
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
|
@RequiredArgsConstructor
|
||||||
public class AssetBulkImportService extends AbstractBulkImportService<Asset> {
|
public class AssetBulkImportService extends AbstractBulkImportService<Asset> {
|
||||||
private final AssetService assetService;
|
private final AssetService assetService;
|
||||||
|
|
||||||
public AssetBulkImportService(TelemetrySubscriptionService tsSubscriptionService, TbTenantProfileCache tenantProfileCache,
|
|
||||||
AccessControlService accessControlService, AccessValidator accessValidator,
|
|
||||||
EntityActionService entityActionService, TbClusterService clusterService, AssetService assetService) {
|
|
||||||
super(tsSubscriptionService, tenantProfileCache, accessControlService, accessValidator, entityActionService, clusterService);
|
|
||||||
this.assetService = assetService;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ImportedEntityInfo<Asset> saveEntity(BulkImportRequest importRequest, Map<BulkImportColumnType, String> fields, SecurityUser user) {
|
protected void setEntityFields(Asset entity, Map<BulkImportColumnType, String> fields) {
|
||||||
ImportedEntityInfo<Asset> importedEntityInfo = new ImportedEntityInfo<>();
|
ObjectNode additionalInfo = (ObjectNode) Optional.ofNullable(entity.getAdditionalInfo()).orElseGet(JacksonUtil::newObjectNode);
|
||||||
|
|
||||||
Asset asset = new Asset();
|
|
||||||
asset.setTenantId(user.getTenantId());
|
|
||||||
setAssetFields(asset, fields);
|
|
||||||
|
|
||||||
Asset existingAsset = assetService.findAssetByTenantIdAndName(user.getTenantId(), asset.getName());
|
|
||||||
if (existingAsset != null && importRequest.getMapping().getUpdate()) {
|
|
||||||
importedEntityInfo.setOldEntity(new Asset(existingAsset));
|
|
||||||
importedEntityInfo.setUpdated(true);
|
|
||||||
existingAsset.update(asset);
|
|
||||||
asset = existingAsset;
|
|
||||||
}
|
|
||||||
asset = assetService.saveAsset(asset);
|
|
||||||
|
|
||||||
importedEntityInfo.setEntity(asset);
|
|
||||||
return importedEntityInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setAssetFields(Asset asset, Map<BulkImportColumnType, String> fields) {
|
|
||||||
ObjectNode additionalInfo = (ObjectNode) Optional.ofNullable(asset.getAdditionalInfo()).orElseGet(JacksonUtil::newObjectNode);
|
|
||||||
fields.forEach((columnType, value) -> {
|
fields.forEach((columnType, value) -> {
|
||||||
switch (columnType) {
|
switch (columnType) {
|
||||||
case NAME:
|
case NAME:
|
||||||
asset.setName(value);
|
entity.setName(value);
|
||||||
break;
|
break;
|
||||||
case TYPE:
|
case TYPE:
|
||||||
asset.setType(value);
|
entity.setType(value);
|
||||||
break;
|
break;
|
||||||
case LABEL:
|
case LABEL:
|
||||||
asset.setLabel(value);
|
entity.setLabel(value);
|
||||||
break;
|
break;
|
||||||
case DESCRIPTION:
|
case DESCRIPTION:
|
||||||
additionalInfo.set("description", new TextNode(value));
|
additionalInfo.set("description", new TextNode(value));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
asset.setAdditionalInfo(additionalInfo);
|
entity.setAdditionalInfo(additionalInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Asset saveEntity(Asset entity, Map<BulkImportColumnType, String> fields) {
|
||||||
|
return assetService.saveAsset(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Asset findOrCreateEntity(TenantId tenantId, String name) {
|
||||||
|
return Optional.ofNullable(assetService.findAssetByTenantIdAndName(tenantId, name))
|
||||||
|
.orElseGet(Asset::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setOwners(Asset entity, SecurityUser user) {
|
||||||
|
entity.setTenantId(user.getTenantId());
|
||||||
|
entity.setCustomerId(user.getCustomerId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected EntityType getEntityType() {
|
||||||
|
return EntityType.ASSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,18 +18,19 @@ package org.thingsboard.server.service.device;
|
|||||||
import com.fasterxml.jackson.databind.node.BooleanNode;
|
import com.fasterxml.jackson.databind.node.BooleanNode;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import com.fasterxml.jackson.databind.node.TextNode;
|
import com.fasterxml.jackson.databind.node.TextNode;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang3.RandomStringUtils;
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.cluster.TbClusterService;
|
|
||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.DeviceProfileProvisionType;
|
import org.thingsboard.server.common.data.DeviceProfileProvisionType;
|
||||||
import org.thingsboard.server.common.data.DeviceProfileType;
|
import org.thingsboard.server.common.data.DeviceProfileType;
|
||||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||||
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
|
import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
|
||||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MClientCredentials;
|
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MClientCredentials;
|
||||||
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode;
|
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode;
|
||||||
@ -45,17 +46,10 @@ import org.thingsboard.server.dao.device.DeviceCredentialsService;
|
|||||||
import org.thingsboard.server.dao.device.DeviceProfileService;
|
import org.thingsboard.server.dao.device.DeviceProfileService;
|
||||||
import org.thingsboard.server.dao.device.DeviceService;
|
import org.thingsboard.server.dao.device.DeviceService;
|
||||||
import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException;
|
import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException;
|
||||||
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
|
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
import org.thingsboard.server.service.action.EntityActionService;
|
|
||||||
import org.thingsboard.server.service.importing.AbstractBulkImportService;
|
import org.thingsboard.server.service.importing.AbstractBulkImportService;
|
||||||
import org.thingsboard.server.service.importing.BulkImportColumnType;
|
import org.thingsboard.server.service.importing.BulkImportColumnType;
|
||||||
import org.thingsboard.server.service.importing.BulkImportRequest;
|
|
||||||
import org.thingsboard.server.service.importing.ImportedEntityInfo;
|
|
||||||
import org.thingsboard.server.service.security.AccessValidator;
|
|
||||||
import org.thingsboard.server.service.security.model.SecurityUser;
|
import org.thingsboard.server.service.security.model.SecurityUser;
|
||||||
import org.thingsboard.server.service.security.permission.AccessControlService;
|
|
||||||
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
@ -68,6 +62,7 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||||||
|
|
||||||
@Service
|
@Service
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
|
@RequiredArgsConstructor
|
||||||
public class DeviceBulkImportService extends AbstractBulkImportService<Device> {
|
public class DeviceBulkImportService extends AbstractBulkImportService<Device> {
|
||||||
protected final DeviceService deviceService;
|
protected final DeviceService deviceService;
|
||||||
protected final DeviceCredentialsService deviceCredentialsService;
|
protected final DeviceCredentialsService deviceCredentialsService;
|
||||||
@ -75,33 +70,33 @@ public class DeviceBulkImportService extends AbstractBulkImportService<Device> {
|
|||||||
|
|
||||||
private final Lock findOrCreateDeviceProfileLock = new ReentrantLock();
|
private final Lock findOrCreateDeviceProfileLock = new ReentrantLock();
|
||||||
|
|
||||||
public DeviceBulkImportService(TelemetrySubscriptionService tsSubscriptionService, TbTenantProfileCache tenantProfileCache,
|
@Override
|
||||||
AccessControlService accessControlService, AccessValidator accessValidator,
|
protected void setEntityFields(Device entity, Map<BulkImportColumnType, String> fields) {
|
||||||
EntityActionService entityActionService, TbClusterService clusterService,
|
ObjectNode additionalInfo = (ObjectNode) Optional.ofNullable(entity.getAdditionalInfo()).orElseGet(JacksonUtil::newObjectNode);
|
||||||
DeviceService deviceService, DeviceCredentialsService deviceCredentialsService,
|
fields.forEach((columnType, value) -> {
|
||||||
DeviceProfileService deviceProfileService) {
|
switch (columnType) {
|
||||||
super(tsSubscriptionService, tenantProfileCache, accessControlService, accessValidator, entityActionService, clusterService);
|
case NAME:
|
||||||
this.deviceService = deviceService;
|
entity.setName(value);
|
||||||
this.deviceCredentialsService = deviceCredentialsService;
|
break;
|
||||||
this.deviceProfileService = deviceProfileService;
|
case TYPE:
|
||||||
|
entity.setType(value);
|
||||||
|
break;
|
||||||
|
case LABEL:
|
||||||
|
entity.setLabel(value);
|
||||||
|
break;
|
||||||
|
case DESCRIPTION:
|
||||||
|
additionalInfo.set("description", new TextNode(value));
|
||||||
|
break;
|
||||||
|
case IS_GATEWAY:
|
||||||
|
additionalInfo.set("gateway", BooleanNode.valueOf(Boolean.parseBoolean(value)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
entity.setAdditionalInfo(additionalInfo);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ImportedEntityInfo<Device> saveEntity(BulkImportRequest importRequest, Map<BulkImportColumnType, String> fields, SecurityUser user) {
|
protected Device saveEntity(Device entity, Map<BulkImportColumnType, String> fields) {
|
||||||
ImportedEntityInfo<Device> importedEntityInfo = new ImportedEntityInfo<>();
|
|
||||||
|
|
||||||
Device device = new Device();
|
|
||||||
device.setTenantId(user.getTenantId());
|
|
||||||
setDeviceFields(device, fields);
|
|
||||||
|
|
||||||
Device existingDevice = deviceService.findDeviceByTenantIdAndName(user.getTenantId(), device.getName());
|
|
||||||
if (existingDevice != null && importRequest.getMapping().getUpdate()) {
|
|
||||||
importedEntityInfo.setOldEntity(new Device(existingDevice));
|
|
||||||
importedEntityInfo.setUpdated(true);
|
|
||||||
existingDevice.updateDevice(device);
|
|
||||||
device = existingDevice;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceCredentials deviceCredentials;
|
DeviceCredentials deviceCredentials;
|
||||||
try {
|
try {
|
||||||
deviceCredentials = createDeviceCredentials(fields);
|
deviceCredentials = createDeviceCredentials(fields);
|
||||||
@ -112,42 +107,27 @@ public class DeviceBulkImportService extends AbstractBulkImportService<Device> {
|
|||||||
|
|
||||||
DeviceProfile deviceProfile;
|
DeviceProfile deviceProfile;
|
||||||
if (deviceCredentials.getCredentialsType() == DeviceCredentialsType.LWM2M_CREDENTIALS) {
|
if (deviceCredentials.getCredentialsType() == DeviceCredentialsType.LWM2M_CREDENTIALS) {
|
||||||
deviceProfile = setUpLwM2mDeviceProfile(user.getTenantId(), device);
|
deviceProfile = setUpLwM2mDeviceProfile(entity.getTenantId(), entity);
|
||||||
} else if (StringUtils.isNotEmpty(device.getType())) {
|
} else if (StringUtils.isNotEmpty(entity.getType())) {
|
||||||
deviceProfile = deviceProfileService.findOrCreateDeviceProfile(user.getTenantId(), device.getType());
|
deviceProfile = deviceProfileService.findOrCreateDeviceProfile(entity.getTenantId(), entity.getType());
|
||||||
} else {
|
} else {
|
||||||
deviceProfile = deviceProfileService.findDefaultDeviceProfile(user.getTenantId());
|
deviceProfile = deviceProfileService.findDefaultDeviceProfile(entity.getTenantId());
|
||||||
}
|
}
|
||||||
device.setDeviceProfileId(deviceProfile.getId());
|
entity.setDeviceProfileId(deviceProfile.getId());
|
||||||
|
|
||||||
device = deviceService.saveDeviceWithCredentials(device, deviceCredentials);
|
return deviceService.saveDeviceWithCredentials(entity, deviceCredentials);
|
||||||
|
|
||||||
importedEntityInfo.setEntity(device);
|
|
||||||
return importedEntityInfo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setDeviceFields(Device device, Map<BulkImportColumnType, String> fields) {
|
@Override
|
||||||
ObjectNode additionalInfo = (ObjectNode) Optional.ofNullable(device.getAdditionalInfo()).orElseGet(JacksonUtil::newObjectNode);
|
protected Device findOrCreateEntity(TenantId tenantId, String name) {
|
||||||
fields.forEach((columnType, value) -> {
|
return Optional.ofNullable(deviceService.findDeviceByTenantIdAndName(tenantId, name))
|
||||||
switch (columnType) {
|
.orElseGet(Device::new);
|
||||||
case NAME:
|
}
|
||||||
device.setName(value);
|
|
||||||
break;
|
@Override
|
||||||
case TYPE:
|
protected void setOwners(Device entity, SecurityUser user) {
|
||||||
device.setType(value);
|
entity.setTenantId(user.getTenantId());
|
||||||
break;
|
entity.setCustomerId(user.getCustomerId());
|
||||||
case LABEL:
|
|
||||||
device.setLabel(value);
|
|
||||||
break;
|
|
||||||
case DESCRIPTION:
|
|
||||||
additionalInfo.set("description", new TextNode(value));
|
|
||||||
break;
|
|
||||||
case IS_GATEWAY:
|
|
||||||
additionalInfo.set("gateway", BooleanNode.valueOf(Boolean.parseBoolean(value)));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
device.setAdditionalInfo(additionalInfo);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@ -273,4 +253,9 @@ public class DeviceBulkImportService extends AbstractBulkImportService<Device> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected EntityType getEntityType() {
|
||||||
|
return EntityType.DEVICE;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,90 +17,81 @@ package org.thingsboard.server.service.edge;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import com.fasterxml.jackson.databind.node.TextNode;
|
import com.fasterxml.jackson.databind.node.TextNode;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.cluster.TbClusterService;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.dao.edge.EdgeService;
|
import org.thingsboard.server.dao.edge.EdgeService;
|
||||||
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
|
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
import org.thingsboard.server.service.action.EntityActionService;
|
|
||||||
import org.thingsboard.server.service.importing.AbstractBulkImportService;
|
import org.thingsboard.server.service.importing.AbstractBulkImportService;
|
||||||
import org.thingsboard.server.service.importing.BulkImportColumnType;
|
import org.thingsboard.server.service.importing.BulkImportColumnType;
|
||||||
import org.thingsboard.server.service.importing.BulkImportRequest;
|
|
||||||
import org.thingsboard.server.service.importing.ImportedEntityInfo;
|
|
||||||
import org.thingsboard.server.service.security.AccessValidator;
|
|
||||||
import org.thingsboard.server.service.security.model.SecurityUser;
|
import org.thingsboard.server.service.security.model.SecurityUser;
|
||||||
import org.thingsboard.server.service.security.permission.AccessControlService;
|
|
||||||
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
|
@RequiredArgsConstructor
|
||||||
public class EdgeBulkImportService extends AbstractBulkImportService<Edge> {
|
public class EdgeBulkImportService extends AbstractBulkImportService<Edge> {
|
||||||
private final EdgeService edgeService;
|
private final EdgeService edgeService;
|
||||||
|
|
||||||
public EdgeBulkImportService(TelemetrySubscriptionService tsSubscriptionService, TbTenantProfileCache tenantProfileCache,
|
|
||||||
AccessControlService accessControlService, AccessValidator accessValidator,
|
|
||||||
EntityActionService entityActionService, TbClusterService clusterService, EdgeService edgeService) {
|
|
||||||
super(tsSubscriptionService, tenantProfileCache, accessControlService, accessValidator, entityActionService, clusterService);
|
|
||||||
this.edgeService = edgeService;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ImportedEntityInfo<Edge> saveEntity(BulkImportRequest importRequest, Map<BulkImportColumnType, String> fields, SecurityUser user) {
|
protected void setEntityFields(Edge entity, Map<BulkImportColumnType, String> fields) {
|
||||||
ImportedEntityInfo<Edge> importedEntityInfo = new ImportedEntityInfo<>();
|
ObjectNode additionalInfo = (ObjectNode) Optional.ofNullable(entity.getAdditionalInfo()).orElseGet(JacksonUtil::newObjectNode);
|
||||||
|
|
||||||
Edge edge = new Edge();
|
|
||||||
edge.setTenantId(user.getTenantId());
|
|
||||||
setEdgeFields(edge, fields);
|
|
||||||
|
|
||||||
Edge existingEdge = edgeService.findEdgeByTenantIdAndName(user.getTenantId(), edge.getName());
|
|
||||||
if (existingEdge != null && importRequest.getMapping().getUpdate()) {
|
|
||||||
importedEntityInfo.setOldEntity(new Edge(existingEdge));
|
|
||||||
importedEntityInfo.setUpdated(true);
|
|
||||||
existingEdge.update(edge);
|
|
||||||
edge = existingEdge;
|
|
||||||
}
|
|
||||||
edge = edgeService.saveEdge(edge, true);
|
|
||||||
|
|
||||||
importedEntityInfo.setEntity(edge);
|
|
||||||
return importedEntityInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setEdgeFields(Edge edge, Map<BulkImportColumnType, String> fields) {
|
|
||||||
ObjectNode additionalInfo = (ObjectNode) Optional.ofNullable(edge.getAdditionalInfo()).orElseGet(JacksonUtil::newObjectNode);
|
|
||||||
fields.forEach((columnType, value) -> {
|
fields.forEach((columnType, value) -> {
|
||||||
switch (columnType) {
|
switch (columnType) {
|
||||||
case NAME:
|
case NAME:
|
||||||
edge.setName(value);
|
entity.setName(value);
|
||||||
break;
|
break;
|
||||||
case TYPE:
|
case TYPE:
|
||||||
edge.setType(value);
|
entity.setType(value);
|
||||||
break;
|
break;
|
||||||
case LABEL:
|
case LABEL:
|
||||||
edge.setLabel(value);
|
entity.setLabel(value);
|
||||||
break;
|
break;
|
||||||
case DESCRIPTION:
|
case DESCRIPTION:
|
||||||
additionalInfo.set("description", new TextNode(value));
|
additionalInfo.set("description", new TextNode(value));
|
||||||
break;
|
break;
|
||||||
case EDGE_LICENSE_KEY:
|
case EDGE_LICENSE_KEY:
|
||||||
edge.setEdgeLicenseKey(value);
|
entity.setEdgeLicenseKey(value);
|
||||||
break;
|
break;
|
||||||
case CLOUD_ENDPOINT:
|
case CLOUD_ENDPOINT:
|
||||||
edge.setCloudEndpoint(value);
|
entity.setCloudEndpoint(value);
|
||||||
break;
|
break;
|
||||||
case ROUTING_KEY:
|
case ROUTING_KEY:
|
||||||
edge.setRoutingKey(value);
|
entity.setRoutingKey(value);
|
||||||
break;
|
break;
|
||||||
case SECRET:
|
case SECRET:
|
||||||
edge.setSecret(value);
|
entity.setSecret(value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
edge.setAdditionalInfo(additionalInfo);
|
entity.setAdditionalInfo(additionalInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Edge saveEntity(Edge entity, Map<BulkImportColumnType, String> fields) {
|
||||||
|
return edgeService.saveEdge(entity, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Edge findOrCreateEntity(TenantId tenantId, String name) {
|
||||||
|
return Optional.ofNullable(edgeService.findEdgeByTenantIdAndName(tenantId, name))
|
||||||
|
.orElseGet(Edge::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setOwners(Edge entity, SecurityUser user) {
|
||||||
|
entity.setTenantId(user.getTenantId());
|
||||||
|
entity.setCustomerId(user.getCustomerId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected EntityType getEntityType() {
|
||||||
|
return EntityType.EDGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,19 +19,21 @@ import com.google.common.util.concurrent.FutureCallback;
|
|||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonPrimitive;
|
import com.google.gson.JsonPrimitive;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.core.context.SecurityContext;
|
import org.springframework.security.core.context.SecurityContext;
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
import org.thingsboard.common.util.DonAsynchron;
|
import org.thingsboard.common.util.DonAsynchron;
|
||||||
import org.thingsboard.common.util.ThingsBoardThreadFactory;
|
import org.thingsboard.common.util.ThingsBoardThreadFactory;
|
||||||
import org.thingsboard.server.cluster.TbClusterService;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.BaseData;
|
import org.thingsboard.server.common.data.HasTenantId;
|
||||||
import org.thingsboard.server.common.data.TenantProfile;
|
import org.thingsboard.server.common.data.TenantProfile;
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
|
import org.thingsboard.server.common.data.id.HasId;
|
||||||
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.id.UUIDBased;
|
import org.thingsboard.server.common.data.id.UUIDBased;
|
||||||
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
|
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
|
||||||
import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
|
import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
|
||||||
@ -47,6 +49,7 @@ import org.thingsboard.server.service.security.AccessValidator;
|
|||||||
import org.thingsboard.server.service.security.model.SecurityUser;
|
import org.thingsboard.server.service.security.model.SecurityUser;
|
||||||
import org.thingsboard.server.service.security.permission.AccessControlService;
|
import org.thingsboard.server.service.security.permission.AccessControlService;
|
||||||
import org.thingsboard.server.service.security.permission.Operation;
|
import org.thingsboard.server.service.security.permission.Operation;
|
||||||
|
import org.thingsboard.server.service.security.permission.Resource;
|
||||||
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService;
|
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService;
|
||||||
import org.thingsboard.server.utils.CsvUtils;
|
import org.thingsboard.server.utils.CsvUtils;
|
||||||
import org.thingsboard.server.utils.TypeCastUtil;
|
import org.thingsboard.server.utils.TypeCastUtil;
|
||||||
@ -68,14 +71,17 @@ import java.util.function.Consumer;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
public abstract class AbstractBulkImportService<E extends HasId<? extends EntityId> & HasTenantId> {
|
||||||
public abstract class AbstractBulkImportService<E extends BaseData<? extends EntityId>> {
|
@Autowired
|
||||||
protected final TelemetrySubscriptionService tsSubscriptionService;
|
private TelemetrySubscriptionService tsSubscriptionService;
|
||||||
protected final TbTenantProfileCache tenantProfileCache;
|
@Autowired
|
||||||
protected final AccessControlService accessControlService;
|
private TbTenantProfileCache tenantProfileCache;
|
||||||
protected final AccessValidator accessValidator;
|
@Autowired
|
||||||
protected final EntityActionService entityActionService;
|
private AccessControlService accessControlService;
|
||||||
protected final TbClusterService clusterService;
|
@Autowired
|
||||||
|
private AccessValidator accessValidator;
|
||||||
|
@Autowired
|
||||||
|
private EntityActionService entityActionService;
|
||||||
|
|
||||||
private static ThreadPoolExecutor executor;
|
private static ThreadPoolExecutor executor;
|
||||||
|
|
||||||
@ -100,7 +106,7 @@ public abstract class AbstractBulkImportService<E extends BaseData<? extends Ent
|
|||||||
entitiesData.forEach(entityData -> DonAsynchron.submit(() -> {
|
entitiesData.forEach(entityData -> DonAsynchron.submit(() -> {
|
||||||
SecurityContextHolder.setContext(securityContext);
|
SecurityContextHolder.setContext(securityContext);
|
||||||
|
|
||||||
ImportedEntityInfo<E> importedEntityInfo = saveEntity(request, entityData.getFields(), user);
|
ImportedEntityInfo<E> importedEntityInfo = saveEntity(entityData.getFields(), user);
|
||||||
E entity = importedEntityInfo.getEntity();
|
E entity = importedEntityInfo.getEntity();
|
||||||
|
|
||||||
onEntityImported.accept(importedEntityInfo);
|
onEntityImported.accept(importedEntityInfo);
|
||||||
@ -127,12 +133,39 @@ public abstract class AbstractBulkImportService<E extends BaseData<? extends Ent
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract ImportedEntityInfo<E> saveEntity(BulkImportRequest importRequest, Map<BulkImportColumnType, String> fields, SecurityUser user);
|
@SneakyThrows
|
||||||
|
private ImportedEntityInfo<E> saveEntity(Map<BulkImportColumnType, String> fields, SecurityUser user) {
|
||||||
|
ImportedEntityInfo<E> importedEntityInfo = new ImportedEntityInfo<>();
|
||||||
|
|
||||||
|
E entity = findOrCreateEntity(user.getTenantId(), fields.get(BulkImportColumnType.NAME));
|
||||||
|
if (entity.getId() != null) {
|
||||||
|
importedEntityInfo.setOldEntity((E) entity.getClass().getConstructor(entity.getClass()).newInstance(entity));
|
||||||
|
importedEntityInfo.setUpdated(true);
|
||||||
|
} else {
|
||||||
|
setOwners(entity, user);
|
||||||
|
}
|
||||||
|
|
||||||
|
setEntityFields(entity, fields);
|
||||||
|
accessControlService.checkPermission(user, Resource.of(getEntityType()), Operation.WRITE, entity.getId(), entity);
|
||||||
|
|
||||||
|
E savedEntity = saveEntity(entity, fields);
|
||||||
|
|
||||||
|
importedEntityInfo.setEntity(savedEntity);
|
||||||
|
return importedEntityInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected abstract E findOrCreateEntity(TenantId tenantId, String name);
|
||||||
|
|
||||||
|
protected abstract void setOwners(E entity, SecurityUser user);
|
||||||
|
|
||||||
|
protected abstract void setEntityFields(E entity, Map<BulkImportColumnType, String> fields);
|
||||||
|
|
||||||
|
protected abstract E saveEntity(E entity, Map<BulkImportColumnType, String> fields);
|
||||||
|
|
||||||
|
protected abstract EntityType getEntityType();
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Attributes' values are firstly added to JsonObject in order to then make some type cast,
|
|
||||||
* because we get all values as strings from CSV
|
|
||||||
* */
|
|
||||||
private void saveKvs(SecurityUser user, E entity, Map<ColumnMapping, ParsedValue> data) {
|
private void saveKvs(SecurityUser user, E entity, Map<ColumnMapping, ParsedValue> data) {
|
||||||
Arrays.stream(BulkImportColumnType.values())
|
Arrays.stream(BulkImportColumnType.values())
|
||||||
.filter(BulkImportColumnType::isKv)
|
.filter(BulkImportColumnType::isKv)
|
||||||
|
|||||||
@ -58,7 +58,7 @@ public enum Resource {
|
|||||||
|
|
||||||
public static Resource of(EntityType entityType) {
|
public static Resource of(EntityType entityType) {
|
||||||
for (Resource resource : Resource.values()) {
|
for (Resource resource : Resource.values()) {
|
||||||
if (resource.getEntityType().get() == entityType) {
|
if (resource.getEntityType().orElse(null) == entityType) {
|
||||||
return resource;
|
return resource;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user