Commit 174570610bd2e26339eaaacfb48e49467dba1484

Authored by YevhenBondarenko
Committed by Andrew Shvayka
1 parent b9cc400a

added circles validation in BaseRuleChainService

@@ -17,6 +17,7 @@ package org.thingsboard.server.dao.rule; @@ -17,6 +17,7 @@ package org.thingsboard.server.dao.rule;
17 17
18 import com.google.common.util.concurrent.ListenableFuture; 18 import com.google.common.util.concurrent.ListenableFuture;
19 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
  20 +import org.apache.commons.collections.CollectionUtils;
20 import org.apache.commons.lang3.StringUtils; 21 import org.apache.commons.lang3.StringUtils;
21 import org.springframework.beans.factory.annotation.Autowired; 22 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.stereotype.Service; 23 import org.springframework.stereotype.Service;
@@ -38,6 +39,7 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData; @@ -38,6 +39,7 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData;
38 import org.thingsboard.server.common.data.rule.RuleNode; 39 import org.thingsboard.server.common.data.rule.RuleNode;
39 import org.thingsboard.server.dao.entity.AbstractEntityService; 40 import org.thingsboard.server.dao.entity.AbstractEntityService;
40 import org.thingsboard.server.dao.exception.DataValidationException; 41 import org.thingsboard.server.dao.exception.DataValidationException;
  42 +import org.thingsboard.server.dao.exception.IncorrectParameterException;
41 import org.thingsboard.server.dao.service.DataValidator; 43 import org.thingsboard.server.dao.service.DataValidator;
42 import org.thingsboard.server.dao.service.PaginatedRemover; 44 import org.thingsboard.server.dao.service.PaginatedRemover;
43 import org.thingsboard.server.dao.service.Validator; 45 import org.thingsboard.server.dao.service.Validator;
@@ -123,6 +125,10 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC @@ -123,6 +125,10 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
123 return null; 125 return null;
124 } 126 }
125 127
  128 + if (CollectionUtils.isNotEmpty(ruleChainMetaData.getConnections())) {
  129 + validateCircles(ruleChainMetaData.getConnections());
  130 + }
  131 +
126 List<RuleNode> nodes = ruleChainMetaData.getNodes(); 132 List<RuleNode> nodes = ruleChainMetaData.getNodes();
127 List<RuleNode> toAddOrUpdate = new ArrayList<>(); 133 List<RuleNode> toAddOrUpdate = new ArrayList<>();
128 List<RuleNode> toDelete = new ArrayList<>(); 134 List<RuleNode> toDelete = new ArrayList<>();
@@ -205,6 +211,28 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC @@ -205,6 +211,28 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
205 return loadRuleChainMetaData(tenantId, ruleChainMetaData.getRuleChainId()); 211 return loadRuleChainMetaData(tenantId, ruleChainMetaData.getRuleChainId());
206 } 212 }
207 213
  214 + private void validateCircles(List<NodeConnectionInfo> connectionInfos) {
  215 + Map<Integer, List<Integer>> connectionsMap = new HashMap<>();
  216 + for (NodeConnectionInfo nodeConnection : connectionInfos) {
  217 + connectionsMap
  218 + .computeIfAbsent(nodeConnection.getFromIndex(), from -> new ArrayList<>())
  219 + .add(nodeConnection.getToIndex());
  220 + }
  221 + connectionsMap.keySet().forEach(key -> validateCircles(key, connectionsMap.get(key), connectionsMap));
  222 + }
  223 +
  224 + private void validateCircles(int from, List<Integer> toList, Map<Integer, List<Integer>> connectionsMap) {
  225 + if (toList == null) {
  226 + return;
  227 + }
  228 + for (Integer to : toList) {
  229 + if (from == to) {
  230 + throw new IncorrectParameterException("Can't create circling relations in rule chain.");
  231 + }
  232 + validateCircles(from, connectionsMap.get(to), connectionsMap);
  233 + }
  234 + }
  235 +
208 @Override 236 @Override
209 public RuleChainMetaData loadRuleChainMetaData(TenantId tenantId, RuleChainId ruleChainId) { 237 public RuleChainMetaData loadRuleChainMetaData(TenantId tenantId, RuleChainId ruleChainId) {
210 Validator.validateId(ruleChainId, "Incorrect rule chain id."); 238 Validator.validateId(ruleChainId, "Incorrect rule chain id.");