Browse Source

refactor code

pull/7009/head
Yuriy Lytvynchuk 4 years ago
parent
commit
70c6413275
  1. 54
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbCopyKeysNode.java
  2. 3
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeConfiguration.java
  3. 19
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java

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

@ -29,9 +29,12 @@ import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.msg.TbMsg;
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.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Pattern;
@Slf4j
@ -50,47 +53,55 @@ import java.util.regex.Pattern;
public class TbCopyKeysNode implements TbNode {
TbCopyKeysNodeConfiguration config;
List<Pattern> patternKeys = new ArrayList<>();
@Override
public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
this.config = TbNodeUtils.convert(configuration, TbCopyKeysNodeConfiguration.class);
config.getKeys().forEach(key -> {
this.patternKeys.add(Pattern.compile(key));
});
}
@Override
public void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException {
Set<String> keys = config.getKeys();
TbMsgMetaData metaData = msg.getMetaData();
String msgData = msg.getData();
AtomicBoolean msgChanged = new AtomicBoolean(false);
JsonNode dataNode = JacksonUtil.toJsonNode(msgData);
if (!dataNode.isObject()) {
ctx.tellFailure(msg, new RuntimeException("Msg data is not a JSON Object!"));
return;
}
if (config.isFromMetadata()) {
ObjectNode msgDataNode = (ObjectNode) dataNode;
Map<String, String> metaDataMap = metaData.getData();
keys.forEach(key -> {
Pattern pattern = Pattern.compile(key);
if (dataNode.isObject()) {
if (config.isFromMetadata()) {
ObjectNode msgDataNode = (ObjectNode) dataNode;
Map<String, String> metaDataMap = metaData.getData();
metaDataMap.forEach((keyMetaData, valueMetaData) -> {
if (pattern.matcher(keyMetaData).matches()) {
if (checkKey(keyMetaData)) {
msgChanged.set(true);
msgDataNode.put(keyMetaData, valueMetaData);
}
});
});
msgData = JacksonUtil.toString(msgDataNode);
} else {
keys.forEach(key -> {
Pattern pattern = Pattern.compile(key);
msgData = JacksonUtil.toString(msgDataNode);
} else {
dataNode.fields().forEachRemaining(entry -> {
String keyData = entry.getKey();
if (pattern.matcher(keyData).matches()) {
if (checkKey(keyData)) {
msgChanged.set(true);
metaData.putValue(keyData, JacksonUtil.toString(entry.getValue()));
}
});
});
}
}
if (msgChanged.get()) {
ctx.tellSuccess(TbMsg.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, msgData));
} else {
ctx.tellSuccess(msg);
}
ctx.tellSuccess(TbMsg.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, msgData));
}
boolean checkKey(String key) {
Optional<Pattern> currentPattern = patternKeys.stream()
.filter(pattern -> pattern.matcher(key).matches())
.findFirst();
return currentPattern.isPresent();
}
@Override
@ -98,4 +109,3 @@ public class TbCopyKeysNode implements TbNode {
}
}

3
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeConfiguration.java

@ -36,6 +36,3 @@ public class TbCopyKeysNodeConfiguration implements NodeConfiguration<TbCopyKeys
}
}

19
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java

@ -75,6 +75,7 @@ public class TbCopyKeysNodeTest {
@Test
void givenDefaultConfig_whenInit_thenOK() {
assertThat(node.config).isEqualTo(config);
assertThat(node.patternKeys.size()).isEqualTo(config.getKeys().size());
}
@Test
@ -143,16 +144,19 @@ public class TbCopyKeysNodeTest {
}
@Test
void givenMsgDataNotJSONObject_whenOnMsg_thenTellFailure() throws Exception {
void givenMsgDataNotJSONObject_whenOnMsg_thenTVerifyOutput() throws Exception {
String data = "[]";
node.onMsg(ctx, getTbMsg(deviceId, data));
TbMsg msg = getTbMsg(deviceId, data);
node.onMsg(ctx, msg);
ArgumentCaptor<TbMsg> newMsgCaptor = ArgumentCaptor.forClass(TbMsg.class);
ArgumentCaptor<Exception> 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());
assertThat(exceptionCaptor.getValue()).isInstanceOf(RuntimeException.class);
TbMsg newMsg = newMsgCaptor.getValue();
assertThat(newMsg).isNotNull();
assertThat(newMsg).isSameAs(msg);
}
private TbMsg getTbMsg(EntityId entityId, String data) {
@ -164,4 +168,5 @@ public class TbCopyKeysNodeTest {
);
return TbMsg.newMsg("POST_ATTRIBUTES_REQUEST", entityId, new TbMsgMetaData(mdMap), data, callback);
}
}
}

Loading…
Cancel
Save