Commit c1d8aa137008d7b9a5757b8ed63be3dc4114cd47

Authored by Andrew Shvayka
Committed by GitHub
2 parents 33b9e37d 2558b2ec

Merge pull request #5038 from volodymyr-babak/handle-null-values-in-proto

Handle null values in proto
Showing 24 changed files with 369 additions and 208 deletions
... ... @@ -38,6 +38,7 @@ import org.thingsboard.server.common.data.edge.EdgeEventActionType;
38 38 import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
39 39 import org.thingsboard.server.common.data.exception.ThingsboardException;
40 40 import org.thingsboard.server.common.data.id.AlarmId;
  41 +import org.thingsboard.server.common.data.id.EdgeId;
41 42 import org.thingsboard.server.common.data.id.EntityId;
42 43 import org.thingsboard.server.common.data.id.EntityIdFactory;
43 44 import org.thingsboard.server.common.data.page.PageData;
... ... @@ -46,6 +47,8 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
46 47 import org.thingsboard.server.service.security.permission.Operation;
47 48 import org.thingsboard.server.service.security.permission.Resource;
48 49
  50 +import java.util.List;
  51 +
49 52 @RestController
50 53 @TbCoreComponent
51 54 @RequestMapping("/api")
... ... @@ -112,10 +115,13 @@ public class AlarmController extends BaseController {
112 115 AlarmId alarmId = new AlarmId(toUUID(strAlarmId));
113 116 Alarm alarm = checkAlarmId(alarmId, Operation.WRITE);
114 117
  118 + List<EdgeId> relatedEdgeIds = findRelatedEdgeIds(getTenantId(), alarm.getOriginator());
  119 +
115 120 logEntityAction(alarm.getOriginator(), alarm,
116 121 getCurrentUser().getCustomerId(),
117 122 ActionType.ALARM_DELETE, null);
118   - sendEntityNotificationMsg(getTenantId(), alarmId, EdgeEventActionType.DELETED);
  123 +
  124 + sendAlarmDeleteNotificationMsg(getTenantId(), alarmId, relatedEdgeIds, alarm);
119 125
120 126 return alarmService.deleteAlarm(getTenantId(), alarmId);
121 127 } catch (Exception e) {
... ...
... ... @@ -852,13 +852,25 @@ public abstract class BaseController {
852 852 }
853 853
854 854 protected void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds) {
  855 + sendDeleteNotificationMsg(tenantId, entityId, edgeIds, null);
  856 + }
  857 +
  858 + protected void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds, String body) {
855 859 if (edgeIds != null && !edgeIds.isEmpty()) {
856 860 for (EdgeId edgeId : edgeIds) {
857   - sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, null, null, EdgeEventActionType.DELETED);
  861 + sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, body, null, EdgeEventActionType.DELETED);
858 862 }
859 863 }
860 864 }
861 865
  866 + protected void sendAlarmDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds, Alarm alarm) {
  867 + try {
  868 + sendDeleteNotificationMsg(tenantId, entityId, edgeIds, json.writeValueAsString(alarm));
  869 + } catch (Exception e) {
  870 + log.warn("Failed to push delete alarm msg to core: {}", alarm, e);
  871 + }
  872 + }
  873 +
862 874 protected void sendEntityAssignToCustomerNotificationMsg(TenantId tenantId, EntityId entityId, CustomerId customerId, EdgeEventActionType action) {
863 875 try {
864 876 sendNotificationMsgToEdgeService(tenantId, null, entityId, json.writeValueAsString(customerId), null, action);
... ...
... ... @@ -121,6 +121,7 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
121 121
122 122 @Override
123 123 public void pushNotificationToEdge(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback) {
  124 + log.trace("Pushing notification to edge {}", edgeNotificationMsg);
124 125 try {
125 126 TenantId tenantId = new TenantId(new UUID(edgeNotificationMsg.getTenantIdMSB(), edgeNotificationMsg.getTenantIdLSB()));
126 127 EdgeEventType type = EdgeEventType.valueOf(edgeNotificationMsg.getType());
... ...
... ... @@ -527,7 +527,7 @@ public final class EdgeGrpcSession implements Closeable {
527 527 case RULE_CHAIN_METADATA:
528 528 return ctx.getRuleChainProcessor().processRuleChainMetadataToEdge(edgeEvent, msgType);
529 529 case ALARM:
530   - return ctx.getAlarmProcessor().processAlarmToEdge(edge, edgeEvent, msgType);
  530 + return ctx.getAlarmProcessor().processAlarmToEdge(edge, edgeEvent, msgType, action);
531 531 case USER:
532 532 return ctx.getUserProcessor().processUserToEdge(edge, edgeEvent, msgType, action);
533 533 case RELATION:
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.service.edge.rpc;
  17 +
  18 +import com.google.protobuf.BoolValue;
  19 +import com.google.protobuf.ByteString;
  20 +import com.google.protobuf.BytesValue;
  21 +import com.google.protobuf.Int64Value;
  22 +import com.google.protobuf.StringValue;
  23 +
  24 +public class EdgeProtoUtils {
  25 +
  26 + private EdgeProtoUtils() {
  27 + }
  28 +
  29 + public static BoolValue getBoolValue(Boolean value) {
  30 + BoolValue.Builder builder = BoolValue.newBuilder();
  31 + builder.setValue(value);
  32 + return builder.build();
  33 + }
  34 +
  35 + public static StringValue getStringValue(String value) {
  36 + StringValue.Builder builder = StringValue.newBuilder();
  37 + builder.setValue(value);
  38 + return builder.build();
  39 + }
  40 +
  41 + public static Int64Value getInt64Value(Long value) {
  42 + Int64Value.Builder builder = Int64Value.newBuilder();
  43 + builder.setValue(value);
  44 + return builder.build();
  45 + }
  46 +
  47 + public static BytesValue getBytesValue(ByteString value) {
  48 + BytesValue.Builder builder = BytesValue.newBuilder();
  49 + builder.setValue(value);
  50 + return builder.build();
  51 + }
  52 +}
... ...
... ... @@ -58,6 +58,8 @@ public class AlarmMsgConstructor {
58 58 }
59 59 AlarmUpdateMsg.Builder builder = AlarmUpdateMsg.newBuilder()
60 60 .setMsgType(msgType)
  61 + .setIdMSB(alarm.getId().getId().getMostSignificantBits())
  62 + .setIdLSB(alarm.getId().getId().getLeastSignificantBits())
61 63 .setName(alarm.getName())
62 64 .setType(alarm.getType())
63 65 .setOriginatorName(entityName)
... ...
... ... @@ -24,6 +24,9 @@ import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
24 24 import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
25 25 import org.thingsboard.server.queue.util.TbCoreComponent;
26 26
  27 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value;
  28 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
  29 +
27 30 @Component
28 31 @TbCoreComponent
29 32 public class AssetMsgConstructor {
... ... @@ -36,14 +39,14 @@ public class AssetMsgConstructor {
36 39 .setName(asset.getName())
37 40 .setType(asset.getType());
38 41 if (asset.getLabel() != null) {
39   - builder.setLabel(asset.getLabel());
  42 + builder.setLabel(getStringValue(asset.getLabel()));
40 43 }
41 44 if (customerId != null) {
42   - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits());
43   - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits());
  45 + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits()));
  46 + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits()));
44 47 }
45 48 if (asset.getAdditionalInfo() != null) {
46   - builder.setAdditionalInfo(JacksonUtil.toString(asset.getAdditionalInfo()));
  49 + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(asset.getAdditionalInfo())));
