Browse Source

eliminated usage of DefaultNotificationRuleRecipientsConfig and EntityExportData instances

pull/15196/head
dashevchenko 7 months ago
parent
commit
2bcc82f682
  1. 4
      application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/BaseEntityExportService.java
  2. 7
      application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java
  3. 5
      application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceExportService.java
  4. 5
      application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/OtaPackageExportService.java
  5. 5
      application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/RuleChainExportService.java
  6. 5
      application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/WidgetTypeExportService.java
  7. 5
      application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/WidgetsBundleExportService.java
  8. 3
      application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java
  9. 8
      application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java
  10. 79
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/DefaultNotificationRuleRecipientsConfig.java
  11. 6
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/EscalatedNotificationRuleRecipientsConfig.java
  12. 6
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRuleRecipientsConfig.java
  13. 4
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/DeviceExportData.java
  14. 115
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityExportData.java
  15. 4
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/OtaPackageExportData.java
  16. 4
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/RuleChainExportData.java
  17. 4
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/WidgetTypeExportData.java
  18. 4
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/WidgetsBundleExportData.java
  19. 4
      dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotifications.java

4
application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/BaseEntityExportService.java

@ -42,10 +42,6 @@ public abstract class BaseEntityExportService<I extends EntityId, E extends Expo
protected void setRelatedEntities(EntitiesExportCtx<?> ctx, E mainEntity, D exportData) { protected void setRelatedEntities(EntitiesExportCtx<?> ctx, E mainEntity, D exportData) {
} }
protected D newExportData() {
return (D) new EntityExportData<E>();
}
public abstract Set<EntityType> getSupportedEntityTypes(); public abstract Set<EntityType> getSupportedEntityTypes();
protected void replaceUuidsRecursively(EntitiesExportCtx<?> ctx, JsonNode node, Set<String> skippedRootFields, Pattern includedFieldsPattern) { protected void replaceUuidsRecursively(EntitiesExportCtx<?> ctx, JsonNode node, Set<String> skippedRootFields, Pattern includedFieldsPattern) {

7
application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java

@ -70,7 +70,7 @@ public class DefaultEntityExportService<I extends EntityId, E extends Exportable
@Override @Override
public final D getExportData(EntitiesExportCtx<?> ctx, I entityId) throws ThingsboardException { public final D getExportData(EntitiesExportCtx<?> ctx, I entityId) throws ThingsboardException {
D exportData = newExportData(); D exportData = (D) EntityExportData.newInstance(entityId.getEntityType());
E entity = exportableEntitiesService.findEntityByTenantIdAndId(ctx.getTenantId(), entityId); E entity = exportableEntitiesService.findEntityByTenantIdAndId(ctx.getTenantId(), entityId);
if (entity == null) { if (entity == null) {
@ -78,7 +78,6 @@ public class DefaultEntityExportService<I extends EntityId, E extends Exportable
} }
exportData.setEntity(entity); exportData.setEntity(entity);
exportData.setEntityType(entityId.getEntityType());
setAdditionalExportData(ctx, entity, exportData); setAdditionalExportData(ctx, entity, exportData);
if (entity instanceof HasVersion hasVersion) { if (entity instanceof HasVersion hasVersion) {
hasVersion.setVersion(null); hasVersion.setVersion(null);
@ -223,8 +222,4 @@ public class DefaultEntityExportService<I extends EntityId, E extends Exportable
return internalUuid; return internalUuid;
} }
protected D newExportData() {
return (D) new EntityExportData<E>();
}
} }

5
application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceExportService.java

@ -48,11 +48,6 @@ public class DeviceExportService extends BaseEntityExportService<DeviceId, Devic
} }
} }
@Override
protected DeviceExportData newExportData() {
return new DeviceExportData();
}
@Override @Override
public Set<EntityType> getSupportedEntityTypes() { public Set<EntityType> getSupportedEntityTypes() {
return Set.of(EntityType.DEVICE); return Set.of(EntityType.DEVICE);

5
application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/OtaPackageExportService.java

@ -36,11 +36,6 @@ public class OtaPackageExportService extends BaseEntityExportService<OtaPackageI
otaPackage.setDeviceProfileId(getExternalIdOrElseInternal(ctx, otaPackage.getDeviceProfileId())); otaPackage.setDeviceProfileId(getExternalIdOrElseInternal(ctx, otaPackage.getDeviceProfileId()));
} }
@Override
protected OtaPackageExportData newExportData() {
return new OtaPackageExportData();
}
@Override @Override
public Set<EntityType> getSupportedEntityTypes() { public Set<EntityType> getSupportedEntityTypes() {
return Set.of(EntityType.OTA_PACKAGE); return Set.of(EntityType.OTA_PACKAGE);

5
application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/RuleChainExportService.java

@ -61,11 +61,6 @@ public class RuleChainExportService extends BaseEntityExportService<RuleChainId,
} }
} }
@Override
protected RuleChainExportData newExportData() {
return new RuleChainExportData();
}
@Override @Override
public Set<EntityType> getSupportedEntityTypes() { public Set<EntityType> getSupportedEntityTypes() {
return Set.of(EntityType.RULE_CHAIN); return Set.of(EntityType.RULE_CHAIN);

5
application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/WidgetTypeExportService.java

@ -38,11 +38,6 @@ public class WidgetTypeExportService extends BaseEntityExportService<WidgetTypeI
} }
} }
@Override
protected WidgetTypeExportData newExportData() {
return new WidgetTypeExportData();
}
@Override @Override
public Set<EntityType> getSupportedEntityTypes() { public Set<EntityType> getSupportedEntityTypes() {
return Set.of(EntityType.WIDGET_TYPE); return Set.of(EntityType.WIDGET_TYPE);

5
application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/WidgetsBundleExportService.java

@ -45,11 +45,6 @@ public class WidgetsBundleExportService extends BaseEntityExportService<WidgetsB
exportData.setFqns(fqns); exportData.setFqns(fqns);
} }
@Override
protected WidgetsBundleExportData newExportData() {
return new WidgetsBundleExportData();
}
@Override @Override
public Set<EntityType> getSupportedEntityTypes() { public Set<EntityType> getSupportedEntityTypes() {
return Set.of(EntityType.WIDGETS_BUNDLE); return Set.of(EntityType.WIDGETS_BUNDLE);

3
application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java

@ -188,8 +188,7 @@ public abstract class AbstractNotificationApiTest extends AbstractControllerTest
rule.setTriggerType(triggerConfig.getTriggerType()); rule.setTriggerType(triggerConfig.getTriggerType());
rule.setTriggerConfig(triggerConfig); rule.setTriggerConfig(triggerConfig);
DefaultNotificationRuleRecipientsConfig recipientsConfig = new DefaultNotificationRuleRecipientsConfig(); DefaultNotificationRuleRecipientsConfig recipientsConfig = DefaultNotificationRuleRecipientsConfig.forTriggerType(triggerConfig.getTriggerType());
recipientsConfig.setTriggerType(triggerConfig.getTriggerType());
recipientsConfig.setTargets(DaoUtil.toUUIDs(targets)); recipientsConfig.setTargets(DaoUtil.toUUIDs(targets));
rule.setRecipientsConfig(recipientsConfig); rule.setRecipientsConfig(recipientsConfig);

8
application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java

@ -211,7 +211,6 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
notificationRule.setTriggerConfig(triggerConfig); notificationRule.setTriggerConfig(triggerConfig);
EscalatedNotificationRuleRecipientsConfig recipientsConfig = new EscalatedNotificationRuleRecipientsConfig(); EscalatedNotificationRuleRecipientsConfig recipientsConfig = new EscalatedNotificationRuleRecipientsConfig();
recipientsConfig.setTriggerType(NotificationRuleTriggerType.ALARM);
Map<Integer, List<UUID>> escalationTable = new HashMap<>(); Map<Integer, List<UUID>> escalationTable = new HashMap<>();
recipientsConfig.setEscalationTable(escalationTable); recipientsConfig.setEscalationTable(escalationTable);
Map<Integer, NotificationApiWsClient> clients = new HashMap<>(); Map<Integer, NotificationApiWsClient> clients = new HashMap<>();
@ -329,7 +328,6 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
notificationRule.setTriggerConfig(triggerConfig); notificationRule.setTriggerConfig(triggerConfig);
EscalatedNotificationRuleRecipientsConfig recipientsConfig = new EscalatedNotificationRuleRecipientsConfig(); EscalatedNotificationRuleRecipientsConfig recipientsConfig = new EscalatedNotificationRuleRecipientsConfig();
recipientsConfig.setTriggerType(NotificationRuleTriggerType.ALARM);
Map<Integer, List<UUID>> escalationTable = new HashMap<>(); Map<Integer, List<UUID>> escalationTable = new HashMap<>();
recipientsConfig.setEscalationTable(escalationTable); recipientsConfig.setEscalationTable(escalationTable);
@ -640,8 +638,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
EntityActionNotificationRuleTriggerConfig triggerConfig = new EntityActionNotificationRuleTriggerConfig(); EntityActionNotificationRuleTriggerConfig triggerConfig = new EntityActionNotificationRuleTriggerConfig();
rule.setTriggerConfig(triggerConfig); rule.setTriggerConfig(triggerConfig);
DefaultNotificationRuleRecipientsConfig recipientsConfig = new DefaultNotificationRuleRecipientsConfig(); DefaultNotificationRuleRecipientsConfig recipientsConfig = DefaultNotificationRuleRecipientsConfig.forTriggerType(NotificationRuleTriggerType.ENTITY_ACTION);
recipientsConfig.setTriggerType(NotificationRuleTriggerType.ENTITY_ACTION);
recipientsConfig.setTargets(List.of(createNotificationTarget(tenantAdminUserId).getUuidId())); recipientsConfig.setTargets(List.of(createNotificationTarget(tenantAdminUserId).getUuidId()));
rule.setRecipientsConfig(recipientsConfig); rule.setRecipientsConfig(recipientsConfig);
rule = saveNotificationRule(rule); rule = saveNotificationRule(rule);
@ -671,8 +668,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
triggerConfig.setCreated(true); triggerConfig.setCreated(true);
rule.setTriggerConfig(triggerConfig); rule.setTriggerConfig(triggerConfig);
NotificationTarget target = createNotificationTarget(tenantAdminUserId); NotificationTarget target = createNotificationTarget(tenantAdminUserId);
DefaultNotificationRuleRecipientsConfig recipientsConfig = new DefaultNotificationRuleRecipientsConfig(); DefaultNotificationRuleRecipientsConfig recipientsConfig = DefaultNotificationRuleRecipientsConfig.forTriggerType(NotificationRuleTriggerType.ENTITY_ACTION);
recipientsConfig.setTriggerType(NotificationRuleTriggerType.ENTITY_ACTION);
recipientsConfig.setTargets(List.of(target.getUuidId())); recipientsConfig.setTargets(List.of(target.getUuidId()));
rule.setRecipientsConfig(recipientsConfig); rule.setRecipientsConfig(recipientsConfig);
rule = saveNotificationRule(rule); rule = saveNotificationRule(rule);

79
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/DefaultNotificationRuleRecipientsConfig.java

@ -28,59 +28,124 @@ import java.util.UUID;
@Schema(description = "Default notification rule recipients configuration", allOf = NotificationRuleRecipientsConfig.class) @Schema(description = "Default notification rule recipients configuration", allOf = NotificationRuleRecipientsConfig.class)
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class DefaultNotificationRuleRecipientsConfig extends NotificationRuleRecipientsConfig { public abstract class DefaultNotificationRuleRecipientsConfig extends NotificationRuleRecipientsConfig {
@NotEmpty @NotEmpty
private List<UUID> targets; private List<UUID> targets;
@Override
@Schema(hidden = true)
public NotificationRuleTriggerType getTriggerType() {
return super.getTriggerType();
}
@Override @Override
public Map<Integer, List<UUID>> getTargetsTable() { public Map<Integer, List<UUID>> getTargetsTable() {
return Map.of(0, targets); return Map.of(0, targets);
} }
public static DefaultNotificationRuleRecipientsConfig forTriggerType(NotificationRuleTriggerType triggerType) {
return switch (triggerType) {
case ENTITY_ACTION -> new EntityActionRecipientsConfig();
case ALARM_COMMENT -> new AlarmCommentRecipientsConfig();
case ALARM_ASSIGNMENT -> new AlarmAssignmentRecipientsConfig();
case DEVICE_ACTIVITY -> new DeviceActivityRecipientsConfig();
case RULE_ENGINE_COMPONENT_LIFECYCLE_EVENT -> new RuleEngineComponentLifecycleEventRecipientsConfig();
case EDGE_CONNECTION -> new EdgeConnectionRecipientsConfig();
case EDGE_COMMUNICATION_FAILURE -> new EdgeCommunicationFailureRecipientsConfig();
case NEW_PLATFORM_VERSION -> new NewPlatformVersionRecipientsConfig();
case ENTITIES_LIMIT -> new EntitiesLimitRecipientsConfig();
case API_USAGE_LIMIT -> new ApiUsageLimitRecipientsConfig();
case RATE_LIMITS -> new RateLimitsRecipientsConfig();
case TASK_PROCESSING_FAILURE -> new TaskProcessingFailureRecipientsConfig();
case RESOURCES_SHORTAGE -> new ResourceShortageRecipientsConfig();
default -> throw new IllegalArgumentException("Unsupported trigger type for default recipients config: " + triggerType);
};
}
public static class EntityActionRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class EntityActionRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ENTITY_ACTION;
}
} }
public static class AlarmCommentRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class AlarmCommentRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ALARM_COMMENT;
}
} }
public static class AlarmAssignmentRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class AlarmAssignmentRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ALARM_ASSIGNMENT;
}
} }
public static class DeviceActivityRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class DeviceActivityRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.DEVICE_ACTIVITY;
}
} }
public static class RuleEngineComponentLifecycleEventRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class RuleEngineComponentLifecycleEventRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.RULE_ENGINE_COMPONENT_LIFECYCLE_EVENT;
}
} }
public static class EdgeConnectionRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class EdgeConnectionRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.EDGE_CONNECTION;
}
} }
public static class EdgeCommunicationFailureRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class EdgeCommunicationFailureRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.EDGE_COMMUNICATION_FAILURE;
}
} }
public static class NewPlatformVersionRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class NewPlatformVersionRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.NEW_PLATFORM_VERSION;
}
} }
public static class EntitiesLimitRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class EntitiesLimitRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ENTITIES_LIMIT;
}
} }
public static class ApiUsageLimitRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class ApiUsageLimitRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.API_USAGE_LIMIT;
}
} }
public static class RateLimitsRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class RateLimitsRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.RATE_LIMITS;
}
} }
public static class TaskProcessingFailureRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class TaskProcessingFailureRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.TASK_PROCESSING_FAILURE;
}
} }
public static class ResourceShortageRecipientsConfig extends DefaultNotificationRuleRecipientsConfig { public static class ResourceShortageRecipientsConfig extends DefaultNotificationRuleRecipientsConfig {
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.RESOURCES_SHORTAGE;
}
} }
} }

