From d44ab0827719639fdef556faac254e6ba64fc554 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 18 Jan 2019 13:18:42 +0200 Subject: [PATCH] Check target Rule Nodes/Rule Chains existence when fetching Rule Node/Rule Chain relations. --- .../server/dao/rule/BaseRuleChainService.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java index 0c5690c144..86e71889b5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java @@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.thingsboard.server.common.data.BaseData; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.id.EntityId; @@ -274,14 +275,43 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC public List getRuleChainNodes(TenantId tenantId, RuleChainId ruleChainId) { Validator.validateId(ruleChainId, "Incorrect rule chain id for search request."); List relations = getRuleChainToNodeRelations(tenantId, ruleChainId); - List ruleNodes = relations.stream().map(relation -> ruleNodeDao.findById(tenantId, relation.getTo().getId())).collect(Collectors.toList()); + List ruleNodes = new ArrayList<>(); + for (EntityRelation relation : relations) { + RuleNode ruleNode = ruleNodeDao.findById(tenantId, relation.getTo().getId()); + if (ruleNode != null) { + ruleNodes.add(ruleNode); + } else { + relationService.deleteRelation(tenantId, relation); + } + } return ruleNodes; } @Override public List getRuleNodeRelations(TenantId tenantId, RuleNodeId ruleNodeId) { Validator.validateId(ruleNodeId, "Incorrect rule node id for search request."); - return relationService.findByFrom(tenantId, ruleNodeId, RelationTypeGroup.RULE_NODE); + List relations = relationService.findByFrom(tenantId, ruleNodeId, RelationTypeGroup.RULE_NODE); + List validRelations = new ArrayList<>(); + for (EntityRelation relation : relations) { + boolean valid = true; + EntityType toType = relation.getTo().getEntityType(); + if (toType == EntityType.RULE_NODE || toType == EntityType.RULE_CHAIN) { + BaseData entity; + if (relation.getTo().getEntityType() == EntityType.RULE_NODE) { + entity = ruleNodeDao.findById(tenantId, relation.getTo().getId()); + } else { + entity = ruleChainDao.findById(tenantId, relation.getTo().getId()); + } + if (entity == null) { + relationService.deleteRelation(tenantId, relation); + valid = false; + } + } + if (valid) { + validRelations.add(relation); + } + } + return validRelations; } @Override