47 50 }
48 51 return builder.build();
49 52 }
... ...
... ... @@ -23,6 +23,8 @@ import org.thingsboard.server.gen.edge.v1.CustomerUpdateMsg;
23 23 import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
24 24 import org.thingsboard.server.queue.util.TbCoreComponent;
25 25
  26 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
  27 +
26 28 @Component
27 29 @TbCoreComponent
28 30 public class CustomerMsgConstructor {
... ... @@ -34,31 +36,31 @@ public class CustomerMsgConstructor {
34 36 .setIdLSB(customer.getId().getId().getLeastSignificantBits())
35 37 .setTitle(customer.getTitle());
36 38 if (customer.getCountry() != null) {
37   - builder.setCountry(customer.getCountry());
  39 + builder.setCountry(getStringValue(customer.getCountry()));
38 40 }
39 41 if (customer.getState() != null) {
40   - builder.setState(customer.getState());
  42 + builder.setState(getStringValue(customer.getState()));
41 43 }
42 44 if (customer.getCity() != null) {
43   - builder.setCity(customer.getCity());
  45 + builder.setCity(getStringValue(customer.getCity()));
44 46 }
45 47 if (customer.getAddress() != null) {
46   - builder.setAddress(customer.getAddress());
  48 + builder.setAddress(getStringValue(customer.getAddress()));
47 49 }
48 50 if (customer.getAddress2() != null) {
49   - builder.setAddress2(customer.getAddress2());
  51 + builder.setAddress2(getStringValue(customer.getAddress2()));
50 52 }
51 53 if (customer.getZip() != null) {
52   - builder.setZip(customer.getZip());
  54 + builder.setZip(getStringValue(customer.getZip()));
53 55 }
54 56 if (customer.getPhone() != null) {
55   - builder.setPhone(customer.getPhone());
  57 + builder.setPhone(getStringValue(customer.getPhone()));
56 58 }
57 59 if (customer.getEmail() != null) {
58   - builder.setEmail(customer.getEmail());
  60 + builder.setEmail(getStringValue(customer.getEmail()));
59 61 }
60 62 if (customer.getAdditionalInfo() != null) {
61   - builder.setAdditionalInfo(JacksonUtil.toString(customer.getAdditionalInfo()));
  63 + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(customer.getAdditionalInfo())));
62 64 }
63 65 return builder.build();
64 66 }
... ...
... ... @@ -24,6 +24,8 @@ import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
24 24 import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
25 25 import org.thingsboard.server.queue.util.TbCoreComponent;
26 26
  27 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value;
  28 +
27 29 @Component
28 30 @TbCoreComponent
29 31 public class DashboardMsgConstructor {
... ... @@ -36,8 +38,8 @@ public class DashboardMsgConstructor {
36 38 .setTitle(dashboard.getTitle())
37 39 .setConfiguration(JacksonUtil.toString(dashboard.getConfiguration()));
38 40 if (customerId != null) {
39   - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits());
40   - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits());
  41 + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits()));
  42 + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits()));
41 43 }
42 44 return builder.build();
43 45 }
... ...
... ... @@ -32,6 +32,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
32 32
33 33 import java.util.UUID;
34 34
  35 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value;
  36 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
  37 +
35 38 @Component
36 39 @TbCoreComponent
37 40 public class DeviceMsgConstructor {
... ... @@ -46,21 +49,21 @@ public class DeviceMsgConstructor {
46 49 .setName(device.getName())
47 50 .setType(device.getType());
48 51 if (device.getLabel() != null) {
49   - builder.setLabel(device.getLabel());
  52 + builder.setLabel(getStringValue(device.getLabel()));
50 53 }
51 54 if (customerId != null) {
52   - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits());
53   - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits());
  55 + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits()));
  56 + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits()));
54 57 }
55 58 if (device.getDeviceProfileId() != null) {
56   - builder.setDeviceProfileIdMSB(device.getDeviceProfileId().getId().getMostSignificantBits());
57   - builder.setDeviceProfileIdLSB(device.getDeviceProfileId().getId().getLeastSignificantBits());
  59 + builder.setDeviceProfileIdMSB(getInt64Value(device.getDeviceProfileId().getId().getMostSignificantBits()));
  60 + builder.setDeviceProfileIdLSB(getInt64Value(device.getDeviceProfileId().getId().getLeastSignificantBits()));
58 61 }
59 62 if (device.getAdditionalInfo() != null) {
60   - builder.setAdditionalInfo(JacksonUtil.toString(device.getAdditionalInfo()));
  63 + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(device.getAdditionalInfo())));
61 64 }
62 65 if (conflictName != null) {
63   - builder.setConflictName(conflictName);
  66 + builder.setConflictName(getStringValue(conflictName));
64 67 }
65 68 return builder.build();
66 69 }
... ... @@ -74,7 +77,7 @@ public class DeviceMsgConstructor {
74 77 .setCredentialsId(deviceCredentials.getCredentialsId());
75 78 }
76 79 if (deviceCredentials.getCredentialsValue() != null) {
77   - builder.setCredentialsValue(deviceCredentials.getCredentialsValue());
  80 + builder.setCredentialsValue(getStringValue(deviceCredentials.getCredentialsValue()));
78 81 }
79 82 return builder.build();
80 83 }
... ...
... ... @@ -27,6 +27,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
27 27
28 28 import java.nio.charset.StandardCharsets;
29 29
  30 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getBytesValue;
  31 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
  32 +
30 33 @Component
31 34 @TbCoreComponent
32 35 public class DeviceProfileMsgConstructor {
... ... @@ -52,19 +55,19 @@ public class DeviceProfileMsgConstructor {
52 55 // builder.setDefaultQueueName(deviceProfile.getDefaultQueueName());
53 56 // }
54 57 if (deviceProfile.getDescription() != null) {
55   - builder.setDescription(deviceProfile.getDescription());
  58 + builder.setDescription(getStringValue(deviceProfile.getDescription()));
56 59 }
57 60 if (deviceProfile.getTransportType() != null) {
58   - builder.setTransportType(deviceProfile.getTransportType().name());
  61 + builder.setTransportType(getStringValue(deviceProfile.getTransportType().name()));
59 62 }
60 63 if (deviceProfile.getProvisionType() != null) {
61   - builder.setProvisionType(deviceProfile.getProvisionType().name());
  64 + builder.setProvisionType(getStringValue(deviceProfile.getProvisionType().name()));
62 65 }
63 66 if (deviceProfile.getProvisionDeviceKey() != null) {
64   - builder.setProvisionDeviceKey(deviceProfile.getProvisionDeviceKey());
  67 + builder.setProvisionDeviceKey(getStringValue(deviceProfile.getProvisionDeviceKey()));
65 68 }
66 69 if (deviceProfile.getImage() != null) {
67   - builder.setImage(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8)));
  70 + builder.setImage(getBytesValue(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8))));
68 71 }
69 72 return builder.build();
70 73 }
... ...
... ... @@ -25,6 +25,9 @@ import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg;
25 25 import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
26 26 import org.thingsboard.server.queue.util.TbCoreComponent;
27 27
  28 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value;
  29 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
  30 +
