Commit 995bac539c7c9fd3ffa9cf5e90fa2447a2680e3a

Authored by Volodymyr Babak
1 parent c5d93d17

Added findMissingToRelatedRuleChains method

@@ -15,6 +15,9 @@ @@ -15,6 +15,9 @@
15 */ 15 */
16 package org.thingsboard.server.controller; 16 package org.thingsboard.server.controller;
17 17
  18 +import com.fasterxml.jackson.databind.ObjectMapper;
  19 +import com.fasterxml.jackson.databind.node.ArrayNode;
  20 +import com.fasterxml.jackson.databind.node.ObjectNode;
18 import com.google.common.util.concurrent.ListenableFuture; 21 import com.google.common.util.concurrent.ListenableFuture;
19 import org.springframework.http.HttpStatus; 22 import org.springframework.http.HttpStatus;
20 import org.springframework.security.access.prepost.PreAuthorize; 23 import org.springframework.security.access.prepost.PreAuthorize;
@@ -54,6 +57,7 @@ import org.thingsboard.server.service.security.permission.Operation; @@ -54,6 +57,7 @@ import org.thingsboard.server.service.security.permission.Operation;
54 import org.thingsboard.server.service.security.permission.Resource; 57 import org.thingsboard.server.service.security.permission.Resource;
55 58
56 import java.util.ArrayList; 59 import java.util.ArrayList;
  60 +import java.util.Arrays;
