|
|
|
@ -29,15 +29,6 @@ import org.thingsboard.common.util.JacksonUtil; |
|
|
|
import org.thingsboard.rule.engine.flow.TbRuleChainInputNode; |
|
|
|
import org.thingsboard.rule.engine.flow.TbRuleChainInputNodeConfiguration; |
|
|
|
import org.thingsboard.rule.engine.metadata.FetchTo; |
|
|
|
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.TbGetOriginatorFieldsNode; |
|
|
|
import org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode; |
|
|
|
import org.thingsboard.rule.engine.metadata.TbGetDeviceAttrNode; |
|
|
|
import org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode; |
|
|
|
import org.thingsboard.rule.engine.metadata.TbGetTenantDetailsNode; |
|
|
|
import org.thingsboard.rule.engine.profile.TbDeviceProfileNode; |
|
|
|
import org.thingsboard.rule.engine.profile.TbDeviceProfileNodeConfiguration; |
|
|
|
import org.thingsboard.server.common.data.DataConstants; |
|
|
|
@ -228,20 +219,18 @@ public class DefaultDataUpdateService implements DataUpdateService { |
|
|
|
|
|
|
|
private void updateEnrichmentRuleNodes() { |
|
|
|
try { |
|
|
|
var fetchToDataNodes = List.of(TbGetAttributesNode.class.getName(), TbGetDeviceAttrNode.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(), |
|
|
|
TbGetRelatedAttributeNode.class.getName(), |
|
|
|
TbGetTenantAttributeNode.class.getName(), |
|
|
|
TbGetCustomerAttributeNode.class.getName() |
|
|
|
); |
|
|
|
var allNodesToUpdate = new ArrayList<>(hardCodeMetadataNodes); |
|
|
|
allNodesToUpdate.addAll(fetchToDataNodes); |
|
|
|
allNodesToUpdate.addAll(addToMetadataNodes); |
|
|
|
allNodesToUpdate.addAll(fetchToMetadataNodes); |
|
|
|
var ruleChainIdToTenantId = new HashMap<RuleChainId, TenantId>(); |
|
|
|
var allNodesToUpdate = List.of( |
|
|
|
"org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode", |
|
|
|
"org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode", |
|
|
|
"org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode", |
|
|
|
"org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode", |
|
|
|
"org.thingsboard.rule.engine.metadata.TbGetAttributesNode", |
|
|
|
"org.thingsboard.rule.engine.metadata.TbGetDeviceAttrNode", |
|
|
|
"org.thingsboard.rule.engine.metadata.TbGetCustomerDetailsNode", |
|
|
|
"org.thingsboard.rule.engine.metadata.TbGetTenantDetailsNode", |
|
|
|
"org.thingsboard.rule.engine.metadata.TbFetchDeviceCredentialsNode" |
|
|
|
); |
|
|
|
allNodesToUpdate.forEach(ruleNodeType -> { |
|
|
|
var ruleNodes = new PageDataIterable<>( |
|
|
|
pageLink -> ruleChainService.findAllRuleNodesByType(ruleNodeType, pageLink), 1024 |
|
|
|
@ -259,74 +248,35 @@ public class DefaultDataUpdateService implements DataUpdateService { |
|
|
|
continue; |
|
|
|
} |
|
|
|
var configObjectNode = (ObjectNode) configuration; |
|
|
|
var fetchTo = FetchTo.METADATA; |
|
|
|
|
|
|
|
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: fetchToData property is not present!", ruleNodeType, ruleNode.getId()); |
|
|
|
continue; |
|
|
|
} |
|
|
|
} 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: fetchToMetadata property is not present!", ruleNodeType, ruleNode.getId()); |
|
|
|
continue; |
|
|
|
} |
|
|
|
} else if (addToMetadataNodes.contains(ruleNodeType)) { |
|
|
|
configObjectNode.remove("fetchToData"); |
|
|
|
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 is not present!", ruleNodeType, ruleNode.getId()); |
|
|
|
|
|
|
|
FetchTo fetchTo; |
|
|
|
|
|
|
|
switch (ruleNodeType) { |
|
|
|
case "org.thingsboard.rule.engine.metadata.TbGetAttributesNode": |
|
|
|
case "org.thingsboard.rule.engine.metadata.TbGetDeviceAttrNode": |
|
|
|
fetchTo = checkEnrichmentNodeFetchProperty(configObjectNode, "fetchToData", FetchTo.DATA, FetchTo.METADATA); |
|
|
|
break; |
|
|
|
case "org.thingsboard.rule.engine.metadata.TbGetCustomerDetailsNode": |
|
|
|
case "org.thingsboard.rule.engine.metadata.TbGetTenantDetailsNode": |
|
|
|
fetchTo = checkEnrichmentNodeFetchProperty(configObjectNode, "addToMetadata", FetchTo.METADATA, FetchTo.DATA); |
|
|
|
break; |
|
|
|
case "org.thingsboard.rule.engine.metadata.TbFetchDeviceCredentialsNode": |
|
|
|
fetchTo = checkEnrichmentNodeFetchProperty(configObjectNode, "fetchToMetadata", FetchTo.METADATA, FetchTo.DATA); |
|
|
|
break; |
|
|
|
case "org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode": |
|
|
|
case "org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode": |
|
|
|
case "org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode": |
|
|
|
case "org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode": |
|
|
|
fetchTo = FetchTo.METADATA; |
|
|
|
break; |
|
|
|
default: |
|
|
|
log.error("Failed to update rule node: [{}] with id: [{}] " + |
|
|
|
"Reason: Unexpected rule node type!", ruleNodeType, ruleNode.getId()); |
|
|
|
continue; |
|
|
|
} |
|
|
|
} else { |
|
|
|
log.error("Failed to updated rule node: [{}] with id: [{}] " + |
|
|
|
"Reason: Unexpected rule node type!", ruleNodeType, ruleNode.getId()); |
|
|
|
} |
|
|
|
|
|
|
|
if (fetchTo == null) { |
|
|
|
log.error("Failed to update rule node: [{}] with id: [{}]", ruleNodeType, ruleNode.getId()); |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
@ -352,6 +302,25 @@ public class DefaultDataUpdateService implements DataUpdateService { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private FetchTo checkEnrichmentNodeFetchProperty(ObjectNode config, String property, FetchTo ifTrue, FetchTo ifFalse) { |
|
|
|
if (config.has(property)) { |
|
|
|
var value = config.get(property).asText(); |
|
|
|
if ("true".equals(value)) { |
|
|
|
config.remove(property); |
|
|
|
return ifTrue; |
|
|
|
} else if ("false".equals(value)) { |
|
|
|
config.remove(property); |
|
|
|
return ifFalse; |
|
|
|
} else { |
|
|
|
log.error(property + " property has unexpected value: {} Allowed values: true or false!", value); |
|
|
|
return null; |
|
|
|
} |
|
|
|
} else { |
|
|
|
log.error(property + " property is not present!"); |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private final PaginatedUpdater<String, DeviceProfileEntity> deviceProfileEntityDynamicConditionsUpdater = |
|
|
|
new PaginatedUpdater<>() { |
|
|
|
|
|
|
|
|