diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java index 031974c7a6..9096ad4815 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java @@ -31,6 +31,7 @@ import org.thingsboard.server.common.msg.TbMsgMetaData; import java.util.Map; import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicBoolean; @Slf4j @RuleNode( @@ -48,21 +49,26 @@ import java.util.concurrent.ExecutionException; public class TbRenameKeysNode implements TbNode { TbRenameKeysNodeConfiguration config; + Map renameKeysMapping; + boolean fromMetadata; @Override public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException { this.config = TbNodeUtils.convert(configuration, TbRenameKeysNodeConfiguration.class); + this.renameKeysMapping = config.getRenameKeysMapping(); + this.fromMetadata = config.isFromMetadata(); } @Override public void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException { - Map renameKeysMapping = config.getRenameKeysMapping(); TbMsgMetaData metaData = msg.getMetaData(); String data = msg.getData(); - if (config.isFromMetadata()) { + AtomicBoolean msgChanged = new AtomicBoolean(false); + if (fromMetadata) { Map metaDataMap = metaData.getData(); renameKeysMapping.forEach((nameKey, newNameKey) -> { if (metaDataMap.containsKey(nameKey)) { + msgChanged.set(true); metaDataMap.put(newNameKey, metaDataMap.get(nameKey)); metaDataMap.remove(nameKey); } @@ -74,17 +80,19 @@ public class TbRenameKeysNode implements TbNode { ObjectNode msgData = (ObjectNode) dataNode; renameKeysMapping.forEach((nameKey, newNameKey) -> { if (msgData.has(nameKey)) { + msgChanged.set(true); msgData.set(newNameKey, msgData.get(nameKey)); msgData.remove(nameKey); } }); data = JacksonUtil.toString(msgData); - } else { - ctx.tellFailure(msg, new RuntimeException("Msg data is not a JSON Object!")); - return; } } - ctx.tellSuccess(TbMsg.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, data)); + if (msgChanged.get()) { + ctx.tellSuccess(TbMsg.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, data)); + } else { + ctx.tellSuccess(msg); + } } @Override diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeConfiguration.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeConfiguration.java index f457512c03..b0ca483b1a 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeConfiguration.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeConfiguration.java @@ -36,6 +36,3 @@ public class TbRenameKeysNodeConfiguration implements NodeConfiguration newMsgCaptor = ArgumentCaptor.forClass(TbMsg.class); - ArgumentCaptor exceptionCaptor = ArgumentCaptor.forClass(Exception.class); - verify(ctx, never()).tellSuccess(any()); - verify(ctx, times(1)).tellFailure(newMsgCaptor.capture(), exceptionCaptor.capture()); + verify(ctx, times(1)).tellSuccess(newMsgCaptor.capture()); + verify(ctx, never()).tellFailure(any(), any()); + + TbMsg newMsg = newMsgCaptor.getValue(); + assertThat(newMsg).isNotNull(); - assertThat(exceptionCaptor.getValue()).isInstanceOf(RuntimeException.class); + assertThat(newMsg).isSameAs(msg); } private TbMsg getTbMsg(EntityId entityId, String data) { @@ -159,4 +162,4 @@ public class TbRenameKeysNodeTest { ); return TbMsg.newMsg("POST_ATTRIBUTES_REQUEST", entityId, new TbMsgMetaData(mdMap), data, callback); } -} \ No newline at end of file +}