...
|
...
|
@@ -47,6 +47,8 @@ import org.thingsboard.server.common.data.asset.Asset; |
47
|
47
|
import org.thingsboard.server.common.data.audit.ActionType;
|
48
|
48
|
import org.thingsboard.server.common.data.edge.Edge;
|
49
|
49
|
import org.thingsboard.server.common.data.edge.EdgeEvent;
|
|
50
|
+import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
|
|
51
|
+import org.thingsboard.server.common.data.exception.ThingsboardException;
|
50
|
52
|
import org.thingsboard.server.common.data.id.AlarmId;
|
51
|
53
|
import org.thingsboard.server.common.data.id.AssetId;
|
52
|
54
|
import org.thingsboard.server.common.data.id.CustomerId;
|
...
|
...
|
@@ -54,6 +56,7 @@ import org.thingsboard.server.common.data.id.DashboardId; |
54
|
56
|
import org.thingsboard.server.common.data.id.DeviceId;
|
55
|
57
|
import org.thingsboard.server.common.data.id.EdgeId;
|
56
|
58
|
import org.thingsboard.server.common.data.id.EntityId;
|
|
59
|
+import org.thingsboard.server.common.data.id.EntityIdFactory;
|
57
|
60
|
import org.thingsboard.server.common.data.id.EntityViewId;
|
58
|
61
|
import org.thingsboard.server.common.data.id.RuleChainId;
|
59
|
62
|
import org.thingsboard.server.common.data.id.TenantId;
|
...
|
...
|
@@ -98,6 +101,7 @@ import org.thingsboard.server.gen.edge.EntityDataProto; |
98
|
101
|
import org.thingsboard.server.gen.edge.EntityUpdateMsg;
|
99
|
102
|
import org.thingsboard.server.gen.edge.EntityViewUpdateMsg;
|
100
|
103
|
import org.thingsboard.server.gen.edge.RelationRequestMsg;
|
|
104
|
+import org.thingsboard.server.gen.edge.RelationUpdateMsg;
|
101
|
105
|
import org.thingsboard.server.gen.edge.RequestMsg;
|
102
|
106
|
import org.thingsboard.server.gen.edge.RequestMsgType;
|
103
|
107
|
import org.thingsboard.server.gen.edge.ResponseMsg;
|
...
|
...
|
@@ -813,6 +817,11 @@ public final class EdgeGrpcSession implements Closeable { |
813
|
817
|
onAlarmUpdate(alarmUpdateMsg);
|
814
|
818
|
}
|
815
|
819
|
}
|
|
820
|
+ if (uplinkMsg.getRelationUpdateMsgList() != null && !uplinkMsg.getRelationUpdateMsgList().isEmpty()) {
|
|
821
|
+ for (RelationUpdateMsg relationUpdateMsg: uplinkMsg.getRelationUpdateMsgList()) {
|
|
822
|
+ onRelationUpdate(relationUpdateMsg);
|
|
823
|
+ }
|
|
824
|
+ }
|
816
|
825
|
if (uplinkMsg.getRuleChainMetadataRequestMsgList() != null && !uplinkMsg.getRuleChainMetadataRequestMsgList().isEmpty()) {
|
817
|
826
|
for (RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg : uplinkMsg.getRuleChainMetadataRequestMsgList()) {
|
818
|
827
|
ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge, ruleChainMetadataRequestMsg);
|
...
|
...
|
@@ -1164,6 +1173,60 @@ public final class EdgeGrpcSession implements Closeable { |
1164
|
1173
|
}
|
1165
|
1174
|
}
|
1166
|
1175
|
|
|
1176
|
+ private void onRelationUpdate(RelationUpdateMsg relationUpdateMsg) {
|
|
1177
|
+ log.info("onRelationUpdate {}", relationUpdateMsg);
|
|
1178
|
+ try {
|
|
1179
|
+ EntityRelation entityRelation = new EntityRelation();
|
|
1180
|
+
|
|
1181
|
+ UUID fromUUID = new UUID(relationUpdateMsg.getFromIdMSB(), relationUpdateMsg.getFromIdLSB());
|
|
1182
|
+ EntityId fromId = EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(relationUpdateMsg.getFromEntityType()), fromUUID);
|
|
1183
|
+ entityRelation.setFrom(fromId);
|
|
1184
|
+
|
|
1185
|
+ UUID toUUID = new UUID(relationUpdateMsg.getToIdMSB(), relationUpdateMsg.getToIdLSB());
|
|
1186
|
+ EntityId toId = EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(relationUpdateMsg.getToEntityType()), toUUID);
|
|
1187
|
+ entityRelation.setTo(toId);
|
|
1188
|
+
|
|
1189
|
+ entityRelation.setType(relationUpdateMsg.getType());
|
|
1190
|
+ entityRelation.setTypeGroup(RelationTypeGroup.valueOf(relationUpdateMsg.getTypeGroup()));
|
|
1191
|
+ entityRelation.setAdditionalInfo(mapper.readTree(relationUpdateMsg.getAdditionalInfo()));
|
|
1192
|
+ switch (relationUpdateMsg.getMsgType()) {
|
|
1193
|
+ case ENTITY_CREATED_RPC_MESSAGE:
|
|
1194
|
+ case ENTITY_UPDATED_RPC_MESSAGE:
|
|
1195
|
+ if (isEntityExists(edge.getTenantId(), entityRelation.getTo())
|
|
1196
|
+ && isEntityExists(edge.getTenantId(), entityRelation.getFrom())) {
|
|
1197
|
+ ctx.getRelationService().saveRelationAsync(edge.getTenantId(), entityRelation);
|
|
1198
|
+ }
|
|
1199
|
+ break;
|
|
1200
|
+ case ENTITY_DELETED_RPC_MESSAGE:
|
|
1201
|
+ ctx.getRelationService().deleteRelation(edge.getTenantId(), entityRelation);
|
|
1202
|
+ break;
|
|
1203
|
+ case UNRECOGNIZED:
|
|
1204
|
+ log.error("Unsupported msg type");
|
|
1205
|
+ }
|
|
1206
|
+ } catch (Exception e) {
|
|
1207
|
+ log.error("Error during relation update msg", e);
|
|
1208
|
+ }
|
|
1209
|
+ }
|
|
1210
|
+
|
|
1211
|
+ private boolean isEntityExists(TenantId tenantId, EntityId entityId) throws ThingsboardException {
|
|
1212
|
+ switch (entityId.getEntityType()) {
|
|
1213
|
+ case DEVICE:
|
|
1214
|
+ return ctx.getDeviceService().findDeviceById(tenantId, new DeviceId(entityId.getId())) != null;
|
|
1215
|
+ case ASSET:
|
|
1216
|
+ return ctx.getAssetService().findAssetById(tenantId, new AssetId(entityId.getId())) != null;
|
|
1217
|
+ case ENTITY_VIEW:
|
|
1218
|
+ return ctx.getEntityViewService().findEntityViewById(tenantId, new EntityViewId(entityId.getId())) != null;
|
|
1219
|
+ case CUSTOMER:
|
|
1220
|
+ return ctx.getCustomerService().findCustomerById(tenantId, new CustomerId(entityId.getId())) != null;
|
|
1221
|
+ case USER:
|
|
1222
|
+ return ctx.getUserService().findUserById(tenantId, new UserId(entityId.getId())) != null;
|
|
1223
|
+ case DASHBOARD:
|
|
1224
|
+ return ctx.getDashboardService().findDashboardById(tenantId, new DashboardId(entityId.getId())) != null;
|
|
1225
|
+ default:
|
|
1226
|
+ throw new ThingsboardException("Unsupported entity type " + entityId.getEntityType(), ThingsboardErrorCode.INVALID_ARGUMENTS);
|
|
1227
|
+ }
|
|
1228
|
+ }
|
|
1229
|
+
|
1167
|
1230
|
private ConnectResponseMsg processConnect(ConnectRequestMsg request) {
|
1168
|
1231
|
Optional<Edge> optional = ctx.getEdgeService().findEdgeByRoutingKey(TenantId.SYS_TENANT_ID, request.getEdgeRoutingKey());
|
1169
|
1232
|
if (optional.isPresent()) {
|
...
|
...
|
|