57 import java.util.List; 61 import java.util.List;
58 import java.util.stream.Collectors; 62 import java.util.stream.Collectors;
59 63
@@ -486,14 +490,18 @@ public class EdgeController extends BaseController { @@ -486,14 +490,18 @@ public class EdgeController extends BaseController {
486 } 490 }
487 491
488 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 492 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
489 - @RequestMapping(value = "/edge/sync", method = RequestMethod.POST)  
490 - public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException { 493 + @RequestMapping(value = "/edge/sync/{edgeId}", method = RequestMethod.POST)
  494 + public void syncEdge(@PathVariable("edgeId") String strEdgeId) throws ThingsboardException {
  495 + checkParameter("edgeId", strEdgeId);
491 try { 496 try {
492 - edgeId = checkNotNull(edgeId);  
493 if (isEdgesEnabled()) { 497 if (isEdgesEnabled()) {
494 - EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(edgeId); 498 + EdgeId edgeId = new EdgeId(toUUID(strEdgeId));
  499 + edgeId = checkNotNull(edgeId);
  500 + SecurityUser user = getCurrentUser();
  501 + TenantId tenantId = user.getTenantId();
  502 + EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(tenantId, edgeId);
495 Edge edge = session.getEdge(); 503 Edge edge = session.getEdge();
496 - syncEdgeService.sync(edge); 504 + syncEdgeService.sync(tenantId, edge);
497 } else { 505 } else {
498 throw new ThingsboardException("Edges support disabled", ThingsboardErrorCode.GENERAL); 506 throw new ThingsboardException("Edges support disabled", ThingsboardErrorCode.GENERAL);
499 } 507 }
@@ -522,4 +530,19 @@ public class EdgeController extends BaseController { @@ -522,4 +530,19 @@ public class EdgeController extends BaseController {
522 throw new ThingsboardException(e, ThingsboardErrorCode.SUBSCRIPTION_VIOLATION); 530 throw new ThingsboardException(e, ThingsboardErrorCode.SUBSCRIPTION_VIOLATION);
523 } 531 }
524 } 532 }
  533 +
  534 + @PreAuthorize("hasAuthority('TENANT_ADMIN')")
  535 + @RequestMapping(value = "/edge/missingToRelatedRuleChains/{edgeId}", method = RequestMethod.GET)
  536 + @ResponseBody
  537 + public String findMissingToRelatedRuleChains(@PathVariable("edgeId") String strEdgeId) throws ThingsboardException {
  538 + try {
  539 + EdgeId edgeId = new EdgeId(toUUID(strEdgeId));
  540 + edgeId = checkNotNull(edgeId);
  541 + SecurityUser user = getCurrentUser();
  542 + TenantId tenantId = user.getTenantId();
  543 + return edgeService.findMissingToRelatedRuleChains(tenantId, edgeId);
  544 + } catch (Exception e) {
  545 + throw handleException(e);
  546 + }
  547 + }
525 } 548 }
@@ -113,11 +113,6 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { @@ -113,11 +113,6 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
113 } 113 }
114 114
115 @Override 115 @Override
116 - public PageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) {  
117 - return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true);  
118 - }  
119 -  
120 - @Override  
121 public Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException { 116 public Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException {
122 edge.setRootRuleChainId(ruleChainId); 117 edge.setRootRuleChainId(ruleChainId);
123 Edge savedEdge = edgeService.saveEdge(edge); 118 Edge savedEdge = edgeService.saveEdge(edge);
@@ -29,6 +29,7 @@ import org.thingsboard.server.dao.dashboard.DashboardService; @@ -29,6 +29,7 @@ import org.thingsboard.server.dao.dashboard.DashboardService;
29 import org.thingsboard.server.dao.device.DeviceCredentialsService; 29 import org.thingsboard.server.dao.device.DeviceCredentialsService;
30 import org.thingsboard.server.dao.device.DeviceProfileService; 30 import org.thingsboard.server.dao.device.DeviceProfileService;
31 import org.thingsboard.server.dao.device.DeviceService; 31 import org.thingsboard.server.dao.device.DeviceService;
  32 +import org.thingsboard.server.dao.edge.EdgeEventService;
32 import org.thingsboard.server.dao.edge.EdgeService; 33 import org.thingsboard.server.dao.edge.EdgeService;
33 import org.thingsboard.server.dao.entityview.EntityViewService; 34 import org.thingsboard.server.dao.entityview.EntityViewService;
34 import org.thingsboard.server.dao.relation.RelationService; 35 import org.thingsboard.server.dao.relation.RelationService;
@@ -76,7 +77,7 @@ public class EdgeContextComponent { @@ -76,7 +77,7 @@ public class EdgeContextComponent {
76 77
77 @Lazy 78 @Lazy
78 @Autowired 79 @Autowired
79 - private EdgeNotificationService edgeNotificationService; 80 + private EdgeEventService edgeEventService;
80 81
81 @Lazy 82 @Lazy
82 @Autowired 83 @Autowired
@@ -16,12 +16,8 @@ @@ -16,12 +16,8 @@
16 package org.thingsboard.server.service.edge; 16 package org.thingsboard.server.service.edge;
17 17
18 import org.thingsboard.server.common.data.edge.Edge; 18 import org.thingsboard.server.common.data.edge.Edge;
19 -import org.thingsboard.server.common.data.edge.EdgeEvent;  
20 -import org.thingsboard.server.common.data.id.EdgeId;  
21 import org.thingsboard.server.common.data.id.RuleChainId; 19 import org.thingsboard.server.common.data.id.RuleChainId;
22 import org.thingsboard.server.common.data.id.TenantId; 20 import org.thingsboard.server.common.data.id.TenantId;
23 -import org.thingsboard.server.common.data.page.PageData;  
24 -import org.thingsboard.server.common.data.page.TimePageLink;  
25 import org.thingsboard.server.common.msg.queue.TbCallback; 21 import org.thingsboard.server.common.msg.queue.TbCallback;
26 import org.thingsboard.server.gen.transport.TransportProtos; 22 import org.thingsboard.server.gen.transport.TransportProtos;
27 23
@@ -29,8 +25,6 @@ import java.io.IOException; @@ -29,8 +25,6 @@ import java.io.IOException;
29 25
30 public interface EdgeNotificationService { 26 public interface EdgeNotificationService {
31 27
32 - PageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink);  
33 -  
34 Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException; 28 Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException;
35 29
36 void pushNotificationToEdge(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback); 30 void pushNotificationToEdge(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback);
@@ -186,11 +186,12 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i @@ -186,11 +186,12 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
186 scheduleEdgeEventsCheck(edgeGrpcSession); 186 scheduleEdgeEventsCheck(edgeGrpcSession);
187 } 187 }
188 188
189 - public EdgeGrpcSession getEdgeGrpcSessionById(EdgeId edgeId) { 189 + public EdgeGrpcSession getEdgeGrpcSessionById(TenantId tenantId, EdgeId edgeId) {
190 EdgeGrpcSession session = sessions.get(edgeId); 190 EdgeGrpcSession session = sessions.get(edgeId);
191 if (session != null && session.isConnected()) { 191 if (session != null && session.isConnected()) {
192 return session; 192 return session;
193 } else { 193 } else {
  194 + log.error("[{}] Edge is not connected [{}]", tenantId, edgeId);
194 throw new RuntimeException("Edge is not connected"); 195 throw new RuntimeException("Edge is not connected");
195 } 196 }
196 } 197 }
@@ -170,7 +170,7 @@ public final class EdgeGrpcSession implements Closeable { @@ -170,7 +170,7 @@ public final class EdgeGrpcSession implements Closeable {
170 } 170 }
171 } 171 }
172 if (connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) { 172 if (connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) {
173 - ctx.getSyncEdgeService().sync(edge); 173 + ctx.getSyncEdgeService().sync(edge.getTenantId(), edge);
174 } 174 }
175 if (connected) { 175 if (connected) {
176 if (requestMsg.getMsgType().equals(RequestMsgType.UPLINK_RPC_MESSAGE) && requestMsg.hasUplinkMsg()) { 176 if (requestMsg.getMsgType().equals(RequestMsgType.UPLINK_RPC_MESSAGE) && requestMsg.hasUplinkMsg()) {
@@ -277,7 +277,7 @@ public final class EdgeGrpcSession implements Closeable { @@ -277,7 +277,7 @@ public final class EdgeGrpcSession implements Closeable {
277 UUID ifOffset = null; 277 UUID ifOffset = null;
278 boolean success = true; 278 boolean success = true;
279 do { 279 do {
280 - pageData = ctx.getEdgeNotificationService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink); 280 + pageData = ctx.getEdgeEventService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink, true);
281 if (isConnected() && !pageData.getData().isEmpty()) { 281 if (isConnected() && !pageData.getData().isEmpty()) {
282 log.trace("[{}] [{}] event(s) are going to be processed.", this.sessionId, pageData.getData().size()); 282 log.trace("[{}] [{}] event(s) are going to be processed.", this.sessionId, pageData.getData().size());
283 List<DownlinkMsg> downlinkMsgsPack = convertToDownlinkMsgsPack(pageData.getData()); 283 List<DownlinkMsg> downlinkMsgsPack = convertToDownlinkMsgsPack(pageData.getData());
@@ -938,27 +938,27 @@ public final class EdgeGrpcSession implements Closeable { @@ -938,27 +938,27 @@ public final class EdgeGrpcSession implements Closeable {
938 } 938 }
939 if (uplinkMsg.getRuleChainMetadataRequestMsgCount() > 0) { 939 if (uplinkMsg.getRuleChainMetadataRequestMsgCount() > 0) {
940 for (RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg : uplinkMsg.getRuleChainMetadataRequestMsgList()) { 940 for (RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg : uplinkMsg.getRuleChainMetadataRequestMsgList()) {
941 - result.add(ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge, ruleChainMetadataRequestMsg)); 941 + result.add(ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge.getTenantId(), edge, ruleChainMetadataRequestMsg));
942 } 942 }
943 } 943 }
944 if (uplinkMsg.getAttributesRequestMsgCount() > 0) { 944 if (uplinkMsg.getAttributesRequestMsgCount() > 0) {
945 for (AttributesRequestMsg attributesRequestMsg : uplinkMsg.getAttributesRequestMsgList()) { 945 for (AttributesRequestMsg attributesRequestMsg : uplinkMsg.getAttributesRequestMsgList()) {
946 - result.add(ctx.getSyncEdgeService().processAttributesRequestMsg(edge, attributesRequestMsg)); 946 + result.add(ctx.getSyncEdgeService().processAttributesRequestMsg(edge.getTenantId(), edge, attributesRequestMsg));
947 } 947 }
948 } 948 }
949 if (uplinkMsg.getRelationRequestMsgCount() > 0) { 949 if (uplinkMsg.getRelationRequestMsgCount() > 0) {
950 for (RelationRequestMsg relationRequestMsg : uplinkMsg.getRelationRequestMsgList()) { 950 for (RelationRequestMsg relationRequestMsg : uplinkMsg.getRelationRequestMsgList()) {
951 - result.add(ctx.getSyncEdgeService().processRelationRequestMsg(edge, relationRequestMsg)); 951 + result.add(ctx.getSyncEdgeService().processRelationRequestMsg(edge.getTenantId(), edge, relationRequestMsg));
952 } 952 }
953 } 953 }
954 if (uplinkMsg.getUserCredentialsRequestMsgCount() > 0) { 954 if (uplinkMsg.getUserCredentialsRequestMsgCount() > 0) {
955 for (UserCredentialsRequestMsg userCredentialsRequestMsg : uplinkMsg.getUserCredentialsRequestMsgList()) { 955 for (UserCredentialsRequestMsg userCredentialsRequestMsg : uplinkMsg.getUserCredentialsRequestMsgList()) {
956 - result.add(ctx.getSyncEdgeService().processUserCredentialsRequestMsg(edge, userCredentialsRequestMsg)); 956 + result.add(ctx.getSyncEdgeService().processUserCredentialsRequestMsg(edge.getTenantId(), edge, userCredentialsRequestMsg));
957 } 957 }
958 } 958 }
959 if (uplinkMsg.getDeviceCredentialsRequestMsgCount() > 0) { 959 if (uplinkMsg.getDeviceCredentialsRequestMsgCount() > 0) {
960 for (DeviceCredentialsRequestMsg deviceCredentialsRequestMsg : uplinkMsg.getDeviceCredentialsRequestMsgList()) { 960 for (DeviceCredentialsRequestMsg deviceCredentialsRequestMsg : uplinkMsg.getDeviceCredentialsRequestMsgList()) {
961 - result.add(ctx.getSyncEdgeService().processDeviceCredentialsRequestMsg(edge, deviceCredentialsRequestMsg)); 961 + result.add(ctx.getSyncEdgeService().processDeviceCredentialsRequestMsg(edge.getTenantId(), edge, deviceCredentialsRequestMsg));
962 } 962 }
963 } 963 }
964 if (uplinkMsg.getDeviceRpcCallMsgCount() > 0) { 964 if (uplinkMsg.getDeviceRpcCallMsgCount() > 0) {
@@ -148,35 +148,35 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -148,35 +148,35 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
148 private TbClusterService tbClusterService; 148 private TbClusterService tbClusterService;
149 149
150 @Override 150 @Override
151 - public void sync(Edge edge) {  
152 - log.trace("[{}][{}] Staring edge sync process", edge.getTenantId(), edge.getId()); 151 + public void sync(TenantId tenantId, Edge edge) {
  152 + log.trace("[{}][{}] Staring edge sync process", tenantId, edge.getId());
153 try { 153 try {
154 - syncWidgetsBundleAndWidgetTypes(edge); 154 + syncWidgetsBundleAndWidgetTypes(tenantId, edge);
155 // TODO: voba - implement this functionality 155 // TODO: voba - implement this functionality
156 // syncAdminSettings(edge); 156 // syncAdminSettings(edge);
157 - syncRuleChains(edge);  
158 - syncDeviceProfiles(edge);  
159 - syncUsers(edge);  
160 - syncDevices(edge);  
161 - syncAssets(edge);  
162 - syncEntityViews(edge);  
163 - syncDashboards(edge); 157 + syncRuleChains(tenantId, edge);
  158 + syncDeviceProfiles(tenantId, edge);
  159 + syncUsers(tenantId, edge);
  160 + syncDevices(tenantId, edge);
  161 + syncAssets(tenantId, edge);
  162 + syncEntityViews(tenantId, edge);
  163 + syncDashboards(tenantId, edge);
164 } catch (Exception e) { 164 } catch (Exception e) {
165 - log.error("[{}][{}] Exception during sync process", edge.getTenantId(), edge.getId(), e); 165 + log.error("[{}][{}] Exception during sync process", tenantId, edge.getId(), e);
166 } 166 }
167 } 167 }
168 168
169 - private void syncRuleChains(Edge edge) {  
170 - log.trace("[{}] syncRuleChains [{}]", edge.getTenantId(), edge.getName()); 169 + private void syncRuleChains(TenantId tenantId, Edge edge) {
  170 + log.trace("[{}] syncRuleChains [{}]", tenantId, edge.getName());
171 try { 171 try {
172 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); 172 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
173 PageData<RuleChain> pageData; 173 PageData<RuleChain> pageData;
174 do { 174 do {
175 - pageData = ruleChainService.findRuleChainsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); 175 + pageData = ruleChainService.findRuleChainsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
176 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { 176 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
177 log.trace("[{}] [{}] rule chains(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); 177 log.trace("[{}] [{}] rule chains(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
178 for (RuleChain ruleChain : pageData.getData()) { 178 for (RuleChain ruleChain : pageData.getData()) {
179 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN, EdgeEventActionType.ADDED, ruleChain.getId(), null); 179 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RULE_CHAIN, EdgeEventActionType.ADDED, ruleChain.getId(), null);
180 } 180 }
181 if (pageData.hasNext()) { 181 if (pageData.hasNext()) {
182 pageLink = pageLink.nextPageLink(); 182 pageLink = pageLink.nextPageLink();
@@ -188,17 +188,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -188,17 +188,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
188 } 188 }
189 } 189 }
190 190
191 - private void syncDevices(Edge edge) {  
192 - log.trace("[{}] syncDevices [{}]", edge.getTenantId(), edge.getName()); 191 + private void syncDevices(TenantId tenantId, Edge edge) {
  192 + log.trace("[{}] syncDevices [{}]", tenantId, edge.getName());
193 try { 193 try {
194 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); 194 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
195 PageData<Device> pageData; 195 PageData<Device> pageData;
196 do { 196 do {
197 - pageData = deviceService.findDevicesByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); 197 + pageData = deviceService.findDevicesByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
198 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { 198 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
199 log.trace("[{}] [{}] device(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); 199 log.trace("[{}] [{}] device(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
200 for (Device device : pageData.getData()) { 200 for (Device device : pageData.getData()) {
201 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null); 201 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null);
202 } 202 }
203 if (pageData.hasNext()) { 203 if (pageData.hasNext()) {
204 pageLink = pageLink.nextPageLink(); 204 pageLink = pageLink.nextPageLink();
@@ -210,17 +210,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -210,17 +210,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
210 } 210 }
211 } 211 }
212 212
213 - private void syncDeviceProfiles(Edge edge) {  
214 - log.trace("[{}] syncDeviceProfiles [{}]", edge.getTenantId(), edge.getName()); 213 + private void syncDeviceProfiles(TenantId tenantId, Edge edge) {
  214 + log.trace("[{}] syncDeviceProfiles [{}]", tenantId, edge.getName());
215 try { 215 try {
216 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); 216 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
217 PageData<DeviceProfile> pageData; 217 PageData<DeviceProfile> pageData;
218 do { 218 do {
219 - pageData = deviceProfileService.findDeviceProfiles(edge.getTenantId(), pageLink); 219 + pageData = deviceProfileService.findDeviceProfiles(tenantId, pageLink);
220 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { 220 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
221 log.trace("[{}] [{}] user(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); 221 log.trace("[{}] [{}] user(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
222 for (DeviceProfile deviceProfile : pageData.getData()) { 222 for (DeviceProfile deviceProfile : pageData.getData()) {
223 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE_PROFILE, EdgeEventActionType.ADDED, deviceProfile.getId(), null); 223 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE_PROFILE, EdgeEventActionType.ADDED, deviceProfile.getId(), null);
224 } 224 }
225 if (pageData.hasNext()) { 225 if (pageData.hasNext()) {
226 pageLink = pageLink.nextPageLink(); 226 pageLink = pageLink.nextPageLink();
@@ -232,17 +232,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -232,17 +232,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
232 } 232 }
233 } 233 }
234 234
235 - private void syncAssets(Edge edge) {  
236 - log.trace("[{}] syncAssets [{}]", edge.getTenantId(), edge.getName()); 235 + private void syncAssets(TenantId tenantId, Edge edge) {
  236 + log.trace("[{}] syncAssets [{}]", tenantId, edge.getName());
237 try { 237 try {
238 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); 238 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
239 PageData<Asset> pageData; 239 PageData<Asset> pageData;
240 do { 240 do {
241 - pageData = assetService.findAssetsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); 241 + pageData = assetService.findAssetsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
242 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { 242 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
243 log.trace("[{}] [{}] asset(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); 243 log.trace("[{}] [{}] asset(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
244 for (Asset asset : pageData.getData()) { 244 for (Asset asset : pageData.getData()) {
245 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ASSET, EdgeEventActionType.ADDED, asset.getId(), null); 245 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ASSET, EdgeEventActionType.ADDED, asset.getId(), null);
246 } 246 }
247 if (pageData.hasNext()) { 247 if (pageData.hasNext()) {
248 pageLink = pageLink.nextPageLink(); 248 pageLink = pageLink.nextPageLink();
@@ -254,17 +254,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -254,17 +254,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
254 } 254 }
255 } 255 }
256 256
257 - private void syncEntityViews(Edge edge) {  
258 - log.trace("[{}] syncEntityViews [{}]", edge.getTenantId(), edge.getName()); 257 + private void syncEntityViews(TenantId tenantId, Edge edge) {
  258 + log.trace("[{}] syncEntityViews [{}]", tenantId, edge.getName());
259 try { 259 try {
260 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); 260 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
261 PageData<EntityView> pageData; 261 PageData<EntityView> pageData;
262 do { 262 do {
263 - pageData = entityViewService.findEntityViewsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); 263 + pageData = entityViewService.findEntityViewsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
264 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { 264 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
265 log.trace("[{}] [{}] entity view(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); 265 log.trace("[{}] [{}] entity view(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
266 for (EntityView entityView : pageData.getData()) { 266 for (EntityView entityView : pageData.getData()) {
267 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ENTITY_VIEW, EdgeEventActionType.ADDED, entityView.getId(), null); 267 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ENTITY_VIEW, EdgeEventActionType.ADDED, entityView.getId(), null);
268 } 268 }
269 if (pageData.hasNext()) { 269 if (pageData.hasNext()) {
270 pageLink = pageLink.nextPageLink(); 270 pageLink = pageLink.nextPageLink();
@@ -276,17 +276,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -276,17 +276,17 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
276 } 276 }
277 } 277 }
278 278
279 - private void syncDashboards(Edge edge) {  
280 - log.trace("[{}] syncDashboards [{}]", edge.getTenantId(), edge.getName()); 279 + private void syncDashboards(TenantId tenantId, Edge edge) {
  280 + log.trace("[{}] syncDashboards [{}]", tenantId, edge.getName());
281 try { 281 try {
282 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); 282 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
283 PageData<DashboardInfo> pageData; 283 PageData<DashboardInfo> pageData;
284 do { 284 do {
285 - pageData = dashboardService.findDashboardsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); 285 + pageData = dashboardService.findDashboardsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
286 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { 286 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
287 log.trace("[{}] [{}] dashboard(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); 287 log.trace("[{}] [{}] dashboard(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
288 for (DashboardInfo dashboardInfo : pageData.getData()) { 288 for (DashboardInfo dashboardInfo : pageData.getData()) {
289 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DASHBOARD, EdgeEventActionType.ADDED, dashboardInfo.getId(), null); 289 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DASHBOARD, EdgeEventActionType.ADDED, dashboardInfo.getId(), null);
290 } 290 }
291 if (pageData.hasNext()) { 291 if (pageData.hasNext()) {
292 pageLink = pageLink.nextPageLink(); 292 pageLink = pageLink.nextPageLink();
@@ -298,32 +298,32 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -298,32 +298,32 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
298 } 298 }
299 } 299 }
300 300
301 - private void syncUsers(Edge edge) {  
302 - log.trace("[{}] syncUsers [{}]", edge.getTenantId(), edge.getName()); 301 + private void syncUsers(TenantId tenantId, Edge edge) {
  302 + log.trace("[{}] syncUsers [{}]", tenantId, edge.getName());
303 try { 303 try {
304 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); 304 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
305 PageData<User> pageData; 305 PageData<User> pageData;
306 do { 306 do {
307 - pageData = userService.findTenantAdmins(edge.getTenantId(), pageLink);  
308 - pushUsersToEdge(pageData, edge); 307 + pageData = userService.findTenantAdmins(tenantId, pageLink);
  308 + pushUsersToEdge(tenantId, pageData, edge);
309 if (pageData.hasNext()) { 309 if (pageData.hasNext()) {
310 pageLink = pageLink.nextPageLink(); 310 pageLink = pageLink.nextPageLink();
311 } 311 }
312 } while (pageData.hasNext()); 312 } while (pageData.hasNext());
313 - syncCustomerUsers(edge); 313 + syncCustomerUsers(tenantId, edge);
314 } catch (Exception e) { 314 } catch (Exception e) {
315 log.error("Exception during loading edge user(s) on sync!", e); 315 log.error("Exception during loading edge user(s) on sync!", e);
316 } 316 }
317 } 317 }
318 318
319 - private void syncCustomerUsers(Edge edge) { 319 + private void syncCustomerUsers(TenantId tenantId, Edge edge) {
320 if (edge.getCustomerId() != null && !EntityId.NULL_UUID.equals(edge.getCustomerId().getId())) { 320 if (edge.getCustomerId() != null && !EntityId.NULL_UUID.equals(edge.getCustomerId().getId())) {
321 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.CUSTOMER, EdgeEventActionType.ADDED, edge.getCustomerId(), null); 321 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.CUSTOMER, EdgeEventActionType.ADDED, edge.getCustomerId(), null);
322 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); 322 TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
323 PageData<User> pageData; 323 PageData<User> pageData;
324 do { 324 do {
325 - pageData = userService.findCustomerUsers(edge.getTenantId(), edge.getCustomerId(), pageLink);  
326 - pushUsersToEdge(pageData, edge); 325 + pageData = userService.findCustomerUsers(tenantId, edge.getCustomerId(), pageLink);
  326 + pushUsersToEdge(tenantId, pageData, edge);
327 if (pageData != null && pageData.hasNext()) { 327 if (pageData != null && pageData.hasNext()) {
328 pageLink = pageLink.nextPageLink(); 328 pageLink = pageLink.nextPageLink();
329 } 329 }
@@ -331,45 +331,45 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -331,45 +331,45 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
331 } 331 }
332 } 332 }
333 333
334 - private void pushUsersToEdge(PageData<User> pageData, Edge edge) { 334 + private void pushUsersToEdge(TenantId tenantId, PageData<User> pageData, Edge edge) {
335 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { 335 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
336 log.trace("[{}] [{}] user(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); 336 log.trace("[{}] [{}] user(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
337 for (User user : pageData.getData()) { 337 for (User user : pageData.getData()) {
338 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, EdgeEventActionType.ADDED, user.getId(), null); 338 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.ADDED, user.getId(), null);
339 } 339 }
340 } 340 }
341 } 341 }
342 342
343 - private void syncWidgetsBundleAndWidgetTypes(Edge edge) {  
344 - log.trace("[{}] syncWidgetsBundleAndWidgetTypes [{}]", edge.getTenantId(), edge.getName()); 343 + private void syncWidgetsBundleAndWidgetTypes(TenantId tenantId, Edge edge) {
  344 + log.trace("[{}] syncWidgetsBundleAndWidgetTypes [{}]", tenantId, edge.getName());
345 List<WidgetsBundle> widgetsBundlesToPush = new ArrayList<>(); 345 List<WidgetsBundle> widgetsBundlesToPush = new ArrayList<>();
346 List<WidgetType> widgetTypesToPush = new ArrayList<>(); 346 List<WidgetType> widgetTypesToPush = new ArrayList<>();
347 - widgetsBundlesToPush.addAll(widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(edge.getTenantId()));  
348 - widgetsBundlesToPush.addAll(widgetsBundleService.findSystemWidgetsBundles(edge.getTenantId())); 347 + widgetsBundlesToPush.addAll(widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(tenantId));
  348 + widgetsBundlesToPush.addAll(widgetsBundleService.findSystemWidgetsBundles(tenantId));
349 try { 349 try {
350 for (WidgetsBundle widgetsBundle: widgetsBundlesToPush) { 350 for (WidgetsBundle widgetsBundle: widgetsBundlesToPush) {
351 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.WIDGETS_BUNDLE, EdgeEventActionType.ADDED, widgetsBundle.getId(), null); 351 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGETS_BUNDLE, EdgeEventActionType.ADDED, widgetsBundle.getId(), null);
352 widgetTypesToPush.addAll(widgetTypeService.findWidgetTypesByTenantIdAndBundleAlias(widgetsBundle.getTenantId(), widgetsBundle.getAlias())); 352 widgetTypesToPush.addAll(widgetTypeService.findWidgetTypesByTenantIdAndBundleAlias(widgetsBundle.getTenantId(), widgetsBundle.getAlias()));
353 } 353 }
354 for (WidgetType widgetType: widgetTypesToPush) { 354 for (WidgetType widgetType: widgetTypesToPush) {
355 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null); 355 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null);
356 } 356 }
357 } catch (Exception e) { 357 } catch (Exception e) {
358 log.error("Exception during loading widgets bundle(s) and widget type(s) on sync!", e); 358 log.error("Exception during loading widgets bundle(s) and widget type(s) on sync!", e);
359 } 359 }
360 } 360 }
361 361
362 - private void syncAdminSettings(Edge edge) {  
363 - log.trace("[{}] syncAdminSettings [{}]", edge.getTenantId(), edge.getName()); 362 + private void syncAdminSettings(TenantId tenantId, Edge edge) {
  363 + log.trace("[{}] syncAdminSettings [{}]", tenantId, edge.getName());
364 try { 364 try {
365 AdminSettings systemMailSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail"); 365 AdminSettings systemMailSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail");
366 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings)); 366 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings));
367 AdminSettings tenantMailSettings = convertToTenantAdminSettings(systemMailSettings.getKey(), (ObjectNode) systemMailSettings.getJsonValue()); 367 AdminSettings tenantMailSettings = convertToTenantAdminSettings(systemMailSettings.getKey(), (ObjectNode) systemMailSettings.getJsonValue());
368 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings)); 368 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings));
369 AdminSettings systemMailTemplates = loadMailTemplates(); 369 AdminSettings systemMailTemplates = loadMailTemplates();
370 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates)); 370 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates));
371 AdminSettings tenantMailTemplates = convertToTenantAdminSettings(systemMailTemplates.getKey(), (ObjectNode) systemMailTemplates.getJsonValue()); 371 AdminSettings tenantMailTemplates = convertToTenantAdminSettings(systemMailTemplates.getKey(), (ObjectNode) systemMailTemplates.getJsonValue());
372 - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates)); 372 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates));
373 } catch (Exception e) { 373 } catch (Exception e) {
374 log.error("Can't load admin settings", e); 374 log.error("Can't load admin settings", e);
375 } 375 }
@@ -428,13 +428,13 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -428,13 +428,13 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
428 } 428 }
429 429
430 @Override 430 @Override
431 - public ListenableFuture<Void> processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) {  
432 - log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), ruleChainMetadataRequestMsg); 431 + public ListenableFuture<Void> processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) {
  432 + log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", tenantId, edge.getName(), ruleChainMetadataRequestMsg);
433 SettableFuture<Void> futureToSet = SettableFuture.create(); 433 SettableFuture<Void> futureToSet = SettableFuture.create();
434 if (ruleChainMetadataRequestMsg.getRuleChainIdMSB() != 0 && ruleChainMetadataRequestMsg.getRuleChainIdLSB() != 0) { 434 if (ruleChainMetadataRequestMsg.getRuleChainIdMSB() != 0 && ruleChainMetadataRequestMsg.getRuleChainIdLSB() != 0) {
435 RuleChainId ruleChainId = 435 RuleChainId ruleChainId =
436 new RuleChainId(new UUID(ruleChainMetadataRequestMsg.getRuleChainIdMSB(), ruleChainMetadataRequestMsg.getRuleChainIdLSB())); 436 new RuleChainId(new UUID(ruleChainMetadataRequestMsg.getRuleChainIdMSB(), ruleChainMetadataRequestMsg.getRuleChainIdLSB()));
437 - ListenableFuture<EdgeEvent> future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null); 437 + ListenableFuture<EdgeEvent> future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null);
438 Futures.addCallback(future, new FutureCallback<EdgeEvent>() { 438 Futures.addCallback(future, new FutureCallback<EdgeEvent>() {
439 @Override 439 @Override
440 public void onSuccess(@Nullable EdgeEvent result) { 440 public void onSuccess(@Nullable EdgeEvent result) {
@@ -452,8 +452,8 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -452,8 +452,8 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
452 } 452 }
453 453
454 @Override 454 @Override
455 - public ListenableFuture<Void> processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg) {  
456 - log.trace("[{}] processAttributesRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), attributesRequestMsg); 455 + public ListenableFuture<Void> processAttributesRequestMsg(TenantId tenantId, Edge edge, AttributesRequestMsg attributesRequestMsg) {
  456 + log.trace("[{}] processAttributesRequestMsg [{}][{}]", tenantId, edge.getName(), attributesRequestMsg);
457 EntityId entityId = EntityIdFactory.getByTypeAndUuid( 457 EntityId entityId = EntityIdFactory.getByTypeAndUuid(
458 EntityType.valueOf(attributesRequestMsg.getEntityType()), 458 EntityType.valueOf(attributesRequestMsg.getEntityType()),
459 new UUID(attributesRequestMsg.getEntityIdMSB(), attributesRequestMsg.getEntityIdLSB())); 459 new UUID(attributesRequestMsg.getEntityIdMSB(), attributesRequestMsg.getEntityIdLSB()));
@@ -461,7 +461,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -461,7 +461,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
461 if (type != null) { 461 if (type != null) {
462 SettableFuture<Void> futureToSet = SettableFuture.create(); 462 SettableFuture<Void> futureToSet = SettableFuture.create();
463 String scope = attributesRequestMsg.getScope(); 463 String scope = attributesRequestMsg.getScope();
464 - ListenableFuture<List<AttributeKvEntry>> ssAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, scope); 464 + ListenableFuture<List<AttributeKvEntry>> ssAttrFuture = attributesService.findAll(tenantId, entityId, scope);
465 Futures.addCallback(ssAttrFuture, new FutureCallback<List<AttributeKvEntry>>() { 465 Futures.addCallback(ssAttrFuture, new FutureCallback<List<AttributeKvEntry>>() {
466 @Override 466 @Override
467 public void onSuccess(@Nullable List<AttributeKvEntry> ssAttributes) { 467 public void onSuccess(@Nullable List<AttributeKvEntry> ssAttributes) {
@@ -484,7 +484,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -484,7 +484,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
484 entityData.put("scope", scope); 484 entityData.put("scope", scope);
485 JsonNode body = mapper.valueToTree(entityData); 485 JsonNode body = mapper.valueToTree(entityData);
486 log.debug("Sending attributes data msg, entityId [{}], attributes [{}]", entityId, body); 486 log.debug("Sending attributes data msg, entityId [{}], attributes [{}]", entityId, body);
487 - saveEdgeEvent(edge.getTenantId(), 487 + saveEdgeEvent(tenantId,
488 edge.getId(), 488 edge.getId(),
489 type, 489 type,
490 EdgeEventActionType.ATTRIBUTES_UPDATED, 490 EdgeEventActionType.ATTRIBUTES_UPDATED,
@@ -495,7 +495,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -495,7 +495,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
495 throw new RuntimeException("[" + edge.getName() + "] Failed to send attribute updates to the edge", e); 495 throw new RuntimeException("[" + edge.getName() + "] Failed to send attribute updates to the edge", e);
496 } 496 }
497 } else { 497 } else {
498 - log.trace("[{}][{}] No attributes found for entity {} [{}]", edge.getTenantId(), 498 + log.trace("[{}][{}] No attributes found for entity {} [{}]", tenantId,
499 edge.getName(), 499 edge.getName(),
500 entityId.getEntityType(), 500 entityId.getEntityType(),
501 entityId.getId()); 501 entityId.getId());
@@ -511,21 +511,21 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -511,21 +511,21 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
511 }, dbCallbackExecutorService); 511 }, dbCallbackExecutorService);
512 return futureToSet; 512 return futureToSet;
513 } else { 513 } else {
514 - log.warn("[{}] Type doesn't supported {}", edge.getTenantId(), entityId.getEntityType()); 514 + log.warn("[{}] Type doesn't supported {}", tenantId, entityId.getEntityType());
515 return Futures.immediateFuture(null); 515 return Futures.immediateFuture(null);
516 } 516 }
517 } 517 }
518 518
519 @Override 519 @Override
520 - public ListenableFuture<Void> processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg) {  
521 - log.trace("[{}] processRelationRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), relationRequestMsg); 520 + public ListenableFuture<Void> processRelationRequestMsg(TenantId tenantId, Edge edge, RelationRequestMsg relationRequestMsg) {
  521 + log.trace("[{}] processRelationRequestMsg [{}][{}]", tenantId, edge.getName(), relationRequestMsg);
522 EntityId entityId = EntityIdFactory.getByTypeAndUuid( 522 EntityId entityId = EntityIdFactory.getByTypeAndUuid(
523 EntityType.valueOf(relationRequestMsg.getEntityType()), 523 EntityType.valueOf(relationRequestMsg.getEntityType()),
524 new UUID(relationRequestMsg.getEntityIdMSB(), relationRequestMsg.getEntityIdLSB())); 524 new UUID(relationRequestMsg.getEntityIdMSB(), relationRequestMsg.getEntityIdLSB()));
525 525
526 List<ListenableFuture<List<EntityRelation>>> futures = new ArrayList<>(); 526 List<ListenableFuture<List<EntityRelation>>> futures = new ArrayList<>();
527 - futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.FROM));  
528 - futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.TO)); 527 + futures.add(findRelationByQuery(tenantId, edge, entityId, EntitySearchDirection.FROM));
  528 + futures.add(findRelationByQuery(tenantId, edge, entityId, EntitySearchDirection.TO));
529 ListenableFuture<List<List<EntityRelation>>> relationsListFuture = Futures.allAsList(futures); 529 ListenableFuture<List<List<EntityRelation>>> relationsListFuture = Futures.allAsList(futures);
530 SettableFuture<Void> futureToSet = SettableFuture.create(); 530 SettableFuture<Void> futureToSet = SettableFuture.create();
531 Futures.addCallback(relationsListFuture, new FutureCallback<List<List<EntityRelation>>>() { 531 Futures.addCallback(relationsListFuture, new FutureCallback<List<List<EntityRelation>>>() {
@@ -539,7 +539,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -539,7 +539,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
539 try { 539 try {
540 if (!relation.getFrom().getEntityType().equals(EntityType.EDGE) && 540 if (!relation.getFrom().getEntityType().equals(EntityType.EDGE) &&
541 !relation.getTo().getEntityType().equals(EntityType.EDGE)) { 541 !relation.getTo().getEntityType().equals(EntityType.EDGE)) {
542 - saveEdgeEvent(edge.getTenantId(), 542 + saveEdgeEvent(tenantId,
543 edge.getId(), 543 edge.getId(),
544 EdgeEventType.RELATION, 544 EdgeEventType.RELATION,
545 EdgeEventActionType.ADDED, 545 EdgeEventActionType.ADDED,
@@ -563,26 +563,26 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -563,26 +563,26 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
563 563
564 @Override 564 @Override
565 public void onFailure(Throwable t) { 565 public void onFailure(Throwable t) {
566 - log.error("[{}] Can't find relation by query. Entity id [{}]", edge.getTenantId(), entityId, t); 566 + log.error("[{}] Can't find relation by query. Entity id [{}]", tenantId, entityId, t);
567 futureToSet.setException(t); 567 futureToSet.setException(t);
568 } 568 }
569 }, dbCallbackExecutorService); 569 }, dbCallbackExecutorService);
570 return futureToSet; 570 return futureToSet;
571 } 571 }
572 572
573 - private ListenableFuture<List<EntityRelation>> findRelationByQuery(Edge edge, EntityId entityId, EntitySearchDirection direction) { 573 + private ListenableFuture<List<EntityRelation>> findRelationByQuery(TenantId tenantId, Edge edge, EntityId entityId, EntitySearchDirection direction) {
574 EntityRelationsQuery query = new EntityRelationsQuery(); 574 EntityRelationsQuery query = new EntityRelationsQuery();
575 query.setParameters(new RelationsSearchParameters(entityId, direction, -1, false)); 575 query.setParameters(new RelationsSearchParameters(entityId, direction, -1, false));
576 - return relationService.findByQuery(edge.getTenantId(), query); 576 + return relationService.findByQuery(tenantId, query);
577 } 577 }
578 578
579 @Override 579 @Override
580 - public ListenableFuture<Void> processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) {  
581 - log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), deviceCredentialsRequestMsg); 580 + public ListenableFuture<Void> processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) {
  581 + log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), deviceCredentialsRequestMsg);
582 SettableFuture<Void> futureToSet = SettableFuture.create(); 582 SettableFuture<Void> futureToSet = SettableFuture.create();
583 if (deviceCredentialsRequestMsg.getDeviceIdMSB() != 0 && deviceCredentialsRequestMsg.getDeviceIdLSB() != 0) { 583 if (deviceCredentialsRequestMsg.getDeviceIdMSB() != 0 && deviceCredentialsRequestMsg.getDeviceIdLSB() != 0) {
584 DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsRequestMsg.getDeviceIdMSB(), deviceCredentialsRequestMsg.getDeviceIdLSB())); 584 DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsRequestMsg.getDeviceIdMSB(), deviceCredentialsRequestMsg.getDeviceIdLSB()));
585 - ListenableFuture<EdgeEvent> future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null); 585 + ListenableFuture<EdgeEvent> future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null);
586 Futures.addCallback(future, new FutureCallback<EdgeEvent>() { 586 Futures.addCallback(future, new FutureCallback<EdgeEvent>() {
587 @Override 587 @Override
588 public void onSuccess(@Nullable EdgeEvent result) { 588 public void onSuccess(@Nullable EdgeEvent result) {
@@ -600,12 +600,12 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @@ -600,12 +600,12 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
600 } 600 }
601 601
602 @Override 602 @Override
603 - public ListenableFuture<Void> processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) {  
604 - log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), userCredentialsRequestMsg); 603 + public ListenableFuture<Void> processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) {
  604 + log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), userCredentialsRequestMsg);