28 31 @Component
29 32 @TbCoreComponent
30 33 public class EntityViewMsgConstructor {
... ... @@ -51,11 +54,11 @@ public class EntityViewMsgConstructor {
51 54 .setEntityIdLSB(entityView.getEntityId().getId().getLeastSignificantBits())
52 55 .setEntityType(entityType);
53 56 if (customerId != null) {
54   - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits());
55   - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits());
  57 + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits()));
  58 + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits()));
56 59 }
57 60 if (entityView.getAdditionalInfo() != null) {
58   - builder.setAdditionalInfo(JacksonUtil.toString(entityView.getAdditionalInfo()));
  61 + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(entityView.getAdditionalInfo())));
59 62 }
60 63 return builder.build();
61 64 }
... ...
... ... @@ -22,6 +22,8 @@ import org.thingsboard.server.gen.edge.v1.RelationUpdateMsg;
22 22 import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
23 23 import org.thingsboard.server.queue.util.TbCoreComponent;
24 24
  25 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
  26 +
25 27 @Component
26 28 @TbCoreComponent
27 29 public class RelationMsgConstructor {
... ... @@ -35,10 +37,12 @@ public class RelationMsgConstructor {
35 37 .setToIdMSB(entityRelation.getTo().getId().getMostSignificantBits())
36 38 .setToIdLSB(entityRelation.getTo().getId().getLeastSignificantBits())
37 39 .setToEntityType(entityRelation.getTo().getEntityType().name())
38   - .setType(entityRelation.getType())
39   - .setAdditionalInfo(JacksonUtil.toString(entityRelation.getAdditionalInfo()));
  40 + .setType(entityRelation.getType());
  41 + if (entityRelation.getAdditionalInfo() != null) {
  42 + builder.setAdditionalInfo(JacksonUtil.toString(entityRelation.getAdditionalInfo()));
  43 + }
40 44 if (entityRelation.getTypeGroup() != null) {
41   - builder.setTypeGroup(entityRelation.getTypeGroup().name());
  45 + builder.setTypeGroup(getStringValue(entityRelation.getTypeGroup().name()));
42 46 }
43 47 return builder.build();
44 48 }
... ...
... ... @@ -37,6 +37,8 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
37 37 import java.util.ArrayList;
38 38 import java.util.List;
39 39
  40 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value;
  41 +
40 42 @Component
41 43 @Slf4j
42 44 @TbCoreComponent
... ... @@ -54,8 +56,8 @@ public class RuleChainMsgConstructor {
54 56 .setDebugMode(ruleChain.isDebugMode())
55 57 .setConfiguration(JacksonUtil.toString(ruleChain.getConfiguration()));
56 58 if (ruleChain.getFirstRuleNodeId() != null) {
57   - builder.setFirstRuleNodeIdMSB(ruleChain.getFirstRuleNodeId().getId().getMostSignificantBits())
58   - .setFirstRuleNodeIdLSB(ruleChain.getFirstRuleNodeId().getId().getLeastSignificantBits());
  59 + builder.setFirstRuleNodeIdMSB(getInt64Value(ruleChain.getFirstRuleNodeId().getId().getMostSignificantBits()))
  60 + .setFirstRuleNodeIdLSB(getInt64Value(ruleChain.getFirstRuleNodeId().getId().getLeastSignificantBits()));
59 61 }
60 62 return builder.build();
61 63 }
... ...
... ... @@ -16,16 +16,19 @@
16 16 package org.thingsboard.server.service.edge.rpc.constructor;
17 17
18 18 import org.springframework.stereotype.Component;
  19 +import org.thingsboard.common.util.JacksonUtil;
19 20 import org.thingsboard.server.common.data.User;
20 21 import org.thingsboard.server.common.data.id.CustomerId;
21 22 import org.thingsboard.server.common.data.id.UserId;
22 23 import org.thingsboard.server.common.data.security.UserCredentials;
23   -import org.thingsboard.common.util.JacksonUtil;
24 24 import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
25 25 import org.thingsboard.server.gen.edge.v1.UserCredentialsUpdateMsg;
26 26 import org.thingsboard.server.gen.edge.v1.UserUpdateMsg;
27 27 import org.thingsboard.server.queue.util.TbCoreComponent;
28 28
  29 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value;
  30 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
  31 +
29 32 @Component
30 33 @TbCoreComponent
31 34 public class UserMsgConstructor {
... ... @@ -38,20 +41,17 @@ public class UserMsgConstructor {
38 41 .setEmail(user.getEmail())
39 42 .setAuthority(user.getAuthority().name());
40 43 if (customerId != null) {
41   - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits());
42   - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits());
  44 + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits()));
  45 + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits()));
43 46 }
44 47 if (user.getFirstName() != null) {
45   - builder.setFirstName(user.getFirstName());
  48 + builder.setFirstName(getStringValue(user.getFirstName()));
46 49 }
47 50 if (user.getLastName() != null) {
48   - builder.setLastName(user.getLastName());
49   - }
50   - if (user.getAdditionalInfo() != null) {
51   - builder.setAdditionalInfo(JacksonUtil.toString(user.getAdditionalInfo()));
  51 + builder.setLastName(getStringValue(user.getLastName()));
52 52 }
53 53 if (user.getAdditionalInfo() != null) {
54   - builder.setAdditionalInfo(JacksonUtil.toString(user.getAdditionalInfo()));
  54 + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(user.getAdditionalInfo())));
55 55 }
56 56 return builder.build();
57 57 }
... ...
... ... @@ -16,14 +16,16 @@
16 16 package org.thingsboard.server.service.edge.rpc.constructor;
17 17
18 18 import org.springframework.stereotype.Component;
  19 +import org.thingsboard.common.util.JacksonUtil;
19 20 import org.thingsboard.server.common.data.id.TenantId;
20 21 import org.thingsboard.server.common.data.id.WidgetTypeId;
21 22 import org.thingsboard.server.common.data.widget.WidgetType;
22   -import org.thingsboard.common.util.JacksonUtil;
23 23 import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
24 24 import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
25 25 import org.thingsboard.server.queue.util.TbCoreComponent;
26 26
  27 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
  28 +
