Browse Source

Merge pull request #12256 from thingsboard/feature/tbmsg-refactoring

TbMsg refactoring
pull/12340/head
Viacheslav Klimov 2 years ago
committed by GitHub
parent
commit
c6a31a1c4c
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 73
      application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
  2. 19
      application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleChainActorMessageProcessor.java
  3. 7
      application/src/main/java/org/thingsboard/server/controller/RpcV2Controller.java
  4. 7
      application/src/main/java/org/thingsboard/server/controller/RuleChainController.java
  5. 9
      application/src/main/java/org/thingsboard/server/controller/RuleEngineController.java
  6. 9
      application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java
  7. 16
      application/src/main/java/org/thingsboard/server/service/device/DeviceProvisionServiceImpl.java
  8. 8
      application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java
  9. 9
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java
  10. 9
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java
  11. 31
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java
  12. 10
      application/src/main/java/org/thingsboard/server/service/entitiy/EntityStateSourcingListener.java
  13. 11
      application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java
  14. 9
      application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java
  15. 7
      application/src/main/java/org/thingsboard/server/service/rpc/TbRpcService.java
  16. 6
      application/src/main/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngine.java
  17. 6
      application/src/main/java/org/thingsboard/server/service/script/RuleNodeTbelScriptEngine.java
  18. 9
      application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java
  19. 9
      application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java
  20. 23
      application/src/test/java/org/thingsboard/server/actors/rule/DefaultTbContextTest.java
  21. 37
      application/src/test/java/org/thingsboard/server/controller/RuleEngineControllerTest.java
  22. 7
      application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java
  23. 16
      application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java
  24. 8
      application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java
  25. 40
      application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java
  26. 7
      application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java
  27. 2
      application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineStrategyTest.java
  28. 7
      application/src/test/java/org/thingsboard/server/service/rpc/DefaultTbRuleEngineRpcServiceTest.java
  29. 16
      application/src/test/java/org/thingsboard/server/service/ruleengine/DefaultRuleEngineCallServiceTest.java
  30. 12
      application/src/test/java/org/thingsboard/server/service/sql/SequentialTimeseriesPersistenceTest.java
  31. 503
      common/message/src/main/java/org/thingsboard/server/common/msg/TbMsg.java
  32. 2
      common/queue/src/main/java/org/thingsboard/server/queue/common/TbRuleEngineProducerService.java
  33. 11
      common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java
  34. 3
      rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java
  35. 35
      rule-engine/rule-engine-api/src/test/java/org/thingsboard/rule/engine/api/util/TbNodeUtilsTest.java
  36. 4
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractAlarmNode.java
  37. 9
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java
  38. 9
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNode.java
  39. 8
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/sns/TbSnsNode.java
  40. 8
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/sqs/TbSqsNode.java
  41. 29
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/deduplication/TbMsgDeduplicationNode.java
  42. 16
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/delay/TbMsgDelayNode.java
  43. 8
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNode.java
  44. 8
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/kafka/TbKafkaNode.java
  45. 8
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/math/TbMathNode.java
  46. 4
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java
  47. 8
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractNodeWithFetchTo.java
  48. 4
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java
  49. 4
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mqtt/TbMqttNode.java
  50. 4
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/notification/TbNotificationNode.java
  51. 24
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java
  52. 4
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rabbitmq/TbRabbitMqNode.java
  53. 8
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rest/TbHttpClient.java
  54. 5
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbCopyKeysNode.java
  55. 5
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java
  56. 4
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbJsonPathNode.java
  57. 5
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java
  58. 8
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbSplitArrayMsgNode.java
  59. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAssignToCustomerNodeTest.java
  60. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbClearAlarmNodeTest.java
  61. 52
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNodeTest.java
  62. 121
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateAlarmNodeTest.java
  63. 18
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeTest.java
  64. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbDeleteRelationNodeTest.java
  65. 22
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbDeviceStateNodeTest.java
  66. 21
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbLogNodeTest.java
  67. 21
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbMsgCountNodeTest.java
  68. 35
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbSaveToCustomCassandraTableNodeTest.java
  69. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbUnassignFromCustomerNodeTest.java
  70. 53
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNodeTest.java
  71. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/sns/TbSnsNodeTest.java
  72. 28
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/sqs/TbSqsNodeTest.java
  73. 28
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNodeTest.java
  74. 27
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNodeTest.java
  75. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbAssetTypeSwitchNodeTest.java
  76. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNodeTest.java
  77. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeTest.java
  78. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckRelationNodeTest.java
  79. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbDeviceTypeSwitchNodeTest.java
  80. 30
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java
  81. 10
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java
  82. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbMsgTypeFilterNodeTest.java
  83. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbMsgTypeSwitchNodeTest.java
  84. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeFilterNodeTest.java
  85. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeSwitchNodeTest.java
  86. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbAckNodeTest.java
  87. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbCheckpointNodeTest.java
  88. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbRuleChainInputNodeTest.java
  89. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbRuleChainOutputNodeTest.java
  90. 44
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNodeTest.java
  91. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/geo/TbGpsGeofencingActionNodeTest.java
  92. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/geo/TbGpsGeofencingFilterNodeTest.java
  93. 50
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/kafka/TbKafkaNodeTest.java
  94. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java
  95. 134
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/math/TbMathNodeTest.java
  96. 112
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNodeTest.java
  97. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNodeTest.java
  98. 15
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNodeTest.java
  99. 21
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java
  100. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java

73
application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java

@ -173,7 +173,10 @@ public class DefaultTbContext implements TbContext {
if (!msg.isValid()) { if (!msg.isValid()) {
return; return;
} }
TbMsg tbMsg = msg.copyWithRuleChainId(ruleChainId); TbMsg tbMsg = msg.copy()
.ruleChainId(ruleChainId)
.resetRuleNodeId()
.build();
tbMsg.pushToStack(nodeCtx.getSelf().getRuleChainId(), nodeCtx.getSelf().getId()); tbMsg.pushToStack(nodeCtx.getSelf().getRuleChainId(), nodeCtx.getSelf().getId());
TopicPartitionInfo tpi = mainCtx.resolve(ServiceType.TB_RULE_ENGINE, getQueueName(), getTenantId(), tbMsg.getOriginator()); TopicPartitionInfo tpi = mainCtx.resolve(ServiceType.TB_RULE_ENGINE, getQueueName(), getTenantId(), tbMsg.getOriginator());
doEnqueue(tpi, tbMsg, new SimpleTbQueueCallback(md -> ack(msg), t -> tellFailure(msg, t))); doEnqueue(tpi, tbMsg, new SimpleTbQueueCallback(md -> ack(msg), t -> tellFailure(msg, t)));
@ -361,19 +364,28 @@ public class DefaultTbContext implements TbContext {
nodeCtx.setSelf(self); nodeCtx.setSelf(self);
} }
@Override
public TbMsg newMsg(String queueName, String type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(queueName, type, originator, null, metaData, data);
}
@Override @Override
public TbMsg newMsg(String queueName, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) { public TbMsg newMsg(String queueName, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return TbMsg.newMsg(queueName, type, originator, customerId, metaData, data, nodeCtx.getSelf().getRuleChainId(), nodeCtx.getSelf().getId()); return TbMsg.newMsg()
.queueName(queueName)
.type(type)
.originator(originator)
.customerId(customerId)
.copyMetaData(metaData)
.data(data)
.ruleChainId(nodeCtx.getSelf().getRuleChainId())
.ruleNodeId(nodeCtx.getSelf().getId())
.build();
} }
@Override @Override
public TbMsg transformMsg(TbMsg origMsg, String type, EntityId originator, TbMsgMetaData metaData, String data) { public TbMsg transformMsg(TbMsg origMsg, String type, EntityId originator, TbMsgMetaData metaData, String data) {
return TbMsg.transformMsg(origMsg, type, originator, metaData, data); return origMsg.transform()
.type(type)
.originator(originator)
.metaData(metaData)
.data(data)
.build();
} }
@Override @Override
@ -383,22 +395,41 @@ public class DefaultTbContext implements TbContext {
@Override @Override
public TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) { public TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return TbMsg.newMsg(queueName, type, originator, customerId, metaData, data, nodeCtx.getSelf().getRuleChainId(), nodeCtx.getSelf().getId()); return TbMsg.newMsg()
.queueName(queueName)
.type(type)
.originator(originator)
.customerId(customerId)
.copyMetaData(metaData)
.data(data)
.ruleChainId(nodeCtx.getSelf().getRuleChainId())
.ruleNodeId(nodeCtx.getSelf().getId())
.build();
} }
@Override @Override
public TbMsg transformMsg(TbMsg origMsg, TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data) { public TbMsg transformMsg(TbMsg origMsg, TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data) {
return TbMsg.transformMsg(origMsg, type, originator, metaData, data); return origMsg.transform()
.type(type)
.originator(originator)
.metaData(metaData)
.data(data)
.build();
} }
@Override @Override
public TbMsg transformMsg(TbMsg origMsg, TbMsgMetaData metaData, String data) { public TbMsg transformMsg(TbMsg origMsg, TbMsgMetaData metaData, String data) {
return TbMsg.transformMsg(origMsg, metaData, data); return origMsg.transform()
.metaData(metaData)
.data(data)
.build();
} }
@Override @Override
public TbMsg transformMsgOriginator(TbMsg origMsg, EntityId originator) { public TbMsg transformMsgOriginator(TbMsg origMsg, EntityId originator) {
return TbMsg.transformMsgOriginator(origMsg, originator); return origMsg.transform()
.originator(originator)
.build();
} }
@Override @Override
@ -497,7 +528,14 @@ public class DefaultTbContext implements TbContext {
defaultQueueName = profile.getDefaultQueueName(); defaultQueueName = profile.getDefaultQueueName();
defaultRuleChainId = profile.getDefaultRuleChainId(); defaultRuleChainId = profile.getDefaultRuleChainId();
} }
return TbMsg.newMsg(defaultQueueName, action, id, msgMetaData, msgData, defaultRuleChainId, null); return TbMsg.newMsg()
.queueName(defaultQueueName)
.type(action)
.originator(id)
.copyMetaData(msgMetaData)
.data(msgData)
.ruleChainId(defaultRuleChainId)
.build();
} }
public <E, I extends EntityId, K extends HasRuleEngineProfile> TbMsg entityActionMsg(E entity, I id, RuleNodeId ruleNodeId, TbMsgType actionMsgType, K profile) { public <E, I extends EntityId, K extends HasRuleEngineProfile> TbMsg entityActionMsg(E entity, I id, RuleNodeId ruleNodeId, TbMsgType actionMsgType, K profile) {
@ -515,7 +553,14 @@ public class DefaultTbContext implements TbContext {
defaultQueueName = profile.getDefaultQueueName(); defaultQueueName = profile.getDefaultQueueName();
defaultRuleChainId = profile.getDefaultRuleChainId(); defaultRuleChainId = profile.getDefaultRuleChainId();
} }
return TbMsg.newMsg(defaultQueueName, actionMsgType, id, msgMetaData, msgData, defaultRuleChainId, null); return TbMsg.newMsg()
.queueName(defaultQueueName)
.type(actionMsgType)
.originator(id)
.copyMetaData(msgMetaData)
.data(msgData)
.ruleChainId(defaultRuleChainId)
.build();
} }
@Override @Override

19
application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleChainActorMessageProcessor.java

@ -16,6 +16,7 @@
package org.thingsboard.server.actors.ruleChain; package org.thingsboard.server.actors.ruleChain;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.common.util.DebugModeUtil;
import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.actors.TbActorCtx; import org.thingsboard.server.actors.TbActorCtx;
import org.thingsboard.server.actors.TbActorRef; import org.thingsboard.server.actors.TbActorRef;
@ -35,7 +36,6 @@ import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.rule.RuleNode;
import org.thingsboard.common.util.DebugModeUtil;
import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
import org.thingsboard.server.common.msg.plugin.RuleNodeUpdatedMsg; import org.thingsboard.server.common.msg.plugin.RuleNodeUpdatedMsg;
@ -217,7 +217,10 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
RuleNodeCtx targetCtx; RuleNodeCtx targetCtx;
if (targetId == null) { if (targetId == null) {
targetCtx = firstNode; targetCtx = firstNode;
msg = msg.copyWithRuleChainId(entityId); msg = msg.copy()
.ruleChainId(entityId)
.resetRuleNodeId()
.build();
} else { } else {
targetCtx = nodeActors.get(targetId); targetCtx = nodeActors.get(targetId);
} }
@ -343,10 +346,18 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
private void putToQueue(TopicPartitionInfo tpi, TbMsg msg, TbQueueCallback callbackWrapper, EntityId target) { private void putToQueue(TopicPartitionInfo tpi, TbMsg msg, TbQueueCallback callbackWrapper, EntityId target) {
switch (target.getEntityType()) { switch (target.getEntityType()) {
case RULE_NODE: case RULE_NODE:
putToQueue(tpi, msg.copyWithRuleNodeId(entityId, new RuleNodeId(target.getId()), UUID.randomUUID()), callbackWrapper); putToQueue(tpi, msg.copy()
.id(UUID.randomUUID())
.ruleChainId(entityId)
.ruleNodeId(new RuleNodeId(target.getId()))
.build(), callbackWrapper);
break; break;
case RULE_CHAIN: case RULE_CHAIN:
putToQueue(tpi, msg.copyWithRuleChainId(new RuleChainId(target.getId()), UUID.randomUUID()), callbackWrapper); putToQueue(tpi, msg.copy()
.id(UUID.randomUUID())
.ruleChainId(new RuleChainId(target.getId()))
.resetRuleNodeId()
.build(), callbackWrapper);
break; break;
} }
} }

7
application/src/main/java/org/thingsboard/server/controller/RpcV2Controller.java

@ -239,7 +239,12 @@ public class RpcV2Controller extends AbstractRpcController {
rpcService.deleteRpc(getTenantId(), rpcId); rpcService.deleteRpc(getTenantId(), rpcId);
rpc.setStatus(RpcStatus.DELETED); rpc.setStatus(RpcStatus.DELETED);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_DELETED, rpc.getDeviceId(), TbMsgMetaData.EMPTY, JacksonUtil.toString(rpc)); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.RPC_DELETED)
.originator(rpc.getDeviceId())
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.toString(rpc))
.build();
tbClusterService.pushMsgToRuleEngine(getTenantId(), rpc.getDeviceId(), msg, null); tbClusterService.pushMsgToRuleEngine(getTenantId(), rpc.getDeviceId(), msg, null);
} }
} }

7
application/src/main/java/org/thingsboard/server/controller/RuleChainController.java

@ -384,7 +384,12 @@ public class RuleChainController extends BaseController {
} }
engine = new RuleNodeTbelScriptEngine(getTenantId(), tbelInvokeService, script, argNames); engine = new RuleNodeTbelScriptEngine(getTenantId(), tbelInvokeService, script, argNames);
} }
TbMsg inMsg = TbMsg.newMsg(msgType, null, new TbMsgMetaData(metadata), TbMsgDataType.JSON, data); TbMsg inMsg = TbMsg.newMsg()
.type(msgType)
.copyMetaData(new TbMsgMetaData(metadata))
.dataType(TbMsgDataType.JSON)
.data(data)
.build();
switch (scriptType) { switch (scriptType) {
case "update": case "update":
output = msgToOutput(engine.executeUpdateAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS)); output = msgToOutput(engine.executeUpdateAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS));

9
application/src/main/java/org/thingsboard/server/controller/RuleEngineController.java

@ -169,7 +169,14 @@ public class RuleEngineController extends BaseController {
metaData.put("serviceId", serviceInfoProvider.getServiceId()); metaData.put("serviceId", serviceInfoProvider.getServiceId());
metaData.put("requestUUID", requestId.toString()); metaData.put("requestUUID", requestId.toString());
metaData.put("expirationTime", Long.toString(expTime)); metaData.put("expirationTime", Long.toString(expTime));
TbMsg msg = TbMsg.newMsg(queueName, TbMsgType.REST_API_REQUEST, entityId, currentUser.getCustomerId(), new TbMsgMetaData(metaData), requestBody); TbMsg msg = TbMsg.newMsg()
.queueName(queueName)
.type(TbMsgType.REST_API_REQUEST)
.originator(entityId)
.customerId(currentUser.getCustomerId())
.copyMetaData(new TbMsgMetaData(metaData))
.data(requestBody)
.build();
ruleEngineCallService.processRestApiCallToRuleEngine(currentUser.getTenantId(), requestId, msg, queueName != null, ruleEngineCallService.processRestApiCallToRuleEngine(currentUser.getTenantId(), requestId, msg, queueName != null,
reply -> reply(new LocalRequestMetaData(msg, currentUser, result), reply)); reply -> reply(new LocalRequestMetaData(msg, currentUser, result), reply));
} }

9
application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java

