thingsboard-aplcache

Check target Rule Nodes/Rule Chains existence when fetching

1/18/2019 9:18:42 AM

Details

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 0c5690c..86e7188 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<RuleNode> getRuleChainNodes(TenantId tenantId, RuleChainId ruleChainId) {
         Validator.validateId(ruleChainId, "Incorrect rule chain id for search request.");
         List<EntityRelation> relations = getRuleChainToNodeRelations(tenantId, ruleChainId);
-        List<RuleNode> ruleNodes = relations.stream().map(relation -> ruleNodeDao.findById(tenantId, relation.getTo().getId())).collect(Collectors.toList());
+        List<RuleNode> 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<EntityRelation> getRuleNodeRelations(TenantId tenantId, RuleNodeId ruleNodeId) {
         Validator.validateId(ruleNodeId, "Incorrect rule node id for search request.");
-        return relationService.findByFrom(tenantId, ruleNodeId, RelationTypeGroup.RULE_NODE);
+        List<EntityRelation> relations = relationService.findByFrom(tenantId, ruleNodeId, RelationTypeGroup.RULE_NODE);
+        List<EntityRelation> 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