27 29 @Component
28 30 @TbCoreComponent
29 31 public class WidgetTypeMsgConstructor {
... ... @@ -33,21 +35,21 @@ public class WidgetTypeMsgConstructor {
33 35 .setMsgType(msgType)
34 36 .setIdMSB(widgetType.getId().getId().getMostSignificantBits())
35 37 .setIdLSB(widgetType.getId().getId().getLeastSignificantBits());
36   - if (widgetType.getBundleAlias() != null) {
37   - builder.setBundleAlias(widgetType.getBundleAlias());
38   - }
39   - if (widgetType.getAlias() != null) {
40   - builder.setAlias(widgetType.getAlias());
41   - }
42   - if (widgetType.getName() != null) {
43   - builder.setName(widgetType.getName());
44   - }
45   - if (widgetType.getDescriptor() != null) {
46   - builder.setDescriptorJson(JacksonUtil.toString(widgetType.getDescriptor()));
47   - }
48   - if (widgetType.getTenantId().equals(TenantId.SYS_TENANT_ID)) {
49   - builder.setIsSystem(true);
50   - }
  38 + if (widgetType.getBundleAlias() != null) {
  39 + builder.setBundleAlias(getStringValue(widgetType.getBundleAlias()));
  40 + }
  41 + if (widgetType.getAlias() != null) {
  42 + builder.setAlias(getStringValue(widgetType.getAlias()));
  43 + }
  44 + if (widgetType.getName() != null) {
  45 + builder.setName(getStringValue(widgetType.getName()));
  46 + }
  47 + if (widgetType.getDescriptor() != null) {
  48 + builder.setDescriptorJson(getStringValue(JacksonUtil.toString(widgetType.getDescriptor())));
  49 + }
  50 + if (widgetType.getTenantId().equals(TenantId.SYS_TENANT_ID)) {
  51 + builder.setIsSystem(true);
  52 + }
51 53 return builder.build();
52 54 }
53 55
... ...
... ... @@ -26,6 +26,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
26 26
27 27 import java.nio.charset.StandardCharsets;
28 28
  29 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getBytesValue;
  30 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
  31 +
29 32 @Component
30 33 @TbCoreComponent
31 34 public class WidgetsBundleMsgConstructor {
... ... @@ -38,10 +41,10 @@ public class WidgetsBundleMsgConstructor {
38 41 .setTitle(widgetsBundle.getTitle())
39 42 .setAlias(widgetsBundle.getAlias());
40 43 if (widgetsBundle.getImage() != null) {
41   - builder.setImage(ByteString.copyFrom(widgetsBundle.getImage().getBytes(StandardCharsets.UTF_8)));
  44 + builder.setImage(getBytesValue(ByteString.copyFrom(widgetsBundle.getImage().getBytes(StandardCharsets.UTF_8))));
42 45 }
43 46 if (widgetsBundle.getDescription() != null) {
44   - builder.setDescription(widgetsBundle.getDescription());
  47 + builder.setDescription(getStringValue(widgetsBundle.getDescription()));
45 48 }
46 49 if (widgetsBundle.getTenantId().equals(TenantId.SYS_TENANT_ID)) {
47 50 builder.setIsSystem(true);
... ...
... ... @@ -15,6 +15,7 @@
15 15 */
16 16 package org.thingsboard.server.service.edge.rpc.processor;
17 17
  18 +import com.fasterxml.jackson.core.JsonProcessingException;
18 19 import com.google.common.util.concurrent.FutureCallback;
19 20 import com.google.common.util.concurrent.Futures;
20 21 import com.google.common.util.concurrent.ListenableFuture;
... ... @@ -54,6 +55,7 @@ public class AlarmEdgeProcessor extends BaseEdgeProcessor {
54 55 EntityId originatorId = getAlarmOriginator(tenantId, alarmUpdateMsg.getOriginatorName(),
55 56 EntityType.valueOf(alarmUpdateMsg.getOriginatorType()));
56 57 if (originatorId == null) {
  58 + log.warn("Originator not found for the alarm msg {}", alarmUpdateMsg);
57 59 return Futures.immediateFuture(null);
58 60 }
59 61 try {
... ... @@ -113,59 +115,84 @@ public class AlarmEdgeProcessor extends BaseEdgeProcessor {
113 115 }
114 116 }
115 117
116   - public DownlinkMsg processAlarmToEdge(Edge edge, EdgeEvent edgeEvent, UpdateMsgType msgType) {
  118 + public DownlinkMsg processAlarmToEdge(Edge edge, EdgeEvent edgeEvent, UpdateMsgType msgType, EdgeEventActionType action) {
  119 + AlarmId alarmId = new AlarmId(edgeEvent.getEntityId());
117 120 DownlinkMsg downlinkMsg = null;
118   - try {
119   - AlarmId alarmId = new AlarmId(edgeEvent.getEntityId());
120   - Alarm alarm = alarmService.findAlarmByIdAsync(edgeEvent.getTenantId(), alarmId).get();
121   - if (alarm != null) {
  121 + switch (action) {
  122 + case ADDED:
  123 + case UPDATED:
  124 + case ALARM_ACK:
  125 + case ALARM_CLEAR:
  126 + try {
  127 + Alarm alarm = alarmService.findAlarmByIdAsync(edgeEvent.getTenantId(), alarmId).get();
  128 + if (alarm != null) {
  129 + downlinkMsg = DownlinkMsg.newBuilder()
  130 + .setDownlinkMsgId(EdgeUtils.nextPositiveInt())
  131 + .addAlarmUpdateMsg(alarmMsgConstructor.constructAlarmUpdatedMsg(edge.getTenantId(), msgType, alarm))
  132 + .build();
  133 + }
  134 + } catch (Exception e) {
  135 + log.error("Can't process alarm msg [{}] [{}]", edgeEvent, msgType, e);
  136 + }
  137 + break;
  138 + case DELETED:
  139 + Alarm alarm = mapper.convertValue(edgeEvent.getBody(), Alarm.class);
  140 + AlarmUpdateMsg alarmUpdateMsg =
  141 + alarmMsgConstructor.constructAlarmUpdatedMsg(edge.getTenantId(), msgType, alarm);
122 142 downlinkMsg = DownlinkMsg.newBuilder()
123 143 .setDownlinkMsgId(EdgeUtils.nextPositiveInt())
124   - .addAlarmUpdateMsg(alarmMsgConstructor.constructAlarmUpdatedMsg(edge.getTenantId(), msgType, alarm))
  144 + .addAlarmUpdateMsg(alarmUpdateMsg)
125 145 .build();
126   - }
127   - } catch (Exception e) {
128   - log.error("Can't process alarm msg [{}] [{}]", edgeEvent, msgType, e);
  146 + break;
129 147 }
130 148 return downlinkMsg;
131 149 }
132 150
133   - public void processAlarmNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg) {
  151 + public void processAlarmNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg) throws JsonProcessingException {
  152 + EdgeEventActionType actionType = EdgeEventActionType.valueOf(edgeNotificationMsg.getAction());
134 153 AlarmId alarmId = new AlarmId(new UUID(edgeNotificationMsg.getEntityIdMSB(), edgeNotificationMsg.getEntityIdLSB()));
135   - ListenableFuture<Alarm> alarmFuture = alarmService.findAlarmByIdAsync(tenantId, alarmId);
136   - Futures.addCallback(alarmFuture, new FutureCallback<Alarm>() {
137   - @Override
138   - public void onSuccess(@Nullable Alarm alarm) {
139   - if (alarm != null) {
140   - EdgeEventType type = EdgeUtils.getEdgeEventTypeByEntityType(alarm.getOriginator().getEntityType());
141   - if (type != null) {
142   - PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE);
143   - PageData<EdgeId> pageData;
144   - do {
145   - pageData = edgeService.findRelatedEdgeIdsByEntityId(tenantId, alarm.getOriginator(), pageLink);
146   - if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
147   - for (EdgeId edgeId : pageData.getData()) {
148   - saveEdgeEvent(tenantId,
149   - edgeId,
150   - EdgeEventType.ALARM,
151   - EdgeEventActionType.valueOf(edgeNotificationMsg.getAction()),
152   - alarmId,
153   - null);
154   - }
155   - if (pageData.hasNext()) {
156   - pageLink = pageLink.nextPageLink();
157   - }
  154 + switch (actionType) {
  155 + case DELETED:
  156 + EdgeId edgeId = new EdgeId(new UUID(edgeNotificationMsg.getEdgeIdMSB(), edgeNotificationMsg.getEdgeIdLSB()));
  157 + Alarm alarm = mapper.readValue(edgeNotificationMsg.getBody(), Alarm.class);
  158 + saveEdgeEvent(tenantId, edgeId, EdgeEventType.ALARM, actionType, alarmId, mapper.valueToTree(alarm));
  159 + break;
  160 + default:
  161 + ListenableFuture<Alarm> alarmFuture = alarmService.findAlarmByIdAsync(tenantId, alarmId);
  162 + Futures.addCallback(alarmFuture, new FutureCallback<Alarm>() {
  163 + @Override
  164 + public void onSuccess(@Nullable Alarm alarm) {
  165 + if (alarm != null) {
  166 + EdgeEventType type = EdgeUtils.getEdgeEventTypeByEntityType(alarm.getOriginator().getEntityType());
  167 + if (type != null) {
  168 + PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE);
  169 + PageData<EdgeId> pageData;
  170 + do {
  171 + pageData = edgeService.findRelatedEdgeIdsByEntityId(tenantId, alarm.getOriginator(), pageLink);
  172 + if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
  173 + for (EdgeId edgeId : pageData.getData()) {
  174 + saveEdgeEvent(tenantId,
  175 + edgeId,
  176 + EdgeEventType.ALARM,
  177 + EdgeEventActionType.valueOf(edgeNotificationMsg.getAction()),
  178 + alarmId,
  179 + null);
  180 + }
  181 + if (pageData.hasNext()) {
  182 + pageLink = pageLink.nextPageLink();
  183 + }
  184 + }
  185 + } while (pageData != null && pageData.hasNext());
158 186 }
159   - } while (pageData != null && pageData.hasNext());
  187 + }
160 188 }
161   - }
162   - }
163 189
164   - @Override
165   - public void onFailure(Throwable t) {
166   - log.warn("[{}] can't find alarm by id [{}] {}", tenantId.getId(), alarmId.getId(), t);
167   - }
168   - }, dbCallbackExecutorService);
  190 + @Override
  191 + public void onFailure(Throwable t) {
  192 + log.warn("[{}] can't find alarm by id [{}] {}", tenantId.getId(), alarmId.getId(), t);
  193 + }
  194 + }, dbCallbackExecutorService);
  195 + }
169 196 }
170 197
171 198 }
... ...
... ... @@ -144,7 +144,9 @@ public class DeviceEdgeProcessor extends BaseEdgeProcessor {
144 144 DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId());
145 145 deviceCredentials.setCredentialsType(DeviceCredentialsType.valueOf(deviceCredentialsUpdateMsg.getCredentialsType()));
146 146 deviceCredentials.setCredentialsId(deviceCredentialsUpdateMsg.getCredentialsId());
147   - deviceCredentials.setCredentialsValue(deviceCredentialsUpdateMsg.getCredentialsValue());
  147 + if (deviceCredentialsUpdateMsg.hasCredentialsValue()) {
  148 + deviceCredentials.setCredentialsValue(deviceCredentialsUpdateMsg.getCredentialsValue().getValue());
  149 + }
148 150 deviceCredentialsService.updateDeviceCredentials(tenantId, deviceCredentials);
149 151 } catch (Exception e) {
150 152 log.error("Can't update device credentials for device [{}], deviceCredentialsUpdateMsg [{}]", device.getName(), deviceCredentialsUpdateMsg, e);
... ... @@ -162,11 +164,16 @@ public class DeviceEdgeProcessor extends BaseEdgeProcessor {
162 164 if (device != null) {
163 165 device.setName(deviceUpdateMsg.getName());
164 166 device.setType(deviceUpdateMsg.getType());
165   - device.setLabel(deviceUpdateMsg.getLabel());
166   - device.setAdditionalInfo(JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo()));
167   - if (deviceUpdateMsg.getDeviceProfileIdMSB() != 0 && deviceUpdateMsg.getDeviceProfileIdLSB() != 0) {
  167 + if (deviceUpdateMsg.hasLabel()) {
  168 + device.setLabel(deviceUpdateMsg.getLabel().getValue());
  169 + }
  170 + if (deviceUpdateMsg.hasAdditionalInfo()) {
  171 + device.setAdditionalInfo(JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo().getValue()));
  172 + }
  173 + if (deviceUpdateMsg.hasDeviceProfileIdMSB() && deviceUpdateMsg.hasDeviceProfileIdLSB()) {
168 174 DeviceProfileId deviceProfileId = new DeviceProfileId(
169   - new UUID(deviceUpdateMsg.getDeviceProfileIdMSB(), deviceUpdateMsg.getDeviceProfileIdLSB()));
  175 + new UUID(deviceUpdateMsg.getDeviceProfileIdMSB().getValue(),
  176 + deviceUpdateMsg.getDeviceProfileIdLSB().getValue()));
170 177 device.setDeviceProfileId(deviceProfileId);
171 178 }
172 179 deviceService.saveDevice(device);
... ... @@ -195,11 +202,16 @@ public class DeviceEdgeProcessor extends BaseEdgeProcessor {
195 202 device.setCustomerId(getCustomerId(edge));
196 203 device.setName(deviceName);
197 204 device.setType(deviceUpdateMsg.getType());
198   - device.setLabel(deviceUpdateMsg.getLabel());
199   - device.setAdditionalInfo(JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo()));
200   - if (deviceUpdateMsg.getDeviceProfileIdMSB() != 0 && deviceUpdateMsg.getDeviceProfileIdLSB() != 0) {
  205 + if (deviceUpdateMsg.hasLabel()) {
  206 + device.setLabel(deviceUpdateMsg.getLabel().getValue());
  207 + }
  208 + if (deviceUpdateMsg.hasAdditionalInfo()) {
  209 + device.setAdditionalInfo(JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo().getValue()));
  210 + }
  211 + if (deviceUpdateMsg.hasDeviceProfileIdMSB() && deviceUpdateMsg.hasDeviceProfileIdLSB()) {
201 212 DeviceProfileId deviceProfileId = new DeviceProfileId(
202   - new UUID(deviceUpdateMsg.getDeviceProfileIdMSB(), deviceUpdateMsg.getDeviceProfileIdLSB()));
  213 + new UUID(deviceUpdateMsg.getDeviceProfileIdMSB().getValue(),
  214 + deviceUpdateMsg.getDeviceProfileIdLSB().getValue()));
203 215 device.setDeviceProfileId(deviceProfileId);
204 216 }
205 217 Device savedDevice = deviceService.saveDevice(device, false);
... ...
... ... @@ -72,7 +72,9 @@ public class RelationEdgeProcessor extends BaseEdgeProcessor {
72 72 entityRelation.setTo(toId);
73 73
74 74 entityRelation.setType(relationUpdateMsg.getType());
75   - entityRelation.setTypeGroup(RelationTypeGroup.valueOf(relationUpdateMsg.getTypeGroup()));
  75 + if (relationUpdateMsg.hasTypeGroup()) {
  76 + entityRelation.setTypeGroup(RelationTypeGroup.valueOf(relationUpdateMsg.getTypeGroup().getValue()));
  77 + }
76 78 entityRelation.setAdditionalInfo(mapper.readTree(relationUpdateMsg.getAdditionalInfo()));
77 79 switch (relationUpdateMsg.getMsgType()) {
78 80 case ENTITY_CREATED_RPC_MESSAGE:
... ...
... ... @@ -17,6 +17,7 @@ package org.thingsboard.server.controller;
17 17
18 18 import com.fasterxml.jackson.core.type.TypeReference;
19 19 import lombok.extern.slf4j.Slf4j;
  20 +import org.awaitility.Awaitility;
20 21 import org.junit.After;
21 22 import org.junit.Assert;
22 23 import org.junit.Before;
... ... @@ -28,13 +29,14 @@ import org.thingsboard.server.common.data.asset.Asset;
28 29 import org.thingsboard.server.common.data.edge.Edge;
29 30 import org.thingsboard.server.common.data.edge.EdgeEvent;
30 31 import org.thingsboard.server.common.data.edge.EdgeEventType;
31   -import org.thingsboard.server.common.data.id.TenantId;
  32 +import org.thingsboard.server.common.data.id.EdgeId;
32 33 import org.thingsboard.server.common.data.page.PageData;
33 34 import org.thingsboard.server.common.data.page.TimePageLink;
34 35 import org.thingsboard.server.common.data.relation.EntityRelation;
35 36 import org.thingsboard.server.common.data.security.Authority;
36 37
37 38 import java.util.List;
  39 +import java.util.concurrent.TimeUnit;
38 40
39 41 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
40 42
... ... @@ -83,34 +85,37 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest {
83 85 Device device = constructDevice("TestDevice", "default");
84 86 Device savedDevice = doPost("/api/device", device, Device.class);
85 87
86   - doPost("/api/edge/" + edge.getId().toString() + "/device/" + savedDevice.getId().toString(), Device.class);
  88 + final EdgeId edgeId = edge.getId();
  89 + doPost("/api/edge/" + edgeId.toString() + "/device/" + savedDevice.getId().toString(), Device.class);
87 90
88 91 Asset asset = constructAsset("TestAsset", "default");
89 92 Asset savedAsset = doPost("/api/asset", asset, Asset.class);
90 93
91   - doPost("/api/edge/" + edge.getId().toString() + "/asset/" + savedAsset.getId().toString(), Asset.class);
  94 + doPost("/api/edge/" + edgeId.toString() + "/asset/" + savedAsset.getId().toString(), Asset.class);
92 95
93 96 EntityRelation relation = new EntityRelation(savedAsset.getId(), savedDevice.getId(), EntityRelation.CONTAINS_TYPE);
94 97
95 98 doPost("/api/relation", relation);
96 99
97   - // wait while edge event for the relation entity persisted to DB
98   - Thread.sleep(100);
99   - List<EdgeEvent> edgeEvents;
100   - int attempt = 1;
101   - do {
102   - edgeEvents = doGetTypedWithTimePageLink("/api/edge/" + edge.getId().toString() + "/events?",
103   - new TypeReference<PageData<EdgeEvent>>() {}, new TimePageLink(4)).getData();
104   - attempt++;
105   - Thread.sleep(100);
106   - } while (edgeEvents.size() != 4 && attempt < 5);
107   - Assert.assertEquals(4, edgeEvents.size());
  100 + Awaitility.await()
  101 + .atMost(30, TimeUnit.SECONDS)
  102 + .until(() -> {
  103 + List<EdgeEvent> edgeEvents = findEdgeEvents(edgeId);
  104 + return edgeEvents.size() == 4;
  105 + });
  106 + List<EdgeEvent> edgeEvents = findEdgeEvents(edgeId);
108 107 Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.RULE_CHAIN.equals(ee.getType())));
109 108 Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.DEVICE.equals(ee.getType())));
110 109 Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.ASSET.equals(ee.getType())));
111 110 Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.RELATION.equals(ee.getType())));
112 111 }
113 112
  113 + private List<EdgeEvent> findEdgeEvents(EdgeId edgeId) throws Exception {
  114 + return doGetTypedWithTimePageLink("/api/edge/" + edgeId.toString() + "/events?",
  115 + new TypeReference<PageData<EdgeEvent>>() {
  116 + }, new TimePageLink(10)).getData();
  117 + }
  118 +
