Refactoring after final review

This commit is contained in:
Andrii Landiak 2023-10-13 11:51:02 +03:00
parent caf2f29693
commit ec4200d735
11 changed files with 64 additions and 36 deletions

View File

@ -56,9 +56,9 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor {
if (alarm == null) { if (alarm == null) {
throw new RuntimeException("[{" + tenantId + "}] alarmUpdateMsg {" + alarmUpdateMsg + "} cannot be converted to alarm"); throw new RuntimeException("[{" + tenantId + "}] alarmUpdateMsg {" + alarmUpdateMsg + "} cannot be converted to alarm");
} }
EntityType entityType = isEdgeProtoDeprecated ? EntityType.valueOf(alarmUpdateMsg.getOriginatorType()) EntityId originatorId = isEdgeProtoDeprecated
: alarm.getOriginator().getEntityType(); ? getAlarmOriginator(tenantId, alarmUpdateMsg.getOriginatorName(), EntityType.valueOf(alarmUpdateMsg.getOriginatorType()))
EntityId originatorId = getAlarmOriginator(tenantId, alarmUpdateMsg.getOriginatorName(), entityType); : alarm.getOriginator();
if (originatorId == null) { if (originatorId == null) {
log.warn("[{}] Originator not found for the alarm msg {}", tenantId, alarmUpdateMsg); log.warn("[{}] Originator not found for the alarm msg {}", tenantId, alarmUpdateMsg);
return Futures.immediateFuture(null); return Futures.immediateFuture(null);

View File

@ -129,17 +129,16 @@ public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor {
} }
@Override @Override
protected void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile) { protected void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile, RuleChainId ruleChainId) {
// do nothing on cloud assetProfile.setDefaultRuleChainId(ruleChainId);
} }
@Override @Override
protected void setDefaultEdgeRuleChainId(AssetProfile assetProfile, RuleChainId ruleChainId, AssetProfileUpdateMsg assetProfileUpdateMsg, boolean isEdgeVersionDeprecated) { protected void setDefaultEdgeRuleChainId(AssetProfile assetProfile, RuleChainId ruleChainId, AssetProfileUpdateMsg assetProfileUpdateMsg, boolean isEdgeVersionDeprecated) {
UUID defaultEdgeRuleChainUUID = isEdgeVersionDeprecated UUID defaultEdgeRuleChainUUID = isEdgeVersionDeprecated
? safeGetUUID(assetProfileUpdateMsg.getDefaultRuleChainIdMSB(), assetProfileUpdateMsg.getDefaultRuleChainIdLSB()) ? 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.setDefaultEdgeRuleChainId(defaultEdgeRuleChainUUID != null ? new RuleChainId(defaultEdgeRuleChainUUID) : null);
assetProfile.setDefaultRuleChainId(ruleChainId);
} }
@Override @Override

View File

@ -61,8 +61,9 @@ public abstract class BaseAssetProfileProcessor extends BaseEdgeProcessor {
} }
assetProfile.setName(assetProfileName); assetProfile.setName(assetProfileName);
setDefaultRuleChainId(tenantId, assetProfile); RuleChainId ruleChainId = assetProfile.getDefaultRuleChainId();
setDefaultEdgeRuleChainId(assetProfile, created ? null : assetProfileById.getDefaultRuleChainId(), assetProfileUpdateMsg, isEdgeProtoDeprecated); setDefaultRuleChainId(tenantId, assetProfile, created ? null : assetProfileById.getDefaultRuleChainId());
setDefaultEdgeRuleChainId(assetProfile, ruleChainId, assetProfileUpdateMsg, isEdgeProtoDeprecated);
setDefaultDashboardId(tenantId, created ? null : assetProfileById.getDefaultDashboardId(), assetProfile, assetProfileUpdateMsg, isEdgeProtoDeprecated); setDefaultDashboardId(tenantId, created ? null : assetProfileById.getDefaultDashboardId(), assetProfile, assetProfileUpdateMsg, isEdgeProtoDeprecated);
assetProfileValidator.validate(assetProfile, AssetProfile::getTenantId); assetProfileValidator.validate(assetProfile, AssetProfile::getTenantId);
@ -92,7 +93,7 @@ public abstract class BaseAssetProfileProcessor extends BaseEdgeProcessor {
return assetProfile; 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); protected abstract void setDefaultEdgeRuleChainId(AssetProfile assetProfile, RuleChainId ruleChainId, AssetProfileUpdateMsg assetProfileUpdateMsg, boolean isEdgeVersionDeprecated);

