Browse Source

updated EntityFieldsData getFieldValue method to filter out empty strings if ignoreNullStrings is set to true

pull/8786/head
ShvaykaD 3 years ago
parent
commit
6c74aa3dff
  1. 26
      common/data/src/main/java/org/thingsboard/server/common/data/EntityFieldsData.java
  2. 4
      common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java
  3. 42
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNodeTest.java

26
common/data/src/main/java/org/thingsboard/server/common/data/EntityFieldsData.java

@ -68,20 +68,22 @@ public class EntityFieldsData {
break;
}
}
if (current != null) {
if(current.isNull() && ignoreNullStrings){
if (current == null) {
return null;
}
if (current.isNull() && ignoreNullStrings) {
return null;
}
if (current.isValueNode()) {
String textValue = current.asText();
if (StringUtils.isEmpty(textValue) && ignoreNullStrings) {
return null;
}
if (current.isValueNode()) {
return current.asText();
} else {
try {
return mapper.writeValueAsString(current);
} catch (JsonProcessingException e) {
return null;
}
}
} else {
return textValue;
}
try {
return mapper.writeValueAsString(current);
} catch (JsonProcessingException e) {
return null;
}
}

4
common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java

@ -38,7 +38,7 @@ public class StringUtils {
}
public static boolean isBlank(String source) {
return source == null || source.isEmpty() || source.trim().isEmpty();
return isEmpty(source) || source.trim().isEmpty();
}
public static boolean isNotEmpty(String source) {
@ -46,7 +46,7 @@ public class StringUtils {
}
public static boolean isNotBlank(String source) {
return source != null && !source.isEmpty() && !source.trim().isEmpty();
return !isBlank(source);
}
public static String notBlankOrDefault(String src, String def) {

42
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNodeTest.java

@ -184,6 +184,48 @@ public class TbGetOriginatorFieldsNodeTest {
assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msgMetaData);
}
@Test
public void givenDeviceWithEmptyLabel_whenOnMsg_thenShouldTellSuccessAndFetchToData() throws TbNodeException, ExecutionException, InterruptedException {
// GIVEN
var device = new Device();
device.setId(DUMMY_DEVICE_ORIGINATOR);
device.setName("Test device");
device.setType("Test device type");
device.setLabel("");
config.setDataMapping(Map.of(
"name", "originatorName",
"type", "originatorType",
"label", "originatorLabel"));
config.setIgnoreNullStrings(true);
config.setFetchTo(FetchTo.DATA);
node.config = config;
node.fetchTo = FetchTo.DATA;
var msgMetaData = new TbMsgMetaData();
var msgData = "{\"temp\":42,\"humidity\":77}";
msg = TbMsg.newMsg(POST_TELEMETRY_REQUEST.name(), DUMMY_DEVICE_ORIGINATOR, msgMetaData, msgData);
when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock);
when(ctxMock.getTenantId()).thenReturn(DUMMY_TENANT_ID);
when(deviceServiceMock.findDeviceById(eq(DUMMY_TENANT_ID), eq(device.getId()))).thenReturn(device);
when(ctxMock.getDbCallbackExecutor()).thenReturn(DB_EXECUTOR);
// WHEN
node.onMsg(ctxMock, msg);
// THEN
var actualMessageCaptor = ArgumentCaptor.forClass(TbMsg.class);
verify(ctxMock, times(1)).tellSuccess(actualMessageCaptor.capture());
verify(ctxMock, never()).tellFailure(any(), any());
var expectedMsgData = "{\"temp\":42,\"humidity\":77,\"originatorName\":\"Test device\",\"originatorType\":\"Test device type\"}";
assertThat(actualMessageCaptor.getValue().getData()).isEqualTo(expectedMsgData);
assertThat(actualMessageCaptor.getValue().getMetaData()).isEqualTo(msgMetaData);
}
@Test
public void givenValidMsgAndFetchToMetaData_whenOnMsg_thenShouldTellSuccessAndFetchToMetaData() throws TbNodeException, ExecutionException, InterruptedException {
// GIVEN

Loading…
Cancel
Save