114 119 private Device constructDevice(String name, String type) {
115 120 Device device = new Device();
116 121 device.setName(name);
... ...
... ... @@ -27,6 +27,8 @@ import com.google.protobuf.InvalidProtocolBufferException;
27 27 import com.google.protobuf.MessageLite;
28 28 import lombok.extern.slf4j.Slf4j;
29 29 import org.apache.commons.lang3.RandomStringUtils;
  30 +import org.awaitility.Awaitility;
  31 +import org.hamcrest.Matchers;
30 32 import org.junit.After;
31 33 import org.junit.Assert;
32 34 import org.junit.Before;
... ... @@ -114,6 +116,7 @@ import org.thingsboard.server.gen.edge.v1.UserUpdateMsg;
114 116 import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
115 117 import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg;
116 118 import org.thingsboard.server.gen.transport.TransportProtos;
  119 +import org.thingsboard.server.service.edge.rpc.EdgeProtoUtils;
117 120 import org.thingsboard.server.service.queue.TbClusterService;
118 121
119 122 import java.util.ArrayList;
... ... @@ -126,6 +129,7 @@ import java.util.UUID;
126 129 import java.util.concurrent.TimeUnit;
127 130
128 131 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  132 +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue;
129 133
130 134 @Slf4j
131 135 abstract public class BaseEdgeTest extends AbstractControllerTest {
... ... @@ -648,7 +652,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
648 652 Assert.assertEquals(relationUpdateMsg.getFromIdMSB(), relation.getFrom().getId().getMostSignificantBits());
649 653 Assert.assertEquals(relationUpdateMsg.getToIdLSB(), relation.getTo().getId().getLeastSignificantBits());
650 654 Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name());
651   - Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name());
  655 + Assert.assertEquals(relationUpdateMsg.getTypeGroup().getValue(), relation.getTypeGroup().name());
