|
|
@ -51,22 +51,20 @@ import org.thingsboard.server.common.data.rule.RuleNode; |
|
|
import org.thingsboard.server.common.data.rule.RuleNodeUpdateResult; |
|
|
import org.thingsboard.server.common.data.rule.RuleNodeUpdateResult; |
|
|
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.service.ConstraintValidator; |
|
|
|
|
|
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; |
|
|
|
|
|
import org.thingsboard.server.dao.service.validator.RuleChainDataValidator; |
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
import java.util.ArrayList; |
|
|
import java.util.Collection; |
|
|
import java.util.Collection; |
|
|
import java.util.Collections; |
|
|
import java.util.Collections; |
|
|
import java.util.Comparator; |
|
|
import java.util.Comparator; |
|
|
import java.util.HashMap; |
|
|
import java.util.HashMap; |
|
|
import java.util.HashSet; |
|
|
|
|
|
import java.util.Iterator; |
|
|
import java.util.Iterator; |
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
import java.util.Map; |
|
|
import java.util.Map; |
|
|
import java.util.Optional; |
|
|
import java.util.Optional; |
|
|
import java.util.Set; |
|
|
|
|
|
import java.util.stream.Collectors; |
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
import static org.thingsboard.server.common.data.DataConstants.TENANT; |
|
|
import static org.thingsboard.server.common.data.DataConstants.TENANT; |
|
|
@ -137,12 +135,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC |
|
|
if (ruleChain == null) { |
|
|
if (ruleChain == null) { |
|
|
return RuleChainUpdateResult.failed(); |
|
|
return RuleChainUpdateResult.failed(); |
|
|
} |
|
|
} |
|
|
ConstraintValidator.validateFields(ruleChainMetaData); |
|
|
RuleChainDataValidator.validateMetaData(ruleChainMetaData); |
|
|
List<RuleNodeUpdateResult> updatedRuleNodes = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
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<>(); |
|
|
@ -160,6 +153,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
List<RuleNodeUpdateResult> updatedRuleNodes = new ArrayList<>(); |
|
|
List<RuleNode> existingRuleNodes = getRuleChainNodes(tenantId, ruleChainMetaData.getRuleChainId()); |
|
|
List<RuleNode> existingRuleNodes = getRuleChainNodes(tenantId, ruleChainMetaData.getRuleChainId()); |
|
|
for (RuleNode existingNode : existingRuleNodes) { |
|
|
for (RuleNode existingNode : existingRuleNodes) { |
|
|
deleteEntityRelations(tenantId, existingNode.getId()); |
|
|
deleteEntityRelations(tenantId, existingNode.getId()); |
|
|
@ -249,31 +243,6 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC |
|
|
return RuleChainUpdateResult.successful(updatedRuleNodes); |
|
|
return RuleChainUpdateResult.successful(updatedRuleNodes); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void validateCircles(List<NodeConnectionInfo> connectionInfos) { |
|
|
|
|
|
Map<Integer, Set<Integer>> connectionsMap = new HashMap<>(); |
|
|
|
|
|
for (NodeConnectionInfo nodeConnection : connectionInfos) { |
|
|
|
|
|
if (nodeConnection.getFromIndex() == nodeConnection.getToIndex()) { |
|
|
|
|
|
throw new DataValidationException("Can't create the relation to yourself."); |
|
|
|
|
|
} |
|
|
|
|
|
connectionsMap |
|
|
|
|
|
.computeIfAbsent(nodeConnection.getFromIndex(), from -> new HashSet<>()) |
|
|
|
|
|
.add(nodeConnection.getToIndex()); |
|
|
|
|
|
} |
|
|
|
|
|
connectionsMap.keySet().forEach(key -> validateCircles(key, connectionsMap.get(key), connectionsMap)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void validateCircles(int from, Set<Integer> toList, Map<Integer, Set<Integer>> connectionsMap) { |
|
|
|
|
|
if (toList == null) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
for (Integer to : toList) { |
|
|
|
|
|
if (from == to) { |
|
|
|
|
|
throw new DataValidationException("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."); |
|
|
|