Fix for test script node function

This commit is contained in:
zbeacon 2021-03-16 14:43:22 +02:00 committed by Andrew Shvayka
parent 9746df84ea
commit 52d1b756fa
3 changed files with 28 additions and 4 deletions

View File

@ -18,6 +18,7 @@ package org.thingsboard.server.controller;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -432,4 +433,22 @@ public class RuleChainController extends BaseController {
return objectMapper.writeValueAsString(msgData);
}
private String msgToOutput(List<TbMsg> msgs) throws Exception {
ArrayNode resultNode = objectMapper.createArrayNode();
for (TbMsg msg:msgs) {
ObjectNode msgData = objectMapper.createObjectNode();
if (!StringUtils.isEmpty(msg.getData())) {
msgData.set("msg", objectMapper.readTree(msg.getData()));
}
Map<String, String> metadata = msg.getMetaData().getData();
msgData.set("metadata", objectMapper.valueToTree(metadata));
msgData.put("msgType", msg.getType());
resultNode.add(msgData);
}
if (resultNode.size() == 1) {
return objectMapper.writeValueAsString(resultNode.get(0));
}
return objectMapper.writeValueAsString(resultNode);
}
}

View File

@ -108,13 +108,18 @@ public class RuleNodeJsScriptEngine implements org.thingsboard.rule.engine.api.S
}
@Override
public TbMsg executeUpdate(TbMsg msg) throws ScriptException {
public List<TbMsg> executeUpdate(TbMsg msg) throws ScriptException {
JsonNode result = executeScript(msg);
if (!result.isObject()) {
if (result.isObject()) {
return Collections.singletonList(unbindMsg(result, msg));
} else if (result.isArray()){
List<TbMsg> res = new ArrayList<>(result.size());
result.forEach(jsonObject -> res.add(unbindMsg(jsonObject, msg)));
return res;
} else {
log.warn("Wrong result type: {}", result.getNodeType());
throw new ScriptException("Wrong result type: " + result.getNodeType());
}
return unbindMsg(result, msg);
}
@Override

View File

@ -25,7 +25,7 @@ import java.util.Set;
public interface ScriptEngine {
TbMsg executeUpdate(TbMsg msg) throws ScriptException;
List<TbMsg> executeUpdate(TbMsg msg) throws ScriptException;
ListenableFuture<List<TbMsg>> executeUpdateAsync(TbMsg msg);