Merge branch 'hotfix/3.6.1'

This commit is contained in:
Andrii Shvaika 2023-11-15 15:58:41 +02:00
commit 8986af4abf
4 changed files with 21 additions and 8 deletions

View File

@ -155,7 +155,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
if (ruleChain == null) { if (ruleChain == null) {
return RuleChainUpdateResult.failed(); return RuleChainUpdateResult.failed();
} }
RuleChainDataValidator.validateMetaData(ruleChainMetaData); RuleChainDataValidator.validateMetaDataFieldsAndConnections(ruleChainMetaData);
List<RuleNode> nodes = ruleChainMetaData.getNodes(); List<RuleNode> nodes = ruleChainMetaData.getNodes();
List<RuleNode> toAddOrUpdate = new ArrayList<>(); List<RuleNode> toAddOrUpdate = new ArrayList<>();
@ -194,6 +194,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
for (RuleNode node : toAddOrUpdate) { for (RuleNode node : toAddOrUpdate) {
node.setRuleChainId(ruleChainId); node.setRuleChainId(ruleChainId);
node = ruleNodeUpdater.apply(node); node = ruleNodeUpdater.apply(node);
RuleChainDataValidator.validateRuleNode(node);
RuleNode savedNode = ruleNodeDao.save(tenantId, node); RuleNode savedNode = ruleNodeDao.save(tenantId, node);
relations.add(new EntityRelation(ruleChainMetaData.getRuleChainId(), savedNode.getId(), relations.add(new EntityRelation(ruleChainMetaData.getRuleChainId(), savedNode.getId(),
EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN));

View File

@ -87,15 +87,18 @@ public class RuleChainDataValidator extends DataValidator<RuleChain> {
} }
public static List<Throwable> validateMetaData(RuleChainMetaData ruleChainMetaData) { public static List<Throwable> validateMetaData(RuleChainMetaData ruleChainMetaData) {
ConstraintValidator.validateFields(ruleChainMetaData); validateMetaDataFieldsAndConnections(ruleChainMetaData);
List<Throwable> throwables = ruleChainMetaData.getNodes().stream() return ruleChainMetaData.getNodes().stream()
.map(RuleChainDataValidator::validateRuleNode) .map(RuleChainDataValidator::validateRuleNode)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());
}
public static void validateMetaDataFieldsAndConnections(RuleChainMetaData ruleChainMetaData) {
ConstraintValidator.validateFields(ruleChainMetaData);
if (CollectionUtils.isNotEmpty(ruleChainMetaData.getConnections())) { if (CollectionUtils.isNotEmpty(ruleChainMetaData.getConnections())) {
validateCircles(ruleChainMetaData.getConnections()); validateCircles(ruleChainMetaData.getConnections());
} }
return throwables;
} }
public static Throwable validateRuleNode(RuleNode ruleNode) { public static Throwable validateRuleNode(RuleNode ruleNode) {

View File

@ -89,7 +89,9 @@ public class TbCopyKeysNode implements TbNode {
String keyData = entry.getKey(); String keyData = entry.getKey();
if (checkKey(keyData)) { if (checkKey(keyData)) {
msgChanged = true; msgChanged = true;
metaData.putValue(keyData, JacksonUtil.toString(entry.getValue())); String value = entry.getValue().isTextual() ?
entry.getValue().asText() : JacksonUtil.toString(entry.getValue());
metaData.putValue(keyData, value);
} }
} }
} }

View File

@ -96,10 +96,12 @@ public class TbCopyKeysNodeTest {
@Test @Test
void givenMsgFromMsg_whenOnMsg_thenVerifyOutput() throws Exception { void givenMsgFromMsg_whenOnMsg_thenVerifyOutput() throws Exception {
config.setFromMetadata(false); config.setFromMetadata(false);
config.setKeys(Set.of(".*Key$"));
nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
String data = "{\"DigitData\":22.5,\"TempDataValue\":10.5}"; String data = "{\"nullKey\":null,\"stringKey\":\"value1\",\"booleanKey\":true,\"doubleKey\":42.0,\"longKey\":73," +
"\"jsonKey\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}}";
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);
@ -110,8 +112,13 @@ public class TbCopyKeysNodeTest {
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(true); assertThat(metaDataMap.get("nullKey")).isEqualTo("null");
assertThat(metaDataMap.containsKey("TempDataValue")).isEqualTo(true); assertThat(metaDataMap.get("stringKey")).isEqualTo("value1");
assertThat(metaDataMap.get("booleanKey")).isEqualTo("true");
assertThat(metaDataMap.get("doubleKey")).isEqualTo("42.0");
assertThat(metaDataMap.get("longKey")).isEqualTo("73");
assertThat(metaDataMap.get("jsonKey"))
.isEqualTo("{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}");
} }
@Test @Test