6
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/EscalatedNotificationRuleRecipientsConfig.java

@ -19,6 +19,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -32,6 +33,11 @@ public class EscalatedNotificationRuleRecipientsConfig extends NotificationRuleR
@NotEmpty @NotEmpty
private Map<Integer, List<UUID>> escalationTable; private Map<Integer, List<UUID>> escalationTable;
@Override
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ALARM;
}
@Override @Override
public Map<Integer, List<UUID>> getTargetsTable() { public Map<Integer, List<UUID>> getTargetsTable() {
return escalationTable; return escalationTable;

6
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/NotificationRuleRecipientsConfig.java

@ -22,7 +22,6 @@ import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping; import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType; import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType;
@ -50,7 +49,7 @@ import java.util.UUID;
@DiscriminatorMapping(value = "RESOURCES_SHORTAGE", schema = DefaultNotificationRuleRecipientsConfig.ResourceShortageRecipientsConfig.class) @DiscriminatorMapping(value = "RESOURCES_SHORTAGE", schema = DefaultNotificationRuleRecipientsConfig.ResourceShortageRecipientsConfig.class)
}) })
@JsonIgnoreProperties @JsonIgnoreProperties
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "triggerType", visible = true, include = JsonTypeInfo.As.EXISTING_PROPERTY) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "triggerType", include = JsonTypeInfo.As.EXISTING_PROPERTY)
@JsonSubTypes({ @JsonSubTypes({
@Type(name = "ALARM", value = EscalatedNotificationRuleRecipientsConfig.class), @Type(name = "ALARM", value = EscalatedNotificationRuleRecipientsConfig.class),
@Type(name = "ENTITY_ACTION", value = DefaultNotificationRuleRecipientsConfig.EntityActionRecipientsConfig.class), @Type(name = "ENTITY_ACTION", value = DefaultNotificationRuleRecipientsConfig.EntityActionRecipientsConfig.class),
@ -70,8 +69,7 @@ import java.util.UUID;
@Data @Data
public abstract class NotificationRuleRecipientsConfig implements Serializable { public abstract class NotificationRuleRecipientsConfig implements Serializable {
@NotNull public abstract NotificationRuleTriggerType getTriggerType();
private NotificationRuleTriggerType triggerType;
@JsonIgnore @JsonIgnore
public abstract Map<Integer, List<UUID>> getTargetsTable(); public abstract Map<Integer, List<UUID>> getTargetsTable();

4
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/DeviceExportData.java

@ -23,6 +23,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentials;
@Schema @Schema
@ -31,6 +32,9 @@ import org.thingsboard.server.common.data.security.DeviceCredentials;
@Data @Data
public class DeviceExportData extends EntityExportData<Device> { public class DeviceExportData extends EntityExportData<Device> {
@Override
public EntityType getEntityType() { return EntityType.DEVICE; }
@JsonProperty(index = 3) @JsonProperty(index = 3)
@JsonIgnoreProperties({"id", "deviceId", "createdTime", "version"}) @JsonIgnoreProperties({"id", "deviceId", "createdTime", "version"})
private DeviceCredentials credentials; private DeviceCredentials credentials;

115
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityExportData.java

@ -65,6 +65,7 @@ import java.util.Map;
@Type(name = "DEVICE_PROFILE", value = EntityExportData.DeviceProfileExportData.class), @Type(name = "DEVICE_PROFILE", value = EntityExportData.DeviceProfileExportData.class),
@Type(name = "ENTITY_VIEW", value = EntityExportData.EntityViewExportData.class), @Type(name = "ENTITY_VIEW", value = EntityExportData.EntityViewExportData.class),
@Type(name = "NOTIFICATION_TEMPLATE", value = EntityExportData.NotificationTemplateExportData.class), @Type(name = "NOTIFICATION_TEMPLATE", value = EntityExportData.NotificationTemplateExportData.class),
@Type(name = "NOTIFICATION_TARGET", value = EntityExportData.NotificationTargetExportData.class),
@Type(name = "NOTIFICATION_RULE", value = EntityExportData.NotificationRuleExportData.class), @Type(name = "NOTIFICATION_RULE", value = EntityExportData.NotificationRuleExportData.class),
@Type(name = "AI_MODEL", value = EntityExportData.AiModelExportData.class) @Type(name = "AI_MODEL", value = EntityExportData.AiModelExportData.class)
}) })
@ -92,7 +93,7 @@ import java.util.Map;
} }
) )
@Data @Data
public class EntityExportData<E extends ExportableEntity<? extends EntityId>> { public abstract class EntityExportData<E extends ExportableEntity<? extends EntityId>> {
public static final Comparator<EntityRelation> relationsComparator = Comparator public static final Comparator<EntityRelation> relationsComparator = Comparator
.comparing(EntityRelation::getFrom, Comparator.comparing(EntityId::getId)) .comparing(EntityRelation::getFrom, Comparator.comparing(EntityId::getId))
@ -109,9 +110,10 @@ public class EntityExportData<E extends ExportableEntity<? extends EntityId>> {
@JsonTbEntity @JsonTbEntity
@Schema(implementation = ExportableEntity.class) @Schema(implementation = ExportableEntity.class)
private E entity; private E entity;
@JsonProperty(index = 1) @JsonProperty(index = 1)
@Schema(requiredMode = Schema.RequiredMode.REQUIRED) @Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private EntityType entityType; public abstract EntityType getEntityType();
@JsonProperty(index = 100) @JsonProperty(index = 100)
@ArraySchema(schema = @Schema(implementation = EntityRelation.class)) @ArraySchema(schema = @Schema(implementation = EntityRelation.class))
@ -124,6 +126,28 @@ public class EntityExportData<E extends ExportableEntity<? extends EntityId>> {
@ArraySchema(schema = @Schema(implementation = CalculatedField.class)) @ArraySchema(schema = @Schema(implementation = CalculatedField.class))
private List<CalculatedField> calculatedFields; private List<CalculatedField> calculatedFields;
public static EntityExportData<?> newInstance(EntityType entityType) {
return switch (entityType) {
case DEVICE -> new DeviceExportData();
case RULE_CHAIN -> new RuleChainExportData();
case WIDGET_TYPE -> new WidgetTypeExportData();
case WIDGETS_BUNDLE -> new WidgetsBundleExportData();
case OTA_PACKAGE -> new OtaPackageExportData();
case CUSTOMER -> new CustomerExportData();
case TB_RESOURCE -> new TbResourceExportData();
case DASHBOARD -> new DashboardExportData();
case ASSET_PROFILE -> new AssetProfileExportData();
case ASSET -> new AssetExportData();
case DEVICE_PROFILE -> new DeviceProfileExportData();
case ENTITY_VIEW -> new EntityViewExportData();
case NOTIFICATION_TEMPLATE -> new NotificationTemplateExportData();
case NOTIFICATION_TARGET -> new NotificationTargetExportData();
case NOTIFICATION_RULE -> new NotificationRuleExportData();
case AI_MODEL -> new AiModelExportData();
default -> throw new IllegalArgumentException("Unsupported entity type: " + entityType);
};
}
public EntityExportData<E> sort() { public EntityExportData<E> sort() {
if (relations != null && !relations.isEmpty()) { if (relations != null && !relations.isEmpty()) {
relations.sort(relationsComparator); relations.sort(relationsComparator);
@ -163,26 +187,91 @@ public class EntityExportData<E extends ExportableEntity<? extends EntityId>> {
} }
@Schema @Schema
public static class CustomerExportData extends EntityExportData<Customer> {} public static class CustomerExportData extends EntityExportData<Customer> {
@Override
public EntityType getEntityType() {
return EntityType.CUSTOMER;
}
}
@Schema @Schema
public static class TbResourceExportData extends EntityExportData<TbResource> {} public static class TbResourceExportData extends EntityExportData<TbResource> {
@Override
public EntityType getEntityType() {
return EntityType.TB_RESOURCE;
}
}
@Schema @Schema
public static class DashboardExportData extends EntityExportData<Dashboard> {} public static class DashboardExportData extends EntityExportData<Dashboard> {
@Override
public EntityType getEntityType() {
return EntityType.DASHBOARD;
}
}
@Schema @Schema
public static class AssetProfileExportData extends EntityExportData<AssetProfile> {} public static class AssetProfileExportData extends EntityExportData<AssetProfile> {
@Override
public EntityType getEntityType() {
return EntityType.ASSET_PROFILE;
}
}
@Schema @Schema
public static class AssetExportData extends EntityExportData<Asset> {} public static class AssetExportData extends EntityExportData<Asset> {
@Override
public EntityType getEntityType() {
return EntityType.ASSET;
}
}
@Schema @Schema
public static class DeviceProfileExportData extends EntityExportData<DeviceProfile> {} public static class DeviceProfileExportData extends EntityExportData<DeviceProfile> {
@Override
public EntityType getEntityType() {
return EntityType.DEVICE_PROFILE;
}
}
@Schema @Schema
public static class EntityViewExportData extends EntityExportData<EntityView> {} public static class EntityViewExportData extends EntityExportData<EntityView> {
@Override
public EntityType getEntityType() {
return EntityType.ENTITY_VIEW;
}
}
@Schema @Schema
public static class NotificationTemplateExportData extends EntityExportData<NotificationTemplate> {} public static class NotificationTemplateExportData extends EntityExportData<NotificationTemplate> {
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_TEMPLATE;
}
}
@Schema @Schema
public static class NotificationTargetExportData extends EntityExportData<NotificationTarget> {} public static class NotificationTargetExportData extends EntityExportData<NotificationTarget> {
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_TARGET;
}
}
@Schema @Schema
public static class NotificationRuleExportData extends EntityExportData<NotificationRule> {} public static class NotificationRuleExportData extends EntityExportData<NotificationRule> {
@Override
public EntityType getEntityType() {
return EntityType.NOTIFICATION_RULE;
}
}
@Schema @Schema
public static class AiModelExportData extends EntityExportData<AiModel> {} public static class AiModelExportData extends EntityExportData<AiModel> {
@Override
public EntityType getEntityType() {
return EntityType.AI_MODEL;
}
}
} }

4
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/OtaPackageExportData.java

@ -18,12 +18,16 @@ package org.thingsboard.server.common.data.sync.ie;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.OtaPackage; import org.thingsboard.server.common.data.OtaPackage;
@Schema @Schema
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class OtaPackageExportData extends EntityExportData<OtaPackage> { public class OtaPackageExportData extends EntityExportData<OtaPackage> {
@Override
public EntityType getEntityType() { return EntityType.OTA_PACKAGE; }
/* /*
* OtaPackage is not a versioned entity; its 'version' field is part of the domain model (not used for optimistic locking) * OtaPackage is not a versioned entity; its 'version' field is part of the domain model (not used for optimistic locking)
* We override both methods to ensure 'version' is not ignored during (de)serialization. * We override both methods to ensure 'version' is not ignored during (de)serialization.

4
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/RuleChainExportData.java

@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainMetaData;
@ -30,6 +31,9 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData;
@Data @Data
public class RuleChainExportData extends EntityExportData<RuleChain> { public class RuleChainExportData extends EntityExportData<RuleChain> {
@Override
public EntityType getEntityType() { return EntityType.RULE_CHAIN; }
@JsonProperty(index = 3) @JsonProperty(index = 3)
@JsonIgnoreProperties({"ruleChainId", "version"}) @JsonIgnoreProperties({"ruleChainId", "version"})
private RuleChainMetaData metaData; private RuleChainMetaData metaData;

4
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/WidgetTypeExportData.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.sync.ie;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.widget.WidgetTypeDetails; import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
@Schema @Schema
@ -25,4 +26,7 @@ import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class WidgetTypeExportData extends EntityExportData<WidgetTypeDetails> { public class WidgetTypeExportData extends EntityExportData<WidgetTypeDetails> {
@Override
public EntityType getEntityType() { return EntityType.WIDGET_TYPE; }
} }

4
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/WidgetsBundleExportData.java

@ -22,6 +22,7 @@ import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.data.widget.WidgetsBundle;
import java.util.ArrayList; import java.util.ArrayList;
@ -32,6 +33,9 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class WidgetsBundleExportData extends EntityExportData<WidgetsBundle> { public class WidgetsBundleExportData extends EntityExportData<WidgetsBundle> {
@Override
public EntityType getEntityType() { return EntityType.WIDGETS_BUNDLE; }
@ArraySchema(arraySchema = @Schema(description = "List of widgets in the bundle"), schema = @Schema(implementation = JsonNode.class)) @ArraySchema(arraySchema = @Schema(description = "List of widgets in the bundle"), schema = @Schema(implementation = JsonNode.class))
@JsonProperty(index = 3) @JsonProperty(index = 3)
private List<ObjectNode> widgets; private List<ObjectNode> widgets;

4
dao/src/main/java/org/thingsboard/server/dao/notification/DefaultNotifications.java

@ -511,12 +511,10 @@ public class DefaultNotifications {
rule.setTriggerConfig(defaultRule.getTriggerConfig()); rule.setTriggerConfig(defaultRule.getTriggerConfig());
if (rule.getTriggerType() == NotificationRuleTriggerType.ALARM) { if (rule.getTriggerType() == NotificationRuleTriggerType.ALARM) {
EscalatedNotificationRuleRecipientsConfig recipientsConfig = new EscalatedNotificationRuleRecipientsConfig(); EscalatedNotificationRuleRecipientsConfig recipientsConfig = new EscalatedNotificationRuleRecipientsConfig();
recipientsConfig.setTriggerType(rule.getTriggerType());
recipientsConfig.setEscalationTable(Map.of(0, toUUIDs(List.of(targets)))); recipientsConfig.setEscalationTable(Map.of(0, toUUIDs(List.of(targets))));
rule.setRecipientsConfig(recipientsConfig); rule.setRecipientsConfig(recipientsConfig);
} else { } else {
DefaultNotificationRuleRecipientsConfig recipientsConfig = new DefaultNotificationRuleRecipientsConfig(); DefaultNotificationRuleRecipientsConfig recipientsConfig = DefaultNotificationRuleRecipientsConfig.forTriggerType(rule.getTriggerType());
recipientsConfig.setTriggerType(rule.getTriggerType());
recipientsConfig.setTargets(toUUIDs(List.of(targets))); recipientsConfig.setTargets(toUUIDs(List.of(targets)));
rule.setRecipientsConfig(recipientsConfig); rule.setRecipientsConfig(recipientsConfig);
} }

Loading…
Cancel
Save