Browse Source

Merge pull request #6845 from ViacheslavKlimov/vc-fixes

[3.4] Minor fixes for VC
pull/6851/head
Andrew Shvayka 4 years ago
committed by GitHub
parent
commit
343b14833a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      application/src/main/java/org/thingsboard/server/service/sync/ie/DefaultEntitiesExportImportService.java
  2. 18
      application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java
  3. 8
      application/src/main/java/org/thingsboard/server/service/sync/vc/LoadEntityException.java
  4. 6
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesImportCtx.java
  5. 21
      common/data/src/main/java/org/thingsboard/server/common/data/Dashboard.java

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

@ -38,6 +38,8 @@ 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.BaseEntityExportService;
import org.thingsboard.server.service.sync.ie.exporting.impl.DefaultEntityExportService; 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.ie.importing.EntityImportService;
import org.thingsboard.server.service.sync.ie.importing.impl.MissingEntityException;
import org.thingsboard.server.service.sync.vc.LoadEntityException;
import org.thingsboard.server.service.sync.vc.data.EntitiesExportCtx; import org.thingsboard.server.service.sync.vc.data.EntitiesExportCtx;
import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx;
@ -95,15 +97,21 @@ public class DefaultEntitiesExportImportService implements EntitiesExportImportS
EntityImportResult<E> importResult = importService.importEntity(ctx, exportData); EntityImportResult<E> importResult = importService.importEntity(ctx, exportData);
ctx.putInternalId(exportData.getExternalId(), importResult.getSavedEntity().getId()); ctx.putInternalId(exportData.getExternalId(), importResult.getSavedEntity().getId());
ctx.addReferenceCallback(importResult.getSaveReferencesCallback()); ctx.addReferenceCallback(exportData.getExternalId(), importResult.getSaveReferencesCallback());
ctx.addEventCallback(importResult.getSendEventsCallback()); ctx.addEventCallback(importResult.getSendEventsCallback());
return importResult; return importResult;
} }
@Override @Override
public void saveReferencesAndRelations(EntitiesImportCtx ctx) throws ThingsboardException { public void saveReferencesAndRelations(EntitiesImportCtx ctx) throws ThingsboardException {
for (ThrowingRunnable saveReferencesCallback : ctx.getReferenceCallbacks()) { for (Map.Entry<EntityId, ThrowingRunnable> callbackEntry : ctx.getReferenceCallbacks().entrySet()) {
saveReferencesCallback.run(); EntityId externalId = callbackEntry.getKey();
ThrowingRunnable saveReferencesCallback = callbackEntry.getValue();
try {
saveReferencesCallback.run();
} catch (MissingEntityException e) {
throw new LoadEntityException(externalId, e);
}
} }
relationService.saveRelations(ctx.getTenantId(), new ArrayList<>(ctx.getRelations())); relationService.saveRelations(ctx.getTenantId(), new ArrayList<>(ctx.getRelations()));

18
application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java

@ -286,7 +286,7 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
result.setDone(true); result.setDone(true);
return cachePut(ctx.getRequestId(), result); return cachePut(ctx.getRequestId(), result);
} catch (LoadEntityException e) { } catch (LoadEntityException e) {
return cachePut(ctx.getRequestId(), onError(e.getData(), e.getCause())); return cachePut(ctx.getRequestId(), onError(e.getExternalId(), e.getCause()));
} catch (Exception e) { } catch (Exception e) {
log.info("[{}] Failed to process request [{}] due to: ", ctx.getTenantId(), request, e); log.info("[{}] Failed to process request [{}] due to: ", ctx.getTenantId(), request, e);
return cachePut(ctx.getRequestId(), VersionLoadResult.error(EntityLoadError.runtimeError(e.getMessage()))); return cachePut(ctx.getRequestId(), VersionLoadResult.error(EntityLoadError.runtimeError(e.getMessage())));
@ -313,7 +313,7 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
.deleted(0) .deleted(0)
.build()); .build());
} catch (Exception e) { } catch (Exception e) {
throw new LoadEntityException(entityData, e); throw new LoadEntityException(entityData.getExternalId(), e);
} }
} }
@ -382,7 +382,7 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
try { try {
importResult = exportImportService.importEntity(ctx, entityData); importResult = exportImportService.importEntity(ctx, entityData);
} catch (Exception e) { } catch (Exception e) {
throw new LoadEntityException(entityData, e); throw new LoadEntityException(entityData.getExternalId(), e);
} }
registerResult(ctx, entityType, importResult); registerResult(ctx, entityType, importResult);
@ -432,20 +432,20 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
}); });
} }
private VersionLoadResult onError(EntityExportData<?> entityData, Throwable e) { private VersionLoadResult onError(EntityId externalId, Throwable e) {
return analyze(e, entityData).orElse(VersionLoadResult.error(EntityLoadError.runtimeError(e.getMessage()))); return analyze(e, externalId).orElse(VersionLoadResult.error(EntityLoadError.runtimeError(e.getMessage())));
} }
private Optional<VersionLoadResult> analyze(Throwable e, EntityExportData<?> entityData) { private Optional<VersionLoadResult> analyze(Throwable e, EntityId externalId) {
if (e == null) { if (e == null) {
return Optional.empty(); return Optional.empty();
} else { } else {
if (e instanceof DeviceCredentialsValidationException) { if (e instanceof DeviceCredentialsValidationException) {
return Optional.of(VersionLoadResult.error(EntityLoadError.credentialsError(entityData.getExternalId()))); return Optional.of(VersionLoadResult.error(EntityLoadError.credentialsError(externalId)));
} else if (e instanceof MissingEntityException) { } else if (e instanceof MissingEntityException) {
return Optional.of(VersionLoadResult.error(EntityLoadError.referenceEntityError(entityData.getExternalId(), ((MissingEntityException) e).getEntityId()))); return Optional.of(VersionLoadResult.error(EntityLoadError.referenceEntityError(externalId, ((MissingEntityException) e).getEntityId())));
} else { } else {
return analyze(e.getCause(), entityData); return analyze(e.getCause(), externalId);
} }
} }
} }