605 SettableFuture<Void> futureToSet = SettableFuture.create(); 605 SettableFuture<Void> futureToSet = SettableFuture.create();
606 if (userCredentialsRequestMsg.getUserIdMSB() != 0 && userCredentialsRequestMsg.getUserIdLSB() != 0) { 606 if (userCredentialsRequestMsg.getUserIdMSB() != 0 && userCredentialsRequestMsg.getUserIdLSB() != 0) {
607 UserId userId = new UserId(new UUID(userCredentialsRequestMsg.getUserIdMSB(), userCredentialsRequestMsg.getUserIdLSB())); 607 UserId userId = new UserId(new UUID(userCredentialsRequestMsg.getUserIdMSB(), userCredentialsRequestMsg.getUserIdLSB()));
608 - ListenableFuture<EdgeEvent> future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, EdgeEventActionType.CREDENTIALS_UPDATED, userId, null); 608 + ListenableFuture<EdgeEvent> future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.CREDENTIALS_UPDATED, userId, null);
609 Futures.addCallback(future, new FutureCallback<EdgeEvent>() { 609 Futures.addCallback(future, new FutureCallback<EdgeEvent>() {
610 @Override 610 @Override
611 public void onSuccess(@Nullable EdgeEvent result) { 611 public void onSuccess(@Nullable EdgeEvent result) {
@@ -17,6 +17,7 @@ package org.thingsboard.server.service.edge.rpc.init; @@ -17,6 +17,7 @@ package org.thingsboard.server.service.edge.rpc.init;
17 17
18 import com.google.common.util.concurrent.ListenableFuture; 18 import com.google.common.util.concurrent.ListenableFuture;
19 import org.thingsboard.server.common.data.edge.Edge; 19 import org.thingsboard.server.common.data.edge.Edge;
  20 +import org.thingsboard.server.common.data.id.TenantId;
20 import org.thingsboard.server.gen.edge.AttributesRequestMsg; 21 import org.thingsboard.server.gen.edge.AttributesRequestMsg;
21 import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg; 22 import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg;
22 import org.thingsboard.server.gen.edge.RelationRequestMsg; 23 import org.thingsboard.server.gen.edge.RelationRequestMsg;
@@ -25,15 +26,15 @@ import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg; @@ -25,15 +26,15 @@ import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg;
25 26
26 public interface SyncEdgeService { 27 public interface SyncEdgeService {
27 28
28 - void sync(Edge edge); 29 + void sync(TenantId tenantId, Edge edge);
29 30
30 - ListenableFuture<Void> processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg); 31 + ListenableFuture<Void> processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg);
31 32
32 - ListenableFuture<Void> processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg); 33 + ListenableFuture<Void> processAttributesRequestMsg(TenantId tenantId, Edge edge, AttributesRequestMsg attributesRequestMsg);
33 34
34 - ListenableFuture<Void> processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg); 35 + ListenableFuture<Void> processRelationRequestMsg(TenantId tenantId, Edge edge, RelationRequestMsg relationRequestMsg);
35 36
36 - ListenableFuture<Void> processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg); 37 + ListenableFuture<Void> processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg);
37 38
38 - ListenableFuture<Void> processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg); 39 + ListenableFuture<Void> processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg);
39 } 40 }
@@ -91,4 +91,6 @@ public interface EdgeService { @@ -91,4 +91,6 @@ public interface EdgeService {
91 Object checkInstance(Object request); 91 Object checkInstance(Object request);
92 92
93 Object activateInstance(String licenseSecret, String releaseDate); 93 Object activateInstance(String licenseSecret, String releaseDate);
  94 +
  95 + String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId);
94 } 96 }
@@ -15,6 +15,9 @@ @@ -15,6 +15,9 @@
15 */ 15 */
16 package org.thingsboard.server.dao.edge; 16 package org.thingsboard.server.dao.edge;
17 17
  18 +import com.fasterxml.jackson.databind.ObjectMapper;
  19 +import com.fasterxml.jackson.databind.node.ArrayNode;
  20 +import com.fasterxml.jackson.databind.node.ObjectNode;
