added circles validation in BaseRuleChainService
This commit is contained in:
parent
b9cc400a15
commit
174570610b
@ -17,6 +17,7 @@ package org.thingsboard.server.dao.rule;
|
|||||||
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -38,6 +39,7 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData;
|
|||||||
import org.thingsboard.server.common.data.rule.RuleNode;
|
import org.thingsboard.server.common.data.rule.RuleNode;
|
||||||
import org.thingsboard.server.dao.entity.AbstractEntityService;
|
import org.thingsboard.server.dao.entity.AbstractEntityService;
|
||||||
import org.thingsboard.server.dao.exception.DataValidationException;
|
import org.thingsboard.server.dao.exception.DataValidationException;
|
||||||
|
import org.thingsboard.server.dao.exception.IncorrectParameterException;
|
||||||
import org.thingsboard.server.dao.service.DataValidator;
|
import org.thingsboard.server.dao.service.DataValidator;
|
||||||
import org.thingsboard.server.dao.service.PaginatedRemover;
|
import org.thingsboard.server.dao.service.PaginatedRemover;
|
||||||
import org.thingsboard.server.dao.service.Validator;
|
import org.thingsboard.server.dao.service.Validator;
|
||||||
@ -123,6 +125,10 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (CollectionUtils.isNotEmpty(ruleChainMetaData.getConnections())) {
|
||||||
|
validateCircles(ruleChainMetaData.getConnections());
|
||||||
|
}
|
||||||
|
|
||||||
List<RuleNode> nodes = ruleChainMetaData.getNodes();
|
List<RuleNode> nodes = ruleChainMetaData.getNodes();
|
||||||
List<RuleNode> toAddOrUpdate = new ArrayList<>();
|
List<RuleNode> toAddOrUpdate = new ArrayList<>();
|
||||||
List<RuleNode> toDelete = new ArrayList<>();
|
List<RuleNode> toDelete = new ArrayList<>();
|
||||||
@ -205,6 +211,28 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
|
|||||||
return loadRuleChainMetaData(tenantId, ruleChainMetaData.getRuleChainId());
|
return loadRuleChainMetaData(tenantId, ruleChainMetaData.getRuleChainId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validateCircles(List<NodeConnectionInfo> connectionInfos) {
|
||||||
|
Map<Integer, List<Integer>> connectionsMap = new HashMap<>();
|
||||||
|
for (NodeConnectionInfo nodeConnection : connectionInfos) {
|
||||||
|
connectionsMap
|
||||||
|
.computeIfAbsent(nodeConnection.getFromIndex(), from -> new ArrayList<>())
|
||||||
|
.add(nodeConnection.getToIndex());
|
||||||
|
}
|
||||||
|
connectionsMap.keySet().forEach(key -> validateCircles(key, connectionsMap.get(key), connectionsMap));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateCircles(int from, List<Integer> toList, Map<Integer, List<Integer>> connectionsMap) {
|
||||||
|
if (toList == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (Integer to : toList) {
|
||||||
|
if (from == to) {
|
||||||
|
throw new IncorrectParameterException("Can't create circling relations in rule chain.");
|
||||||
|
}
|
||||||
|
validateCircles(from, connectionsMap.get(to), connectionsMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RuleChainMetaData loadRuleChainMetaData(TenantId tenantId, RuleChainId ruleChainId) {
|
public RuleChainMetaData loadRuleChainMetaData(TenantId tenantId, RuleChainId ruleChainId) {
|
||||||
Validator.validateId(ruleChainId, "Incorrect rule chain id.");
|
Validator.validateId(ruleChainId, "Incorrect rule chain id.");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user