652 656
653 657 // 2
654 658 edgeImitator.expectMessageAmount(1);
... ... @@ -672,7 +676,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
672 676 Assert.assertEquals(relationUpdateMsg.getFromIdMSB(), relation.getFrom().getId().getMostSignificantBits());
673 677 Assert.assertEquals(relationUpdateMsg.getToIdLSB(), relation.getTo().getId().getLeastSignificantBits());
674 678 Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name());
675   - Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name());
  679 + Assert.assertEquals(relationUpdateMsg.getTypeGroup().getValue(), relation.getTypeGroup().name());
676 680
677 681 log.info("Relations tested successfully");
678 682 }
... ... @@ -730,7 +734,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
730 734 edgeImitator.expectMessageAmount(1);
731 735 doDelete("/api/alarm/" + savedAlarm.getId().getId().toString())
732 736 .andExpect(status().isOk());
733   - Assert.assertFalse(edgeImitator.waitForMessages(1));
  737 + Assert.assertTrue(edgeImitator.waitForMessages(1));
  738 + latestMessage = edgeImitator.getLatestMessage();
  739 + Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
  740 + alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
  741 + Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, alarmUpdateMsg.getMsgType());
  742 + Assert.assertEquals(alarmUpdateMsg.getType(), savedAlarm.getType());
  743 + Assert.assertEquals(alarmUpdateMsg.getName(), savedAlarm.getName());
  744 + Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName());
  745 + Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.CLEARED_ACK.name());
734 746
735 747 log.info("Alarms tested successfully");
736 748 }
... ... @@ -900,9 +912,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
900 912 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, widgetTypeUpdateMsg.getMsgType());
901 913 Assert.assertEquals(widgetTypeUpdateMsg.getIdMSB(), savedWidgetType.getUuidId().getMostSignificantBits());
902 914 Assert.assertEquals(widgetTypeUpdateMsg.getIdLSB(), savedWidgetType.getUuidId().getLeastSignificantBits());
903   - Assert.assertEquals(widgetTypeUpdateMsg.getAlias(), savedWidgetType.getAlias());
904   - Assert.assertEquals(widgetTypeUpdateMsg.getName(), savedWidgetType.getName());
905   - Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson()), savedWidgetType.getDescriptor());
  915 + Assert.assertEquals(widgetTypeUpdateMsg.getAlias().getValue(), savedWidgetType.getAlias());
  916 + Assert.assertEquals(widgetTypeUpdateMsg.getName().getValue(), savedWidgetType.getName());
  917 + Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson().getValue()), savedWidgetType.getDescriptor());
