Browse Source

Fixed rule chain relation. Fixed default edge removal

pull/2436/head
Volodymyr Babak 6 years ago
parent
commit
8416c206ff
  1. 2
      application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java
  2. 12
      application/src/main/java/org/thingsboard/server/controller/EdgeController.java
  3. 18
      application/src/main/java/org/thingsboard/server/controller/RuleChainController.java
  4. 2
      common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java
  5. 3
      common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java
  6. 4
      dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java
  7. 14
      dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java
  8. 4
      dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
  9. 2
      dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java
  10. 4
      dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java
  11. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java

2
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) { if (msg.getEntityId().getEntityType() == EntityType.RULE_CHAIN) {
RuleChain ruleChain = systemContext.getRuleChainService(). RuleChain ruleChain = systemContext.getRuleChainService().
findRuleChainById(tenantId, new RuleChainId(msg.getEntityId().getId())); findRuleChainById(tenantId, new RuleChainId(msg.getEntityId().getId()));
if (ruleChain.getType().equals(RuleChainType.SYSTEM)) { if (ruleChain != null && ruleChain.getType().equals(RuleChainType.SYSTEM)) {
visit(ruleChain, target); visit(ruleChain, target);
} }
} }

12
application/src/main/java/org/thingsboard/server/controller/EdgeController.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.controller; package org.thingsboard.server.controller;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@ -92,15 +93,16 @@ public class EdgeController extends BaseController {
accessControlService.checkPermission(getCurrentUser(), Resource.EDGE, operation, accessControlService.checkPermission(getCurrentUser(), Resource.EDGE, operation,
edge.getId(), edge); edge.getId(), edge);
Edge result = checkNotNull(edgeService.saveEdge(edge)); Edge savedEdge = checkNotNull(edgeService.saveEdge(edge));
if (created) { if (created) {
ruleChainService.assignRuleChainToEdge(tenantId, defaultRootEdgeRuleChain.getId(), result.getId()); ruleChainService.assignRuleChainToEdge(tenantId, defaultRootEdgeRuleChain.getId(), savedEdge.getId());
edgeService.setEdgeRootRuleChain(tenantId, result, defaultRootEdgeRuleChain.getId()); edgeService.setEdgeRootRuleChain(tenantId, savedEdge, defaultRootEdgeRuleChain.getId());
edgeService.assignDefaultRuleChainsToEdge(tenantId, savedEdge.getId());
} }
logEntityAction(result.getId(), result, null, created ? ActionType.ADDED : ActionType.UPDATED, null); logEntityAction(savedEdge.getId(), savedEdge, null, created ? ActionType.ADDED : ActionType.UPDATED, null);
return result; return savedEdge;
} catch (Exception e) { } catch (Exception e) {
logEntityAction(emptyId(EntityType.EDGE), edge, logEntityAction(emptyId(EntityType.EDGE), edge,
null, edge.getId() == null ? ActionType.ADDED : ActionType.UPDATED, e); null, edge.getId() == null ? ActionType.ADDED : ActionType.UPDATED, e);

18
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)); RuleChain savedRuleChain = checkNotNull(ruleChainService.saveRuleChain(ruleChain));
tbClusterService.onEntityStateChange(ruleChain.getTenantId(), savedRuleChain.getId(), if (RuleChainType.SYSTEM.equals(savedRuleChain.getType())) {
created ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED); tbClusterService.onEntityStateChange(ruleChain.getTenantId(), savedRuleChain.getId(),
created ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED);
}
logEntityAction(savedRuleChain.getId(), savedRuleChain, logEntityAction(savedRuleChain.getId(), savedRuleChain,
null, null,
@ -210,7 +212,9 @@ public class RuleChainController extends BaseController {
RuleChain ruleChain = checkRuleChain(ruleChainMetaData.getRuleChainId(), Operation.WRITE); RuleChain ruleChain = checkRuleChain(ruleChainMetaData.getRuleChainId(), Operation.WRITE);
RuleChainMetaData savedRuleChainMetaData = checkNotNull(ruleChainService.saveRuleChainMetaData(tenantId, ruleChainMetaData)); 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, logEntityAction(ruleChain.getId(), ruleChain,
null, null,
@ -266,10 +270,12 @@ public class RuleChainController extends BaseController {
referencingRuleChainIds.remove(ruleChain.getId()); referencingRuleChainIds.remove(ruleChain.getId());
referencingRuleChainIds.forEach(referencingRuleChainId -> if (RuleChainType.SYSTEM.equals(ruleChain.getType())) {
tbClusterService.onEntityStateChange(ruleChain.getTenantId(), referencingRuleChainId, ComponentLifecycleEvent.UPDATED)); 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, logEntityAction(ruleChainId, ruleChain,
null, null,

2
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; Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException;
void assignDefaultRuleChainsToEdge(TenantId tenantId, EdgeId edgeId);
ListenableFuture<TimePageData<Edge>> findEdgesByTenantIdAndRuleChainId(TenantId tenantId, RuleChainId ruleChainId, TimePageLink pageLink); ListenableFuture<TimePageData<Edge>> findEdgesByTenantIdAndRuleChainId(TenantId tenantId, RuleChainId ruleChainId, TimePageLink pageLink);
ListenableFuture<TimePageData<Edge>> findEdgesByTenantIdAndDashboardId(TenantId tenantId, DashboardId dashboardId, TimePageLink pageLink); ListenableFuture<TimePageData<Edge>> findEdgesByTenantIdAndDashboardId(TenantId tenantId, DashboardId dashboardId, TimePageLink pageLink);

3
common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java

@ -22,6 +22,7 @@ public enum RelationTypeGroup {
DASHBOARD, DASHBOARD,
RULE_CHAIN, RULE_CHAIN,
RULE_NODE, RULE_NODE,
EDGE EDGE,
EDGE_DEFAULT_RULE_CHAIN
} }

4
dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java

@ -116,7 +116,7 @@ public class CassandraEdgeDao extends CassandraAbstractSearchTextDao<EdgeEntity,
return Futures.transformAsync(relations, input -> { return Futures.transformAsync(relations, input -> {
List<ListenableFuture<Edge>> edgeFutures = new ArrayList<>(input.size()); List<ListenableFuture<Edge>> edgeFutures = new ArrayList<>(input.size());
for (EntityRelation relation : input) { 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); return Futures.successfulAsList(edgeFutures);
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());
@ -129,7 +129,7 @@ public class CassandraEdgeDao extends CassandraAbstractSearchTextDao<EdgeEntity,
return Futures.transformAsync(relations, input -> { return Futures.transformAsync(relations, input -> {
List<ListenableFuture<Edge>> edgeFutures = new ArrayList<>(input.size()); List<ListenableFuture<Edge>> edgeFutures = new ArrayList<>(input.size());
for (EntityRelation relation : input) { 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); return Futures.successfulAsList(edgeFutures);
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());

14
dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java

@ -665,6 +665,20 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
return savedEdge; return savedEdge;
} }
@Override
public void assignDefaultRuleChainsToEdge(TenantId tenantId, EdgeId edgeId) {
log.trace("Executing assignDefaultRuleChainsToEdge, tenantId [{}], edgeId [{}]", tenantId, edgeId);
ListenableFuture<List<RuleChain>> 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 @Override
public ListenableFuture<TimePageData<Edge>> findEdgesByTenantIdAndRuleChainId(TenantId tenantId, RuleChainId ruleChainId, TimePageLink pageLink) { public ListenableFuture<TimePageData<Edge>> findEdgesByTenantIdAndRuleChainId(TenantId tenantId, RuleChainId ruleChainId, TimePageLink pageLink) {
log.trace("Executing findEdgesByTenantIdAndRuleChainId, tenantId [{}], ruleChainId [{}], pageLink [{}]", tenantId, ruleChainId, pageLink); log.trace("Executing findEdgesByTenantIdAndRuleChainId, tenantId [{}], ruleChainId [{}], pageLink [{}]", tenantId, ruleChainId, pageLink);

4
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) { public boolean addDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) {
try { try {
createRelation(tenantId, new EntityRelation(tenantId, ruleChainId, createRelation(tenantId, new EntityRelation(tenantId, ruleChainId,
EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE)); EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN));
return true; return true;
} catch (ExecutionException | InterruptedException e) { } catch (ExecutionException | InterruptedException e) {
log.warn("Failed to add default edge rule chain, ruleChainId: [{}]", ruleChainId, 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) { public boolean removeDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) {
try { try {
deleteRelation(tenantId, new EntityRelation(tenantId, ruleChainId, deleteRelation(tenantId, new EntityRelation(tenantId, ruleChainId,
EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE)); EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN));
return true; return true;
} catch (ExecutionException | InterruptedException e) { } catch (ExecutionException | InterruptedException e) {
log.warn("Failed to remove default edge rule chain, ruleChainId: [{}]", ruleChainId, e); log.warn("Failed to remove default edge rule chain, ruleChainId: [{}]", ruleChainId, e);

2
dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java

@ -109,7 +109,7 @@ public class CassandraRuleChainDao extends CassandraAbstractSearchTextDao<RuleCh
@Override @Override
public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) {
log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId);
ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN);
return Futures.transformAsync(relations, input -> { return Futures.transformAsync(relations, input -> {
List<ListenableFuture<RuleChain>> ruleChainFutures = new ArrayList<>(input.size()); List<ListenableFuture<RuleChain>> ruleChainFutures = new ArrayList<>(input.size());
for (EntityRelation relation : input) { for (EntityRelation relation : input) {

4
dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java

@ -154,7 +154,7 @@ public class JpaEdgeDao extends JpaAbstractSearchTextDao<EdgeEntity, Edge> imple
return Futures.transformAsync(relations, input -> { return Futures.transformAsync(relations, input -> {
List<ListenableFuture<Edge>> edgeFutures = new ArrayList<>(input.size()); List<ListenableFuture<Edge>> edgeFutures = new ArrayList<>(input.size());
for (EntityRelation relation : input) { 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); return Futures.successfulAsList(edgeFutures);
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());
@ -167,7 +167,7 @@ public class JpaEdgeDao extends JpaAbstractSearchTextDao<EdgeEntity, Edge> imple
return Futures.transformAsync(relations, input -> { return Futures.transformAsync(relations, input -> {
List<ListenableFuture<Edge>> edgeFutures = new ArrayList<>(input.size()); List<ListenableFuture<Edge>> edgeFutures = new ArrayList<>(input.size());
for (EntityRelation relation : input) { 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); return Futures.successfulAsList(edgeFutures);
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());

2
dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java

@ -109,7 +109,7 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao<RuleChainEntity, R
@Override @Override
public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) {
log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId);
ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN);
return Futures.transformAsync(relations, input -> { return Futures.transformAsync(relations, input -> {
List<ListenableFuture<RuleChain>> ruleChainsFutures = new ArrayList<>(input.size()); List<ListenableFuture<RuleChain>> ruleChainsFutures = new ArrayList<>(input.size());
for (EntityRelation relation : input) { for (EntityRelation relation : input) {

Loading…
Cancel
Save