Browse Source

Merge e874a91df0 into 9abbcdb40a

pull/15663/merge
Oleksandra Matviienko 3 days ago
committed by GitHub
parent
commit
aa37149d4f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java
  2. 4
      application/src/main/java/org/thingsboard/server/service/notification/channels/MicrosoftTeamsNotificationChannel.java
  3. 2
      application/src/main/java/org/thingsboard/server/service/security/auth/mfa/provider/impl/TotpTwoFaProvider.java
  4. 2
      application/src/main/java/org/thingsboard/server/service/security/model/token/JwtTokenFactory.java
  5. 4
      application/src/main/java/org/thingsboard/server/service/ws/WebSocketSessionType.java
  6. 10
      application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java
  7. 2
      application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java
  8. 2
      application/src/test/java/org/thingsboard/server/controller/AdminControllerTest.java
  9. 6
      application/src/test/java/org/thingsboard/server/controller/AlarmCommentControllerTest.java
  10. 6
      application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest.java
  11. 4
      application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest_DedicatedEventsDataSource.java
  12. 12
      application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java
  13. 2
      application/src/test/java/org/thingsboard/server/controller/BaseQueueControllerTest.java
  14. 6
      application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java
  15. 4
      application/src/test/java/org/thingsboard/server/controller/EdgeEventControllerTest.java
  16. 4
      application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java
  17. 6
      application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java
  18. 4
      application/src/test/java/org/thingsboard/server/controller/RepositorySettingsTest.java
  19. 4
      application/src/test/java/org/thingsboard/server/controller/RuleEngineControllerTest.java
  20. 10
      application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthConfigTest.java
  21. 8
      application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthTest.java
  22. 4
      application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java
  23. 8
      application/src/test/java/org/thingsboard/server/controller/WebSocketApiTest.java
  24. 8
      application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java
  25. 52
      application/src/test/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCacheTest.java
  26. 43
      application/src/test/java/org/thingsboard/server/service/device/provision/DeviceProvisionServiceTest.java
  27. 6
      application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java
  28. 32
      application/src/test/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmServiceTest.java
  29. 34
      application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java
  30. 4
      application/src/test/java/org/thingsboard/server/service/housekeeper/HousekeeperServiceTest.java
  31. 28
      application/src/test/java/org/thingsboard/server/service/install/InstallScriptsTest.java
  32. 6
      application/src/test/java/org/thingsboard/server/service/job/JobManagerTest.java
  33. 2
      application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java
  34. 2
      application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java
  35. 2
      application/src/test/java/org/thingsboard/server/service/notification/NotificationApiWsClient.java
  36. 2
      application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java
  37. 14
      application/src/test/java/org/thingsboard/server/service/profile/DefaultTbAssetProfileCacheTest.java
  38. 14
      application/src/test/java/org/thingsboard/server/service/profile/DefaultTbDeviceProfileCacheTest.java
  39. 47
      application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java
  40. 14
      application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java
  41. 14
      application/src/test/java/org/thingsboard/server/service/sms/DefaultSmsServiceTest.java
  42. 6
      application/src/test/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionServiceTest.java
  43. 10
      application/src/test/java/org/thingsboard/server/service/subscription/TbEntityDataSubCtxTest.java
  44. 2
      application/src/test/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfoTest.java
  45. 6
      application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java
  46. 2
      application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java
  47. 58
      application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java
  48. 6
      application/src/test/java/org/thingsboard/server/service/ttl/AlarmsCleanUpServiceTest.java
  49. 2
      application/src/test/java/org/thingsboard/server/service/ws/DefaultWebSocketServiceTest.java
  50. 8
      application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java
  51. 14
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/AbstractRpcLwM2MIntegrationTest.java
  52. 4
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/diffPort/AbstractLwM2MIntegrationDiffPortTest.java
  53. 4
      application/src/test/java/org/thingsboard/server/transport/mqtt/MqttGatewayRateLimitsTest.java
  54. 4
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/telemetry/timeseries/AbstractMqttTimeseriesIntegrationTest.java
  55. 8
      common/cache/src/main/java/org/thingsboard/server/cache/ota/RedisOtaPackageDataCache.java
  56. 2
      common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java
  57. 2
      common/data/src/main/java/org/thingsboard/server/common/data/EventInfo.java
  58. 2
      common/data/src/main/java/org/thingsboard/server/common/data/HomeDashboard.java
  59. 2
      common/data/src/main/java/org/thingsboard/server/common/data/TenantInfo.java
  60. 1
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmComment.java
  61. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/CoapDeviceTransportConfiguration.java
  62. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/Lwm2mDeviceTransportConfiguration.java
  63. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/bootstrap/LwM2MServerSecurityConfigDefault.java
  64. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeInfo.java
  65. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetFields.java
  66. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetProfileFields.java
  67. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/CustomerFields.java
  68. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DashboardFields.java
  69. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceFields.java
  70. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceProfileFields.java
  71. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EdgeFields.java
  72. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EntityViewFields.java
  73. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/QueueStatsFields.java
  74. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/RuleChainFields.java
  75. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantFields.java
  76. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantProfileFields.java
  77. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/UserFields.java
  78. 2
      common/data/src/main/java/org/thingsboard/server/common/data/job/task/Task.java
  79. 2
      common/data/src/main/java/org/thingsboard/server/common/data/kv/BaseDeleteTsKvQuery.java
  80. 1
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobileLayoutConfig.java
  81. 2
      common/data/src/main/java/org/thingsboard/server/common/data/query/AlarmCountQuery.java
  82. 2
      common/data/src/main/java/org/thingsboard/server/common/data/queue/Queue.java
  83. 2
      common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleNodeState.java
  84. 4
      common/data/src/main/java/org/thingsboard/server/common/data/tenant/profile/DefaultTenantProfileConfiguration.java
  85. 3
      common/data/src/main/java/org/thingsboard/server/common/data/util/CollectionsUtil.java
  86. 2
      common/data/src/main/java/org/thingsboard/server/common/data/util/TemplateUtils.java
  87. 2
      common/data/src/main/java/org/thingsboard/server/common/data/util/TypeCastUtil.java
  88. 2
      common/data/src/main/java/org/thingsboard/server/common/data/widget/WidgetTypeInfo.java
  89. 48
      common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java
  90. 31
      common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java
  91. 2
      common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java
  92. 12
      common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java
  93. 7
      common/transport/http/src/test/java/org/thingsboard/server/transport/http/DeviceApiControllerTest.java
  94. 2
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/DefaultLwM2mDownlinkMsgHandler.java
  95. 12
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java
  96. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2MDtlsSessionRedisStore.java
  97. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2mRedisClientOtaInfoStore.java
  98. 68
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2mRedisRegistrationStore.java
  99. 24
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2mRedisSecurityStore.java
  100. 10
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbRedisLwM2MClientStore.java

2
application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java

@ -335,7 +335,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
private String generateRandomKey() {
return Base64.getEncoder().encodeToString(
RandomStringUtils.randomAlphanumeric(64).getBytes(StandardCharsets.UTF_8));
RandomStringUtils.secure().nextAlphanumeric(64).getBytes(StandardCharsets.UTF_8));
}
@Override

4
application/src/main/java/org/thingsboard/server/service/notification/channels/MicrosoftTeamsNotificationChannel.java

@ -54,8 +54,8 @@ public class MicrosoftTeamsNotificationChannel implements NotificationChannel<Mi
@Setter
private RestTemplate restTemplate = new RestTemplateBuilder()
.setConnectTimeout(Duration.of(15, ChronoUnit.SECONDS))
.setReadTimeout(Duration.of(15, ChronoUnit.SECONDS))
.connectTimeout(Duration.of(15, ChronoUnit.SECONDS))
.readTimeout(Duration.of(15, ChronoUnit.SECONDS))
.build();
@Override

2
application/src/main/java/org/thingsboard/server/service/security/auth/mfa/provider/impl/TotpTwoFaProvider.java

@ -62,7 +62,7 @@ public class TotpTwoFaProvider implements TwoFaProvider<TotpTwoFaProviderConfig,
}
private String generateSecretKey() {
return Base32.encode(RandomUtils.nextBytes(20));
return Base32.encode(RandomUtils.secure().randomBytes(20));
}

2
application/src/main/java/org/thingsboard/server/service/security/model/token/JwtTokenFactory.java

@ -23,9 +23,9 @@ import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SignatureException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;

4
application/src/main/java/org/thingsboard/server/service/ws/WebSocketSessionType.java