18 import com.google.common.base.Function; 21 import com.google.common.base.Function;
19 import com.google.common.util.concurrent.FutureCallback; 22 import com.google.common.util.concurrent.FutureCallback;
20 import com.google.common.util.concurrent.Futures; 23 import com.google.common.util.concurrent.Futures;
@@ -43,6 +46,8 @@ import org.thingsboard.server.common.data.EntityType; @@ -43,6 +46,8 @@ import org.thingsboard.server.common.data.EntityType;
43 import org.thingsboard.server.common.data.Tenant; 46 import org.thingsboard.server.common.data.Tenant;
44 import org.thingsboard.server.common.data.User; 47 import org.thingsboard.server.common.data.User;
45 import org.thingsboard.server.common.data.edge.Edge; 48 import org.thingsboard.server.common.data.edge.Edge;
  49 +import org.thingsboard.server.common.data.edge.EdgeEventActionType;
  50 +import org.thingsboard.server.common.data.edge.EdgeEventType;
46 import org.thingsboard.server.common.data.edge.EdgeInfo; 51 import org.thingsboard.server.common.data.edge.EdgeInfo;
47 import org.thingsboard.server.common.data.edge.EdgeSearchQuery; 52 import org.thingsboard.server.common.data.edge.EdgeSearchQuery;
48 import org.thingsboard.server.common.data.id.CustomerId; 53 import org.thingsboard.server.common.data.id.CustomerId;
@@ -55,10 +60,12 @@ import org.thingsboard.server.common.data.id.TenantId; @@ -55,10 +60,12 @@ import org.thingsboard.server.common.data.id.TenantId;
55 import org.thingsboard.server.common.data.id.UserId; 60 import org.thingsboard.server.common.data.id.UserId;
56 import org.thingsboard.server.common.data.page.PageData; 61 import org.thingsboard.server.common.data.page.PageData;
57 import org.thingsboard.server.common.data.page.PageLink; 62 import org.thingsboard.server.common.data.page.PageLink;
  63 +import org.thingsboard.server.common.data.page.TimePageLink;
