diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java index 7ec7450929..e3d2be336a 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java @@ -18,7 +18,6 @@ package org.thingsboard.rule.engine.transform; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.extern.slf4j.Slf4j; -import org.springframework.util.CollectionUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.TbContext; @@ -33,6 +32,7 @@ import org.thingsboard.server.common.msg.TbMsgMetaData; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.regex.Pattern; @@ -59,45 +59,41 @@ public class TbDeleteKeysNode implements TbNode { @Override public void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException { - List keys = config.getKeys(); - if (CollectionUtils.isEmpty(keys)) { - ctx.tellSuccess(msg); + Set keys = config.getKeys(); + TbMsgMetaData metaData = msg.getMetaData(); + String msgData = msg.getData(); + if (config.isFromMetadata()) { + Map metaDataMap = metaData.getData(); + List keysToDelete = new ArrayList<>(); + keys.forEach(key -> { + Pattern pattern = Pattern.compile(key); + metaDataMap.forEach((keyMetaData, valueMetaData) -> { + if (pattern.matcher(keyMetaData).matches()) { + keysToDelete.add(keyMetaData); + } + }); + }); + keysToDelete.forEach(key -> metaDataMap.remove(key)); + metaData = new TbMsgMetaData(metaDataMap); } else { - TbMsgMetaData metaData = msg.getMetaData(); - String msgData = msg.getData(); - if (config.isFromMetadata()) { - Map metaDataMap = metaData.getData(); + JsonNode dataNode = JacksonUtil.toJsonNode(msgData); + if (dataNode.isObject()) { List keysToDelete = new ArrayList<>(); + ObjectNode msgDataObject = (ObjectNode) dataNode; keys.forEach(key -> { Pattern pattern = Pattern.compile(key); - metaDataMap.forEach((keyMetaData, valueMetaData) -> { - if (pattern.matcher(keyMetaData).matches()) { - keysToDelete.add(keyMetaData); + msgDataObject.fields().forEachRemaining(entry -> { + String keyData = entry.getKey(); + if (pattern.matcher(keyData).matches()) { + keysToDelete.add(keyData); } }); }); - keysToDelete.forEach(key -> metaDataMap.remove(key)); - metaData = new TbMsgMetaData(metaDataMap); - } else { - JsonNode dataNode = JacksonUtil.toJsonNode(msgData); - if (dataNode.isObject()) { - List keysToDelete = new ArrayList<>(); - ObjectNode msgDataObject = (ObjectNode) dataNode; - keys.forEach(key -> { - Pattern pattern = Pattern.compile(key); - msgDataObject.fields().forEachRemaining(entry -> { - String keyData = entry.getKey(); - if (pattern.matcher(keyData).matches()) { - keysToDelete.add(keyData); - } - }); - }); - msgDataObject.remove(keysToDelete); - msgData = JacksonUtil.toString(msgDataObject); - } + msgDataObject.remove(keysToDelete); + msgData = JacksonUtil.toString(msgDataObject); } - ctx.tellSuccess(TbMsg.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, msgData)); } + ctx.tellSuccess(TbMsg.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, msgData)); } @Override diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeConfiguration.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeConfiguration.java index 87b6d622ce..36c5eda7de 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeConfiguration.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeConfiguration.java @@ -20,17 +20,18 @@ import org.thingsboard.rule.engine.api.NodeConfiguration; import java.util.Collections; import java.util.List; +import java.util.Set; @Data public class TbDeleteKeysNodeConfiguration implements NodeConfiguration { private boolean fromMetadata; - private List keys; + private Set keys; @Override public TbDeleteKeysNodeConfiguration defaultConfiguration() { TbDeleteKeysNodeConfiguration configuration = new TbDeleteKeysNodeConfiguration(); - configuration.setKeys(Collections.emptyList()); + configuration.setKeys(Collections.emptySet()); configuration.setFromMetadata(false); return configuration; } diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java index 1f62150016..5ccf97c4c3 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java @@ -32,8 +32,8 @@ import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.queue.TbMsgCallback; import java.util.Collections; -import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -60,7 +60,7 @@ public class TbDeleteKeysNodeTest { callback = mock(TbMsgCallback.class); ctx = mock(TbContext.class); config = new TbDeleteKeysNodeConfiguration().defaultConfiguration(); - config.setKeys(List.of("TestKey_1", "TestKey_2", "TestKey_3", "(\\w*)Data(\\w*)")); + config.setKeys(Set.of("TestKey_1", "TestKey_2", "TestKey_3", "(\\w*)Data(\\w*)")); config.setFromMetadata(true); nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); node = spy(new TbDeleteKeysNode()); @@ -80,7 +80,7 @@ public class TbDeleteKeysNodeTest { @Test void givenDefaultConfig_whenVerify_thenOK() { TbDeleteKeysNodeConfiguration defaultConfig = new TbDeleteKeysNodeConfiguration().defaultConfiguration(); - assertThat(defaultConfig.getKeys()).isEqualTo(Collections.emptyList()); + assertThat(defaultConfig.getKeys()).isEqualTo(Collections.emptySet()); assertThat(defaultConfig.isFromMetadata()).isEqualTo(false); } @@ -97,8 +97,8 @@ public class TbDeleteKeysNodeTest { assertThat(newMsg).isNotNull(); Map metaDataMap = newMsg.getMetaData().getData(); - assertThat(metaDataMap.containsKey("DigitData")).isEqualTo(false); - assertThat(metaDataMap.containsKey("TempDataValue")).isEqualTo(false); + assertThat(metaDataMap.containsKey("TestKey_1")).isEqualTo(false); + assertThat(metaDataMap.containsKey("voltageDataValue")).isEqualTo(false); } @Test @@ -128,7 +128,7 @@ public class TbDeleteKeysNodeTest { nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(defaultConfig)); node.init(ctx, nodeConfiguration); - String data = "{}"; + String data = "{\"Voltage\":220,\"Humidity\":56}"; node.onMsg(ctx, getTbMsg(deviceId, data)); ArgumentCaptor newMsgCaptor = ArgumentCaptor.forClass(TbMsg.class);