Merge branch 'develop/3.4' into refactoring_test_customer_05
# Conflicts: # application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java
This commit is contained in:
		
						commit
						5ee6009078
					
				@ -915,55 +915,24 @@ public abstract class BaseController {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendRelationNotificationMsg(TenantId tenantId, EntityRelation relation, EdgeEventActionType action) {
 | 
			
		||||
        try {
 | 
			
		||||
            if (!relation.getFrom().getEntityType().equals(EntityType.EDGE) &&
 | 
			
		||||
                    !relation.getTo().getEntityType().equals(EntityType.EDGE)) {
 | 
			
		||||
                sendNotificationMsgToEdgeService(tenantId, null, null, json.writeValueAsString(relation), EdgeEventType.RELATION, action);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            log.warn("Failed to push relation to core: {}", relation, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds) {
 | 
			
		||||
        sendDeleteNotificationMsg(tenantId, entityId, edgeIds, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds, String body) {
 | 
			
		||||
        if (edgeIds != null && !edgeIds.isEmpty()) {
 | 
			
		||||
            for (EdgeId edgeId : edgeIds) {
 | 
			
		||||
                sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, body, null, EdgeEventActionType.DELETED);
 | 
			
		||||
                sendNotificationMsgToEdge(tenantId, edgeId, entityId, null, null, EdgeEventActionType.DELETED);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendAlarmDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds, Alarm alarm) {
 | 
			
		||||
        try {
 | 
			
		||||
            sendDeleteNotificationMsg(tenantId, entityId, edgeIds, json.writeValueAsString(alarm));
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            log.warn("Failed to push delete alarm msg to core: {}", alarm, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendEntityAssignToCustomerNotificationMsg(TenantId tenantId, EntityId entityId, CustomerId customerId, EdgeEventActionType action) {
 | 
			
		||||
        try {
 | 
			
		||||
            sendNotificationMsgToEdgeService(tenantId, null, entityId, json.writeValueAsString(customerId), null, action);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            log.warn("Failed to push assign/unassign to/from customer to core: {}", customerId, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendEntityNotificationMsg(TenantId tenantId, EntityId entityId, EdgeEventActionType action) {
 | 
			
		||||
        sendNotificationMsgToEdgeService(tenantId, null, entityId, null, null, action);
 | 
			
		||||
        sendNotificationMsgToEdge(tenantId, null, entityId, null, null, action);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendEntityAssignToEdgeNotificationMsg(TenantId tenantId, EdgeId edgeId, EntityId entityId, EdgeEventActionType action) {
 | 
			
		||||
        sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, null, null, action);
 | 
			
		||||
        sendNotificationMsgToEdge(tenantId, edgeId, entityId, null, null, action);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void sendNotificationMsgToEdgeService(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action) {
 | 
			
		||||
        tbClusterService.sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, body, type, action);
 | 
			
		||||
    private void sendNotificationMsgToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action) {
 | 
			
		||||
        tbClusterService.sendNotificationMsgToEdge(tenantId, edgeId, entityId, body, type, action);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected List<EdgeId> findRelatedEdgeIds(TenantId tenantId, EntityId entityId) {
 | 
			
		||||
 | 
			
		||||
@ -32,6 +32,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 | 
			
		||||
import org.springframework.web.bind.annotation.ResponseBody;
 | 
			
		||||
import org.springframework.web.bind.annotation.ResponseStatus;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
import org.thingsboard.rule.engine.flow.TbRuleChainInputNode;
 | 
			
		||||
import org.thingsboard.server.common.data.Customer;
 | 
			
		||||
import org.thingsboard.server.common.data.EntitySubtype;
 | 
			
		||||
import org.thingsboard.server.common.data.edge.Edge;
 | 
			
		||||
@ -557,7 +558,7 @@ public class EdgeController extends BaseController {
 | 
			
		||||
            edgeId = checkNotNull(edgeId);
 | 
			
		||||
            SecurityUser user = getCurrentUser();
 | 
			
		||||
            TenantId tenantId = user.getTenantId();
 | 
			
		||||
            return edgeService.findMissingToRelatedRuleChains(tenantId, edgeId);
 | 
			
		||||
            return edgeService.findMissingToRelatedRuleChains(tenantId, edgeId, TbRuleChainInputNode.class.getName());
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            throw handleException(e);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -223,8 +223,8 @@ public class EntityActionService {
 | 
			
		||||
        auditLogService.logEntityAction(user.getTenantId(), customerId, user.getId(), user.getName(), entityId, entity, actionType, e, additionalInfo);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void sendEntityNotificationMsgToEdgeService(TenantId tenantId, EntityId entityId, EdgeEventActionType action) {
 | 
			
		||||
        tbClusterService.sendNotificationMsgToEdgeService(tenantId, null, entityId, null, null, action);
 | 
			
		||||
    public void sendEntityNotificationMsgToEdge(TenantId tenantId, EntityId entityId, EdgeEventActionType action) {
 | 
			
		||||
        tbClusterService.sendNotificationMsgToEdge(tenantId, null, entityId, null, null, action);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private <T> T extractParameter(Class<T> clazz, int index, Object... additionalInfo) {
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,9 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.thingsboard.common.util.JacksonUtil;
 | 
			
		||||
import org.thingsboard.rule.engine.flow.TbRuleChainInputNode;
 | 
			
		||||
import org.thingsboard.rule.engine.flow.TbRuleChainInputNodeConfiguration;
 | 
			
		||||
import org.thingsboard.rule.engine.flow.TbRuleChainOutputNode;
 | 
			
		||||
import org.thingsboard.server.common.data.id.RuleChainId;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.NodeConnectionInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.RuleChain;
 | 
			
		||||
@ -49,9 +51,8 @@ import java.util.stream.Collectors;
 | 
			
		||||
@TbCoreComponent
 | 
			
		||||
public class RuleChainMsgConstructor {
 | 
			
		||||
 | 
			
		||||
    private static final ObjectMapper objectMapper = new ObjectMapper();
 | 
			
		||||
    private static final String RULE_CHAIN_INPUT_NODE = "org.thingsboard.rule.engine.flow.TbRuleChainInputNode";
 | 
			
		||||
    private static final String TB_RULE_CHAIN_OUTPUT_NODE = "org.thingsboard.rule.engine.flow.TbRuleChainOutputNode";
 | 
			
		||||
    private static final String RULE_CHAIN_INPUT_NODE = TbRuleChainInputNode.class.getName();
 | 
			
		||||
    private static final String TB_RULE_CHAIN_OUTPUT_NODE = TbRuleChainOutputNode.class.getName();
 | 
			
		||||
 | 
			
		||||
    public RuleChainUpdateMsg constructRuleChainUpdatedMsg(RuleChainId edgeRootRuleChainId, UpdateMsgType msgType, RuleChain ruleChain) {
 | 
			
		||||
        RuleChainUpdateMsg.Builder builder = RuleChainUpdateMsg.newBuilder()
 | 
			
		||||
@ -210,13 +211,11 @@ public class RuleChainMsgConstructor {
 | 
			
		||||
    private List<RuleNode> filterNodes_V_3_3_0(List<RuleNode> nodes) {
 | 
			
		||||
        List<RuleNode> result = new ArrayList<>();
 | 
			
		||||
        for (RuleNode node : nodes) {
 | 
			
		||||
            switch (node.getType()) {
 | 
			
		||||
                case RULE_CHAIN_INPUT_NODE:
 | 
			
		||||
                case TB_RULE_CHAIN_OUTPUT_NODE:
 | 
			
		||||
                    log.trace("Skipping not supported rule node {}", node);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    result.add(node);
 | 
			
		||||
            if (RULE_CHAIN_INPUT_NODE.equals(node.getType())
 | 
			
		||||
                    || TB_RULE_CHAIN_OUTPUT_NODE.equals(node.getType())) {
 | 
			
		||||
                log.trace("Skipping not supported rule node {}", node);
 | 
			
		||||
            } else {
 | 
			
		||||
                result.add(node);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
@ -280,7 +279,7 @@ public class RuleChainMsgConstructor {
 | 
			
		||||
                .setTargetRuleChainIdMSB(ruleChainConnectionInfo.getTargetRuleChainId().getId().getMostSignificantBits())
 | 
			
		||||
                .setTargetRuleChainIdLSB(ruleChainConnectionInfo.getTargetRuleChainId().getId().getLeastSignificantBits())
 | 
			
		||||
                .setType(ruleChainConnectionInfo.getType())
 | 
			
		||||
                .setAdditionalInfo(objectMapper.writeValueAsString(additionalInfo))
 | 
			
		||||
                .setAdditionalInfo(JacksonUtil.OBJECT_MAPPER.writeValueAsString(additionalInfo))
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -291,8 +290,8 @@ public class RuleChainMsgConstructor {
 | 
			
		||||
                .setType(node.getType())
 | 
			
		||||
                .setName(node.getName())
 | 
			
		||||
                .setDebugMode(node.isDebugMode())
 | 
			
		||||
                .setConfiguration(objectMapper.writeValueAsString(node.getConfiguration()))
 | 
			
		||||
                .setAdditionalInfo(objectMapper.writeValueAsString(node.getAdditionalInfo()))
 | 
			
		||||
                .setConfiguration(JacksonUtil.OBJECT_MAPPER.writeValueAsString(node.getConfiguration()))
 | 
			
		||||
                .setAdditionalInfo(JacksonUtil.OBJECT_MAPPER.writeValueAsString(node.getAdditionalInfo()))
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -32,6 +32,6 @@ public class TenantWidgetsBundlesEdgeEventFetcher extends BaseWidgetsBundlesEdge
 | 
			
		||||
    }
 | 
			
		||||
    @Override
 | 
			
		||||
    protected PageData<WidgetsBundle> findWidgetsBundles(TenantId tenantId, PageLink pageLink) {
 | 
			
		||||
        return widgetsBundleService.findAllTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, pageLink);
 | 
			
		||||
        return widgetsBundleService.findTenantWidgetsBundlesByTenantId(tenantId, pageLink);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -243,7 +243,7 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
 | 
			
		||||
            try {
 | 
			
		||||
                if (!relation.getFrom().getEntityType().equals(EntityType.EDGE) &&
 | 
			
		||||
                        !relation.getTo().getEntityType().equals(EntityType.EDGE)) {
 | 
			
		||||
                    sendNotificationMsgToEdgeService(tenantId, null, null, json.writeValueAsString(relation),
 | 
			
		||||
                    sendNotificationMsgToEdge(tenantId, null, null, json.writeValueAsString(relation),
 | 
			
		||||
                            EdgeEventType.RELATION, edgeTypeByActionType(actionType));
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception e1) {
 | 
			
		||||
@ -267,18 +267,18 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void sendEntityNotificationMsg(TenantId tenantId, EntityId entityId, EdgeEventActionType action) {
 | 
			
		||||
        sendNotificationMsgToEdgeService(tenantId, null, entityId, null, null, action);
 | 
			
		||||
        sendNotificationMsgToEdge(tenantId, null, entityId, null, null, action);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void sendEntityAssignToCustomerNotificationMsg(TenantId tenantId, EntityId entityId, CustomerId customerId, EdgeEventActionType action) {
 | 
			
		||||
        try {
 | 
			
		||||
            sendNotificationMsgToEdgeService(tenantId, null, entityId, json.writeValueAsString(customerId), null, action);
 | 
			
		||||
            sendNotificationMsgToEdge(tenantId, null, entityId, json.writeValueAsString(customerId), null, action);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            log.warn("Failed to push assign/unassign to/from customer to core: {}", customerId, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendAlarmDeleteNotificationMsg(TenantId tenantId, Alarm alarm, List<EdgeId> edgeIds, String body) {
 | 
			
		||||
    private void sendAlarmDeleteNotificationMsg(TenantId tenantId, Alarm alarm, List<EdgeId> edgeIds, String body) {
 | 
			
		||||
        try {
 | 
			
		||||
            sendDeleteNotificationMsg(tenantId, alarm.getId(), edgeIds, body);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
@ -286,8 +286,7 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected <E extends HasName, I extends EntityId> void sendDeleteNotificationMsg(TenantId tenantId, I entityId, E entity,
 | 
			
		||||
                                                                                     List<EdgeId> edgeIds) {
 | 
			
		||||
    private <E extends HasName, I extends EntityId> void sendDeleteNotificationMsg(TenantId tenantId, I entityId, E entity, List<EdgeId> edgeIds) {
 | 
			
		||||
        try {
 | 
			
		||||
            sendDeleteNotificationMsg(tenantId, entityId, edgeIds, null);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
@ -298,17 +297,17 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
 | 
			
		||||
    private void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds, String body) {
 | 
			
		||||
        if (edgeIds != null && !edgeIds.isEmpty()) {
 | 
			
		||||
            for (EdgeId edgeId : edgeIds) {
 | 
			
		||||
                sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, body, null, EdgeEventActionType.DELETED);
 | 
			
		||||
                sendNotificationMsgToEdge(tenantId, edgeId, entityId, body, null, EdgeEventActionType.DELETED);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void sendEntityAssignToEdgeNotificationMsg(TenantId tenantId, EdgeId edgeId, EntityId entityId, EdgeEventActionType action) {
 | 
			
		||||
        sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, null, null, action);
 | 
			
		||||
        sendNotificationMsgToEdge(tenantId, edgeId, entityId, null, null, action);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void sendNotificationMsgToEdgeService(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action) {
 | 
			
		||||
        tbClusterService.sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, body, type, action);
 | 
			
		||||
    private void sendNotificationMsgToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action) {
 | 
			
		||||
        tbClusterService.sendNotificationMsgToEdge(tenantId, edgeId, entityId, body, type, action);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void pushAssignedFromNotification(Tenant currentTenant, TenantId newTenantId, Device assignedDevice) {
 | 
			
		||||
 | 
			
		||||
@ -441,12 +441,12 @@ public class DefaultTbClusterService implements TbClusterService {
 | 
			
		||||
        sendDeviceStateServiceEvent(device.getTenantId(), device.getId(), created, !created, false);
 | 
			
		||||
        otaPackageStateService.update(device, old);
 | 
			
		||||
        if (!created && notifyEdge) {
 | 
			
		||||
            sendNotificationMsgToEdgeService(device.getTenantId(), null, device.getId(), null, null, EdgeEventActionType.UPDATED);
 | 
			
		||||
            sendNotificationMsgToEdge(device.getTenantId(), null, device.getId(), null, null, EdgeEventActionType.UPDATED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendNotificationMsgToEdgeService(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action) {
 | 
			
		||||
    public void sendNotificationMsgToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action) {
 | 
			
		||||
        if (!edgesEnabled) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,7 @@ public class AssetImportService extends BaseEntityImportService<AssetId, Asset,
 | 
			
		||||
    protected void onEntitySaved(SecurityUser user, Asset savedAsset, Asset oldAsset) throws ThingsboardException {
 | 
			
		||||
        super.onEntitySaved(user, savedAsset, oldAsset);
 | 
			
		||||
        if (oldAsset != null) {
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdgeService(user.getTenantId(), savedAsset.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdge(user.getTenantId(), savedAsset.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -72,7 +72,7 @@ public class CustomerImportService extends BaseEntityImportService<CustomerId, C
 | 
			
		||||
    protected void onEntitySaved(SecurityUser user, Customer savedCustomer, Customer oldCustomer) throws ThingsboardException {
 | 
			
		||||
        super.onEntitySaved(user, savedCustomer, oldCustomer);
 | 
			
		||||
        if (oldCustomer != null) {
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdgeService(user.getTenantId(), savedCustomer.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdge(user.getTenantId(), savedCustomer.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -16,8 +16,6 @@
 | 
			
		||||
package org.thingsboard.server.service.sync.ie.importing.impl;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
			
		||||
import com.fasterxml.jackson.databind.node.ObjectNode;
 | 
			
		||||
import com.google.common.collect.Lists;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.thingsboard.common.util.JacksonUtil;
 | 
			
		||||
@ -28,23 +26,19 @@ import org.thingsboard.server.common.data.edge.EdgeEventActionType;
 | 
			
		||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
 | 
			
		||||
import org.thingsboard.server.common.data.id.CustomerId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.DashboardId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.sync.ie.EntityExportData;
 | 
			
		||||
import org.thingsboard.server.dao.dashboard.DashboardService;
 | 
			
		||||
import org.thingsboard.server.queue.util.TbCoreComponent;
 | 
			
		||||
import org.thingsboard.server.service.security.model.SecurityUser;
 | 
			
		||||
import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx;
 | 
			
		||||
import org.thingsboard.common.util.RegexUtils;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.LinkedHashSet;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
@ -127,7 +121,7 @@ public class DashboardImportService extends BaseEntityImportService<DashboardId,
 | 
			
		||||
    protected void onEntitySaved(SecurityUser user, Dashboard savedDashboard, Dashboard oldDashboard) throws ThingsboardException {
 | 
			
		||||
        super.onEntitySaved(user, savedDashboard, oldDashboard);
 | 
			
		||||
        if (oldDashboard != null) {
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdgeService(user.getTenantId(), savedDashboard.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdge(user.getTenantId(), savedDashboard.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -66,7 +66,7 @@ public class DeviceProfileImportService extends BaseEntityImportService<DevicePr
 | 
			
		||||
        clusterService.onDeviceProfileChange(savedDeviceProfile, null);
 | 
			
		||||
        clusterService.broadcastEntityStateChangeEvent(user.getTenantId(), savedDeviceProfile.getId(),
 | 
			
		||||
                oldDeviceProfile == null ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED);
 | 
			
		||||
        entityActionService.sendEntityNotificationMsgToEdgeService(user.getTenantId(), savedDeviceProfile.getId(),
 | 
			
		||||
        entityActionService.sendEntityNotificationMsgToEdge(user.getTenantId(), savedDeviceProfile.getId(),
 | 
			
		||||
                oldDeviceProfile == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED);
 | 
			
		||||
        otaPackageStateService.update(savedDeviceProfile,
 | 
			
		||||
                oldDeviceProfile != null && !Objects.equals(oldDeviceProfile.getFirmwareId(), savedDeviceProfile.getFirmwareId()),
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,6 @@ import org.springframework.context.annotation.Lazy;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.thingsboard.server.common.data.EntityType;
 | 
			
		||||
import org.thingsboard.server.common.data.EntityView;
 | 
			
		||||
import org.thingsboard.server.common.data.asset.Asset;
 | 
			
		||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
 | 
			
		||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityViewId;
 | 
			
		||||
@ -66,7 +65,7 @@ public class EntityViewImportService extends BaseEntityImportService<EntityViewI
 | 
			
		||||
        tbEntityViewService.updateEntityViewAttributes(user, savedEntityView, oldEntityView);
 | 
			
		||||
        super.onEntitySaved(user, savedEntityView, oldEntityView);
 | 
			
		||||
        if (oldEntityView != null) {
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdgeService(user.getTenantId(), savedEntityView.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdge(user.getTenantId(), savedEntityView.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -15,11 +15,9 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.service.sync.ie.importing.impl;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.thingsboard.common.util.JacksonUtil;
 | 
			
		||||
import org.thingsboard.server.common.data.EntityType;
 | 
			
		||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
 | 
			
		||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
 | 
			
		||||
@ -37,14 +35,12 @@ import org.thingsboard.server.dao.rule.RuleNodeDao;
 | 
			
		||||
import org.thingsboard.server.queue.util.TbCoreComponent;
 | 
			
		||||
import org.thingsboard.server.service.security.model.SecurityUser;
 | 
			
		||||
import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx;
 | 
			
		||||
import org.thingsboard.common.util.RegexUtils;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.LinkedHashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
@ -135,7 +131,7 @@ public class RuleChainImportService extends BaseEntityImportService<RuleChainId,
 | 
			
		||||
            clusterService.broadcastEntityStateChangeEvent(user.getTenantId(), savedRuleChain.getId(),
 | 
			
		||||
                    oldRuleChain == null ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED);
 | 
			
		||||
        } else if (savedRuleChain.getType() == RuleChainType.EDGE && oldRuleChain != null) {
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdgeService(user.getTenantId(), savedRuleChain.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
            entityActionService.sendEntityNotificationMsgToEdge(user.getTenantId(), savedRuleChain.getId(), EdgeEventActionType.UPDATED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -476,7 +476,7 @@ public class ExportImportServiceSqlTest extends BaseExportImportServiceTest {
 | 
			
		||||
        Customer updatedCustomer = importEntity(tenantAdmin2, updatedCustomerEntity).getSavedEntity();
 | 
			
		||||
        verify(entityActionService).logEntityAction(any(), eq(importedCustomer.getId()), eq(updatedCustomer),
 | 
			
		||||
                any(), eq(ActionType.UPDATED), isNull());
 | 
			
		||||
        verify(tbClusterService).sendNotificationMsgToEdgeService(any(), any(), eq(importedCustomer.getId()), any(), any(), eq(EdgeEventActionType.UPDATED));
 | 
			
		||||
        verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedCustomer.getId()), any(), any(), eq(EdgeEventActionType.UPDATED));
 | 
			
		||||
 | 
			
		||||
        Mockito.reset(entityActionService);
 | 
			
		||||
 | 
			
		||||
@ -494,7 +494,7 @@ public class ExportImportServiceSqlTest extends BaseExportImportServiceTest {
 | 
			
		||||
 | 
			
		||||
        verify(entityActionService).logEntityAction(any(), eq(importedAsset.getId()), eq(updatedAsset),
 | 
			
		||||
                any(), eq(ActionType.UPDATED), isNull());
 | 
			
		||||
        verify(tbClusterService).sendNotificationMsgToEdgeService(any(), any(), eq(importedAsset.getId()), any(), any(), eq(EdgeEventActionType.UPDATED));
 | 
			
		||||
        verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedAsset.getId()), any(), any(), eq(EdgeEventActionType.UPDATED));
 | 
			
		||||
 | 
			
		||||
        RuleChain importedRuleChain = (RuleChain) importEntity(tenantAdmin2, getAndClone(entitiesExportData, EntityType.RULE_CHAIN)).getSavedEntity();
 | 
			
		||||
        verify(entityActionService).logEntityAction(any(), eq(importedRuleChain.getId()), eq(importedRuleChain),
 | 
			
		||||
@ -510,7 +510,7 @@ public class ExportImportServiceSqlTest extends BaseExportImportServiceTest {
 | 
			
		||||
                any(), eq(ActionType.ADDED), isNull());
 | 
			
		||||
        verify(tbClusterService).onDeviceProfileChange(eq(importedDeviceProfile), any());
 | 
			
		||||
        verify(tbClusterService).broadcastEntityStateChangeEvent(any(), eq(importedDeviceProfile.getId()), eq(ComponentLifecycleEvent.CREATED));
 | 
			
		||||
        verify(tbClusterService).sendNotificationMsgToEdgeService(any(), any(), eq(importedDeviceProfile.getId()), any(), any(), eq(EdgeEventActionType.ADDED));
 | 
			
		||||
        verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedDeviceProfile.getId()), any(), any(), eq(EdgeEventActionType.ADDED));
 | 
			
		||||
        verify(otaPackageStateService).update(eq(importedDeviceProfile), eq(false), eq(false));
 | 
			
		||||
 | 
			
		||||
        Device importedDevice = (Device) importEntity(tenantAdmin2, getAndClone(entitiesExportData, EntityType.DEVICE)).getSavedEntity();
 | 
			
		||||
 | 
			
		||||
@ -88,5 +88,5 @@ public interface TbClusterService extends TbQueueClusterService {
 | 
			
		||||
 | 
			
		||||
    void onEdgeEventUpdate(TenantId tenantId, EdgeId edgeId);
 | 
			
		||||
 | 
			
		||||
    void sendNotificationMsgToEdgeService(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action);
 | 
			
		||||
    void sendNotificationMsgToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -84,5 +84,5 @@ public interface EdgeService {
 | 
			
		||||
 | 
			
		||||
    PageData<EdgeId> findRelatedEdgeIdsByEntityId(TenantId tenantId, EntityId entityId, PageLink pageLink);
 | 
			
		||||
 | 
			
		||||
    String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId);
 | 
			
		||||
    String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId, String tbRuleChainInputNodeClassName);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,6 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.edge;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.ObjectMapper;
 | 
			
		||||
import com.fasterxml.jackson.databind.node.ArrayNode;
 | 
			
		||||
import com.fasterxml.jackson.databind.node.ObjectNode;
 | 
			
		||||
import com.google.common.base.Function;
 | 
			
		||||
@ -27,6 +26,7 @@ import org.hibernate.exception.ConstraintViolationException;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.event.TransactionalEventListener;
 | 
			
		||||
import org.thingsboard.common.util.JacksonUtil;
 | 
			
		||||
import org.thingsboard.server.common.data.EntitySubtype;
 | 
			
		||||
import org.thingsboard.server.common.data.EntityType;
 | 
			
		||||
import org.thingsboard.server.common.data.StringUtils;
 | 
			
		||||
@ -46,7 +46,7 @@ import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.common.data.relation.EntityRelation;
 | 
			
		||||
import org.thingsboard.server.common.data.relation.EntitySearchDirection;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.RuleChain;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.RuleChainConnectionInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.RuleNode;
 | 
			
		||||
import org.thingsboard.server.dao.entity.AbstractCachedEntityService;
 | 
			
		||||
import org.thingsboard.server.dao.exception.DataValidationException;
 | 
			
		||||
import org.thingsboard.server.dao.relation.RelationService;
 | 
			
		||||
@ -62,6 +62,7 @@ import java.util.Collections;
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import static org.thingsboard.server.dao.DaoUtil.toUUIDs;
 | 
			
		||||
@ -78,8 +79,6 @@ public class EdgeServiceImpl extends AbstractCachedEntityService<EdgeCacheKey, E
 | 
			
		||||
    public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId ";
 | 
			
		||||
    public static final String INCORRECT_EDGE_ID = "Incorrect edgeId ";
 | 
			
		||||
 | 
			
		||||
    private static final ObjectMapper mapper = new ObjectMapper();
 | 
			
		||||
 | 
			
		||||
    private static final int DEFAULT_PAGE_SIZE = 1000;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
@ -451,16 +450,19 @@ public class EdgeServiceImpl extends AbstractCachedEntityService<EdgeCacheKey, E
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId) {
 | 
			
		||||
    public String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId, String tbRuleChainInputNodeClassName) {
 | 
			
		||||
        List<RuleChain> edgeRuleChains = findEdgeRuleChains(tenantId, edgeId);
 | 
			
		||||
        List<RuleChainId> edgeRuleChainIds = edgeRuleChains.stream().map(IdBased::getId).collect(Collectors.toList());
 | 
			
		||||
        ObjectNode result = mapper.createObjectNode();
 | 
			
		||||
        ObjectNode result = JacksonUtil.OBJECT_MAPPER.createObjectNode();
 | 
			
		||||
        for (RuleChain edgeRuleChain : edgeRuleChains) {
 | 
			
		||||
            List<RuleChainConnectionInfo> connectionInfos =
 | 
			
		||||
                    ruleChainService.loadRuleChainMetaData(edgeRuleChain.getTenantId(), edgeRuleChain.getId()).getRuleChainConnections();
 | 
			
		||||
            if (connectionInfos != null && !connectionInfos.isEmpty()) {
 | 
			
		||||
            List<RuleNode> ruleNodes =
 | 
			
		||||
                    ruleChainService.loadRuleChainMetaData(edgeRuleChain.getTenantId(), edgeRuleChain.getId()).getNodes();
 | 
			
		||||
            if (ruleNodes != null && !ruleNodes.isEmpty()) {
 | 
			
		||||
                List<RuleChainId> connectedRuleChains =
 | 
			
		||||
                        connectionInfos.stream().map(RuleChainConnectionInfo::getTargetRuleChainId).collect(Collectors.toList());
 | 
			
		||||
                        ruleNodes.stream()
 | 
			
		||||
                                .filter(rn -> rn.getType().equals(tbRuleChainInputNodeClassName))
 | 
			
		||||
                                .map(rn -> new RuleChainId(UUID.fromString(rn.getConfiguration().get("ruleChainId").asText())))
 | 
			
		||||
                                .collect(Collectors.toList());
 | 
			
		||||
                List<String> missingRuleChains = new ArrayList<>();
 | 
			
		||||
                for (RuleChainId connectedRuleChain : connectedRuleChains) {
 | 
			
		||||
                    if (!edgeRuleChainIds.contains(connectedRuleChain)) {
 | 
			
		||||
@ -469,7 +471,7 @@ public class EdgeServiceImpl extends AbstractCachedEntityService<EdgeCacheKey, E
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (!missingRuleChains.isEmpty()) {
 | 
			
		||||
                    ArrayNode array = mapper.createArrayNode();
 | 
			
		||||
                    ArrayNode array = JacksonUtil.OBJECT_MAPPER.createArrayNode();
 | 
			
		||||
                    for (String missingRuleChain : missingRuleChains) {
 | 
			
		||||
                        array.add(missingRuleChain);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@ -16,11 +16,13 @@
 | 
			
		||||
package org.thingsboard.server.dao.service;
 | 
			
		||||
 | 
			
		||||
import com.datastax.oss.driver.api.core.uuid.Uuids;
 | 
			
		||||
import com.fasterxml.jackson.databind.node.ObjectNode;
 | 
			
		||||
import org.apache.commons.lang3.RandomStringUtils;
 | 
			
		||||
import org.junit.After;
 | 
			
		||||
import org.junit.Assert;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.thingsboard.common.util.JacksonUtil;
 | 
			
		||||
import org.thingsboard.server.common.data.Customer;
 | 
			
		||||
import org.thingsboard.server.common.data.EntitySubtype;
 | 
			
		||||
import org.thingsboard.server.common.data.Tenant;
 | 
			
		||||
@ -29,9 +31,14 @@ import org.thingsboard.server.common.data.id.CustomerId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.RuleChain;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.RuleChainMetaData;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.RuleChainType;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.RuleNode;
 | 
			
		||||
import org.thingsboard.server.dao.exception.DataValidationException;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@ -602,4 +609,55 @@ public abstract class BaseEdgeServiceTest extends AbstractServiceTest {
 | 
			
		||||
        edgeService.deleteEdge(tenantId, savedEdge.getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testFindMissingToRelatedRuleChains() {
 | 
			
		||||
        Edge edge = constructEdge("My edge", "default");
 | 
			
		||||
        Edge savedEdge = edgeService.saveEdge(edge);
 | 
			
		||||
 | 
			
		||||
        RuleChain ruleChain = new RuleChain();
 | 
			
		||||
        ruleChain.setTenantId(tenantId);
 | 
			
		||||
        ruleChain.setName("Rule Chain #1");
 | 
			
		||||
        ruleChain.setType(RuleChainType.EDGE);
 | 
			
		||||
        RuleChain ruleChain1 = ruleChainService.saveRuleChain(ruleChain);
 | 
			
		||||
 | 
			
		||||
        ruleChain = new RuleChain();
 | 
			
		||||
        ruleChain.setTenantId(tenantId);
 | 
			
		||||
        ruleChain.setName("Rule Chain #2");
 | 
			
		||||
        ruleChain.setType(RuleChainType.EDGE);
 | 
			
		||||
        RuleChain ruleChain2 = ruleChainService.saveRuleChain(ruleChain);
 | 
			
		||||
 | 
			
		||||
        ruleChain = new RuleChain();
 | 
			
		||||
        ruleChain.setTenantId(tenantId);
 | 
			
		||||
        ruleChain.setName("Rule Chain #3");
 | 
			
		||||
        ruleChain.setType(RuleChainType.EDGE);
 | 
			
		||||
        RuleChain ruleChain3 = ruleChainService.saveRuleChain(ruleChain);
 | 
			
		||||
 | 
			
		||||
        RuleNode ruleNode1 = new RuleNode();
 | 
			
		||||
        ruleNode1.setName("Input rule node 1");
 | 
			
		||||
        ruleNode1.setType("org.thingsboard.rule.engine.flow.TbRuleChainInputNode");
 | 
			
		||||
        ObjectNode configuration = JacksonUtil.OBJECT_MAPPER.createObjectNode();
 | 
			
		||||
        configuration.put("ruleChainId", ruleChain1.getUuidId().toString());
 | 
			
		||||
        ruleNode1.setConfiguration(configuration);
 | 
			
		||||
 | 
			
		||||
        RuleNode ruleNode2 = new RuleNode();
 | 
			
		||||
        ruleNode2.setName("Input rule node 2");
 | 
			
		||||
        ruleNode2.setType("org.thingsboard.rule.engine.flow.TbRuleChainInputNode");
 | 
			
		||||
        configuration = JacksonUtil.OBJECT_MAPPER.createObjectNode();
 | 
			
		||||
        configuration.put("ruleChainId", ruleChain2.getUuidId().toString());
 | 
			
		||||
        ruleNode2.setConfiguration(configuration);
 | 
			
		||||
 | 
			
		||||
        RuleChainMetaData ruleChainMetaData3 = new RuleChainMetaData();
 | 
			
		||||
        ruleChainMetaData3.setNodes(Arrays.asList(ruleNode1, ruleNode2));
 | 
			
		||||
        ruleChainMetaData3.setFirstNodeIndex(0);
 | 
			
		||||
        ruleChainMetaData3.setRuleChainId(ruleChain3.getId());
 | 
			
		||||
        ruleChainService.saveRuleChainMetaData(tenantId, ruleChainMetaData3);
 | 
			
		||||
 | 
			
		||||
        ruleChainService.assignRuleChainToEdge(tenantId, ruleChain3.getId(), savedEdge.getId());
 | 
			
		||||
 | 
			
		||||
        String missingToRelatedRuleChains = edgeService.findMissingToRelatedRuleChains(tenantId,
 | 
			
		||||
                savedEdge.getId(),
 | 
			
		||||
                "org.thingsboard.rule.engine.flow.TbRuleChainInputNode");
 | 
			
		||||
        Assert.assertEquals("{\"Rule Chain #3\":[\"Rule Chain #1\",\"Rule Chain #2\"]}", missingToRelatedRuleChains);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user