58 import org.thingsboard.server.common.data.relation.EntityRelation; 64 import org.thingsboard.server.common.data.relation.EntityRelation;
59 import org.thingsboard.server.common.data.relation.EntitySearchDirection; 65 import org.thingsboard.server.common.data.relation.EntitySearchDirection;
60 import org.thingsboard.server.common.data.relation.RelationTypeGroup; 66 import org.thingsboard.server.common.data.relation.RelationTypeGroup;
61 import org.thingsboard.server.common.data.rule.RuleChain; 67 import org.thingsboard.server.common.data.rule.RuleChain;
  68 +import org.thingsboard.server.common.data.rule.RuleChainConnectionInfo;
62 import org.thingsboard.server.dao.customer.CustomerDao; 69 import org.thingsboard.server.dao.customer.CustomerDao;
63 import org.thingsboard.server.dao.entity.AbstractEntityService; 70 import org.thingsboard.server.dao.entity.AbstractEntityService;
64 import org.thingsboard.server.dao.exception.DataValidationException; 71 import org.thingsboard.server.dao.exception.DataValidationException;
@@ -100,6 +107,8 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic @@ -100,6 +107,8 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
100 public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId "; 107 public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId ";
101 public static final String INCORRECT_EDGE_ID = "Incorrect edgeId "; 108 public static final String INCORRECT_EDGE_ID = "Incorrect edgeId ";
102 109
  110 + private static final ObjectMapper mapper = new ObjectMapper();
  111 +
