diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java index 243a840f51..2d8440fa20 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java @@ -23,13 +23,6 @@ import org.thingsboard.server.common.data.id.EntityIdFactory; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; -import org.thingsboard.server.common.data.kv.BasicTsKvEntry; -import org.thingsboard.server.common.data.kv.BooleanDataEntry; -import org.thingsboard.server.common.data.kv.DoubleDataEntry; -import org.thingsboard.server.common.data.kv.JsonDataEntry; -import org.thingsboard.server.common.data.kv.KvEntry; -import org.thingsboard.server.common.data.kv.LongDataEntry; -import org.thingsboard.server.common.data.kv.StringDataEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.gen.transport.TransportProtos; @@ -55,8 +48,9 @@ import java.util.Map; import java.util.TreeMap; import java.util.UUID; -import static org.thingsboard.server.common.util.KvProtoUtil.fromKeyValueTypeProto; -import static org.thingsboard.server.common.util.KvProtoUtil.toKeyValueTypeProto; +import static org.thingsboard.server.common.util.KvProtoUtil.fromTsValueProtoList; +import static org.thingsboard.server.common.util.KvProtoUtil.toTsKvProtoBuilder; +import static org.thingsboard.server.common.util.KvProtoUtil.toTsValueProto; public class TbSubscriptionUtils { @@ -332,48 +326,4 @@ public class TbSubscriptionUtils { return ToCoreNotificationMsg.newBuilder().setToLocalSubscriptionServiceMsg(result).build(); } - public static TransportProtos.TsKvProto.Builder toTsKvProtoBuilder(long ts, KvEntry attr) { - TransportProtos.KeyValueProto.Builder dataBuilder = TransportProtos.KeyValueProto.newBuilder(); - dataBuilder.setKey(attr.getKey()); - dataBuilder.setType(toKeyValueTypeProto(attr.getDataType())); - switch (attr.getDataType()) { - case BOOLEAN -> attr.getBooleanValue().ifPresent(dataBuilder::setBoolV); - case LONG -> attr.getLongValue().ifPresent(dataBuilder::setLongV); - case DOUBLE -> attr.getDoubleValue().ifPresent(dataBuilder::setDoubleV); - case JSON -> attr.getJsonValue().ifPresent(dataBuilder::setJsonV); - case STRING -> attr.getStrValue().ifPresent(dataBuilder::setStringV); - } - return TransportProtos.TsKvProto.newBuilder().setTs(ts).setKv(dataBuilder); - } - - public static TransportProtos.TsValueProto toTsValueProto(long ts, KvEntry attr) { - TransportProtos.TsValueProto.Builder dataBuilder = TransportProtos.TsValueProto.newBuilder(); - dataBuilder.setTs(ts); - dataBuilder.setType(toKeyValueTypeProto(attr.getDataType())); - switch (attr.getDataType()) { - case BOOLEAN -> attr.getBooleanValue().ifPresent(dataBuilder::setBoolV); - case LONG -> attr.getLongValue().ifPresent(dataBuilder::setLongV); - case DOUBLE -> attr.getDoubleValue().ifPresent(dataBuilder::setDoubleV); - case JSON -> attr.getJsonValue().ifPresent(dataBuilder::setJsonV); - case STRING -> attr.getStrValue().ifPresent(dataBuilder::setStringV); - } - return dataBuilder.build(); - } - - private static List fromTsValueProtoList(String key, List dataList) { - List result = new ArrayList<>(dataList.size()); - dataList.forEach(proto -> result.add(new BasicTsKvEntry(proto.getTs(), fromTsKvProto(key, proto)))); - return result; - } - - private static KvEntry fromTsKvProto(String key, TransportProtos.TsValueProto proto) { - return switch (fromKeyValueTypeProto(proto.getType())) { - case BOOLEAN -> new BooleanDataEntry(key, proto.getBoolV()); - case LONG -> new LongDataEntry(key, proto.getLongV()); - case DOUBLE -> new DoubleDataEntry(key, proto.getDoubleV()); - case STRING -> new StringDataEntry(key, proto.getStringV()); - case JSON -> new JsonDataEntry(key, proto.getJsonV()); - }; - } - } diff --git a/common/proto/src/main/java/org/thingsboard/server/common/util/KvProtoUtil.java b/common/proto/src/main/java/org/thingsboard/server/common/util/KvProtoUtil.java index 14368693c5..74674e1e45 100644 --- a/common/proto/src/main/java/org/thingsboard/server/common/util/KvProtoUtil.java +++ b/common/proto/src/main/java/org/thingsboard/server/common/util/KvProtoUtil.java @@ -114,6 +114,40 @@ public class KvProtoUtil { }; } + public static TransportProtos.TsKvProto.Builder toTsKvProtoBuilder(long ts, KvEntry kvEntry) { + return TransportProtos.TsKvProto.newBuilder().setTs(ts).setKv(KvProtoUtil.toKeyValueTypeProto(kvEntry)); + } + + public static List fromTsValueProtoList(String key, List dataList) { + List result = new ArrayList<>(dataList.size()); + dataList.forEach(proto -> result.add(new BasicTsKvEntry(proto.getTs(), fromTsValueProto(key, proto)))); + return result; + } + + public static TransportProtos.TsValueProto toTsValueProto(long ts, KvEntry attr) { + TransportProtos.TsValueProto.Builder dataBuilder = TransportProtos.TsValueProto.newBuilder(); + dataBuilder.setTs(ts); + dataBuilder.setType(toKeyValueTypeProto(attr.getDataType())); + switch (attr.getDataType()) { + case BOOLEAN -> attr.getBooleanValue().ifPresent(dataBuilder::setBoolV); + case LONG -> attr.getLongValue().ifPresent(dataBuilder::setLongV); + case DOUBLE -> attr.getDoubleValue().ifPresent(dataBuilder::setDoubleV); + case JSON -> attr.getJsonValue().ifPresent(dataBuilder::setJsonV); + case STRING -> attr.getStrValue().ifPresent(dataBuilder::setStringV); + } + return dataBuilder.build(); + } + + public static KvEntry fromTsValueProto(String key, TransportProtos.TsValueProto proto) { + return switch (fromKeyValueTypeProto(proto.getType())) { + case BOOLEAN -> new BooleanDataEntry(key, proto.getBoolV()); + case LONG -> new LongDataEntry(key, proto.getLongV()); + case DOUBLE -> new DoubleDataEntry(key, proto.getDoubleV()); + case STRING -> new StringDataEntry(key, proto.getStringV()); + case JSON -> new JsonDataEntry(key, proto.getJsonV()); + }; + } + public static TransportProtos.KeyValueType toKeyValueTypeProto(DataType dataType) { return TransportProtos.KeyValueType.forNumber(dataType.getProtoNumber()); } diff --git a/common/proto/src/test/java/org/thingsboard/server/common/util/KvProtoUtilTest.java b/common/proto/src/test/java/org/thingsboard/server/common/util/KvProtoUtilTest.java index 1fbfaf52d9..72d71c7c93 100644 --- a/common/proto/src/test/java/org/thingsboard/server/common/util/KvProtoUtilTest.java +++ b/common/proto/src/test/java/org/thingsboard/server/common/util/KvProtoUtilTest.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.common.util; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; @@ -58,8 +57,8 @@ class KvProtoUtilTest { return kvEntryData().map(kvEntry -> new BasicTsKvEntry(TS, kvEntry)); } - private static Stream attributeKvEntryData() { - return kvEntryData().map(kvEntry -> new BaseAttributeKvEntry(TS, kvEntry)); + private static Stream> attributeKvEntryData() { + return Stream.of(kvEntryData().map(kvEntry -> new BaseAttributeKvEntry(TS, kvEntry)).toList()); } private static List createTsKvEntryList(boolean withAggregation) { @@ -75,23 +74,29 @@ class KvProtoUtilTest { @ParameterizedTest @EnumSource(DataType.class) void protoDataTypeSerialization(DataType dataType) { - assertThat(KvProtoUtil.fromKeyValueTypeProto(KvProtoUtil.toKeyValueTypeProto(dataType))).as(dataType.name()).isEqualTo(dataType); + assertThat(KvProtoUtil.fromKeyValueTypeProto(KvProtoUtil.toKeyValueTypeProto(dataType))) + .as(dataType.name()).isEqualTo(dataType); } @ParameterizedTest @MethodSource("kvEntryData") void protoKeyValueProtoSerialization(KvEntry kvEntry) { assertThat(KvProtoUtil.fromTsKvProto(KvProtoUtil.toKeyValueTypeProto(kvEntry))) - .as("deserialized") - .isEqualTo(kvEntry); + .as("deserialized").isEqualTo(kvEntry); } @ParameterizedTest @MethodSource("basicTsKvEntryData") void protoTsKvEntrySerialization(KvEntry kvEntry) { assertThat(KvProtoUtil.fromTsKvProto(KvProtoUtil.toTsKvProto(TS, kvEntry))) - .as("deserialized") - .isEqualTo(kvEntry); + .as("deserialized").isEqualTo(kvEntry); + } + + @ParameterizedTest + @MethodSource("kvEntryData") + void protoTsValueSerialization(KvEntry kvEntry) { + assertThat(KvProtoUtil.fromTsValueProto(kvEntry.getKey(), KvProtoUtil.toTsValueProto(TS, kvEntry))) + .as("deserialized").isEqualTo(kvEntry); } @ParameterizedTest @@ -99,16 +104,15 @@ class KvProtoUtilTest { void protoListTsKvEntrySerialization(boolean withAggregation) { List tsKvEntries = createTsKvEntryList(withAggregation); assertThat(KvProtoUtil.fromTsKvProtoList(KvProtoUtil.toTsKvProtoList(tsKvEntries))) - .as("deserialized") - .isEqualTo(tsKvEntries); + .as("deserialized").isEqualTo(tsKvEntries); } - @Test - void protoListAttributeKvSerialization() { - List protoList = attributeKvEntryData().toList(); - assertThat(KvProtoUtil.toAttributeKvList(KvProtoUtil.attrToTsKvProtos(protoList))) + @ParameterizedTest + @MethodSource("attributeKvEntryData") + void protoListAttributeKvSerialization(List attributeKvEntries) { + assertThat(KvProtoUtil.toAttributeKvList(KvProtoUtil.attrToTsKvProtos(attributeKvEntries))) .as("deserialized") - .isEqualTo(protoList); + .isEqualTo(attributeKvEntries); } }