From 62db6001fd12fbf32fd1e2298ecca041a2741e0f Mon Sep 17 00:00:00 2001 From: vparomskiy Date: Thu, 1 Nov 2018 11:00:44 +0200 Subject: [PATCH] cast incoming attributes/telemetry numeric data type if possible --- .../transport/adaptor/JsonConverter.java | 55 ++++++++++++++----- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java index 7498e8ee2a..b497fe08ea 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java @@ -22,6 +22,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSyntaxException; +import org.apache.commons.lang3.math.NumberUtils; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.kv.AttributeKey; import org.thingsboard.server.common.data.kv.AttributeKvEntry; @@ -128,24 +129,22 @@ public class JsonConverter { if (element.isJsonPrimitive()) { JsonPrimitive value = element.getAsJsonPrimitive(); if (value.isString()) { - result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.STRING_V) - .setStringV(value.getAsString()).build()); + if(NumberUtils.isParsable(value.getAsString())) { + try { + result.add(buildNumericKeyValueProto(value, valueEntry.getKey())); + } catch (Throwable th) { + result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.STRING_V) + .setStringV(value.getAsString()).build()); + } + } else { + result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.STRING_V) + .setStringV(value.getAsString()).build()); + } } else if (value.isBoolean()) { result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.BOOLEAN_V) .setBoolV(value.getAsBoolean()).build()); } else if (value.isNumber()) { - if (value.getAsString().contains(".")) { - result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.DOUBLE_V) - .setDoubleV(value.getAsDouble()).build()); - } else { - try { - long longValue = Long.parseLong(value.getAsString()); - result.add(KeyValueProto.newBuilder().setKey(valueEntry.getKey()).setType(KeyValueType.LONG_V) - .setLongV(longValue).build()); - } catch (NumberFormatException e) { - throw new JsonSyntaxException("Big integer values are not supported!"); - } - } + result.add(buildNumericKeyValueProto(value, valueEntry.getKey())); } else { throw new JsonSyntaxException(CAN_T_PARSE_VALUE + value); } @@ -156,6 +155,24 @@ public class JsonConverter { return result; } + private static KeyValueProto buildNumericKeyValueProto(JsonPrimitive value, String key) { + if (value.getAsString().contains(".")) { + return KeyValueProto.newBuilder() + .setKey(key) + .setType(KeyValueType.DOUBLE_V) + .setDoubleV(value.getAsDouble()) + .build(); + } else { + try { + long longValue = Long.parseLong(value.getAsString()); + return KeyValueProto.newBuilder().setKey(key).setType(KeyValueType.LONG_V) + .setLongV(longValue).build(); + } catch (NumberFormatException e) { + throw new JsonSyntaxException("Big integer values are not supported!"); + } + } + } + public static TransportProtos.ToServerRpcRequestMsg convertToServerRpcRequest(JsonElement json, int requestId) throws JsonSyntaxException { JsonObject object = json.getAsJsonObject(); return TransportProtos.ToServerRpcRequestMsg.newBuilder().setRequestId(requestId).setMethodName(object.get("method").getAsString()).setParams(GSON.toJson(object.get("params"))).build(); @@ -370,7 +387,15 @@ public class JsonConverter { if (element.isJsonPrimitive()) { JsonPrimitive value = element.getAsJsonPrimitive(); if (value.isString()) { - result.add(new StringDataEntry(valueEntry.getKey(), value.getAsString())); + if(NumberUtils.isParsable(value.getAsString())) { + try { + parseNumericValue(result, valueEntry, value); + } catch (Throwable th) { + result.add(new StringDataEntry(valueEntry.getKey(), value.getAsString())); + } + } else { + result.add(new StringDataEntry(valueEntry.getKey(), value.getAsString())); + } } else if (value.isBoolean()) { result.add(new BooleanDataEntry(valueEntry.getKey(), value.getAsBoolean())); } else if (value.isNumber()) {