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.TbMsg;
import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.TbMsgMetaData;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Optional;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@Slf4j @Slf4j
@ -50,47 +53,55 @@ import java.util.regex.Pattern;
public class TbCopyKeysNode implements TbNode { public class TbCopyKeysNode implements TbNode {
TbCopyKeysNodeConfiguration config; TbCopyKeysNodeConfiguration config;
List<Pattern> patternKeys = new ArrayList<>();
@Override @Override
public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException { public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
this.config = TbNodeUtils.convert(configuration, TbCopyKeysNodeConfiguration.class); this.config = TbNodeUtils.convert(configuration, TbCopyKeysNodeConfiguration.class);
config.getKeys().forEach(key -> {
this.patternKeys.add(Pattern.compile(key));
});
} }
@Override @Override
public void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException { public void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException {
Set<String> keys = config.getKeys();
TbMsgMetaData metaData = msg.getMetaData(); TbMsgMetaData metaData = msg.getMetaData();
String msgData = msg.getData(); String msgData = msg.getData();
AtomicBoolean msgChanged = new AtomicBoolean(false);
JsonNode dataNode = JacksonUtil.toJsonNode(msgData); JsonNode dataNode = JacksonUtil.toJsonNode(msgData);
if (!dataNode.isObject()) { if (dataNode.isObject()) {
ctx.tellFailure(msg, new RuntimeException("Msg data is not a JSON Object!")); if (config.isFromMetadata()) {
return; ObjectNode msgDataNode = (ObjectNode) dataNode;
} Map<String, String> metaDataMap = metaData.getData();
if (config.isFromMetadata()) {
ObjectNode msgDataNode = (ObjectNode) dataNode;
Map<String, String> metaDataMap = metaData.getData();
keys.forEach(key -> {
Pattern pattern = Pattern.compile(key);
metaDataMap.forEach((keyMetaData, valueMetaData) -> { metaDataMap.forEach((keyMetaData, valueMetaData) -> {
if (pattern.matcher(keyMetaData).matches()) { if (checkKey(keyMetaData)) {
msgChanged.set(true);
msgDataNode.put(keyMetaData, valueMetaData); msgDataNode.put(keyMetaData, valueMetaData);
} }
}); });
}); msgData = JacksonUtil.toString(msgDataNode);
msgData = JacksonUtil.toString(msgDataNode); } else {
} else {
keys.forEach(key -> {
Pattern pattern = Pattern.compile(key);
dataNode.fields().forEachRemaining(entry -> { dataNode.fields().forEachRemaining(entry -> {
String keyData = entry.getKey(); String keyData = entry.getKey();
if (pattern.matcher(keyData).matches()) { if (checkKey(keyData)) {
msgChanged.set(true);
metaData.putValue(keyData, JacksonUtil.toString(entry.getValue())); 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 @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 @Test
void givenDefaultConfig_whenInit_thenOK() { void givenDefaultConfig_whenInit_thenOK() {
assertThat(node.config).isEqualTo(config); assertThat(node.config).isEqualTo(config);
assertThat(node.patternKeys.size()).isEqualTo(config.getKeys().size());
} }
@Test @Test
@ -143,16 +144,19 @@ public class TbCopyKeysNodeTest {
} }
@Test @Test
void givenMsgDataNotJSONObject_whenOnMsg_thenTellFailure() throws Exception { void givenMsgDataNotJSONObject_whenOnMsg_thenTVerifyOutput() throws Exception {
String data = "[]"; 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<TbMsg> newMsgCaptor = ArgumentCaptor.forClass(TbMsg.class);
ArgumentCaptor<Exception> exceptionCaptor = ArgumentCaptor.forClass(Exception.class); verify(ctx, times(1)).tellSuccess(newMsgCaptor.capture());
verify(ctx, never()).tellSuccess(any()); verify(ctx, never()).tellFailure(any(), any());
verify(ctx, times(1)).tellFailure(newMsgCaptor.capture(), exceptionCaptor.capture());
assertThat(exceptionCaptor.getValue()).isInstanceOf(RuntimeException.class); TbMsg newMsg = newMsgCaptor.getValue();
assertThat(newMsg).isNotNull();
assertThat(newMsg).isSameAs(msg);
} }
private TbMsg getTbMsg(EntityId entityId, String data) { 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); return TbMsg.newMsg("POST_ATTRIBUTES_REQUEST", entityId, new TbMsgMetaData(mdMap), data, callback);
} }
}
}

Loading…
Cancel
Save