103 private static final int DEFAULT_LIMIT = 100; 112 private static final int DEFAULT_LIMIT = 100;
104 113
105 private RestTemplate restTemplate; 114 private RestTemplate restTemplate;
@@ -583,6 +592,52 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic @@ -583,6 +592,52 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
583 return this.restTemplate.postForEntity(EDGE_LICENSE_SERVER_ENDPOINT + "/api/license/activateInstance?licenseSecret={licenseSecret}&releaseDate={releaseDate}", (Object) null, Object.class, params); 592 return this.restTemplate.postForEntity(EDGE_LICENSE_SERVER_ENDPOINT + "/api/license/activateInstance?licenseSecret={licenseSecret}&releaseDate={releaseDate}", (Object) null, Object.class, params);
584 } 593 }
585 594
  595 + @Override
  596 + public String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId) {
  597 + List<RuleChain> edgeRuleChains = findEdgeRuleChains(tenantId, edgeId);
  598 + List<RuleChainId> edgeRuleChainIds = edgeRuleChains.stream().map(IdBased::getId).collect(Collectors.toList());
  599 + ObjectNode result = mapper.createObjectNode();
  600 + for (RuleChain edgeRuleChain : edgeRuleChains) {
  601 + List<RuleChainConnectionInfo> connectionInfos =
  602 + ruleChainService.loadRuleChainMetaData(edgeRuleChain.getTenantId(), edgeRuleChain.getId()).getRuleChainConnections();
  603 + if (connectionInfos != null && !connectionInfos.isEmpty()) {
  604 + List<RuleChainId> connectedRuleChains =
  605 + connectionInfos.stream().map(RuleChainConnectionInfo::getTargetRuleChainId).collect(Collectors.toList());
  606 + List<String> missingRuleChains = new ArrayList<>();
  607 + for (RuleChainId connectedRuleChain : connectedRuleChains) {
  608 + if (!edgeRuleChainIds.contains(connectedRuleChain)) {
  609 + RuleChain ruleChainById = ruleChainService.findRuleChainById(tenantId, connectedRuleChain);
  610 + missingRuleChains.add(ruleChainById.getName());
  611 + }
  612 + }
  613 + if (!missingRuleChains.isEmpty()) {
  614 + ArrayNode array = mapper.createArrayNode();
  615 + for (String missingRuleChain : missingRuleChains) {
  616 + array.add(missingRuleChain);
  617 + }
  618 + result.set(edgeRuleChain.getName(), array);
  619 + }
  620 + }
  621 + }
  622 + return result.toString();
  623 + }
  624 +
  625 + private List<RuleChain> findEdgeRuleChains(TenantId tenantId, EdgeId edgeId) {
  626 + List<RuleChain> result = new ArrayList<>();
  627 + TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
  628 + PageData<RuleChain> pageData;
  629 + do {
  630 + pageData = ruleChainService.findRuleChainsByTenantIdAndEdgeId(tenantId, edgeId, pageLink);
  631 + if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
  632 + result.addAll(pageData.getData());
  633 + if (pageData.hasNext()) {
  634 + pageLink = pageLink.nextPageLink();
  635 + }
  636 + }
  637 + } while (pageData != null && pageData.hasNext());
  638 + return result;
  639 + }
  640 +