906 918
907 919 // 3
908 920 edgeImitator.expectMessageAmount(1);
... ... @@ -1202,7 +1214,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1202 1214 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
1203 1215 DeviceUpdateMsg latestDeviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
1204 1216 Assert.assertNotEquals(deviceOnCloudName, latestDeviceUpdateMsg.getName());
1205   - Assert.assertEquals(deviceOnCloudName, latestDeviceUpdateMsg.getConflictName());
  1217 + Assert.assertEquals(deviceOnCloudName, latestDeviceUpdateMsg.getConflictName().getValue());
1206 1218
1207 1219 UUID newDeviceId = new UUID(latestDeviceUpdateMsg.getIdMSB(), latestDeviceUpdateMsg.getIdLSB());
1208 1220
... ... @@ -1269,7 +1281,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1269 1281 EntityId toEntityId = EntityIdFactory.getByTypeAndUuid(relationUpdateMsg.getToEntityType(), toUUID);
1270 1282 Assert.assertEquals(relation.getTo(), toEntityId);
1271 1283
1272   - Assert.assertEquals(relation.getTypeGroup().name(), relationUpdateMsg.getTypeGroup());
  1284 + Assert.assertEquals(relation.getTypeGroup().name(), relationUpdateMsg.getTypeGroup().getValue());
1273 1285 }
1274 1286
1275 1287 private void sendAlarm() throws Exception {
... ... @@ -1348,15 +1360,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1348 1360 edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build());
1349 1361 Assert.assertTrue(edgeImitator.waitForResponses());
1350 1362
1351   - int attempt = 0;
1352   - Map<String, List<Map<String, String>>> timeseries;
1353   - do {
1354   - timeseries = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/values/timeseries?keys=" + timeseriesKey,
1355   - new TypeReference<>() {});
1356   - // Wait before device attributes saved to database before requesting them from controller
1357   - Thread.sleep(100);
1358   - attempt++;
1359   - } while (!timeseries.containsKey(timeseriesKey) || attempt < 10);
  1363 + Awaitility.await()
  1364 + .atMost(2, TimeUnit.SECONDS)
  1365 + .until(() -> loadDeviceTimeseries(device, timeseriesKey).containsKey(timeseriesKey));
  1366 +
  1367 + Map<String, List<Map<String, String>>> timeseries = loadDeviceTimeseries(device, timeseriesKey);
1360 1368 Assert.assertTrue(timeseries.containsKey(timeseriesKey));
1361 1369 Assert.assertEquals(1, timeseries.get(timeseriesKey).size());
1362 1370 Assert.assertEquals(timeseriesValue, timeseries.get(timeseriesKey).get(0).get("value"));
... ... @@ -1365,7 +1373,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1365 1373 Assert.assertEquals(1, attributes.size());
1366 1374 Assert.assertEquals(attributes.get(0).get("key"), attributesKey);
1367 1375 Assert.assertEquals(attributes.get(0).get("value"), attributesValue);
  1376 + }
1368 1377
  1378 + private Map<String, List<Map<String, String>>> loadDeviceTimeseries(Device device, String timeseriesKey) throws Exception {
  1379 + return doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/values/timeseries?keys=" + timeseriesKey,
  1380 + new TypeReference<>() {});