@ -172,7 +172,14 @@ public class EntityActionService {
if (tenantId != null && !tenantId.isSysTenantId()) { if (tenantId != null && !tenantId.isSysTenantId()) {
processNotificationRules(tenantId, entityId, entity, actionType, user, additionalInfo); processNotificationRules(tenantId, entityId, entity, actionType, user, additionalInfo);
} }
TbMsg tbMsg = TbMsg.newMsg(msgType.get(), entityId, customerId, metaData, TbMsgDataType.JSON, JacksonUtil.toString(entityNode)); TbMsg tbMsg = TbMsg.newMsg()
.type(msgType.get())
.originator(entityId)
.customerId(customerId)
.copyMetaData(metaData)
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(entityNode))
.build();
tbClusterService.pushMsgToRuleEngine(tenantId, entityId, tbMsg, null); tbClusterService.pushMsgToRuleEngine(tenantId, entityId, tbMsg, null);
} catch (Exception e) { } catch (Exception e) {
log.warn("[{}] Failed to push entity action to rule engine: {}", entityId, actionType, e); log.warn("[{}] Failed to push entity action to rule engine: {}", entityId, actionType, e);

16
application/src/main/java/org/thingsboard/server/service/device/DeviceProvisionServiceImpl.java

@ -253,7 +253,13 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService {
private void pushProvisionEventToRuleEngine(ProvisionRequest request, Device device, TbMsgType type) { private void pushProvisionEventToRuleEngine(ProvisionRequest request, Device device, TbMsgType type) {
try { try {
JsonNode entityNode = JacksonUtil.valueToTree(request); JsonNode entityNode = JacksonUtil.valueToTree(request);
TbMsg msg = TbMsg.newMsg(type, device.getId(), device.getCustomerId(), createTbMsgMetaData(device), JacksonUtil.toString(entityNode)); TbMsg msg = TbMsg.newMsg()
.type(type)
.originator(device.getId())
.customerId(device.getCustomerId())
.copyMetaData(createTbMsgMetaData(device))
.data(JacksonUtil.toString(entityNode))
.build();
sendToRuleEngine(device.getTenantId(), msg, null); sendToRuleEngine(device.getTenantId(), msg, null);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
log.warn("[{}] Failed to push device action to rule engine: {}", device.getId(), type, e); log.warn("[{}] Failed to push device action to rule engine: {}", device.getId(), type, e);
@ -263,7 +269,13 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService {
private void pushDeviceCreatedEventToRuleEngine(Device device) { private void pushDeviceCreatedEventToRuleEngine(Device device) {
try { try {
ObjectNode entityNode = JacksonUtil.OBJECT_MAPPER.valueToTree(device); ObjectNode entityNode = JacksonUtil.OBJECT_MAPPER.valueToTree(device);
TbMsg msg = TbMsg.newMsg(TbMsgType.ENTITY_CREATED, device.getId(), device.getCustomerId(), createTbMsgMetaData(device), JacksonUtil.OBJECT_MAPPER.writeValueAsString(entityNode)); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.ENTITY_CREATED)
.originator(device.getId())
.customerId(device.getCustomerId())
.copyMetaData(createTbMsgMetaData(device))
.data(JacksonUtil.OBJECT_MAPPER.writeValueAsString(entityNode))
.build();
sendToRuleEngine(device.getTenantId(), msg, null); sendToRuleEngine(device.getTenantId(), msg, null);
} catch (JsonProcessingException | IllegalArgumentException e) { } catch (JsonProcessingException | IllegalArgumentException e) {
log.warn("[{}] Failed to push device action to rule engine: {}", device.getId(), TbMsgType.ENTITY_CREATED.name(), e); log.warn("[{}] Failed to push device action to rule engine: {}", device.getId(), TbMsgType.ENTITY_CREATED.name(), e);

8
application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java

@ -593,7 +593,13 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
md.putValue("edgeName", edge.getName()); md.putValue("edgeName", edge.getName());
md.putValue("edgeType", edge.getType()); md.putValue("edgeType", edge.getType());
} }
TbMsg tbMsg = TbMsg.newMsg(msgType, edgeId, md, TbMsgDataType.JSON, data); TbMsg tbMsg = TbMsg.newMsg()
.type(msgType)
.originator(edgeId)
.copyMetaData(md)
.dataType(TbMsgDataType.JSON)
.data(data)
.build();
clusterService.pushMsgToRuleEngine(tenantId, edgeId, tbMsg, null); clusterService.pushMsgToRuleEngine(tenantId, edgeId, tbMsg, null);
} catch (Exception e) { } catch (Exception e) {
log.warn("[{}][{}] Failed to push {}", tenantId, edge.getId(), msgType, e); log.warn("[{}][{}] Failed to push {}", tenantId, edge.getId(), msgType, e);

9
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java

@ -343,7 +343,14 @@ public abstract class BaseEdgeProcessor {
protected void pushEntityEventToRuleEngine(TenantId tenantId, EntityId entityId, CustomerId customerId, protected void pushEntityEventToRuleEngine(TenantId tenantId, EntityId entityId, CustomerId customerId,
TbMsgType msgType, String msgData, TbMsgMetaData metaData) { TbMsgType msgType, String msgData, TbMsgMetaData metaData) {
TbMsg tbMsg = TbMsg.newMsg(msgType, entityId, customerId, metaData, TbMsgDataType.JSON, msgData); TbMsg tbMsg = TbMsg.newMsg()
.type(msgType)
.originator(entityId)
.customerId(customerId)
.copyMetaData(metaData)
.dataType(TbMsgDataType.JSON)
.data(msgData)
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, entityId, tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, entityId, tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {

9
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java

@ -190,8 +190,13 @@ public abstract class DeviceEdgeProcessor extends BaseDeviceProcessor implements
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("method", deviceRpcCallMsg.getRequestMsg().getMethod()); data.put("method", deviceRpcCallMsg.getRequestMsg().getMethod());
data.put("params", deviceRpcCallMsg.getRequestMsg().getParams()); data.put("params", deviceRpcCallMsg.getRequestMsg().getParams());
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.TO_SERVER_RPC_REQUEST, deviceId, null, metaData, TbMsg tbMsg = TbMsg.newMsg()
TbMsgDataType.JSON, JacksonUtil.toString(data)); .type(TbMsgType.TO_SERVER_RPC_REQUEST)
.originator(deviceId)
.copyMetaData(metaData)
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, deviceId, tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, deviceId, tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {

31
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java

@ -209,7 +209,15 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
JsonObject json = JsonUtils.getJsonObject(tsKv.getKvList()); JsonObject json = JsonUtils.getJsonObject(tsKv.getKvList());
metaData.putValue("ts", tsKv.getTs() + ""); metaData.putValue("ts", tsKv.getTs() + "");
var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId); var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId);
TbMsg tbMsg = TbMsg.newMsg(defaultQueueAndRuleChain.getKey(), TbMsgType.POST_TELEMETRY_REQUEST, entityId, customerId, metaData, gson.toJson(json), defaultQueueAndRuleChain.getValue(), null); TbMsg tbMsg = TbMsg.newMsg()
.queueName(defaultQueueAndRuleChain.getKey())
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(entityId)
.customerId(customerId)
.copyMetaData(metaData)
.data(gson.toJson(json))
.ruleChainId(defaultQueueAndRuleChain.getValue())
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {
@ -253,7 +261,15 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
SettableFuture<Void> futureToSet = SettableFuture.create(); SettableFuture<Void> futureToSet = SettableFuture.create();
JsonObject json = JsonUtils.getJsonObject(msg.getKvList()); JsonObject json = JsonUtils.getJsonObject(msg.getKvList());
var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId); var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId);
TbMsg tbMsg = TbMsg.newMsg(defaultQueueAndRuleChain.getKey(), TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, customerId, metaData, gson.toJson(json), defaultQueueAndRuleChain.getValue(), null); TbMsg tbMsg = TbMsg.newMsg()
.queueName(defaultQueueAndRuleChain.getKey())
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.customerId(customerId)
.copyMetaData(metaData)
.data(gson.toJson(json))
.ruleChainId(defaultQueueAndRuleChain.getValue())
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {
@ -287,8 +303,15 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
@Override @Override
public void onSuccess(@Nullable Void tmp) { public void onSuccess(@Nullable Void tmp) {
var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId); var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId);
TbMsg tbMsg = TbMsg.newMsg(defaultQueueAndRuleChain.getKey(), TbMsgType.ATTRIBUTES_UPDATED, entityId, TbMsg tbMsg = TbMsg.newMsg()
customerId, metaData, gson.toJson(json), defaultQueueAndRuleChain.getValue(), null); .queueName(defaultQueueAndRuleChain.getKey())
.type(TbMsgType.ATTRIBUTES_UPDATED)
.originator(entityId)
.customerId(customerId)
.copyMetaData(metaData)
.data(gson.toJson(json))
.ruleChainId(defaultQueueAndRuleChain.getValue())
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {

10
application/src/main/java/org/thingsboard/server/service/entitiy/EntityStateSourcingListener.java

@ -250,8 +250,14 @@ public class EntityStateSourcingListener {
private void pushAssignedFromNotification(Tenant currentTenant, TenantId newTenantId, Device assignedDevice) { private void pushAssignedFromNotification(Tenant currentTenant, TenantId newTenantId, Device assignedDevice) {
String data = JacksonUtil.toString(JacksonUtil.valueToTree(assignedDevice)); String data = JacksonUtil.toString(JacksonUtil.valueToTree(assignedDevice));
if (data != null) { if (data != null) {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.ENTITY_ASSIGNED_FROM_TENANT, assignedDevice.getId(), TbMsg tbMsg = TbMsg.newMsg()
assignedDevice.getCustomerId(), getMetaDataForAssignedFrom(currentTenant), TbMsgDataType.JSON, data); .type(TbMsgType.ENTITY_ASSIGNED_FROM_TENANT)
.originator(assignedDevice.getId())
.customerId(assignedDevice.getCustomerId())
.copyMetaData(getMetaDataForAssignedFrom(currentTenant))
.dataType(TbMsgDataType.JSON)
.data(data)
.build();
tbClusterService.pushMsgToRuleEngine(newTenantId, assignedDevice.getId(), tbMsg, null); tbClusterService.pushMsgToRuleEngine(newTenantId, assignedDevice.getId(), tbMsg, null);
} }
} }

11
application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java

@ -290,11 +290,16 @@ public class DefaultTbClusterService implements TbClusterService {
boolean isQueueTransform = targetQueueName != null && !targetQueueName.equals(tbMsg.getQueueName()); boolean isQueueTransform = targetQueueName != null && !targetQueueName.equals(tbMsg.getQueueName());
if (isRuleChainTransform && isQueueTransform) { if (isRuleChainTransform && isQueueTransform) {
tbMsg = TbMsg.transformMsg(tbMsg, targetRuleChainId, targetQueueName); tbMsg = tbMsg.transform()
.queueName(targetQueueName)
.ruleChainId(targetRuleChainId)
.build();
} else if (isRuleChainTransform) { } else if (isRuleChainTransform) {
tbMsg = TbMsg.transformMsgRuleChainId(tbMsg, targetRuleChainId); tbMsg = tbMsg.transform()
.ruleChainId(targetRuleChainId)
.build();
} else if (isQueueTransform) { } else if (isQueueTransform) {
tbMsg = TbMsg.transformMsgQueueName(tbMsg, targetQueueName); tbMsg = tbMsg.transform(targetQueueName);
} }
} }
return tbMsg; return tbMsg;

9
application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java

@ -183,7 +183,14 @@ public class DefaultTbCoreDeviceRpcService implements TbCoreDeviceRpcService {
entityNode.put(DataConstants.ADDITIONAL_INFO, msg.getAdditionalInfo()); entityNode.put(DataConstants.ADDITIONAL_INFO, msg.getAdditionalInfo());
try { try {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, msg.getDeviceId(), Optional.ofNullable(currentUser).map(User::getCustomerId).orElse(null), metaData, TbMsgDataType.JSON, JacksonUtil.toString(entityNode)); TbMsg tbMsg = TbMsg.newMsg()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(msg.getDeviceId())
.customerId(Optional.ofNullable(currentUser).map(User::getCustomerId).orElse(null))
.copyMetaData(metaData)
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(entityNode))
.build();
clusterService.pushMsgToRuleEngine(msg.getTenantId(), msg.getDeviceId(), tbMsg, null); clusterService.pushMsgToRuleEngine(msg.getTenantId(), msg.getDeviceId(), tbMsg, null);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new RuntimeException(e); throw new RuntimeException(e);

7
application/src/main/java/org/thingsboard/server/service/rpc/TbRpcService.java

@ -63,7 +63,12 @@ public class TbRpcService {
} }
private void pushRpcMsgToRuleEngine(TenantId tenantId, Rpc rpc) { private void pushRpcMsgToRuleEngine(TenantId tenantId, Rpc rpc) {
TbMsg msg = TbMsg.newMsg(TbMsgType.valueOf("RPC_" + rpc.getStatus().name()), rpc.getDeviceId(), TbMsgMetaData.EMPTY, JacksonUtil.toString(rpc)); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.valueOf("RPC_" + rpc.getStatus().name()))
.originator(rpc.getDeviceId())
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.toString(rpc))
.build();
tbClusterService.pushMsgToRuleEngine(tenantId, rpc.getDeviceId(), msg, null); tbClusterService.pushMsgToRuleEngine(tenantId, rpc.getDeviceId(), msg, null);
} }

6
application/src/main/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngine.java

@ -147,6 +147,10 @@ public class RuleNodeJsScriptEngine extends RuleNodeScriptEngine<JsInvokeService
String newData = data != null ? data : msg.getData(); String newData = data != null ? data : msg.getData();
TbMsgMetaData newMetadata = metadata != null ? new TbMsgMetaData(metadata) : msg.getMetaData().copy(); TbMsgMetaData newMetadata = metadata != null ? new TbMsgMetaData(metadata) : msg.getMetaData().copy();
String newMessageType = !StringUtils.isEmpty(messageType) ? messageType : msg.getType(); String newMessageType = !StringUtils.isEmpty(messageType) ? messageType : msg.getType();
return TbMsg.transformMsg(msg, newMessageType, msg.getOriginator(), newMetadata, newData); return msg.transform()
.type(newMessageType)
.metaData(newMetadata)
.data(newData)
.build();
} }
} }

6
application/src/main/java/org/thingsboard/server/service/script/RuleNodeTbelScriptEngine.java

@ -156,7 +156,11 @@ public class RuleNodeTbelScriptEngine extends RuleNodeScriptEngine<TbelInvokeSer
String newData = data != null ? data : msg.getData(); String newData = data != null ? data : msg.getData();
TbMsgMetaData newMetadata = metadata != null ? new TbMsgMetaData(metadata) : msg.getMetaData().copy(); TbMsgMetaData newMetadata = metadata != null ? new TbMsgMetaData(metadata) : msg.getMetaData().copy();
String newMessageType = !StringUtils.isEmpty(messageType) ? messageType : msg.getType(); String newMessageType = !StringUtils.isEmpty(messageType) ? messageType : msg.getType();
return TbMsg.transformMsg(msg, newMessageType, msg.getOriginator(), newMetadata, newData); return msg.transform()
.type(newMessageType)
.metaData(newMetadata)
.data(newData)
.build();
} }
private static <T> ListenableFuture<T> wrongResultType(Object result) { private static <T> ListenableFuture<T> wrongResultType(Object result) {

9
application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java

@ -860,7 +860,14 @@ public class DefaultDeviceStateService extends AbstractPartitionBasedService<Dev
if (!persistToTelemetry) { if (!persistToTelemetry) {
md.putValue(SCOPE, SERVER_SCOPE); md.putValue(SCOPE, SERVER_SCOPE);
} }
TbMsg tbMsg = TbMsg.newMsg(msgType, stateData.getDeviceId(), stateData.getCustomerId(), md, TbMsgDataType.JSON, data); TbMsg tbMsg = TbMsg.newMsg()
.type(msgType)
.originator(stateData.getDeviceId())
.customerId(stateData.getCustomerId())
.copyMetaData(md)
.dataType(TbMsgDataType.JSON)
.data(data)
.build();
clusterService.pushMsgToRuleEngine(stateData.getTenantId(), stateData.getDeviceId(), tbMsg, null); clusterService.pushMsgToRuleEngine(stateData.getTenantId(), stateData.getDeviceId(), tbMsg, null);
} catch (Exception e) { } catch (Exception e) {
log.warn("[{}] Failed to push inactivity alarm: {}", stateData.getDeviceId(), state, e); log.warn("[{}] Failed to push inactivity alarm: {}", stateData.getDeviceId(), state, e);

9
application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java

@ -362,7 +362,14 @@ public class DefaultTransportApiService implements TransportApiService {
DeviceId deviceId = device.getId(); DeviceId deviceId = device.getId();
JsonNode entityNode = JacksonUtil.valueToTree(device); JsonNode entityNode = JacksonUtil.valueToTree(device);
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.ENTITY_CREATED, deviceId, customerId, metaData, TbMsgDataType.JSON, JacksonUtil.toString(entityNode)); TbMsg tbMsg = TbMsg.newMsg()
.type(TbMsgType.ENTITY_CREATED)
.originator(deviceId)
.customerId(customerId)
.copyMetaData(metaData)
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(entityNode))
.build();
tbClusterService.pushMsgToRuleEngine(tenantId, deviceId, tbMsg, null); tbClusterService.pushMsgToRuleEngine(tenantId, deviceId, tbMsg, null);
} else { } else {
JsonNode deviceAdditionalInfo = device.getAdditionalInfo(); JsonNode deviceAdditionalInfo = device.getAdditionalInfo();

23
application/src/test/java/org/thingsboard/server/actors/rule/DefaultTbContextTest.java

@ -928,15 +928,32 @@ class DefaultTbContextTest {
} }
private TbMsg getTbMsgWithCallback(TbMsgCallback callback) { private TbMsg getTbMsgWithCallback(TbMsgCallback callback) {
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TENANT_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING, callback); return TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TENANT_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_STRING)
.callback(callback)
.build();
} }
private TbMsg getTbMsgWithQueueName() { private TbMsg getTbMsgWithQueueName() {
return TbMsg.newMsg(DataConstants.MAIN_QUEUE_NAME, TbMsgType.POST_TELEMETRY_REQUEST, TENANT_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); return TbMsg.newMsg()
.queueName(DataConstants.MAIN_QUEUE_NAME)
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TENANT_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_STRING)
.build();
} }
private TbMsg getTbMsg() { private TbMsg getTbMsg() {
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TENANT_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); return TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TENANT_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_STRING)
.build();
} }
private static long getUntilTime() { private static long getUntilTime() {

37
application/src/test/java/org/thingsboard/server/controller/RuleEngineControllerTest.java

@ -62,7 +62,12 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
@Test @Test
public void testHandleRuleEngineRequestWithMsgOriginatorUser() throws Exception { public void testHandleRuleEngineRequestWithMsgOriginatorUser() throws Exception {
loginSysAdmin(); loginSysAdmin();
TbMsg responseMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, currentUserId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.newMsg()
.type(TbMsgType.REST_API_REQUEST)
.originator(currentUserId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/", REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/", REQUEST_BODY, new TypeReference<>() {
@ -86,7 +91,12 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
loginTenantAdmin(); loginTenantAdmin();
Device device = createDevice("Test", "123"); Device device = createDevice("Test", "123");
DeviceId deviceId = device.getId(); DeviceId deviceId = device.getId();
TbMsg responseMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.newMsg()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId(), REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId(), REQUEST_BODY, new TypeReference<>() {
@ -110,7 +120,12 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
loginTenantAdmin(); loginTenantAdmin();
Device device = createDevice("Test", "123"); Device device = createDevice("Test", "123");
DeviceId deviceId = device.getId(); DeviceId deviceId = device.getId();
TbMsg responseMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.newMsg()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId() + "/15000", REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId() + "/15000", REQUEST_BODY, new TypeReference<>() {
@ -156,7 +171,13 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
loginTenantAdmin(); loginTenantAdmin();
Device device = createDevice("Test", "123"); Device device = createDevice("Test", "123");
DeviceId deviceId = device.getId(); DeviceId deviceId = device.getId();
TbMsg responseMsg = TbMsg.newMsg(DataConstants.HP_QUEUE_NAME, TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.newMsg()
.queueName(DataConstants.HP_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId() + "/HighPriority/1000", REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId() + "/HighPriority/1000", REQUEST_BODY, new TypeReference<>() {
@ -195,7 +216,13 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
assignDeviceToCustomer(deviceId, customerId); assignDeviceToCustomer(deviceId, customerId);
loginCustomerUser(); loginCustomerUser();
TbMsg responseMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, customerId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.newMsg()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.customerId(customerId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId(), REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId(), REQUEST_BODY, new TypeReference<>() {

7
application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java

@ -743,7 +743,12 @@ public class TenantControllerTest extends AbstractControllerTest {
} }
private TbMsg publishTbMsg(TenantId tenantId, TopicPartitionInfo tpi) { private TbMsg publishTbMsg(TenantId tenantId, TopicPartitionInfo tpi) {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, tenantId, TbMsgMetaData.EMPTY, "{\"test\":1}"); TbMsg tbMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(tenantId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data("{\"test\":1}")
.build();
TransportProtos.ToRuleEngineMsg msg = TransportProtos.ToRuleEngineMsg.newBuilder() TransportProtos.ToRuleEngineMsg msg = TransportProtos.ToRuleEngineMsg.newBuilder()
.setTenantIdMSB(tenantId.getId().getMostSignificantBits()) .setTenantIdMSB(tenantId.getId().getMostSignificantBits())
.setTenantIdLSB(tenantId.getId().getLeastSignificantBits()) .setTenantIdLSB(tenantId.getId().getLeastSignificantBits())

16
application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java

@ -184,7 +184,13 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class); TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class);
Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true); Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true);
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, device.getId(), TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, tbMsgCallback); TbMsg tbMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(device.getId())
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(tbMsgCallback)
.build();
QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(savedTenant.getId(), tbMsg, null, null); QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(savedTenant.getId(), tbMsg, null, null);
// Pushing Message to the system // Pushing Message to the system
actorSystem.tell(qMsg); actorSystem.tell(qMsg);
@ -309,7 +315,13 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class); TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class);
Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true); Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true);
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, device.getId(), TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, tbMsgCallback); TbMsg tbMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(device.getId())
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(tbMsgCallback)
.build();
QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(savedTenant.getId(), tbMsg, null, null); QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(savedTenant.getId(), tbMsg, null, null);
// Pushing Message to the system // Pushing Message to the system
actorSystem.tell(qMsg); actorSystem.tell(qMsg);

8
application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java

@ -142,7 +142,13 @@ public abstract class AbstractRuleEngineLifecycleIntegrationTest extends Abstrac
log.warn("attr updated"); log.warn("attr updated");
TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class); TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class);
Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true); Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true);
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, device.getId(), TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, tbMsgCallback); TbMsg tbMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(device.getId())
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(tbMsgCallback)
.build();
QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(tenantId, tbMsg, null, null); QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(tenantId, tbMsg, null, null);
// Pushing Message to the system // Pushing Message to the system
log.warn("before tell tbMsgCallback"); log.warn("before tell tbMsgCallback");

40
application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java

