diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java index 1913acaded..6d93638657 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java @@ -15,8 +15,7 @@ */ package org.thingsboard.rule.engine.filter; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; +import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.TbContext; @@ -43,7 +42,7 @@ import java.util.Map; configDirective = "tbFilterNodeCheckMessageConfig") public class TbCheckMessageNode implements TbNode { - private static final JsonParser parser = new JsonParser(); + private static final Gson gson = new Gson(); private TbCheckMessageNodeConfiguration config; private List messageNamesList; @@ -59,20 +58,22 @@ public class TbCheckMessageNode implements TbNode { @Override public void onMsg(TbContext ctx, TbMsg msg) { try { + Map dataMap = dataToMap(msg); + Map metadataMap = metadataToMap(msg); if (config.isCheckAllKeys()) { - ctx.tellNext(msg, allDataKeysExist(msg) && allMetadataKeysExist(msg) ? "True" : "False"); + ctx.tellNext(msg, allKeysExist(messageNamesList, dataMap) && allKeysExist(metadataNamesList, metadataMap) ? "True" : "False"); } else { - ctx.tellNext(msg, atLeastOneDataKeyExist(msg) || atLeastOneMetadataKeyExist(msg) ? "True" : "False"); + ctx.tellNext(msg, atLeastOneKeyExist(messageNamesList, dataMap) || atLeastOneKeyExist(metadataNamesList, metadataMap) ? "True" : "False"); } } catch (Exception e) { ctx.tellFailure(msg, e); } } - private boolean allDataKeysExist(TbMsg msg) { - if (!messageNamesList.isEmpty()) { - for (String field : messageNamesList) { - if (!toJson(msg).has(field)) { + private boolean allKeysExist(List data, Map map) { + if (!data.isEmpty()) { + for (String field : data) { + if (!map.containsKey(field)) { return false; } } @@ -81,10 +82,10 @@ public class TbCheckMessageNode implements TbNode { return true; } - private boolean atLeastOneDataKeyExist(TbMsg msg) { - if (!messageNamesList.isEmpty()) { - for (String field : messageNamesList) { - if (toJson(msg).has(field)) { + private boolean atLeastOneKeyExist(List data, Map map) { + if (!data.isEmpty()) { + for (String field : data) { + if (map.containsKey(field)) { return true; } } @@ -93,36 +94,13 @@ public class TbCheckMessageNode implements TbNode { return false; } - private boolean allMetadataKeysExist(TbMsg msg) { - if (!metadataNamesList.isEmpty()) { - for (String field : metadataNamesList) { - if (!toMap(msg).containsKey(field)) { - return false; - } - } - return true; - } - return true; - } - - private boolean atLeastOneMetadataKeyExist(TbMsg msg) { - if (!metadataNamesList.isEmpty()) { - for (String field : metadataNamesList) { - if (toMap(msg).containsKey(field)) { - return true; - } - } - return false; - } - return false; - } - - private Map toMap(TbMsg msg) { + private Map metadataToMap(TbMsg msg) { return msg.getMetaData().getData(); } - private JsonObject toJson(TbMsg msg) { - return parser.parse(msg.getData()).getAsJsonObject(); + @SuppressWarnings("unchecked") + private Map dataToMap(TbMsg msg) { ; + return (Map) gson.fromJson(msg.getData(), Map.class); } @Override