From 8416c206ff1237b611d2773ab59342e8649a2150 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 1 Jun 2020 22:08:30 +0300 Subject: [PATCH] Fixed rule chain relation. Fixed default edge removal --- .../server/actors/tenant/TenantActor.java | 2 +- .../server/controller/EdgeController.java | 12 +++++++----- .../server/controller/RuleChainController.java | 18 ++++++++++++------ .../server/dao/edge/EdgeService.java | 2 ++ .../data/relation/RelationTypeGroup.java | 3 ++- .../server/dao/edge/CassandraEdgeDao.java | 4 ++-- .../server/dao/edge/EdgeServiceImpl.java | 14 ++++++++++++++ .../server/dao/rule/BaseRuleChainService.java | 4 ++-- .../server/dao/rule/CassandraRuleChainDao.java | 2 +- .../server/dao/sql/edge/JpaEdgeDao.java | 4 ++-- .../server/dao/sql/rule/JpaRuleChainDao.java | 2 +- 11 files changed, 46 insertions(+), 21 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java index 1b0e4c3837..900a3a88c3 100644 --- a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java +++ b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java @@ -206,7 +206,7 @@ public class TenantActor extends RuleChainManagerActor { if (msg.getEntityId().getEntityType() == EntityType.RULE_CHAIN) { RuleChain ruleChain = systemContext.getRuleChainService(). findRuleChainById(tenantId, new RuleChainId(msg.getEntityId().getId())); - if (ruleChain.getType().equals(RuleChainType.SYSTEM)) { + if (ruleChain != null && ruleChain.getType().equals(RuleChainType.SYSTEM)) { visit(ruleChain, target); } } diff --git a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java index bb9106719d..d263497527 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.controller; +import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; @@ -92,15 +93,16 @@ public class EdgeController extends BaseController { accessControlService.checkPermission(getCurrentUser(), Resource.EDGE, operation, edge.getId(), edge); - Edge result = checkNotNull(edgeService.saveEdge(edge)); + Edge savedEdge = checkNotNull(edgeService.saveEdge(edge)); if (created) { - ruleChainService.assignRuleChainToEdge(tenantId, defaultRootEdgeRuleChain.getId(), result.getId()); - edgeService.setEdgeRootRuleChain(tenantId, result, defaultRootEdgeRuleChain.getId()); + ruleChainService.assignRuleChainToEdge(tenantId, defaultRootEdgeRuleChain.getId(), savedEdge.getId()); + edgeService.setEdgeRootRuleChain(tenantId, savedEdge, defaultRootEdgeRuleChain.getId()); + edgeService.assignDefaultRuleChainsToEdge(tenantId, savedEdge.getId()); } - logEntityAction(result.getId(), result, null, created ? ActionType.ADDED : ActionType.UPDATED, null); - return result; + logEntityAction(savedEdge.getId(), savedEdge, null, created ? ActionType.ADDED : ActionType.UPDATED, null); + return savedEdge; } catch (Exception e) { logEntityAction(emptyId(EntityType.EDGE), edge, null, edge.getId() == null ? ActionType.ADDED : ActionType.UPDATED, e); 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 3d6b1f3349..06e7256421 100644 --- a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java +++ b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java @@ -137,8 +137,10 @@ public class RuleChainController extends BaseController { RuleChain savedRuleChain = checkNotNull(ruleChainService.saveRuleChain(ruleChain)); - tbClusterService.onEntityStateChange(ruleChain.getTenantId(), savedRuleChain.getId(), - created ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED); + if (RuleChainType.SYSTEM.equals(savedRuleChain.getType())) { + tbClusterService.onEntityStateChange(ruleChain.getTenantId(), savedRuleChain.getId(), + created ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED); + } logEntityAction(savedRuleChain.getId(), savedRuleChain, null, @@ -210,7 +212,9 @@ public class RuleChainController extends BaseController { RuleChain ruleChain = checkRuleChain(ruleChainMetaData.getRuleChainId(), Operation.WRITE); RuleChainMetaData savedRuleChainMetaData = checkNotNull(ruleChainService.saveRuleChainMetaData(tenantId, ruleChainMetaData)); - tbClusterService.onEntityStateChange(ruleChain.getTenantId(), ruleChain.getId(), ComponentLifecycleEvent.UPDATED); + if (RuleChainType.SYSTEM.equals(ruleChain.getType())) { + tbClusterService.onEntityStateChange(ruleChain.getTenantId(), ruleChain.getId(), ComponentLifecycleEvent.UPDATED); + } logEntityAction(ruleChain.getId(), ruleChain, null, @@ -266,10 +270,12 @@ public class RuleChainController extends BaseController { referencingRuleChainIds.remove(ruleChain.getId()); - referencingRuleChainIds.forEach(referencingRuleChainId -> - tbClusterService.onEntityStateChange(ruleChain.getTenantId(), referencingRuleChainId, ComponentLifecycleEvent.UPDATED)); + if (RuleChainType.SYSTEM.equals(ruleChain.getType())) { + referencingRuleChainIds.forEach(referencingRuleChainId -> + tbClusterService.onEntityStateChange(ruleChain.getTenantId(), referencingRuleChainId, ComponentLifecycleEvent.UPDATED)); - tbClusterService.onEntityStateChange(ruleChain.getTenantId(), ruleChain.getId(), ComponentLifecycleEvent.DELETED); + tbClusterService.onEntityStateChange(ruleChain.getTenantId(), ruleChain.getId(), ComponentLifecycleEvent.DELETED); + } logEntityAction(ruleChainId, ruleChain, null, diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java index d3913cf691..48f02c28fb 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java @@ -82,6 +82,8 @@ public interface EdgeService { Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException; + void assignDefaultRuleChainsToEdge(TenantId tenantId, EdgeId edgeId); + ListenableFuture> findEdgesByTenantIdAndRuleChainId(TenantId tenantId, RuleChainId ruleChainId, TimePageLink pageLink); ListenableFuture> findEdgesByTenantIdAndDashboardId(TenantId tenantId, DashboardId dashboardId, TimePageLink pageLink); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java b/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java index 611c4777a3..07315428e3 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java @@ -22,6 +22,7 @@ public enum RelationTypeGroup { DASHBOARD, RULE_CHAIN, RULE_NODE, - EDGE + EDGE, + EDGE_DEFAULT_RULE_CHAIN } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java b/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java index 835917b153..75fabb33bf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java @@ -116,7 +116,7 @@ public class CassandraEdgeDao extends CassandraAbstractSearchTextDao { List> edgeFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) { - edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getTo().getId())); + edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getFrom().getId())); } return Futures.successfulAsList(edgeFutures); }, MoreExecutors.directExecutor()); @@ -129,7 +129,7 @@ public class CassandraEdgeDao extends CassandraAbstractSearchTextDao { List> edgeFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) { - edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getTo().getId())); + edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getFrom().getId())); } return Futures.successfulAsList(edgeFutures); }, MoreExecutors.directExecutor()); diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java index 31cbe1c765..f974cabc62 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java @@ -665,6 +665,20 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic return savedEdge; } + @Override + public void assignDefaultRuleChainsToEdge(TenantId tenantId, EdgeId edgeId) { + log.trace("Executing assignDefaultRuleChainsToEdge, tenantId [{}], edgeId [{}]", tenantId, edgeId); + ListenableFuture> future = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId); + Futures.transform(future, ruleChains -> { + if (ruleChains != null && !ruleChains.isEmpty()) { + for (RuleChain ruleChain : ruleChains) { + ruleChainService.assignRuleChainToEdge(tenantId, ruleChain.getId(), edgeId); + } + } + return null; + }, MoreExecutors.directExecutor()); + } + @Override public ListenableFuture> findEdgesByTenantIdAndRuleChainId(TenantId tenantId, RuleChainId ruleChainId, TimePageLink pageLink) { log.trace("Executing findEdgesByTenantIdAndRuleChainId, tenantId [{}], ruleChainId [{}], pageLink [{}]", tenantId, ruleChainId, pageLink); 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 05c455cf25..a667092231 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 @@ -507,7 +507,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC public boolean addDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { try { createRelation(tenantId, new EntityRelation(tenantId, ruleChainId, - EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE)); + EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN)); return true; } catch (ExecutionException | InterruptedException e) { log.warn("Failed to add default edge rule chain, ruleChainId: [{}]", ruleChainId, e); @@ -519,7 +519,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC public boolean removeDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { try { deleteRelation(tenantId, new EntityRelation(tenantId, ruleChainId, - EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE)); + EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN)); return true; } catch (ExecutionException | InterruptedException e) { log.warn("Failed to remove default edge rule chain, ruleChainId: [{}]", ruleChainId, e); diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java index 31eca488b3..f3916e8cb5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java @@ -109,7 +109,7 @@ public class CassandraRuleChainDao extends CassandraAbstractSearchTextDao> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); - ListenableFuture> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); + ListenableFuture> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN); return Futures.transformAsync(relations, input -> { List> ruleChainFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java index e21a24ee0d..d89e085355 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java @@ -154,7 +154,7 @@ public class JpaEdgeDao extends JpaAbstractSearchTextDao imple return Futures.transformAsync(relations, input -> { List> edgeFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) { - edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getTo().getId())); + edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getFrom().getId())); } return Futures.successfulAsList(edgeFutures); }, MoreExecutors.directExecutor()); @@ -167,7 +167,7 @@ public class JpaEdgeDao extends JpaAbstractSearchTextDao imple return Futures.transformAsync(relations, input -> { List> edgeFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) { - edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getTo().getId())); + edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getFrom().getId())); } return Futures.successfulAsList(edgeFutures); }, MoreExecutors.directExecutor()); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java index 8afbfabb62..b6f2ac2421 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java @@ -109,7 +109,7 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); - ListenableFuture> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); + ListenableFuture> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN); return Futures.transformAsync(relations, input -> { List> ruleChainsFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) {