@ -291,7 +291,13 @@ public class DefaultTbClusterServiceTest {
TbQueueCallback callback = mock(TbQueueCallback.class); TbQueueCallback callback = mock(TbQueueCallback.class);
TenantId tenantId = TenantId.fromUUID(UUID.fromString("3c8bd350-1239-4a3b-b9c3-4dd76f8e20f1")); TenantId tenantId = TenantId.fromUUID(UUID.fromString("3c8bd350-1239-4a3b-b9c3-4dd76f8e20f1"));
TbMsg requestMsg = TbMsg.newMsg(DataConstants.HP_QUEUE_NAME, TbMsgType.REST_API_REQUEST, tenantId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg requestMsg = TbMsg.newMsg()
.queueName(DataConstants.HP_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(tenantId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer); when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer);
@ -305,7 +311,12 @@ public class DefaultTbClusterServiceTest {
public void testPushMsgToRuleEngineWithTenantIdIsNullUuidAndEntityIsDevice() { public void testPushMsgToRuleEngineWithTenantIdIsNullUuidAndEntityIsDevice() {
TenantId tenantId = TenantId.SYS_TENANT_ID; TenantId tenantId = TenantId.SYS_TENANT_ID;
DeviceId deviceId = new DeviceId(UUID.fromString("aa6d112d-2914-4a22-a9e3-bee33edbdb14")); DeviceId deviceId = new DeviceId(UUID.fromString("aa6d112d-2914-4a22-a9e3-bee33edbdb14"));
TbMsg requestMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg requestMsg = TbMsg.newMsg()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
TbQueueCallback callback = mock(TbQueueCallback.class); TbQueueCallback callback = mock(TbQueueCallback.class);
clusterService.pushMsgToRuleEngine(tenantId, deviceId, requestMsg, false, callback); clusterService.pushMsgToRuleEngine(tenantId, deviceId, requestMsg, false, callback);
@ -321,7 +332,13 @@ public class DefaultTbClusterServiceTest {
TenantId tenantId = TenantId.fromUUID(UUID.fromString("3c8bd350-1239-4a3b-b9c3-4dd76f8e20f1")); TenantId tenantId = TenantId.fromUUID(UUID.fromString("3c8bd350-1239-4a3b-b9c3-4dd76f8e20f1"));
DeviceId deviceId = new DeviceId(UUID.fromString("adbb9d41-3367-40fd-9e74-7dd7cc5d30cf")); DeviceId deviceId = new DeviceId(UUID.fromString("adbb9d41-3367-40fd-9e74-7dd7cc5d30cf"));
DeviceProfile deviceProfile = new DeviceProfile(new DeviceProfileId(UUID.fromString("552f5d6d-0b2b-43e1-a7d2-a51cb2a96927"))); DeviceProfile deviceProfile = new DeviceProfile(new DeviceProfileId(UUID.fromString("552f5d6d-0b2b-43e1-a7d2-a51cb2a96927")));
TbMsg requestMsg = TbMsg.newMsg(DataConstants.HP_QUEUE_NAME, TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg requestMsg = TbMsg.newMsg()
.queueName(DataConstants.HP_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
when(deviceProfileCache.get(any(TenantId.class), any(DeviceId.class))).thenReturn(deviceProfile); when(deviceProfileCache.get(any(TenantId.class), any(DeviceId.class))).thenReturn(deviceProfile);
when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer); when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer);
@ -341,7 +358,12 @@ public class DefaultTbClusterServiceTest {
DeviceId deviceId = new DeviceId(UUID.fromString("016c2abb-f46f-49f9-a83d-4d28b803cfe6")); DeviceId deviceId = new DeviceId(UUID.fromString("016c2abb-f46f-49f9-a83d-4d28b803cfe6"));
DeviceProfile deviceProfile = new DeviceProfile(new DeviceProfileId(UUID.fromString("dc5766e2-1a32-4022-859b-743050097ab7"))); DeviceProfile deviceProfile = new DeviceProfile(new DeviceProfileId(UUID.fromString("dc5766e2-1a32-4022-859b-743050097ab7")));
deviceProfile.setDefaultQueueName(DataConstants.MAIN_QUEUE_NAME); deviceProfile.setDefaultQueueName(DataConstants.MAIN_QUEUE_NAME);
TbMsg requestMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg requestMsg = TbMsg.newMsg()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
when(deviceProfileCache.get(any(TenantId.class), any(DeviceId.class))).thenReturn(deviceProfile); when(deviceProfileCache.get(any(TenantId.class), any(DeviceId.class))).thenReturn(deviceProfile);
when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer); when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer);
@ -349,7 +371,7 @@ public class DefaultTbClusterServiceTest {
clusterService.pushMsgToRuleEngine(tenantId, deviceId, requestMsg, false, callback); clusterService.pushMsgToRuleEngine(tenantId, deviceId, requestMsg, false, callback);
verify(producerProvider).getRuleEngineMsgProducer(); verify(producerProvider).getRuleEngineMsgProducer();
TbMsg expectedMsg = TbMsg.transformMsgQueueName(requestMsg, DataConstants.MAIN_QUEUE_NAME); TbMsg expectedMsg = requestMsg.transform(DataConstants.MAIN_QUEUE_NAME);
ArgumentCaptor<TbMsg> actualMsg = ArgumentCaptor.forClass(TbMsg.class); ArgumentCaptor<TbMsg> actualMsg = ArgumentCaptor.forClass(TbMsg.class);
verify(ruleEngineProducerService).sendToRuleEngine(eq(tbREQueueProducer), eq(tenantId), actualMsg.capture(), eq(callback)); verify(ruleEngineProducerService).sendToRuleEngine(eq(tbREQueueProducer), eq(tenantId), actualMsg.capture(), eq(callback));
assertThat(actualMsg.getValue()).usingRecursiveComparison().ignoringFields("ctx").isEqualTo(expectedMsg); assertThat(actualMsg.getValue()).usingRecursiveComparison().ignoringFields("ctx").isEqualTo(expectedMsg);
@ -375,12 +397,12 @@ public class DefaultTbClusterServiceTest {
device.setDeviceProfileId(deviceProfileId); device.setDeviceProfileId(deviceProfileId);
// device updated // device updated
TbMsg tbMsg = TbMsg.builder().internalType(TbMsgType.ENTITY_UPDATED).build(); TbMsg tbMsg = TbMsg.newMsg().type(TbMsgType.ENTITY_UPDATED).build();
((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, deviceId, tbMsg); ((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, deviceId, tbMsg);
verify(deviceProfileCache, times(1)).get(tenantId, deviceId); verify(deviceProfileCache, times(1)).get(tenantId, deviceId);
// device deleted // device deleted
tbMsg = TbMsg.builder().internalType(TbMsgType.ENTITY_DELETED).data(JacksonUtil.toString(device)).build(); tbMsg = TbMsg.newMsg().type(TbMsgType.ENTITY_DELETED).data(JacksonUtil.toString(device)).build();
((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, deviceId, tbMsg); ((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, deviceId, tbMsg);
verify(deviceProfileCache, times(1)).get(tenantId, deviceProfileId); verify(deviceProfileCache, times(1)).get(tenantId, deviceProfileId);
} }
@ -395,12 +417,12 @@ public class DefaultTbClusterServiceTest {
asset.setAssetProfileId(assetProfileId); asset.setAssetProfileId(assetProfileId);
// asset updated // asset updated
TbMsg tbMsg = TbMsg.builder().internalType(TbMsgType.ENTITY_UPDATED).build(); TbMsg tbMsg = TbMsg.newMsg().type(TbMsgType.ENTITY_UPDATED).build();
((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, assetId, tbMsg); ((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, assetId, tbMsg);
verify(assetProfileCache, times(1)).get(tenantId, assetId); verify(assetProfileCache, times(1)).get(tenantId, assetId);
// asset deleted // asset deleted
tbMsg = TbMsg.builder().internalType(TbMsgType.ENTITY_DELETED).data(JacksonUtil.toString(asset)).build(); tbMsg = TbMsg.newMsg().type(TbMsgType.ENTITY_DELETED).data(JacksonUtil.toString(asset)).build();
((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, assetId, tbMsg); ((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, assetId, tbMsg);
verify(assetProfileCache, times(1)).get(tenantId, assetProfileId); verify(assetProfileCache, times(1)).get(tenantId, assetProfileId);
} }

7
application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java

@ -782,7 +782,12 @@ public class TbRuleEngineQueueConsumerManagerTest {
} }
public void setUpTestMsg() { public void setUpTestMsg() {
testMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, new DeviceId(UUID.randomUUID()), new TbMsgMetaData(), "{}"); testMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(new DeviceId(UUID.randomUUID()))
.copyMetaData(new TbMsgMetaData())
.data("{}")
.build();
} }
} }

2
application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineStrategyTest.java

@ -248,7 +248,7 @@ public class TbRuleEngineStrategyTest {
} }
private static TbMsg createRandomMsg() { private static TbMsg createRandomMsg() {
return TbMsg.builder() return TbMsg.newMsg()
.id(UUID.randomUUID()) .id(UUID.randomUUID())
.type("test type") .type("test type")
.originator(deviceId) .originator(deviceId)

7
application/src/test/java/org/thingsboard/server/service/rpc/DefaultTbRuleEngineRpcServiceTest.java

@ -46,7 +46,12 @@ class DefaultTbRuleEngineRpcServiceTest {
String serviceId = "tb-core-0"; String serviceId = "tb-core-0";
UUID requestId = UUID.fromString("f64a20df-eb1e-46a3-ba6f-0b3ae053ee0a"); UUID requestId = UUID.fromString("f64a20df-eb1e-46a3-ba6f-0b3ae053ee0a");
DeviceId deviceId = new DeviceId(UUID.fromString("1d9f771a-7cdc-4ac7-838c-ba193d05a012")); DeviceId deviceId = new DeviceId(UUID.fromString("1d9f771a-7cdc-4ac7-838c-ba193d05a012"));
TbMsg msg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
var restApiCallResponseMsgProto = TransportProtos.RestApiCallResponseMsgProto.newBuilder() var restApiCallResponseMsgProto = TransportProtos.RestApiCallResponseMsgProto.newBuilder()
.setRequestIdMSB(requestId.getMostSignificantBits()) .setRequestIdMSB(requestId.getMostSignificantBits())
.setRequestIdLSB(requestId.getLeastSignificantBits()) .setRequestIdLSB(requestId.getLeastSignificantBits())

16
application/src/test/java/org/thingsboard/server/service/ruleengine/DefaultRuleEngineCallServiceTest.java

@ -85,7 +85,13 @@ public class DefaultRuleEngineCallServiceTest {
metaData.put("serviceId", "core"); metaData.put("serviceId", "core");
metaData.put("requestUUID", requestId.toString()); metaData.put("requestUUID", requestId.toString());
metaData.put("expirationTime", Long.toString(expTime)); metaData.put("expirationTime", Long.toString(expTime));
TbMsg msg = TbMsg.newMsg(DataConstants.MAIN_QUEUE_NAME, TbMsgType.REST_API_REQUEST, TENANT_ID, new TbMsgMetaData(metaData), "{\"key\":\"value\"}"); TbMsg msg = TbMsg.newMsg()
.queueName(DataConstants.MAIN_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(TENANT_ID)
.copyMetaData(new TbMsgMetaData(metaData))
.data("{\"key\":\"value\"}")
.build();
Consumer<TbMsg> anyConsumer = TbMsg::getData; Consumer<TbMsg> anyConsumer = TbMsg::getData;
doAnswer(invocation -> { doAnswer(invocation -> {
@ -113,7 +119,13 @@ public class DefaultRuleEngineCallServiceTest {
metaData.put("serviceId", "core"); metaData.put("serviceId", "core");
metaData.put("requestUUID", requestId.toString()); metaData.put("requestUUID", requestId.toString());
metaData.put("expirationTime", Long.toString(expTime)); metaData.put("expirationTime", Long.toString(expTime));
TbMsg msg = TbMsg.newMsg(DataConstants.MAIN_QUEUE_NAME, TbMsgType.REST_API_REQUEST, TENANT_ID, new TbMsgMetaData(metaData), "{\"key\":\"value\"}"); TbMsg msg = TbMsg.newMsg()
.queueName(DataConstants.MAIN_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(TENANT_ID)
.copyMetaData(new TbMsgMetaData(metaData))
.data("{\"key\":\"value\"}")
.build();
Consumer<TbMsg> anyConsumer = TbMsg::getData; Consumer<TbMsg> anyConsumer = TbMsg::getData;
doAnswer(invocation -> { doAnswer(invocation -> {

12
application/src/test/java/org/thingsboard/server/service/sql/SequentialTimeseriesPersistenceTest.java

@ -131,11 +131,13 @@ public class SequentialTimeseriesPersistenceTest extends AbstractControllerTest
void saveLatestTsForAssetAndDevice(List<Device> devices, Asset asset, int idx) throws ExecutionException, InterruptedException, TimeoutException { void saveLatestTsForAssetAndDevice(List<Device> devices, Asset asset, int idx) throws ExecutionException, InterruptedException, TimeoutException {
for (Device device : devices) { for (Device device : devices) {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TbMsg tbMsg = TbMsg.newMsg()
device.getId(), .type(TbMsgType.POST_TELEMETRY_REQUEST)
getTbMsgMetadata(device.getName(), ts.get(idx)), .originator(device.getId())
TbMsgDataType.JSON, .copyMetaData(getTbMsgMetadata(device.getName(), ts.get(idx)))
getTbMsgData(msgValue.get(idx))); .dataType(TbMsgDataType.JSON)
.data(getTbMsgData(msgValue.get(idx)))
.build();
saveDeviceTsEntry(device.getId(), tbMsg, msgValue.get(idx)); saveDeviceTsEntry(device.getId(), tbMsg, msgValue.get(idx));
saveAssetTsEntry(asset, device.getName(), msgValue.get(idx), TbMsgTimeseriesNode.computeTs(tbMsg, configuration.isUseServerTs())); saveAssetTsEntry(asset, device.getName(), msgValue.get(idx), TbMsgTimeseriesNode.computeTs(tbMsg, configuration.isUseServerTs()));
idx++; idx++;

503
common/message/src/main/java/org/thingsboard/server/common/msg/TbMsg.java

@ -19,8 +19,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -44,8 +42,6 @@ import java.util.UUID;
*/ */
@Data @Data
@Slf4j @Slf4j
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(toBuilder = true)
public final class TbMsg implements Serializable { public final class TbMsg implements Serializable {
public static final String EMPTY_JSON_OBJECT = "{}"; public static final String EMPTY_JSON_OBJECT = "{}";
@ -77,279 +73,55 @@ public final class TbMsg implements Serializable {
@JsonIgnore @JsonIgnore
transient private final TbMsgCallback callback; transient private final TbMsgCallback callback;
public int getAndIncrementRuleNodeCounter() { public static TbMsgBuilder newMsg() {
return ctx.getAndIncrementRuleNodeCounter(); return new TbMsgBuilder();
}
@Deprecated(since = "3.6.0", forRemoval = true)
public static TbMsg newMsg(String queueName, String type, EntityId originator, TbMsgMetaData metaData, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return newMsg(queueName, type, originator, null, metaData, data, ruleChainId, ruleNodeId);
}
/**
* Creates a new TbMsg instance with the specified parameters.
*
* <p><strong>Deprecated:</strong> This method is deprecated since version 3.6.0 and should only be used when you need to
* specify a custom message type that doesn't exist in the {@link TbMsgType} enum. For standard message types,
* it is recommended to use the {@link #newMsg(String, TbMsgType, EntityId, CustomerId, TbMsgMetaData, String, RuleChainId, RuleNodeId)}
* method instead.</p>
*
* @param queueName the name of the queue where the message will be sent
* @param type the type of the message
* @param originator the originator of the message
* @param customerId the ID of the customer associated with the message
* @param metaData the metadata of the message
* @param data the data of the message
* @param ruleChainId the ID of the rule chain associated with the message
* @param ruleNodeId the ID of the rule node associated with the message
* @return new TbMsg instance
*/
@Deprecated(since = "3.6.0")
public static TbMsg newMsg(String queueName, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return new TbMsg(queueName, UUID.randomUUID(), System.currentTimeMillis(), null, type, originator, customerId,
metaData.copy(), TbMsgDataType.JSON, data, ruleChainId, ruleNodeId, null, TbMsgCallback.EMPTY);
}
@Deprecated(since = "3.6.0", forRemoval = true)
public static TbMsg newMsg(String type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(type, originator, null, metaData, data);
}
@Deprecated(since = "3.6.0", forRemoval = true)
public static TbMsg newMsg(String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return new TbMsg(null, UUID.randomUUID(), System.currentTimeMillis(), null, type, originator, customerId,
metaData.copy(), TbMsgDataType.JSON, data, null, null, null, TbMsgCallback.EMPTY);
}
public static TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return newMsg(queueName, type, originator, null, metaData, data, ruleChainId, ruleNodeId);
}
public static TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return new TbMsg(queueName, UUID.randomUUID(), System.currentTimeMillis(), type, originator, customerId,
metaData.copy(), TbMsgDataType.JSON, data, ruleChainId, ruleNodeId, null, TbMsgCallback.EMPTY);
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(type, originator, null, metaData, data);
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return new TbMsg(null, UUID.randomUUID(), System.currentTimeMillis(), type, originator, customerId,
metaData.copy(), TbMsgDataType.JSON, data, null, null, null, TbMsgCallback.EMPTY);
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data, long ts) {
return new TbMsg(null, UUID.randomUUID(), ts, type, originator, null,
metaData.copy(), TbMsgDataType.JSON, data, null, null, null, TbMsgCallback.EMPTY);
}
// REALLY NEW MSG
/**
* Creates a new TbMsg instance with the specified parameters.
*
* <p><strong>Deprecated:</strong> This method is deprecated since version 3.6.0 and should only be used when you need to
* specify a custom message type that doesn't exist in the {@link TbMsgType} enum. For standard message types,
* it is recommended to use the {@link #newMsg(String, TbMsgType, EntityId, TbMsgMetaData, String)}
* method instead.</p>
*
* @param queueName the name of the queue where the message will be sent
* @param type the type of the message
* @param originator the originator of the message
* @param metaData the metadata of the message
* @param data the data of the message
* @return new TbMsg instance
*/
@Deprecated(since = "3.6.0")
public static TbMsg newMsg(String queueName, String type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(queueName, type, originator, null, metaData, data);
}
/**
* Creates a new TbMsg instance with the specified parameters.
*
* <p><strong>Deprecated:</strong> This method is deprecated since version 3.6.0 and should only be used when you need to
* specify a custom message type that doesn't exist in the {@link TbMsgType} enum. For standard message types,
* it is recommended to use the {@link #newMsg(String, TbMsgType, EntityId, CustomerId, TbMsgMetaData, String)}
* method instead.</p>
*
* @param queueName the name of the queue where the message will be sent
* @param type the type of the message
* @param originator the originator of the message
* @param customerId the ID of the customer associated with the message
* @param metaData the metadata of the message
* @param data the data of the message
* @return new TbMsg instance
*/
@Deprecated(since = "3.6.0")
public static TbMsg newMsg(String queueName, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return new TbMsg(queueName, UUID.randomUUID(), System.currentTimeMillis(), null, type, originator, customerId,
metaData.copy(), TbMsgDataType.JSON, data, null, null, null, TbMsgCallback.EMPTY);
}
@Deprecated(since = "3.6.0", forRemoval = true)
public static TbMsg newMsg(String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, TbMsgDataType dataType, String data) {
return new TbMsg(null, UUID.randomUUID(), System.currentTimeMillis(), null, type, originator, customerId,
metaData.copy(), dataType, data, null, null, null, TbMsgCallback.EMPTY);
}
/**
* Creates a new TbMsg instance with the specified parameters.
*
* <p><strong>Deprecated:</strong> This method is deprecated since version 3.6.0 and should only be used when you need to
* specify a custom message type that doesn't exist in the {@link TbMsgType} enum. For standard message types,
* it is recommended to use the {@link #newMsg(TbMsgType, EntityId, TbMsgMetaData, TbMsgDataType, String)}
* method instead.</p>
*
* @param type the type of the message
* @param originator the originator of the message
* @param metaData the metadata of the message
* @param dataType the dataType of the message
* @param data the data of the message
* @return new TbMsg instance
*/
@Deprecated(since = "3.6.0")
public static TbMsg newMsg(String type, EntityId originator, TbMsgMetaData metaData, TbMsgDataType dataType, String data) {
return newMsg(type, originator, null, metaData, dataType, data);
}
public static TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(queueName, type, originator, null, metaData, data);
}
public static TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return new TbMsg(queueName, UUID.randomUUID(), System.currentTimeMillis(), type, originator, customerId,
metaData.copy(), TbMsgDataType.JSON, data, null, null, null, TbMsgCallback.EMPTY);
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, TbMsgDataType dataType, String data) {
return new TbMsg(null, UUID.randomUUID(), System.currentTimeMillis(), type, originator, customerId,
metaData.copy(), dataType, data, null, null, null, TbMsgCallback.EMPTY);
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, TbMsgDataType dataType, String data) {
return newMsg(type, originator, null, metaData, dataType, data);
}
// For Tests only
@Deprecated(since = "3.6.0", forRemoval = true)
public static TbMsg newMsg(String type, EntityId originator, TbMsgMetaData metaData, TbMsgDataType dataType, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return new TbMsg(null, UUID.randomUUID(), System.currentTimeMillis(), null, type, originator, null,
metaData.copy(), dataType, data, ruleChainId, ruleNodeId, null, TbMsgCallback.EMPTY);
}
@Deprecated(since = "3.6.0", forRemoval = true)
public static TbMsg newMsg(String type, EntityId originator, TbMsgMetaData metaData, String data, TbMsgCallback callback) {
return new TbMsg(null, UUID.randomUUID(), System.currentTimeMillis(), null, type, originator, null,
metaData.copy(), TbMsgDataType.JSON, data, null, null, null, callback);
}
/**
* Transforms an existing TbMsg instance by changing its message type, originator, metadata, and data.
*
* <p><strong>Deprecated:</strong> This method is deprecated since version 3.6.0 and should only be used when you need to
* specify a custom message type that doesn't exist in the {@link TbMsgType} enum. For standard message types,
* it is recommended to use the {@link #transformMsg(TbMsg, TbMsgType, EntityId, TbMsgMetaData, String)}
* method instead.</p>
*
*
* @param tbMsg the TbMsg instance to transform
* @param type the new message type
* @param originator the new originator
* @param metaData the new metadata
* @param data the new data
* @return the transformed TbMsg instance
*/
@Deprecated(since = "3.6.0")
public static TbMsg transformMsg(TbMsg tbMsg, String type, EntityId originator, TbMsgMetaData metaData, String data) {
return new TbMsg(tbMsg.queueName, tbMsg.id, tbMsg.ts, null, type, originator, tbMsg.customerId, metaData.copy(), tbMsg.dataType,
data, tbMsg.ruleChainId, tbMsg.ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.callback);
} }
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, TbMsgDataType dataType, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) { public TbMsgBuilder transform() {
return new TbMsg(null, UUID.randomUUID(), System.currentTimeMillis(), type, originator, null, return new TbMsgTransformer(this);
metaData.copy(), dataType, data, ruleChainId, ruleNodeId, null, TbMsgCallback.EMPTY);
} }
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data, TbMsgCallback callback) { public TbMsgBuilder copy() {
return new TbMsg(null, UUID.randomUUID(), System.currentTimeMillis(), type, originator, null, return new TbMsgBuilder(this);
metaData.copy(), TbMsgDataType.JSON, data, null, null, null, callback);
} }
public static TbMsg transformMsg(TbMsg tbMsg, TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data) { public TbMsg transform(String queueName) {
return new TbMsg(tbMsg.queueName, tbMsg.id, tbMsg.ts, type, type.name(), originator, tbMsg.customerId, metaData.copy(), tbMsg.dataType, return transform()
data, tbMsg.ruleChainId, tbMsg.ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.callback); .queueName(queueName)
.resetRuleNodeId()
.build();
} }
public static TbMsg transformMsgOriginator(TbMsg tbMsg, EntityId originatorId) { // used for enqueueForTellNext
return new TbMsg(tbMsg.queueName, tbMsg.id, tbMsg.ts, tbMsg.internalType, tbMsg.type, originatorId, tbMsg.getCustomerId(), tbMsg.metaData, tbMsg.dataType,
tbMsg.data, tbMsg.ruleChainId, tbMsg.ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.getCallback());
}
public static TbMsg transformMsgData(TbMsg tbMsg, String data) {
return new TbMsg(tbMsg.queueName, tbMsg.id, tbMsg.ts, tbMsg.internalType, tbMsg.type, tbMsg.originator, tbMsg.customerId, tbMsg.metaData, tbMsg.dataType,
data, tbMsg.ruleChainId, tbMsg.ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.getCallback());
}
public static TbMsg transformMsgMetadata(TbMsg tbMsg, TbMsgMetaData metadata) {
return new TbMsg(tbMsg.queueName, tbMsg.id, tbMsg.ts, tbMsg.internalType, tbMsg.type, tbMsg.originator, tbMsg.customerId, metadata.copy(), tbMsg.dataType,
tbMsg.data, tbMsg.ruleChainId, tbMsg.ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.getCallback());
}
public static TbMsg transformMsg(TbMsg tbMsg, TbMsgMetaData metadata, String data) {
return new TbMsg(tbMsg.queueName, tbMsg.id, tbMsg.ts, tbMsg.internalType, tbMsg.type, tbMsg.originator, tbMsg.customerId, metadata, tbMsg.dataType,
data, tbMsg.ruleChainId, tbMsg.ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.getCallback());
}
public static TbMsg transformMsgCustomerId(TbMsg tbMsg, CustomerId customerId) {
return new TbMsg(tbMsg.queueName, tbMsg.id, tbMsg.ts, tbMsg.internalType, tbMsg.type, tbMsg.originator, customerId, tbMsg.metaData, tbMsg.dataType,
tbMsg.data, tbMsg.ruleChainId, tbMsg.ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.getCallback());
}
public static TbMsg transformMsgRuleChainId(TbMsg tbMsg, RuleChainId ruleChainId) {
return new TbMsg(tbMsg.queueName, tbMsg.id, tbMsg.ts, tbMsg.internalType, tbMsg.type, tbMsg.originator, tbMsg.customerId, tbMsg.metaData, tbMsg.dataType,
tbMsg.data, ruleChainId, null, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.getCallback());
}
public static TbMsg transformMsgQueueName(TbMsg tbMsg, String queueName) {
return new TbMsg(queueName, tbMsg.id, tbMsg.ts, tbMsg.internalType, tbMsg.type, tbMsg.originator, tbMsg.customerId, tbMsg.metaData, tbMsg.dataType,
tbMsg.data, tbMsg.getRuleChainId(), null, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.getCallback());
}
public static TbMsg transformMsg(TbMsg tbMsg, RuleChainId ruleChainId, String queueName) {
return new TbMsg(queueName, tbMsg.id, tbMsg.ts, tbMsg.internalType, tbMsg.type, tbMsg.originator, tbMsg.customerId, tbMsg.metaData, tbMsg.dataType,
tbMsg.data, ruleChainId, null, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), tbMsg.getCallback());
}
//used for enqueueForTellNext
public static TbMsg newMsg(TbMsg tbMsg, String queueName, RuleChainId ruleChainId, RuleNodeId ruleNodeId) { public static TbMsg newMsg(TbMsg tbMsg, String queueName, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return new TbMsg(queueName, UUID.randomUUID(), tbMsg.getTs(), tbMsg.getInternalType(), tbMsg.getType(), tbMsg.getOriginator(), tbMsg.customerId, tbMsg.getMetaData().copy(), return tbMsg.transform()
tbMsg.getDataType(), tbMsg.getData(), ruleChainId, ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), TbMsgCallback.EMPTY); .id(UUID.randomUUID())
} .queueName(queueName)
.metaData(tbMsg.getMetaData())
private TbMsg(String queueName, UUID id, long ts, TbMsgType internalType, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, TbMsgDataType dataType, String data, .ruleChainId(ruleChainId)
RuleChainId ruleChainId, RuleNodeId ruleNodeId, TbMsgProcessingCtx ctx, TbMsgCallback callback) { .ruleNodeId(ruleNodeId)
this(queueName, id, ts, internalType, internalType.name(), originator, customerId, metaData, dataType, data, ruleChainId, ruleNodeId, ctx, callback); .callback(TbMsgCallback.EMPTY)
.build();
} }
private TbMsg(String queueName, UUID id, long ts, TbMsgType internalType, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, TbMsgDataType dataType, String data, public TbMsg copyWithNewCtx() {
RuleChainId ruleChainId, RuleNodeId ruleNodeId, TbMsgProcessingCtx ctx, TbMsgCallback callback) { return copy()
this(queueName, id, ts, internalType, type, originator, customerId, metaData, dataType, data, ruleChainId, ruleNodeId, null, null, ctx, callback); .ctx(ctx.copy())
.callback(TbMsgCallback.EMPTY)
.build();
} }
private TbMsg(String queueName, UUID id, long ts, TbMsgType internalType, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, TbMsgDataType dataType, String data, private TbMsg(String queueName, UUID id, long ts, TbMsgType internalType, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, TbMsgDataType dataType, String data,
RuleChainId ruleChainId, RuleNodeId ruleNodeId, UUID correlationId, Integer partition, TbMsgProcessingCtx ctx, TbMsgCallback callback) { RuleChainId ruleChainId, RuleNodeId ruleNodeId, UUID correlationId, Integer partition, TbMsgProcessingCtx ctx, TbMsgCallback callback) {
this.id = id; this.id = id != null ? id : UUID.randomUUID();
this.queueName = queueName; this.queueName = queueName;
if (ts > 0) { if (ts > 0) {
this.ts = ts; this.ts = ts;
} else { } else {
this.ts = System.currentTimeMillis(); this.ts = System.currentTimeMillis();
} }
this.type = type;
this.internalType = internalType != null ? internalType : getInternalType(type); this.internalType = internalType != null ? internalType : getInternalType(type);
this.type = type != null ? type : this.internalType.name();
this.originator = originator; this.originator = originator;
if (customerId == null || customerId.isNullUid()) { if (customerId == null || customerId.isNullUid()) {
if (originator != null && originator.getEntityType() == EntityType.CUSTOMER) { if (originator != null && originator.getEntityType() == EntityType.CUSTOMER) {
@ -361,7 +133,7 @@ public final class TbMsg implements Serializable {
this.customerId = customerId; this.customerId = customerId;
} }
this.metaData = metaData; this.metaData = metaData;
this.dataType = dataType; this.dataType = dataType != null ? dataType : TbMsgDataType.JSON;
this.data = data; this.data = data;
this.ruleChainId = ruleChainId; this.ruleChainId = ruleChainId;
this.ruleNodeId = ruleNodeId; this.ruleNodeId = ruleNodeId;
@ -458,23 +230,8 @@ public final class TbMsg implements Serializable {
} }
} }
public TbMsg copyWithRuleChainId(RuleChainId ruleChainId) { public int getAndIncrementRuleNodeCounter() {
return copyWithRuleChainId(ruleChainId, this.id); return ctx.getAndIncrementRuleNodeCounter();
}
public TbMsg copyWithRuleChainId(RuleChainId ruleChainId, UUID msgId) {
return new TbMsg(this.queueName, msgId, this.ts, this.internalType, this.type, this.originator, this.customerId,
this.metaData, this.dataType, this.data, ruleChainId, null, this.correlationId, this.partition, this.ctx, callback);
}
public TbMsg copyWithRuleNodeId(RuleChainId ruleChainId, RuleNodeId ruleNodeId, UUID msgId) {
return new TbMsg(this.queueName, msgId, this.ts, this.internalType, this.type, this.originator, this.customerId,
this.metaData, this.dataType, this.data, ruleChainId, ruleNodeId, this.correlationId, this.partition, this.ctx, callback);
}
public TbMsg copyWithNewCtx() {
return new TbMsg(this.queueName, this.id, this.ts, this.internalType, this.type, this.originator, this.customerId,
this.metaData, this.dataType, this.data, ruleChainId, ruleNodeId, this.correlationId, this.partition, this.ctx.copy(), TbMsgCallback.EMPTY);
} }
public TbMsgCallback getCallback() { public TbMsgCallback getCallback() {
@ -510,11 +267,13 @@ public final class TbMsg implements Serializable {
} }
private TbMsgType getInternalType(String type) { private TbMsgType getInternalType(String type) {
try { if (type != null) {
return TbMsgType.valueOf(type); try {
} catch (IllegalArgumentException e) { return TbMsgType.valueOf(type);
return TbMsgType.NA; } catch (IllegalArgumentException ignored) {
}
} }
return TbMsgType.NA;
} }
public boolean isTypeOf(TbMsgType tbMsgType) { public boolean isTypeOf(TbMsgType tbMsgType) {
@ -530,4 +289,194 @@ public final class TbMsg implements Serializable {
return false; return false;
} }
public static class TbMsgTransformer extends TbMsgBuilder {
TbMsgTransformer(TbMsg tbMsg) {
super(tbMsg);
}
/*
* metadata is only copied if specified explicitly during transform
* */
@Override
public TbMsgTransformer metaData(TbMsgMetaData metaData) {
this.metaData = metaData.copy();
return this;
}
/*
* setting ruleNodeId to null when updating ruleChainId
* */
@Override
public TbMsgBuilder ruleChainId(RuleChainId ruleChainId) {
this.ruleChainId = ruleChainId;
this.ruleNodeId = null;
return this;
}
@Override
public TbMsg build() {
/*
* always copying ctx when transforming
* */
if (this.ctx != null) {
this.ctx = this.ctx.copy();
}
return super.build();
}
}
public static class TbMsgBuilder {
protected String queueName;
protected UUID id;
protected long ts;
protected String type;
protected TbMsgType internalType;
protected EntityId originator;
protected CustomerId customerId;
protected TbMsgMetaData metaData;
protected TbMsgDataType dataType;
protected String data;
protected RuleChainId ruleChainId;
protected RuleNodeId ruleNodeId;
protected UUID correlationId;
protected Integer partition;
protected TbMsgProcessingCtx ctx;
protected TbMsgCallback callback;
TbMsgBuilder() {}
TbMsgBuilder(TbMsg tbMsg) {
this.queueName = tbMsg.queueName;
this.id = tbMsg.id;
this.ts = tbMsg.ts;
this.type = tbMsg.type;
this.internalType = tbMsg.internalType;
this.originator = tbMsg.originator;
this.customerId = tbMsg.customerId;
this.metaData = tbMsg.metaData;
this.dataType = tbMsg.dataType;
this.data = tbMsg.data;
this.ruleChainId = tbMsg.ruleChainId;
this.ruleNodeId = tbMsg.ruleNodeId;
this.correlationId = tbMsg.correlationId;
this.partition = tbMsg.partition;
this.ctx = tbMsg.ctx;
this.callback = tbMsg.callback;
}
public TbMsgBuilder queueName(String queueName) {
this.queueName = queueName;
return this;
}
public TbMsgBuilder id(UUID id) {
this.id = id;
return this;
}
public TbMsgBuilder ts(long ts) {
this.ts = ts;
return this;
}
/**
* <p><strong>Deprecated:</strong> This should only be used when you need to specify a custom message type that doesn't exist in the {@link TbMsgType} enum.
* Prefer using {@link #type(TbMsgType)} instead.
*
* */
@Deprecated
public TbMsgBuilder type(String type) {
this.type = type;
this.internalType = null;
return this;
}
public TbMsgBuilder type(TbMsgType internalType) {
this.internalType = internalType;
this.type = internalType.name();
return this;
}
public TbMsgBuilder originator(EntityId originator) {
this.originator = originator;
return this;
}
public TbMsgBuilder customerId(CustomerId customerId) {
this.customerId = customerId;
return this;
}
public TbMsgBuilder metaData(TbMsgMetaData metaData) {
this.metaData = metaData;
return this;
}
public TbMsgBuilder copyMetaData(TbMsgMetaData metaData) {
this.metaData = metaData.copy();
return this;
}
public TbMsgBuilder dataType(TbMsgDataType dataType) {
this.dataType = dataType;
return this;
}
public TbMsgBuilder data(String data) {
this.data = data;
return this;
}
public TbMsgBuilder ruleChainId(RuleChainId ruleChainId) {
this.ruleChainId = ruleChainId;
return this;
}
public TbMsgBuilder ruleNodeId(RuleNodeId ruleNodeId) {
this.ruleNodeId = ruleNodeId;
return this;
}
public TbMsgBuilder resetRuleNodeId() {
return ruleNodeId(null);
}
public TbMsgBuilder correlationId(UUID correlationId) {
this.correlationId = correlationId;
return this;
}
public TbMsgBuilder partition(Integer partition) {
this.partition = partition;
return this;
}
public TbMsgBuilder ctx(TbMsgProcessingCtx ctx) {
this.ctx = ctx;
return this;
}
public TbMsgBuilder callback(TbMsgCallback callback) {
this.callback = callback;
return this;
}
public TbMsg build() {
return new TbMsg(queueName, id, ts, internalType, type, originator, customerId, metaData, dataType, data, ruleChainId, ruleNodeId, correlationId, partition, ctx, callback);
}
public String toString() {
return "TbMsg.TbMsgBuilder(queueName=" + this.queueName + ", id=" + this.id + ", ts=" + this.ts +
", type=" + this.type + ", internalType=" + this.internalType + ", originator=" + this.originator +
", customerId=" + this.customerId + ", metaData=" + this.metaData + ", dataType=" + this.dataType +
", data=" + this.data + ", ruleChainId=" + this.ruleChainId + ", ruleNodeId=" + this.ruleNodeId +
", correlationId=" + this.correlationId + ", partition=" + this.partition + ", ctx=" + this.ctx +
", callback=" + this.callback + ")";
}
}
} }

2
common/queue/src/main/java/org/thingsboard/server/queue/common/TbRuleEngineProducerService.java

@ -47,7 +47,7 @@ public class TbRuleEngineProducerService {
Integer partition = tpi.getPartition().orElse(null); Integer partition = tpi.getPartition().orElse(null);
UUID id = i > 0 ? UUID.randomUUID() : tbMsg.getId(); UUID id = i > 0 ? UUID.randomUUID() : tbMsg.getId();
tbMsg = tbMsg.toBuilder() tbMsg = tbMsg.transform()
.id(id) .id(id)
.correlationId(correlationId) .correlationId(correlationId)
.partition(partition) .partition(partition)

11
common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java

@ -45,7 +45,6 @@ import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.device.data.PowerMode; import org.thingsboard.server.common.data.device.data.PowerMode;
import org.thingsboard.server.common.data.exception.TenantNotFoundException;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.DeviceProfileId;
@ -1137,7 +1136,15 @@ public class DefaultTransportService extends TransportActivityManager implements
queueName = deviceProfile.getDefaultQueueName(); queueName = deviceProfile.getDefaultQueueName();
} }
TbMsg tbMsg = TbMsg.newMsg(queueName, tbMsgType, deviceId, customerId, metaData, gson.toJson(json), ruleChainId, null); TbMsg tbMsg = TbMsg.newMsg()
.queueName(queueName)
.type(tbMsgType)
.originator(deviceId)
.customerId(customerId)
.copyMetaData(metaData)
.data(gson.toJson(json))
.ruleChainId(ruleChainId)
.build();
ruleEngineProducerService.sendToRuleEngine(ruleEngineMsgProducer, tenantId, tbMsg, new StatsCallback(callback, ruleEngineProducerStats)); ruleEngineProducerService.sendToRuleEngine(ruleEngineMsgProducer, tenantId, tbMsg, new StatsCallback(callback, ruleEngineProducerStats));
ruleEngineProducerStats.incrementTotal(); ruleEngineProducerStats.incrementTotal();
} }

3
rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java

@ -192,9 +192,6 @@ public interface TbContext {
void ack(TbMsg tbMsg); void ack(TbMsg tbMsg);
@Deprecated(since = "3.6.0", forRemoval = true)
TbMsg newMsg(String queueName, String type, EntityId originator, TbMsgMetaData metaData, String data);
/** /**
* Creates a new TbMsg instance with the specified parameters. * Creates a new TbMsg instance with the specified parameters.
* *

35
rule-engine/rule-engine-api/src/test/java/org/thingsboard/rule/engine/api/util/TbNodeUtilsTest.java

@ -44,7 +44,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.put("data_key", "data_value"); node.put("data_key", "data_value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.copyMetaData(md)
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals("ABC metadata_value data_value", result); Assertions.assertEquals("ABC metadata_value data_value", result);
} }
@ -58,7 +63,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.put("key", "data_value"); node.put("key", "data_value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.copyMetaData(md)
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals(pattern, result); Assertions.assertEquals(pattern, result);
} }
@ -72,7 +82,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.put("key", "data_value"); node.put("key", "data_value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.copyMetaData(md)
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals("ABC metadata_value data_value", result); Assertions.assertEquals("ABC metadata_value data_value", result);
} }
@ -93,7 +108,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.set("key1", key1Node); node.set("key1", key1Node);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.copyMetaData(md)
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals("ABC metadata_value value3", result); Assertions.assertEquals("ABC metadata_value value3", result);
} }
@ -114,7 +134,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.set("key1", key1Node); node.set("key1", key1Node);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.copyMetaData(md)
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals("ABC metadata_value $[key1.key2[0].key3]", result); Assertions.assertEquals("ABC metadata_value $[key1.key2[0].key3]", result);
} }

4
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractAlarmNode.java

@ -79,7 +79,9 @@ public abstract class TbAbstractAlarmNode<C extends TbAbstractAlarmNodeConfigura
if (previousDetails != null) { if (previousDetails != null) {
TbMsgMetaData metaData = msg.getMetaData().copy(); TbMsgMetaData metaData = msg.getMetaData().copy();
metaData.putValue(PREV_ALARM_DETAILS, JacksonUtil.toString(previousDetails)); metaData.putValue(PREV_ALARM_DETAILS, JacksonUtil.toString(previousDetails));
dummyMsg = TbMsg.transformMsgMetadata(msg, metaData); dummyMsg = msg.transform()
.metaData(metaData)
.build();
} }
return scriptEngine.executeJsonAsync(dummyMsg); return scriptEngine.executeJsonAsync(dummyMsg);
} catch (Exception e) { } catch (Exception e) {

9
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java

@ -74,7 +74,14 @@ public class TbMsgCountNode implements TbNode {
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("delta", Long.toString(System.currentTimeMillis() - lastScheduledTs + delay)); metaData.putValue("delta", Long.toString(System.currentTimeMillis() - lastScheduledTs + delay));
TbMsg tbMsg = TbMsg.newMsg(msg.getQueueName(), TbMsgType.POST_TELEMETRY_REQUEST, ctx.getTenantId(), msg.getCustomerId(), metaData, gson.toJson(telemetryJson)); TbMsg tbMsg = TbMsg.newMsg()
.queueName(msg.getQueueName())
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(ctx.getTenantId())
.customerId(msg.getCustomerId())
.copyMetaData(metaData)
.data(gson.toJson(telemetryJson))
.build();
ctx.enqueueForTellNext(tbMsg, TbNodeConnectionType.SUCCESS); ctx.enqueueForTellNext(tbMsg, TbNodeConnectionType.SUCCESS);
scheduleTickMsg(ctx, tbMsg); scheduleTickMsg(ctx, tbMsg);
} else { } else {

9
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNode.java

@ -132,14 +132,19 @@ public class TbAwsLambdaNode extends TbAbstractExternalNode {
TbMsgMetaData metaData = originalMsg.getMetaData().copy(); TbMsgMetaData metaData = originalMsg.getMetaData().copy();
metaData.putValue("requestId", invokeResult.getSdkResponseMetadata().getRequestId()); metaData.putValue("requestId", invokeResult.getSdkResponseMetadata().getRequestId());
String data = getPayload(invokeResult); String data = getPayload(invokeResult);
return TbMsg.transformMsg(originalMsg, metaData, data); return originalMsg.transform()
.metaData(metaData)
.data(data)
.build();
} }
private TbMsg processException(TbMsg origMsg, InvokeResult invokeResult, Throwable t) { private TbMsg processException(TbMsg origMsg, InvokeResult invokeResult, Throwable t) {
TbMsgMetaData metaData = origMsg.getMetaData().copy(); TbMsgMetaData metaData = origMsg.getMetaData().copy();
metaData.putValue("error", t.getClass() + ": " + t.getMessage()); metaData.putValue("error", t.getClass() + ": " + t.getMessage());
metaData.putValue("requestId", invokeResult.getSdkResponseMetadata().getRequestId()); metaData.putValue("requestId", invokeResult.getSdkResponseMetadata().getRequestId());
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
@Override @Override

8
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/sns/TbSnsNode.java

@ -103,13 +103,17 @@ public class TbSnsNode extends TbAbstractExternalNode {
TbMsgMetaData metaData = origMsg.getMetaData().copy(); TbMsgMetaData metaData = origMsg.getMetaData().copy();
metaData.putValue(MESSAGE_ID, result.getMessageId()); metaData.putValue(MESSAGE_ID, result.getMessageId());
metaData.putValue(REQUEST_ID, result.getSdkResponseMetadata().getRequestId()); metaData.putValue(REQUEST_ID, result.getSdkResponseMetadata().getRequestId());
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
private TbMsg processException(TbMsg origMsg, Throwable t) { private TbMsg processException(TbMsg origMsg, Throwable t) {
TbMsgMetaData metaData = origMsg.getMetaData().copy(); TbMsgMetaData metaData = origMsg.getMetaData().copy();
metaData.putValue(ERROR, t.getClass() + ": " + t.getMessage()); metaData.putValue(ERROR, t.getClass() + ": " + t.getMessage());
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
@Override @Override

8
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/aws/sqs/TbSqsNode.java

@ -134,13 +134,17 @@ public class TbSqsNode extends TbAbstractExternalNode {
if (!StringUtils.isEmpty(result.getSequenceNumber())) { if (!StringUtils.isEmpty(result.getSequenceNumber())) {
metaData.putValue(SEQUENCE_NUMBER, result.getSequenceNumber()); metaData.putValue(SEQUENCE_NUMBER, result.getSequenceNumber());
} }
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
private TbMsg processException(TbMsg origMsg, Throwable t) { private TbMsg processException(TbMsg origMsg, Throwable t) {
TbMsgMetaData metaData = origMsg.getMetaData().copy(); TbMsgMetaData metaData = origMsg.getMetaData().copy();
metaData.putValue(ERROR, t.getClass() + ": " + t.getMessage()); metaData.putValue(ERROR, t.getClass() + ": " + t.getMessage());
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
@Override @Override

29
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/deduplication/TbMsgDeduplicationNode.java

@ -154,12 +154,13 @@ public class TbMsgDeduplicationNode implements TbNode {
iterator.remove(); iterator.remove();
} }
} }
deduplicationResults.add(TbMsg.newMsg( deduplicationResults.add(TbMsg.newMsg()
queueName, .queueName(queueName)
config.getOutMsgType(), .type(config.getOutMsgType())
deduplicationId, .originator(deduplicationId)
getMetadata(), .copyMetaData(getMetadata())
getMergedData(pack))); .data(getMergedData(pack))
.build());
} else { } else {
TbMsg resultMsg = null; TbMsg resultMsg = null;
boolean searchMin = DeduplicationStrategy.FIRST.equals(config.getStrategy()); boolean searchMin = DeduplicationStrategy.FIRST.equals(config.getStrategy());
@ -176,13 +177,15 @@ public class TbMsgDeduplicationNode implements TbNode {
} }
} }
if (resultMsg != null) { if (resultMsg != null) {
deduplicationResults.add(TbMsg.newMsg( String queueName1 = queueName != null ? queueName : resultMsg.getQueueName();
queueName != null ? queueName : resultMsg.getQueueName(), deduplicationResults.add(TbMsg.newMsg()
resultMsg.getType(), .queueName(queueName1)
resultMsg.getOriginator(), .type(resultMsg.getType())
resultMsg.getCustomerId(), .originator(resultMsg.getOriginator())
resultMsg.getMetaData(), .customerId(resultMsg.getCustomerId())
resultMsg.getData())); .copyMetaData(resultMsg.getMetaData())
.data(resultMsg.getData())
.build());
} }
} }
packBoundsOpt = findValidPack(msgList, deduplicationTimeoutMs); packBoundsOpt = findValidPack(msgList, deduplicationTimeoutMs);

16
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/delay/TbMsgDelayNode.java

@ -65,14 +65,14 @@ public class TbMsgDelayNode implements TbNode {
TbMsg pendingMsg = pendingMsgs.remove(UUID.fromString(msg.getData())); TbMsg pendingMsg = pendingMsgs.remove(UUID.fromString(msg.getData()));
if (pendingMsg != null) { if (pendingMsg != null) {
ctx.enqueueForTellNext( ctx.enqueueForTellNext(
TbMsg.newMsg( TbMsg.newMsg()
pendingMsg.getQueueName(), .queueName(pendingMsg.getQueueName())
pendingMsg.getType(), .type(pendingMsg.getType())
pendingMsg.getOriginator(), .originator(pendingMsg.getOriginator())
pendingMsg.getCustomerId(), .customerId(pendingMsg.getCustomerId())
pendingMsg.getMetaData(), .copyMetaData(pendingMsg.getMetaData())
pendingMsg.getData() .data(pendingMsg.getData())
), .build(),
TbNodeConnectionType.SUCCESS TbNodeConnectionType.SUCCESS
); );
} }

8
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNode.java

@ -120,13 +120,17 @@ public class TbPubSubNode extends TbAbstractExternalNode {
private TbMsg processPublishResult(TbMsg origMsg, String messageId) { private TbMsg processPublishResult(TbMsg origMsg, String messageId) {
TbMsgMetaData metaData = origMsg.getMetaData().copy(); TbMsgMetaData metaData = origMsg.getMetaData().copy();
metaData.putValue(MESSAGE_ID, messageId); metaData.putValue(MESSAGE_ID, messageId);
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
private TbMsg processException(TbMsg origMsg, Throwable t) { private TbMsg processException(TbMsg origMsg, Throwable t) {
TbMsgMetaData metaData = origMsg.getMetaData().copy(); TbMsgMetaData metaData = origMsg.getMetaData().copy();
metaData.putValue(ERROR, t.getClass() + ": " + t.getMessage()); metaData.putValue(ERROR, t.getClass() + ": " + t.getMessage());
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
Publisher initPubSubClient(TbContext ctx) throws IOException { Publisher initPubSubClient(TbContext ctx) throws IOException {

8
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/kafka/TbKafkaNode.java

@ -188,13 +188,17 @@ public class TbKafkaNode extends TbAbstractExternalNode {
metaData.putValue(OFFSET, String.valueOf(recordMetadata.offset())); metaData.putValue(OFFSET, String.valueOf(recordMetadata.offset()));
metaData.putValue(PARTITION, String.valueOf(recordMetadata.partition())); metaData.putValue(PARTITION, String.valueOf(recordMetadata.partition()));
metaData.putValue(TOPIC, recordMetadata.topic()); metaData.putValue(TOPIC, recordMetadata.topic());
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
private TbMsg processException(TbMsg origMsg, Exception e) { private TbMsg processException(TbMsg origMsg, Exception e) {
TbMsgMetaData metaData = origMsg.getMetaData().copy(); TbMsgMetaData metaData = origMsg.getMetaData().copy();
metaData.putValue(ERROR, e.getClass() + ": " + e.getMessage()); metaData.putValue(ERROR, e.getClass() + ": " + e.getMessage());
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
} }

8
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/math/TbMathNode.java

@ -220,7 +220,9 @@ public class TbMathNode implements TbNode {
} else { } else {
body.put(mathResultKey, toDoubleValue(mathResultDef, result)); body.put(mathResultKey, toDoubleValue(mathResultDef, result));
} }
return TbMsg.transformMsgData(msg, JacksonUtil.toString(body)); return msg.transform()
.data(JacksonUtil.toString(body))
.build();
} }
private TbMsg addToMeta(TbMsg msg, TbMathResult mathResultDef, String mathResultKey, double result) { private TbMsg addToMeta(TbMsg msg, TbMathResult mathResultDef, String mathResultKey, double result) {
@ -230,7 +232,9 @@ public class TbMathNode implements TbNode {
} else { } else {
md.putValue(mathResultKey, Double.toString(toDoubleValue(mathResultDef, result))); md.putValue(mathResultKey, Double.toString(toDoubleValue(mathResultDef, result)));
} }
return TbMsg.transformMsgMetadata(msg, md); return msg.transform()
.metaData(md)
.build();
} }
private double calculateResult(List<TbMathArgumentValue> args) { private double calculateResult(List<TbMathArgumentValue> args) {

4
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java

@ -175,7 +175,9 @@ public class CalculateDeltaNode implements TbNode {
long period = previousData != null ? msg.getMetaDataTs() - previousData.ts : 0; long period = previousData != null ? msg.getMetaDataTs() - previousData.ts : 0;
json.put(config.getPeriodValueKey(), period); json.put(config.getPeriodValueKey(), period);
} }
return TbMsg.transformMsgData(msg, JacksonUtil.toString(json)); return msg.transform()
.data(JacksonUtil.toString(json))
.build();
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());
} }

8
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractNodeWithFetchTo.java

@ -82,9 +82,13 @@ public abstract class TbAbstractNodeWithFetchTo<C extends TbAbstractFetchToNodeC
protected TbMsg transformMessage(TbMsg msg, ObjectNode msgDataNode, TbMsgMetaData msgMetaData) { protected TbMsg transformMessage(TbMsg msg, ObjectNode msgDataNode, TbMsgMetaData msgMetaData) {
switch (fetchTo) { switch (fetchTo) {
case DATA: case DATA:
return TbMsg.transformMsgData(msg, JacksonUtil.toString(msgDataNode)); return msg.transform()
.data(JacksonUtil.toString(msgDataNode))
.build();
case METADATA: case METADATA:
return TbMsg.transformMsgMetadata(msg, msgMetaData); return msg.transform()
.metaData(msgMetaData)
.build();
default: default:
log.debug("Unexpected FetchTo value: {}. Allowed values: {}", fetchTo, TbMsgSource.values()); log.debug("Unexpected FetchTo value: {}. Allowed values: {}", fetchTo, TbMsgSource.values());
return msg; return msg;

4
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java

@ -115,7 +115,9 @@ public class TbGetTelemetryNode implements TbNode {
ListenableFuture<List<TsKvEntry>> list = ctx.getTimeseriesService().findAll(ctx.getTenantId(), msg.getOriginator(), buildQueries(interval, keys)); ListenableFuture<List<TsKvEntry>> list = ctx.getTimeseriesService().findAll(ctx.getTenantId(), msg.getOriginator(), buildQueries(interval, keys));
DonAsynchron.withCallback(list, data -> { DonAsynchron.withCallback(list, data -> {
var metaData = updateMetadata(data, msg, keys); var metaData = updateMetadata(data, msg, keys);
ctx.tellSuccess(TbMsg.transformMsgMetadata(msg, metaData)); ctx.tellSuccess(msg.transform()
.metaData(metaData)
.build());
}, error -> ctx.tellFailure(msg, error), ctx.getDbCallbackExecutor()); }, error -> ctx.tellFailure(msg, error), ctx.getDbCallbackExecutor());
} }

4
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mqtt/TbMqttNode.java

@ -103,7 +103,9 @@ public class TbMqttNode extends TbAbstractExternalNode {
private TbMsg processException(TbMsg origMsg, Throwable e) { private TbMsg processException(TbMsg origMsg, Throwable e) {
TbMsgMetaData metaData = origMsg.getMetaData().copy(); TbMsgMetaData metaData = origMsg.getMetaData().copy();
metaData.putValue(ERROR, e.getClass() + ": " + e.getMessage()); metaData.putValue(ERROR, e.getClass() + ": " + e.getMessage());
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
@Override @Override

4
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/notification/TbNotificationNode.java

@ -82,7 +82,9 @@ public class TbNotificationNode extends TbAbstractExternalNode {
public void onSuccess(NotificationRequestStats stats) { public void onSuccess(NotificationRequestStats stats) {
TbMsgMetaData metaData = tbMsg.getMetaData().copy(); TbMsgMetaData metaData = tbMsg.getMetaData().copy();
metaData.putValue("notificationRequestResult", JacksonUtil.toString(stats)); metaData.putValue("notificationRequestResult", JacksonUtil.toString(stats));
tellSuccess(ctx, TbMsg.transformMsgMetadata(tbMsg, metaData)); tellSuccess(ctx, tbMsg.transform()
.metaData(metaData)
.build());
} }
@Override @Override

24
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java

@ -29,6 +29,7 @@ import org.thingsboard.rule.engine.api.util.TbNodeUtils;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.data.msg.TbMsgType;
@ -176,7 +177,14 @@ public class TbDeviceProfileNode implements TbNode {
} }
protected void scheduleAlarmHarvesting(TbContext ctx, TbMsg msg) { protected void scheduleAlarmHarvesting(TbContext ctx, TbMsg msg) {
TbMsg periodicCheck = TbMsg.newMsg(TbMsgType.DEVICE_PROFILE_PERIODIC_SELF_MSG, ctx.getTenantId(), msg != null ? msg.getCustomerId() : null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); CustomerId customerId = msg != null ? msg.getCustomerId() : null;
TbMsg periodicCheck = TbMsg.newMsg()
.type(TbMsgType.DEVICE_PROFILE_PERIODIC_SELF_MSG)
.originator(ctx.getTenantId())
.customerId(customerId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
ctx.tellSelf(periodicCheck, TimeUnit.MINUTES.toMillis(1)); ctx.tellSelf(periodicCheck, TimeUnit.MINUTES.toMillis(1));
} }
@ -201,7 +209,12 @@ public class TbDeviceProfileNode implements TbNode {
} }
protected void onProfileUpdate(DeviceProfile profile) { protected void onProfileUpdate(DeviceProfile profile) {
ctx.tellSelf(TbMsg.newMsg(TbMsgType.DEVICE_PROFILE_UPDATE_SELF_MSG, ctx.getTenantId(), TbMsgMetaData.EMPTY, profile.getId().getId().toString()), 0L); ctx.tellSelf(TbMsg.newMsg()
.type(TbMsgType.DEVICE_PROFILE_UPDATE_SELF_MSG)
.originator(ctx.getTenantId())
.copyMetaData(TbMsgMetaData.EMPTY)
.data(profile.getId().getId().toString())
.build(), 0L);
} }
private void onDeviceUpdate(DeviceId deviceId, DeviceProfile deviceProfile) { private void onDeviceUpdate(DeviceId deviceId, DeviceProfile deviceProfile) {
@ -210,7 +223,12 @@ public class TbDeviceProfileNode implements TbNode {
if (deviceProfile != null) { if (deviceProfile != null) {
msgData.put("deviceProfileId", deviceProfile.getId().getId().toString()); msgData.put("deviceProfileId", deviceProfile.getId().getId().toString());
} }
ctx.tellSelf(TbMsg.newMsg(TbMsgType.DEVICE_UPDATE_SELF_MSG, ctx.getTenantId(), TbMsgMetaData.EMPTY, JacksonUtil.toString(msgData)), 0L); ctx.tellSelf(TbMsg.newMsg()
.type(TbMsgType.DEVICE_UPDATE_SELF_MSG)
.originator(ctx.getTenantId())
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.toString(msgData))
.build(), 0L);
} }
protected void invalidateDeviceProfileCache(DeviceId deviceId, String deviceJson) { protected void invalidateDeviceProfileCache(DeviceId deviceId, String deviceJson) {

4
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rabbitmq/TbRabbitMqNode.java

@ -127,7 +127,9 @@ public class TbRabbitMqNode extends TbAbstractExternalNode {
private TbMsg processException(TbMsg origMsg, Throwable t) { private TbMsg processException(TbMsg origMsg, Throwable t) {
TbMsgMetaData metaData = origMsg.getMetaData().copy(); TbMsgMetaData metaData = origMsg.getMetaData().copy();
metaData.putValue(ERROR, t.getClass() + ": " + t.getMessage()); metaData.putValue(ERROR, t.getClass() + ": " + t.getMessage());
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
@Override @Override

8
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rest/TbHttpClient.java

@ -323,7 +323,9 @@ public class TbHttpClient {
metaData.putValue(STATUS_REASON, httpStatus.getReasonPhrase()); metaData.putValue(STATUS_REASON, httpStatus.getReasonPhrase());
metaData.putValue(ERROR_BODY, response.getBody()); metaData.putValue(ERROR_BODY, response.getBody());
headersToMetaData(response.getHeaders(), metaData::putValue); headersToMetaData(response.getHeaders(), metaData::putValue);
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
private TbMsg processException(TbMsg origMsg, Throwable e) { private TbMsg processException(TbMsg origMsg, Throwable e) {
@ -334,7 +336,9 @@ public class TbHttpClient {
metaData.putValue(STATUS_CODE, restClientResponseException.getStatusCode().value() + ""); metaData.putValue(STATUS_CODE, restClientResponseException.getStatusCode().value() + "");
metaData.putValue(ERROR_BODY, restClientResponseException.getResponseBodyAsString()); metaData.putValue(ERROR_BODY, restClientResponseException.getResponseBodyAsString());
} }
return TbMsg.transformMsgMetadata(origMsg, metaData); return origMsg.transform()
.metaData(metaData)
.build();
} }
private void prepareHeaders(HttpHeaders headers, TbMsg msg) { private void prepareHeaders(HttpHeaders headers, TbMsg msg) {

5
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbCopyKeysNode.java

@ -105,7 +105,10 @@ public class TbCopyKeysNode extends TbAbstractTransformNodeWithTbMsgSource {
log.debug("Unexpected CopyFrom value: {}. Allowed values: {}", copyFrom, TbMsgSource.values()); log.debug("Unexpected CopyFrom value: {}. Allowed values: {}", copyFrom, TbMsgSource.values());
} }
} }
ctx.tellSuccess(msgChanged ? TbMsg.transformMsg(msg, metaDataCopy, msgData) : msg); ctx.tellSuccess(msgChanged ? msg.transform()
.metaData(metaDataCopy)
.data(msgData)
.build() : msg);
} }
@Override @Override

5
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java

@ -100,7 +100,10 @@ public class TbDeleteKeysNode extends TbAbstractTransformNodeWithTbMsgSource {
default: default:
log.debug("Unexpected DeleteFrom value: {}. Allowed values: {}", deleteFrom, TbMsgSource.values()); log.debug("Unexpected DeleteFrom value: {}. Allowed values: {}", deleteFrom, TbMsgSource.values());
} }
ctx.tellSuccess(hasNoChanges ? msg : TbMsg.transformMsg(msg, metaDataCopy, msgDataStr)); ctx.tellSuccess(hasNoChanges ? msg : msg.transform()
.metaData(metaDataCopy)
.data(msgDataStr)
.build());
} }
@Override @Override

4
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbJsonPathNode.java

@ -68,7 +68,9 @@ public class TbJsonPathNode implements TbNode {
if (!TbJsonPathNodeConfiguration.DEFAULT_JSON_PATH.equals(this.jsonPathValue)) { if (!TbJsonPathNodeConfiguration.DEFAULT_JSON_PATH.equals(this.jsonPathValue)) {
try { try {
Object jsonPathData = jsonPath.read(msg.getData(), this.configurationJsonPath); Object jsonPathData = jsonPath.read(msg.getData(), this.configurationJsonPath);
ctx.tellSuccess(TbMsg.transformMsgData(msg, JacksonUtil.toString(jsonPathData))); ctx.tellSuccess(msg.transform()
.data(JacksonUtil.toString(jsonPathData))
.build());
} catch (PathNotFoundException e) { } catch (PathNotFoundException e) {
ctx.tellFailure(msg, e); ctx.tellFailure(msg, e);
} }

5
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java

@ -106,7 +106,10 @@ public class TbRenameKeysNode extends TbAbstractTransformNodeWithTbMsgSource {
default: default:
log.debug("Unexpected RenameIn value: {}. Allowed values: {}", renameIn, TbMsgSource.values()); log.debug("Unexpected RenameIn value: {}. Allowed values: {}", renameIn, TbMsgSource.values());
} }
ctx.tellSuccess(msgChanged ? TbMsg.transformMsg(msg, metaDataCopy, data) : msg); ctx.tellSuccess(msgChanged ? msg.transform()
.metaData(metaDataCopy)
.data(data)
.build() : msg);
} }
@Override @Override

8
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbSplitArrayMsgNode.java

@ -64,7 +64,9 @@ public class TbSplitArrayMsgNode implements TbNode {
if (data.isEmpty()) { if (data.isEmpty()) {
ctx.ack(msg); ctx.ack(msg);
} else if (data.size() == 1) { } else if (data.size() == 1) {
ctx.tellSuccess(TbMsg.transformMsgData(msg, JacksonUtil.toString(data.get(0)))); ctx.tellSuccess(msg.transform()
.data(JacksonUtil.toString(data.get(0)))
.build());
} else { } else {
TbMsgCallbackWrapper wrapper = new MultipleTbMsgsCallbackWrapper(data.size(), new TbMsgCallback() { TbMsgCallbackWrapper wrapper = new MultipleTbMsgsCallbackWrapper(data.size(), new TbMsgCallback() {
@Override @Override
@ -78,7 +80,9 @@ public class TbSplitArrayMsgNode implements TbNode {
} }
}); });
data.forEach(msgNode -> { data.forEach(msgNode -> {
TbMsg outMsg = TbMsg.transformMsgData(msg, JacksonUtil.toString(msgNode)); TbMsg outMsg = msg.transform()
.data(JacksonUtil.toString(msgNode))
.build();
ctx.enqueueForTellNext(outMsg, TbNodeConnectionType.SUCCESS, wrapper::onSuccess, wrapper::onFailure); ctx.enqueueForTellNext(outMsg, TbNodeConnectionType.SUCCESS, wrapper::onSuccess, wrapper::onFailure);
}); });
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAssignToCustomerNodeTest.java

@ -306,7 +306,12 @@ class TbAssignToCustomerNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getTbMsg(EntityId originator) { private TbMsg getTbMsg(EntityId originator) {
return TbMsg.newMsg(TbMsgType.NA, originator, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.newMsg()
.type(TbMsgType.NA)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
private EntityId toOriginator(EntityType type) { private EntityId toOriginator(EntityType type) {

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbClearAlarmNodeTest.java

@ -91,7 +91,12 @@ class TbClearAlarmNodeTest {
void alarmCanBeCleared() { void alarmCanBeCleared() {
initWithClearAlarmScript(); initWithClearAlarmScript();
metadata.putValue("key", "value"); metadata.putValue("key", "value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50}"); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.copyMetaData(metadata)
.data("{\"temperature\": 50}")
.build();
long oldEndDate = System.currentTimeMillis(); long oldEndDate = System.currentTimeMillis();
Alarm activeAlarm = Alarm.builder().type("SomeType").tenantId(tenantId).originator(msgOriginator).severity(AlarmSeverity.WARNING).endTs(oldEndDate).build(); Alarm activeAlarm = Alarm.builder().type("SomeType").tenantId(tenantId).originator(msgOriginator).severity(AlarmSeverity.WARNING).endTs(oldEndDate).build();
@ -143,7 +148,12 @@ class TbClearAlarmNodeTest {
void alarmCanBeClearedWithAlarmOriginator() { void alarmCanBeClearedWithAlarmOriginator() {
initWithClearAlarmScript(); initWithClearAlarmScript();
metadata.putValue("key", "value"); metadata.putValue("key", "value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, alarmOriginator, metadata, "{\"temperature\": 50}"); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(alarmOriginator)
.copyMetaData(metadata)
.data("{\"temperature\": 50}")
.build();
long oldEndDate = System.currentTimeMillis(); long oldEndDate = System.currentTimeMillis();
AlarmId id = new AlarmId(alarmOriginator.getId()); AlarmId id = new AlarmId(alarmOriginator.getId());

52
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNodeTest.java

@ -106,9 +106,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenExistingClientAttributes_whenOnMsg_thenCopyAttributesToView() { public void givenExistingClientAttributes_whenOnMsg_thenCopyAttributesToView() {
EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW); EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, TbMsg msg = TbMsg.newMsg()
new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())), .type(TbMsgType.POST_ATTRIBUTES_REQUEST)
"{\"clientAttribute1\": 100, \"clientAttribute2\": \"value2\"}"); .originator(DEVICE_ID)
.copyMetaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())))
.data("{\"clientAttribute1\": 100, \"clientAttribute2\": \"value2\"}")
.build();
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock); when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
@ -142,9 +145,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenExistingServerAttributesAndMsgTypeAttributesDeleted_whenOnMsg_thenDeleteAttributesFromView() { public void givenExistingServerAttributesAndMsgTypeAttributesDeleted_whenOnMsg_thenDeleteAttributesFromView() {
EntityView entityView = getEntityView(SERVER_TELEMETRY_ENTITY_VIEW); EntityView entityView = getEntityView(SERVER_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg( TbMsg msg = TbMsg.newMsg()
ATTRIBUTES_DELETED, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())), .type(ATTRIBUTES_DELETED)
"{\"attributes\": [\"serverAttribute1\"]}"); .originator(DEVICE_ID)
.copyMetaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())))
.data("{\"attributes\": [\"serverAttribute1\"]}")
.build();
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock); when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
@ -175,9 +181,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenNonMatchedSharedAttributesAndMsgTypeIsAttributesDeleted_whenOnMsg_thenNoAttributesDeleteFromView() { public void givenNonMatchedSharedAttributesAndMsgTypeIsAttributesDeleted_whenOnMsg_thenNoAttributesDeleteFromView() {
EntityView entityView = getEntityView(SHARED_TELEMETRY_ENTITY_VIEW); EntityView entityView = getEntityView(SHARED_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg( TbMsg msg = TbMsg.newMsg()
TbMsgType.ATTRIBUTES_DELETED, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SHARED_SCOPE.name())), .type(TbMsgType.ATTRIBUTES_DELETED)
"{\"attributes\": [\"anotherAttribute\"]}"); .originator(DEVICE_ID)
.copyMetaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SHARED_SCOPE.name())))
.data("{\"attributes\": [\"anotherAttribute\"]}")
.build();
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
@ -192,9 +201,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenNonMatchedAttributesAndMsgTypeIsPostAttributesRequest_whenOnMsg_thenCopyNoAttributesToView() { public void givenNonMatchedAttributesAndMsgTypeIsPostAttributesRequest_whenOnMsg_thenCopyNoAttributesToView() {
EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW); EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg( TbMsg msg = TbMsg.newMsg()
TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())), .type(TbMsgType.POST_ATTRIBUTES_REQUEST)
"{\"clientAttribute2\": \"value2\"}"); .originator(DEVICE_ID)
.copyMetaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())))
.data("{\"clientAttribute2\": \"value2\"}")
.build();
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock); when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
@ -229,9 +241,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
); );
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
TbMsg msg = TbMsg.newMsg( TbMsg msg = TbMsg.newMsg()
ATTRIBUTES_DELETED, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())), .type(ATTRIBUTES_DELETED)
"{\"attributes\": [\"serverAttribute1\"]}"); .originator(DEVICE_ID)
.copyMetaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())))
.data("{\"attributes\": [\"serverAttribute1\"]}")
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
verify(entityViewServiceMock).findEntityViewsByTenantIdAndEntityIdAsync(eq(TENANT_ID), eq(DEVICE_ID)); verify(entityViewServiceMock).findEntityViewsByTenantIdAndEntityIdAsync(eq(TENANT_ID), eq(DEVICE_ID));
@ -242,7 +257,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
@ParameterizedTest @ParameterizedTest
@EnumSource(TbMsgType.class) @EnumSource(TbMsgType.class)
public void givenMsgTypeAndEmptyMetadata_whenOnMsg_thenVerifyFailureMsg(TbMsgType msgType) { public void givenMsgTypeAndEmptyMetadata_whenOnMsg_thenVerifyFailureMsg(TbMsgType msgType) {
TbMsg msg = TbMsg.newMsg(msgType, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(msgType)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

121
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateAlarmNodeTest.java

@ -163,7 +163,12 @@ class TbCreateAlarmNodeTest {
var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased()); var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased());
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50}"); var incomingMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.copyMetaData(metadata)
.data("{\"temperature\": 50}")
.build();
Alarm existingAlarm = null; Alarm existingAlarm = null;
@ -224,12 +229,12 @@ class TbCreateAlarmNodeTest {
given(alarmServiceMock.createAlarm(expectedCreateAlarmRequest)).willReturn(apiCallResult); given(alarmServiceMock.createAlarm(expectedCreateAlarmRequest)).willReturn(apiCallResult);
given(ctxMock.alarmActionMsg(expectedCreatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_CREATED)).willReturn(alarmActionMsgMock); given(ctxMock.alarmActionMsg(expectedCreatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_CREATED)).willReturn(alarmActionMsgMock);
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString()))
.willAnswer(answer -> TbMsg.transformMsg( .willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform()
answer.getArgument(0, TbMsg.class), .type(answer.getArgument(1, TbMsgType.class))
answer.getArgument(1, TbMsgType.class), .originator(answer.getArgument(2, EntityId.class))
answer.getArgument(2, EntityId.class), .metaData(answer.getArgument(3, TbMsgMetaData.class))
answer.getArgument(3, TbMsgMetaData.class), .data(answer.getArgument(4, String.class))
answer.getArgument(4, String.class)) .build()
); );
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, TbAbstractAlarmNodeConfiguration.ALARM_DETAILS_BUILD_TBEL_TEMPLATE)).willReturn(alarmDetailsScriptMock); given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, TbAbstractAlarmNodeConfiguration.ALARM_DETAILS_BUILD_TBEL_TEMPLATE)).willReturn(alarmDetailsScriptMock);
@ -317,7 +322,12 @@ class TbCreateAlarmNodeTest {
var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased()); var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased());
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50, \"alarmType\": \"" + alarmType + "\"}"); var incomingMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.copyMetaData(metadata)
.data("{\"temperature\": 50, \"alarmType\": \"" + alarmType + "\"}")
.build();
var existingClearedAlarm = Alarm.builder() var existingClearedAlarm = Alarm.builder()
.tenantId(tenantId) .tenantId(tenantId)
@ -393,12 +403,12 @@ class TbCreateAlarmNodeTest {
given(alarmServiceMock.createAlarm(expectedCreateAlarmRequest)).willReturn(apiCallResult); given(alarmServiceMock.createAlarm(expectedCreateAlarmRequest)).willReturn(apiCallResult);
given(ctxMock.alarmActionMsg(expectedCreatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_CREATED)).willReturn(alarmActionMsgMock); given(ctxMock.alarmActionMsg(expectedCreatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_CREATED)).willReturn(alarmActionMsgMock);
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString()))
.willAnswer(answer -> TbMsg.transformMsg( .willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform()
answer.getArgument(0, TbMsg.class), .type(answer.getArgument(1, TbMsgType.class))
answer.getArgument(1, TbMsgType.class), .originator(answer.getArgument(2, EntityId.class))
answer.getArgument(2, EntityId.class), .metaData(answer.getArgument(3, TbMsgMetaData.class))
answer.getArgument(3, TbMsgMetaData.class), .data(answer.getArgument(4, String.class))
answer.getArgument(4, String.class)) .build()
); );
given(ctxMock.createScriptEngine(ScriptLanguage.JS, config.getAlarmDetailsBuildJs())).willReturn(alarmDetailsScriptMock); given(ctxMock.createScriptEngine(ScriptLanguage.JS, config.getAlarmDetailsBuildJs())).willReturn(alarmDetailsScriptMock);
@ -508,7 +518,12 @@ class TbCreateAlarmNodeTest {
var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased()); var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased());
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50, \"alarmSeverity\": \"" + newAlarmSeverity.name() + "\"}"); var incomingMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.copyMetaData(metadata)
.data("{\"temperature\": 50, \"alarmSeverity\": \"" + newAlarmSeverity.name() + "\"}")
.build();
var existingAlarmId = new AlarmId(Uuids.timeBased()); var existingAlarmId = new AlarmId(Uuids.timeBased());
var existingActiveAlarm = Alarm.builder() var existingActiveAlarm = Alarm.builder()
@ -583,12 +598,12 @@ class TbCreateAlarmNodeTest {
given(alarmServiceMock.updateAlarm(expectedUpdateAlarmRequest)).willReturn(apiCallResult); given(alarmServiceMock.updateAlarm(expectedUpdateAlarmRequest)).willReturn(apiCallResult);
given(ctxMock.alarmActionMsg(expectedUpdatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_UPDATED)).willReturn(alarmActionMsgMock); given(ctxMock.alarmActionMsg(expectedUpdatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_UPDATED)).willReturn(alarmActionMsgMock);
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString()))
.willAnswer(answer -> TbMsg.transformMsg( .willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform()
answer.getArgument(0, TbMsg.class), .type(answer.getArgument(1, TbMsgType.class))
answer.getArgument(1, TbMsgType.class), .originator(answer.getArgument(2, EntityId.class))
answer.getArgument(2, EntityId.class), .metaData(answer.getArgument(3, TbMsgMetaData.class))
answer.getArgument(3, TbMsgMetaData.class), .data(answer.getArgument(4, String.class))
answer.getArgument(4, String.class)) .build()
); );
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock); given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock);
@ -680,7 +695,12 @@ class TbCreateAlarmNodeTest {
var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased()); var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased());
var incomingMsg = TbMsg.newMsg(TbMsgType.ALARM, msgOriginator, metadata, JacksonUtil.toString(alarmFromIncomingMessage)); var incomingMsg = TbMsg.newMsg()
.type(TbMsgType.ALARM)
.originator(msgOriginator)
.copyMetaData(metadata)
.data(JacksonUtil.toString(alarmFromIncomingMessage))
.build();
var existingClearedAlarm = Alarm.builder() var existingClearedAlarm = Alarm.builder()
.tenantId(tenantId) .tenantId(tenantId)
@ -755,12 +775,12 @@ class TbCreateAlarmNodeTest {
given(alarmServiceMock.createAlarm(expectedCreateAlarmRequest)).willReturn(apiCallResult); given(alarmServiceMock.createAlarm(expectedCreateAlarmRequest)).willReturn(apiCallResult);
given(ctxMock.alarmActionMsg(expectedCreatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_CREATED)).willReturn(alarmActionMsgMock); given(ctxMock.alarmActionMsg(expectedCreatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_CREATED)).willReturn(alarmActionMsgMock);
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString()))
.willAnswer(answer -> TbMsg.transformMsg( .willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform()
answer.getArgument(0, TbMsg.class), .type(answer.getArgument(1, TbMsgType.class))
answer.getArgument(1, TbMsgType.class), .originator(answer.getArgument(2, EntityId.class))
answer.getArgument(2, EntityId.class), .metaData(answer.getArgument(3, TbMsgMetaData.class))
answer.getArgument(3, TbMsgMetaData.class), .data(answer.getArgument(4, String.class))
answer.getArgument(4, String.class)) .build()
); );
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock); given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock);
@ -867,7 +887,12 @@ class TbCreateAlarmNodeTest {
.details(newAlarmDetails) .details(newAlarmDetails)
.build(); .build();
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, JacksonUtil.toString(alarmFromIncomingMessage)); var incomingMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.copyMetaData(metadata)
.data(JacksonUtil.toString(alarmFromIncomingMessage))
.build();
var existingAlarmId = new AlarmId(Uuids.timeBased()); var existingAlarmId = new AlarmId(Uuids.timeBased());
var existingActiveAlarm = Alarm.builder() var existingActiveAlarm = Alarm.builder()
@ -942,12 +967,12 @@ class TbCreateAlarmNodeTest {
given(alarmServiceMock.updateAlarm(expectedUpdateAlarmRequest)).willReturn(apiCallResult); given(alarmServiceMock.updateAlarm(expectedUpdateAlarmRequest)).willReturn(apiCallResult);
given(ctxMock.alarmActionMsg(expectedUpdatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_UPDATED)).willReturn(alarmActionMsgMock); given(ctxMock.alarmActionMsg(expectedUpdatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_UPDATED)).willReturn(alarmActionMsgMock);
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString()))
.willAnswer(answer -> TbMsg.transformMsg( .willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform()
answer.getArgument(0, TbMsg.class), .type(answer.getArgument(1, TbMsgType.class))
answer.getArgument(1, TbMsgType.class), .originator(answer.getArgument(2, EntityId.class))
answer.getArgument(2, EntityId.class), .metaData(answer.getArgument(3, TbMsgMetaData.class))
answer.getArgument(3, TbMsgMetaData.class), .data(answer.getArgument(4, String.class))
answer.getArgument(4, String.class)) .build()
); );
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock); given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock);
@ -1048,7 +1073,12 @@ class TbCreateAlarmNodeTest {
.details(alarmDetails) .details(alarmDetails)
.build(); .build();
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, JacksonUtil.toString(alarmFromIncomingMessage)); var incomingMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.copyMetaData(metadata)
.data(JacksonUtil.toString(alarmFromIncomingMessage))
.build();
var existingAlarmId = new AlarmId(Uuids.timeBased()); var existingAlarmId = new AlarmId(Uuids.timeBased());
var existingActiveAlarm = Alarm.builder() var existingActiveAlarm = Alarm.builder()
@ -1123,12 +1153,12 @@ class TbCreateAlarmNodeTest {
given(alarmServiceMock.updateAlarm(expectedUpdateAlarmRequest)).willReturn(apiCallResult); given(alarmServiceMock.updateAlarm(expectedUpdateAlarmRequest)).willReturn(apiCallResult);
given(ctxMock.alarmActionMsg(expectedUpdatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_UPDATED)).willReturn(alarmActionMsgMock); given(ctxMock.alarmActionMsg(expectedUpdatedAlarmInfo, ruleNodeSelfId, TbMsgType.ENTITY_UPDATED)).willReturn(alarmActionMsgMock);
given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString())) given(ctxMock.transformMsg(any(TbMsg.class), any(TbMsgType.class), any(EntityId.class), any(TbMsgMetaData.class), anyString()))
.willAnswer(answer -> TbMsg.transformMsg( .willAnswer(answer -> answer.getArgument(0, TbMsg.class).transform()
answer.getArgument(0, TbMsg.class), .type(answer.getArgument(1, TbMsgType.class))
answer.getArgument(1, TbMsgType.class), .originator(answer.getArgument(2, EntityId.class))
answer.getArgument(2, EntityId.class), .metaData(answer.getArgument(3, TbMsgMetaData.class))
answer.getArgument(3, TbMsgMetaData.class), .data(answer.getArgument(4, String.class))
answer.getArgument(4, String.class)) .build()
); );
given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock); given(ctxMock.createScriptEngine(ScriptLanguage.TBEL, config.getAlarmDetailsBuildTbel())).willReturn(alarmDetailsScriptMock);
@ -1189,7 +1219,12 @@ class TbCreateAlarmNodeTest {
// GIVEN // GIVEN
config = config.defaultConfiguration(); config = config.defaultConfiguration();
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50}"); var incomingMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.copyMetaData(metadata)
.data("{\"temperature\": 50}")
.build();
given(ctxMock.getTenantId()).willReturn(tenantId); given(ctxMock.getTenantId()).willReturn(tenantId);
given(ctxMock.getAlarmService()).willReturn(alarmServiceMock); given(ctxMock.getAlarmService()).willReturn(alarmServiceMock);

18
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeTest.java

@ -439,7 +439,9 @@ public class TbCreateRelationNodeTest extends AbstractRuleNodeUpgradeTest {
var md = getMetadataWithNameTemplate(); var md = getMetadataWithNameTemplate();
var msg = getTbMsg(originatorId, md); var msg = getTbMsg(originatorId, md);
var msgAfterOriginatorChanged = TbMsg.transformMsgOriginator(msg, originatorId); var msgAfterOriginatorChanged = msg.transform()
.originator(originatorId)
.build();
when(ctxMock.transformMsgOriginator(any(), any())).thenReturn(msgAfterOriginatorChanged); when(ctxMock.transformMsgOriginator(any(), any())).thenReturn(msgAfterOriginatorChanged);
// WHEN // WHEN
@ -486,7 +488,12 @@ public class TbCreateRelationNodeTest extends AbstractRuleNodeUpgradeTest {
when(ctxMock.getRelationService()).thenReturn(relationServiceMock); when(ctxMock.getRelationService()).thenReturn(relationServiceMock);
var mockMethodCallsMap = mockEntityServiceCallsCreateEntityIfNotExistsEnabled(); var mockMethodCallsMap = mockEntityServiceCallsCreateEntityIfNotExistsEnabled();
var entityCreatedMsg = TbMsg.newMsg(TbMsgType.ENTITY_CREATED, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); var entityCreatedMsg = TbMsg.newMsg()
.type(TbMsgType.ENTITY_CREATED)
.originator(entityId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
mockMethodCallsMap.get(entityType).accept(entity, entityCreatedMsg); mockMethodCallsMap.get(entityType).accept(entity, entityCreatedMsg);
when(relationServiceMock.checkRelationAsync(any(), any(), any(), any(), any())).thenReturn(Futures.immediateFuture(false)); when(relationServiceMock.checkRelationAsync(any(), any(), any(), any(), any())).thenReturn(Futures.immediateFuture(false));
@ -676,7 +683,12 @@ public class TbCreateRelationNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getTbMsg(EntityId originator, TbMsgMetaData metaData) { private TbMsg getTbMsg(EntityId originator, TbMsgMetaData metaData) {
return TbMsg.newMsg(TbMsgType.NA, originator, metaData, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.newMsg()
.type(TbMsgType.NA)
.originator(originator)
.copyMetaData(metaData)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
private TbMsgMetaData getMetadataWithNameTemplate() { private TbMsgMetaData getMetadataWithNameTemplate() {

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbDeleteRelationNodeTest.java

@ -560,7 +560,12 @@ public class TbDeleteRelationNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getTbMsg(EntityId originator, TbMsgMetaData metaData) { private TbMsg getTbMsg(EntityId originator, TbMsgMetaData metaData) {
return TbMsg.newMsg(TbMsgType.NA, originator, metaData, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.newMsg()
.type(TbMsgType.NA)
.originator(originator)
.copyMetaData(metaData)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
private TbMsgMetaData getMetadataWithNameTemplate() { private TbMsgMetaData getMetadataWithNameTemplate() {

22
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbDeviceStateNodeTest.java

@ -85,7 +85,12 @@ public class TbDeviceStateNodeTest {
metaData.putValue("ts", String.valueOf(METADATA_TS)); metaData.putValue("ts", String.valueOf(METADATA_TS));
var data = JacksonUtil.newObjectNode(); var data = JacksonUtil.newObjectNode();
data.put("humidity", 58.3); data.put("humidity", 58.3);
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, JacksonUtil.toString(data)); msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metaData)
.data(JacksonUtil.toString(data))
.build();
} }
@BeforeEach @BeforeEach
@ -207,7 +212,12 @@ public class TbDeviceStateNodeTest {
return unsupportedType; return unsupportedType;
} }
}; };
var msg = TbMsg.newMsg(TbMsgType.ENTITY_CREATED, nonDeviceOriginator, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); var msg = TbMsg.newMsg()
.type(TbMsgType.ENTITY_CREATED)
.originator(nonDeviceOriginator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -236,7 +246,13 @@ public class TbDeviceStateNodeTest {
given(ctxMock.getDeviceStateManager()).willReturn(deviceStateManagerMock); given(ctxMock.getDeviceStateManager()).willReturn(deviceStateManagerMock);
long msgTs = METADATA_TS + 1; long msgTs = METADATA_TS + 1;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, msgTs); msg = TbMsg.newMsg()
.ts(msgTs)
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

21
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbLogNodeTest.java

@ -50,7 +50,12 @@ public class TbLogNodeTest {
TbLogNode node = new TbLogNode(); TbLogNode node = new TbLogNode();
String data = "{\"key\": \"value\"}"; String data = "{\"key\": \"value\"}";
TbMsgMetaData metaData = new TbMsgMetaData(Map.of("mdKey1", "mdValue1", "mdKey2", "23")); TbMsgMetaData metaData = new TbMsgMetaData(Map.of("mdKey1", "mdValue1", "mdKey2", "23"));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, metaData, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.copyMetaData(metaData)
.data(data)
.build();
String logMessage = node.toLogMessage(msg); String logMessage = node.toLogMessage(msg);
log.info(logMessage); log.info(logMessage);
@ -66,7 +71,12 @@ public class TbLogNodeTest {
void givenEmptyDataMsg_whenToLog_thenReturnString() { void givenEmptyDataMsg_whenToLog_thenReturnString() {
TbLogNode node = new TbLogNode(); TbLogNode node = new TbLogNode();
TbMsgMetaData metaData = new TbMsgMetaData(Collections.emptyMap()); TbMsgMetaData metaData = new TbMsgMetaData(Collections.emptyMap());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, metaData, ""); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.copyMetaData(metaData)
.data("")
.build();
String logMessage = node.toLogMessage(msg); String logMessage = node.toLogMessage(msg);
log.info(logMessage); log.info(logMessage);
@ -82,7 +92,12 @@ public class TbLogNodeTest {
void givenNullDataMsg_whenToLog_thenReturnString() { void givenNullDataMsg_whenToLog_thenReturnString() {
TbLogNode node = new TbLogNode(); TbLogNode node = new TbLogNode();
TbMsgMetaData metaData = new TbMsgMetaData(Collections.emptyMap()); TbMsgMetaData metaData = new TbMsgMetaData(Collections.emptyMap());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, metaData, null); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.copyMetaData(metaData)
.data(null)
.build();
String logMessage = node.toLogMessage(msg); String logMessage = node.toLogMessage(msg);
log.info(logMessage); log.info(logMessage);

21
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbMsgCountNodeTest.java

@ -63,7 +63,12 @@ public class TbMsgCountNodeTest {
private final DeviceId DEVICE_ID = new DeviceId(UUID.fromString("1b21c7cc-0c9e-4ab1-b867-99451599e146")); private final DeviceId DEVICE_ID = new DeviceId(UUID.fromString("1b21c7cc-0c9e-4ab1-b867-99451599e146"));
private final TenantId TENANT_ID = TenantId.fromUUID(UUID.fromString("04dfbd38-10e5-47b7-925f-11e795db89e1")); private final TenantId TENANT_ID = TenantId.fromUUID(UUID.fromString("04dfbd38-10e5-47b7-925f-11e795db89e1"));
private final TbMsg tickMsg = TbMsg.newMsg(TbMsgType.MSG_COUNT_SELF_MSG, RULE_NODE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); private final TbMsg tickMsg = TbMsg.newMsg()
.type(TbMsgType.MSG_COUNT_SELF_MSG)
.originator(RULE_NODE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_STRING)
.build();
private ScheduledExecutorService executorService; private ScheduledExecutorService executorService;
private TbMsgCountNode node; private TbMsgCountNode node;
@ -120,7 +125,12 @@ public class TbMsgCountNodeTest {
var expectedProcessedMsgs = new ArrayList<TbMsg>(); var expectedProcessedMsgs = new ArrayList<TbMsg>();
for (int i = 0; i < msgCount; i++) { for (int i = 0; i < msgCount; i++) {
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_STRING)
.build();
if (msgWithCounterSent.get()) { if (msgWithCounterSent.get()) {
break; break;
} }
@ -142,7 +152,12 @@ public class TbMsgCountNodeTest {
then(ctxMock).should().enqueueForTellNext(msgWithCounterCaptor.capture(), eq(TbNodeConnectionType.SUCCESS)); then(ctxMock).should().enqueueForTellNext(msgWithCounterCaptor.capture(), eq(TbNodeConnectionType.SUCCESS));
TbMsg resultedMsg = msgWithCounterCaptor.getValue(); TbMsg resultedMsg = msgWithCounterCaptor.getValue();
String expectedData = "{\"messageCount_tb-rule-engine\":" + currentMsgNumber + "}"; String expectedData = "{\"messageCount_tb-rule-engine\":" + currentMsgNumber + "}";
TbMsg expectedMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TENANT_ID, TbMsgMetaData.EMPTY, expectedData); TbMsg expectedMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TENANT_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(expectedData)
.build();
assertThat(resultedMsg).usingRecursiveComparison() assertThat(resultedMsg).usingRecursiveComparison()
.ignoringFields("id", "ts", "ctx", "metaData") .ignoringFields("id", "ts", "ctx", "metaData")
.isEqualTo(expectedMsg); .isEqualTo(expectedMsg);

35
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbSaveToCustomCassandraTableNodeTest.java

@ -185,7 +185,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_STRING)
.build();
assertThatThrownBy(() -> node.onMsg(ctxMock, msg)) assertThatThrownBy(() -> node.onMsg(ctxMock, msg))
.isInstanceOf(IllegalStateException.class) .isInstanceOf(IllegalStateException.class)
.hasMessage("Invalid message structure, it is not a JSON Object: " + null); .hasMessage("Invalid message structure, it is not a JSON Object: " + null);
@ -206,7 +211,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
"humidity": 77 "humidity": 77
} }
"""; """;
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(data)
.build();
assertThatThrownBy(() -> node.onMsg(ctxMock, msg)) assertThatThrownBy(() -> node.onMsg(ctxMock, msg))
.isInstanceOf(RuntimeException.class) .isInstanceOf(RuntimeException.class)
.hasMessage("Message data doesn't contain key: 'temp'!"); .hasMessage("Message data doesn't contain key: 'temp'!");
@ -227,7 +237,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
"temp": [value] "temp": [value]
} }
"""; """;
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(data)
.build();
assertThatThrownBy(() -> node.onMsg(ctxMock, msg)) assertThatThrownBy(() -> node.onMsg(ctxMock, msg))
.isInstanceOf(RuntimeException.class) .isInstanceOf(RuntimeException.class)
.hasMessage("Message data key: 'temp' with value: '[\"value\"]' is not a JSON Object or JSON Primitive!"); .hasMessage("Message data key: 'temp' with value: '[\"value\"]' is not a JSON Object or JSON Primitive!");
@ -249,7 +264,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
mockSubmittingCassandraTask(); mockSubmittingCassandraTask();
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(sessionMock).should().prepare(expectedQuery); then(sessionMock).should().prepare(expectedQuery);
@ -299,7 +319,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
} }
} }
"""; """;
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
verifySettingStatementBuilder(); verifySettingStatementBuilder();

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbUnassignFromCustomerNodeTest.java

@ -294,7 +294,12 @@ class TbUnassignFromCustomerNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getTbMsg(EntityId originator) { private TbMsg getTbMsg(EntityId originator) {
return TbMsg.newMsg(TbMsgType.NA, originator, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.newMsg()
.type(TbMsgType.NA)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
private static EntityId toOriginator(EntityType type) { private static EntityId toOriginator(EntityType type) {

53
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNodeTest.java

@ -145,7 +145,12 @@ public class TbAwsLambdaNodeTest {
config.setFunctionName(functionName); config.setFunctionName(functionName);
config.setQualifier(qualifier); config.setQualifier(qualifier);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metadata, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metadata)
.data(data)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23"; String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23";
@ -171,7 +176,10 @@ public class TbAwsLambdaNodeTest {
assertThat(invokeRequestCaptor.getValue().getQualifier()).isEqualTo(expectedQualifier); assertThat(invokeRequestCaptor.getValue().getQualifier()).isEqualTo(expectedQualifier);
TbMsgMetaData resultMsgMetadata = metadata.copy(); TbMsgMetaData resultMsgMetadata = metadata.copy();
resultMsgMetadata.putValue("requestId", requestIdStr); resultMsgMetadata.putValue("requestId", requestIdStr);
TbMsg resultedMsg = TbMsg.transformMsg(msg, resultMsgMetadata, funcResponsePayload); TbMsg resultedMsg = msg.transform()
.metaData(resultMsgMetadata)
.data(funcResponsePayload)
.build();
assertThat(msgCaptor.getValue()).usingRecursiveComparison() assertThat(msgCaptor.getValue()).usingRecursiveComparison()
.ignoringFields("ctx") .ignoringFields("ctx")
.isEqualTo(resultedMsg); .isEqualTo(resultedMsg);
@ -197,7 +205,12 @@ public class TbAwsLambdaNodeTest {
init(); init();
config.setTellFailureIfFuncThrowsExc(true); config.setTellFailureIfFuncThrowsExc(true);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23"; String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23";
String errorMsg = "Unhandled exception from function"; String errorMsg = "Unhandled exception from function";
@ -221,7 +234,9 @@ public class TbAwsLambdaNodeTest {
verify(ctx).tellFailure(msgCaptor.capture(), throwableCaptor.capture()); verify(ctx).tellFailure(msgCaptor.capture(), throwableCaptor.capture());
var metadata = Map.of("error", RuntimeException.class + ": " + errorMsg, "requestId", requestIdStr); var metadata = Map.of("error", RuntimeException.class + ": " + errorMsg, "requestId", requestIdStr);
TbMsg resultedMsg = TbMsg.transformMsgMetadata(msg, new TbMsgMetaData(metadata)); TbMsg resultedMsg = msg.transform()
.metaData(new TbMsgMetaData(metadata))
.build();
assertThat(msgCaptor.getValue()).usingRecursiveComparison() assertThat(msgCaptor.getValue()).usingRecursiveComparison()
.ignoringFields("ctx") .ignoringFields("ctx")
@ -233,7 +248,12 @@ public class TbAwsLambdaNodeTest {
public void givenExceptionWasThrownInsideFunctionAndTellFailureIfFuncThrowsExcIsFalse_whenOnMsg_thenTellSuccess() { public void givenExceptionWasThrownInsideFunctionAndTellFailureIfFuncThrowsExcIsFalse_whenOnMsg_thenTellSuccess() {
init(); init();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String requestIdStr = "e83dfbc4-68d5-441c-8ee9-289959a30d3b"; String requestIdStr = "e83dfbc4-68d5-441c-8ee9-289959a30d3b";
String payload = "{\"errorMessage\":\"Something went wrong\",\"errorType\":\"Exception\",\"requestId\":\"" + requestIdStr + "\"}"; String payload = "{\"errorMessage\":\"Something went wrong\",\"errorType\":\"Exception\",\"requestId\":\"" + requestIdStr + "\"}";
@ -255,7 +275,10 @@ public class TbAwsLambdaNodeTest {
verify(ctx).tellSuccess(msgCaptor.capture()); verify(ctx).tellSuccess(msgCaptor.capture());
Map<String, String> metadata = Map.of("requestId", requestIdStr); Map<String, String> metadata = Map.of("requestId", requestIdStr);
TbMsg resultedMsg = TbMsg.transformMsg(msg, new TbMsgMetaData(metadata), payload); TbMsg resultedMsg = msg.transform()
.metaData(new TbMsgMetaData(metadata))
.data(payload)
.build();
assertThat(msgCaptor.getValue()).usingRecursiveComparison() assertThat(msgCaptor.getValue()).usingRecursiveComparison()
.ignoringFields("ctx") .ignoringFields("ctx")
@ -266,7 +289,12 @@ public class TbAwsLambdaNodeTest {
public void givenPayloadFromResultIsNull_whenOnMsg_thenTellFailure() { public void givenPayloadFromResultIsNull_whenOnMsg_thenTellFailure() {
init(); init();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String requestIdStr = "12bbb074-e2fc-4381-8f28-d4bd235103d5"; String requestIdStr = "12bbb074-e2fc-4381-8f28-d4bd235103d5";
String errorMsg = "Payload from result of AWS Lambda function execution is null."; String errorMsg = "Payload from result of AWS Lambda function execution is null.";
@ -289,7 +317,9 @@ public class TbAwsLambdaNodeTest {
verify(ctx).tellFailure(msgCaptor.capture(), throwableCaptor.capture()); verify(ctx).tellFailure(msgCaptor.capture(), throwableCaptor.capture());
var metadata = Map.of("error", RuntimeException.class + ": " + errorMsg, "requestId", requestIdStr); var metadata = Map.of("error", RuntimeException.class + ": " + errorMsg, "requestId", requestIdStr);
TbMsg resultedMsg = TbMsg.transformMsgMetadata(msg, new TbMsgMetaData(metadata)); TbMsg resultedMsg = msg.transform()
.metaData(new TbMsgMetaData(metadata))
.build();
assertThat(msgCaptor.getValue()).usingRecursiveComparison() assertThat(msgCaptor.getValue()).usingRecursiveComparison()
.ignoringFields("ctx") .ignoringFields("ctx")
@ -300,7 +330,12 @@ public class TbAwsLambdaNodeTest {
@Test @Test
public void givenExceptionWasThrownOnAWS_whenOnMsg_thenTellFailure() { public void givenExceptionWasThrownOnAWS_whenOnMsg_thenTellFailure() {
init(); init();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String errorMsg = "Simulated error"; String errorMsg = "Simulated error";

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/sns/TbSnsNodeTest.java

@ -105,7 +105,12 @@ class TbSnsNodeTest {
given(publishResultMock.getSdkResponseMetadata()).willReturn(responseMetadataMock); given(publishResultMock.getSdkResponseMetadata()).willReturn(responseMetadataMock);
given(responseMetadataMock.getRequestId()).willReturn(requestId); given(responseMetadataMock.getRequestId()).willReturn(requestId);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metaData)
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);
@ -143,7 +148,12 @@ class TbSnsNodeTest {
ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg)); ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg));
given(listeningExecutor.executeAsync(any(Callable.class))).willReturn(failedFuture); given(listeningExecutor.executeAsync(any(Callable.class))).willReturn(failedFuture);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(never()).enqueueForTellNext(any(), any(String.class)); then(ctxMock).should(never()).enqueueForTellNext(any(), any(String.class));

28
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/sqs/TbSqsNodeTest.java

@ -107,7 +107,12 @@ class TbSqsNodeTest {
mockSendingMsgRequest(); mockSendingMsgRequest();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metaData)
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
SendMessageRequest sendMsgRequest = new SendMessageRequest() SendMessageRequest sendMsgRequest = new SendMessageRequest()
@ -143,7 +148,12 @@ class TbSqsNodeTest {
mockSendingMsgRequest(); mockSendingMsgRequest();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metaData)
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
Map<String, MessageAttributeValue> messageAttributes = new HashMap<>(); Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
@ -186,7 +196,12 @@ class TbSqsNodeTest {
given(sendMessageResultMock.getMD5OfMessageAttributes()).willReturn(messageAttributesMd5); given(sendMessageResultMock.getMD5OfMessageAttributes()).willReturn(messageAttributesMd5);
given(sendMessageResultMock.getSequenceNumber()).willReturn(sequenceNumber); given(sendMessageResultMock.getSequenceNumber()).willReturn(sequenceNumber);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);
@ -221,7 +236,12 @@ class TbSqsNodeTest {
ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg)); ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg));
given(listeningExecutor.executeAsync(any(Callable.class))).willReturn(failedFuture); given(listeningExecutor.executeAsync(any(Callable.class))).willReturn(failedFuture);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(never()).enqueueForTellNext(any(), any(String.class)); then(ctxMock).should(never()).enqueueForTellNext(any(), any(String.class));

28
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNodeTest.java

@ -190,7 +190,12 @@ public class TbMsgGeneratorNodeTest extends AbstractRuleNodeUpgradeTest {
given(ctxMock.createScriptEngine(any(), any(), any(), any(), any())).willReturn(scriptEngineMock); given(ctxMock.createScriptEngine(any(), any(), any(), any(), any())).willReturn(scriptEngineMock);
// creation of tickMsg // creation of tickMsg
TbMsg tickMsg = TbMsg.newMsg(TbMsgType.GENERATOR_NODE_SELF_MSG, RULE_NODE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg tickMsg = TbMsg.newMsg()
.type(TbMsgType.GENERATOR_NODE_SELF_MSG)
.originator(RULE_NODE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_STRING)
.build();
given(ctxMock.newMsg(null, TbMsgType.GENERATOR_NODE_SELF_MSG, RULE_NODE_ID, null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING)).willReturn(tickMsg); given(ctxMock.newMsg(null, TbMsgType.GENERATOR_NODE_SELF_MSG, RULE_NODE_ID, null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING)).willReturn(tickMsg);
// invocation of tellSelf() method // invocation of tellSelf() method
@ -203,16 +208,31 @@ public class TbMsgGeneratorNodeTest extends AbstractRuleNodeUpgradeTest {
}).given(ctxMock).tellSelf(any(), any(Long.class)); }).given(ctxMock).tellSelf(any(), any(Long.class));
// creation of first message // creation of first message
TbMsg firstMsg = TbMsg.newMsg(TbMsg.EMPTY_STRING, RULE_NODE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg firstMsg = TbMsg.newMsg()
.type(TbMsg.EMPTY_STRING)
.originator(RULE_NODE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
given(ctxMock.newMsg(null, TbMsg.EMPTY_STRING, RULE_NODE_ID, null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT)).willReturn(firstMsg); given(ctxMock.newMsg(null, TbMsg.EMPTY_STRING, RULE_NODE_ID, null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT)).willReturn(firstMsg);
// creation of generated message // creation of generated message
TbMsgMetaData metaData = new TbMsgMetaData(Map.of("data", "40")); TbMsgMetaData metaData = new TbMsgMetaData(Map.of("data", "40"));
TbMsg generatedMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, RULE_NODE_ID, metaData, "{ \"temp\": 42, \"humidity\": 77 }"); TbMsg generatedMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(RULE_NODE_ID)
.copyMetaData(metaData)
.data("{ \"temp\": 42, \"humidity\": 77 }")
.build();
given(scriptEngineMock.executeGenerateAsync(any())).willReturn(Futures.immediateFuture(generatedMsg)); given(scriptEngineMock.executeGenerateAsync(any())).willReturn(Futures.immediateFuture(generatedMsg));
// creation of prev message // creation of prev message
TbMsg prevMsg = TbMsg.newMsg(generatedMsg.getType(), RULE_NODE_ID, generatedMsg.getMetaData(), generatedMsg.getData()); TbMsg prevMsg = TbMsg.newMsg()
.type(generatedMsg.getType())
.originator(RULE_NODE_ID)
.copyMetaData(generatedMsg.getMetaData())
.data(generatedMsg.getData())
.build();
given(ctxMock.newMsg(null, generatedMsg.getType(), RULE_NODE_ID, null, generatedMsg.getMetaData(), generatedMsg.getData())).willReturn(prevMsg); given(ctxMock.newMsg(null, generatedMsg.getType(), RULE_NODE_ID, null, generatedMsg.getMetaData(), generatedMsg.getData())).willReturn(prevMsg);
// WHEN // WHEN

27
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNodeTest.java

@ -85,8 +85,13 @@ public class TbMsgPushToEdgeNodeTest {
Mockito.when(ctx.getEdgeService()).thenReturn(edgeService); Mockito.when(ctx.getEdgeService()).thenReturn(edgeService);
Mockito.when(edgeService.findRelatedEdgeIdsByEntityId(tenantId, deviceId, new PageLink(RELATED_EDGES_CACHE_ITEMS))).thenReturn(new PageData<>()); Mockito.when(edgeService.findRelatedEdgeIdsByEntityId(tenantId, deviceId, new PageLink(RELATED_EDGES_CACHE_ITEMS))).thenReturn(new PageData<>());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.newMsg()
TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -106,8 +111,13 @@ public class TbMsgPushToEdgeNodeTest {
PageData<EdgeId> edgePageData = new PageData<>(List.of(edgeId), 1, 1, false); PageData<EdgeId> edgePageData = new PageData<>(List.of(edgeId), 1, 1, false);
Mockito.when(edgeService.findRelatedEdgeIdsByEntityId(tenantId, userId, new PageLink(RELATED_EDGES_CACHE_ITEMS))).thenReturn(edgePageData); Mockito.when(edgeService.findRelatedEdgeIdsByEntityId(tenantId, userId, new PageLink(RELATED_EDGES_CACHE_ITEMS))).thenReturn(edgePageData);
TbMsg msg = TbMsg.newMsg(TbMsgType.ATTRIBUTES_UPDATED, userId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.newMsg()
TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, null, null); .type(TbMsgType.ATTRIBUTES_UPDATED)
.originator(userId)
.copyMetaData(TbMsgMetaData.EMPTY)
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -137,8 +147,13 @@ public class TbMsgPushToEdgeNodeTest {
Mockito.when(ctx.getDbCallbackExecutor()).thenReturn(dbCallbackExecutor); Mockito.when(ctx.getDbCallbackExecutor()).thenReturn(dbCallbackExecutor);
Mockito.when(edgeEventService.saveAsync(any())).thenReturn(SettableFuture.create()); Mockito.when(edgeEventService.saveAsync(any())).thenReturn(SettableFuture.create());
TbMsg msg = TbMsg.newMsg(event, new EdgeId(UUID.randomUUID()), metaData, TbMsg msg = TbMsg.newMsg()
TbMsgDataType.JSON, "{\"lastConnectTs\":1}", null, null); .type(event)
.originator(new EdgeId(UUID.randomUUID()))
.copyMetaData(metaData)
.dataType(TbMsgDataType.JSON)
.data("{\"lastConnectTs\":1}")
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbAssetTypeSwitchNodeTest.java

@ -118,7 +118,13 @@ class TbAssetTypeSwitchNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId) { private TbMsg getTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, callback); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(callback)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNodeTest.java

@ -174,7 +174,12 @@ class TbCheckAlarmStatusNodeTest {
} }
private TbMsg getTbMsg(String msgData) { private TbMsg getTbMsg(String msgData) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, msgData); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
} }
} }

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeTest.java

@ -44,7 +44,12 @@ import static org.mockito.Mockito.verify;
class TbCheckMessageNodeTest { class TbCheckMessageNodeTest {
private static final DeviceId DEVICE_ID = new DeviceId(UUID.randomUUID()); private static final DeviceId DEVICE_ID = new DeviceId(UUID.randomUUID());
private static final TbMsg EMPTY_POST_ATTRIBUTES_MSG = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); private static final TbMsg EMPTY_POST_ATTRIBUTES_MSG = TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
private TbCheckMessageNode node; private TbCheckMessageNode node;
@ -196,7 +201,12 @@ class TbCheckMessageNodeTest {
metadata.putValue(DataConstants.DEVICE_NAME, "Test Device"); metadata.putValue(DataConstants.DEVICE_NAME, "Test Device");
metadata.putValue(DataConstants.DEVICE_TYPE, DataConstants.DEFAULT_DEVICE_TYPE); metadata.putValue(DataConstants.DEVICE_TYPE, DataConstants.DEFAULT_DEVICE_TYPE);
metadata.putValue("ts", String.valueOf(System.currentTimeMillis())); metadata.putValue("ts", String.valueOf(System.currentTimeMillis()));
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, metadata, data); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metadata)
.data(data)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckRelationNodeTest.java

@ -66,7 +66,12 @@ class TbCheckRelationNodeTest extends AbstractRuleNodeUpgradeTest {
private final TenantId TENANT_ID = new TenantId(UUID.randomUUID()); private final TenantId TENANT_ID = new TenantId(UUID.randomUUID());
private final DeviceId ORIGINATOR_ID = new DeviceId(UUID.randomUUID()); private final DeviceId ORIGINATOR_ID = new DeviceId(UUID.randomUUID());
private final TestDbCallbackExecutor DB_EXECUTOR = new TestDbCallbackExecutor(); private final TestDbCallbackExecutor DB_EXECUTOR = new TestDbCallbackExecutor();
private final TbMsg EMPTY_POST_ATTRIBUTES_MSG = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, ORIGINATOR_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); private final TbMsg EMPTY_POST_ATTRIBUTES_MSG = TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(ORIGINATOR_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
private TbCheckRelationNode node; private TbCheckRelationNode node;

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbDeviceTypeSwitchNodeTest.java

@ -118,6 +118,12 @@ class TbDeviceTypeSwitchNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId) { private TbMsg getTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, callback); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(callback)
.build();
} }
} }

30
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java

@ -59,7 +59,15 @@ public class TbJsFilterNodeTest {
@Test @Test
public void falseEvaluationDoNotSendMsg() throws TbNodeException { public void falseEvaluationDoNotSendMsg() throws TbNodeException {
initWithScript(); initWithScript();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, null, TbMsgMetaData.EMPTY, TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(null)
.copyMetaData(TbMsgMetaData.EMPTY)
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFuture(false)); when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFuture(false));
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -71,7 +79,15 @@ public class TbJsFilterNodeTest {
public void exceptionInJsThrowsException() throws TbNodeException { public void exceptionInJsThrowsException() throws TbNodeException {
initWithScript(); initWithScript();
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, null, metaData, TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(null)
.copyMetaData(metaData)
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFailedFuture(new ScriptException("error"))); when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFailedFuture(new ScriptException("error")));
@ -83,7 +99,15 @@ public class TbJsFilterNodeTest {
public void metadataConditionCanBeTrue() throws TbNodeException { public void metadataConditionCanBeTrue() throws TbNodeException {
initWithScript(); initWithScript();
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, null, metaData, TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(null)
.copyMetaData(metaData)
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFuture(true)); when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFuture(true));
node.onMsg(ctx, msg); node.onMsg(ctx, msg);

10
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java

@ -59,7 +59,15 @@ public class TbJsSwitchNodeTest {
metaData.putValue("humidity", "99"); metaData.putValue("humidity", "99");
String rawJson = "{\"name\": \"Vit\", \"passed\": 5}"; String rawJson = "{\"name\": \"Vit\", \"passed\": 5}";
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, null, metaData, TbMsgDataType.JSON, rawJson, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(null)
.copyMetaData(metaData)
.dataType(TbMsgDataType.JSON)
.data(rawJson)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
when(scriptEngine.executeSwitchAsync(msg)).thenReturn(Futures.immediateFuture(Sets.newHashSet("one", "three"))); when(scriptEngine.executeSwitchAsync(msg)).thenReturn(Futures.immediateFuture(Sets.newHashSet("one", "three")));
node.onMsg(ctx, msg); node.onMsg(ctx, msg);

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbMsgTypeFilterNodeTest.java

@ -97,7 +97,12 @@ class TbMsgTypeFilterNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId, TbMsgType msgType) { private TbMsg getTbMsg(EntityId entityId, TbMsgType msgType) {
return TbMsg.newMsg(msgType, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.newMsg()
.type(msgType)
.originator(entityId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbMsgTypeSwitchNodeTest.java

@ -89,7 +89,12 @@ class TbMsgTypeSwitchNodeTest {
} }
private TbMsg getTbMsg(TbMsgType msgType) { private TbMsg getTbMsg(TbMsgType msgType) {
return TbMsg.newMsg(msgType, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.newMsg()
.type(msgType)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeFilterNodeTest.java

@ -96,7 +96,12 @@ class TbOriginatorTypeFilterNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId) { private TbMsg getTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeSwitchNodeTest.java

@ -90,7 +90,12 @@ class TbOriginatorTypeSwitchNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId) { private TbMsg getTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbAckNodeTest.java

@ -67,7 +67,12 @@ public class TbAckNodeTest {
public void givenMsg_whenOnMsg_thenAckAndTellSuccess() throws TbNodeException { public void givenMsg_whenOnMsg_thenAckAndTellSuccess() throws TbNodeException {
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
DeviceId deviceId = new DeviceId(UUID.fromString("5770153d-6ca2-4447-8a54-5d8a4538e052")); DeviceId deviceId = new DeviceId(UUID.fromString("5770153d-6ca2-4447-8a54-5d8a4538e052"));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbCheckpointNodeTest.java

@ -87,7 +87,12 @@ public class TbCheckpointNodeTest extends AbstractRuleNodeUpgradeTest {
given(ctxMock.getQueueName()).willReturn(queueName); given(ctxMock.getQueueName()).willReturn(queueName);
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<Runnable> onSuccess = ArgumentCaptor.forClass(Runnable.class); ArgumentCaptor<Runnable> onSuccess = ArgumentCaptor.forClass(Runnable.class);
@ -101,7 +106,12 @@ public class TbCheckpointNodeTest extends AbstractRuleNodeUpgradeTest {
given(ctxMock.getQueueName()).willReturn(DataConstants.HP_QUEUE_NAME); given(ctxMock.getQueueName()).willReturn(DataConstants.HP_QUEUE_NAME);
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<Consumer<Throwable>> onFailure = ArgumentCaptor.forClass(Consumer.class); ArgumentCaptor<Consumer<Throwable>> onFailure = ArgumentCaptor.forClass(Consumer.class);

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbRuleChainInputNodeTest.java

@ -300,6 +300,11 @@ public class TbRuleChainInputNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getMsg(EntityId entityId) { private TbMsg getMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); return TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(entityId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_STRING)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbRuleChainOutputNodeTest.java

@ -74,7 +74,12 @@ public class TbRuleChainOutputNodeTest {
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
DeviceId deviceId = new DeviceId(UUID.fromString("f514da88-79b3-46da-9f02-1747c5e84f44")); DeviceId deviceId = new DeviceId(UUID.fromString("f514da88-79b3-46da-9f02-1747c5e84f44"));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().output(msg, "test"); then(ctxMock).should().output(msg, "test");

44
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNodeTest.java

@ -118,7 +118,12 @@ class TbPubSubNodeTest {
given(ctxMock.getExternalCallExecutor()).willReturn(executor); given(ctxMock.getExternalCallExecutor()).willReturn(executor);
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metaData)
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);
@ -133,7 +138,9 @@ class TbPubSubNodeTest {
ArgumentCaptor<TbMsg> actualMsg = ArgumentCaptor.forClass(TbMsg.class); ArgumentCaptor<TbMsg> actualMsg = ArgumentCaptor.forClass(TbMsg.class);
then(ctxMock).should().enqueueForTellNext(actualMsg.capture(), eq(TbNodeConnectionType.SUCCESS)); then(ctxMock).should().enqueueForTellNext(actualMsg.capture(), eq(TbNodeConnectionType.SUCCESS));
metaData.putValue("messageId", messageId); metaData.putValue("messageId", messageId);
TbMsg expectedMsg = TbMsg.transformMsgMetadata(msg, metaData); TbMsg expectedMsg = msg.transform()
.metaData(metaData)
.build();
assertThat(actualMsg.getValue()) assertThat(actualMsg.getValue())
.usingRecursiveComparison() .usingRecursiveComparison()
.ignoringFields("ctx") .ignoringFields("ctx")
@ -164,7 +171,12 @@ class TbPubSubNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metadata, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metadata)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(never()).ack(msg); then(ctxMock).should(never()).ack(msg);
@ -174,7 +186,9 @@ class TbPubSubNodeTest {
ArgumentCaptor<TbMsg> actualMsg = ArgumentCaptor.forClass(TbMsg.class); ArgumentCaptor<TbMsg> actualMsg = ArgumentCaptor.forClass(TbMsg.class);
then(ctxMock).should().tellSuccess(actualMsg.capture()); then(ctxMock).should().tellSuccess(actualMsg.capture());
metadata.putValue("messageId", messageId); metadata.putValue("messageId", messageId);
TbMsg expectedMsg = TbMsg.transformMsgMetadata(msg, metadata); TbMsg expectedMsg = msg.transform()
.metaData(metadata)
.build();
assertThat(actualMsg.getValue()) assertThat(actualMsg.getValue())
.usingRecursiveComparison() .usingRecursiveComparison()
.ignoringFields("ctx") .ignoringFields("ctx")
@ -193,7 +207,12 @@ class TbPubSubNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metaData)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(never()).ack(any()); then(ctxMock).should(never()).ack(any());
@ -201,7 +220,9 @@ class TbPubSubNodeTest {
ArgumentCaptor<Throwable> actualError = ArgumentCaptor.forClass(Throwable.class); ArgumentCaptor<Throwable> actualError = ArgumentCaptor.forClass(Throwable.class);
then(ctxMock).should().tellFailure(actualMsg.capture(), actualError.capture()); then(ctxMock).should().tellFailure(actualMsg.capture(), actualError.capture());
metaData.putValue("error", RuntimeException.class + ": " + errorMsg); metaData.putValue("error", RuntimeException.class + ": " + errorMsg);
TbMsg expectedMsg = TbMsg.transformMsgMetadata(msg, metaData); TbMsg expectedMsg = msg.transform()
.metaData(metaData)
.build();
assertThat(actualMsg.getValue()) assertThat(actualMsg.getValue())
.usingRecursiveComparison() .usingRecursiveComparison()
.ignoringFields("ctx") .ignoringFields("ctx")
@ -221,7 +242,12 @@ class TbPubSubNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metaData)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);
@ -229,7 +255,9 @@ class TbPubSubNodeTest {
ArgumentCaptor<Throwable> actualError = ArgumentCaptor.forClass(Throwable.class); ArgumentCaptor<Throwable> actualError = ArgumentCaptor.forClass(Throwable.class);
then(ctxMock).should().enqueueForTellFailure(actualMsg.capture(), actualError.capture()); then(ctxMock).should().enqueueForTellFailure(actualMsg.capture(), actualError.capture());
metaData.putValue("error", RuntimeException.class + ": " + errorMsg); metaData.putValue("error", RuntimeException.class + ": " + errorMsg);
TbMsg expectedMsg = TbMsg.transformMsgMetadata(msg, metaData); TbMsg expectedMsg = msg.transform()
.metaData(metaData)
.build();
assertThat(actualMsg.getValue()) assertThat(actualMsg.getValue())
.usingRecursiveComparison() .usingRecursiveComparison()
.ignoringFields("ctx") .ignoringFields("ctx")

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/geo/TbGpsGeofencingActionNodeTest.java

@ -164,7 +164,12 @@ class TbGpsGeofencingActionNodeTest extends AbstractRuleNodeUpgradeTest {
private TbMsg getTbMsg(EntityId entityId, TbMsgMetaData metadata, double latitude, double longitude) { private TbMsg getTbMsg(EntityId entityId, TbMsgMetaData metadata, double latitude, double longitude) {
String data = "{\"latitude\": " + latitude + ", \"longitude\": " + longitude + "}"; String data = "{\"latitude\": " + latitude + ", \"longitude\": " + longitude + "}";
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, metadata, data); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.copyMetaData(metadata)
.data(data)
.build();
} }
private TbMsgMetaData getMetadataForNewVersionPolygonPerimeter() { private TbMsgMetaData getMetadataForNewVersionPolygonPerimeter() {

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/geo/TbGpsGeofencingFilterNodeTest.java

@ -448,11 +448,21 @@ class TbGpsGeofencingFilterNodeTest {
private TbMsg getTbMsg(EntityId entityId, TbMsgMetaData metadata, double latitude, double longitude) { private TbMsg getTbMsg(EntityId entityId, TbMsgMetaData metadata, double latitude, double longitude) {
String data = "{\"latitude\": " + latitude + ", \"longitude\": " + longitude + "}"; String data = "{\"latitude\": " + latitude + ", \"longitude\": " + longitude + "}";
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, metadata, data); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.copyMetaData(metadata)
.data(data)
.build();
} }
private TbMsg getEmptyArrayTbMsg(EntityId entityId) { private TbMsg getEmptyArrayTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
} }
} }

50
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/kafka/TbKafkaNodeTest.java

@ -188,7 +188,12 @@ public class TbKafkaNodeTest {
ReflectionTestUtils.setField(node, "initError", new ThingsboardKafkaClientError(errorMsg)); ReflectionTestUtils.setField(node, "initError", new ThingsboardKafkaClientError(errorMsg));
// WHEN // WHEN
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -212,7 +217,12 @@ public class TbKafkaNodeTest {
// WHEN // WHEN
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -232,7 +242,12 @@ public class TbKafkaNodeTest {
// GIVEN // GIVEN
config.setTopicPattern(topicPattern); config.setTopicPattern(topicPattern);
config.setKeyPattern(keyPattern); config.setKeyPattern(keyPattern);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metaData)
.data(data)
.build();
String topic = TbNodeUtils.processPattern(topicPattern, msg); String topic = TbNodeUtils.processPattern(topicPattern, msg);
String key = TbNodeUtils.processPattern(keyPattern, msg); String key = TbNodeUtils.processPattern(keyPattern, msg);
@ -278,7 +293,12 @@ public class TbKafkaNodeTest {
// WHEN // WHEN
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -303,7 +323,12 @@ public class TbKafkaNodeTest {
// WHEN // WHEN
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -331,7 +356,12 @@ public class TbKafkaNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("key", "value"); metaData.putValue("key", "value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.copyMetaData(metaData)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -406,7 +436,9 @@ public class TbKafkaNodeTest {
metaData.putValue("offset", String.valueOf(OFFSET)); metaData.putValue("offset", String.valueOf(OFFSET));
metaData.putValue("partition", String.valueOf(PARTITION)); metaData.putValue("partition", String.valueOf(PARTITION));
metaData.putValue("topic", expectedTopic); metaData.putValue("topic", expectedTopic);
TbMsg expectedMsg = TbMsg.transformMsgMetadata(originalMsg, metaData); TbMsg expectedMsg = originalMsg.transform()
.metaData(metaData)
.build();
assertThat(actualMsg) assertThat(actualMsg)
.usingRecursiveComparison() .usingRecursiveComparison()
.ignoringFields("ctx") .ignoringFields("ctx")
@ -416,7 +448,9 @@ public class TbKafkaNodeTest {
private void verifyOutgoingFailureMsg(String errorMsg, TbMsg actualMsg, TbMsg originalMsg) { private void verifyOutgoingFailureMsg(String errorMsg, TbMsg actualMsg, TbMsg originalMsg) {
TbMsgMetaData metaData = originalMsg.getMetaData(); TbMsgMetaData metaData = originalMsg.getMetaData();
metaData.putValue("error", RuntimeException.class + ": " + errorMsg); metaData.putValue("error", RuntimeException.class + ": " + errorMsg);
TbMsg expectedMsg = TbMsg.transformMsgMetadata(originalMsg, metaData); TbMsg expectedMsg = originalMsg.transform()
.metaData(metaData)
.build();
assertThat(actualMsg).usingRecursiveComparison().ignoringFields("ctx").isEqualTo(expectedMsg); assertThat(actualMsg).usingRecursiveComparison().ignoringFields("ctx").isEqualTo(expectedMsg);
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java

@ -103,7 +103,12 @@ public class TbMsgToEmailNodeTest {
} }
var msgDataStr = "{\"temperature\": " + EXPECTED_TEMPERATURE + "}"; var msgDataStr = "{\"temperature\": " + EXPECTED_TEMPERATURE + "}";
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, md, msgDataStr); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(md)
.data(msgDataStr)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

134
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/math/TbMathNodeTest.java

@ -30,7 +30,6 @@ import org.junit.jupiter.params.provider.MethodSource;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.ThrowingConsumer;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.verification.Timeout; import org.mockito.verification.Timeout;
import org.thingsboard.common.util.AbstractListeningExecutor; import org.thingsboard.common.util.AbstractListeningExecutor;
@ -176,7 +175,12 @@ public class TbMathNodeTest {
metaData.putValue("key2", "argumentA"); metaData.putValue("key2", "argumentA");
ObjectNode msgNode = JacksonUtil.newObjectNode() ObjectNode msgNode = JacksonUtil.newObjectNode()
.put("key3", "argumentB").put("argumentA", 2).put("argumentB", 2); .put("key3", "argumentB").put("argumentA", 2).put("argumentB", 2);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, metaData, msgNode.toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(metaData)
.data(msgNode.toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -184,7 +188,12 @@ public class TbMathNodeTest {
metaData.putValue("key2", "argumentC"); metaData.putValue("key2", "argumentC");
msgNode = JacksonUtil.newObjectNode() msgNode = JacksonUtil.newObjectNode()
.put("key3", "argumentD").put("argumentC", 4).put("argumentD", 3); .put("key3", "argumentD").put("argumentC", 4).put("argumentD", 3);
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, metaData, msgNode.toString()); msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(metaData)
.data(msgNode.toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -231,7 +240,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", arg1).put("b", arg2).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", arg1).put("b", arg2).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -294,7 +308,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", arg1).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", arg1).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -317,7 +336,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -340,7 +364,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -364,7 +393,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.TIME_SERIES, "b") new TbMathArgument(TbMathArgumentType.TIME_SERIES, "b")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().toString())
.build();
when(attributesService.find(tenantId, originator, AttributeScope.SERVER_SCOPE, "a")) when(attributesService.find(tenantId, originator, AttributeScope.SERVER_SCOPE, "a"))
.thenReturn(Futures.immediateFuture(Optional.of(new BaseAttributeKvEntry(System.currentTimeMillis(), new DoubleDataEntry("a", 2.0))))); .thenReturn(Futures.immediateFuture(Optional.of(new BaseAttributeKvEntry(System.currentTimeMillis(), new DoubleDataEntry("a", 2.0)))));
@ -392,7 +426,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -414,7 +453,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -436,7 +480,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
doAnswer(invocation -> { doAnswer(invocation -> {
AttributesSaveRequest request = invocation.getArgument(0); AttributesSaveRequest request = invocation.getArgument(0);
request.getCallback().onSuccess(null); request.getCallback().onSuccess(null);
@ -466,7 +515,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
doAnswer(invocation -> { doAnswer(invocation -> {
TimeseriesSaveRequest request = invocation.getArgument(0); TimeseriesSaveRequest request = invocation.getArgument(0);
request.getCallback().onSuccess(null); request.getCallback().onSuccess(null);
@ -497,7 +551,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
doAnswer(invocation -> { doAnswer(invocation -> {
TimeseriesSaveRequest request = invocation.getArgument(0); TimeseriesSaveRequest request = invocation.getArgument(0);
request.getCallback().onSuccess(null); request.getCallback().onSuccess(null);
@ -534,7 +593,12 @@ public class TbMathNodeTest {
new TbMathResult(TbMathArgumentType.MESSAGE_METADATA, "result", 3, false, false, null), new TbMathResult(TbMathArgumentType.MESSAGE_METADATA, "result", 3, false, false, null),
tbMathArgument tbMathArgument
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 10).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 10).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
ArgumentCaptor<TbMsg> msgCaptor = ArgumentCaptor.forClass(TbMsg.class); ArgumentCaptor<TbMsg> msgCaptor = ArgumentCaptor.forClass(TbMsg.class);
@ -554,7 +618,12 @@ public class TbMathNodeTest {
new TbMathResult(TbMathArgumentType.TIME_SERIES, "result", 3, true, false, DataConstants.SERVER_SCOPE), new TbMathResult(TbMathArgumentType.TIME_SERIES, "result", 3, true, false, DataConstants.SERVER_SCOPE),
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "TestKey") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "TestKey")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 10).toString()); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 10).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class); ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -569,7 +638,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); TbMsg msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class); ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -589,10 +663,20 @@ public class TbMathNodeTest {
CountDownLatch slowProcessingLatch = new CountDownLatch(1); CountDownLatch slowProcessingLatch = new CountDownLatch(1);
List<TbMsg> slowMsgList = IntStream.range(0, 5) List<TbMsg> slowMsgList = IntStream.range(0, 5)
.mapToObj(x -> TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originatorSlow, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())) .mapToObj(x -> TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originatorSlow)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build())
.toList(); .toList();
List<TbMsg> fastMsgList = IntStream.range(0, 2) List<TbMsg> fastMsgList = IntStream.range(0, 2)
.mapToObj(x -> TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originatorFast, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())) .mapToObj(x -> TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originatorFast)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build())
.toList(); .toList();
assertThat(slowMsgList.size()).as("slow msgs >= rule-dispatcher pool size").isGreaterThanOrEqualTo(RULE_DISPATCHER_POOL_SIZE); assertThat(slowMsgList.size()).as("slow msgs >= rule-dispatcher pool size").isGreaterThanOrEqualTo(RULE_DISPATCHER_POOL_SIZE);
@ -659,7 +743,12 @@ public class TbMathNodeTest {
CountDownLatch slowProcessingLatch = new CountDownLatch(1); CountDownLatch slowProcessingLatch = new CountDownLatch(1);
List<TbMsg> slowMsgList = IntStream.range(0, 5) List<TbMsg> slowMsgList = IntStream.range(0, 5)
.mapToObj(x -> TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originatorSlow, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())) .mapToObj(x -> TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originatorSlow)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build())
.collect(Collectors.toList()); .collect(Collectors.toList());
assertThat(slowMsgList.size()).as("slow msgs >= rule-dispatcher pool size").isGreaterThanOrEqualTo(RULE_DISPATCHER_POOL_SIZE); assertThat(slowMsgList.size()).as("slow msgs >= rule-dispatcher pool size").isGreaterThanOrEqualTo(RULE_DISPATCHER_POOL_SIZE);
@ -732,7 +821,12 @@ public class TbMathNodeTest {
}) })
.toList(); .toList();
ctxNodes.forEach(ctxNode -> ruleEngineDispatcherExecutor.executeAsync(() -> ctxNode.getRight() ctxNodes.forEach(ctxNode -> ruleEngineDispatcherExecutor.executeAsync(() -> ctxNode.getRight()
.onMsg(ctxNode.getLeft(), TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, "{\"a\":2,\"b\":2}")))); .onMsg(ctxNode.getLeft(), TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(TbMsgMetaData.EMPTY)
.data("{\"a\":2,\"b\":2}")
.build())));
ctxNodes.forEach(ctxNode -> verify(ctxNode.getRight(), timeout(TIMEOUT)).onMsg(eq(ctxNode.getLeft()), any())); ctxNodes.forEach(ctxNode -> verify(ctxNode.getRight(), timeout(TIMEOUT)).onMsg(eq(ctxNode.getLeft()), any()));
processingLatch.countDown(); processingLatch.countDown();

112
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNodeTest.java

@ -169,7 +169,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
// GIVEN // GIVEN
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
var msgData = "{\"pulseCounter\": 42}"; var msgData = "{\"pulseCounter\": 42}";
var msg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -184,7 +189,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
public void givenInvalidMsgDataType_whenOnMsg_thenShouldTellNextOther() throws TbNodeException { public void givenInvalidMsgDataType_whenOnMsg_thenShouldTellNextOther() throws TbNodeException {
// GIVEN // GIVEN
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -200,7 +210,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
public void givenInputKeyIsNotPresent_whenOnMsg_thenShouldTellNextOther() throws TbNodeException { public void givenInputKeyIsNotPresent_whenOnMsg_thenShouldTellNextOther() throws TbNodeException {
// GIVEN // GIVEN
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -224,7 +239,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", 40.5))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", 40.5)));
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -254,7 +274,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("temperature", 40L))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("temperature", 40L)));
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -284,7 +309,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("temperature", "40.0"))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("temperature", "40.0")));
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -318,7 +348,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var firstMsgMetaData = new TbMsgMetaData(); var firstMsgMetaData = new TbMsgMetaData();
firstMsgMetaData.putValue("ts", String.valueOf(3L)); firstMsgMetaData.putValue("ts", String.valueOf(3L));
var firstMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, firstMsgMetaData, msgData); var firstMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(firstMsgMetaData)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, firstMsg); node.onMsg(ctxMock, firstMsg);
@ -344,7 +379,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
var secondMsgMetaData = new TbMsgMetaData(); var secondMsgMetaData = new TbMsgMetaData();
secondMsgMetaData.putValue("ts", String.valueOf(6L)); secondMsgMetaData.putValue("ts", String.valueOf(6L));
var secondMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, secondMsgMetaData, msgData); var secondMsg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(secondMsgMetaData)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, secondMsg); node.onMsg(ctxMock, secondMsg);
@ -375,7 +415,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", null))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", null)));
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -403,7 +448,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L)));
var msgData = "{\"pulseCounter\":\"123\"}"; var msgData = "{\"pulseCounter\":\"123\"}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -435,7 +485,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L)));
var msgData = "{\"pulseCounter\":\"123\"}"; var msgData = "{\"pulseCounter\":\"123\"}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -459,7 +514,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("pulseCounter", "high"))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("pulseCounter", "high")));
var msgData = "{\"pulseCounter\":\"123\"}"; var msgData = "{\"pulseCounter\":\"123\"}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -484,7 +544,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new BooleanDataEntry("pulseCounter", false))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new BooleanDataEntry("pulseCounter", false)));
var msgData = "{\"pulseCounter\":true}"; var msgData = "{\"pulseCounter\":true}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -509,7 +574,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new JsonDataEntry("pulseCounter", "{\"isActive\":false}"))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new JsonDataEntry("pulseCounter", "{\"isActive\":false}")));
var msgData = "{\"pulseCounter\":{\"isActive\":true}}"; var msgData = "{\"pulseCounter\":{\"isActive\":true}}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -552,7 +622,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
List<TbMsg> tbMsgList = IntStream.range(0, RULE_DISPATCHER_POOL_SIZE * 2).mapToObj(x -> { List<TbMsg> tbMsgList = IntStream.range(0, RULE_DISPATCHER_POOL_SIZE * 2).mapToObj(x -> {
var msgData = "{\"pulseCounter\":" + 2 + "}"; var msgData = "{\"pulseCounter\":" + 2 + "}";
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); return TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
}).toList(); }).toList();
CountDownLatch processingLatch = new CountDownLatch(tbMsgList.size()); CountDownLatch processingLatch = new CountDownLatch(tbMsgList.size());
@ -597,7 +672,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(1L, new DoubleDataEntry("temperature", testConfig.prevValue()))); mockFindLatestAsync(new BasicTsKvEntry(1L, new DoubleDataEntry("temperature", testConfig.prevValue())));
var msgData = "{\"temperature\":" + testConfig.currentValue() + ",\"airPressure\":123}"; var msgData = "{\"temperature\":" + testConfig.currentValue() + ",\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNodeTest.java

@ -173,7 +173,13 @@ public class TbFetchDeviceCredentialsNodeTest {
final var metaData = new TbMsgMetaData(mdMap); final var metaData = new TbMsgMetaData(mdMap);
final String data = "{\"TestAttribute_1\": \"humidity\", \"TestAttribute_2\": \"voltage\"}"; final String data = "{\"TestAttribute_1\": \"humidity\", \"TestAttribute_2\": \"voltage\"}";
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, metaData, data, callbackMock); return TbMsg.newMsg()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.copyMetaData(metaData)
.data(data)
.callback(callbackMock)
.build();
} }
} }

15
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNodeTest.java

@ -17,7 +17,6 @@ package org.thingsboard.rule.engine.metadata;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
@ -247,7 +246,12 @@ public class TbGetAttributesNodeTest extends AbstractRuleNodeUpgradeTest {
public void givenFetchLatestTimeseriesToDataAndDataIsNotJsonObject_whenOnMsg_thenException() throws Exception { public void givenFetchLatestTimeseriesToDataAndDataIsNotJsonObject_whenOnMsg_thenException() throws Exception {
// GIVEN // GIVEN
node = initNode(TbMsgSource.DATA, true, true); node = initNode(TbMsgSource.DATA, true, true);
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, ORIGINATOR_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); var msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(ORIGINATOR_ID)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -343,7 +347,12 @@ public class TbGetAttributesNodeTest extends AbstractRuleNodeUpgradeTest {
msgMetaData.putValue("client_attr_metadata", "client_attr_3"); msgMetaData.putValue("client_attr_metadata", "client_attr_3");
msgMetaData.putValue("server_attr_metadata", "server_attr_3"); msgMetaData.putValue("server_attr_metadata", "server_attr_3");
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, entityId, msgMetaData, JacksonUtil.toString(msgData)); return TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(entityId)
.copyMetaData(msgMetaData)
.data(JacksonUtil.toString(msgData))
.build();
} }
private List<String> getAttributeNames(String prefix) { private List<String> getAttributeNames(String prefix) {

21
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java

@ -210,7 +210,12 @@ public class TbGetCustomerAttributeNodeTest {
public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() { public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() {
// GIVEN // GIVEN
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -225,7 +230,12 @@ public class TbGetCustomerAttributeNodeTest {
// GIVEN // GIVEN
var userId = new UserId(UUID.randomUUID()); var userId = new UserId(UUID.randomUUID());
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, userId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(userId)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
when(ctxMock.getTenantId()).thenReturn(TENANT_ID); when(ctxMock.getTenantId()).thenReturn(TENANT_ID);
@ -469,7 +479,12 @@ public class TbGetCustomerAttributeNodeTest {
var msgData = "{\"temp\":42,\"humidity\":77,\"messageBodyPattern1\":\"targetKey2\",\"messageBodyPattern2\":\"sourceKey3\"}"; var msgData = "{\"temp\":42,\"humidity\":77,\"messageBodyPattern1\":\"targetKey2\",\"messageBodyPattern2\":\"sourceKey3\"}";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, msgMetaData, msgData); msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(msgMetaData)
.data(msgData)
.build();
} }
@RequiredArgsConstructor @RequiredArgsConstructor

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java

@ -159,7 +159,12 @@ public class TbGetCustomerDetailsNodeTest {
public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() { public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() {
// GIVEN // GIVEN
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.copyMetaData(TbMsgMetaData.EMPTY)
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -458,7 +463,12 @@ public class TbGetCustomerDetailsNodeTest {
var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, msgMetaData, msgData); msg = TbMsg.newMsg()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.copyMetaData(msgMetaData)
.data(msgData)
.build();
} }
private void mockFindCustomer() { private void mockFindCustomer() {

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save