fixed widget-bundle import and added widget type VC support
This commit is contained in:
parent
f3e89f7dff
commit
4e42a3efe2
@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2023 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.ie.exporting.impl;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
|
import org.thingsboard.server.common.data.id.WidgetTypeId;
|
||||||
|
import org.thingsboard.server.common.data.sync.ie.WidgetTypeExportData;
|
||||||
|
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
||||||
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
import org.thingsboard.server.service.sync.vc.data.EntitiesExportCtx;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@TbCoreComponent
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class WidgetTypeExportService extends BaseEntityExportService<WidgetTypeId, WidgetTypeDetails, WidgetTypeExportData> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setRelatedEntities(EntitiesExportCtx<?> ctx, WidgetTypeDetails widgetsBundle, WidgetTypeExportData exportData) {
|
||||||
|
if (widgetsBundle.getTenantId() == null || widgetsBundle.getTenantId().isNullUid()) {
|
||||||
|
throw new IllegalArgumentException("Export of system Widget Type is not allowed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected WidgetTypeExportData newExportData() {
|
||||||
|
return new WidgetTypeExportData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<EntityType> getSupportedEntityTypes() {
|
||||||
|
return Set.of(EntityType.WIDGET_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -42,8 +42,8 @@ public class WidgetsBundleExportService extends BaseEntityExportService<WidgetsB
|
|||||||
throw new IllegalArgumentException("Export of system Widget Bundles is not allowed");
|
throw new IllegalArgumentException("Export of system Widget Bundles is not allowed");
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> widgets = widgetTypeService.findWidgetFqnsByWidgetsBundleId(ctx.getTenantId(), widgetsBundle.getId());
|
List<String> fqns = widgetTypeService.findWidgetFqnsByWidgetsBundleId(ctx.getTenantId(), widgetsBundle.getId());
|
||||||
exportData.setWidgets(widgets);
|
exportData.setFqns(fqns);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2023 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.ie.importing.impl;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
import org.thingsboard.server.common.data.id.WidgetTypeId;
|
||||||
|
import org.thingsboard.server.common.data.id.WidgetsBundleId;
|
||||||
|
import org.thingsboard.server.common.data.sync.ie.WidgetTypeExportData;
|
||||||
|
import org.thingsboard.server.common.data.sync.ie.WidgetsBundleExportData;
|
||||||
|
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
||||||
|
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
||||||
|
import org.thingsboard.server.dao.widget.WidgetTypeService;
|
||||||
|
import org.thingsboard.server.dao.widget.WidgetsBundleService;
|
||||||
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@TbCoreComponent
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class WidgetTypeImportService extends BaseEntityImportService<WidgetTypeId, WidgetTypeDetails, WidgetTypeExportData> {
|
||||||
|
|
||||||
|
private final WidgetTypeService widgetTypeService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setOwner(TenantId tenantId, WidgetTypeDetails widgetsBundle, IdProvider idProvider) {
|
||||||
|
widgetsBundle.setTenantId(tenantId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected WidgetTypeDetails prepare(EntitiesImportCtx ctx, WidgetTypeDetails widgetsBundle, WidgetTypeDetails old, WidgetTypeExportData exportData, IdProvider idProvider) {
|
||||||
|
return widgetsBundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected WidgetTypeDetails saveOrUpdate(EntitiesImportCtx ctx, WidgetTypeDetails widgetsBundle, WidgetTypeExportData exportData, IdProvider idProvider) {
|
||||||
|
return widgetTypeService.saveWidgetType(widgetsBundle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean compare(EntitiesImportCtx ctx, WidgetTypeExportData exportData, WidgetTypeDetails prepared, WidgetTypeDetails existing) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected WidgetTypeDetails deepCopy(WidgetTypeDetails widgetsBundle) {
|
||||||
|
return new WidgetTypeDetails(widgetsBundle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityType getEntityType() {
|
||||||
|
return EntityType.WIDGET_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -17,22 +17,19 @@ package org.thingsboard.server.service.sync.ie.importing.impl;
|
|||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.id.WidgetsBundleId;
|
import org.thingsboard.server.common.data.id.WidgetsBundleId;
|
||||||
import org.thingsboard.server.common.data.sync.ie.WidgetsBundleExportData;
|
import org.thingsboard.server.common.data.sync.ie.WidgetsBundleExportData;
|
||||||
import org.thingsboard.server.common.data.widget.BaseWidgetType;
|
import org.thingsboard.server.common.data.util.CollectionsUtil;
|
||||||
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
||||||
import org.thingsboard.server.common.data.widget.WidgetTypeInfo;
|
|
||||||
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
||||||
import org.thingsboard.server.dao.widget.WidgetTypeService;
|
import org.thingsboard.server.dao.widget.WidgetTypeService;
|
||||||
import org.thingsboard.server.dao.widget.WidgetsBundleService;
|
import org.thingsboard.server.dao.widget.WidgetsBundleService;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx;
|
import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -53,8 +50,27 @@ public class WidgetsBundleImportService extends BaseEntityImportService<WidgetsB
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected WidgetsBundle saveOrUpdate(EntitiesImportCtx ctx, WidgetsBundle widgetsBundle, WidgetsBundleExportData exportData, IdProvider idProvider) {
|
protected WidgetsBundle saveOrUpdate(EntitiesImportCtx ctx, WidgetsBundle widgetsBundle, WidgetsBundleExportData exportData, IdProvider idProvider) {
|
||||||
|
if (CollectionsUtil.isNotEmpty(exportData.getWidgets())) {
|
||||||
|
exportData.getWidgets().forEach(widgetTypeNode -> {
|
||||||
|
String bundleAlias = widgetTypeNode.remove("bundleAlias").asText();
|
||||||
|
String alias = widgetTypeNode.remove("alias").asText();
|
||||||
|
String fqn = String.format("%s.%s", bundleAlias, alias);
|
||||||
|
exportData.addFqn(fqn);
|
||||||
|
WidgetTypeDetails widgetType = JacksonUtil.treeToValue(widgetTypeNode, WidgetTypeDetails.class);
|
||||||
|
widgetType.setTenantId(ctx.getTenantId());
|
||||||
|
widgetType.setFqn(fqn);
|
||||||
|
var existingWidgetType = widgetTypeService.findWidgetTypeByTenantIdAndFqn(ctx.getTenantId(), fqn);
|
||||||
|
if (existingWidgetType == null) {
|
||||||
|
widgetType.setId(null);
|
||||||
|
} else {
|
||||||
|
widgetType.setId(existingWidgetType.getId());
|
||||||
|
widgetType.setCreatedTime(existingWidgetType.getCreatedTime());
|
||||||
|
}
|
||||||
|
widgetTypeService.saveWidgetType(widgetType);
|
||||||
|
});
|
||||||
|
}
|
||||||
WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle);
|
WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle);
|
||||||
widgetTypeService.updateWidgetsBundleWidgetFqns(ctx.getTenantId(), savedWidgetsBundle.getId(), exportData.getWidgets());
|
widgetTypeService.updateWidgetsBundleWidgetFqns(ctx.getTenantId(), savedWidgetsBundle.getId(), exportData.getFqns());
|
||||||
return savedWidgetsBundle;
|
return savedWidgetsBundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -39,6 +39,7 @@ import java.util.Map;
|
|||||||
@JsonSubTypes({
|
@JsonSubTypes({
|
||||||
@Type(name = "DEVICE", value = DeviceExportData.class),
|
@Type(name = "DEVICE", value = DeviceExportData.class),
|
||||||
@Type(name = "RULE_CHAIN", value = RuleChainExportData.class),
|
@Type(name = "RULE_CHAIN", value = RuleChainExportData.class),
|
||||||
|
@Type(name = "WIDGET_TYPE", value = WidgetTypeExportData.class),
|
||||||
@Type(name = "WIDGETS_BUNDLE", value = WidgetsBundleExportData.class)
|
@Type(name = "WIDGETS_BUNDLE", value = WidgetsBundleExportData.class)
|
||||||
})
|
})
|
||||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
|||||||
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2023 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.sync.ie;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class WidgetTypeExportData extends EntityExportData<WidgetTypeDetails> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -16,13 +16,12 @@
|
|||||||
package org.thingsboard.server.common.data.sync.ie;
|
package org.thingsboard.server.common.data.sync.ie;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import org.thingsboard.server.common.data.widget.BaseWidgetType;
|
|
||||||
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
|
||||||
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -30,6 +29,16 @@ import java.util.List;
|
|||||||
public class WidgetsBundleExportData extends EntityExportData<WidgetsBundle> {
|
public class WidgetsBundleExportData extends EntityExportData<WidgetsBundle> {
|
||||||
|
|
||||||
@JsonProperty(index = 3)
|
@JsonProperty(index = 3)
|
||||||
private List<String> widgets;
|
private List<ObjectNode> widgets;
|
||||||
|
|
||||||
|
@JsonProperty(index = 4)
|
||||||
|
private List<String> fqns;
|
||||||
|
|
||||||
|
public void addFqn(String fqn) {
|
||||||
|
if (fqns == null) {
|
||||||
|
fqns = new ArrayList<>();
|
||||||
|
}
|
||||||
|
fqns.add(fqn);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,6 +30,7 @@ export const exportableEntityTypes: Array<EntityType> = [
|
|||||||
EntityType.DEVICE_PROFILE,
|
EntityType.DEVICE_PROFILE,
|
||||||
EntityType.ASSET_PROFILE,
|
EntityType.ASSET_PROFILE,
|
||||||
EntityType.RULE_CHAIN,
|
EntityType.RULE_CHAIN,
|
||||||
|
EntityType.WIDGET_TYPE,
|
||||||
EntityType.WIDGETS_BUNDLE,
|
EntityType.WIDGETS_BUNDLE,
|
||||||
EntityType.NOTIFICATION_TEMPLATE,
|
EntityType.NOTIFICATION_TEMPLATE,
|
||||||
EntityType.NOTIFICATION_TARGET,
|
EntityType.NOTIFICATION_TARGET,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user