@ -23,10 +23,8 @@ 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.BaseAttributeKvEntry ;
import org.thingsboard.server.common.data.kv.BasicTsKvEntry ;
import org.thingsboard.server.common.data.kv.BooleanDataEntry ;
import org.thingsboard.server.common.data.kv.DataType ;
import org.thingsboard.server.common.data.kv.DoubleDataEntry ;
import org.thingsboard.server.common.data.kv.JsonDataEntry ;
import org.thingsboard.server.common.data.kv.KvEntry ;
@ -35,8 +33,6 @@ 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 ;
import org.thingsboard.server.gen.transport.TransportProtos.KeyValueProto ;
import org.thingsboard.server.gen.transport.TransportProtos.KeyValueType ;
import org.thingsboard.server.gen.transport.TransportProtos.SubscriptionMgrMsgProto ;
import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmDeleteProto ;
import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmUpdateProto ;
@ -47,7 +43,6 @@ import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesDeletePr
import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesUpdateProto ;
import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg ;
import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg ;
import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto ;
import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate ;
import org.thingsboard.server.service.ws.notification.sub.NotificationUpdate ;
import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate ;
@ -60,6 +55,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 ;
public class TbSubscriptionUtils {
public static ToCoreMsg toSubEventProto ( String serviceId , TbEntitySubEvent event ) {
@ -181,7 +179,7 @@ public class TbSubscriptionUtils {
builder . setEntityIdLSB ( entityId . getId ( ) . getLeastSignificantBits ( ) ) ;
builder . setTenantIdMSB ( tenantId . getId ( ) . getMostSignificantBits ( ) ) ;
builder . setTenantIdLSB ( tenantId . getId ( ) . getLeastSignificantBits ( ) ) ;
ts . forEach ( v - > builder . addData ( toKeyValueProto ( v . getTs ( ) , v ) . build ( ) ) ) ;
ts . forEach ( v - > builder . addData ( toTsKvProtoBuilder ( v . getTs ( ) , v ) . build ( ) ) ) ;
SubscriptionMgrMsgProto . Builder msgBuilder = SubscriptionMgrMsgProto . newBuilder ( ) ;
msgBuilder . setTsUpdate ( builder ) ;
return ToCoreMsg . newBuilder ( ) . setToSubscriptionMgrMsg ( msgBuilder . build ( ) ) . build ( ) ;
@ -208,7 +206,7 @@ public class TbSubscriptionUtils {
builder . setTenantIdMSB ( tenantId . getId ( ) . getMostSignificantBits ( ) ) ;
builder . setTenantIdLSB ( tenantId . getId ( ) . getLeastSignificantBits ( ) ) ;
builder . setScope ( scope ) ;
attributes . forEach ( v - > builder . addData ( toKeyValueProto ( v . getLastUpdateTs ( ) , v ) . build ( ) ) ) ;
attributes . forEach ( v - > builder . addData ( toTsKvProtoBuilder ( v . getLastUpdateTs ( ) , v ) . build ( ) ) ) ;
SubscriptionMgrMsgProto . Builder msgBuilder = SubscriptionMgrMsgProto . newBuilder ( ) ;
msgBuilder . setAttrUpdate ( builder ) ;
@ -231,123 +229,10 @@ public class TbSubscriptionUtils {
return ToCoreMsg . newBuilder ( ) . setToSubscriptionMgrMsg ( msgBuilder . build ( ) ) . build ( ) ;
}
private static TsKvProto . Builder toKeyValueProto ( long ts , KvEntry attr ) {
KeyValueProto . Builder dataBuilder = KeyValueProto . newBuilder ( ) ;
dataBuilder . setKey ( attr . getKey ( ) ) ;
dataBuilder . setType ( KeyValueType . forNumber ( attr . getDataType ( ) . ordinal ( ) ) ) ;
switch ( attr . getDataType ( ) ) {
case BOOLEAN :
attr . getBooleanValue ( ) . ifPresent ( dataBuilder : : setBoolV ) ;
break ;
case LONG :
attr . getLongValue ( ) . ifPresent ( dataBuilder : : setLongV ) ;
break ;
case DOUBLE :
attr . getDoubleValue ( ) . ifPresent ( dataBuilder : : setDoubleV ) ;
break ;
case JSON :
attr . getJsonValue ( ) . ifPresent ( dataBuilder : : setJsonV ) ;
break ;
case STRING :
attr . getStrValue ( ) . ifPresent ( dataBuilder : : setStringV ) ;
break ;
}
return TsKvProto . newBuilder ( ) . setTs ( ts ) . setKv ( dataBuilder ) ;
}
private static TransportProtos . TsValueProto toTsValueProto ( long ts , KvEntry attr ) {
TransportProtos . TsValueProto . Builder dataBuilder = TransportProtos . TsValueProto . newBuilder ( ) ;
dataBuilder . setTs ( ts ) ;
dataBuilder . setType ( KeyValueType . forNumber ( attr . getDataType ( ) . ordinal ( ) ) ) ;
switch ( attr . getDataType ( ) ) {
case BOOLEAN :
attr . getBooleanValue ( ) . ifPresent ( dataBuilder : : setBoolV ) ;
break ;
case LONG :
attr . getLongValue ( ) . ifPresent ( dataBuilder : : setLongV ) ;
break ;
case DOUBLE :
attr . getDoubleValue ( ) . ifPresent ( dataBuilder : : setDoubleV ) ;
break ;
case JSON :
attr . getJsonValue ( ) . ifPresent ( dataBuilder : : setJsonV ) ;
break ;
case STRING :
attr . getStrValue ( ) . ifPresent ( dataBuilder : : setStringV ) ;
break ;
}
return dataBuilder . build ( ) ;
}
public static EntityId toEntityId ( String entityType , long entityIdMSB , long entityIdLSB ) {
return EntityIdFactory . getByTypeAndUuid ( entityType , new UUID ( entityIdMSB , entityIdLSB ) ) ;
}
public static List < TsKvEntry > toTsKvEntityList ( List < TsKvProto > dataList ) {
List < TsKvEntry > result = new ArrayList < > ( dataList . size ( ) ) ;
dataList . forEach ( proto - > result . add ( new BasicTsKvEntry ( proto . getTs ( ) , getKvEntry ( proto . getKv ( ) ) ) ) ) ;
return result ;
}
public static List < AttributeKvEntry > toAttributeKvList ( List < TsKvProto > dataList ) {
List < AttributeKvEntry > result = new ArrayList < > ( dataList . size ( ) ) ;
dataList . forEach ( proto - > result . add ( new BaseAttributeKvEntry ( getKvEntry ( proto . getKv ( ) ) , proto . getTs ( ) ) ) ) ;
return result ;
}
private static KvEntry getKvEntry ( KeyValueProto proto ) {
KvEntry entry = null ;
DataType type = DataType . values ( ) [ proto . getType ( ) . getNumber ( ) ] ;
switch ( type ) {
case BOOLEAN :
entry = new BooleanDataEntry ( proto . getKey ( ) , proto . getBoolV ( ) ) ;
break ;
case LONG :
entry = new LongDataEntry ( proto . getKey ( ) , proto . getLongV ( ) ) ;
break ;
case DOUBLE :
entry = new DoubleDataEntry ( proto . getKey ( ) , proto . getDoubleV ( ) ) ;
break ;
case STRING :
entry = new StringDataEntry ( proto . getKey ( ) , proto . getStringV ( ) ) ;
break ;
case JSON :
entry = new JsonDataEntry ( proto . getKey ( ) , proto . getJsonV ( ) ) ;
break ;
}
return entry ;
}
public static List < TsKvEntry > toTsKvEntityList ( String key , List < TransportProtos . TsValueProto > dataList ) {
List < TsKvEntry > result = new ArrayList < > ( dataList . size ( ) ) ;
dataList . forEach ( proto - > result . add ( new BasicTsKvEntry ( proto . getTs ( ) , getKvEntry ( key , proto ) ) ) ) ;
return result ;
}
private static KvEntry getKvEntry ( String key , TransportProtos . TsValueProto proto ) {
KvEntry entry = null ;
DataType type = DataType . values ( ) [ proto . getType ( ) . getNumber ( ) ] ;
switch ( type ) {
case BOOLEAN :
entry = new BooleanDataEntry ( key , proto . getBoolV ( ) ) ;
break ;
case LONG :
entry = new LongDataEntry ( key , proto . getLongV ( ) ) ;
break ;
case DOUBLE :
entry = new DoubleDataEntry ( key , proto . getDoubleV ( ) ) ;
break ;
case STRING :
entry = new StringDataEntry ( key , proto . getStringV ( ) ) ;
break ;
case JSON :
entry = new JsonDataEntry ( key , proto . getJsonV ( ) ) ;
break ;
}
return entry ;
}
public static ToCoreMsg toAlarmUpdateProto ( TenantId tenantId , EntityId entityId , AlarmInfo alarm ) {
TbAlarmUpdateProto . Builder builder = TbAlarmUpdateProto . newBuilder ( ) ;
builder . setEntityType ( entityId . getEntityType ( ) . name ( ) ) ;
@ -405,7 +290,7 @@ public class TbSubscriptionUtils {
public static List < TsKvEntry > fromProto ( TransportProtos . TbSubUpdateProto proto ) {
List < TsKvEntry > result = new ArrayList < > ( ) ;
for ( var p : proto . getDataList ( ) ) {
result . addAll ( toTsKvEntity List( p . getKey ( ) , p . getTsValueList ( ) ) ) ;
result . addAll ( fromTsValueProto List( p . getKey ( ) , p . getTsValueList ( ) ) ) ;
}
return result ;
}
@ -447,4 +332,48 @@ 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 < TsKvEntry > fromTsValueProtoList ( String key , List < TransportProtos . TsValueProto > dataList ) {
List < TsKvEntry > 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 ( ) ) ;
} ;
}
}