View File

@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.ShortCustomerInfo; 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.DashboardId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg; import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
@ -31,7 +32,7 @@ import java.util.Set;
@Slf4j @Slf4j
public abstract class BaseDashboardProcessor extends BaseEdgeProcessor { 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; boolean created = false;
Dashboard dashboard = isEdgeProtoDeprecated Dashboard dashboard = isEdgeProtoDeprecated
? createDashboard(tenantId, dashboardId, dashboardUpdateMsg) ? createDashboard(tenantId, dashboardId, dashboardUpdateMsg)
@ -39,24 +40,39 @@ public abstract class BaseDashboardProcessor extends BaseEdgeProcessor {
if (dashboard == null) { if (dashboard == null) {
throw new RuntimeException("[{" + tenantId + "}] dashboardUpdateMsg {" + dashboardUpdateMsg + "} cannot be converted to dashboard"); throw new RuntimeException("[{" + tenantId + "}] dashboardUpdateMsg {" + dashboardUpdateMsg + "} cannot be converted to dashboard");
} }
Set<ShortCustomerInfo> assignedCustomers = null;
Dashboard dashboardById = dashboardService.findDashboardById(tenantId, dashboardId); Dashboard dashboardById = dashboardService.findDashboardById(tenantId, dashboardId);
if (dashboardById == null) { if (dashboardById == null) {
created = true; created = true;
dashboard.setId(null); dashboard.setId(null);
} else { } else {
dashboard.setId(dashboardId); dashboard.setId(dashboardId);
assignedCustomers = filterNonExistingCustomers(tenantId, dashboardById.getAssignedCustomers());
} }
dashboardValidator.validate(dashboard, Dashboard::getTenantId); dashboardValidator.validate(dashboard, Dashboard::getTenantId);
if (created) { if (created) {
dashboard.setId(dashboardId); dashboard.setId(dashboardId);
} }
Dashboard savedDashboard = dashboardService.saveDashboard(dashboard, false); Set<ShortCustomerInfo> msgAssignedCustomers = filterNonExistingCustomers(tenantId, dashboard.getAssignedCustomers());
if (savedDashboard.getAssignedCustomers() != null && savedDashboard.getAssignedCustomers().isEmpty()) { if (msgAssignedCustomers != null) {
for (ShortCustomerInfo assignedCustomer : savedDashboard.getAssignedCustomers()) { if (assignedCustomers == null) {
dashboardService.unassignDashboardFromCustomer(tenantId, savedDashboard.getId(), assignedCustomer.getCustomerId()); 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; return created;
} }
@ -80,6 +96,15 @@ public abstract class BaseDashboardProcessor extends BaseEdgeProcessor {
return dashboard; 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<ShortCustomerInfo> filterNonExistingCustomers(TenantId tenantId, Set<ShortCustomerInfo> assignedCustomers); protected abstract Set<ShortCustomerInfo> filterNonExistingCustomers(TenantId tenantId, Set<ShortCustomerInfo> assignedCustomers);
} }

View File

@ -80,7 +80,7 @@ public class DashboardEdgeProcessor extends BaseDashboardProcessor {
private void saveOrUpdateDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg, Edge edge, EdgeVersion edgeVersion) { private void saveOrUpdateDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg, Edge edge, EdgeVersion edgeVersion) {
boolean created = super.saveOrUpdateDashboard(tenantId, dashboardId, dashboardUpdateMsg, boolean created = super.saveOrUpdateDashboard(tenantId, dashboardId, dashboardUpdateMsg,
EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)); EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion), edge.getCustomerId());
if (created) { if (created) {
createRelationFromEdge(tenantId, edge.getId(), dashboardId); createRelationFromEdge(tenantId, edge.getId(), dashboardId);
pushDashboardCreatedEventToRuleEngine(tenantId, edge, dashboardId); pushDashboardCreatedEventToRuleEngine(tenantId, edge, dashboardId);

View File

@ -73,8 +73,9 @@ public abstract class BaseDeviceProfileProcessor extends BaseEdgeProcessor {
} }
deviceProfile.setName(deviceProfileName); deviceProfile.setName(deviceProfileName);
setDefaultRuleChainId(tenantId, deviceProfile); RuleChainId ruleChainId = deviceProfile.getDefaultRuleChainId();
setDefaultEdgeRuleChainId(deviceProfile, created ? null : deviceProfileById.getDefaultRuleChainId(), deviceProfileUpdateMsg, isEdgeVersionProtoDeprecated); setDefaultRuleChainId(tenantId, deviceProfile, created ? null : deviceProfileById.getDefaultRuleChainId());
setDefaultEdgeRuleChainId(deviceProfile, ruleChainId, deviceProfileUpdateMsg, isEdgeVersionProtoDeprecated);
setDefaultDashboardId(tenantId, created ? null : deviceProfileById.getDefaultDashboardId(), deviceProfile, deviceProfileUpdateMsg, isEdgeVersionProtoDeprecated); setDefaultDashboardId(tenantId, created ? null : deviceProfileById.getDefaultDashboardId(), deviceProfile, deviceProfileUpdateMsg, isEdgeVersionProtoDeprecated);
deviceProfileValidator.validate(deviceProfile, DeviceProfile::getTenantId); deviceProfileValidator.validate(deviceProfile, DeviceProfile::getTenantId);
@ -124,7 +125,7 @@ public abstract class BaseDeviceProfileProcessor extends BaseEdgeProcessor {
return deviceProfile; 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); protected abstract void setDefaultEdgeRuleChainId(DeviceProfile deviceProfile, RuleChainId ruleChainId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, boolean isEdgeVersionDeprecated);

View File

@ -129,17 +129,16 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor {
} }
@Override @Override
protected void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile) { protected void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile, RuleChainId ruleChainId) {
// do nothing on cloud deviceProfile.setDefaultRuleChainId(ruleChainId);
} }
@Override @Override
protected void setDefaultEdgeRuleChainId(DeviceProfile deviceProfile, RuleChainId ruleChainId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, boolean isEdgeVersionDeprecated) { protected void setDefaultEdgeRuleChainId(DeviceProfile deviceProfile, RuleChainId ruleChainId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, boolean isEdgeVersionDeprecated) {
UUID defaultEdgeRuleChainUUID = isEdgeVersionDeprecated UUID defaultEdgeRuleChainUUID = isEdgeVersionDeprecated
? safeGetUUID(deviceProfileUpdateMsg.getDefaultRuleChainIdMSB(), deviceProfileUpdateMsg.getDefaultRuleChainIdLSB()) ? 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.setDefaultEdgeRuleChainId(defaultEdgeRuleChainUUID != null ? new RuleChainId(defaultEdgeRuleChainUUID) : null);
deviceProfile.setDefaultRuleChainId(ruleChainId);
} }
@Override @Override