@ -17,9 +17,9 @@ package org.thingsboard.server.service.ws;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
@NoArgsConstructor
@ -33,7 +33,7 @@ public enum WebSocketSessionType {
public static Optional<WebSocketSessionType> forName(String name) {
return Arrays.stream(values())
.filter(sessionType -> StringUtils.equals(sessionType.name, name))
.filter(sessionType -> Objects.equals(sessionType.name, name))
.findFirst();
}

10
application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java

@ -19,8 +19,8 @@ import lombok.extern.slf4j.Slf4j;
import org.mockito.ArgumentMatcher;
import org.mockito.Mockito;
import org.springframework.boot.info.BuildProperties;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.server.cluster.TbClusterService;
import org.thingsboard.server.common.data.EdgeUtils;
import org.thingsboard.server.common.data.EntityType;
@ -55,13 +55,13 @@ import static org.mockito.Mockito.times;
@Slf4j
public abstract class AbstractNotifyEntityTest extends AbstractWebTest {
@SpyBean
@MockitoSpyBean
protected TbClusterService tbClusterService;
@SpyBean
@MockitoSpyBean
protected AuditLogService auditLogService;
@MockBean
@MockitoBean
BuildProperties buildProperties;
protected final String msgErrorPermission = "You don't have permission to perform this operation!";

2
application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java

@ -1358,7 +1358,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
protected NotificationTarget createNotificationTarget(UsersFilter usersFilter) {
NotificationTarget notificationTarget = new NotificationTarget();
notificationTarget.setName(usersFilter.toString() + RandomStringUtils.randomNumeric(5));
notificationTarget.setName(usersFilter.toString() + RandomStringUtils.secure().nextNumeric(5));
PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig();
targetConfig.setUsersFilter(usersFilter);
notificationTarget.setConfiguration(targetConfig);

2
application/src/test/java/org/thingsboard/server/controller/AdminControllerTest.java

@ -168,7 +168,7 @@ public class AdminControllerTest extends AbstractControllerTest {
assertThat(jwtSettings).isEqualTo(defaultJwtSettings);
jwtSettings.setTokenSigningKey(Base64.getEncoder().encodeToString(
RandomStringUtils.randomAlphanumeric(512 / Byte.SIZE).getBytes(StandardCharsets.UTF_8)));
RandomStringUtils.secure().nextAlphanumeric(512 / Byte.SIZE).getBytes(StandardCharsets.UTF_8)));
doPost("/api/admin/jwtSettings", jwtSettings).andExpect(status().isOk());

6
application/src/test/java/org/thingsboard/server/controller/AlarmCommentControllerTest.java

@ -28,7 +28,7 @@ import org.mockito.Mockito;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.test.context.ContextConfiguration;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.alarm.Alarm;
@ -292,7 +292,7 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
final int size = 10;
for (int i = 0; i < size; i++) {
createdAlarmComments.add(
createAlarmComment(alarm.getId(), RandomStringUtils.randomAlphanumeric(10))
createAlarmComment(alarm.getId(), RandomStringUtils.secure().nextAlphanumeric(10))
);
}
@ -323,7 +323,7 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
List<AlarmComment> createdAlarmComments = new LinkedList<>();
for (int i = 0; i < size; i++) {
createdAlarmComments.add(
createAlarmComment(alarm.getId(), RandomStringUtils.randomAlphanumeric(10))
createAlarmComment(alarm.getId(), RandomStringUtils.secure().nextAlphanumeric(10))
);
}

6
application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest.java

@ -26,7 +26,7 @@ import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantProfile;
@ -71,9 +71,9 @@ public class AuditLogControllerTest extends AbstractControllerTest {
@Autowired
private AuditLogDao auditLogDao;
@Getter
@SpyBean
@MockitoSpyBean
private SqlPartitioningRepository partitioningRepository;
@SpyBean
@MockitoSpyBean
private AuditLogsCleanUpService auditLogsCleanUpService;
@Value("#{${sql.audit_logs.partition_size} * 60 * 60 * 1000}")

4
application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest_DedicatedEventsDataSource.java

@ -16,7 +16,7 @@
package org.thingsboard.server.controller;
import lombok.Getter;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.dao.sqlts.insert.sql.DedicatedEventsSqlPartitioningRepository;
@ -30,7 +30,7 @@ import org.thingsboard.server.dao.sqlts.insert.sql.DedicatedEventsSqlPartitionin
public class AuditLogControllerTest_DedicatedEventsDataSource extends AuditLogControllerTest {
@Getter
@SpyBean
@MockitoSpyBean
private DedicatedEventsSqlPartitioningRepository partitioningRepository;
}

12
application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java

@ -20,9 +20,9 @@ import org.assertj.core.data.Offset;
import org.junit.After;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.http.HttpHeaders;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.User;
@ -50,7 +50,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@DaoSqlTest
public class AuthControllerTest extends AbstractControllerTest {
@SpyBean
@MockitoSpyBean
private UserCredentialsDao userCredentialsDao;
@After
@ -149,7 +149,7 @@ public class AuthControllerTest extends AbstractControllerTest {
loginTenantAdmin();
ChangePasswordRequest changePasswordRequest = new ChangePasswordRequest();
changePasswordRequest.setCurrentPassword("tenant");
changePasswordRequest.setNewPassword(RandomStringUtils.randomAlphanumeric(73));
changePasswordRequest.setNewPassword(RandomStringUtils.secure().nextAlphanumeric(73));
doPost("/api/auth/changePassword", changePasswordRequest)
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.message", is("Password must be no more than 72 characters in length.")));
@ -161,7 +161,7 @@ public class AuthControllerTest extends AbstractControllerTest {
ChangePasswordRequest changePasswordRequest = new ChangePasswordRequest();
changePasswordRequest.setCurrentPassword("tenant");
String newPassword = RandomStringUtils.randomAlphanumeric(16);
String newPassword = RandomStringUtils.secure().nextAlphanumeric(16);
changePasswordRequest.setNewPassword(newPassword);
doPost("/api/auth/changePassword", changePasswordRequest)
.andExpect(status().isOk());
@ -194,7 +194,7 @@ public class AuthControllerTest extends AbstractControllerTest {
.andExpect(status().isSeeOther())
.andExpect(header().string(HttpHeaders.LOCATION, "/login/resetPassword?resetToken=" + this.currentResetPasswordToken));
String newPassword = RandomStringUtils.randomAlphanumeric(73);
String newPassword = RandomStringUtils.secure().nextAlphanumeric(73);
JsonNode resetPasswordRequest = JacksonUtil.newObjectNode()
.put("resetToken", this.currentResetPasswordToken)
.put("password", newPassword);

2
application/src/test/java/org/thingsboard/server/controller/BaseQueueControllerTest.java

@ -236,7 +236,7 @@ public class BaseQueueControllerTest extends AbstractControllerTest {
when(testProcessingResult.getFailedMap()).thenReturn(new ConcurrentHashMap<>());
when(testProcessingResult.getPendingMap()).thenReturn(new ConcurrentHashMap<>());
String largeExceptionMessage = RandomStringUtils.randomAlphabetic(150);
String largeExceptionMessage = RandomStringUtils.secure().nextAlphabetic(150);
RuleEngineException ruleEngineException = new RuleEngineException(largeExceptionMessage);
when(testProcessingResult.getExceptionsMap()).thenReturn(new ConcurrentHashMap<>(Map.of(
tenantId, ruleEngineException

6
application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java

@ -31,7 +31,7 @@ import org.mockito.AdditionalAnswers;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.test.context.ContextConfiguration;
@ -115,10 +115,10 @@ public class DeviceControllerTest extends AbstractControllerTest {
private Tenant savedTenant;
private User tenantAdmin;
@SpyBean
@MockitoSpyBean
private GatewayNotificationsService gatewayNotificationsService;
@SpyBean
@MockitoSpyBean
private DeviceStateService deviceStateService;
@Autowired

4
application/src/test/java/org/thingsboard/server/controller/EdgeEventControllerTest.java

@ -25,7 +25,7 @@ import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.AttributeScope;
@ -66,7 +66,7 @@ public class EdgeEventControllerTest extends AbstractControllerTest {
@Autowired
private EdgeEventDao edgeEventDao;
@SpyBean
@MockitoSpyBean
private SqlPartitioningRepository partitioningRepository;
@Autowired
private EdgeEventsCleanUpService edgeEventsCleanUpService;

4
application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java

@ -31,7 +31,7 @@ import org.springframework.test.context.TestPropertySource;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.ResultActions;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.AttributeScope;
import org.thingsboard.server.common.data.Customer;
@ -207,7 +207,7 @@ public class EntityQueryControllerTest extends AbstractControllerTest {
loginTenantAdmin();
List<Device> devices = new ArrayList<>();
String devicePrefix = "Device" + RandomStringUtils.randomAlphabetic(5);
String devicePrefix = "Device" + RandomStringUtils.secure().nextAlphabetic(5);
for (int i = 0; i < 97; i++) {
Device device = new Device();
device.setName(devicePrefix + i);

6
application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java

@ -22,7 +22,7 @@ import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.rule.engine.api.SmsService;
@ -85,10 +85,10 @@ public class HomePageApiTest extends AbstractControllerTest {
@Autowired
private OAuth2ClientService oAuth2ClientService;
@MockBean
@MockitoBean
private MailService mailService;
@MockBean
@MockitoBean
private SmsService smsService;
private static final int DEFAULT_DASHBOARDS_COUNT = 0;

4
application/src/test/java/org/thingsboard/server/controller/RepositorySettingsTest.java

@ -18,7 +18,7 @@ package org.thingsboard.server.controller;
import com.google.common.util.concurrent.SettableFuture;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.thingsboard.server.common.data.sync.vc.RepositoryAuthMethod;
import org.thingsboard.server.common.data.sync.vc.RepositorySettings;
import org.thingsboard.server.dao.service.DaoSqlTest;
@ -35,7 +35,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@DaoSqlTest
public class RepositorySettingsTest extends AbstractControllerTest {
@MockBean
@MockitoBean
private GitVersionControlQueueService gitVersionControlQueueService;
@Test

4
application/src/test/java/org/thingsboard/server/controller/RuleEngineControllerTest.java

@ -19,7 +19,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device;
@ -56,7 +56,7 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
private final String REQUEST_BODY = "{\"request\":\"download\"}";
private final String RESPONSE_BODY = "{\"response\":\"downloadOk\"}";
@SpyBean
@MockitoSpyBean
private RuleEngineCallService ruleEngineCallService;
@Test

10
application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthConfigTest.java

@ -22,8 +22,8 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.cache.CacheManager;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
@ -65,15 +65,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@DaoSqlTest
public class TwoFactorAuthConfigTest extends AbstractControllerTest {
@SpyBean
@MockitoSpyBean
private TotpTwoFaProvider totpTwoFactorAuthProvider;
@MockBean
@MockitoBean
private SmsService smsService;
@Autowired
private CacheManager cacheManager;
@Autowired
private TwoFaConfigManager twoFaConfigManager;
@SpyBean
@MockitoSpyBean
private TwoFactorAuthService twoFactorAuthService;
@Before

8
application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthTest.java

@ -23,8 +23,8 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.web.util.UriComponentsBuilder;
import org.thingsboard.rule.engine.api.SmsService;
import org.thingsboard.server.common.data.StringUtils;
@ -82,9 +82,9 @@ public class TwoFactorAuthTest extends AbstractControllerTest {
@Autowired
private TwoFaConfigManager twoFaConfigManager;
@SpyBean
@MockitoSpyBean
private TwoFactorAuthService twoFactorAuthService;
@MockBean
@MockitoBean
private SmsService smsService;
@Autowired
private AuditLogService auditLogService;

4
application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java

@ -1296,9 +1296,9 @@ public class UserControllerTest extends AbstractControllerTest {
Assert.assertEquals(savedDashboard2.getTitle(), starred.getTitle());
//TEST renaming in the cache.
savedDashboard1.setTitle(RandomStringUtils.randomAlphanumeric(10));
savedDashboard1.setTitle(RandomStringUtils.secure().nextAlphanumeric(10));
savedDashboard1 = doPost("/api/dashboard", savedDashboard1, Dashboard.class);
savedDashboard2.setTitle(RandomStringUtils.randomAlphanumeric(10));
savedDashboard2.setTitle(RandomStringUtils.secure().nextAlphanumeric(10));
savedDashboard2 = doPost("/api/dashboard", savedDashboard2, Dashboard.class);
newSettings = doGet("/api/user/dashboards/" + savedDashboard1.getId().getId() + "/unstar", UserDashboardsInfo.class);

8
application/src/test/java/org/thingsboard/server/controller/WebSocketApiTest.java

@ -28,9 +28,9 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.AttributesSaveRequest;
import org.thingsboard.rule.engine.api.TimeseriesSaveRequest;
@ -99,7 +99,7 @@ public class WebSocketApiTest extends AbstractControllerTest {
@Autowired
private TelemetrySubscriptionService tsService;
@SpyBean
@MockitoSpyBean
private TimeseriesService timeseriesService;
Device device;
@ -555,7 +555,7 @@ public class WebSocketApiTest extends AbstractControllerTest {
for (int i = 0; i < 6; i++) {
Alarm alarm = new Alarm();
alarm.setOriginator(device.getId());
alarm.setType(RandomStringUtils.randomAlphabetic(10));
alarm.setType(RandomStringUtils.secure().nextAlphabetic(10));
alarm.setSeverity(AlarmSeverity.CRITICAL);
alarm = doPost("/api/alarm", alarm, Alarm.class);
alarms.add(alarm);

8
application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java

@ -149,7 +149,7 @@ public class HashPartitionServiceTest {
Random random = new Random();
long ts = new SimpleDateFormat("dd-MM-yyyy").parse("06-12-2016").getTime() - TimeUnit.DAYS.toMillis(tenantCount);
for (int tenantIndex = 0; tenantIndex < tenantCount; tenantIndex++) {
TenantId tenantId = new TenantId(Uuids.startOf(ts));
TenantId tenantId = TenantId.fromUUID(Uuids.startOf(ts));
ts += TimeUnit.DAYS.toMillis(1) + random.nextInt(1000);
for (int queueIndex = 0; queueIndex < queueCount; queueIndex++) {
QueueKey queueKey = new QueueKey(ServiceType.TB_RULE_ENGINE, "queue" + queueIndex, tenantId);
@ -190,7 +190,7 @@ public class HashPartitionServiceTest {
Map<TenantId, TenantProfileId> tenants = new HashMap<>();
for (TenantProfileId tenantProfileId : isolatedTenantProfiles) {
for (int i = 0; i < tenantsCountPerProfile; i++) {
tenants.put(new TenantId(UUID.randomUUID()), tenantProfileId);
tenants.put(TenantId.fromUUID(UUID.randomUUID()), tenantProfileId);
}
}
@ -299,7 +299,7 @@ public class HashPartitionServiceTest {
Queue systemQueue = createQueue(TenantId.SYS_TENANT_ID, 10);
queues.add(systemQueue);
TenantId tenantId = new TenantId(UUID.randomUUID());
TenantId tenantId = TenantId.fromUUID(UUID.randomUUID());
mockRoutingInfo(tenantId, tenantProfileId, false); // not isolated yet
mockQueues(queues);
@ -380,7 +380,7 @@ public class HashPartitionServiceTest {
}
Stream.concat(Stream.of(TenantId.SYS_TENANT_ID), Stream.generate(UUID::randomUUID).map(TenantId::new).limit(10)).forEach(tenantId -> {
List<QueueKey> queues = Stream.generate(() -> RandomStringUtils.randomAlphabetic(10))
List<QueueKey> queues = Stream.generate(() -> RandomStringUtils.secure().nextAlphabetic(10))
.map(queueName -> new QueueKey(ServiceType.TB_RULE_ENGINE, queueName, tenantId))
.limit(100).toList();

52
application/src/test/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCacheTest.java

@ -92,8 +92,8 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_tenantDeleted_evictsAllTenantCfsFromAllMaps() {
TenantId tenant1 = new TenantId(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID());
TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
DeviceId device1 = new DeviceId(UUID.randomUUID());
DeviceId device2 = new DeviceId(UUID.randomUUID());
@ -110,7 +110,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_tenantDeleted_evictsOwnerEntities() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
stubDeviceOwner(tenant, device, tenant);
@ -125,7 +125,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_tenantDeleted_removesLinksToLinkedEntities() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId cfEntity = new DeviceId(UUID.randomUUID());
DeviceId linkedDevice = new DeviceId(UUID.randomUUID());
@ -139,7 +139,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_tenantUpdated_doesNotEvictCfs() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, device);
@ -152,7 +152,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_deviceDeleted_evictsCfsForThatDevice() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, device);
@ -164,7 +164,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_deviceDeleted_removesLinksForLinkedEntities() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
DeviceId linkedDevice = new DeviceId(UUID.randomUUID());
addCfToCache(tenant, device, linkedDevice);
@ -176,7 +176,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_deviceDeleted_evictsDeviceFromOwnerEntities() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
stubDeviceOwner(tenant, device, customer);
@ -191,7 +191,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_assetDeleted_evictsCfsForThatAsset() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetId asset = new AssetId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, asset);
@ -203,7 +203,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_deviceCreated_addsDeviceToOwnerEntities() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
stubDeviceOwner(tenant, device, customer);
@ -217,7 +217,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_customerDeleted_evictsCustomerOwnerEntries() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
stubDeviceOwner(tenant, device, customer);
@ -235,7 +235,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_deviceProfileDeleted_evictsCfsForThatProfile() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, profileId);
@ -247,7 +247,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_deviceProfileDeleted_removesLinksForLinkedEntities() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
DeviceId linkedDevice = new DeviceId(UUID.randomUUID());
addCfToCache(tenant, profileId, linkedDevice);
@ -259,7 +259,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_deviceProfileDeleted_doesNotEvictOtherProfilesCfs() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profile1 = new DeviceProfileId(UUID.randomUUID());
DeviceProfileId profile2 = new DeviceProfileId(UUID.randomUUID());
CalculatedField cf1 = addCfToCache(tenant, profile1);
@ -275,7 +275,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_deviceProfileUpdated_doesNotEvictCfs() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, profileId);
@ -287,7 +287,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_assetProfileDeleted_evictsCfsForThatProfile() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, profileId);
@ -299,7 +299,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_assetProfileDeleted_removesLinksForLinkedEntities() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
AssetId linkedAsset = new AssetId(UUID.randomUUID());
addCfToCache(tenant, profileId, linkedAsset);
@ -311,7 +311,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_assetProfileDeleted_doesNotEvictOtherProfilesCfs() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profile1 = new AssetProfileId(UUID.randomUUID());
AssetProfileId profile2 = new AssetProfileId(UUID.randomUUID());
CalculatedField cf1 = addCfToCache(tenant, profile1);
@ -327,7 +327,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_assetProfileUpdated_doesNotEvictCfs() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, profileId);
@ -341,7 +341,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_calculatedFieldCreated_addsCfToCache() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedFieldId cfId = new CalculatedFieldId(UUID.randomUUID());
CalculatedField cf = buildCalculatedField(cfId, tenant, device, simpleCfConfig());
@ -355,7 +355,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_calculatedFieldDeleted_evictsCfFromCache() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, device);
@ -367,7 +367,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_calculatedFieldUpdated_refreshesCfInCache() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, device);
@ -384,7 +384,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void evictOwner_customerDeleted_recursivelyEvictsDevicesOwnedByThatCustomer() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
@ -406,7 +406,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void evictOwner_tenantDeleted_recursivelyEvictsCustomerAndItsOwnedDevices() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID());
@ -431,7 +431,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_tenantProfileUpdated_callsHandleTenantProfileUpdate() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
TenantProfileId profileId = new TenantProfileId(UUID.randomUUID());
DefaultCalculatedFieldCache spyCache = spy(cache);
@ -442,7 +442,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test
public void onComponentLifecycleEvent_tenantProfileDeleted_doesNotCallHandleTenantProfileUpdate() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
TenantProfileId profileId = new TenantProfileId(UUID.randomUUID());
DefaultCalculatedFieldCache spyCache = spy(cache);

43
application/src/test/java/org/thingsboard/server/service/device/provision/DeviceProvisionServiceTest.java

@ -21,8 +21,8 @@ import org.assertj.core.api.Assertions;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.thingsboard.server.cluster.TbClusterService;
@ -73,28 +73,43 @@ import static org.mockito.Mockito.when;
@Slf4j
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = DeviceProvisionServiceImpl.class)
@ContextConfiguration(classes = DeviceProvisionServiceTest.ContextConfiguration.class)
public class DeviceProvisionServiceTest {
@MockBean
@org.springframework.context.annotation.Configuration
static class ContextConfiguration {
@org.springframework.context.annotation.Bean
public DeviceProvisionServiceImpl deviceProvisionService(TbQueueProducerProvider producerProvider,
DeviceProfileService deviceProfileService,
DeviceService deviceService,
DeviceCredentialsService deviceCredentialsService,
AttributesService attributesService,
AuditLogService auditLogService,
PartitionService partitionService) {
return new DeviceProvisionServiceImpl(producerProvider, deviceProfileService, deviceService,
deviceCredentialsService, attributesService, auditLogService, partitionService);
}
}
@MockitoBean
protected TbQueueProducerProvider producerProvider;
@MockBean
@MockitoBean
protected TbQueueProducer<TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> ruleEngineMsgProducer;
@MockBean
@MockitoBean
protected TbClusterService clusterService;
@MockBean
@MockitoBean
protected DeviceProfileService deviceProfileService;
@MockBean
@MockitoBean
protected DeviceService deviceService;
@MockBean
@MockitoBean
protected DeviceCredentialsService deviceCredentialsService;
@MockBean
@MockitoBean
protected AttributesService attributesService;
@MockBean
@MockitoBean
protected AuditLogService auditLogService;
@MockBean
@MockitoBean
protected PartitionService partitionService;
@SpyBean
@MockitoSpyBean
DeviceProvisionServiceImpl service;
private String[] chain;
@ -220,7 +235,7 @@ public class DeviceProvisionServiceTest {
private Tenant createTenant() {
Tenant tenant = new Tenant();
tenant.setId(new TenantId(UUID.randomUUID()));
tenant.setId(TenantId.fromUUID(UUID.randomUUID()));
return tenant;
}

6
application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java

@ -1004,7 +1004,7 @@ public class EntityServiceTest extends AbstractControllerTest {
public void testFindEntityDataByQuery_filter_entity_name_ends_with() {
List<Device> devices = new ArrayList<>();
String suffixes = RandomStringUtils.randomAlphanumeric(5);
String suffixes = RandomStringUtils.secure().nextAlphanumeric(5);
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
@ -1425,7 +1425,7 @@ public class EntityServiceTest extends AbstractControllerTest {
Device device = new Device();
device.setTenantId(tenantId);
device.setCustomerId(customerId);
device.setName("Device test " + RandomStringUtils.randomAlphabetic(5));
device.setName("Device test " + RandomStringUtils.secure().nextAlphabetic(5));
device.setType("default");
return device;
}
@ -1485,7 +1485,7 @@ public class EntityServiceTest extends AbstractControllerTest {
device.setTenantId(tenantId);
device.setName("Device " + i);
device.setType("default");
device.setLabel("label-" + RandomUtils.nextInt(100, 10000));
device.setLabel("label-" + RandomUtils.secure().randomInt(100, 10000));
return device;
})
.limit(count)

32
application/src/test/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmServiceTest.java

@ -19,7 +19,7 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.cluster.TbClusterService;
@ -69,35 +69,35 @@ import static org.thingsboard.server.common.data.alarm.AlarmCommentSubType.UNASS
@SpringJUnitConfig(DefaultTbAlarmService.class)
class DefaultTbAlarmServiceTest {
@MockBean
@MockitoBean
TbLogEntityActionService logEntityActionService;
@MockBean
@MockitoBean
EdgeService edgeService;
@MockBean
@MockitoBean
AlarmService alarmService;
@MockBean
@MockitoBean
TbAlarmCommentService alarmCommentService;
@MockBean
@MockitoBean
AlarmSubscriptionService alarmSubscriptionService;
@MockBean
@MockitoBean
CustomerService customerService;
@MockBean
@MockitoBean
TbClusterService tbClusterService;
@MockBean
@MockitoBean
EntitiesVersionControlService vcService;
@MockBean
@MockitoBean
AccessControlService accessControlService;
@MockBean
@MockitoBean
TenantService tenantService;
@MockBean
@MockitoBean
AssetService assetService;
@MockBean
@MockitoBean
DeviceService deviceService;
@MockBean
@MockitoBean
AssetProfileService assetProfileService;
@MockBean
@MockitoBean
DeviceProfileService deviceProfileService;
@MockBean
@MockitoBean
EntityService entityService;
@Autowired

34
application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java

@ -19,8 +19,8 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
@ -65,35 +65,35 @@ import static org.mockito.Mockito.when;
})
public class DefaultTbAlarmCommentServiceTest {
@MockBean
@MockitoBean
protected DbCallbackExecutorService dbExecutor;
@MockBean
@MockitoBean
protected TbLogEntityActionService logEntityActionService;
@MockBean
@MockitoBean
protected AlarmService alarmService;
@MockBean
@MockitoBean
protected AlarmCommentService alarmCommentService;
@MockBean
@MockitoBean
protected AlarmSubscriptionService alarmSubscriptionService;
@MockBean
@MockitoBean
protected CustomerService customerService;
@MockBean
@MockitoBean
protected TbClusterService tbClusterService;
@MockBean
@MockitoBean
private AccessControlService accessControlService;
@MockBean
@MockitoBean
private TenantService tenantService;
@MockBean
@MockitoBean
private AssetService assetService;
@MockBean
@MockitoBean
private DeviceService deviceService;
@MockBean
@MockitoBean
private AssetProfileService assetProfileService;
@MockBean
@MockitoBean
private DeviceProfileService deviceProfileService;
@MockBean
@MockitoBean
private EntityService entityService;
@SpyBean
@MockitoSpyBean
DefaultTbAlarmCommentService service;
@Test

4
application/src/test/java/org/thingsboard/server/service/housekeeper/HousekeeperServiceTest.java

@ -25,7 +25,7 @@ import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.metadata.TbGetAttributesNode;
import org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration;
@ -570,7 +570,7 @@ public class HousekeeperServiceTest extends AbstractControllerTest {
.tenantId(tenantId)
.originator(entityId)
.severity(AlarmSeverity.CRITICAL)
.type("test alarm for " + entityId + " " + RandomStringUtils.randomAlphabetic(10))
.type("test alarm for " + entityId + " " + RandomStringUtils.secure().nextAlphabetic(10))
.build(), Alarm.class);
assertThat(alarmService.findAlarmIdsByOriginatorId(tenantId, entityId, 0, null, 10)).isNotEmpty();
}

28
application/src/test/java/org/thingsboard/server/service/install/InstallScriptsTest.java

@ -20,8 +20,8 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.TenantId;
@ -52,30 +52,30 @@ import static org.mockito.BDDMockito.willReturn;
@SpringBootTest(classes = {InstallScripts.class, RuleChainDataValidator.class})
class InstallScriptsTest {
@MockBean
@MockitoBean
RuleChainService ruleChainService;
@MockBean
@MockitoBean
DashboardService dashboardService;
@MockBean
@MockitoBean
WidgetTypeService widgetTypeService;
@MockBean
@MockitoBean
WidgetsBundleService widgetsBundleService;
@MockBean
@MockitoBean
OAuth2ConfigTemplateService oAuth2TemplateService;
@MockBean
@MockitoBean
ResourceService resourceService;
@MockBean
@MockitoBean
ImageService imageService;
@MockBean
@MockitoBean
ResourcesUpdater resourcesUpdater;
@SpyBean
@MockitoSpyBean
InstallScripts installScripts;
@MockBean
@MockitoBean
TenantService tenantService;
@MockBean
@MockitoBean
ApiLimitService apiLimitService;
@SpyBean
@MockitoSpyBean
RuleChainDataValidator ruleChainValidator;
TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da"));

6
application/src/test/java/org/thingsboard/server/service/job/JobManagerTest.java

@ -22,7 +22,7 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.rule.engine.api.JobManager;
import org.thingsboard.server.common.data.Device;
@ -68,10 +68,10 @@ public class JobManagerTest extends AbstractControllerTest {
@Autowired
private JobManager jobManager;
@SpyBean
@MockitoSpyBean
private TestTaskProcessor taskProcessor;
@SpyBean
@MockitoSpyBean
private JobStatsService jobStatsService;
@Autowired

2
application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java

@ -155,7 +155,7 @@ public abstract class AbstractNotificationApiTest extends AbstractControllerTest
User user = new User();
user.setTenantId(tenantId);
user.setAuthority(authority);
user.setEmail(RandomStringUtils.randomAlphabetic(20) + "@thingsboard.com");
user.setEmail(RandomStringUtils.secure().nextAlphabetic(20) + "@thingsboard.com");
user = createUserAndLogin(user, "12345678");
NotificationApiWsClient wsClient = buildAndConnectWebSocketClient();
return Pair.of(user, wsClient);

2
application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java

@ -988,7 +988,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest {
String expectedSubject = "Comment on 'test' alarm";
String expectedBody = TENANT_ADMIN_EMAIL + " added comment: text";
ArgumentCaptor<Map<String, String>> msgCaptor = ArgumentCaptor.forClass(Map.class);
ArgumentCaptor<Map<String, String>> msgCaptor = ArgumentCaptor.captor();
await().atMost(TIMEOUT, TimeUnit.SECONDS).untilAsserted(() -> {
verify(firebaseService).sendMessage(eq(tenantId), eq("testCredentials"),
eq(TEST_MOBILE_TOKEN), eq(expectedSubject),

2
application/src/test/java/org/thingsboard/server/service/notification/NotificationApiWsClient.java

@ -131,7 +131,7 @@ public class NotificationApiWsClient extends TbTestWebSocketClient {
}
private int newCmdId() {
return RandomUtils.nextInt(1, 1000);
return RandomUtils.secure().randomInt(1, 1000);
}
}

2
application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java

@ -187,7 +187,7 @@ public class NotificationTargetApiTest extends AbstractNotificationApiTest {
NotificationTarget sysAdmins = createNotificationTarget(new SystemAdministratorsFilter());
NotificationTarget slack = new NotificationTarget();
slack.setName(RandomStringUtils.randomNumeric(5));
slack.setName(RandomStringUtils.secure().nextNumeric(5));
SlackNotificationTargetConfig slackConfig = new SlackNotificationTargetConfig();
SlackConversation slackConversation = new SlackConversation();
slackConversation.setType(SlackConversationType.DIRECT);

14
application/src/test/java/org/thingsboard/server/service/profile/DefaultTbAssetProfileCacheTest.java

@ -57,8 +57,8 @@ public class DefaultTbAssetProfileCacheTest {
@Test
public void onComponentLifecycleEvent_tenantDeleted_evictsAssetProfilesForThatTenant() {
TenantId tenant1 = new TenantId(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID());
TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId1 = new AssetProfileId(UUID.randomUUID());
AssetProfileId profileId2 = new AssetProfileId(UUID.randomUUID());
@ -75,7 +75,7 @@ public class DefaultTbAssetProfileCacheTest {
@Test
public void onComponentLifecycleEvent_tenantDeleted_evictsAssetMappingsForThatTenant() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
AssetId assetId = new AssetId(UUID.randomUUID());
@ -92,7 +92,7 @@ public class DefaultTbAssetProfileCacheTest {
@Test
public void onComponentLifecycleEvent_tenantDeleted_removesListenersForThatTenant() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
EntityId listenerId = new AssetId(UUID.randomUUID());
AtomicInteger callCount = new AtomicInteger();
@ -110,7 +110,7 @@ public class DefaultTbAssetProfileCacheTest {
@Test
public void onComponentLifecycleEvent_tenantUpdated_doesNotEvictProfiles() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
loadProfileIntoCache(tenant, profileId);
@ -123,8 +123,8 @@ public class DefaultTbAssetProfileCacheTest {
@Test
public void onComponentLifecycleEvent_differentTenantDeleted_keepsOtherTenantsProfiles() {
TenantId tenant1 = new TenantId(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID());
TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId1 = new AssetProfileId(UUID.randomUUID());
AssetProfileId profileId2 = new AssetProfileId(UUID.randomUUID());

14
application/src/test/java/org/thingsboard/server/service/profile/DefaultTbDeviceProfileCacheTest.java

@ -57,8 +57,8 @@ public class DefaultTbDeviceProfileCacheTest {
@Test
public void onComponentLifecycleEvent_tenantDeleted_evictsDeviceProfilesForThatTenant() {
TenantId tenant1 = new TenantId(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID());
TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId1 = new DeviceProfileId(UUID.randomUUID());
DeviceProfileId profileId2 = new DeviceProfileId(UUID.randomUUID());
@ -76,7 +76,7 @@ public class DefaultTbDeviceProfileCacheTest {
@Test
public void onComponentLifecycleEvent_tenantDeleted_evictsDeviceMappingsForThatTenant() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
DeviceId deviceId = new DeviceId(UUID.randomUUID());
@ -93,7 +93,7 @@ public class DefaultTbDeviceProfileCacheTest {
@Test
public void onComponentLifecycleEvent_tenantDeleted_removesListenersForThatTenant() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
EntityId listenerId = new DeviceId(UUID.randomUUID());
AtomicInteger callCount = new AtomicInteger();
@ -111,7 +111,7 @@ public class DefaultTbDeviceProfileCacheTest {
@Test
public void onComponentLifecycleEvent_tenantUpdated_doesNotEvictProfiles() {
TenantId tenant = new TenantId(UUID.randomUUID());
TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
loadProfileIntoCache(tenant, profileId);
@ -124,8 +124,8 @@ public class DefaultTbDeviceProfileCacheTest {
@Test
public void onComponentLifecycleEvent_differentTenantDeleted_keepsOtherTenantsProfiles() {
TenantId tenant1 = new TenantId(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID());
TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId1 = new DeviceProfileId(UUID.randomUUID());
DeviceProfileId profileId2 = new DeviceProfileId(UUID.randomUUID());

47
application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java

@ -20,8 +20,8 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.thingsboard.common.util.JacksonUtil;
@ -56,6 +56,7 @@ import org.thingsboard.server.queue.discovery.PartitionService;
import org.thingsboard.server.queue.discovery.TopicService;
import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
import org.thingsboard.server.service.gateway_device.GatewayNotificationsService;
import org.thingsboard.server.service.ota.OtaPackageStateService;
import org.thingsboard.server.service.profile.TbAssetProfileCache;
import org.thingsboard.server.service.profile.TbDeviceProfileCache;
@ -67,6 +68,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@ -87,30 +89,45 @@ public class DefaultTbClusterServiceTest {
public static final String TRANSPORT = "transport";
@MockBean
@MockitoBean
protected TbDeviceProfileCache deviceProfileCache;
@MockBean
@MockitoBean
protected TbAssetProfileCache assetProfileCache;
@MockBean
@MockitoBean
protected GatewayNotificationsService gatewayNotificationsService;
@MockBean
@MockitoBean
protected EdgeService edgeService;
@MockBean
@MockitoBean
protected PartitionService partitionService;
@MockBean
@MockitoBean
protected TbQueueProducerProvider producerProvider;
@MockBean
@MockitoBean
protected TbRuleEngineProducerService ruleEngineProducerService;
@MockBean
@MockitoBean
protected TbTransactionalCache<EdgeId, String> edgeCache;
@MockBean
@MockitoBean
protected CalculatedFieldService calculatedFieldService;
@SpyBean
@MockitoBean
protected TopicService topicService;
@SpyBean
@MockitoBean
protected OtaPackageStateService otaPackageStateService;
@MockitoSpyBean
protected TbClusterService clusterService;
@org.junit.Before
public void setUp() {
lenient().when(topicService.getNotificationsTopic(any(), any())).thenAnswer(invocation -> {
ServiceType serviceType = invocation.getArgument(0);
String serviceId = invocation.getArgument(1);
return new TopicPartitionInfo(serviceType.name().toLowerCase() + ".notifications." + serviceId, null, null, false);
});
lenient().when(topicService.getCalculatedFieldNotificationsTopic(any())).thenAnswer(invocation -> {
String serviceId = invocation.getArgument(0);
return new TopicPartitionInfo("calculated_field.notifications." + serviceId, null, null, false);
});
}
@Test
public void testOnQueueChangeSingleMonolith() {
when(partitionService.getAllServiceIds(ServiceType.TB_RULE_ENGINE)).thenReturn(Sets.newHashSet(MONOLITH));
@ -393,7 +410,7 @@ public class DefaultTbClusterServiceTest {
@Test
public void testGetRuleEngineProfileForUpdatedAndDeletedDevice() {
DeviceId deviceId = new DeviceId(UUID.randomUUID());
TenantId tenantId = new TenantId(UUID.randomUUID());
TenantId tenantId = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId deviceProfileId = new DeviceProfileId(UUID.randomUUID());
Device device = new Device(deviceId);
@ -413,7 +430,7 @@ public class DefaultTbClusterServiceTest {
@Test
public void testGetRuleEngineProfileForUpdatedAndDeletedAsset() {
AssetId assetId = new AssetId(UUID.randomUUID());
TenantId tenantId = new TenantId(UUID.randomUUID());
TenantId tenantId = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId assetProfileId = new AssetProfileId(UUID.randomUUID());
Asset asset = new Asset(assetId);

14
application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java

@ -27,7 +27,7 @@ import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.RandomUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.common.util.ThingsBoardThreadFactory;
@ -544,18 +544,18 @@ public class TbRuleEngineQueueConsumerManagerTest {
Queue oldConfig = consumerManager.getConfig();
Queue newConfig = JacksonUtil.clone(oldConfig);
newConfig.setConsumerPerPartition(RandomUtils.nextBoolean());
newConfig.setPollInterval(RandomUtils.nextInt(100, 501));
newConfig.setPartitions(RandomUtils.nextInt(1, 10));
newConfig.setPollInterval(RandomUtils.secure().randomInt(100, 501));
newConfig.setPartitions(RandomUtils.secure().randomInt(1, 10));
newConfig.setPackProcessingTimeout(RandomUtils.nextLong(100, 5001));
newConfig.getSubmitStrategy().setType(SubmitStrategyType.values()[RandomUtils.nextInt(0, SubmitStrategyType.values().length)]);
newConfig.getProcessingStrategy().setType(ProcessingStrategyType.values()[RandomUtils.nextInt(0, ProcessingStrategyType.values().length)]);
newConfig.getSubmitStrategy().setType(SubmitStrategyType.values()[RandomUtils.secure().randomInt(0, SubmitStrategyType.values().length)]);
newConfig.getProcessingStrategy().setType(ProcessingStrategyType.values()[RandomUtils.secure().randomInt(0, ProcessingStrategyType.values().length)]);
log.info("Generated new config: consumerPerPartition={}, pollInterval={}, processingStrategy={}",
newConfig.isConsumerPerPartition(), newConfig.getPollInterval(), newConfig.getProcessingStrategy().getType());
return newConfig;
};
Supplier<Set<TopicPartitionInfo>> partitionsUpdater = () -> {
int partitionsCount = RandomUtils.nextInt(0, 20);
int[] partitions = IntStream.generate(() -> RandomUtils.nextInt(0, 20))
int partitionsCount = RandomUtils.secure().randomInt(0, 20);
int[] partitions = IntStream.generate(() -> RandomUtils.secure().randomInt(0, 20))
.distinct().limit(partitionsCount)
.sorted().toArray();
log.info("Generated new partitions: {}", Arrays.toString(partitions));

14
application/src/test/java/org/thingsboard/server/service/sms/DefaultSmsServiceTest.java

@ -22,9 +22,9 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.TenantProfile;
@ -55,7 +55,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
"usage.stats.report.urgent_interval=1"
})
public class DefaultSmsServiceTest extends AbstractControllerTest {
@SpyBean
@MockitoSpyBean
private DefaultSmsService defaultSmsService;
@Autowired
private AdminSettingsService adminSettingsService;
@ -84,13 +84,13 @@ public class DefaultSmsServiceTest extends AbstractControllerTest {
for (int i = 0; i < 10; i++) {
doReturn(1).when(defaultSmsService).sendSms(any(), any());
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.randomNumeric(10)}, "Message");
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.secure().nextNumeric(10)}, "Message");
}
//wait 1 sec so that api usage state is updated
TimeUnit.SECONDS.sleep(1);
assertThrows(RuntimeException.class, () -> {
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.randomNumeric(10)}, "Message");
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.secure().nextNumeric(10)}, "Message");
}, "SMS sending is disabled due to API limits!");
}
@ -103,7 +103,7 @@ public class DefaultSmsServiceTest extends AbstractControllerTest {
TimeUnit.SECONDS.sleep(1);
assertThrows(RuntimeException.class, () -> {
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.randomNumeric(10)}, "Message");
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.secure().nextNumeric(10)}, "Message");
}, "SMS sending is disabled due to API limits!");
//enable sms messaging
@ -113,7 +113,7 @@ public class DefaultSmsServiceTest extends AbstractControllerTest {
for (int i = 0; i < 10; i++) {
doReturn(1).when(defaultSmsService).sendSms(any(), any());
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.randomNumeric(10)}, "Message");
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.secure().nextNumeric(10)}, "Message");
}
}

6
application/src/test/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionServiceTest.java

@ -126,13 +126,13 @@ public class DefaultTbLocalSubscriptionServiceTest {
private TbSubscription<?> createSubscription(TenantId tenantId, EntityId entityId) {
Map<String, Long> keys = new HashMap<>();
for (int i = 0; i < 50; i++) {
keys.put(RandomStringUtils.randomAlphanumeric(5), 1L);
keys.put(RandomStringUtils.secure().nextAlphanumeric(5), 1L);
}
return TbAttributeSubscription.builder()
.tenantId(tenantId)
.entityId(entityId)
.subscriptionId(1)
.sessionId(RandomStringUtils.randomAlphanumeric(5))
.sessionId(RandomStringUtils.secure().nextAlphanumeric(5))
.keyStates(keys)
.build();
}
@ -152,7 +152,7 @@ public class DefaultTbLocalSubscriptionServiceTest {
.tenantId(tenantId)
.entityId(deviceId)
.subscriptionId(2)
.sessionId(RandomStringUtils.randomAlphanumeric(5))
.sessionId(RandomStringUtils.secure().nextAlphanumeric(5))
.keyStates(keyStates)
.allKeys(true)
.latestValues(true)

10
application/src/test/java/org/thingsboard/server/service/subscription/TbEntityDataSubCtxTest.java

@ -23,7 +23,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.RandomUtils;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
@ -55,10 +55,10 @@ public class TbEntityDataSubCtxTest {
private final DeviceId deviceId = new DeviceId(UUID.randomUUID());
private final Integer cmdId = RandomUtils.nextInt();
private final Integer subscriptionId = RandomUtils.nextInt();
private final String serviceId = RandomStringUtils.randomAlphanumeric(10);
private final String sessionId = RandomStringUtils.randomAlphanumeric(10);
private final Integer cmdId = RandomUtils.secure().randomInt();
private final Integer subscriptionId = RandomUtils.secure().randomInt();
private final String serviceId = RandomStringUtils.secure().nextAlphanumeric(10);
private final String sessionId = RandomStringUtils.secure().nextAlphanumeric(10);
private final int maxEntitiesPerDataSubscription = 100;

2
application/src/test/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfoTest.java

@ -161,7 +161,7 @@ public class TbEntityLocalSubsInfoTest {
}
private TbEntityLocalSubsInfo createSubsInfo() {
return new TbEntityLocalSubsInfo(new TenantId(UUID.randomUUID()), new DeviceId(UUID.randomUUID()));
return new TbEntityLocalSubsInfo(TenantId.fromUUID(UUID.randomUUID()), new DeviceId(UUID.randomUUID()));
}
private void checkEvent(TbEntitySubEvent event, Set<TbAttributeSubscription> expectedSubs, ComponentLifecycleEvent expectedType) {

6
application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java

@ -22,7 +22,7 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.debug.TbMsgGeneratorNode;
import org.thingsboard.rule.engine.debug.TbMsgGeneratorNodeConfiguration;
@ -127,9 +127,9 @@ import static org.mockito.Mockito.verify;
@DaoSqlTest
public class ExportImportServiceSqlTest extends AbstractControllerTest {
@SpyBean
@MockitoSpyBean
private EntityActionService entityActionService;
@SpyBean
@MockitoSpyBean
private OtaPackageStateService otaPackageStateService;
@Autowired

2
application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java

@ -477,7 +477,7 @@ public class VersionControlTest extends AbstractControllerTest {
Dashboard importedOtherDashboard = findDashboard(otherDashboard.getName());
Dashboard importedDashboard = findDashboard(dashboard.getName());
Map.Entry<String, JsonNode> entityAlias = importedDashboard.getConfiguration().get("entityAliases").fields().next();
Map.Entry<String, JsonNode> entityAlias = importedDashboard.getConfiguration().get("entityAliases").properties().iterator().next();
assertThat(entityAlias.getKey()).isEqualTo(aliasId);
assertThat(entityAlias.getValue().get("id").asText()).isEqualTo(aliasId);

58
application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java

@ -20,8 +20,8 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.thingsboard.server.cache.ota.OtaPackageDataCache;
@ -69,38 +69,60 @@ import static org.mockito.Mockito.when;
@Slf4j
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = DefaultTransportApiService.class)
@ContextConfiguration(classes = DefaultTransportApiServiceTest.ContextConfiguration.class)
public class DefaultTransportApiServiceTest {
@MockBean
@org.springframework.context.annotation.Configuration
static class ContextConfiguration {
@org.springframework.context.annotation.Bean
public DefaultTransportApiService defaultTransportApiService(TbDeviceProfileCache deviceProfileCache,
TbTenantProfileCache tenantProfileCache,
TbApiUsageStateService apiUsageStateService,
DeviceService deviceService,
DeviceProfileService deviceProfileService,
RelationService relationService,
DeviceCredentialsService deviceCredentialsService,
TbClusterService tbClusterService,
DeviceProvisionService deviceProvisionService,
ResourceService resourceService,
OtaPackageService otaPackageService,
OtaPackageDataCache otaPackageDataCache,
QueueService queueService) {
return new DefaultTransportApiService(deviceProfileCache, tenantProfileCache, apiUsageStateService,
deviceService, deviceProfileService, relationService, deviceCredentialsService, tbClusterService,
deviceProvisionService, resourceService, otaPackageService, otaPackageDataCache, queueService);
}
}
@MockitoBean
protected TbDeviceProfileCache deviceProfileCache;
@MockBean
@MockitoBean
protected TbTenantProfileCache tenantProfileCache;
@MockBean
@MockitoBean
protected TbApiUsageStateService apiUsageStateService;
@MockBean
@MockitoBean
protected DeviceService deviceService;
@MockBean
@MockitoBean
protected DeviceProfileService deviceProfileService;
@MockBean
@MockitoBean
protected RelationService relationService;
@MockBean
@MockitoBean
protected DeviceCredentialsService deviceCredentialsService;
@MockBean
@MockitoBean
protected DbCallbackExecutorService dbCallbackExecutorService;
@MockBean
@MockitoBean
protected TbClusterService tbClusterService;
@MockBean
@MockitoBean
protected DeviceProvisionService deviceProvisionService;
@MockBean
@MockitoBean
protected ResourceService resourceService;
@MockBean
@MockitoBean
protected OtaPackageService otaPackageService;
@MockBean
@MockitoBean
protected OtaPackageDataCache otaPackageDataCache;
@MockBean
@MockitoBean
protected QueueService queueService;
@SpyBean
@MockitoSpyBean
DefaultTransportApiService service;
private String certificateChain;

6
application/src/test/java/org/thingsboard/server/service/ttl/AlarmsCleanUpServiceTest.java

@ -21,7 +21,7 @@ import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.alarm.Alarm;
@ -50,9 +50,9 @@ import static org.mockito.Mockito.verify;
})
public class AlarmsCleanUpServiceTest extends AbstractControllerTest {
@SpyBean
@MockitoSpyBean
private AlarmsCleanUpService alarmsCleanUpService;
@SpyBean
@MockitoSpyBean
private AlarmService alarmService;
@Autowired
private AlarmDao alarmDao;

2
application/src/test/java/org/thingsboard/server/service/ws/DefaultWebSocketServiceTest.java

@ -113,7 +113,7 @@ class DefaultWebSocketServiceTest {
assertThat(publicUserSubscriptionsMap).as("map should contain tenant1").containsKey(tenant1);
assertThat(publicUserSubscriptionsMap).as("map should contain tenant2").containsKey(tenant2);
assertThat(publicUserSubscriptionsMap).as("map must not have a single NULL_UUID entry for all tenants")
.doesNotContainKey(new TenantId(EntityId.NULL_UUID));
.doesNotContainKey(TenantId.fromUUID(EntityId.NULL_UUID));
assertThat(publicUserSubscriptionsMap.get(tenant1))
.as("tenant1 should have exactly %d subscriptions", maxPublicSubscriptions)

8
application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java

@ -37,7 +37,7 @@ import org.junit.Assert;
import org.junit.Before;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.http.HttpStatus;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
@ -102,10 +102,10 @@ import java.util.concurrent.atomic.AtomicLong;
import static org.awaitility.Awaitility.await;
import static org.eclipse.leshan.client.object.Security.noSec;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.timeout;
@ -133,10 +133,10 @@ import static org.thingsboard.server.transport.lwm2m.ota.AbstractOtaLwM2MIntegra
})
public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportIntegrationTest {
@SpyBean
@MockitoSpyBean
protected LwM2mUplinkMsgHandler defaultLwM2mUplinkMsgHandlerTest;
@SpyBean
@MockitoSpyBean
protected DefaultLwM2mUplinkMsgHandler defaultUplinkMsgHandlerTest;
@Autowired

14
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/AbstractRpcLwM2MIntegrationTest.java

@ -22,7 +22,7 @@ import org.eclipse.leshan.core.link.LinkParser;
import org.eclipse.leshan.core.link.lwm2m.DefaultLwM2mLinkParser;
import org.junit.Before;
import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MDeviceCredentials;
@ -77,16 +77,16 @@ public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MInteg
protected final LinkParser linkParser = new DefaultLwM2mLinkParser();
protected String CONFIG_PROFILE_WITH_PARAMS_RPC;
public Set expectedObjects;
public Set expectedObjectIdVers;
public Set expectedInstances;
public Set expectedObjectIdVerInstances;
public Set<String> expectedObjects;
public Set<String> expectedObjectIdVers;
public Set<String> expectedInstances;
public Set<String> expectedObjectIdVerInstances;
protected String objectInstanceIdVer_1;
protected String objectIdVer_0;
protected String objectIdVer_1;
protected String objectIdVer_2;
private static final Predicate PREDICATE_3 = path -> (!((String) path).startsWith("/" + TEMPERATURE_SENSOR) && ((String) path).startsWith("/" + DEVICE));
private static final Predicate<String> PREDICATE_3 = path -> (!((String) path).startsWith("/" + TEMPERATURE_SENSOR) && ((String) path).startsWith("/" + DEVICE));
protected String objectIdVer_3;
protected String objectInstanceIdVer_3;
protected String objectInstanceIdVer_5;
@ -103,7 +103,7 @@ public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MInteg
protected String idVer_19_0_0;
@SpyBean
@MockitoSpyBean
protected LwM2mTransportServerHelper lwM2mTransportServerHelperTest;
@Before

4
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/diffPort/AbstractLwM2MIntegrationDiffPortTest.java

@ -24,7 +24,7 @@ import org.eclipse.leshan.server.registration.RegistrationStore;
import org.eclipse.leshan.server.registration.RegistrationUpdate;
import org.junit.Assert;
import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration;
@ -49,7 +49,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MClient
@Slf4j
public abstract class AbstractLwM2MIntegrationDiffPortTest extends AbstractSecurityLwM2MIntegrationTest {
@SpyBean
@MockitoSpyBean
private RegistrationStore registrationStoreTest;
protected void basicTestConnectionDifferentPort(Lwm2mDeviceProfileTransportConfiguration transportConfiguration,

4
application/src/test/java/org/thingsboard/server/transport/mqtt/MqttGatewayRateLimitsTest.java

@ -22,7 +22,7 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.context.TestPropertySource;
@ -71,7 +71,7 @@ public class MqttGatewayRateLimitsTest extends AbstractControllerTest {
private Device gateway;
private String gatewayAccessToken;
@SpyBean
@MockitoSpyBean
private NotificationRuleProcessor notificationRuleProcessor;
@Before

4
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/telemetry/timeseries/AbstractMqttTimeseriesIntegrationTest.java

@ -21,7 +21,7 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.id.DeviceId;
@ -67,7 +67,7 @@ public abstract class AbstractMqttTimeseriesIntegrationTest extends AbstractMqtt
protected static final String MALFORMED_JSON_PAYLOAD = "{\"key1\":, \"key2\":true, \"key3\": 3.0, \"key4\": 4," +
" \"key5\": {\"someNumber\": 42, \"someArray\": [1,2,3], \"someNestedObject\": {\"key\": \"value\"}}}";
@SpyBean
@MockitoSpyBean
GatewayMetricsService gatewayMetricsService;
@Before

8
common/cache/src/main/java/org/thingsboard/server/cache/ota/RedisOtaPackageDataCache.java

@ -39,26 +39,26 @@ public class RedisOtaPackageDataCache implements OtaPackageDataCache {
public byte[] get(String key, int chunkSize, int chunk) {
try (RedisConnection connection = redisConnectionFactory.getConnection()) {
if (chunkSize == 0) {
return connection.get(toOtaPackageCacheKey(key));
return connection.stringCommands().get(toOtaPackageCacheKey(key));
}
int startIndex = chunkSize * chunk;
int endIndex = startIndex + chunkSize - 1;
return connection.getRange(toOtaPackageCacheKey(key), startIndex, endIndex);
return connection.stringCommands().getRange(toOtaPackageCacheKey(key), startIndex, endIndex);
}
}
@Override
public void put(String key, byte[] value) {
try (RedisConnection connection = redisConnectionFactory.getConnection()) {
connection.set(toOtaPackageCacheKey(key), value);
connection.stringCommands().set(toOtaPackageCacheKey(key), value);
}
}
@Override
public void evict(String key) {
try (RedisConnection connection = redisConnectionFactory.getConnection()) {
connection.del(toOtaPackageCacheKey(key));
connection.keyCommands().del(toOtaPackageCacheKey(key));
}
}

2
common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java

@ -23,6 +23,8 @@ import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import static org.thingsboard.server.common.data.StringUtils.removeStart;
public enum EntityType {
TENANT(1),

2
common/data/src/main/java/org/thingsboard/server/common/data/EventInfo.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EventId;
import org.thingsboard.server.common.data.id.TenantId;
@ -26,6 +27,7 @@ import org.thingsboard.server.common.data.id.TenantId;
* @author Andrew Shvayka
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Schema
public class EventInfo extends BaseData<EventId> {

2
common/data/src/main/java/org/thingsboard/server/common/data/HomeDashboard.java

@ -17,9 +17,11 @@ package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Schema
@Data
@EqualsAndHashCode(callSuper = false)
public class HomeDashboard extends Dashboard {
public static final String HIDE_DASHBOARD_TOOLBAR_DESCRIPTION = "Hide dashboard toolbar flag. Useful for rendering dashboards on mobile.";

2
common/data/src/main/java/org/thingsboard/server/common/data/TenantInfo.java

@ -17,10 +17,12 @@ package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.TenantId;
@Schema
@Data
@EqualsAndHashCode(callSuper = false)
public class TenantInfo extends Tenant {
@Schema(description = "Tenant Profile name", example = "Default")
private String tenantProfileName;

1
common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmComment.java

@ -34,6 +34,7 @@ import java.io.Serial;
@Schema
@Data
@EqualsAndHashCode(callSuper = false)
@Builder
@AllArgsConstructor
public class AlarmComment extends BaseData<AlarmCommentId> implements HasName {

2
common/data/src/main/java/org/thingsboard/server/common/data/device/data/CoapDeviceTransportConfiguration.java

@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.DeviceTransportType;
import java.util.HashMap;
@ -27,6 +28,7 @@ import java.util.Map;
@Data
@Schema
@EqualsAndHashCode(callSuper = false)
public class CoapDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration {
private static final long serialVersionUID = 6061442236008925609L;

2
common/data/src/main/java/org/thingsboard/server/common/data/device/data/Lwm2mDeviceTransportConfiguration.java

@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.DeviceTransportType;
import java.util.HashMap;
@ -27,6 +28,7 @@ import java.util.Map;
@Schema
@Data
@EqualsAndHashCode(callSuper = false)
public class Lwm2mDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration {
@JsonIgnore

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/bootstrap/LwM2MServerSecurityConfigDefault.java

@ -17,9 +17,11 @@ package org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Schema
@Data
@EqualsAndHashCode(callSuper = false)
public class LwM2MServerSecurityConfigDefault extends LwM2MServerSecurityConfig {
@Schema(description = "Host for 'Security' mode (DTLS)", example = "0.0.0.0", accessMode = Schema.AccessMode.READ_ONLY)
protected String securityHost;

2
common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeInfo.java

@ -16,9 +16,11 @@
package org.thingsboard.server.common.data.edge;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EdgeId;
@Data
@EqualsAndHashCode(callSuper = false)
public class EdgeInfo extends Edge {
private String customerTitle;

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetFields.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -26,6 +27,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class AssetFields extends AbstractEntityFields implements ProfileAwareFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetProfileFields.java

@ -16,12 +16,14 @@
package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class AssetProfileFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/CustomerFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class CustomerFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DashboardFields.java

@ -19,6 +19,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -28,6 +29,7 @@ import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class DashboardFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceFields.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -26,6 +27,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class DeviceFields extends AbstractEntityFields implements ProfileAwareFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceProfileFields.java

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.thingsboard.server.common.data.DeviceProfileType;
@ -23,6 +24,7 @@ import org.thingsboard.server.common.data.DeviceProfileType;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class DeviceProfileFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EdgeFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class EdgeFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EntityViewFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class EntityViewFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/QueueStatsFields.java

@ -16,12 +16,14 @@
package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class QueueStatsFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/RuleChainFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class RuleChainFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class TenantFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantProfileFields.java

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.thingsboard.server.common.data.id.TenantId;
@ -23,6 +24,7 @@ import org.thingsboard.server.common.data.id.TenantId;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class TenantProfileFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/UserFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@SuperBuilder
public class UserFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/job/task/Task.java

@ -46,7 +46,7 @@ public abstract class Task<R extends TaskResult> {
public Task() {
}
private int attempt = 0;
private int attempt;
public abstract R toFailed(Throwable error);

2
common/data/src/main/java/org/thingsboard/server/common/data/kv/BaseDeleteTsKvQuery.java

@ -16,8 +16,10 @@
package org.thingsboard.server.common.data.kv;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class BaseDeleteTsKvQuery extends BaseTsKvQuery implements DeleteTsKvQuery {
private final Boolean rewriteLatestIfDeleted;

1
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobileLayoutConfig.java

@ -40,6 +40,7 @@ public class MobileLayoutConfig {
@ArraySchema(schema = @Schema(implementation = MobilePage.class))
@JsonView(Views.Public.class)
@Valid
@Builder.Default
private List<MobilePage> pages = new ArrayList<>();
}

2
common/data/src/main/java/org/thingsboard/server/common/data/query/AlarmCountQuery.java

@ -19,6 +19,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.thingsboard.server.common.data.alarm.AlarmSearchStatus;
@ -31,6 +32,7 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Data
@EqualsAndHashCode(callSuper = false)
@ToString
@Schema
public class AlarmCountQuery extends EntityCountQuery {

2
common/data/src/main/java/org/thingsboard/server/common/data/queue/Queue.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.queue;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.BaseDataWithAdditionalInfo;
import org.thingsboard.server.common.data.HasName;
import org.thingsboard.server.common.data.HasTenantId;
@ -30,6 +31,7 @@ import org.thingsboard.server.common.data.validation.NoXss;
import java.util.Optional;
@Data
@EqualsAndHashCode(callSuper = false)
public class Queue extends BaseDataWithAdditionalInfo<QueueId> implements HasName, HasTenantId, QueueConfig {
private TenantId tenantId;
@NoXss

2
common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleNodeState.java

@ -16,12 +16,14 @@
package org.thingsboard.server.common.data.rule;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.BaseData;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.id.RuleNodeStateId;
@Data
@EqualsAndHashCode(callSuper = false)
public class RuleNodeState extends BaseData<RuleNodeStateId> {
private RuleNodeId ruleNodeId;

4
common/data/src/main/java/org/thingsboard/server/common/data/tenant/profile/DefaultTenantProfileConfiguration.java

@ -169,8 +169,10 @@ public class DefaultTenantProfileConfiguration implements TenantProfileConfigura
private double warnThreshold;
@Builder.Default
@Schema(example = "5")
private long maxCalculatedFieldsPerEntity = 5;
@Builder.Default
@Schema(example = "10")
private long maxArgumentsPerCF = 10;
@Schema(example = "10")
@ -188,8 +190,10 @@ public class DefaultTenantProfileConfiguration implements TenantProfileConfigura
@Positive
@Schema(example = "1000")
private long maxDataPointsPerRollingArg = 1000;
@Builder.Default
@Schema(example = "32")
private long maxStateSizeInKBytes = 32;
@Builder.Default
@Schema(example = "2")
private long maxSingleValueArgumentSizeInKBytes = 2;
@Schema(example = "10")

3
common/data/src/main/java/org/thingsboard/server/common/data/util/CollectionsUtil.java

@ -85,6 +85,7 @@ public class CollectionsUtil {
return result;
}
@SafeVarargs
public static <V> boolean isOneOf(V value, V... others) {
if (value == null) {
return false;
@ -134,7 +135,7 @@ public class CollectionsUtil {
Set<T> newSet = new HashSet<>(existing.size() + 1);
newSet.addAll(existing);
newSet.add(value);
return (Set<T>) Set.of(newSet.toArray());
return Set.copyOf(newSet);
}
public static boolean isEmpty(Map<?, ?> map) {

2
common/data/src/main/java/org/thingsboard/server/common/data/util/TemplateUtils.java

@ -23,7 +23,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.google.common.base.Strings.nullToEmpty;
import static org.apache.commons.lang3.StringUtils.removeStart;
import static org.thingsboard.server.common.data.StringUtils.removeStart;
public class TemplateUtils {

2
common/data/src/main/java/org/thingsboard/server/common/data/util/TypeCastUtil.java

@ -69,7 +69,7 @@ public class TypeCastUtil {
}
private static boolean isNumber(String value) {
return NumberUtils.isNumber(value.replace(',', '.'));
return NumberUtils.isCreatable(value.replace(',', '.'));
}
private static boolean isSimpleDouble(String valueAsString) {

2
common/data/src/main/java/org/thingsboard/server/common/data/widget/WidgetTypeInfo.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.widget;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.WidgetTypeId;
import org.thingsboard.server.common.data.validation.NoXss;
@ -26,6 +27,7 @@ import java.util.Collections;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
public class WidgetTypeInfo extends BaseWidgetType {
@Serial

48
common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java

@ -26,9 +26,8 @@ import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.imps.CuratorFrameworkState;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.framework.recipes.cache.CuratorCache;
import org.apache.curator.framework.recipes.cache.CuratorCacheListener;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.retry.RetryForever;
@ -54,12 +53,12 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent.Type.CHILD_REMOVED;
import static org.apache.curator.framework.recipes.cache.CuratorCacheAccessor.parentPathFilter;
@Service
@ConditionalOnProperty(prefix = "zk", value = "enabled", havingValue = "true", matchIfMissing = false)
@Slf4j
public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheListener {
public class ZkDiscoveryService implements DiscoveryService {
@Value("${zk.url}")
private String zkUrl;
@ -84,7 +83,7 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
private ScheduledExecutorService zkExecutorService;
@Getter
private CuratorFramework client;
private PathChildrenCache cache;
private CuratorCache cache;
private String nodePath;
private String zkNodesDir;
@ -117,7 +116,8 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
@Override
public List<TransportProtos.ServiceInfo> getOtherServers() {
return cache.getCurrentData().stream()
return cache.stream()
.filter(parentPathFilter(zkNodesDir))
.filter(cd -> !cd.getPath().equals(nodePath))
.map(cd -> {
try {
@ -241,7 +241,8 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
client = CuratorFrameworkFactory.newClient(zkUrl, zkSessionTimeout, zkConnectionTimeout, new RetryForever(zkRetryInterval));
client.start();
client.blockUntilConnected();
cache = new PathChildrenCache(client, zkNodesDir, true);
client.createContainers(zkNodesDir);
cache = CuratorCache.builder(client, zkNodesDir).build();
cache.start();
stopped = false;
log.info("ZK client connected");
@ -254,7 +255,7 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
}
private void subscribeToEvents() {
cache.getListenable().addListener(this);
cache.listenable().addListener(this::onCacheEvent);
}
private void unpublishCurrentServer() {
@ -286,29 +287,32 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
return "The " + propertyName + " property need to be set!";
}
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
@SneakyThrows
void onCacheEvent(CuratorCacheListener.Type type, ChildData oldData, ChildData newData) {
if (stopped) {
log.debug("Ignoring {}. Service is stopped.", pathChildrenCacheEvent);
log.debug("Ignoring {}. Service is stopped.", type);
return;
}
if (client.getState() != CuratorFrameworkState.STARTED) {
log.debug("Ignoring {}, ZK client is not started, ZK client state [{}]", pathChildrenCacheEvent, client.getState());
log.debug("Ignoring {}, ZK client is not started, ZK client state [{}]", type, client.getState());
return;
}
ChildData data = pathChildrenCacheEvent.getData();
ChildData data = type == CuratorCacheListener.Type.NODE_DELETED ? oldData : newData;
if (data == null) {
log.debug("Ignoring {} due to empty child data", pathChildrenCacheEvent);
log.debug("Ignoring {} due to empty child data", type);
return;
} else if (data.getData() == null) {
log.debug("Ignoring {} due to empty child's data", pathChildrenCacheEvent);
log.debug("Ignoring {} due to empty child's data", type);
return;
} else if (zkNodesDir.equals(data.getPath())) {
log.debug("Ignoring event about parent node {}", data.getPath());
return;
} else if (nodePath != null && nodePath.equals(data.getPath())) {
if (pathChildrenCacheEvent.getType() == CHILD_REMOVED) {
if (type == CuratorCacheListener.Type.NODE_DELETED) {
log.info("ZK node for current instance is somehow deleted.");
publishCurrentServer();
}
log.debug("Ignoring event about current server {}", pathChildrenCacheEvent);
log.debug("Ignoring event about current server {}", data.getPath());
return;
}
TransportProtos.ServiceInfo instance;
@ -322,9 +326,9 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
String serviceId = instance.getServiceId();
ProtocolStringList serviceTypesList = instance.getServiceTypesList();
log.trace("Processing [{}] event for [{}]", pathChildrenCacheEvent.getType(), serviceId);
switch (pathChildrenCacheEvent.getType()) {
case CHILD_ADDED:
log.trace("Processing [{}] event for [{}]", type, serviceId);
switch (type) {
case NODE_CREATED:
ScheduledFuture<?> task = delayedTasks.remove(serviceId);
if (task != null) {
if (task.cancel(false)) {
@ -341,7 +345,7 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
recalculatePartitions();
}
break;
case CHILD_REMOVED:
case NODE_DELETED:
zkExecutorService.submit(() -> applicationEventPublisher.publishEvent(new OtherServiceShutdownEvent(this, serviceId, serviceTypesList)));
ScheduledFuture<?> future = zkExecutorService.schedule(() -> {
log.debug("[{}] Going to recalculate partitions due to removed node [{}]",

31
common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java

@ -18,8 +18,8 @@ package org.thingsboard.server.queue.discovery;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.imps.CuratorFrameworkState;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.CuratorCache;
import org.apache.curator.framework.recipes.cache.CuratorCacheListener;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ -36,8 +36,8 @@ import java.util.Collections;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import static org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent.Type.CHILD_ADDED;
import static org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent.Type.CHILD_REMOVED;
import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.Type.NODE_CREATED;
import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.Type.NODE_DELETED;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@ -63,12 +63,10 @@ public class ZkDiscoveryServiceTest {
private CuratorFramework client;
@Mock
private PathChildrenCache cache;
@Mock
private CuratorFramework curatorFramework;
private CuratorCache cache;
private ZkDiscoveryService zkDiscoveryService;
private List<ChildData> dataList;
private static final long RECALCULATE_DELAY = 100L;
@ -89,12 +87,13 @@ public class ZkDiscoveryServiceTest {
ReflectionTestUtils.setField(zkDiscoveryService, "zkExecutorService", zkExecutorService);
ReflectionTestUtils.setField(zkDiscoveryService, "recalculateDelay", RECALCULATE_DELAY);
ReflectionTestUtils.setField(zkDiscoveryService, "zkDir", "/thingsboard");
ReflectionTestUtils.setField(zkDiscoveryService, "zkNodesDir", "/thingsboard/nodes");
when(serviceInfoProvider.getServiceInfo()).thenReturn(currentInfo);
List<ChildData> dataList = new ArrayList<>();
dataList = new ArrayList<>();
dataList.add(currentData);
when(cache.getCurrentData()).thenReturn(dataList);
when(cache.stream()).thenAnswer(inv -> dataList.stream());
}
@Test
@ -178,14 +177,14 @@ public class ZkDiscoveryServiceTest {
verify(partitionService, times(1)).recalculatePartitions(eq(currentInfo), eq(List.of(anotherInfo, childInfo)));
}
private void startNode(ChildData data) throws Exception {
cache.getCurrentData().add(data);
zkDiscoveryService.childEvent(curatorFramework, new PathChildrenCacheEvent(CHILD_ADDED, data));
private void startNode(ChildData data) {
dataList.add(data);
zkDiscoveryService.onCacheEvent(NODE_CREATED, null, data);
}
private void stopNode(ChildData data) throws Exception {
cache.getCurrentData().remove(data);
zkDiscoveryService.childEvent(curatorFramework, new PathChildrenCacheEvent(CHILD_REMOVED, data));
private void stopNode(ChildData data) {
dataList.remove(data);
zkDiscoveryService.onCacheEvent(NODE_DELETED, data, null);
}
}

2
common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java

@ -1332,7 +1332,7 @@ public class TbUtils {
for (byte b : byteArray) {
byteList.add(b);
}
ExecutionArrayList<Byte> list = new ExecutionArrayList(byteList, ctx);
ExecutionArrayList<Byte> list = new ExecutionArrayList<>(byteList, ctx);
return list;
}

12
common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java

@ -1281,13 +1281,13 @@ public class TbUtilsTest {
}
@Test
public void setTest() throws ExecutionException, InterruptedException {
Set actual = TbUtils.newSet(ctx);
Set expected = toSet(new byte[]{(byte) 0xDD, (byte) 0xCC, (byte) 0xCC});
Set<Byte> actual = TbUtils.newSet(ctx);
Set<Byte> expected = toSet(new byte[]{(byte) 0xDD, (byte) 0xCC, (byte) 0xCC});
actual.add((byte) 0xDD);
actual.add((byte) 0xCC);
actual.add((byte) 0xCC);
assertTrue(expected.containsAll(actual));
List list = toList(new byte[]{(byte) 0xDD, (byte) 0xCC, (byte) 0xBB, (byte) 0xAA});
List<Byte> list = toList(new byte[]{(byte) 0xDD, (byte) 0xCC, (byte) 0xBB, (byte) 0xAA});
actual.addAll(list);
assertEquals(4, actual.size());
assertTrue(actual.containsAll(expected));
@ -1301,9 +1301,9 @@ public class TbUtilsTest {
actual.clear();
assertTrue(actual.isEmpty());
actual = TbUtils.toSet(ctx, list);
Set actualClone = TbUtils.toSet(ctx, list);
Set actualClone_asc = TbUtils.toSet(ctx, list);
Set actualClone_desc = TbUtils.toSet(ctx, list);
Set<Byte> actualClone = TbUtils.toSet(ctx, list);
Set<Byte> actualClone_asc = TbUtils.toSet(ctx, list);
Set<Byte> actualClone_desc = TbUtils.toSet(ctx, list);
((ExecutionLinkedHashSet<?>)actualClone).sort();
((ExecutionLinkedHashSet<?>)actualClone_asc).sort(true);
((ExecutionLinkedHashSet<?>)actualClone_desc).sort(false);

7
common/transport/http/src/test/java/org/thingsboard/server/transport/http/DeviceApiControllerTest.java

@ -18,6 +18,7 @@ package org.thingsboard.server.transport.http;
import com.google.gson.JsonParseException;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.context.request.async.DeferredResult;
@ -37,7 +38,7 @@ class DeviceApiControllerTest {
};
var callback = new DeviceApiController.DeviceAuthCallback(transportContext, responseWriter, onSuccess);
callback.onError(new HttpMessageNotReadableException("JSON incorrect syntax"));
callback.onError(new HttpMessageNotReadableException("JSON incorrect syntax", (HttpInputMessage) null));
callback.onError(new JsonParseException("Json ; expected"));
@ -51,7 +52,7 @@ class DeviceApiControllerTest {
DeferredResult<ResponseEntity> responseWriter = Mockito.mock(DeferredResult.class);
var callback = new DeviceApiController.DeviceProvisionCallback(responseWriter);
callback.onError(new HttpMessageNotReadableException("JSON incorrect syntax"));
callback.onError(new HttpMessageNotReadableException("JSON incorrect syntax", (HttpInputMessage) null));
callback.onError(new JsonParseException("Json ; expected"));
@ -71,7 +72,7 @@ class DeviceApiControllerTest {
var callback = new DeviceApiController.GetOtaPackageCallback(transportContext, responseWriter, title, version, chunkSize, chunk);
callback.onError(new HttpMessageNotReadableException("JSON incorrect syntax"));
callback.onError(new HttpMessageNotReadableException("JSON incorrect syntax", (HttpInputMessage) null));
callback.onError(new JsonParseException("Json ; expected"));

2
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/DefaultLwM2mDownlinkMsgHandler.java

@ -823,7 +823,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
LwM2mPath pathSingleOb = singleObs.getPath();
LwM2mPath pathObjectId = new LwM2mPath(objectId);
if (!pathSingleOb.toString().equals(objectId)) {
List paths = Arrays.asList(pathSingleOb, pathObjectId);
List<LwM2mPath> paths = Arrays.asList(pathSingleOb, pathObjectId);
try {
LwM2mPath.validateNotOverlapping(paths);
} catch (IllegalArgumentException e){

12
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java

@ -212,7 +212,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
String[] versionedIds = getIdsFromParameters(client, requestMsg);
TbLwM2MReadCompositeRequest request = TbLwM2MReadCompositeRequest.builder().versionedIds(versionedIds).timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MReadCompositeCallback(uplinkHandler, logService, client, versionedIds);
var rpcCallback = new RpcReadResponseCompositeCallback(transportService, client, requestMsg, mainCallback);
var rpcCallback = new RpcReadResponseCompositeCallback<>(transportService, client, requestMsg, mainCallback);
downlinkHandler.sendReadCompositeRequest(client, request, rpcCallback);
}
@ -329,7 +329,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
} else if (path.isResource()) {
validateResource(client, newNodes, nodes, key , value);
} else if (path.isObjectInstance() && value instanceof Map<?, ?>) {
((Map) value).forEach((k, v) -> {
((Map<?, ?>) value).forEach((k, v) -> {
validateResource(client, newNodes, nodes, validateResourceId (key, k.toString(), nodes), v);
});
} else {
@ -343,7 +343,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
return newNodes;
}
private void validateResource(LwM2mClient client, Map newNodes, Map nodes, String resourceId , Object value) {
private void validateResource(LwM2mClient client, Map<String, Object> newNodes, Map<String, Object> nodes, String resourceId , Object value) {
if (value instanceof Map<?, ?>) {
((Map<?, ?>) value).forEach((k, v) -> {
setValueToCompositeNodes(client, newNodes, nodes, validateResourceId (resourceId, k.toString(), nodes), v);
@ -353,7 +353,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
}
}
private String validateResourceId (String key, String id, Map nodes) {
private String validateResourceId (String key, String id, Map<String, Object> nodes) {
try {
Integer.parseInt(id);
return key + "/" + id;
@ -363,7 +363,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
}
}
private void setValueToCompositeNodes (LwM2mClient client, Map newNodes, Map nodes, String versionedId , Object value) {
private void setValueToCompositeNodes (LwM2mClient client, Map<String, Object> newNodes, Map<String, Object> nodes, String versionedId , Object value) {
// validate value. Must be only primitive, not JsonObject or JsonArray
try {
JsonElement element = JsonUtils.parse(value);
@ -394,7 +394,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
String[] versionedIds = getIdsFromParameters(client, requestMsg);
TbLwM2MObserveCompositeRequest request = TbLwM2MObserveCompositeRequest.builder().versionedIds(versionedIds).timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MObserveCompositeCallback(uplinkHandler, logService, client, versionedIds);
var rpcCallback = new RpcObserveResponseCompositeCallback(transportService, client, requestMsg, mainCallback);
var rpcCallback = new RpcObserveResponseCompositeCallback<>(transportService, client, requestMsg, mainCallback);
downlinkHandler.sendObserveCompositeRequest(client, request, rpcCallback);
}

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2MDtlsSessionRedisStore.java

@ -33,7 +33,7 @@ public class TbLwM2MDtlsSessionRedisStore implements TbLwM2MDtlsSessionStore {
try (var c = connectionFactory.getConnection()) {
var serializedMsg = JavaSerDesUtil.encode(msg);
if (serializedMsg != null) {
c.set(getKey(endpoint), serializedMsg);
c.stringCommands().set(getKey(endpoint), serializedMsg);
} else {
throw new RuntimeException("Problem with serialization of message: " + msg);
}
@ -43,7 +43,7 @@ public class TbLwM2MDtlsSessionRedisStore implements TbLwM2MDtlsSessionStore {
@Override
public TbX509DtlsSessionInfo get(String endpoint) {
try (var c = connectionFactory.getConnection()) {
var data = c.get(getKey(endpoint));
var data = c.stringCommands().get(getKey(endpoint));
if (data != null) {
return JavaSerDesUtil.decode(data);
} else {
@ -55,7 +55,7 @@ public class TbLwM2MDtlsSessionRedisStore implements TbLwM2MDtlsSessionStore {
@Override
public void remove(String endpoint) {
try (var c = connectionFactory.getConnection()) {
c.del(getKey(endpoint));
c.keyCommands().del(getKey(endpoint));
}
}

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2mRedisClientOtaInfoStore.java

@ -33,7 +33,7 @@ public class TbLwM2mRedisClientOtaInfoStore implements TbLwM2MClientOtaInfoStore
private void put(OtaPackageType type, LwM2MClientOtaInfo<?, ?, ?> info) {
try (var connection = connectionFactory.getConnection()) {
connection.set((OTA_EP + type + info.getEndpoint()).getBytes(), JacksonUtil.toString(info).getBytes());
connection.stringCommands().set((OTA_EP + type + info.getEndpoint()).getBytes(), JacksonUtil.toString(info).getBytes());
}
}
@ -59,7 +59,7 @@ public class TbLwM2mRedisClientOtaInfoStore implements TbLwM2MClientOtaInfoStore
private <T extends LwM2MClientOtaInfo<?, ?, ?>> T getLwM2MClientOtaInfo(OtaPackageType type, String endpoint, Class<T> clazz) {
try (var connection = connectionFactory.getConnection()) {
byte[] data = connection.get((OTA_EP + type + endpoint).getBytes());
byte[] data = connection.stringCommands().get((OTA_EP + type + endpoint).getBytes());
return JacksonUtil.fromBytes(data, clazz);
}
}

68
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2mRedisRegistrationStore.java

@ -163,15 +163,15 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
lock.lock();
// add registration
byte[] k = toEndpointKey(registration.getEndpoint());
byte[] old = connection.getSet(k, serializeReg(registration));
byte[] old = connection.stringCommands().getSet(k, serializeReg(registration));
// add registration: secondary indexes
byte[] regid_idx = toRegIdKey(registration.getId());
connection.set(regid_idx, registration.getEndpoint().getBytes(UTF_8));
connection.stringCommands().set(regid_idx, registration.getEndpoint().getBytes(UTF_8));
byte[] addr_idx = toRegAddrKey(registration.getSocketAddress());
connection.set(addr_idx, registration.getEndpoint().getBytes(UTF_8));
connection.stringCommands().set(addr_idx, registration.getEndpoint().getBytes(UTF_8));
byte[] identity_idx = toRegIdentityKey(registration.getClientTransportData().getIdentity());
connection.set(identity_idx, registration.getEndpoint().getBytes(UTF_8));
connection.stringCommands().set(identity_idx, registration.getEndpoint().getBytes(UTF_8));
// Add or update expiration
addOrUpdateExpiration(connection, registration);
@ -180,7 +180,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
Registration oldRegistration = deserializeReg(old);
// remove old secondary index
if (!registration.getId().equals(oldRegistration.getId()))
connection.del(toRegIdKey(oldRegistration.getId()));
connection.keyCommands().del(toRegIdKey(oldRegistration.getId()));
if (!oldRegistration.getSocketAddress().equals(registration.getSocketAddress())) {
removeAddrIndex(connection, oldRegistration);
}
@ -209,7 +209,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
try (var connection = connectionFactory.getConnection()) {
// Fetch the registration ep by registration ID index
byte[] ep = connection.get(toRegIdKey(update.getRegistrationId()));
byte[] ep = connection.stringCommands().get(toRegIdKey(update.getRegistrationId()));
if (ep == null) {
return null;
}
@ -220,7 +220,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
lock.lock();
// Fetch the registration
byte[] data = connection.get(toEndpointKey(ep));
byte[] data = connection.stringCommands().get(toEndpointKey(ep));
if (data == null) {
return null;
}
@ -230,7 +230,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
Registration updatedRegistration = update.update(r);
// Store the new registration
connection.set(toEndpointKey(updatedRegistration.getEndpoint()), serializeReg(updatedRegistration));
connection.stringCommands().set(toEndpointKey(updatedRegistration.getEndpoint()), serializeReg(updatedRegistration));
// Add or update expiration
addOrUpdateExpiration(connection, updatedRegistration);
@ -239,7 +239,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
* If registration is already associated to this address we don't care as we only want to keep the most
* recent binding. */
byte[] addr_idx = toRegAddrKey(updatedRegistration.getSocketAddress());
connection.set(addr_idx, updatedRegistration.getEndpoint().getBytes(UTF_8));
connection.stringCommands().set(addr_idx, updatedRegistration.getEndpoint().getBytes(UTF_8));
if (!r.getSocketAddress().equals(updatedRegistration.getSocketAddress())) {
removeAddrIndex(connection, r);
}
@ -265,11 +265,11 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
}
private Registration getRegistration(RedisConnection connection, String registrationId) {
byte[] ep = connection.get(toRegIdKey(registrationId));
byte[] ep = connection.stringCommands().get(toRegIdKey(registrationId));
if (ep == null) {
return null;
}
byte[] data = connection.get(toEndpointKey(ep));
byte[] data = connection.stringCommands().get(toEndpointKey(ep));
if (data == null) {
return null;
}
@ -281,7 +281,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
public Registration getRegistrationByEndpoint(String endpoint) {
Validate.notNull(endpoint);
try (var connection = connectionFactory.getConnection()) {
byte[] data = connection.get(toEndpointKey(endpoint));
byte[] data = connection.stringCommands().get(toEndpointKey(endpoint));
if (data == null) {
return null;
}
@ -293,11 +293,11 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
public Registration getRegistrationByAdress(InetSocketAddress address) {
Validate.notNull(address);
try (var connection = connectionFactory.getConnection()) {
byte[] ep = connection.get(toRegAddrKey(address));
byte[] ep = connection.stringCommands().get(toRegAddrKey(address));
if (ep == null) {
return null;
}
byte[] data = connection.get(toEndpointKey(ep));
byte[] data = connection.stringCommands().get(toEndpointKey(ep));
if (data == null) {
return null;
}
@ -309,11 +309,11 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
public Registration getRegistrationByIdentity(LwM2mIdentity identity) {
Validate.notNull(identity);
try (var connection = connectionFactory.getConnection()) {
byte[] ep = connection.get(toRegIdentityKey(identity));
byte[] ep = connection.stringCommands().get(toRegIdentityKey(identity));
if (ep == null) {
return null;
}
byte[] data = connection.get(toEndpointKey(ep));
byte[] data = connection.stringCommands().get(toEndpointKey(ep));
if (data == null) {
return null;
}
@ -332,12 +332,12 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
clusterConnection.clusterGetNodes().forEach(node ->
scans.add(clusterConnection.scan(node, scanOptions)));
} else {
scans.add(scanConnection.scan(scanOptions));
scans.add(scanConnection.keyCommands().scan(scanOptions));
}
scans.forEach(scan -> {
scan.forEachRemaining(key -> {
byte[] element = getConnection.get(key);
byte[] element = getConnection.stringCommands().get(key);
if (element != null) {
list.add(deserializeReg(element));
}
@ -357,7 +357,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
private Deregistration removeRegistration(RedisConnection connection, String registrationId, boolean removeOnlyIfNotAlive) {
// fetch the client ep by registration ID index
byte[] ep = connection.get(toRegIdKey(registrationId));
byte[] ep = connection.stringCommands().get(toRegIdKey(registrationId));
if (ep == null) {
return null;
}
@ -369,16 +369,16 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
lock.lock();
// fetch the client
byte[] data = connection.get(toEndpointKey(ep));
byte[] data = connection.stringCommands().get(toEndpointKey(ep));
if (data == null) {
return null;
}
Registration r = deserializeReg(data);
if (!removeOnlyIfNotAlive || !r.isAlive(gracePeriod)) {
long nbRemoved = connection.del(toRegIdKey(r.getId()));
long nbRemoved = connection.keyCommands().del(toRegIdKey(r.getId()));
if (nbRemoved > 0) {
connection.del(toEndpointKey(r.getEndpoint()));
connection.keyCommands().del(toEndpointKey(r.getEndpoint()));
Collection<Observation> obsRemoved = unsafeRemoveAllObservations(connection, r.getId());
removeAddrIndex(connection, r);
removeIdentityIndex(connection, r);
@ -407,12 +407,12 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
// Watch the key to remove.
// connection.watch(indexKey);
byte[] epFromAddr = connection.get(indexKey);
byte[] epFromAddr = connection.stringCommands().get(indexKey);
// Delete the key if needed.
if (Arrays.equals(epFromAddr, endpointName.getBytes(UTF_8))) {
// Try to delete the key
// connection.multi();
connection.del(indexKey);
connection.keyCommands().del(indexKey);
// connection.exec();
// if transaction failed this is not an issue as the index is probably reused and we don't need to
// delete it anymore.
@ -423,11 +423,11 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
}
private void addOrUpdateExpiration(RedisConnection connection, Registration registration) {
connection.zAdd(EXP_EP, registration.getExpirationTimeStamp(gracePeriod), registration.getEndpoint().getBytes(UTF_8));
connection.zSetCommands().zAdd(EXP_EP, registration.getExpirationTimeStamp(gracePeriod), registration.getEndpoint().getBytes(UTF_8));
}
private void removeExpiration(RedisConnection connection, Registration registration) {
connection.zRem(EXP_EP, registration.getEndpoint().getBytes(UTF_8));
connection.zSetCommands().zRem(EXP_EP, registration.getEndpoint().getBytes(UTF_8));
}
private byte[] toRegIdKey(String registrationId) {
@ -556,7 +556,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
@Override
public Observation getObservation(ObservationIdentifier observationId) {
try (var connection = connectionFactory.getConnection()) {
byte[] observationValue = connection.get(toKey(OBS_TKN, observationId.getBytes()));
byte[] observationValue = connection.stringCommands().get(toKey(OBS_TKN, observationId.getBytes()));
return deserializeObs(observationValue);
}
}
@ -570,7 +570,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
try (var connection = connectionFactory.getConnection()) {
// fetch the client ep by registration ID index
byte[] ep = connection.get(toRegIdKey(registrationId));
byte[] ep = connection.stringCommands().get(toRegIdKey(registrationId));
if (ep == null) {
return null;
}
@ -635,7 +635,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
public Observation get(Token token) {
try (var connection = connectionFactory.getConnection()) {
byte[] obs = connection.get(toKey(OBS_TKN, token.getBytes()));
byte[] obs = connection.stringCommands().get(toKey(OBS_TKN, token.getBytes()));
if (obs == null) {
return null;
} else {
@ -664,14 +664,14 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
byte[] regIdKey = toKey(OBS_TKNS_REGID_IDX, registrationId);
// fetch all observations by token
for (byte[] token : connection.lRange(regIdKey, 0, -1)) {
byte[] obs = connection.get(toKey(OBS_TKN, token));
for (byte[] token : connection.listCommands().lRange(regIdKey, 0, -1)) {
byte[] obs = connection.stringCommands().get(toKey(OBS_TKN, token));
if (obs != null) {
removed.add(deserializeObs(obs));
}
connection.del(toKey(OBS_TKN, token));
connection.keyCommands().del(toKey(OBS_TKN, token));
}
connection.del(regIdKey);
connection.keyCommands().del(regIdKey);
return removed;
}
@ -752,7 +752,7 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
System.currentTimeMillis(), 0, cleanLimit);
for (byte[] endpoint : endpointsExpired) {
byte[] data = connection.get(toEndpointKey(endpoint));
byte[] data = connection.stringCommands().get(toEndpointKey(endpoint));
if (data != null && data.length > 0) {
Registration r = deserializeReg(data);
if (!r.isAlive(gracePeriod)) {

24
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2mRedisSecurityStore.java

@ -52,7 +52,7 @@ public class TbLwM2mRedisSecurityStore implements TbEditableSecurityStore {
try (var connection = connectionFactory.getConnection()) {
lock = redisLock.obtain(toLockKey(endpoint));
lock.lock();
byte[] data = connection.get((SEC_EP + endpoint).getBytes());
byte[] data = connection.stringCommands().get((SEC_EP + endpoint).getBytes());
if (data == null || data.length == 0) {
return null;
} else {
@ -96,11 +96,11 @@ public class TbLwM2mRedisSecurityStore implements TbEditableSecurityStore {
try (var connection = connectionFactory.getConnection()) {
lock = redisLock.obtain(toLockKey(identity));
lock.lock();
byte[] ep = connection.hGet(PSKID_SEC.getBytes(), identity.getBytes());
byte[] ep = connection.hashCommands().hGet(PSKID_SEC.getBytes(), identity.getBytes());
if (ep == null) {
return null;
} else {
byte[] data = connection.get((SEC_EP + new String(ep)).getBytes());
byte[] data = connection.stringCommands().get((SEC_EP + new String(ep)).getBytes());
if (data == null || data.length == 0) {
return null;
} else {
@ -128,17 +128,17 @@ public class TbLwM2mRedisSecurityStore implements TbEditableSecurityStore {
lock = redisLock.obtain(tbSecurityInfo.getEndpoint());
lock.lock();
if (info != null && info.getPskIdentity() != null) {
byte[] oldEndpointBytes = connection.hGet(PSKID_SEC.getBytes(), info.getPskIdentity().getBytes());
byte[] oldEndpointBytes = connection.hashCommands().hGet(PSKID_SEC.getBytes(), info.getPskIdentity().getBytes());
if (oldEndpointBytes != null) {
String oldEndpoint = new String(oldEndpointBytes);
if (!oldEndpoint.equals(info.getEndpoint())) {
throw new NonUniqueSecurityInfoException("PSK Identity " + info.getPskIdentity() + " is already used");
}
connection.hSet(PSKID_SEC.getBytes(), info.getPskIdentity().getBytes(), info.getEndpoint().getBytes());
connection.hashCommands().hSet(PSKID_SEC.getBytes(), info.getPskIdentity().getBytes(), info.getEndpoint().getBytes());
}
}
byte[] previousData = connection.getSet((SEC_EP + tbSecurityInfo.getEndpoint()).getBytes(), tbSecurityInfoSerialized);
byte[] previousData = connection.stringCommands().getSet((SEC_EP + tbSecurityInfo.getEndpoint()).getBytes(), tbSecurityInfoSerialized);
// for tests: redis connect NoSec (securityInfo == null)
log.info("lwm2m redis connect. Endpoint: [{}], secMode: [{}] key: [{}], tbSecurityInfoSerialized [{}]",
@ -147,7 +147,7 @@ public class TbLwM2mRedisSecurityStore implements TbEditableSecurityStore {
if (previousData != null && info != null) {
String previousIdentity = ((TbLwM2MSecurityInfo) JavaSerDesUtil.decode(previousData)).getSecurityInfo().getPskIdentity();
if (previousIdentity != null && !previousIdentity.equals(info.getPskIdentity())) {
connection.hDel(PSKID_SEC.getBytes(), previousIdentity.getBytes());
connection.hashCommands().hDel(PSKID_SEC.getBytes(), previousIdentity.getBytes());
}
}
} finally {
@ -163,7 +163,7 @@ public class TbLwM2mRedisSecurityStore implements TbEditableSecurityStore {
try (var connection = connectionFactory.getConnection()) {
lock = redisLock.obtain(endpoint);
lock.lock();
byte[] data = connection.get((SEC_EP + endpoint).getBytes());
byte[] data = connection.stringCommands().get((SEC_EP + endpoint).getBytes());
if (data != null && data.length > 0) {
return JavaSerDesUtil.decode(data);
} else {
@ -182,13 +182,13 @@ public class TbLwM2mRedisSecurityStore implements TbEditableSecurityStore {
try (var connection = connectionFactory.getConnection()) {
lock = redisLock.obtain(endpoint);
lock.lock();
byte[] data = connection.get((SEC_EP + endpoint).getBytes());
byte[] data = connection.stringCommands().get((SEC_EP + endpoint).getBytes());
if (data != null && data.length > 0) {
SecurityInfo info = ((TbLwM2MSecurityInfo) JavaSerDesUtil.decode(data)).getSecurityInfo();
if (info != null && info.getPskIdentity() != null) {
connection.hDel(PSKID_SEC.getBytes(), info.getPskIdentity().getBytes());
connection.hashCommands().hDel(PSKID_SEC.getBytes(), info.getPskIdentity().getBytes());
}
connection.del((SEC_EP + endpoint).getBytes());
connection.keyCommands().del((SEC_EP + endpoint).getBytes());
}
} finally {
if (lock != null) {
@ -203,7 +203,7 @@ public class TbLwM2mRedisSecurityStore implements TbEditableSecurityStore {
private SecurityMode getSecurityModeByRegistration (RedisConnection connection, String endpoint) {
try {
byte[] data = connection.get((REG_EP + endpoint).getBytes());
byte[] data = connection.stringCommands().get((REG_EP + endpoint).getBytes());
JsonNode registrationNode = JacksonUtil.fromString(new String(data != null ? data : new byte[0]), JsonNode.class);
String typeModeStr = registrationNode.get("transportdata").get("identity").get("type").asText();
return "unsecure".equals(typeModeStr) ? SecurityMode.NO_SEC : null;

10
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbRedisLwM2MClientStore.java

@ -45,7 +45,7 @@ public class TbRedisLwM2MClientStore implements TbLwM2MClientStore {
@Override
public LwM2mClient get(String endpoint) {
try (var connection = connectionFactory.getConnection()) {
byte[] data = connection.get(getKey(endpoint));
byte[] data = connection.stringCommands().get(getKey(endpoint));
if (data == null) {
return null;
} else {
@ -70,12 +70,12 @@ public class TbRedisLwM2MClientStore implements TbLwM2MClientStore {
clusterConnection.clusterGetNodes().forEach(node ->
scans.add(clusterConnection.scan(node, scanOptions)));
} else {
scans.add(scanConnection.scan(scanOptions));
scans.add(scanConnection.keyCommands().scan(scanOptions));
}
scans.forEach(scan -> {
scan.forEachRemaining(key -> {
byte[] element = getConnection.get(key);
byte[] element = getConnection.stringCommands().get(key);
if (element != null) {
try {
clients.add(deserialize(element));
@ -97,7 +97,7 @@ public class TbRedisLwM2MClientStore implements TbLwM2MClientStore {
try {
byte[] clientSerialized = serialize(client);
try (var connection = connectionFactory.getConnection()) {
connection.getSet(getKey(client.getEndpoint()), clientSerialized);
connection.stringCommands().getSet(getKey(client.getEndpoint()), clientSerialized);
}
} catch (Exception e) {
log.warn("Failed to serialize client: {}", client, e);
@ -108,7 +108,7 @@ public class TbRedisLwM2MClientStore implements TbLwM2MClientStore {
@Override
public void remove(String endpoint) {
try (var connection = connectionFactory.getConnection()) {
connection.del(getKey(endpoint));
connection.keyCommands().del(getKey(endpoint));
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save