From 67293b5fa4542cc19bd4150c0c960684723a8fa0 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 31 Jan 2019 13:13:39 +0200 Subject: [PATCH] Update Referencing RuleChains when RuleChain is deleted. --- .../server/controller/RuleChainController.java | 12 ++++++++++++ .../server/dao/rule/BaseRuleChainService.java | 18 ++++++++++++++++++ .../server/dao/rule/RuleChainService.java | 2 ++ 3 files changed, 32 insertions(+) diff --git a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java index f4caa7c1f7..916095fc65 100644 --- a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java +++ b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java @@ -47,6 +47,7 @@ import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChainMetaData; +import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.dao.event.EventService; @@ -55,9 +56,11 @@ import org.thingsboard.server.service.script.RuleNodeJsScriptEngine; import org.thingsboard.server.service.security.permission.Operation; import org.thingsboard.server.service.security.permission.Resource; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; @Slf4j @RestController @@ -224,8 +227,17 @@ public class RuleChainController extends BaseController { RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.DELETE); + List referencingRuleNodes = ruleChainService.getReferencingRuleChainNodes(getTenantId(), ruleChainId); + + Set referencingRuleChainIds = referencingRuleNodes.stream().map(RuleNode::getRuleChainId).collect(Collectors.toSet()); + ruleChainService.deleteRuleChainById(getTenantId(), ruleChainId); + referencingRuleChainIds.remove(ruleChain.getId()); + + referencingRuleChainIds.forEach(referencingRuleChainId -> + actorService.onEntityStateChange(ruleChain.getTenantId(), referencingRuleChainId, ComponentLifecycleEvent.UPDATED)); + actorService.onEntityStateChange(ruleChain.getTenantId(), ruleChain.getId(), ComponentLifecycleEvent.DELETED); logEntityAction(ruleChainId, ruleChain, 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 86e71889b5..4855a6bbe8 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 @@ -287,6 +287,20 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC return ruleNodes; } + @Override + public List getReferencingRuleChainNodes(TenantId tenantId, RuleChainId ruleChainId) { + Validator.validateId(ruleChainId, "Incorrect rule chain id for search request."); + List relations = getNodeToRuleChainRelations(tenantId, ruleChainId); + List ruleNodes = new ArrayList<>(); + for (EntityRelation relation : relations) { + RuleNode ruleNode = ruleNodeDao.findById(tenantId, relation.getFrom().getId()); + if (ruleNode != null) { + ruleNodes.add(ruleNode); + } + } + return ruleNodes; + } + @Override public List getRuleNodeRelations(TenantId tenantId, RuleNodeId ruleNodeId) { Validator.validateId(ruleNodeId, "Incorrect rule node id for search request."); @@ -351,6 +365,10 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC return relationService.findByFrom(tenantId, ruleChainId, RelationTypeGroup.RULE_CHAIN); } + private List getNodeToRuleChainRelations(TenantId tenantId, RuleChainId ruleChainId) { + return relationService.findByTo(tenantId, ruleChainId, RelationTypeGroup.RULE_NODE); + } + private void deleteRuleNode(TenantId tenantId, EntityId entityId) { deleteEntityRelations(tenantId, entityId); ruleNodeDao.removeById(tenantId, entityId.getId()); diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java index 7dfd8477c4..f87711f008 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java @@ -54,6 +54,8 @@ public interface RuleChainService { List getRuleChainNodes(TenantId tenantId, RuleChainId ruleChainId); + List getReferencingRuleChainNodes(TenantId tenantId, RuleChainId ruleChainId); + List getRuleNodeRelations(TenantId tenantId, RuleNodeId ruleNodeId); TextPageData findTenantRuleChains(TenantId tenantId, TextPageLink pageLink);