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