586 private void initRestTemplate() { 641 private void initRestTemplate() {
587 boolean jdkHttpClientEnabled = isNotEmpty(System.getProperty("tb.proxy.jdk")) && System.getProperty("tb.proxy.jdk").equalsIgnoreCase("true"); 642 boolean jdkHttpClientEnabled = isNotEmpty(System.getProperty("tb.proxy.jdk")) && System.getProperty("tb.proxy.jdk").equalsIgnoreCase("true");
588 boolean systemProxyEnabled = isNotEmpty(System.getProperty("tb.proxy.system")) && System.getProperty("tb.proxy.system").equalsIgnoreCase("true"); 643 boolean systemProxyEnabled = isNotEmpty(System.getProperty("tb.proxy.system")) && System.getProperty("tb.proxy.system").equalsIgnoreCase("true");
@@ -749,9 +749,9 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC @@ -749,9 +749,9 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
749 } 749 }
750 } 750 }
751 if (ruleChain.isRoot() && RuleChainType.EDGE.equals(ruleChain.getType())) { 751 if (ruleChain.isRoot() && RuleChainType.EDGE.equals(ruleChain.getType())) {
752 - RuleChain defaultRootEdgeRuleChain = getEdgeTemplateRootRuleChain(ruleChain.getTenantId());  
753 - if (defaultRootEdgeRuleChain != null && !defaultRootEdgeRuleChain.getId().equals(ruleChain.getId())) {  
754 - throw new DataValidationException("Another default root edge rule chain is present in scope of current tenant!"); 752 + RuleChain edgeTemplateRootRuleChain = getEdgeTemplateRootRuleChain(ruleChain.getTenantId());
  753 + if (edgeTemplateRootRuleChain != null && !edgeTemplateRootRuleChain.getId().equals(ruleChain.getId())) {
  754 + throw new DataValidationException("Another edge template root rule chain is present in scope of current tenant!");
755 } 755 }
756 } 756 }
757 } 757 }
@@ -2678,7 +2678,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { @@ -2678,7 +2678,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
2678 2678
2679 public Optional<RuleChain> setAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) { 2679 public Optional<RuleChain> setAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) {
2680 try { 2680 try {
2681 - ResponseEntity<RuleChain> ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/defaultEdge", null, RuleChain.class, ruleChainId.getId()); 2681 + ResponseEntity<RuleChain> ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/autoAssignToEdge", null, RuleChain.class, ruleChainId.getId());
2682 return Optional.ofNullable(ruleChain.getBody()); 2682 return Optional.ofNullable(ruleChain.getBody());
2683 } catch (HttpClientErrorException exception) { 2683 } catch (HttpClientErrorException exception) {
2684 if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { 2684 if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
@@ -2691,7 +2691,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { @@ -2691,7 +2691,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
2691 2691
2692 public Optional<RuleChain> unsetAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) { 2692 public Optional<RuleChain> unsetAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) {
2693 try { 2693 try {
2694 - ResponseEntity<RuleChain> ruleChain = restTemplate.exchange(baseURL + "/api/ruleChain/{ruleChainId}/defaultEdge", HttpMethod.DELETE, HttpEntity.EMPTY, RuleChain.class, ruleChainId.getId()); 2694 + ResponseEntity<RuleChain> ruleChain = restTemplate.exchange(baseURL + "/api/ruleChain/{ruleChainId}/autoAssignToEdge", HttpMethod.DELETE, HttpEntity.EMPTY, RuleChain.class, ruleChainId.getId());
2695 return Optional.ofNullable(ruleChain.getBody()); 2695 return Optional.ofNullable(ruleChain.getBody());
2696 } catch (HttpClientErrorException exception) { 2696 } catch (HttpClientErrorException exception) {
2697 if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { 2697 if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
@@ -2703,7 +2703,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { @@ -2703,7 +2703,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
2703 } 2703 }
2704 2704
2705 public List<RuleChain> getAutoAssignToEdgeRuleChains() { 2705 public List<RuleChain> getAutoAssignToEdgeRuleChains() {
2706 - return restTemplate.exchange(baseURL + "/api/ruleChain/defaultEdgeRuleChains", 2706 + return restTemplate.exchange(baseURL + "/api/ruleChain/autoAssignToEdgeRuleChains",
2707 HttpMethod.GET, 2707 HttpMethod.GET,
2708 HttpEntity.EMPTY, 2708 HttpEntity.EMPTY,
2709 new ParameterizedTypeReference<List<RuleChain>>() { 2709 new ParameterizedTypeReference<List<RuleChain>>() {
@@ -97,7 +97,11 @@ export class EdgeService { @@ -97,7 +97,11 @@ export class EdgeService {
97 defaultHttpOptionsFromConfig(config)); 97 defaultHttpOptionsFromConfig(config));
98 } 98 }
99 99
100 - public syncEdge(edgeId: EdgeId, config?: RequestConfig) {  
101 - return this.http.post(`/api/edge/sync`, edgeId, defaultHttpOptionsFromConfig(config)); 100 + public syncEdge(edgeId: string, config?: RequestConfig) {
  101 + return this.http.post(`/api/edge/sync/${edgeId}`, edgeId, defaultHttpOptionsFromConfig(config));
  102 + }
  103 +
  104 + public findMissingToRelatedRuleChains(edgeId: string, config?: RequestConfig): Observable<string> {
  105 + return this.http.get<string>(`/api/edge/missingToRelatedRuleChains/${edgeId}`, defaultHttpOptionsFromConfig(config));
102 } 106 }
103 } 107 }
@@ -483,7 +483,7 @@ export class EdgesTableConfigResolver implements Resolve<EntityTableConfig<EdgeI @@ -483,7 +483,7 @@ export class EdgesTableConfigResolver implements Resolve<EntityTableConfig<EdgeI
483 if ($event) { 483 if ($event) {
484 $event.stopPropagation(); 484 $event.stopPropagation();
485 } 485 }
486 - this.edgeService.syncEdge(edge.id).subscribe( 486 + this.edgeService.syncEdge(edge.id.id).subscribe(
487 () => { 487 () => {
488 this.store.dispatch(new ActionNotificationShow( 488 this.store.dispatch(new ActionNotificationShow(
489 { 489 {
@@ -45,10 +45,16 @@ import { @@ -45,10 +45,16 @@ import {
45 AddEntitiesToEdgeDialogData 45 AddEntitiesToEdgeDialogData
46 } from "@home/dialogs/add-entities-to-edge-dialog.component"; 46 } from "@home/dialogs/add-entities-to-edge-dialog.component";
47 import { MatDialog } from "@angular/material/dialog"; 47 import { MatDialog } from "@angular/material/dialog";
48 -import { isUndefined } from "@core/utils"; 48 +import { isNotEmptyStr, isUndefined } from "@core/utils";
49 import { PageLink } from "@shared/models/page/page-link"; 49 import { PageLink } from "@shared/models/page/page-link";
50 import { Edge } from "@shared/models/edge.models"; 50 import { Edge } from "@shared/models/edge.models";
51 -import { map, mergeMap } from "rxjs/operators"; 51 +import { mergeMap } from "rxjs/operators";
  52 +import {
  53 + ConnectorType,
  54 + createFormConfig,
  55 + GatewayFormConnectorModel
  56 +} from "@home/components/widget/lib/gateway/gateway-form.models";
  57 +import { formattedError } from "@angular/compiler";
52 58
53 @Injectable() 59 @Injectable()
54 export class RuleChainsTableConfigResolver implements Resolve<EntityTableConfig<RuleChain>> { 60 export class RuleChainsTableConfigResolver implements Resolve<EntityTableConfig<RuleChain>> {
@@ -401,7 +407,28 @@ export class RuleChainsTableConfigResolver implements Resolve<EntityTableConfig< @@ -401,7 +407,28 @@ export class RuleChainsTableConfigResolver implements Resolve<EntityTableConfig<
401 }).afterClosed() 407 }).afterClosed()
402 .subscribe((res) => { 408 .subscribe((res) => {
403 if (res) { 409 if (res) {
404 - this.config.table.updateData(); 410 + this.edgeService.findMissingToRelatedRuleChains(this.config.componentsData.edgeId).subscribe(
  411 + (missingRuleChains) => {
  412 + if (missingRuleChains && Object.keys(missingRuleChains).length > 0) {
  413 + let formattedMissingRuleChains: Array<string> = new Array<string>();
  414 + for (const missingRuleChain of Object.keys(missingRuleChains)) {
  415 + const arrayOfMissingRuleChains = missingRuleChains[missingRuleChain];
  416 + const tmp = "- '" + missingRuleChain + "': '" + arrayOfMissingRuleChains.join("', ") + "'";
  417 + formattedMissingRuleChains.push(tmp);
  418 + }
  419 + const message = this.translate.instant('edge.missing-related-rule-chains-text',
  420 + {missingRuleChains: formattedMissingRuleChains.join("<br>")});
  421 + this.dialogService.alert(this.translate.instant('edge.missing-related-rule-chains-title'),
  422 + message, this.translate.instant('action.close'), true).subscribe(
  423 + () => {
  424 + this.config.table.updateData();
  425 + }
  426 + );
  427 + } else {
  428 + this.config.table.updateData();
  429 + }
  430 + }
  431 + )
405 } 432 }
406 } 433 }
407 ) 434 )
@@ -1210,7 +1210,9 @@ @@ -1210,7 +1210,9 @@
1210 "pending": "Pending", 1210 "pending": "Pending",
1211 "downlinks": "Downlinks", 1211 "downlinks": "Downlinks",
1212 "no-downlinks-prompt": "No downlinks found", 1212 "no-downlinks-prompt": "No downlinks found",
1213 - "sync-process-started-successfully": "Sync process started successfully!" 1213 + "sync-process-started-successfully": "Sync process started successfully!",
  1214 + "missing-related-rule-chains-title": "Edge has missing related rule chain(s)",
  1215 + "missing-related-rule-chains-text": "Assigned to edge rule chain(s) use rule nodes that forward message(s) to rule chain(s) that are not assigned to this edge. <br><br> List of missing rule chain(s): <br> {{missingRuleChains}}"
1214 }, 1216 },
1215 "edge-event": { 1217 "edge-event": {
1216 "type-dashboard": "Dashboard", 1218 "type-dashboard": "Dashboard",
@@ -2087,15 +2089,15 @@ @@ -2087,15 +2089,15 @@
2087 "unassign-rulechains-from-edge-text": "After the confirmation all selected rulechains will be unassigned and won't be accessible by the edge.", 2089 "unassign-rulechains-from-edge-text": "After the confirmation all selected rulechains will be unassigned and won't be accessible by the edge.",
2088 "assign-rulechain-to-edge-title": "Assign Rule Chain(s) To Edge", 2090 "assign-rulechain-to-edge-title": "Assign Rule Chain(s) To Edge",
2089 "assign-rulechain-to-edge-text": "Please select the rulechains to assign to the edge", 2091 "assign-rulechain-to-edge-text": "Please select the rulechains to assign to the edge",
2090 - "set-edge-template-root-rulechain": "Make rule chain edge template root", 2092 + "set-edge-template-root-rulechain": "Make rule chain as edge template root",
2091 "set-edge-template-root-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' edge template root?", 2093 "set-edge-template-root-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' edge template root?",
2092 "set-edge-template-root-rulechain-text": "After the confirmation the rule chain will become edge template root and will be root rule chain for a newly created edges.", 2094 "set-edge-template-root-rulechain-text": "After the confirmation the rule chain will become edge template root and will be root rule chain for a newly created edges.",
2093 "invalid-rulechain-type-error": "Unable to import rule chain: Invalid rule chain type. Expected type is {{expectedRuleChainType}}.", 2095 "invalid-rulechain-type-error": "Unable to import rule chain: Invalid rule chain type. Expected type is {{expectedRuleChainType}}.",
2094 "set-auto-assign-to-edge": "Assign rule chain to edge(s) on creation", 2096 "set-auto-assign-to-edge": "Assign rule chain to edge(s) on creation",
2095 "set-auto-assign-to-edge-title": "Are you sure you want to assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", 2097 "set-auto-assign-to-edge-title": "Are you sure you want to assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?",
2096 "set-auto-assign-to-edge-text": "After the confirmation the edge rule chain will be automatically assigned to edge(s) on creation.", 2098 "set-auto-assign-to-edge-text": "After the confirmation the edge rule chain will be automatically assigned to edge(s) on creation.",
2097 - "unset-auto-assign-to-edge": "Unset assign rule chain to edge(s) on creation",  
2098 - "unset-auto-assign-to-edge-title": "Are you sure you want to unset assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", 2099 + "unset-auto-assign-to-edge": "Do not assign rule chain to edge(s) on creation",
  2100 + "unset-auto-assign-to-edge-title": "Are you sure you do not want to assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?",
2099 "unset-auto-assign-to-edge-text": "After the confirmation the edge rule chain will no longer be automatically assigned to edge(s) on creation.", 2101 "unset-auto-assign-to-edge-text": "After the confirmation the edge rule chain will no longer be automatically assigned to edge(s) on creation.",
2100 "unassign-rulechain-title": "Are you sure you want to unassign the rulechain '{{ruleChainName}}'?", 2102 "unassign-rulechain-title": "Are you sure you want to unassign the rulechain '{{ruleChainName}}'?",
2101 "unassign-rulechains": "Unassign rulechains" 2103 "unassign-rulechains": "Unassign rulechains"