View File

@ -449,6 +449,9 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
if (adminSettings.getKey().equals("connectivity")) { if (adminSettings.getKey().equals("connectivity")) {
validateConnectivityAdminSettings(adminSettings); validateConnectivityAdminSettings(adminSettings);
} }
if (adminSettings.getKey().equals("jwt")) {
validateJwtAdminSettings(adminSettings);
}
} }
} }
@ -467,12 +470,14 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
private void validateConnectivityAdminSettings(AdminSettings adminSettings) { private void validateConnectivityAdminSettings(AdminSettings adminSettings) {
JsonNode jsonNode = adminSettings.getJsonValue(); JsonNode jsonNode = adminSettings.getJsonValue();
Assert.assertNotNull(jsonNode.get("http")); Assert.assertNotNull(jsonNode.get("tokenExpirationTime"));
Assert.assertNotNull(jsonNode.get("https")); Assert.assertNotNull(jsonNode.get("refreshTokenExpTime"));
Assert.assertNotNull(jsonNode.get("mqtt")); Assert.assertNotNull(jsonNode.get("tokenIssuer"));
Assert.assertNotNull(jsonNode.get("mqtts")); Assert.assertNotNull(jsonNode.get("tokenSigningKey"));
Assert.assertNotNull(jsonNode.get("coap")); }
Assert.assertNotNull(jsonNode.get("coaps"));
private void validateJwtAdminSettings(AdminSettings adminSettings) {
Assert.assertNotNull(adminSettings.getJsonValue().get("baseUrl"));
} }
private void validateAssetProfiles(int expectedMsgCnt) throws Exception { private void validateAssetProfiles(int expectedMsgCnt) throws Exception {

View File

@ -16,7 +16,6 @@
package org.thingsboard.server.edge; package org.thingsboard.server.edge;
import com.google.protobuf.AbstractMessage; import com.google.protobuf.AbstractMessage;
import com.google.protobuf.ByteString;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.thingsboard.common.util.JacksonUtil; 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.UplinkMsg;
import org.thingsboard.server.gen.edge.v1.UplinkResponseMsg; import org.thingsboard.server.gen.edge.v1.UplinkResponseMsg;
import java.nio.charset.StandardCharsets;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;

View File

@ -311,7 +311,7 @@ message AlarmUpdateMsg {
string name = 4 [deprecated = true]; string name = 4 [deprecated = true];
string type = 5 [deprecated = true]; string type = 5 [deprecated = true];
string originatorType = 6 [deprecated = true]; string originatorType = 6 [deprecated = true];
string originatorName = 7; string originatorName = 7 [deprecated = true];
string severity = 8 [deprecated = true]; string severity = 8 [deprecated = true];
string status = 9 [deprecated = true]; string status = 9 [deprecated = true];
int64 startTs = 10 [deprecated = true]; int64 startTs = 10 [deprecated = true];

View File

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.common.util; package org.thingsboard.common.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import org.junit.Assert; import org.junit.Assert;
@ -28,7 +27,7 @@ import java.util.UUID;
public class JacksonUtilTest { public class JacksonUtilTest {
@Test @Test
public void allow_unquoted_field_mapper_test() { public void allowUnquotedFieldMapperTest() {
String data = "{data: 123}"; String data = "{data: 123}";
JsonNode actualResult = JacksonUtil.toJsonNode(data, JacksonUtil.ALLOW_UNQUOTED_FIELD_NAMES_MAPPER); // should be: {"data": 123} JsonNode actualResult = JacksonUtil.toJsonNode(data, JacksonUtil.ALLOW_UNQUOTED_FIELD_NAMES_MAPPER); // should be: {"data": 123}
ObjectNode expectedResult = JacksonUtil.newObjectNode(); ObjectNode expectedResult = JacksonUtil.newObjectNode();
@ -38,14 +37,15 @@ public class JacksonUtilTest {
} }
@Test @Test
public void fail_on_unknown_properties_edge_mapper_test() throws JsonProcessingException { public void failOnUnknownPropertiesMapperTest() {
Asset asset = new Asset(); Asset asset = new Asset();
asset.setId(new AssetId(UUID.randomUUID())); asset.setId(new AssetId(UUID.randomUUID()));
asset.setName("Test"); asset.setName("Test");
asset.setType("type"); asset.setType("type");
String serializedAsset = JacksonUtil.toString(asset); 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 // 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); ((ObjectNode) jsonNode).put("test", (String) null);
serializedAsset = JacksonUtil.toString(jsonNode); serializedAsset = JacksonUtil.toString(jsonNode);
// deserialize with FAIL_ON_UNKNOWN_PROPERTIES = false // deserialize with FAIL_ON_UNKNOWN_PROPERTIES = false