8
application/src/main/java/org/thingsboard/server/service/sync/vc/LoadEntityException.java

@ -16,17 +16,17 @@
package org.thingsboard.server.service.sync.vc; package org.thingsboard.server.service.sync.vc;
import lombok.Getter; import lombok.Getter;
import org.thingsboard.server.common.data.sync.ie.EntityExportData; import org.thingsboard.server.common.data.id.EntityId;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public class LoadEntityException extends RuntimeException { public class LoadEntityException extends RuntimeException {
private static final long serialVersionUID = -1749719992370409504L; private static final long serialVersionUID = -1749719992370409504L;
@Getter @Getter
private final EntityExportData data; private final EntityId externalId;
public LoadEntityException(EntityExportData data, Throwable cause) { public LoadEntityException(EntityId externalId, Throwable cause) {
super(cause); super(cause);
this.data = data; this.externalId = externalId;
} }
} }

6
application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesImportCtx.java

@ -48,7 +48,7 @@ public class EntitiesImportCtx {
private final Map<EntityType, EntityTypeLoadResult> results = new HashMap<>(); private final Map<EntityType, EntityTypeLoadResult> results = new HashMap<>();
private final Map<EntityType, Set<EntityId>> importedEntities = new HashMap<>(); private final Map<EntityType, Set<EntityId>> importedEntities = new HashMap<>();
private final Map<EntityId, ReimportTask> toReimport = new HashMap<>(); private final Map<EntityId, ReimportTask> toReimport = new HashMap<>();
private final List<ThrowingRunnable> referenceCallbacks = new ArrayList<>(); private final Map<EntityId, ThrowingRunnable> referenceCallbacks = new HashMap<>();
private final List<ThrowingRunnable> eventCallbacks = new ArrayList<>(); private final List<ThrowingRunnable> eventCallbacks = new ArrayList<>();
private final Map<EntityId, EntityId> externalToInternalIdMap = new HashMap<>(); private final Map<EntityId, EntityId> externalToInternalIdMap = new HashMap<>();
private final Set<EntityId> notFoundIds = new HashSet<>(); private final Set<EntityId> notFoundIds = new HashSet<>();
@ -119,9 +119,9 @@ public class EntitiesImportCtx {
relations.addAll(values); relations.addAll(values);
} }
public void addReferenceCallback(ThrowingRunnable tr) { public void addReferenceCallback(EntityId externalId, ThrowingRunnable tr) {
if (tr != null) { if (tr != null) {
referenceCallbacks.add(tr); referenceCallbacks.put(externalId, tr);
} }
} }

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

@ -17,19 +17,18 @@ package org.thingsboard.server.common.data;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.Streams;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.DashboardId;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.StreamSupport; import java.util.stream.Collectors;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class Dashboard extends DashboardInfo implements ExportableEntity<DashboardId> { public class Dashboard extends DashboardInfo implements ExportableEntity<DashboardId> {
@ -86,17 +85,11 @@ public class Dashboard extends DashboardInfo implements ExportableEntity<Dashboa
private List<ObjectNode> getChildObjects(String propertyName) { private List<ObjectNode> getChildObjects(String propertyName) {
return Optional.ofNullable(configuration) return Optional.ofNullable(configuration)
.map(config -> config.get(propertyName)) .map(config -> config.get(propertyName))
.filter(node -> !node.isEmpty()) .filter(node -> !node.isEmpty() && (node.isObject() || node.isArray()))
.map(node -> (ObjectNode) node) .map(node -> Streams.stream(node.elements())
.map(object -> { .filter(JsonNode::isObject)
List<ObjectNode> widgets = new ArrayList<>(object.size()); .map(jsonNode -> (ObjectNode) jsonNode)
object.forEach(child -> { .collect(Collectors.toList()))
if (child.isObject()) {
widgets.add((ObjectNode) child);
}
});
return widgets;
})
.orElse(Collections.emptyList()); .orElse(Collections.emptyList());
} }

Loading…
Cancel
Save