diff --git a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java index 808fec6b53..a27b848530 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java @@ -33,9 +33,9 @@ import org.thingsboard.rule.engine.metadata.TbFetchDeviceCredentialsNode; import org.thingsboard.rule.engine.metadata.TbGetAttributesNode; import org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode; import org.thingsboard.rule.engine.metadata.TbGetCustomerDetailsNode; -import org.thingsboard.rule.engine.metadata.TbGetRelatedDeviceAttrNode; import org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode; import org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode; +import org.thingsboard.rule.engine.metadata.TbGetRelatedDeviceAttrNode; import org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode; import org.thingsboard.rule.engine.metadata.TbGetTenantDetailsNode; import org.thingsboard.rule.engine.profile.TbDeviceProfileNode; @@ -228,19 +228,21 @@ public class DefaultDataUpdateService implements DataUpdateService { private void updateEnrichmentRuleNodes() { try { - var ruleNodeTypesToUpdate = List.of( + var fetchToDataNodes = List.of(TbGetAttributesNode.class.getName(), TbGetRelatedDeviceAttrNode.class.getName()); + var addToMetadataNodes = List.of(TbGetCustomerDetailsNode.class.getName(), TbGetTenantDetailsNode.class.getName()); + var fetchToMetadataNodes = List.of(TbFetchDeviceCredentialsNode.class.getName()); + var hardCodeMetadataNodes = List.of( TbGetOriginatorFieldsNode.class.getName(), - TbFetchDeviceCredentialsNode.class.getName(), - TbGetAttributesNode.class.getName(), - TbGetRelatedDeviceAttrNode.class.getName(), TbGetRelatedAttributeNode.class.getName(), TbGetTenantAttributeNode.class.getName(), - TbGetCustomerAttributeNode.class.getName(), - TbGetCustomerDetailsNode.class.getName(), - TbGetTenantDetailsNode.class.getName() + TbGetCustomerAttributeNode.class.getName() ); + var allNodesToUpdate = new ArrayList<>(hardCodeMetadataNodes); + allNodesToUpdate.addAll(fetchToDataNodes); + allNodesToUpdate.addAll(addToMetadataNodes); + allNodesToUpdate.addAll(fetchToMetadataNodes); var ruleChainIdToTenantId = new HashMap(); - ruleNodeTypesToUpdate.forEach(ruleNodeType -> { + allNodesToUpdate.forEach(ruleNodeType -> { var ruleNodes = new PageDataIterable<>( pageLink -> ruleChainService.findAllRuleNodesByType(ruleNodeType, pageLink), 1024 ); @@ -258,52 +260,80 @@ public class DefaultDataUpdateService implements DataUpdateService { } var configObjectNode = (ObjectNode) configuration; var fetchTo = FetchTo.METADATA; - if (configObjectNode.has("fetchToMetadata")) { - var fetchToMetadata = configObjectNode.get("fetchToMetadata").asText(); - if ("true".equals(fetchToMetadata)) { - fetchTo = FetchTo.METADATA; - } else if ("false".equals(fetchToMetadata)) { - fetchTo = FetchTo.DATA; + + if (fetchToDataNodes.contains(ruleNodeType)) { + configObjectNode.remove("fetchToMetadata"); + configObjectNode.remove("addToMetadata"); + if (configObjectNode.has("fetchToData")) { + var fetchToData = configObjectNode.get("fetchToData").asText(); + if ("true".equals(fetchToData)) { + fetchTo = FetchTo.DATA; + } else if ("false".equals(fetchToData)) { + fetchTo = FetchTo.METADATA; + } else { + log.error("Failed to updated rule node: [{}] with id: [{}] " + + "Reason: fetchToData property has unexpected value: {} Allowed values: true or false!", + ruleNodeType, ruleNode.getId(), fetchToData); + continue; + } + configObjectNode.remove("fetchToData"); } else { log.error("Failed to updated rule node: [{}] with id: [{}] " + - "Reason: fetchToMetadata property has unexpected value: {} Allowed values: true or false!", - ruleNodeType, ruleNode.getId(), fetchToMetadata); + "Reason: fetchToData property is not present!", ruleNodeType, ruleNode.getId()); continue; } - configObjectNode.remove("fetchToMetadata"); - } - if (configObjectNode.has("fetchToData")) { - var fetchToData = configObjectNode.get("fetchToData").asText(); - if ("true".equals(fetchToData)) { - fetchTo = FetchTo.DATA; - } else if ("false".equals(fetchToData)) { - fetchTo = FetchTo.METADATA; + } else if (fetchToMetadataNodes.contains(ruleNodeType)) { + configObjectNode.remove("fetchToData"); + configObjectNode.remove("addToMetadata"); + if (configObjectNode.has("fetchToMetadata")) { + var fetchToMetadata = configObjectNode.get("fetchToMetadata").asText(); + if ("true".equals(fetchToMetadata)) { + fetchTo = FetchTo.METADATA; + } else if ("false".equals(fetchToMetadata)) { + fetchTo = FetchTo.DATA; + } else { + log.error("Failed to updated rule node: [{}] with id: [{}] " + + "Reason: fetchToMetadata property has unexpected value: {} Allowed values: true or false!", + ruleNodeType, ruleNode.getId(), fetchToMetadata); + continue; + } + configObjectNode.remove("fetchToMetadata"); } else { log.error("Failed to updated rule node: [{}] with id: [{}] " + - "Reason: fetchToData property has unexpected value: {} Allowed values: true or false!", - ruleNodeType, ruleNode.getId(), fetchToData); + "Reason: fetchToMetadata property is not present!", ruleNodeType, ruleNode.getId()); continue; } + } else if (addToMetadataNodes.contains(ruleNodeType)) { configObjectNode.remove("fetchToData"); - } - if (configObjectNode.has("addToMetadata")) { - var addToMetadata = configObjectNode.get("addToMetadata").asText(); - if ("true".equals(addToMetadata)) { - fetchTo = FetchTo.METADATA; - } else if ("false".equals(addToMetadata)) { - fetchTo = FetchTo.DATA; + configObjectNode.remove("fetchToMetadata"); + if (configObjectNode.has("addToMetadata")) { + var addToMetadata = configObjectNode.get("addToMetadata").asText(); + if ("true".equals(addToMetadata)) { + fetchTo = FetchTo.METADATA; + } else if ("false".equals(addToMetadata)) { + fetchTo = FetchTo.DATA; + } else { + log.error("Failed to updated rule node: [{}] with id: [{}] " + + "Reason: addToMetadata property has unexpected value: {} Allowed values: true or false!", + ruleNodeType, ruleNode.getId(), addToMetadata); + continue; + } + configObjectNode.remove("addToMetadata"); } else { log.error("Failed to updated rule node: [{}] with id: [{}] " + - "Reason: addToMetadata property has unexpected value: {} Allowed values: true or false!", - ruleNodeType, ruleNode.getId(), addToMetadata); + "Reason: addToMetadata property is not present!", ruleNodeType, ruleNode.getId()); continue; } - configObjectNode.remove("addToMetadata"); + } else { + log.error("Failed to updated rule node: [{}] with id: [{}] " + + "Reason: Unexpected rule node type!", ruleNodeType, ruleNode.getId()); + continue; } + configObjectNode.put("fetchTo", fetchTo.name()); ruleNode.setConfiguration(configObjectNode); - RuleChainId ruleChainId = ruleNode.getRuleChainId(); - TenantId tenantId = ruleChainIdToTenantId.computeIfAbsent(ruleChainId, + var ruleChainId = ruleNode.getRuleChainId(); + var tenantId = ruleChainIdToTenantId.computeIfAbsent(ruleChainId, id -> { RuleChain ruleChain = ruleChainService.findRuleChainById(TenantId.SYS_TENANT_ID, id); if (ruleChain == null) {