1369 1381 }
1370 1382
1371 1383 private void sendRelation() throws Exception {
... ... @@ -1381,7 +1393,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1381 1393 UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
1382 1394 RelationUpdateMsg.Builder relationUpdateMsgBuilder = RelationUpdateMsg.newBuilder();
1383 1395 relationUpdateMsgBuilder.setType("test");
1384   - relationUpdateMsgBuilder.setTypeGroup(RelationTypeGroup.COMMON.name());
  1396 + relationUpdateMsgBuilder.setTypeGroup(getStringValue(RelationTypeGroup.COMMON.name()));
1385 1397 relationUpdateMsgBuilder.setToIdMSB(device1.getId().getId().getMostSignificantBits());
1386 1398 relationUpdateMsgBuilder.setToIdLSB(device1.getId().getId().getLeastSignificantBits());
1387 1399 relationUpdateMsgBuilder.setToEntityType(device1.getId().getEntityType().name());
... ... @@ -1447,7 +1459,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1447 1459 edgeImitator.expectMessageAmount(1);
1448 1460 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1449 1461 Assert.assertTrue(edgeImitator.waitForResponses());
1450   - Assert.assertTrue(edgeImitator.waitForMessages());;
  1462 + Assert.assertTrue(edgeImitator.waitForMessages());
1451 1463
1452 1464 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1453 1465 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
... ...
... ... @@ -20,6 +20,7 @@ option java_multiple_files = true;
20 20 option java_outer_classname = "EdgeProtos";
21 21
22 22 import "queue.proto";
  23 +import "google/protobuf/wrappers.proto";
23 24
24 25 package edge;
25 26
... ... @@ -129,8 +130,8 @@ message RuleChainUpdateMsg {
129 130 int64 idMSB = 2;
130 131 int64 idLSB = 3;
131 132 string name = 4;
132   - int64 firstRuleNodeIdMSB = 5;
133   - int64 firstRuleNodeIdLSB = 6;
  133 + google.protobuf.Int64Value firstRuleNodeIdMSB = 5;
  134 + google.protobuf.Int64Value firstRuleNodeIdLSB = 6;
134 135 bool root = 7;
135 136 bool debugMode = 8;
136 137 string configuration = 9;
... ... @@ -174,8 +175,8 @@ message DashboardUpdateMsg {
174 175 UpdateMsgType msgType = 1;
175 176 int64 idMSB = 2;
176 177 int64 idLSB = 3;
177   - int64 customerIdMSB = 4;
178   - int64 customerIdLSB = 5;
  178 + google.protobuf.Int64Value customerIdMSB = 4;
  179 + google.protobuf.Int64Value customerIdLSB = 5;
179 180 string title = 6;
180 181 string configuration = 7;
181 182 }
... ... @@ -184,15 +185,15 @@ message DeviceUpdateMsg {
184 185 UpdateMsgType msgType = 1;
185 186 int64 idMSB = 2;
186 187 int64 idLSB = 3;
187   - int64 customerIdMSB = 4;
188   - int64 customerIdLSB = 5;
189   - int64 deviceProfileIdMSB = 6;
190   - int64 deviceProfileIdLSB = 7;
  188 + google.protobuf.Int64Value customerIdMSB = 4;
  189 + google.protobuf.Int64Value customerIdLSB = 5;
  190 + google.protobuf.Int64Value deviceProfileIdMSB = 6;
  191 + google.protobuf.Int64Value deviceProfileIdLSB = 7;
191 192 string name = 8;
192 193 string type = 9;
193   - string label = 10;
194   - string additionalInfo = 11;
195   - string conflictName = 12;
  194 + google.protobuf.StringValue label = 10;
  195 + google.protobuf.StringValue additionalInfo = 11;
  196 + google.protobuf.StringValue conflictName = 12;
196 197 }
197 198
198 199 message DeviceProfileUpdateMsg {
... ... @@ -200,17 +201,17 @@ message DeviceProfileUpdateMsg {
200 201 int64 idMSB = 2;
201 202 int64 idLSB = 3;
202 203 string name = 4;
203   - string description = 5;
  204 + google.protobuf.StringValue description = 5;
204 205 bool default = 6;
205 206 string type = 7;
206   - string transportType = 8;
207   - string provisionType = 9;
  207 + google.protobuf.StringValue transportType = 8;
  208 + google.protobuf.StringValue provisionType = 9;
208 209 int64 defaultRuleChainIdMSB = 10;
209 210 int64 defaultRuleChainIdLSB = 11;
210 211 string defaultQueueName = 12;
211 212 bytes profileDataBytes = 13;
212   - string provisionDeviceKey = 14;
213   - bytes image = 15;
  213 + google.protobuf.StringValue provisionDeviceKey = 14;
  214 + google.protobuf.BytesValue image = 15;
214 215 }
215 216
216 217 message DeviceCredentialsUpdateMsg {
... ... @@ -218,49 +219,51 @@ message DeviceCredentialsUpdateMsg {
218 219 int64 deviceIdLSB = 2;
219 220 string credentialsType = 3;
220 221 string credentialsId = 4;
221   - string credentialsValue = 5;
  222 + google.protobuf.StringValue credentialsValue = 5;
222 223 }
223 224
224 225 message AssetUpdateMsg {
225 226 UpdateMsgType msgType = 1;
226 227 int64 idMSB = 2;
227 228 int64 idLSB = 3;
228   - int64 customerIdMSB = 4;
229   - int64 customerIdLSB = 5;
  229 + google.protobuf.Int64Value customerIdMSB = 4;
  230 + google.protobuf.Int64Value customerIdLSB = 5;
230 231 string name = 6;
231 232 string type = 7;
232   - string label = 8;
233   - string additionalInfo = 9;
  233 + google.protobuf.StringValue label = 8;
  234 + google.protobuf.StringValue additionalInfo = 9;
234 235 }
235 236
236 237 message EntityViewUpdateMsg {
237 238 UpdateMsgType msgType = 1;
238 239 int64 idMSB = 2;
239 240 int64 idLSB = 3;
240   - int64 customerIdMSB = 4;
241   - int64 customerIdLSB = 5;
  241 + google.protobuf.Int64Value customerIdMSB = 4;
  242 + google.protobuf.Int64Value customerIdLSB = 5;
242 243 string name = 6;
243 244 string type = 7;
244 245 int64 entityIdMSB = 8;
245 246 int64 entityIdLSB = 9;
246 247 EdgeEntityType entityType = 10;
247   - string additionalInfo = 11;
  248 + google.protobuf.StringValue additionalInfo = 11;
248 249 }
249 250
250 251 message AlarmUpdateMsg {
251 252 UpdateMsgType msgType = 1;
252   - string name = 2;
253   - string type = 3;
254   - string originatorType = 4;
255   - string originatorName = 5;
256   - string severity = 6;
257   - string status = 7;
258   - int64 startTs = 8;
259   - int64 endTs = 9;
260   - int64 ackTs = 10;
261   - int64 clearTs = 11;
262   - string details = 12;
263   - bool propagate = 13;
  253 + int64 idMSB = 2;
  254 + int64 idLSB = 3;
  255 + string name = 4;
  256 + string type = 5;
  257 + string originatorType = 6;
  258 + string originatorName = 7;
  259 + string severity = 8;
  260 + string status = 9;
  261 + int64 startTs = 10;
  262 + int64 endTs = 11;
  263 + int64 ackTs = 12;
  264 + int64 clearTs = 13;
  265 + string details = 14;
  266 + bool propagate = 15;
264 267 }
265 268
266 269 message CustomerUpdateMsg {
... ... @@ -268,15 +271,15 @@ message CustomerUpdateMsg {
268 271 int64 idMSB = 2;
269 272 int64 idLSB = 3;
270 273 string title = 4;
271   - string country = 5;
272   - string state = 6;
273   - string city = 7;
274   - string address = 8;
275   - string address2 = 9;
276   - string zip = 10;
277   - string phone = 11;
278   - string email = 12;
279   - string additionalInfo = 13;
  274 + google.protobuf.StringValue country = 5;
  275 + google.protobuf.StringValue state = 6;
  276 + google.protobuf.StringValue city = 7;
  277 + google.protobuf.StringValue address = 8;
  278 + google.protobuf.StringValue address2 = 9;
  279 + google.protobuf.StringValue zip = 10;
  280 + google.protobuf.StringValue phone = 11;
  281 + google.protobuf.StringValue email = 12;
  282 + google.protobuf.StringValue additionalInfo = 13;
280 283 }
281 284
282 285 message RelationUpdateMsg {
... ... @@ -288,7 +291,7 @@ message RelationUpdateMsg {
288 291 int64 toIdLSB = 6;
289 292 string toEntityType = 7;
290 293 string type = 8;
291   - string typeGroup = 9;
  294 + google.protobuf.StringValue typeGroup = 9;
292 295 string additionalInfo = 10;
293 296 }
294 297
... ... @@ -296,13 +299,13 @@ message UserUpdateMsg {
296 299 UpdateMsgType msgType = 1;
297 300 int64 idMSB = 2;
298 301 int64 idLSB = 3;
299   - int64 customerIdMSB = 4;
300   - int64 customerIdLSB = 5;
  302 + google.protobuf.Int64Value customerIdMSB = 4;
  303 + google.protobuf.Int64Value customerIdLSB = 5;
301 304 string email = 6;
302 305 string authority = 7;
303   - string firstName = 8;
304   - string lastName = 9;
305   - string additionalInfo = 10;
  306 + google.protobuf.StringValue firstName = 8;
  307 + google.protobuf.StringValue lastName = 9;
  308 + google.protobuf.StringValue additionalInfo = 10;
306 309 }
307 310
308 311 message WidgetsBundleUpdateMsg {
... ... @@ -311,19 +314,19 @@ message WidgetsBundleUpdateMsg {
311 314 int64 idLSB = 3;
312 315 string title = 4;
313 316 string alias = 5;
314   - bytes image = 6;
  317 + google.protobuf.BytesValue image = 6;
315 318 bool isSystem = 7;
316   - string description = 8;
  319 + google.protobuf.StringValue description = 8;
317 320 }
318 321
319 322 message WidgetTypeUpdateMsg {
320 323 UpdateMsgType msgType = 1;
321 324 int64 idMSB = 2;
322 325 int64 idLSB = 3;
323   - string bundleAlias = 4;
324   - string alias = 5;
325   - string name = 6;
326   - string descriptorJson = 7;
  326 + google.protobuf.StringValue bundleAlias = 4;
  327 + google.protobuf.StringValue alias = 5;
  328 + google.protobuf.StringValue name = 6;
  329 + google.protobuf.StringValue descriptorJson = 7;
327 330 bool isSystem = 8;
328 331 }
329 332
... ...
... ... @@ -337,7 +337,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
337 337 addTimePageLinkToParam(params, pageLink);
338 338
339 339 return restTemplate.exchange(
340   - baseURL + urlSecondPart + getTimeUrlParams(pageLink),
  340 + baseURL + urlSecondPart + "&" + getTimeUrlParams(pageLink),
341 341 HttpMethod.GET,
342 342 HttpEntity.EMPTY,
343 343 new ParameterizedTypeReference<PageData<AlarmInfo>>() {
... ...