Browse Source

Refactor version create request structures

pull/6558/head
Viacheslav Klimov 4 years ago
parent
commit
2302213b3c
  1. 81
      application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java
  2. 36
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntitiesByCustomFilterVersionCreateConfig.java
  3. 36
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntitiesByCustomQueryVersionCreateConfig.java
  4. 33
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntityListVersionCreateConfig.java
  5. 21
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntityListVersionCreateRequest.java
  6. 38
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntityTypeVersionCreateConfig.java
  7. 20
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntityTypeVersionCreateRequest.java
  8. 10
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/MultipleEntitiesVersionCreateConfig.java
  9. 33
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/SingleEntityVersionCreateConfig.java
  10. 19
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/SingleEntityVersionCreateRequest.java
  11. 6
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/SyncStrategy.java
  12. 16
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/VersionCreateConfig.java
  13. 25
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/VersionCreateConfigType.java
  14. 6
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/VersionCreateRequest.java
  15. 7
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/VersionCreateRequestType.java
  16. 2
      application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/load/EntityTypeVersionLoadConfig.java

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

@ -65,6 +65,7 @@ import org.thingsboard.server.service.sync.vc.data.EntityVersion;
import org.thingsboard.server.service.sync.vc.data.VersionCreationResult;
import org.thingsboard.server.service.sync.vc.data.VersionLoadResult;
import org.thingsboard.server.service.sync.vc.data.VersionedEntityInfo;
import org.thingsboard.server.service.sync.vc.data.request.create.MultipleEntitiesVersionCreateConfig;
import org.thingsboard.server.service.sync.vc.data.request.load.VersionLoadRequest;
import org.thingsboard.server.service.sync.vc.data.request.load.VersionLoadSettings;
import org.thingsboard.server.service.sync.vc.data.request.create.VersionCreateRequest;
@ -152,23 +153,24 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
if (repository.listBranches().contains(request.getBranch())) {
repository.checkout(request.getBranch());
repository.merge(request.getBranch());
} else { // FIXME [viacheslav]: rollback orphan branch on failure
} else { // TODO [viacheslav]: rollback orphan branch on failure
repository.createAndCheckoutOrphanBranch(request.getBranch()); // FIXME [viacheslav]: Checkout returned unexpected result NO_CHANGE for master branch
}
for (VersionCreateRequest.Config config : request.getConfigs()) {
for (VersionCreateConfig config : request.getConfigs()) {
EntityExportSettings exportSettings = EntityExportSettings.builder()
.exportRelations(config.isSaveRelations())
.build();
List<EntityExportData<?>> entityDataList = new ArrayList<>();
for (EntityId entityId : findEntities()) {
for (EntityId entityId : findEntities(user, config, 0, Integer.MAX_VALUE)) { // TODO [viacheslav]: find with pagination
EntityExportData<ExportableEntity<EntityId>> entityData = exportImportService.exportEntity(user, entityId, exportSettings);
entityDataList.add(entityData);
}
if (config.isRemoveOtherRemoteEntitiesOfType()) {
entityDataList.stream()
if (config instanceof MultipleEntitiesVersionCreateConfig &&
((MultipleEntitiesVersionCreateConfig) config).isRemoveOtherRemoteEntitiesOfType()) {
entityDataList.stream() // FIXME [viacheslav]: in case of an emtpy entity type? none will be deleted on remote?
.map(EntityExportData::getEntityType)
.distinct()
.forEach(entityType -> {
@ -186,7 +188,6 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
entityData.getEntity().getId().toString())).toFile(), entityDataJson, StandardCharsets.UTF_8);
}
}
// TODO [viacheslav]: find with pagination
repository.add(".");
@ -206,18 +207,18 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
}
}
private List<EntityId> findEntities(SecurityUser user, VersionCreateConfig entityFilter, int page, int pageSize) {
switch (entityFilter.getType()) {
private List<EntityId> findEntities(SecurityUser user, VersionCreateConfig config, int page, int pageSize) {
switch (config.getType()) {
case SINGLE_ENTITY: {
SingleEntityVersionCreateConfig filter = (SingleEntityVersionCreateConfig) entityFilter;
SingleEntityVersionCreateConfig filter = (SingleEntityVersionCreateConfig) config;
return List.of(filter.getEntityId());
}
case ENTITY_LIST: {
EntityListVersionCreateConfig filter = (EntityListVersionCreateConfig) entityFilter;
EntityListVersionCreateConfig filter = (EntityListVersionCreateConfig) config;
return filter.getEntitiesIds();
}
case ENTITY_TYPE: {
EntityTypeVersionCreateConfig filter = (EntityTypeVersionCreateConfig) entityFilter;
EntityTypeVersionCreateConfig filter = (EntityTypeVersionCreateConfig) config;
EntitiesByCustomFilterVersionCreateConfig newFilter = new EntitiesByCustomFilterVersionCreateConfig();
org.thingsboard.server.common.data.query.EntityTypeFilter entityTypeFilter = new org.thingsboard.server.common.data.query.EntityTypeFilter();
@ -228,7 +229,7 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
return findEntities(user, newFilter, page, pageSize);
}
case CUSTOM_ENTITY_FILTER: {
EntitiesByCustomFilterVersionCreateConfig filter = (EntitiesByCustomFilterVersionCreateConfig) entityFilter;
EntitiesByCustomFilterVersionCreateConfig filter = (EntitiesByCustomFilterVersionCreateConfig) config;
EntitiesByCustomQueryVersionCreateConfig newFilter = new EntitiesByCustomQueryVersionCreateConfig();
EntityDataPageLink pageLink = new EntityDataPageLink();
@ -243,7 +244,7 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
return findEntities(user, newFilter, page, pageSize);
}
case CUSTOM_ENTITY_QUERY: {
EntitiesByCustomQueryVersionCreateConfig filter = (EntitiesByCustomQueryVersionCreateConfig) entityFilter;
EntitiesByCustomQueryVersionCreateConfig filter = (EntitiesByCustomQueryVersionCreateConfig) config;
CustomerId customerId = new CustomerId(ObjectUtils.defaultIfNull(filter.getCustomerId(), EntityId.NULL_UUID));
return entityService.findEntityDataByQuery(user.getTenantId(), customerId, filter.getQuery()).getData()
.stream().map(EntityData::getEntityId)
@ -341,35 +342,35 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
boolean removeNonexistentLocalEntities = false;
if ()
if (request.isRemoveOtherLocalEntitiesOfType()) {
importResults.stream()
.collect(Collectors.groupingBy(EntityImportResult::getEntityType)) // FIXME [viacheslav]: if no entities of entity type - remove all ?
.forEach((entityType, resultsForEntityType) -> {
Set<EntityId> modifiedEntities = resultsForEntityType.stream().map(EntityImportResult::getSavedEntity).map(ExportableEntity::getExternalId).collect(Collectors.toSet());
AtomicInteger deleted = new AtomicInteger();
DaoUtil.processInBatches(pageLink -> {
return exportableEntitiesService.findEntitiesByTenantId(user.getTenantId(), entityType, pageLink);
}, 100, entity -> {
if (entity.getExternalId() == null || !modifiedEntities.contains(entity.getExternalId())) {
try {
exportableEntitiesService.checkPermission(user, entity, entityType, Operation.DELETE);
} catch (ThingsboardException e) {
throw new RuntimeException(e);
if (request.isRemoveOtherLocalEntitiesOfType()) {
importResults.stream()
.collect(Collectors.groupingBy(EntityImportResult::getEntityType)) // FIXME [viacheslav]: if no entities of entity type - remove all ?
.forEach((entityType, resultsForEntityType) -> {
Set<EntityId> modifiedEntities = resultsForEntityType.stream().map(EntityImportResult::getSavedEntity).map(ExportableEntity::getExternalId).collect(Collectors.toSet());
AtomicInteger deleted = new AtomicInteger();
DaoUtil.processInBatches(pageLink -> {
return exportableEntitiesService.findEntitiesByTenantId(user.getTenantId(), entityType, pageLink);
}, 100, entity -> {
if (entity.getExternalId() == null || !modifiedEntities.contains(entity.getExternalId())) {
try {
exportableEntitiesService.checkPermission(user, entity, entityType, Operation.DELETE);
} catch (ThingsboardException e) {
throw new RuntimeException(e);
}
// need to delete in a specific order?
exportableEntitiesService.deleteByTenantIdAndId(user.getTenantId(), entity.getId());
deleted.getAndIncrement();
}
// need to delete in a specific order?
exportableEntitiesService.deleteByTenantIdAndId(user.getTenantId(), entity.getId());
deleted.getAndIncrement();
}
});
results.put(entityType, VersionLoadResult.builder()
.entityType(entityType)
.created((int) resultsForEntityType.stream().filter(importResult -> importResult.getOldEntity() == null).count())
.updated((int) resultsForEntityType.stream().filter(importResult -> importResult.getOldEntity() != null).count())
.deleted(deleted.get())
.build());
});
results.put(entityType, VersionLoadResult.builder()
.entityType(entityType)
.created((int) resultsForEntityType.stream().filter(importResult -> importResult.getOldEntity() == null).count())
.updated((int) resultsForEntityType.stream().filter(importResult -> importResult.getOldEntity() != null).count())
.deleted(deleted.get())
.build());
});
}
}
return new ArrayList<>(results.values());
}

36
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntitiesByCustomFilterVersionCreateConfig.java

@ -1,36 +0,0 @@
/**
* 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.request.create;
import lombok.Data;
import org.thingsboard.server.common.data.query.EntityFilter;
import java.util.UUID;
@Data
public class EntitiesByCustomFilterVersionCreateConfig extends VersionCreateConfig {
private EntityFilter filter;
private UUID customerId;
private boolean removeOtherRemoteEntitiesOfType;
@Override
public VersionCreateConfigType getType() {
return VersionCreateConfigType.CUSTOM_ENTITY_FILTER;
}
}

36
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntitiesByCustomQueryVersionCreateConfig.java

@ -1,36 +0,0 @@
/**
* 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.request.create;
import lombok.Data;
import org.thingsboard.server.common.data.query.EntityDataQuery;
import java.util.UUID;
@Data
public class EntitiesByCustomQueryVersionCreateConfig extends VersionCreateConfig {
private EntityDataQuery query;
private UUID customerId;
private boolean removeOtherRemoteEntitiesOfType;
@Override
public VersionCreateConfigType getType() {
return VersionCreateConfigType.CUSTOM_ENTITY_QUERY;
}
}

33
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntityListVersionCreateConfig.java

@ -1,33 +0,0 @@
/**
* 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.request.create;
import lombok.Data;
import org.thingsboard.server.common.data.id.EntityId;
import java.util.List;
@Data
public class EntityListVersionCreateConfig extends VersionCreateConfig {
private List<EntityId> entitiesIds;
@Override
public VersionCreateConfigType getType() {
return VersionCreateConfigType.ENTITY_LIST;
}
}

21
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntityListVersionCreateRequest.java

@ -0,0 +1,21 @@
package org.thingsboard.server.service.sync.vc.data.request.create;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EntityId;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
public class EntityListVersionCreateRequest extends VersionCreateRequest {
private List<EntityId> entitiesIds;
private MultipleEntitiesVersionCreateConfig config;
@Override
public VersionCreateRequestType getType() {
return VersionCreateRequestType.ENTITY_LIST;
}
}

38
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntityTypeVersionCreateConfig.java

@ -1,38 +0,0 @@
/**
* 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.request.create;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.EntityType;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
public class EntityTypeVersionCreateConfig extends VersionCreateConfig {
private EntityType entityType;
private UUID customerId;
private boolean removeOtherRemoteEntitiesOfType;
@Override
public VersionCreateConfigType getType() {
return VersionCreateConfigType.ENTITY_TYPE;
}
}

20
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/EntityTypeVersionCreateRequest.java

@ -0,0 +1,20 @@
package org.thingsboard.server.service.sync.vc.data.request.create;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.EntityType;
import java.util.Map;
@Data
@EqualsAndHashCode(callSuper = true)
public class EntityTypeVersionCreateRequest extends VersionCreateRequest {
private Map<EntityType, MultipleEntitiesVersionCreateConfig> entityTypes;
@Override
public VersionCreateRequestType getType() {
return VersionCreateRequestType.ENTITY_TYPE;
}
}

10
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/MultipleEntitiesVersionCreateConfig.java

@ -0,0 +1,10 @@
package org.thingsboard.server.service.sync.vc.data.request.create;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public abstract class MultipleEntitiesVersionCreateConfig extends VersionCreateConfig {
private SyncStrategy syncStrategy;
}

33
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/SingleEntityVersionCreateConfig.java

@ -1,33 +0,0 @@
/**
* 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.request.create;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EntityId;
@Data
@EqualsAndHashCode(callSuper = true)
public class SingleEntityVersionCreateConfig extends VersionCreateConfig {
private EntityId entityId;
@Override
public VersionCreateConfigType getType() {
return VersionCreateConfigType.SINGLE_ENTITY;
}
}

19
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/SingleEntityVersionCreateRequest.java

@ -0,0 +1,19 @@
package org.thingsboard.server.service.sync.vc.data.request.create;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EntityId;
@Data
@EqualsAndHashCode(callSuper = true)
public class SingleEntityVersionCreateRequest extends VersionCreateRequest {
private EntityId entityId;
private VersionCreateConfig config;
@Override
public VersionCreateRequestType getType() {
return VersionCreateRequestType.SINGLE_ENTITY;
}
}

6
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/SyncStrategy.java

@ -0,0 +1,6 @@
package org.thingsboard.server.service.sync.vc.data.request.create;
public enum SyncStrategy {
MERGE,
OVERWRITE
}

16
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/VersionCreateConfig.java

@ -15,25 +15,9 @@
*/
package org.thingsboard.server.service.sync.vc.data.request.create;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import lombok.Data;
@JsonTypeInfo(use = Id.NAME, property = "type")
@JsonSubTypes({
@Type(name = "SINGLE_ENTITY", value = SingleEntityVersionCreateConfig.class),
@Type(name = "ENTITY_LIST", value = EntityListVersionCreateConfig.class),
@Type(name = "ENTITY_TYPE", value = EntityTypeVersionCreateConfig.class),
@Type(name = "CUSTOM_ENTITY_FILTER", value = EntitiesByCustomFilterVersionCreateConfig.class),
@Type(name = "CUSTOM_ENTITY_QUERY", value = EntitiesByCustomQueryVersionCreateConfig.class)
})
@Data
public abstract class VersionCreateConfig {
private boolean saveRelations;
public abstract VersionCreateConfigType getType();
}

25
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/VersionCreateConfigType.java

@ -1,25 +0,0 @@
/**
* 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.request.create;
public enum VersionCreateConfigType {
SINGLE_ENTITY,
ENTITY_LIST,
ENTITY_TYPE,
CUSTOM_ENTITY_FILTER,
CUSTOM_ENTITY_QUERY
}

6
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/VersionCreateRequest.java

@ -17,14 +17,12 @@ package org.thingsboard.server.service.sync.vc.data.request.create;
import lombok.Data;
import java.util.List;
@Data
public class VersionCreateRequest {
public abstract class VersionCreateRequest {
private String versionName;
private String branch;
private List<VersionCreateConfig> configs;
public abstract VersionCreateRequestType getType();
}

7
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/create/VersionCreateRequestType.java

@ -0,0 +1,7 @@
package org.thingsboard.server.service.sync.vc.data.request.create;
public enum VersionCreateRequestType {
SINGLE_ENTITY,
ENTITY_LIST,
ENTITY_TYPE
}

2
application/src/main/java/org/thingsboard/server/service/sync/vc/data/request/load/EntityTypeVersionLoadConfig.java

@ -7,6 +7,6 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
public class EntityTypeVersionLoadConfig extends EntityVersionLoadConfig {
private boolean removeNonexistentLocalEntities;
private boolean removeOtherEntities;
}

Loading…
Cancel
Save