From ec4200d735ed19286c6ac922ce9dfc4a2fa8c7ce Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Fri, 13 Oct 2023 11:51:02 +0300 Subject: [PATCH] Refactoring after final review --- .../processor/alarm/BaseAlarmProcessor.java | 6 ++-- .../asset/AssetProfileEdgeProcessor.java | 7 ++-- .../asset/BaseAssetProfileProcessor.java | 7 ++-- .../dashboard/BaseDashboardProcessor.java | 35 ++++++++++++++++--- .../dashboard/DashboardEdgeProcessor.java | 2 +- .../device/BaseDeviceProfileProcessor.java | 7 ++-- .../device/DeviceProfileEdgeProcessor.java | 7 ++-- .../server/edge/AbstractEdgeTest.java | 17 +++++---- .../server/edge/AssetProfileEdgeTest.java | 2 -- common/edge-api/src/main/proto/edge.proto | 2 +- .../common/util/JacksonUtilTest.java | 8 ++--- 11 files changed, 64 insertions(+), 36 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java index b89c2d4dc4..e81b7916f6 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java @@ -56,9 +56,9 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor { if (alarm == null) { throw new RuntimeException("[{" + tenantId + "}] alarmUpdateMsg {" + alarmUpdateMsg + "} cannot be converted to alarm"); } - EntityType entityType = isEdgeProtoDeprecated ? EntityType.valueOf(alarmUpdateMsg.getOriginatorType()) - : alarm.getOriginator().getEntityType(); - EntityId originatorId = getAlarmOriginator(tenantId, alarmUpdateMsg.getOriginatorName(), entityType); + EntityId originatorId = isEdgeProtoDeprecated + ? getAlarmOriginator(tenantId, alarmUpdateMsg.getOriginatorName(), EntityType.valueOf(alarmUpdateMsg.getOriginatorType())) + : alarm.getOriginator(); if (originatorId == null) { log.warn("[{}] Originator not found for the alarm msg {}", tenantId, alarmUpdateMsg); return Futures.immediateFuture(null); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java index b7b6690a87..544cf46690 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java @@ -129,17 +129,16 @@ public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor { } @Override - protected void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile) { - // do nothing on cloud + protected void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile, RuleChainId ruleChainId) { + assetProfile.setDefaultRuleChainId(ruleChainId); } @Override protected void setDefaultEdgeRuleChainId(AssetProfile assetProfile, RuleChainId ruleChainId, AssetProfileUpdateMsg assetProfileUpdateMsg, boolean isEdgeVersionDeprecated) { UUID defaultEdgeRuleChainUUID = isEdgeVersionDeprecated ? safeGetUUID(assetProfileUpdateMsg.getDefaultRuleChainIdMSB(), assetProfileUpdateMsg.getDefaultRuleChainIdLSB()) - : assetProfile.getDefaultRuleChainId() != null ? assetProfile.getDefaultRuleChainId().getId() : null; + : ruleChainId != null ? ruleChainId.getId() : null; assetProfile.setDefaultEdgeRuleChainId(defaultEdgeRuleChainUUID != null ? new RuleChainId(defaultEdgeRuleChainUUID) : null); - assetProfile.setDefaultRuleChainId(ruleChainId); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProfileProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProfileProcessor.java index d829df4a32..2712881a30 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProfileProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProfileProcessor.java @@ -61,8 +61,9 @@ public abstract class BaseAssetProfileProcessor extends BaseEdgeProcessor { } assetProfile.setName(assetProfileName); - setDefaultRuleChainId(tenantId, assetProfile); - setDefaultEdgeRuleChainId(assetProfile, created ? null : assetProfileById.getDefaultRuleChainId(), assetProfileUpdateMsg, isEdgeProtoDeprecated); + RuleChainId ruleChainId = assetProfile.getDefaultRuleChainId(); + setDefaultRuleChainId(tenantId, assetProfile, created ? null : assetProfileById.getDefaultRuleChainId()); + setDefaultEdgeRuleChainId(assetProfile, ruleChainId, assetProfileUpdateMsg, isEdgeProtoDeprecated); setDefaultDashboardId(tenantId, created ? null : assetProfileById.getDefaultDashboardId(), assetProfile, assetProfileUpdateMsg, isEdgeProtoDeprecated); assetProfileValidator.validate(assetProfile, AssetProfile::getTenantId); @@ -92,7 +93,7 @@ public abstract class BaseAssetProfileProcessor extends BaseEdgeProcessor { return assetProfile; } - protected abstract void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile); + protected abstract void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile, RuleChainId ruleChainId); protected abstract void setDefaultEdgeRuleChainId(AssetProfile assetProfile, RuleChainId ruleChainId, AssetProfileUpdateMsg assetProfileUpdateMsg, boolean isEdgeVersionDeprecated); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/BaseDashboardProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/BaseDashboardProcessor.java index 15c446af67..823de9a58b 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/BaseDashboardProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/BaseDashboardProcessor.java @@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.ShortCustomerInfo; +import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg; @@ -31,7 +32,7 @@ import java.util.Set; @Slf4j public abstract class BaseDashboardProcessor extends BaseEdgeProcessor { - protected boolean saveOrUpdateDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg, boolean isEdgeProtoDeprecated) { + protected boolean saveOrUpdateDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg, boolean isEdgeProtoDeprecated, CustomerId customerId) { boolean created = false; Dashboard dashboard = isEdgeProtoDeprecated ? createDashboard(tenantId, dashboardId, dashboardUpdateMsg) @@ -39,24 +40,39 @@ public abstract class BaseDashboardProcessor extends BaseEdgeProcessor { if (dashboard == null) { throw new RuntimeException("[{" + tenantId + "}] dashboardUpdateMsg {" + dashboardUpdateMsg + "} cannot be converted to dashboard"); } + Set assignedCustomers = null; Dashboard dashboardById = dashboardService.findDashboardById(tenantId, dashboardId); if (dashboardById == null) { created = true; dashboard.setId(null); } else { dashboard.setId(dashboardId); + assignedCustomers = filterNonExistingCustomers(tenantId, dashboardById.getAssignedCustomers()); } dashboardValidator.validate(dashboard, Dashboard::getTenantId); if (created) { dashboard.setId(dashboardId); } - Dashboard savedDashboard = dashboardService.saveDashboard(dashboard, false); - if (savedDashboard.getAssignedCustomers() != null && savedDashboard.getAssignedCustomers().isEmpty()) { - for (ShortCustomerInfo assignedCustomer : savedDashboard.getAssignedCustomers()) { - dashboardService.unassignDashboardFromCustomer(tenantId, savedDashboard.getId(), assignedCustomer.getCustomerId()); + Set msgAssignedCustomers = filterNonExistingCustomers(tenantId, dashboard.getAssignedCustomers()); + if (msgAssignedCustomers != null) { + if (assignedCustomers == null) { + assignedCustomers = msgAssignedCustomers; + } else { + assignedCustomers.addAll(msgAssignedCustomers); } } + dashboard.setAssignedCustomers(assignedCustomers); + Dashboard savedDashboard = dashboardService.saveDashboard(dashboard, false); + if (msgAssignedCustomers != null && !msgAssignedCustomers.isEmpty()) { + for (ShortCustomerInfo assignedCustomer : msgAssignedCustomers) { + if (assignedCustomer.getCustomerId().equals(customerId)) { + dashboardService.assignDashboardToCustomer(tenantId, savedDashboard.getId(), assignedCustomer.getCustomerId()); + } + } + } else { + unassignCustomersFromDashboard(tenantId, savedDashboard, customerId); + } return created; } @@ -80,6 +96,15 @@ public abstract class BaseDashboardProcessor extends BaseEdgeProcessor { return dashboard; } + private void unassignCustomersFromDashboard(TenantId tenantId, Dashboard dashboard, CustomerId customerId) { + if (dashboard.getAssignedCustomers() != null && !dashboard.getAssignedCustomers().isEmpty()) { + for (ShortCustomerInfo assignedCustomer : dashboard.getAssignedCustomers()) { + if (assignedCustomer.getCustomerId().equals(customerId)) { + dashboardService.unassignDashboardFromCustomer(tenantId, dashboard.getId(), assignedCustomer.getCustomerId()); + } + } + } + } protected abstract Set filterNonExistingCustomers(TenantId tenantId, Set assignedCustomers); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java index 630416f775..a7e7cdbc12 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java @@ -80,7 +80,7 @@ public class DashboardEdgeProcessor extends BaseDashboardProcessor { private void saveOrUpdateDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg, Edge edge, EdgeVersion edgeVersion) { boolean created = super.saveOrUpdateDashboard(tenantId, dashboardId, dashboardUpdateMsg, - EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)); + EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion), edge.getCustomerId()); if (created) { createRelationFromEdge(tenantId, edge.getId(), dashboardId); pushDashboardCreatedEventToRuleEngine(tenantId, edge, dashboardId); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProfileProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProfileProcessor.java index 38d781fb13..27ed9eb3c9 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProfileProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProfileProcessor.java @@ -73,8 +73,9 @@ public abstract class BaseDeviceProfileProcessor extends BaseEdgeProcessor { } deviceProfile.setName(deviceProfileName); - setDefaultRuleChainId(tenantId, deviceProfile); - setDefaultEdgeRuleChainId(deviceProfile, created ? null : deviceProfileById.getDefaultRuleChainId(), deviceProfileUpdateMsg, isEdgeVersionProtoDeprecated); + RuleChainId ruleChainId = deviceProfile.getDefaultRuleChainId(); + setDefaultRuleChainId(tenantId, deviceProfile, created ? null : deviceProfileById.getDefaultRuleChainId()); + setDefaultEdgeRuleChainId(deviceProfile, ruleChainId, deviceProfileUpdateMsg, isEdgeVersionProtoDeprecated); setDefaultDashboardId(tenantId, created ? null : deviceProfileById.getDefaultDashboardId(), deviceProfile, deviceProfileUpdateMsg, isEdgeVersionProtoDeprecated); deviceProfileValidator.validate(deviceProfile, DeviceProfile::getTenantId); @@ -124,7 +125,7 @@ public abstract class BaseDeviceProfileProcessor extends BaseEdgeProcessor { return deviceProfile; } - protected abstract void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile); + protected abstract void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile, RuleChainId ruleChainId); protected abstract void setDefaultEdgeRuleChainId(DeviceProfile deviceProfile, RuleChainId ruleChainId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, boolean isEdgeVersionDeprecated); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java index 419b7f90c8..3814992491 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java @@ -129,17 +129,16 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor { } @Override - protected void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile) { - // do nothing on cloud + protected void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile, RuleChainId ruleChainId) { + deviceProfile.setDefaultRuleChainId(ruleChainId); } @Override protected void setDefaultEdgeRuleChainId(DeviceProfile deviceProfile, RuleChainId ruleChainId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, boolean isEdgeVersionDeprecated) { UUID defaultEdgeRuleChainUUID = isEdgeVersionDeprecated ? safeGetUUID(deviceProfileUpdateMsg.getDefaultRuleChainIdMSB(), deviceProfileUpdateMsg.getDefaultRuleChainIdLSB()) - : deviceProfile.getDefaultRuleChainId() != null ? deviceProfile.getDefaultRuleChainId().getId() : null; + : ruleChainId != null ? ruleChainId.getId() : null; deviceProfile.setDefaultEdgeRuleChainId(defaultEdgeRuleChainUUID != null ? new RuleChainId(defaultEdgeRuleChainUUID) : null); - deviceProfile.setDefaultRuleChainId(ruleChainId); } @Override diff --git a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java index b2bce41bf6..88aead4c7d 100644 --- a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java @@ -449,6 +449,9 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest { if (adminSettings.getKey().equals("connectivity")) { validateConnectivityAdminSettings(adminSettings); } + if (adminSettings.getKey().equals("jwt")) { + validateJwtAdminSettings(adminSettings); + } } } @@ -467,12 +470,14 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest { private void validateConnectivityAdminSettings(AdminSettings adminSettings) { JsonNode jsonNode = adminSettings.getJsonValue(); - Assert.assertNotNull(jsonNode.get("http")); - Assert.assertNotNull(jsonNode.get("https")); - Assert.assertNotNull(jsonNode.get("mqtt")); - Assert.assertNotNull(jsonNode.get("mqtts")); - Assert.assertNotNull(jsonNode.get("coap")); - Assert.assertNotNull(jsonNode.get("coaps")); + Assert.assertNotNull(jsonNode.get("tokenExpirationTime")); + Assert.assertNotNull(jsonNode.get("refreshTokenExpTime")); + Assert.assertNotNull(jsonNode.get("tokenIssuer")); + Assert.assertNotNull(jsonNode.get("tokenSigningKey")); + } + + private void validateJwtAdminSettings(AdminSettings adminSettings) { + Assert.assertNotNull(adminSettings.getJsonValue().get("baseUrl")); } private void validateAssetProfiles(int expectedMsgCnt) throws Exception { diff --git a/application/src/test/java/org/thingsboard/server/edge/AssetProfileEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AssetProfileEdgeTest.java index 7c93a4440d..7ffff29ed7 100644 --- a/application/src/test/java/org/thingsboard/server/edge/AssetProfileEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/AssetProfileEdgeTest.java @@ -16,7 +16,6 @@ package org.thingsboard.server.edge; import com.google.protobuf.AbstractMessage; -import com.google.protobuf.ByteString; import org.junit.Assert; import org.junit.Test; import org.thingsboard.common.util.JacksonUtil; @@ -31,7 +30,6 @@ import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.gen.edge.v1.UplinkMsg; import org.thingsboard.server.gen.edge.v1.UplinkResponseMsg; -import java.nio.charset.StandardCharsets; import java.util.Optional; import java.util.UUID; diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto index 7d5c57928f..b42b3f08fa 100644 --- a/common/edge-api/src/main/proto/edge.proto +++ b/common/edge-api/src/main/proto/edge.proto @@ -311,7 +311,7 @@ message AlarmUpdateMsg { string name = 4 [deprecated = true]; string type = 5 [deprecated = true]; string originatorType = 6 [deprecated = true]; - string originatorName = 7; + string originatorName = 7 [deprecated = true]; string severity = 8 [deprecated = true]; string status = 9 [deprecated = true]; int64 startTs = 10 [deprecated = true]; diff --git a/common/util/src/test/java/org/thingsboard/common/util/JacksonUtilTest.java b/common/util/src/test/java/org/thingsboard/common/util/JacksonUtilTest.java index 808fb22834..229ba4187d 100644 --- a/common/util/src/test/java/org/thingsboard/common/util/JacksonUtilTest.java +++ b/common/util/src/test/java/org/thingsboard/common/util/JacksonUtilTest.java @@ -15,7 +15,6 @@ */ package org.thingsboard.common.util; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.Assert; @@ -28,7 +27,7 @@ import java.util.UUID; public class JacksonUtilTest { @Test - public void allow_unquoted_field_mapper_test() { + public void allowUnquotedFieldMapperTest() { String data = "{data: 123}"; JsonNode actualResult = JacksonUtil.toJsonNode(data, JacksonUtil.ALLOW_UNQUOTED_FIELD_NAMES_MAPPER); // should be: {"data": 123} ObjectNode expectedResult = JacksonUtil.newObjectNode(); @@ -38,14 +37,15 @@ public class JacksonUtilTest { } @Test - public void fail_on_unknown_properties_edge_mapper_test() throws JsonProcessingException { + public void failOnUnknownPropertiesMapperTest() { Asset asset = new Asset(); asset.setId(new AssetId(UUID.randomUUID())); asset.setName("Test"); asset.setType("type"); String serializedAsset = JacksonUtil.toString(asset); - JsonNode jsonNode = JacksonUtil.IGNORE_UNKNOWN_PROPERTIES_JSON_MAPPER.readTree(serializedAsset); + JsonNode jsonNode = JacksonUtil.toJsonNode(serializedAsset); // case: add new field to serialized Asset string and check for backward compatibility with original Asset object + Assert.assertNotNull(jsonNode); ((ObjectNode) jsonNode).put("test", (String) null); serializedAsset = JacksonUtil.toString(jsonNode); // deserialize with FAIL_ON_UNKNOWN_PROPERTIES = false