Browse Source

code review

pull/7077/head
Yuriy Lytvynchuk 4 years ago
parent
commit
ee1d8e4189
  1. 58
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java
  2. 5
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeConfiguration.java
  3. 12
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java

58
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.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.RuleNode;
import org.thingsboard.rule.engine.api.TbContext; 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.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -59,45 +59,41 @@ public class TbDeleteKeysNode implements TbNode {
@Override @Override
public void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException { public void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException {
List<String> keys = config.getKeys(); Set<String> keys = config.getKeys();
if (CollectionUtils.isEmpty(keys)) { TbMsgMetaData metaData = msg.getMetaData();
ctx.tellSuccess(msg); String msgData = msg.getData();
if (config.isFromMetadata()) {
Map<String, String> metaDataMap = metaData.getData();
List<String> 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 { } else {
TbMsgMetaData metaData = msg.getMetaData(); JsonNode dataNode = JacksonUtil.toJsonNode(msgData);
String msgData = msg.getData(); if (dataNode.isObject()) {
if (config.isFromMetadata()) {
Map<String, String> metaDataMap = metaData.getData();
List<String> keysToDelete = new ArrayList<>(); List<String> keysToDelete = new ArrayList<>();
ObjectNode msgDataObject = (ObjectNode) dataNode;
keys.forEach(key -> { keys.forEach(key -> {
Pattern pattern = Pattern.compile(key); Pattern pattern = Pattern.compile(key);
metaDataMap.forEach((keyMetaData, valueMetaData) -> { msgDataObject.fields().forEachRemaining(entry -> {
if (pattern.matcher(keyMetaData).matches()) { String keyData = entry.getKey();
keysToDelete.add(keyMetaData); if (pattern.matcher(keyData).matches()) {
keysToDelete.add(keyData);
} }
}); });
}); });
keysToDelete.forEach(key -> metaDataMap.remove(key)); msgDataObject.remove(keysToDelete);
metaData = new TbMsgMetaData(metaDataMap); msgData = JacksonUtil.toString(msgDataObject);
} else {
JsonNode dataNode = JacksonUtil.toJsonNode(msgData);
if (dataNode.isObject()) {
List<String> 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);
}
} }
ctx.tellSuccess(TbMsg.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, msgData));
} }
ctx.tellSuccess(TbMsg.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, msgData));
} }
@Override @Override

5
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.Collections;
import java.util.List; import java.util.List;
import java.util.Set;
@Data @Data
public class TbDeleteKeysNodeConfiguration implements NodeConfiguration<TbDeleteKeysNodeConfiguration> { public class TbDeleteKeysNodeConfiguration implements NodeConfiguration<TbDeleteKeysNodeConfiguration> {
private boolean fromMetadata; private boolean fromMetadata;
private List<String> keys; private Set<String> keys;
@Override @Override
public TbDeleteKeysNodeConfiguration defaultConfiguration() { public TbDeleteKeysNodeConfiguration defaultConfiguration() {
TbDeleteKeysNodeConfiguration configuration = new TbDeleteKeysNodeConfiguration(); TbDeleteKeysNodeConfiguration configuration = new TbDeleteKeysNodeConfiguration();
configuration.setKeys(Collections.emptyList()); configuration.setKeys(Collections.emptySet());
configuration.setFromMetadata(false); configuration.setFromMetadata(false);
return configuration; return configuration;
} }

12
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 org.thingsboard.server.common.msg.queue.TbMsgCallback;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@ -60,7 +60,7 @@ public class TbDeleteKeysNodeTest {
callback = mock(TbMsgCallback.class); callback = mock(TbMsgCallback.class);
ctx = mock(TbContext.class); ctx = mock(TbContext.class);
config = new TbDeleteKeysNodeConfiguration().defaultConfiguration(); 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); config.setFromMetadata(true);
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
node = spy(new TbDeleteKeysNode()); node = spy(new TbDeleteKeysNode());
@ -80,7 +80,7 @@ public class TbDeleteKeysNodeTest {
@Test @Test
void givenDefaultConfig_whenVerify_thenOK() { void givenDefaultConfig_whenVerify_thenOK() {
TbDeleteKeysNodeConfiguration defaultConfig = new TbDeleteKeysNodeConfiguration().defaultConfiguration(); TbDeleteKeysNodeConfiguration defaultConfig = new TbDeleteKeysNodeConfiguration().defaultConfiguration();
assertThat(defaultConfig.getKeys()).isEqualTo(Collections.emptyList()); assertThat(defaultConfig.getKeys()).isEqualTo(Collections.emptySet());
assertThat(defaultConfig.isFromMetadata()).isEqualTo(false); assertThat(defaultConfig.isFromMetadata()).isEqualTo(false);
} }
@ -97,8 +97,8 @@ public class TbDeleteKeysNodeTest {
assertThat(newMsg).isNotNull(); assertThat(newMsg).isNotNull();
Map<String, String> metaDataMap = newMsg.getMetaData().getData(); Map<String, String> metaDataMap = newMsg.getMetaData().getData();
assertThat(metaDataMap.containsKey("DigitData")).isEqualTo(false); assertThat(metaDataMap.containsKey("TestKey_1")).isEqualTo(false);
assertThat(metaDataMap.containsKey("TempDataValue")).isEqualTo(false); assertThat(metaDataMap.containsKey("voltageDataValue")).isEqualTo(false);
} }
@Test @Test
@ -128,7 +128,7 @@ public class TbDeleteKeysNodeTest {
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(defaultConfig)); nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(defaultConfig));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
String data = "{}"; String data = "{\"Voltage\":220,\"Humidity\":56}";
node.onMsg(ctx, getTbMsg(deviceId, data)); node.onMsg(ctx, getTbMsg(deviceId, data));
ArgumentCaptor<TbMsg> newMsgCaptor = ArgumentCaptor.forClass(TbMsg.class); ArgumentCaptor<TbMsg> newMsgCaptor = ArgumentCaptor.forClass(TbMsg.class);

Loading…
Cancel
Save