Browse Source

Merge branch 'lts-4.2' into release-4.2

# Conflicts:
#	application/pom.xml
#	common/actor/pom.xml
#	common/cache/pom.xml
#	common/cluster-api/pom.xml
#	common/coap-server/pom.xml
#	common/dao-api/pom.xml
#	common/data/pom.xml
#	common/discovery-api/pom.xml
#	common/edge-api/pom.xml
#	common/edqs/pom.xml
#	common/message/pom.xml
#	common/pom.xml
#	common/proto/pom.xml
#	common/queue/pom.xml
#	common/script/pom.xml
#	common/script/remote-js-client/pom.xml
#	common/script/script-api/pom.xml
#	common/stats/pom.xml
#	common/transport/coap/pom.xml
#	common/transport/http/pom.xml
#	common/transport/lwm2m/pom.xml
#	common/transport/mqtt/pom.xml
#	common/transport/pom.xml
#	common/transport/snmp/pom.xml
#	common/transport/transport-api/pom.xml
#	common/util/pom.xml
#	common/version-control/pom.xml
#	dao/pom.xml
#	edqs/pom.xml
#	monitoring/pom.xml
#	msa/black-box-tests/pom.xml
#	msa/edqs/pom.xml
#	msa/js-executor/pom.xml
#	msa/monitoring/pom.xml
#	msa/pom.xml
#	msa/tb-node/pom.xml
#	msa/tb/pom.xml
#	msa/transport/coap/pom.xml
#	msa/transport/http/pom.xml
#	msa/transport/lwm2m/pom.xml
#	msa/transport/mqtt/pom.xml
#	msa/transport/pom.xml
#	msa/transport/snmp/pom.xml
#	msa/vc-executor-docker/pom.xml
#	msa/vc-executor/pom.xml
#	msa/web-ui/pom.xml
#	netty-mqtt/pom.xml
#	pom.xml
#	rest-client/pom.xml
#	rule-engine/pom.xml
#	rule-engine/rule-engine-api/pom.xml
#	rule-engine/rule-engine-components/pom.xml
#	tools/pom.xml
#	transport/coap/pom.xml
#	transport/http/pom.xml
#	transport/lwm2m/pom.xml
#	transport/mqtt/pom.xml
#	transport/pom.xml
#	transport/snmp/pom.xml
#	ui-ngx/pom.xml
release-4.2
Viacheslav Klimov 1 month ago
parent
commit
5dc7fd1c4b
Failed to extract signature
  1. 2
      application/pom.xml
  2. 4
      application/src/main/java/org/thingsboard/server/controller/BaseController.java
  3. 2
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/ScriptCalculatedFieldState.java
  4. 2
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldState.java
  5. 2
      application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java
  6. 7
      application/src/main/java/org/thingsboard/server/service/edge/rpc/KafkaEdgeGrpcSession.java
  7. 2
      application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java
  8. 4
      application/src/main/java/org/thingsboard/server/service/install/lts/LtsMigrationService.java
  9. 8
      application/src/main/java/org/thingsboard/server/service/install/lts/LtsVersion.java
  10. 4
      application/src/main/java/org/thingsboard/server/service/notification/channels/MicrosoftTeamsNotificationChannel.java
  11. 2
      application/src/main/java/org/thingsboard/server/service/security/auth/mfa/provider/impl/TotpTwoFaProvider.java
  12. 2
      application/src/main/java/org/thingsboard/server/service/security/model/token/JwtTokenFactory.java
  13. 2
      application/src/main/java/org/thingsboard/server/service/security/model/token/OAuth2AppTokenFactory.java
  14. 4
      application/src/main/java/org/thingsboard/server/service/ws/WebSocketSessionType.java
  15. 130
      application/src/main/resources/thingsboard.yml
  16. 6
      application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java
  17. 2
      application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java
  18. 12
      application/src/test/java/org/thingsboard/server/controller/AlarmCommentControllerTest.java
  19. 6
      application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest.java
  20. 4
      application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest_DedicatedEventsDataSource.java
  21. 4
      application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java
  22. 10
      application/src/test/java/org/thingsboard/server/controller/BaseQueueControllerTest.java
  23. 6
      application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java
  24. 4
      application/src/test/java/org/thingsboard/server/controller/EdgeEventControllerTest.java
  25. 4
      application/src/test/java/org/thingsboard/server/controller/EdqsEntityQueryControllerTest.java
  26. 6
      application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java
  27. 4
      application/src/test/java/org/thingsboard/server/controller/RepositorySettingsTest.java
  28. 4
      application/src/test/java/org/thingsboard/server/controller/RuleEngineControllerTest.java
  29. 8
      application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java
  30. 10
      application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthConfigTest.java
  31. 8
      application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthTest.java
  32. 4
      application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java
  33. 43
      application/src/test/java/org/thingsboard/server/service/device/provision/DeviceProvisionServiceTest.java
  34. 4
      application/src/test/java/org/thingsboard/server/service/entitiy/EdqsEntityServiceTest.java
  35. 32
      application/src/test/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmServiceTest.java
  36. 34
      application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java
  37. 28
      application/src/test/java/org/thingsboard/server/service/install/InstallScriptsTest.java
  38. 4
      application/src/test/java/org/thingsboard/server/service/install/update/DefaultDataUpdateServiceTest.java
  39. 6
      application/src/test/java/org/thingsboard/server/service/job/JobManagerTest.java
  40. 2
      application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java
  41. 4
      application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java
  42. 2
      application/src/test/java/org/thingsboard/server/service/notification/NotificationApiWsClient.java
  43. 4
      application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java
  44. 44
      application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java
  45. 4
      application/src/test/java/org/thingsboard/server/service/sms/DefaultSmsServiceTest.java
  46. 6
      application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java
  47. 60
      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. 8
      application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java
  50. 14
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/AbstractRpcLwM2MIntegrationTest.java
  51. 4
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/diffPort/AbstractLwM2MIntegrationDiffPortTest.java
  52. 4
      application/src/test/java/org/thingsboard/server/transport/mqtt/MqttGatewayRateLimitsTest.java
  53. 4
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/telemetry/timeseries/AbstractMqttTimeseriesIntegrationTest.java
  54. 2
      common/actor/pom.xml
  55. 2
      common/cache/pom.xml
  56. 8
      common/cache/src/main/java/org/thingsboard/server/cache/ota/RedisOtaPackageDataCache.java
  57. 2
      common/cluster-api/pom.xml
  58. 2
      common/coap-server/pom.xml
  59. 2
      common/dao-api/pom.xml
  60. 2
      common/data/pom.xml
  61. 4
      common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java
  62. 2
      common/data/src/main/java/org/thingsboard/server/common/data/EventInfo.java
  63. 2
      common/data/src/main/java/org/thingsboard/server/common/data/HomeDashboard.java
  64. 13
      common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java
  65. 2
      common/data/src/main/java/org/thingsboard/server/common/data/TenantInfo.java
  66. 1
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmComment.java
  67. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/CoapDeviceTransportConfiguration.java
  68. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/Lwm2mDeviceTransportConfiguration.java
  69. 9
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/TelemetryObserveStrategy.java
  70. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/bootstrap/LwM2MServerSecurityConfigDefault.java
  71. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeInfo.java
  72. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetFields.java
  73. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetProfileFields.java
  74. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/CustomerFields.java
  75. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DashboardFields.java
  76. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceFields.java
  77. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceProfileFields.java
  78. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EdgeFields.java
  79. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EntityViewFields.java
  80. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/QueueStatsFields.java
  81. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/RuleChainFields.java
  82. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantFields.java
  83. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantProfileFields.java
  84. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/UserFields.java
  85. 2
      common/data/src/main/java/org/thingsboard/server/common/data/job/task/Task.java
  86. 2
      common/data/src/main/java/org/thingsboard/server/common/data/kv/BaseDeleteTsKvQuery.java
  87. 1
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobileLayoutConfig.java
  88. 2
      common/data/src/main/java/org/thingsboard/server/common/data/query/AlarmCountQuery.java
  89. 2
      common/data/src/main/java/org/thingsboard/server/common/data/queue/Queue.java
  90. 2
      common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleNodeState.java
  91. 4
      common/data/src/main/java/org/thingsboard/server/common/data/tenant/profile/DefaultTenantProfileConfiguration.java
  92. 3
      common/data/src/main/java/org/thingsboard/server/common/data/util/CollectionsUtil.java
  93. 2
      common/data/src/main/java/org/thingsboard/server/common/data/util/TemplateUtils.java
  94. 2
      common/data/src/main/java/org/thingsboard/server/common/data/util/TypeCastUtil.java
  95. 2
      common/data/src/main/java/org/thingsboard/server/common/data/widget/WidgetTypeInfo.java
  96. 2
      common/discovery-api/pom.xml
  97. 2
      common/edge-api/pom.xml
  98. 1
      common/edge-api/src/main/proto/edge.proto
  99. 2
      common/edqs/pom.xml
  100. 2
      common/message/pom.xml

2
application/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<artifactId>application</artifactId> <artifactId>application</artifactId>

4
application/src/main/java/org/thingsboard/server/controller/BaseController.java

@ -657,7 +657,7 @@ public abstract class BaseController {
protected <E extends HasId<I> & HasTenantId, I extends EntityId> E checkEntityId(I entityId, ThrowingBiFunction<TenantId, I, E> findingFunction, Operation operation) throws ThingsboardException { protected <E extends HasId<I> & HasTenantId, I extends EntityId> E checkEntityId(I entityId, ThrowingBiFunction<TenantId, I, E> findingFunction, Operation operation) throws ThingsboardException {
try { try {
validateId((UUIDBased) entityId, "Invalid entity id"); validateId((UUIDBased) entityId, id -> "Invalid entity id");
SecurityUser user = getCurrentUser(); SecurityUser user = getCurrentUser();
E entity = findingFunction.apply(user.getTenantId(), entityId); E entity = findingFunction.apply(user.getTenantId(), entityId);
checkNotNull(entity, entityId.getEntityType().getNormalName() + " with id [" + entityId + "] is not found"); checkNotNull(entity, entityId.getEntityType().getNormalName() + " with id [" + entityId + "] is not found");
@ -939,7 +939,7 @@ public abstract class BaseController {
} }
private CalculatedField checkCalculatedFieldId(CalculatedFieldId calculatedFieldId, Operation operation) throws ThingsboardException { private CalculatedField checkCalculatedFieldId(CalculatedFieldId calculatedFieldId, Operation operation) throws ThingsboardException {
validateId(calculatedFieldId, "Invalid entity id"); validateId(calculatedFieldId, id -> "Invalid entity id");
SecurityUser user = getCurrentUser(); SecurityUser user = getCurrentUser();
CalculatedField cf = calculatedFieldService.findById(user.getTenantId(), calculatedFieldId); CalculatedField cf = calculatedFieldService.findById(user.getTenantId(), calculatedFieldId);
checkNotNull(cf, calculatedFieldId.getEntityType().getNormalName() + " with id [" + calculatedFieldId + "] is not found"); checkNotNull(cf, calculatedFieldId.getEntityType().getNormalName() + " with id [" + calculatedFieldId + "] is not found");

2
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/ScriptCalculatedFieldState.java

@ -20,6 +20,7 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.script.api.tbel.TbelCfArg; import org.thingsboard.script.api.tbel.TbelCfArg;
@ -35,6 +36,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@Slf4j @Slf4j
@NoArgsConstructor @NoArgsConstructor
public class ScriptCalculatedFieldState extends BaseCalculatedFieldState { public class ScriptCalculatedFieldState extends BaseCalculatedFieldState {

2
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldState.java

@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.script.api.tbel.TbUtils; import org.thingsboard.script.api.tbel.TbUtils;
@ -33,6 +34,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
public class SimpleCalculatedFieldState extends BaseCalculatedFieldState { public class SimpleCalculatedFieldState extends BaseCalculatedFieldState {

2
application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java

@ -760,7 +760,7 @@ public abstract class EdgeGrpcSession implements Closeable {
ctx.getClusterService().onEdgeEventUpdate(new EdgeEventUpdateMsg(edge.getTenantId(), edge.getId())); ctx.getClusterService().onEdgeEventUpdate(new EdgeEventUpdateMsg(edge.getTenantId(), edge.getId()));
} }
private void stopCurrentSendDownlinkMsgsTask(Boolean isInterrupted) { protected void stopCurrentSendDownlinkMsgsTask(Boolean isInterrupted) {
if (sessionState.getSendDownlinkMsgsFuture() != null && !sessionState.getSendDownlinkMsgsFuture().isDone()) { if (sessionState.getSendDownlinkMsgsFuture() != null && !sessionState.getSendDownlinkMsgsFuture().isDone()) {
sessionState.getSendDownlinkMsgsFuture().set(isInterrupted); sessionState.getSendDownlinkMsgsFuture().set(isInterrupted);
} }

7
application/src/main/java/org/thingsboard/server/service/edge/rpc/KafkaEdgeGrpcSession.java

@ -156,6 +156,7 @@ public class KafkaEdgeGrpcSession extends EdgeGrpcSession {
@Override @Override
public boolean destroy() { public boolean destroy() {
stopCurrentSendDownlinkMsgsTask(true);
try { try {
if (consumer != null) { if (consumer != null) {
log.info("[{}][{}] Stopping edge event consumer...", tenantId, edge != null ? edge.getId() : null); log.info("[{}][{}] Stopping edge event consumer...", tenantId, edge != null ? edge.getId() : null);
@ -180,9 +181,13 @@ public class KafkaEdgeGrpcSession extends EdgeGrpcSession {
private void awaitConsumerTermination() { private void awaitConsumerTermination() {
try { try {
consumerExecutor.awaitTermination(5, java.util.concurrent.TimeUnit.SECONDS); if (!consumerExecutor.awaitTermination(5, java.util.concurrent.TimeUnit.SECONDS)) {
// without this the thread is leaked for the whole remaining delivery-retry window (or forever, if the future is never completed).
consumerExecutor.shutdownNow();
}
} catch (InterruptedException ie) { } catch (InterruptedException ie) {
log.warn("[{}][{}] Interrupted while awaiting consumer executor termination", tenantId, edge.getId()); log.warn("[{}][{}] Interrupted while awaiting consumer executor termination", tenantId, edge.getId());
Thread.currentThread().interrupt();
} }
} }

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

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

4
application/src/main/java/org/thingsboard/server/service/install/lts/LtsMigrationService.java

@ -126,9 +126,7 @@ public class LtsMigrationService {
// so a cross-family upgrade is fully handled by the target-family migrations. // so a cross-family upgrade is fully handled by the target-family migrations.
// Excluding the dormant older-family beans avoids double-processing. // Excluding the dormant older-family beans avoids double-processing.
static boolean isInRangeForTargetFamily(LtsVersion version, LtsVersion from, LtsVersion to) { static boolean isInRangeForTargetFamily(LtsVersion version, LtsVersion from, LtsVersion to) {
return version.sameFamily(to) return version.sameFamily(to) && version.isInRange(from, to);
&& version.compareTo(from) > 0
&& version.compareTo(to) <= 0;
} }
private void runSchemaUpdate(String version) { private void runSchemaUpdate(String version) {

8
application/src/main/java/org/thingsboard/server/service/install/lts/LtsVersion.java

@ -37,6 +37,14 @@ public record LtsVersion(int major, int minor, int maintenance, int patch) imple
return major == other.major && minor == other.minor; return major == other.major && minor == other.minor;
} }
/**
* Half-open range check: {@code from < this <= to}. The lower bound is exclusive (a source already at
* {@code from} has applied that version) and the upper bound inclusive (the target version's own migration runs).
*/
public boolean isInRange(LtsVersion from, LtsVersion to) {
return compareTo(from) > 0 && compareTo(to) <= 0;
}
@Override @Override
public int compareTo(LtsVersion o) { public int compareTo(LtsVersion o) {
int c = Integer.compare(major, o.major); int c = Integer.compare(major, o.major);

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

@ -54,8 +54,8 @@ public class MicrosoftTeamsNotificationChannel implements NotificationChannel<Mi
@Setter @Setter
private RestTemplate restTemplate = new RestTemplateBuilder() private RestTemplate restTemplate = new RestTemplateBuilder()
.setConnectTimeout(Duration.of(15, ChronoUnit.SECONDS)) .connectTimeout(Duration.of(15, ChronoUnit.SECONDS))
.setReadTimeout(Duration.of(15, ChronoUnit.SECONDS)) .readTimeout(Duration.of(15, ChronoUnit.SECONDS))
.build(); .build();
@Override @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() { 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.JwtParser;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException; import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException; import io.jsonwebtoken.UnsupportedJwtException;
import io.jsonwebtoken.security.Keys; import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SignatureException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;

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

@ -20,9 +20,9 @@ import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jws; import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException; import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException; import io.jsonwebtoken.UnsupportedJwtException;
import io.jsonwebtoken.security.Keys; import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SignatureException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;

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.AllArgsConstructor;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@NoArgsConstructor @NoArgsConstructor
@ -33,7 +33,7 @@ public enum WebSocketSessionType {
public static Optional<WebSocketSessionType> forName(String name) { public static Optional<WebSocketSessionType> forName(String name) {
return Arrays.stream(values()) return Arrays.stream(values())
.filter(sessionType -> StringUtils.equals(sessionType.name, name)) .filter(sessionType -> Objects.equals(sessionType.name, name))
.findFirst(); .findFirst();
} }

130
application/src/main/resources/thingsboard.yml

@ -15,6 +15,7 @@
# #
# Server common parameters # Server common parameters
# Configures HTTP/HTTPS bind address, port, SSL, WebSocket, and REST API settings.
server: server:
# Server bind-address # Server bind-address
address: "${HTTP_BIND_ADDRESS:0.0.0.0}" address: "${HTTP_BIND_ADDRESS:0.0.0.0}"
@ -114,23 +115,25 @@ server:
reset_password_per_user: "${RESET_PASSWORD_PER_USER_RATE_LIMIT_CONFIGURATION:5:3600}" reset_password_per_user: "${RESET_PASSWORD_PER_USER_RATE_LIMIT_CONFIGURATION:5:3600}"
# Application info parameters # Application info parameters
# Exposes application metadata such as version string injected at build time.
app: app:
# Application version # Application version
version: "@project.version@" version: "@project.version@"
# Zookeeper connection parameters # ZooKeeper connection parameters
# Controls ZooKeeper-based service discovery and cluster coordination for microservice deployments.
zk: zk:
# Enable/disable zookeeper discovery service. # Enable/disable ZooKeeper discovery service.
enabled: "${ZOOKEEPER_ENABLED:false}" enabled: "${ZOOKEEPER_ENABLED:false}"
# Zookeeper connect string # ZooKeeper connect string
url: "${ZOOKEEPER_URL:localhost:2181}" url: "${ZOOKEEPER_URL:localhost:2181}"
# Zookeeper retry interval in milliseconds # ZooKeeper retry interval in milliseconds
retry_interval_ms: "${ZOOKEEPER_RETRY_INTERVAL_MS:3000}" retry_interval_ms: "${ZOOKEEPER_RETRY_INTERVAL_MS:3000}"
# Zookeeper connection timeout in milliseconds # ZooKeeper connection timeout in milliseconds
connection_timeout_ms: "${ZOOKEEPER_CONNECTION_TIMEOUT_MS:3000}" connection_timeout_ms: "${ZOOKEEPER_CONNECTION_TIMEOUT_MS:3000}"
# Zookeeper session timeout in milliseconds # ZooKeeper session timeout in milliseconds
session_timeout_ms: "${ZOOKEEPER_SESSION_TIMEOUT_MS:3000}" session_timeout_ms: "${ZOOKEEPER_SESSION_TIMEOUT_MS:3000}"
# Name of the directory in zookeeper 'filesystem' # Name of the directory in ZooKeeper 'filesystem'
zk_dir: "${ZOOKEEPER_NODES_DIR:/thingsboard}" zk_dir: "${ZOOKEEPER_NODES_DIR:/thingsboard}"
# The recalculate_delay property is recommended in a microservices architecture setup for rule-engine services. # The recalculate_delay property is recommended in a microservices architecture setup for rule-engine services.
# This property provides a pause to ensure that when a rule-engine service is restarted, other nodes don't immediately attempt to recalculate their partitions. # This property provides a pause to ensure that when a rule-engine service is restarted, other nodes don't immediately attempt to recalculate their partitions.
@ -138,6 +141,7 @@ zk:
recalculate_delay: "${ZOOKEEPER_RECALCULATE_DELAY_MS:0}" recalculate_delay: "${ZOOKEEPER_RECALCULATE_DELAY_MS:0}"
# Cluster parameters # Cluster parameters
# Controls cluster statistics — tracks the number of messages exchanged between cluster nodes.
cluster: cluster:
stats: stats:
# Enable/Disable the cluster statistics. Calculates the number of messages sent between cluster nodes based on each type # Enable/Disable the cluster statistics. Calculates the number of messages sent between cluster nodes based on each type
@ -146,11 +150,13 @@ cluster:
print_interval_ms: "${TB_CLUSTER_STATS_PRINT_INTERVAL_MS:10000}" print_interval_ms: "${TB_CLUSTER_STATS_PRINT_INTERVAL_MS:10000}"
# Plugins configuration parameters # Plugins configuration parameters
# Defines classpath scan packages used to discover and register ThingsBoard extension plugins.
plugins: plugins:
# Comma-separated package list used during classpath scanning for plugins # Comma-separated package list used during classpath scanning for plugins
scan_packages: "${PLUGINS_SCAN_PACKAGES:org.thingsboard.server.extensions,org.thingsboard.rule.engine}" scan_packages: "${PLUGINS_SCAN_PACKAGES:org.thingsboard.server.extensions,org.thingsboard.rule.engine}"
# Security parameters # Security parameters
# Configures JWT tokens, user login, device claiming, OAuth2, and CA certificate trust store.
security: security:
# JWT Token parameters # JWT Token parameters
jwt: # Since 3.4.2 values are persisted in the database during installation or upgrade. On Install, the key will be generated randomly if no custom value set. You can change it later from Web UI under SYS_ADMIN jwt: # Since 3.4.2 values are persisted in the database during installation or upgrade. On Install, the key will be generated randomly if no custom value set. You can change it later from Web UI under SYS_ADMIN
@ -237,6 +243,7 @@ security:
report-only: "${SECURITY_HEADERS_CONTENT_SECURITY_POLICY_REPORT_ONLY:false}" report-only: "${SECURITY_HEADERS_CONTENT_SECURITY_POLICY_REPORT_ONLY:false}"
# Mail settings parameters # Mail settings parameters
# Configures mail service OAuth2 token refresh and per-tenant sending rate limits.
mail: mail:
oauth2: oauth2:
# Interval for checking refresh token expiration in seconds(by default, 1 day). # Interval for checking refresh token expiration in seconds(by default, 1 day).
@ -245,6 +252,7 @@ mail:
per_tenant_rate_limits: "${MAIL_PER_TENANT_RATE_LIMITS:}" per_tenant_rate_limits: "${MAIL_PER_TENANT_RATE_LIMITS:}"
# Usage statistics parameters # Usage statistics parameters
# Controls collection and reporting intervals for API usage stats at system, tenant, and customer levels.
usage: usage:
stats: stats:
report: report:
@ -266,6 +274,7 @@ usage:
report_interval: "${DEVICES_STATS_REPORT_INTERVAL:60}" report_interval: "${DEVICES_STATS_REPORT_INTERVAL:60}"
# UI settings parameters # UI settings parameters
# Configures dashboard data limits and base URL for UI help assets.
ui: ui:
# Dashboard parameters # Dashboard parameters
dashboard: dashboard:
@ -277,6 +286,7 @@ ui:
base-url: "${UI_HELP_BASE_URL:https://raw.githubusercontent.com/thingsboard/thingsboard-ui-help/release-4.2.2}" base-url: "${UI_HELP_BASE_URL:https://raw.githubusercontent.com/thingsboard/thingsboard-ui-help/release-4.2.2}"
# Database telemetry parameters # Database telemetry parameters
# Selects the storage backend (SQL, Cassandra, or TimescaleDB) for time-series and latest telemetry data.
database: database:
ts_max_intervals: "${DATABASE_TS_MAX_INTERVALS:700}" # Max number of DB queries generated by a single API call to fetch telemetry records ts_max_intervals: "${DATABASE_TS_MAX_INTERVALS:700}" # Max number of DB queries generated by a single API call to fetch telemetry records
ts: ts:
@ -285,6 +295,7 @@ database:
type: "${DATABASE_TS_LATEST_TYPE:sql}" # cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale) type: "${DATABASE_TS_LATEST_TYPE:sql}" # cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
# Cassandra driver configuration parameters # Cassandra driver configuration parameters
# Configures cluster name, keyspace, SSL, credentials, socket, and query settings for the Cassandra driver.
cassandra: cassandra:
# Thingsboard cluster name # Thingsboard cluster name
cluster_name: "${CASSANDRA_CLUSTER_NAME:Thingsboard Cluster}" cluster_name: "${CASSANDRA_CLUSTER_NAME:Thingsboard Cluster}"
@ -403,6 +414,7 @@ cassandra:
print_tenant_names: "${CASSANDRA_QUERY_TENANT_RATE_LIMITS_PRINT_TENANT_NAMES:false}" print_tenant_names: "${CASSANDRA_QUERY_TENANT_RATE_LIMITS_PRINT_TENANT_NAMES:false}"
# SQL configuration parameters # SQL configuration parameters
# Tunes batch sizes, delays, thread counts, TTL, and partitioning for SQL-backed persistence of telemetry, events, and audit logs.
sql: sql:
# Specify batch size for persisting attribute updates # Specify batch size for persisting attribute updates
attributes: attributes:
@ -504,6 +516,7 @@ sql:
query_timeout: "${SQL_RELATIONS_QUERY_TIMEOUT_SEC:20}" # This value has to be reasonably small to prevent the relation query from blocking all other DB calls query_timeout: "${SQL_RELATIONS_QUERY_TIMEOUT_SEC:20}" # This value has to be reasonably small to prevent the relation query from blocking all other DB calls
# Actor system parameters # Actor system parameters
# Configures thread pools, timeouts, and behavior for the internal actor system processing devices, rules, and RPCs.
actors: actors:
system: system:
throughput: "${ACTORS_SYSTEM_THROUGHPUT:5}" # Number of messages the actor system will process per actor before switching to processing of messages for the next actor throughput: "${ACTORS_SYSTEM_THROUGHPUT:5}" # Number of messages the actor system will process per actor before switching to processing of messages for the next actor
@ -597,14 +610,14 @@ actors:
response_timeout_ms: "${ACTORS_RPC_RESPONSE_TIMEOUT_MS:30000}" response_timeout_ms: "${ACTORS_RPC_RESPONSE_TIMEOUT_MS:30000}"
# Close transport session if RPC delivery timed out. If enabled, RPC will be reverted to the queued state. # Close transport session if RPC delivery timed out. If enabled, RPC will be reverted to the queued state.
# Note: # Note:
# - For MQTT transport: # <ul><li> For MQTT transport:
# - QoS level 0: This feature does not apply, as no acknowledgment is expected, and therefore no timeout is triggered. # <ul><li> QoS level 0: This feature does not apply, as no acknowledgment is expected, and therefore no timeout is triggered.</li>
# - QoS level 1: This feature applies, as an acknowledgment is expected. # <li> QoS level 1: This feature applies, as an acknowledgment is expected.</li>
# - QoS level 2: Unsupported. # <li> QoS level 2: Unsupported.</li></ul></li>
# - For CoAP transport: # <li> For CoAP transport:
# - Confirmable requests: This feature applies, as delivery confirmation is expected. # <ul><li> Confirmable requests: This feature applies, as delivery confirmation is expected.</li>
# - Non-confirmable requests: This feature does not apply, as no delivery acknowledgment is expected. # <li> Non-confirmable requests: This feature does not apply, as no delivery acknowledgment is expected.</li></ul></li>
# - For HTTP and SNPM transports: RPC is considered delivered immediately, and there is no logic to await acknowledgment. # <li> For HTTP and SNPM transports: RPC is considered delivered immediately, and there is no logic to await acknowledgment.</li></ul>
close_session_on_rpc_delivery_timeout: "${ACTORS_RPC_CLOSE_SESSION_ON_RPC_DELIVERY_TIMEOUT:false}" close_session_on_rpc_delivery_timeout: "${ACTORS_RPC_CLOSE_SESSION_ON_RPC_DELIVERY_TIMEOUT:false}"
statistics: statistics:
# Enable/disable actor statistics # Enable/disable actor statistics
@ -620,6 +633,8 @@ actors:
# Time in seconds to receive calculation result. # Time in seconds to receive calculation result.
calculation_timeout: "${ACTORS_CALCULATION_TIMEOUT_SEC:5}" calculation_timeout: "${ACTORS_CALCULATION_TIMEOUT_SEC:5}"
# Debug settings parameters
# Configures the global default duration for debug mode used by rule chains and calculated fields.
debug: debug:
settings: settings:
# Default duration (in minutes) for debug mode. Min value is 1 minute. Tenant profile settings override this one. # Default duration (in minutes) for debug mode. Min value is 1 minute. Tenant profile settings override this one.
@ -627,6 +642,7 @@ debug:
default_duration: "${DEBUG_SETTINGS_DEFAULT_DURATION_MINUTES:15}" default_duration: "${DEBUG_SETTINGS_DEFAULT_DURATION_MINUTES:15}"
# Cache settings parameters # Cache settings parameters
# Configures cache type (Caffeine or Redis), pool size, and per-entity TTL and max-size limits for all caches.
cache: cache:
# caffeine or redis(7.2 - latest compatible version) # caffeine or redis(7.2 - latest compatible version)
type: "${CACHE_TYPE:caffeine}" type: "${CACHE_TYPE:caffeine}"
@ -780,6 +796,7 @@ cache:
spring.data.redis.repositories.enabled: false # Disable this because it is not required. spring.data.redis.repositories.enabled: false # Disable this because it is not required.
# Redis/Valkey configuration parameters # Redis/Valkey configuration parameters
# Configures standalone, cluster, or sentinel Redis connection, SSL, and connection pool settings used for caching.
redis: redis:
# standalone or cluster or sentinel # standalone or cluster or sentinel
connection: connection:
@ -808,17 +825,17 @@ redis:
# if set false will be used pool config build from values of the pool config section # if set false will be used pool config build from values of the pool config section
useDefaultPoolConfig: "${REDIS_USE_DEFAULT_POOL_CONFIG:true}" useDefaultPoolConfig: "${REDIS_USE_DEFAULT_POOL_CONFIG:true}"
sentinel: sentinel:
# name of the master node # Name of the master node
master: "${REDIS_MASTER:}" master: "${REDIS_MASTER:}"
# comma-separated list of "host:port" pairs of sentinels # Comma-separated list of "host:port" pairs of sentinels
sentinels: "${REDIS_SENTINELS:}" sentinels: "${REDIS_SENTINELS:}"
# password to authenticate with sentinel # Password to authenticate with sentinel
password: "${REDIS_SENTINEL_PASSWORD:}" password: "${REDIS_SENTINEL_PASSWORD:}"
# if set false will be used pool config build from values of the pool config section # If set false will be used pool config build from values of the pool config section
useDefaultPoolConfig: "${REDIS_USE_DEFAULT_POOL_CONFIG:true}" useDefaultPoolConfig: "${REDIS_USE_DEFAULT_POOL_CONFIG:true}"
# db index # Redis logical database index to select after connecting.
db: "${REDIS_DB:0}" db: "${REDIS_DB:0}"
# db password # Password for Redis authentication (leave empty if not required).
password: "${REDIS_PASSWORD:}" password: "${REDIS_PASSWORD:}"
# Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth # Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth
username: "${REDIS_USERNAME:}" username: "${REDIS_USERNAME:}"
@ -863,6 +880,7 @@ redis:
# Update version parameters # Update version parameters
# Controls whether the platform periodically checks for new ThingsBoard releases.
updates: updates:
# Enable/disable checks for the new version # Enable/disable checks for the new version
enabled: "${UPDATES_ENABLED:true}" enabled: "${UPDATES_ENABLED:true}"
@ -891,6 +909,7 @@ spring.mvc.cors:
allow-credentials: "${TB_CORS_ALLOW_CREDENTIALS:true}" allow-credentials: "${TB_CORS_ALLOW_CREDENTIALS:true}"
# General spring parameters # General spring parameters
# Miscellaneous Spring Boot settings for circular references, Freemarker, MVC, multipart, and JPA dialect.
spring.main.allow-circular-references: "true" # Spring Boot configuration property that controls whether circular dependencies between beans are allowed. spring.main.allow-circular-references: "true" # Spring Boot configuration property that controls whether circular dependencies between beans are allowed.
spring.freemarker.checkTemplateLocation: "false" # spring freemarker configuration spring.freemarker.checkTemplateLocation: "false" # spring freemarker configuration
spring.mvc.async.request-timeout: "${SPRING_MVC_ASYNC_REQUEST_TIMEOUT:30000}" # The default timeout for asynchronous requests in milliseconds spring.mvc.async.request-timeout: "${SPRING_MVC_ASYNC_REQUEST_TIMEOUT:30000}" # The default timeout for asynchronous requests in milliseconds
@ -909,6 +928,7 @@ spring.jpa.properties.hibernate.order_by.default_null_ordering: "${SPRING_JPA_PR
spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" # we use custom dialect that contains ilike(arg1, arg2) function (is interpreted to postgres ILIKE operator) spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" # we use custom dialect that contains ilike(arg1, arg2) function (is interpreted to postgres ILIKE operator)
# SQL DAO Configuration parameters # SQL DAO Configuration parameters
# Configures Spring JPA, Hibernate DDL, and HikariCP datasource connections for the primary and events databases.
spring: spring:
data: data:
jpa: jpa:
@ -959,6 +979,7 @@ spring:
registerMbeans: "${SPRING_EVENTS_DATASOURCE_HIKARI_REGISTER_MBEANS:false}" registerMbeans: "${SPRING_EVENTS_DATASOURCE_HIKARI_REGISTER_MBEANS:false}"
# Audit log parameters # Audit log parameters
# Configures audit logging levels per entity type and optional forwarding to an external sink such as Elasticsearch.
audit-log: audit-log:
# Enable/disable audit log functionality. # Enable/disable audit log functionality.
enabled: "${AUDIT_LOG_ENABLED:true}" enabled: "${AUDIT_LOG_ENABLED:true}"
@ -1001,6 +1022,7 @@ audit-log:
password: "${AUDIT_LOG_SINK_PASSWORD:}" # Password used to access external sink system password: "${AUDIT_LOG_SINK_PASSWORD:}" # Password used to access external sink system
# Device state parameters # Device state parameters
# Configures device inactivity detection, state persistence strategy, and rate limits for state rule nodes.
state: state:
# Device inactivity timeout is a global configuration parameter that defines when the device will be marked as "inactive" by the server. # Device inactivity timeout is a global configuration parameter that defines when the device will be marked as "inactive" by the server.
# The parameter value is in seconds. A user can overwrite this parameter for an individual device by setting the “inactivityTimeout” server-side attribute (NOTE: expects value in milliseconds). # The parameter value is in seconds. A user can overwrite this parameter for an individual device by setting the “inactivityTimeout” server-side attribute (NOTE: expects value in milliseconds).
@ -1031,7 +1053,8 @@ state:
# Refill is set to be greedy. Please refer to Bucket4j library documentation for more details. # Refill is set to be greedy. Please refer to Bucket4j library documentation for more details.
rateLimit: "${DEVICE_STATE_NODE_RATE_LIMIT_CONFIGURATION:1:1,30:60,60:3600}" rateLimit: "${DEVICE_STATE_NODE_RATE_LIMIT_CONFIGURATION:1:1,30:60,60:3600}"
# Tbel parameters # TBEL parameters
# Configures the ThingsBoard Expression Language (TBEL) engine: limits, timeouts, thread pool, and blacklisting.
tbel: tbel:
# Enable/Disable TBEL feature. # Enable/Disable TBEL feature.
enabled: "${TBEL_ENABLED:true}" enabled: "${TBEL_ENABLED:true}"
@ -1060,6 +1083,7 @@ tbel:
print_interval_ms: "${TB_TBEL_STATS_PRINT_INTERVAL_MS:10000}" print_interval_ms: "${TB_TBEL_STATS_PRINT_INTERVAL_MS:10000}"
# JS parameters # JS parameters
# Configures the JavaScript execution engine (local Nashorn or remote Node.js): limits, sandboxing, and thread pools.
js: js:
# local (Nashorn Engine, deprecated) OR remote JS-Executors (NodeJS) # local (Nashorn Engine, deprecated) OR remote JS-Executors (NodeJS)
evaluator: "${JS_EVALUATOR:local}" evaluator: "${JS_EVALUATOR:local}"
@ -1107,6 +1131,7 @@ js:
print_interval_ms: "${TB_JS_REMOTE_STATS_PRINT_INTERVAL_MS:10000}" print_interval_ms: "${TB_JS_REMOTE_STATS_PRINT_INTERVAL_MS:10000}"
# Transport configuration parameters # Transport configuration parameters
# Configures session management, rate limits, and protocol-specific settings for HTTP, MQTT, CoAP, LwM2M, and SNMP transports.
transport: transport:
sessions: sessions:
# Session inactivity timeout is a global configuration parameter that defines how long the device transport session will be opened after the last message arrives from the device. # Session inactivity timeout is a global configuration parameter that defines how long the device transport session will be opened after the last message arrives from the device.
@ -1123,10 +1148,10 @@ transport:
activity: activity:
# This property specifies the strategy for reporting activity events within each reporting period. # This property specifies the strategy for reporting activity events within each reporting period.
# The accepted values are 'FIRST', 'LAST', 'FIRST_AND_LAST' and 'ALL'. # The accepted values are 'FIRST', 'LAST', 'FIRST_AND_LAST' and 'ALL'.
# - 'FIRST': Only the first activity event in each reporting period is reported. # <ul><li> 'FIRST': Only the first activity event in each reporting period is reported.</li>
# - 'LAST': Only the last activity event in the reporting period is reported. # <li> 'LAST': Only the last activity event in the reporting period is reported.</li>
# - 'FIRST_AND_LAST': Both the first and last activity events in the reporting period are reported. # <li> 'FIRST_AND_LAST': Both the first and last activity events in the reporting period are reported.</li>
# - 'ALL': All activity events in the reporting period are reported. # <li> 'ALL': All activity events in the reporting period are reported.</li></ul>
reporting_strategy: "${TB_TRANSPORT_ACTIVITY_REPORTING_STRATEGY:LAST}" reporting_strategy: "${TB_TRANSPORT_ACTIVITY_REPORTING_STRATEGY:LAST}"
json: json:
# Cast String data types to Numeric if possible when processing Telemetry/Attributes JSON # Cast String data types to Numeric if possible when processing Telemetry/Attributes JSON
@ -1246,16 +1271,16 @@ transport:
dtls: dtls:
# RFC7925_RETRANSMISSION_TIMEOUT_IN_MILLISECONDS = 9000 # RFC7925_RETRANSMISSION_TIMEOUT_IN_MILLISECONDS = 9000
retransmission_timeout: "${LWM2M_DTLS_RETRANSMISSION_TIMEOUT_MS:9000}" retransmission_timeout: "${LWM2M_DTLS_RETRANSMISSION_TIMEOUT_MS:9000}"
# CoAP DTLS connection ID length for LWM2M. RFC 9146, Connection Identifier for DTLS 1.2 # LWM2M DTLS connection ID length for LWM2M. RFC 9146, Connection Identifier for DTLS 1.2
# Default: off # Default: off. <br>
# Control usage of DTLS connection ID length (CID). # Control usage of DTLS connection ID length (CID).
# - 'off' to deactivate it. # <ul> <li> 'off' to deactivate it. </li>
# - 'on' to activate Connection ID support (same as CID 0 or more 0). # <li> 'on' to activate Connection ID support (same as CID 0 or more 0). </li>
# - A positive value defines generated CID size in bytes. # <li> A positive value defines generated CID size in bytes.</li>
# - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic). # <li> A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic). </li>
# - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used # <li> A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used </li>
# - A value that are > 4: MultiNodeConnectionIdGenerator is used # <li> A value that are > 4: MultiNodeConnectionIdGenerator is used </li> </ul>
connection_id_length: "${LWM2M_DTLS_CONNECTION_ID_LENGTH:}" connection_id_length: "${LWM2M_DTLS_CONNECTION_ID_LENGTH:8}"
server: server:
# LwM2M Server ID # LwM2M Server ID
id: "${LWM2M_SERVER_ID:123}" id: "${LWM2M_SERVER_ID:123}"
@ -1428,6 +1453,7 @@ transport:
check_interval_seconds: "${TB_TRANSPORT_SSL_CERTIFICATE_RELOAD_CHECK_INTERVAL_SECONDS:60}" check_interval_seconds: "${TB_TRANSPORT_SSL_CERTIFICATE_RELOAD_CHECK_INTERVAL_SECONDS:60}"
# CoAP server parameters # CoAP server parameters
# Configures the standalone CoAP server bind address, port, DTLS encryption, and credential settings.
coap: coap:
server: server:
# Enable/disable coap server. # Enable/disable coap server.
@ -1446,15 +1472,15 @@ coap:
# CoAP DTLS bind port # CoAP DTLS bind port
bind_port: "${COAP_DTLS_BIND_PORT:5684}" bind_port: "${COAP_DTLS_BIND_PORT:5684}"
# CoAP DTLS connection ID length. RFC 9146, Connection Identifier for DTLS 1.2 # CoAP DTLS connection ID length. RFC 9146, Connection Identifier for DTLS 1.2
# Default: off # Default: off. <br>
# Control usage of DTLS connection ID length (CID). # Control usage of DTLS connection ID length (CID).
# - 'off' to deactivate it. # <ul> <li> 'off' to deactivate it. </li>
# - 'on' to activate Connection ID support (same as CID 0 or more 0). # <li> 'on' to activate Connection ID support (same as CID 0 or more 0). </li>
# - A positive value defines generated CID size in bytes. # <li> A positive value defines generated CID size in bytes.</li>
# - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic). # <li> A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic).</li>
# - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used # <li> A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used</li>
# - A value that are > 4: MultiNodeConnectionIdGenerator is used # <li> A value that are > 4: MultiNodeConnectionIdGenerator is used</li> </ul>
connection_id_length: "${COAP_DTLS_CONNECTION_ID_LENGTH:}" connection_id_length: "${COAP_DTLS_CONNECTION_ID_LENGTH:8}"
# Specify the MTU (Maximum Transmission Unit). # Specify the MTU (Maximum Transmission Unit).
# Should be used if LAN MTU is not used, e.g. if IP tunnels are used or if the client uses a smaller value than the LAN MTU. # Should be used if LAN MTU is not used, e.g. if IP tunnels are used or if the client uses a smaller value than the LAN MTU.
# Default = 1024 # Default = 1024
@ -1470,13 +1496,13 @@ coap:
# In order to negotiate smaller maximum fragment lengths, # In order to negotiate smaller maximum fragment lengths,
# clients MAY include an extension of type "max_fragment_length" in the (extended) client hello. # clients MAY include an extension of type "max_fragment_length" in the (extended) client hello.
# The "extension_data" field of this extension SHALL contain: # The "extension_data" field of this extension SHALL contain:
# enum { # <pre> enum {
# 2^9(1) == 512, # 2^9(1) == 512,
# 2^10(2) == 1024, # 2^10(2) == 1024,
# 2^11(3) == 2048, # 2^11(3) == 2048,
# 2^12(4) == 4096, # 2^12(4) == 4096,
# (255) # (255)
# } MaxFragmentLength; # } MaxFragmentLength; </pre>
# TLS already requires clients and servers to support fragmentation of handshake messages. # TLS already requires clients and servers to support fragmentation of handshake messages.
max_fragment_length: "${COAP_DTLS_MAX_FRAGMENT_LENGTH:1024}" max_fragment_length: "${COAP_DTLS_MAX_FRAGMENT_LENGTH:1024}"
# Server DTLS credentials # Server DTLS credentials
@ -1512,6 +1538,7 @@ coap:
dtls_session_report_timeout: "${TB_COAP_X509_DTLS_SESSION_REPORT_TIMEOUT:1800000}" dtls_session_report_timeout: "${TB_COAP_X509_DTLS_SESSION_REPORT_TIMEOUT:1800000}"
# Device connectivity parameters # Device connectivity parameters
# Specifies the hosts, ports, and credentials exposed to the UI for generating device connection check commands.
device: device:
connectivity: connectivity:
http: http:
@ -1565,6 +1592,7 @@ device:
image_version: "${DEVICE_CONNECTIVITY_GATEWAY_IMAGE_VERSION:3.8-stable}" image_version: "${DEVICE_CONNECTIVITY_GATEWAY_IMAGE_VERSION:3.8-stable}"
# Edges parameters # Edges parameters
# Controls Edge instance gRPC communication, event storage, state persistence, and statistics reporting.
edges: edges:
# Enable/disable Edge instance # Enable/disable Edge instance
enabled: "${EDGES_ENABLED:true}" enabled: "${EDGES_ENABLED:true}"
@ -1628,6 +1656,7 @@ edges:
report-interval-millis: "${EDGES_STATS_REPORT_INTERVAL_MS:600000}" report-interval-millis: "${EDGES_STATS_REPORT_INTERVAL_MS:600000}"
# Spring doc common parameters # Spring doc common parameters
# Enables or disables the OpenAPI/Swagger documentation endpoint and sets the default media type.
springdoc: springdoc:
# If false swagger API docs will be unavailable # If false swagger API docs will be unavailable
api-docs.enabled: "${SWAGGER_ENABLED:true}" api-docs.enabled: "${SWAGGER_ENABLED:true}"
@ -1635,6 +1664,7 @@ springdoc:
default-produces-media-type: "${SWAGGER_DEFAULT_PRODUCES_MEDIA_TYPE:application/json}" default-produces-media-type: "${SWAGGER_DEFAULT_PRODUCES_MEDIA_TYPE:application/json}"
# Swagger common parameters # Swagger common parameters
# Configures Swagger UI metadata: title, description, contact, license, version, and API path patterns.
swagger: swagger:
# General swagger match pattern of swagger UI links # General swagger match pattern of swagger UI links
api_path: "${SWAGGER_API_PATH:/api/**}" api_path: "${SWAGGER_API_PATH:/api/**}"
@ -1664,6 +1694,7 @@ swagger:
group_name: "${SWAGGER_GROUP_NAME:thingsboard}" group_name: "${SWAGGER_GROUP_NAME:thingsboard}"
# Queue configuration parameters # Queue configuration parameters
# Configures the message queue backend (in-memory or Kafka) and all topic/partition/consumer settings for each service.
queue: queue:
type: "${TB_QUEUE_TYPE:in-memory}" # in-memory or kafka (Apache Kafka) type: "${TB_QUEUE_TYPE:in-memory}" # in-memory or kafka (Apache Kafka)
prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka). prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka).
@ -2074,12 +2105,14 @@ queue:
processing_interval: "${TB_QUEUE_TASKS_STATS_PROCESSING_INTERVAL_MS:1000}" processing_interval: "${TB_QUEUE_TASKS_STATS_PROCESSING_INTERVAL_MS:1000}"
# Event configuration parameters # Event configuration parameters
# Controls limits on debug event content size stored for rule chain and rule node execution.
event: event:
debug: debug:
# Maximum number of symbols per debug event. The event content will be truncated if needed # Maximum number of symbols per debug event. The event content will be truncated if needed
max-symbols: "${TB_MAX_DEBUG_EVENT_SYMBOLS:4096}" max-symbols: "${TB_MAX_DEBUG_EVENT_SYMBOLS:4096}"
# General service parameters # General service parameters
# Sets the deployment type (monolith or microservice) and assigns tenant profiles to specific Rule Engine instances.
service: service:
type: "${TB_SERVICE_TYPE:monolith}" # monolith or tb-core or tb-rule-engine type: "${TB_SERVICE_TYPE:monolith}" # monolith or tb-core or tb-rule-engine
# Unique id for this service (autogenerated if empty) # Unique id for this service (autogenerated if empty)
@ -2093,6 +2126,7 @@ service:
executor_thread_pool_size: "${TB_RULE_ENGINE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}" executor_thread_pool_size: "${TB_RULE_ENGINE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}"
# Metrics parameters # Metrics parameters
# Enables actuator metrics endpoint and configures system info (CPU, memory) persistence frequency and TTL.
metrics: metrics:
# Enable/disable actuator metrics. # Enable/disable actuator metrics.
enabled: "${METRICS_ENABLED:false}" enabled: "${METRICS_ENABLED:false}"
@ -2106,6 +2140,7 @@ metrics:
ttl: "${METRICS_SYSTEM_INFO_TTL_DAYS:7}" ttl: "${METRICS_SYSTEM_INFO_TTL_DAYS:7}"
# Version control parameters # Version control parameters
# Configures thread pools and Git repository folder for entity version control (export/import) operations.
vc: vc:
# Pool size for handling export tasks # Pool size for handling export tasks
thread_pool_size: "${TB_VC_POOL_SIZE:6}" thread_pool_size: "${TB_VC_POOL_SIZE:6}"
@ -2116,6 +2151,7 @@ vc:
repositories-folder: "${TB_VC_GIT_REPOSITORIES_FOLDER:${java.io.tmpdir}/repositories}" repositories-folder: "${TB_VC_GIT_REPOSITORIES_FOLDER:${java.io.tmpdir}/repositories}"
# Notification system parameters # Notification system parameters
# Configures thread pool size and deduplication intervals for the notification rule processing engine.
notification_system: notification_system:
# Specify thread pool size for Notification System processing notification rules and notification sending. Recommend value <= 10 # Specify thread pool size for Notification System processing notification rules and notification sending. Recommend value <= 10
thread_pool_size: "${TB_NOTIFICATION_SYSTEM_THREAD_POOL_SIZE:10}" thread_pool_size: "${TB_NOTIFICATION_SYSTEM_THREAD_POOL_SIZE:10}"
@ -2124,6 +2160,7 @@ notification_system:
deduplication_durations: "${TB_NOTIFICATION_RULES_DEDUPLICATION_DURATIONS:NEW_PLATFORM_VERSION:0;RATE_LIMITS:14400000;}" deduplication_durations: "${TB_NOTIFICATION_RULES_DEDUPLICATION_DURATIONS:NEW_PLATFORM_VERSION:0;RATE_LIMITS:14400000;}"
# General management parameters # General management parameters
# Configures Spring Boot Actuator endpoint exposure and health indicator settings.
management: management:
endpoints: endpoints:
web: web:
@ -2136,6 +2173,7 @@ management:
enabled: "false" enabled: "false"
# Mobile application settings for Thingsboard mobile application # Mobile application settings for Thingsboard mobile application
# Specifies domain name and store links used for the ThingsBoard Live mobile application QR code and deep links.
mobileApp: mobileApp:
# Server domain name for Thingsboard Live mobile application # Server domain name for Thingsboard Live mobile application
domain: "${TB_MOBILE_APP_DOMAIN:demo.thingsboard.io}" domain: "${TB_MOBILE_APP_DOMAIN:demo.thingsboard.io}"
@ -2144,6 +2182,8 @@ mobileApp:
# Link to App Store for Thingsboard Live mobile application # Link to App Store for Thingsboard Live mobile application
appStoreLink: "${TB_MOBILE_APP_APP_STORE_LINK:https://apps.apple.com/us/app/thingsboard-live/id1594355695}" appStoreLink: "${TB_MOBILE_APP_APP_STORE_LINK:https://apps.apple.com/us/app/thingsboard-live/id1594355695}"
# MQTT client parameters
# Configures MQTT client retransmission behavior including max attempts, initial delay, and jitter factor.
mqtt: mqtt:
# MQTT client configuration parameters # MQTT client configuration parameters
client: client:

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

@ -18,7 +18,7 @@ package org.thingsboard.server.controller;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.mockito.ArgumentMatcher; import org.mockito.ArgumentMatcher;
import org.mockito.Mockito; 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.cluster.TbClusterService; import org.thingsboard.server.cluster.TbClusterService;
import org.thingsboard.server.common.data.EdgeUtils; import org.thingsboard.server.common.data.EdgeUtils;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
@ -53,10 +53,10 @@ import static org.mockito.Mockito.times;
@Slf4j @Slf4j
public abstract class AbstractNotifyEntityTest extends AbstractWebTest { public abstract class AbstractNotifyEntityTest extends AbstractWebTest {
@SpyBean @MockitoSpyBean
protected TbClusterService tbClusterService; protected TbClusterService tbClusterService;
@SpyBean @MockitoSpyBean
protected AuditLogService auditLogService; protected AuditLogService auditLogService;
protected final String msgErrorPermission = "You don't have permission to perform this operation!"; protected final String msgErrorPermission = "You don't have permission to perform this operation!";

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

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

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

@ -231,6 +231,10 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
.comment(JacksonUtil.newObjectNode().put("text", String.format("Comment was deleted by user %s", .comment(JacksonUtil.newObjectNode().put("text", String.format("Comment was deleted by user %s",
CUSTOMER_USER_EMAIL))) CUSTOMER_USER_EMAIL)))
.build(); .build();
// The audit log receives the persisted comment, and AlarmComment equality covers the
// inherited id and createdTime, which the builder cannot populate.
expectedAlarmComment.setId(alarmComment.getId());
expectedAlarmComment.setCreatedTime(alarmComment.getCreatedTime());
testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment); testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment);
} }
@ -255,6 +259,10 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
.comment(JacksonUtil.newObjectNode().put("text", String.format("Comment was deleted by user %s", .comment(JacksonUtil.newObjectNode().put("text", String.format("Comment was deleted by user %s",
TENANT_ADMIN_EMAIL))) TENANT_ADMIN_EMAIL)))
.build(); .build();
// The audit log receives the persisted comment, and AlarmComment equality covers the
// inherited id and createdTime, which the builder cannot populate.
expectedAlarmComment.setId(alarmComment.getId());
expectedAlarmComment.setCreatedTime(alarmComment.getCreatedTime());
testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment); testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment);
} }
@ -286,6 +294,10 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
.comment(JacksonUtil.newObjectNode().put("text", String.format("Comment was deleted by user %s", .comment(JacksonUtil.newObjectNode().put("text", String.format("Comment was deleted by user %s",
TENANT_ADMIN_EMAIL))) TENANT_ADMIN_EMAIL)))
.build(); .build();
// The audit log receives the persisted comment, and AlarmComment equality covers the
// inherited id and createdTime, which the builder cannot populate.
expectedAlarmComment.setId(alarmComment.getId());
expectedAlarmComment.setCreatedTime(alarmComment.getCreatedTime());
testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment); testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment);
} }

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

@ -25,7 +25,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; 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.Device;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
@ -66,9 +66,9 @@ public class AuditLogControllerTest extends AbstractControllerTest {
@Autowired @Autowired
private AuditLogDao auditLogDao; private AuditLogDao auditLogDao;
@Getter @Getter
@SpyBean @MockitoSpyBean
private SqlPartitioningRepository partitioningRepository; private SqlPartitioningRepository partitioningRepository;
@SpyBean @MockitoSpyBean
private AuditLogsCleanUpService auditLogsCleanUpService; private AuditLogsCleanUpService auditLogsCleanUpService;
@Value("#{${sql.audit_logs.partition_size} * 60 * 60 * 1000}") @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; package org.thingsboard.server.controller;
import lombok.Getter; 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.springframework.test.context.TestPropertySource;
import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.dao.sqlts.insert.sql.DedicatedEventsSqlPartitioningRepository; 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 { public class AuditLogControllerTest_DedicatedEventsDataSource extends AuditLogControllerTest {
@Getter @Getter
@SpyBean @MockitoSpyBean
private DedicatedEventsSqlPartitioningRepository partitioningRepository; private DedicatedEventsSqlPartitioningRepository partitioningRepository;
} }

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

@ -20,7 +20,7 @@ import org.assertj.core.data.Offset;
import org.junit.After; import org.junit.After;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; 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.springframework.http.HttpHeaders;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
@ -50,7 +50,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@DaoSqlTest @DaoSqlTest
public class AuthControllerTest extends AbstractControllerTest { public class AuthControllerTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private UserCredentialsDao userCredentialsDao; private UserCredentialsDao userCredentialsDao;
@After @After

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

@ -24,7 +24,7 @@ import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; 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.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.ActorSystemContext;
@ -96,15 +96,15 @@ public class BaseQueueControllerTest extends AbstractControllerTest {
private RuleEngineStatisticsService ruleEngineStatisticsService; private RuleEngineStatisticsService ruleEngineStatisticsService;
@Autowired @Autowired
private StatsFactory statsFactory; private StatsFactory statsFactory;
@SpyBean @MockitoSpyBean
private TimeseriesDao timeseriesDao; private TimeseriesDao timeseriesDao;
@Autowired @Autowired
private QueueStatsService queueStatsService; private QueueStatsService queueStatsService;
@SpyBean @MockitoSpyBean
private PartitionService partitionService; private PartitionService partitionService;
@SpyBean @MockitoSpyBean
private TimeseriesService timeseriesService; private TimeseriesService timeseriesService;
@SpyBean @MockitoSpyBean
private ActorSystemContext actorSystemContext; private ActorSystemContext actorSystemContext;
@Test @Test

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.ArgumentCaptor;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; 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.Bean;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
@ -109,10 +109,10 @@ public class DeviceControllerTest extends AbstractControllerTest {
private Tenant savedTenant; private Tenant savedTenant;
private User tenantAdmin; private User tenantAdmin;
@SpyBean @MockitoSpyBean
private GatewayNotificationsService gatewayNotificationsService; private GatewayNotificationsService gatewayNotificationsService;
@SpyBean @MockitoSpyBean
private DeviceStateService deviceStateService; private DeviceStateService deviceStateService;
@Autowired @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.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; 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.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.AttributeScope; import org.thingsboard.server.common.data.AttributeScope;
@ -66,7 +66,7 @@ public class EdgeEventControllerTest extends AbstractControllerTest {
@Autowired @Autowired
private EdgeEventDao edgeEventDao; private EdgeEventDao edgeEventDao;
@SpyBean @MockitoSpyBean
private SqlPartitioningRepository partitioningRepository; private SqlPartitioningRepository partitioningRepository;
@Autowired @Autowired
private EdgeEventsCleanUpService edgeEventsCleanUpService; private EdgeEventsCleanUpService edgeEventsCleanUpService;

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

@ -19,7 +19,7 @@ import org.assertj.core.api.ThrowingConsumer;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; 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.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.thingsboard.server.common.data.edqs.EdqsState; import org.thingsboard.server.common.data.edqs.EdqsState;
import org.thingsboard.server.common.data.edqs.EdqsState.EdqsApiMode; import org.thingsboard.server.common.data.edqs.EdqsState.EdqsApiMode;
@ -59,7 +59,7 @@ public class EdqsEntityQueryControllerTest extends EntityQueryControllerTest {
@Autowired @Autowired
private DiscoveryService discoveryService; private DiscoveryService discoveryService;
@MockBean // so that we don't do backup for tests @MockitoBean // so that we don't do backup for tests
private EdqsRocksDb edqsRocksDb; private EdqsRocksDb edqsRocksDb;
@Before @Before

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.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; 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.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.MailService; import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.rule.engine.api.SmsService; import org.thingsboard.rule.engine.api.SmsService;
@ -85,10 +85,10 @@ public class HomePageApiTest extends AbstractControllerTest {
@Autowired @Autowired
private OAuth2ClientService oAuth2ClientService; private OAuth2ClientService oAuth2ClientService;
@MockBean @MockitoBean
private MailService mailService; private MailService mailService;
@MockBean @MockitoBean
private SmsService smsService; private SmsService smsService;
private static final int DEFAULT_DASHBOARDS_COUNT = 0; 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 com.google.common.util.concurrent.SettableFuture;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.Test; 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.RepositoryAuthMethod;
import org.thingsboard.server.common.data.sync.vc.RepositorySettings; import org.thingsboard.server.common.data.sync.vc.RepositorySettings;
import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.service.DaoSqlTest;
@ -35,7 +35,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@DaoSqlTest @DaoSqlTest
public class RepositorySettingsTest extends AbstractControllerTest { public class RepositorySettingsTest extends AbstractControllerTest {
@MockBean @MockitoBean
private GitVersionControlQueueService gitVersionControlQueueService; private GitVersionControlQueueService gitVersionControlQueueService;
@Test @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 com.fasterxml.jackson.databind.JsonNode;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; 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.common.util.JacksonUtil;
import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device; 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 REQUEST_BODY = "{\"request\":\"download\"}";
private final String RESPONSE_BODY = "{\"response\":\"downloadOk\"}"; private final String RESPONSE_BODY = "{\"response\":\"downloadOk\"}";
@SpyBean @MockitoSpyBean
private RuleEngineCallService ruleEngineCallService; private RuleEngineCallService ruleEngineCallService;
@Test @Test

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

@ -27,7 +27,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentMatcher; import org.mockito.ArgumentMatcher;
import org.mockito.Mockito; 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.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultActions;
import org.thingsboard.common.util.ThingsBoardExecutors; import org.thingsboard.common.util.ThingsBoardExecutors;
@ -110,11 +110,11 @@ public class TenantControllerTest extends AbstractControllerTest {
ListeningExecutorService executor; ListeningExecutorService executor;
@SpyBean @MockitoSpyBean
private PartitionService partitionService; private PartitionService partitionService;
@SpyBean @MockitoSpyBean
private ActorSystemContext actorContext; private ActorSystemContext actorContext;
@SpyBean @MockitoSpyBean
private TbQueueAdmin queueAdmin; private TbQueueAdmin queueAdmin;
@Before @Before

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.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired; 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.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.cache.CacheManager; import org.springframework.cache.CacheManager;
import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder;
@ -62,15 +62,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@DaoSqlTest @DaoSqlTest
public class TwoFactorAuthConfigTest extends AbstractControllerTest { public class TwoFactorAuthConfigTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private TotpTwoFaProvider totpTwoFactorAuthProvider; private TotpTwoFaProvider totpTwoFactorAuthProvider;
@MockBean @MockitoBean
private SmsService smsService; private SmsService smsService;
@Autowired @Autowired
private CacheManager cacheManager; private CacheManager cacheManager;
@Autowired @Autowired
private TwoFaConfigManager twoFaConfigManager; private TwoFaConfigManager twoFaConfigManager;
@SpyBean @MockitoSpyBean
private TwoFactorAuthService twoFactorAuthService; private TwoFactorAuthService twoFactorAuthService;
@Before @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.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired; 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.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.rule.engine.api.SmsService; import org.thingsboard.rule.engine.api.SmsService;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
@ -78,9 +78,9 @@ public class TwoFactorAuthTest extends AbstractControllerTest {
@Autowired @Autowired
private TwoFaConfigManager twoFaConfigManager; private TwoFaConfigManager twoFaConfigManager;
@SpyBean @MockitoSpyBean
private TwoFactorAuthService twoFactorAuthService; private TwoFactorAuthService twoFactorAuthService;
@MockBean @MockitoBean
private SmsService smsService; private SmsService smsService;
@Autowired @Autowired
private AuditLogService auditLogService; private AuditLogService auditLogService;

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

@ -28,7 +28,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; 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.springframework.test.context.TestPropertySource;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
@ -100,7 +100,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
@Autowired @Autowired
private TelemetrySubscriptionService tsService; private TelemetrySubscriptionService tsService;
@SpyBean @MockitoSpyBean
private TimeseriesService timeseriesService; private TimeseriesService timeseriesService;
Device device; Device device;

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

@ -21,8 +21,10 @@ import org.assertj.core.api.Assertions;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.annotation.Configuration;
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.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.cluster.TbClusterService;
@ -73,28 +75,43 @@ import static org.mockito.Mockito.when;
@Slf4j @Slf4j
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration(classes = DeviceProvisionServiceImpl.class) @ContextConfiguration(classes = DeviceProvisionServiceTest.TestConfig.class)
public class DeviceProvisionServiceTest { public class DeviceProvisionServiceTest {
@MockBean @Configuration
static class TestConfig {
@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; protected TbQueueProducerProvider producerProvider;
@MockBean @MockitoBean
protected TbQueueProducer<TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> ruleEngineMsgProducer; protected TbQueueProducer<TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> ruleEngineMsgProducer;
@MockBean @MockitoBean
protected TbClusterService clusterService; protected TbClusterService clusterService;
@MockBean @MockitoBean
protected DeviceProfileService deviceProfileService; protected DeviceProfileService deviceProfileService;
@MockBean @MockitoBean
protected DeviceService deviceService; protected DeviceService deviceService;
@MockBean @MockitoBean
protected DeviceCredentialsService deviceCredentialsService; protected DeviceCredentialsService deviceCredentialsService;
@MockBean @MockitoBean
protected AttributesService attributesService; protected AttributesService attributesService;
@MockBean @MockitoBean
protected AuditLogService auditLogService; protected AuditLogService auditLogService;
@MockBean @MockitoBean
protected PartitionService partitionService; protected PartitionService partitionService;
@SpyBean @MockitoSpyBean
DeviceProvisionServiceImpl service; DeviceProvisionServiceImpl service;
private String[] chain; private String[] chain;

4
application/src/test/java/org/thingsboard/server/service/entitiy/EdqsEntityServiceTest.java

@ -21,7 +21,7 @@ import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; 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.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
@ -72,7 +72,7 @@ public class EdqsEntityServiceTest extends EntityServiceTest {
@Autowired @Autowired
private EdqsService edqsService; private EdqsService edqsService;
@MockBean @MockitoBean
private EdqsRocksDb edqsRocksDb; private EdqsRocksDb edqsRocksDb;
@Before @Before

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 com.fasterxml.jackson.databind.node.ObjectNode;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; 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.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.cluster.TbClusterService;
@ -66,35 +66,35 @@ import static org.mockito.Mockito.when;
@SpringJUnitConfig(DefaultTbAlarmService.class) @SpringJUnitConfig(DefaultTbAlarmService.class)
class DefaultTbAlarmServiceTest { class DefaultTbAlarmServiceTest {
@MockBean @MockitoBean
TbLogEntityActionService logEntityActionService; TbLogEntityActionService logEntityActionService;
@MockBean @MockitoBean
EdgeService edgeService; EdgeService edgeService;
@MockBean @MockitoBean
AlarmService alarmService; AlarmService alarmService;
@MockBean @MockitoBean
TbAlarmCommentService alarmCommentService; TbAlarmCommentService alarmCommentService;
@MockBean @MockitoBean
AlarmSubscriptionService alarmSubscriptionService; AlarmSubscriptionService alarmSubscriptionService;
@MockBean @MockitoBean
CustomerService customerService; CustomerService customerService;
@MockBean @MockitoBean
TbClusterService tbClusterService; TbClusterService tbClusterService;
@MockBean @MockitoBean
EntitiesVersionControlService vcService; EntitiesVersionControlService vcService;
@MockBean @MockitoBean
AccessControlService accessControlService; AccessControlService accessControlService;
@MockBean @MockitoBean
TenantService tenantService; TenantService tenantService;
@MockBean @MockitoBean
AssetService assetService; AssetService assetService;
@MockBean @MockitoBean
DeviceService deviceService; DeviceService deviceService;
@MockBean @MockitoBean
AssetProfileService assetProfileService; AssetProfileService assetProfileService;
@MockBean @MockitoBean
DeviceProfileService deviceProfileService; DeviceProfileService deviceProfileService;
@MockBean @MockitoBean
EntityService entityService; EntityService entityService;
@Autowired @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.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
@ -65,35 +65,35 @@ import static org.mockito.Mockito.when;
}) })
public class DefaultTbAlarmCommentServiceTest { public class DefaultTbAlarmCommentServiceTest {
@MockBean @MockitoBean
protected DbCallbackExecutorService dbExecutor; protected DbCallbackExecutorService dbExecutor;
@MockBean @MockitoBean
protected TbLogEntityActionService logEntityActionService; protected TbLogEntityActionService logEntityActionService;
@MockBean @MockitoBean
protected AlarmService alarmService; protected AlarmService alarmService;
@MockBean @MockitoBean
protected AlarmCommentService alarmCommentService; protected AlarmCommentService alarmCommentService;
@MockBean @MockitoBean
protected AlarmSubscriptionService alarmSubscriptionService; protected AlarmSubscriptionService alarmSubscriptionService;
@MockBean @MockitoBean
protected CustomerService customerService; protected CustomerService customerService;
@MockBean @MockitoBean
protected TbClusterService tbClusterService; protected TbClusterService tbClusterService;
@MockBean @MockitoBean
private AccessControlService accessControlService; private AccessControlService accessControlService;
@MockBean @MockitoBean
private TenantService tenantService; private TenantService tenantService;
@MockBean @MockitoBean
private AssetService assetService; private AssetService assetService;
@MockBean @MockitoBean
private DeviceService deviceService; private DeviceService deviceService;
@MockBean @MockitoBean
private AssetProfileService assetProfileService; private AssetProfileService assetProfileService;
@MockBean @MockitoBean
private DeviceProfileService deviceProfileService; private DeviceProfileService deviceProfileService;
@MockBean @MockitoBean
private EntityService entityService; private EntityService entityService;
@SpyBean @MockitoSpyBean
DefaultTbAlarmCommentService service; DefaultTbAlarmCommentService service;
@Test @Test

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

4
application/src/test/java/org/thingsboard/server/service/install/update/DefaultDataUpdateServiceTest.java

@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
@ -34,7 +34,7 @@ import static org.mockito.BDDMockito.willCallRealMethod;
@SpringBootTest(classes = DefaultDataUpdateService.class) @SpringBootTest(classes = DefaultDataUpdateService.class)
class DefaultDataUpdateServiceTest { class DefaultDataUpdateServiceTest {
@MockBean @MockitoBean
DefaultDataUpdateService service; DefaultDataUpdateService service;
@BeforeEach @BeforeEach

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

@ -21,7 +21,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; 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.springframework.test.context.TestPropertySource;
import org.thingsboard.rule.engine.api.JobManager; import org.thingsboard.rule.engine.api.JobManager;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
@ -64,10 +64,10 @@ public class JobManagerTest extends AbstractControllerTest {
@Autowired @Autowired
private JobManager jobManager; private JobManager jobManager;
@SpyBean @MockitoSpyBean
private TestTaskProcessor taskProcessor; private TestTaskProcessor taskProcessor;
@SpyBean @MockitoSpyBean
private JobStatsService jobStatsService; private JobStatsService jobStatsService;
@Autowired @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 user = new User();
user.setTenantId(tenantId); user.setTenantId(tenantId);
user.setAuthority(authority); user.setAuthority(authority);
user.setEmail(RandomStringUtils.randomAlphabetic(20) + "@thingsboard.com"); user.setEmail(RandomStringUtils.secure().nextAlphabetic(20) + "@thingsboard.com");
user = createUserAndLogin(user, "12345678"); user = createUserAndLogin(user, "12345678");
NotificationApiWsClient wsClient = buildAndConnectWebSocketClient(); NotificationApiWsClient wsClient = buildAndConnectWebSocketClient();
return Pair.of(user, wsClient); return Pair.of(user, wsClient);

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

@ -24,7 +24,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired; 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.http.HttpEntity; import org.springframework.http.HttpEntity;
import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultActions;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
@ -125,7 +125,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest {
private NotificationCenter notificationCenter; private NotificationCenter notificationCenter;
@Autowired @Autowired
private MicrosoftTeamsNotificationChannel microsoftTeamsNotificationChannel; private MicrosoftTeamsNotificationChannel microsoftTeamsNotificationChannel;
@MockBean @MockitoBean
private FirebaseService firebaseService; private FirebaseService firebaseService;
private static final String TEST_MOBILE_TOKEN = "tenantFcmToken"; private static final String TEST_MOBILE_TOKEN = "tenantFcmToken";

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

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

4
application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java

@ -22,7 +22,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.function.ThrowingRunnable; import org.junit.function.ThrowingRunnable;
import org.springframework.beans.factory.annotation.Autowired; 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.data.util.Pair; import org.springframework.data.util.Pair;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
@ -137,7 +137,7 @@ import static org.thingsboard.server.common.data.notification.rule.trigger.confi
}) })
public class NotificationRuleApiTest extends AbstractNotificationApiTest { public class NotificationRuleApiTest extends AbstractNotificationApiTest {
@SpyBean @MockitoSpyBean
private AlarmSubscriptionService alarmSubscriptionService; private AlarmSubscriptionService alarmSubscriptionService;
@Autowired @Autowired
private DefaultSystemInfoService systemInfoService; private DefaultSystemInfoService systemInfoService;

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

@ -17,11 +17,12 @@ package org.thingsboard.server.service.queue;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
@ -56,6 +57,7 @@ import org.thingsboard.server.queue.discovery.PartitionService;
import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TopicService;
import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
import org.thingsboard.server.service.gateway_device.GatewayNotificationsService; 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.TbAssetProfileCache;
import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache;
@ -67,6 +69,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@ -87,30 +90,45 @@ public class DefaultTbClusterServiceTest {
public static final String TRANSPORT = "transport"; public static final String TRANSPORT = "transport";
@MockBean @MockitoBean
protected TbDeviceProfileCache deviceProfileCache; protected TbDeviceProfileCache deviceProfileCache;
@MockBean @MockitoBean
protected TbAssetProfileCache assetProfileCache; protected TbAssetProfileCache assetProfileCache;
@MockBean @MockitoBean
protected GatewayNotificationsService gatewayNotificationsService; protected GatewayNotificationsService gatewayNotificationsService;
@MockBean @MockitoBean
protected EdgeService edgeService; protected EdgeService edgeService;
@MockBean @MockitoBean
protected PartitionService partitionService; protected PartitionService partitionService;
@MockBean @MockitoBean
protected TbQueueProducerProvider producerProvider; protected TbQueueProducerProvider producerProvider;
@MockBean @MockitoBean
protected TbRuleEngineProducerService ruleEngineProducerService; protected TbRuleEngineProducerService ruleEngineProducerService;
@MockBean @MockitoBean
protected TbTransactionalCache<EdgeId, String> edgeCache; protected TbTransactionalCache<EdgeId, String> edgeCache;
@MockBean @MockitoBean
protected CalculatedFieldService calculatedFieldService; protected CalculatedFieldService calculatedFieldService;
@SpyBean @MockitoBean
protected TopicService topicService; protected TopicService topicService;
@SpyBean @MockitoBean
protected OtaPackageStateService otaPackageStateService;
@MockitoSpyBean
protected TbClusterService clusterService; protected TbClusterService clusterService;
@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 @Test
public void testOnQueueChangeSingleMonolith() { public void testOnQueueChangeSingleMonolith() {
when(partitionService.getAllServiceIds(ServiceType.TB_RULE_ENGINE)).thenReturn(Sets.newHashSet(MONOLITH)); when(partitionService.getAllServiceIds(ServiceType.TB_RULE_ENGINE)).thenReturn(Sets.newHashSet(MONOLITH));

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

@ -22,7 +22,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; 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.springframework.test.context.TestPropertySource;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
@ -54,7 +54,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
"usage.stats.report.interval=1", "usage.stats.report.interval=1",
}) })
public class DefaultSmsServiceTest extends AbstractControllerTest { public class DefaultSmsServiceTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private DefaultSmsService defaultSmsService; private DefaultSmsService defaultSmsService;
@Autowired @Autowired
private AdminSettingsService adminSettingsService; private AdminSettingsService adminSettingsService;

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.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; 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.common.util.JacksonUtil;
import org.thingsboard.rule.engine.debug.TbMsgGeneratorNode; import org.thingsboard.rule.engine.debug.TbMsgGeneratorNode;
import org.thingsboard.rule.engine.debug.TbMsgGeneratorNodeConfiguration; import org.thingsboard.rule.engine.debug.TbMsgGeneratorNodeConfiguration;
@ -128,9 +128,9 @@ import static org.mockito.Mockito.verify;
@DaoSqlTest @DaoSqlTest
public class ExportImportServiceSqlTest extends AbstractControllerTest { public class ExportImportServiceSqlTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private EntityActionService entityActionService; private EntityActionService entityActionService;
@SpyBean @MockitoSpyBean
private OtaPackageStateService otaPackageStateService; private OtaPackageStateService otaPackageStateService;
@Autowired @Autowired

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

@ -20,8 +20,10 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.annotation.Configuration;
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.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.thingsboard.server.cache.ota.OtaPackageDataCache; import org.thingsboard.server.cache.ota.OtaPackageDataCache;
@ -69,38 +71,60 @@ import static org.mockito.Mockito.when;
@Slf4j @Slf4j
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration(classes = DefaultTransportApiService.class) @ContextConfiguration(classes = DefaultTransportApiServiceTest.TestConfig.class)
public class DefaultTransportApiServiceTest { public class DefaultTransportApiServiceTest {
@MockBean @Configuration
static class TestConfig {
@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; protected TbDeviceProfileCache deviceProfileCache;
@MockBean @MockitoBean
protected TbTenantProfileCache tenantProfileCache; protected TbTenantProfileCache tenantProfileCache;
@MockBean @MockitoBean
protected TbApiUsageStateService apiUsageStateService; protected TbApiUsageStateService apiUsageStateService;
@MockBean @MockitoBean
protected DeviceService deviceService; protected DeviceService deviceService;
@MockBean @MockitoBean
protected DeviceProfileService deviceProfileService; protected DeviceProfileService deviceProfileService;
@MockBean @MockitoBean
protected RelationService relationService; protected RelationService relationService;
@MockBean @MockitoBean
protected DeviceCredentialsService deviceCredentialsService; protected DeviceCredentialsService deviceCredentialsService;
@MockBean @MockitoBean
protected DbCallbackExecutorService dbCallbackExecutorService; protected DbCallbackExecutorService dbCallbackExecutorService;
@MockBean @MockitoBean
protected TbClusterService tbClusterService; protected TbClusterService tbClusterService;
@MockBean @MockitoBean
protected DeviceProvisionService deviceProvisionService; protected DeviceProvisionService deviceProvisionService;
@MockBean @MockitoBean
protected ResourceService resourceService; protected ResourceService resourceService;
@MockBean @MockitoBean
protected OtaPackageService otaPackageService; protected OtaPackageService otaPackageService;
@MockBean @MockitoBean
protected OtaPackageDataCache otaPackageDataCache; protected OtaPackageDataCache otaPackageDataCache;
@MockBean @MockitoBean
protected QueueService queueService; protected QueueService queueService;
@SpyBean @MockitoSpyBean
DefaultTransportApiService service; DefaultTransportApiService service;
private String certificateChain; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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.springframework.test.context.TestPropertySource;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.Alarm;
@ -50,9 +50,9 @@ import static org.mockito.Mockito.verify;
}) })
public class AlarmsCleanUpServiceTest extends AbstractControllerTest { public class AlarmsCleanUpServiceTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private AlarmsCleanUpService alarmsCleanUpService; private AlarmsCleanUpService alarmsCleanUpService;
@SpyBean @MockitoSpyBean
private AlarmService alarmService; private AlarmService alarmService;
@Autowired @Autowired
private AlarmDao alarmDao; private AlarmDao alarmDao;

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

@ -36,7 +36,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; 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.http.HttpStatus;
import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.DynamicPropertySource;
@ -101,10 +101,10 @@ import java.util.concurrent.atomic.AtomicLong;
import static org.awaitility.Awaitility.await; import static org.awaitility.Awaitility.await;
import static org.eclipse.leshan.client.object.Security.noSec; 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.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.timeout;
@ -132,10 +132,10 @@ import static org.thingsboard.server.transport.lwm2m.ota.AbstractOtaLwM2MIntegra
@DaoSqlTest @DaoSqlTest
public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportIntegrationTest { public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportIntegrationTest {
@SpyBean @MockitoSpyBean
protected LwM2mUplinkMsgHandler defaultLwM2mUplinkMsgHandlerTest; protected LwM2mUplinkMsgHandler defaultLwM2mUplinkMsgHandlerTest;
@SpyBean @MockitoSpyBean
protected DefaultLwM2mUplinkMsgHandler defaultUplinkMsgHandlerTest; protected DefaultLwM2mUplinkMsgHandler defaultUplinkMsgHandlerTest;
@Autowired @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.eclipse.leshan.core.link.lwm2m.DefaultLwM2mLinkParser;
import org.junit.Before; import org.junit.Before;
import org.mockito.Mockito; 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.Device;
import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MDeviceCredentials; import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MDeviceCredentials;
@ -78,16 +78,16 @@ public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MInteg
protected final LinkParser linkParser = new DefaultLwM2mLinkParser(); protected final LinkParser linkParser = new DefaultLwM2mLinkParser();
protected String CONFIG_PROFILE_WITH_PARAMS_RPC; protected String CONFIG_PROFILE_WITH_PARAMS_RPC;
public Set expectedObjects; public Set<String> expectedObjects;
public Set expectedObjectIdVers; public Set<String> expectedObjectIdVers;
public Set expectedInstances; public Set<String> expectedInstances;
public Set expectedObjectIdVerInstances; public Set<String> expectedObjectIdVerInstances;
protected String objectInstanceIdVer_1; protected String objectInstanceIdVer_1;
protected String objectIdVer_0; protected String objectIdVer_0;
protected String objectIdVer_1; protected String objectIdVer_1;
protected String objectIdVer_2; 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 objectIdVer_3;
protected String objectInstanceIdVer_3; protected String objectInstanceIdVer_3;
protected String objectInstanceIdVer_5; protected String objectInstanceIdVer_5;
@ -104,7 +104,7 @@ public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MInteg
protected String idVer_19_0_0; protected String idVer_19_0_0;
@SpyBean @MockitoSpyBean
protected LwM2mTransportServerHelper lwM2mTransportServerHelperTest; protected LwM2mTransportServerHelper lwM2mTransportServerHelperTest;
@Before @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.eclipse.leshan.server.registration.RegistrationUpdate;
import org.junit.Assert; import org.junit.Assert;
import org.mockito.Mockito; 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.Device;
import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration;
@ -49,7 +49,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MClient
@Slf4j @Slf4j
public abstract class AbstractLwM2MIntegrationDiffPortTest extends AbstractSecurityLwM2MIntegrationTest { public abstract class AbstractLwM2MIntegrationDiffPortTest extends AbstractSecurityLwM2MIntegrationTest {
@SpyBean @MockitoSpyBean
private RegistrationStore registrationStoreTest; private RegistrationStore registrationStoreTest;
protected void basicTestConnectionDifferentPort(Lwm2mDeviceProfileTransportConfiguration transportConfiguration, 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.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; 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.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
@ -71,7 +71,7 @@ public class MqttGatewayRateLimitsTest extends AbstractControllerTest {
private Device gateway; private Device gateway;
private String gatewayAccessToken; private String gatewayAccessToken;
@SpyBean @MockitoSpyBean
private NotificationRuleProcessor notificationRuleProcessor; private NotificationRuleProcessor notificationRuleProcessor;
@Before @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.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; 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.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.id.DeviceId; 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," + 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\"}}}"; " \"key5\": {\"someNumber\": 42, \"someArray\": [1,2,3], \"someNestedObject\": {\"key\": \"value\"}}}";
@SpyBean @MockitoSpyBean
GatewayMetricsService gatewayMetricsService; GatewayMetricsService gatewayMetricsService;
@Before @Before

2
common/actor/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/cache/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

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) { public byte[] get(String key, int chunkSize, int chunk) {
try (RedisConnection connection = redisConnectionFactory.getConnection()) { try (RedisConnection connection = redisConnectionFactory.getConnection()) {
if (chunkSize == 0) { if (chunkSize == 0) {
return connection.get(toOtaPackageCacheKey(key)); return connection.stringCommands().get(toOtaPackageCacheKey(key));
} }
int startIndex = chunkSize * chunk; int startIndex = chunkSize * chunk;
int endIndex = startIndex + chunkSize - 1; int endIndex = startIndex + chunkSize - 1;
return connection.getRange(toOtaPackageCacheKey(key), startIndex, endIndex); return connection.stringCommands().getRange(toOtaPackageCacheKey(key), startIndex, endIndex);
} }
} }
@Override @Override
public void put(String key, byte[] value) { public void put(String key, byte[] value) {
try (RedisConnection connection = redisConnectionFactory.getConnection()) { try (RedisConnection connection = redisConnectionFactory.getConnection()) {
connection.set(toOtaPackageCacheKey(key), value); connection.stringCommands().set(toOtaPackageCacheKey(key), value);
} }
} }
@Override @Override
public void evict(String key) { public void evict(String key) {
try (RedisConnection connection = redisConnectionFactory.getConnection()) { try (RedisConnection connection = redisConnectionFactory.getConnection()) {
connection.del(toOtaPackageCacheKey(key)); connection.keyCommands().del(toOtaPackageCacheKey(key));
} }
} }

2
common/cluster-api/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/coap-server/pom.xml

@ -22,7 +22,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/dao-api/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/data/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

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

@ -22,6 +22,8 @@ import java.util.Arrays;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
import static org.thingsboard.server.common.data.StringUtils.removeStart;
public enum EntityType { public enum EntityType {
TENANT(1), TENANT(1),
CUSTOMER(2), CUSTOMER(2),
@ -76,7 +78,7 @@ public enum EntityType {
@Getter @Getter
private final String tableName; private final String tableName;
@Getter @Getter
private final String normalName = StringUtils.capitalize(StringUtils.removeStart(name(), "TB_") private final String normalName = StringUtils.capitalize(removeStart(name(), "TB_")
.toLowerCase().replaceAll("_", " ")); .toLowerCase().replaceAll("_", " "));
public static final List<String> NORMAL_NAMES = EnumSet.allOf(EntityType.class).stream() public static final List<String> NORMAL_NAMES = EnumSet.allOf(EntityType.class).stream()

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 com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EventId; import org.thingsboard.server.common.data.id.EventId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -26,6 +27,7 @@ import org.thingsboard.server.common.data.id.TenantId;
* @author Andrew Shvayka * @author Andrew Shvayka
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true)
@Schema @Schema
public class EventInfo extends BaseData<EventId> { 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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
@Schema @Schema
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class HomeDashboard extends Dashboard { public class HomeDashboard extends Dashboard {
public static final String HIDE_DASHBOARD_TOOLBAR_DESCRIPTION = "Hide dashboard toolbar flag. Useful for rendering dashboards on mobile."; public static final String HIDE_DASHBOARD_TOOLBAR_DESCRIPTION = "Hide dashboard toolbar flag. Useful for rendering dashboards on mobile.";

13
common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java

@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Base64; import java.util.Base64;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -162,7 +163,7 @@ public class StringUtils {
} }
public static boolean equals(String str1, String str2) { public static boolean equals(String str1, String str2) {
return org.apache.commons.lang3.StringUtils.equals(str1, str2); return Objects.equals(str1, str2);
} }
public static boolean equalsAny(String string, String... otherStrings) { public static boolean equalsAny(String string, String... otherStrings) {
@ -217,23 +218,23 @@ public class StringUtils {
} }
public static String randomNumeric(int length) { public static String randomNumeric(int length) {
return RandomStringUtils.randomNumeric(length); return RandomStringUtils.secure().nextNumeric(length);
} }
public static String random(int length) { public static String random(int length) {
return RandomStringUtils.random(length); return RandomStringUtils.secure().next(length);
} }
public static String random(int length, String chars) { public static String random(int length, String chars) {
return RandomStringUtils.random(length, chars); return RandomStringUtils.secure().next(length, chars);
} }
public static String randomAlphanumeric(int count) { public static String randomAlphanumeric(int count) {
return RandomStringUtils.randomAlphanumeric(count); return RandomStringUtils.secure().nextAlphanumeric(count);
} }
public static String randomAlphabetic(int count) { public static String randomAlphabetic(int count) {
return RandomStringUtils.randomAlphabetic(count); return RandomStringUtils.secure().nextAlphabetic(count);
} }
public static String generateSafeToken(int length) { public static String generateSafeToken(int length) {

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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@Schema @Schema
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class TenantInfo extends Tenant { public class TenantInfo extends Tenant {
@Schema(description = "Tenant Profile name", example = "Default") @Schema(description = "Tenant Profile name", example = "Default")
private String tenantProfileName; 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 @Schema
@Data @Data
@EqualsAndHashCode(callSuper = true)
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
public class AlarmComment extends BaseData<AlarmCommentId> implements HasName { public class AlarmComment extends BaseData<AlarmCommentId> implements HasName {

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

@ -19,12 +19,14 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.data.DeviceTransportType;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class CoapDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration { public class CoapDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration {
private static final long serialVersionUID = 6061442236008925609L; private static final long serialVersionUID = 6061442236008925609L;

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

@ -19,12 +19,14 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.data.DeviceTransportType;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class Lwm2mDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration { public class Lwm2mDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration {
@JsonIgnore @JsonIgnore

9
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/TelemetryObserveStrategy.java

@ -15,8 +15,13 @@
*/ */
package org.thingsboard.server.common.data.device.profile.lwm2m; package org.thingsboard.server.common.data.device.profile.lwm2m;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter; import lombok.Getter;
@Schema(description = "Observation strategy for telemetry. " +
"SINGLE (0): one resource equals one single observe request. " +
"COMPOSITE_ALL (1): all resources in one composite observe request. " +
"COMPOSITE_BY_OBJECT (2): grouped composite observe requests by object.")
public enum TelemetryObserveStrategy { public enum TelemetryObserveStrategy {
SINGLE("One resource equals one single observe request", 0), SINGLE("One resource equals one single observe request", 0),
@ -52,8 +57,4 @@ public enum TelemetryObserveStrategy {
throw new IllegalArgumentException("Unknown TelemetryObserveStrategy id: " + id); throw new IllegalArgumentException("Unknown TelemetryObserveStrategy id: " + id);
} }
@Override
public String toString() {
return name() + " (" + id + "): " + description;
}
} }

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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
@Schema @Schema
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class LwM2MServerSecurityConfigDefault extends LwM2MServerSecurityConfig { public class LwM2MServerSecurityConfigDefault extends LwM2MServerSecurityConfig {
@Schema(description = "Host for 'Security' mode (DTLS)", example = "0.0.0.0", accessMode = Schema.AccessMode.READ_ONLY) @Schema(description = "Host for 'Security' mode (DTLS)", example = "0.0.0.0", accessMode = Schema.AccessMode.READ_ONLY)
protected String securityHost; 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; package org.thingsboard.server.common.data.edge;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EdgeId;
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class EdgeInfo extends Edge { public class EdgeInfo extends Edge {
private String customerTitle; 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.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -26,6 +27,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class AssetFields extends AbstractEntityFields implements ProfileAwareFields { 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; package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import java.util.UUID; import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class AssetProfileFields extends AbstractEntityFields { 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 com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class CustomerFields extends AbstractEntityFields { 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.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -28,6 +29,7 @@ import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class DashboardFields extends AbstractEntityFields { 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.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -26,6 +27,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class DeviceFields extends AbstractEntityFields implements ProfileAwareFields { 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; package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.thingsboard.server.common.data.DeviceProfileType; import org.thingsboard.server.common.data.DeviceProfileType;
@ -23,6 +24,7 @@ import org.thingsboard.server.common.data.DeviceProfileType;
import java.util.UUID; import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class DeviceProfileFields extends AbstractEntityFields { 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 com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class EdgeFields extends AbstractEntityFields { 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 com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class EntityViewFields extends AbstractEntityFields { 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; package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import java.util.UUID; import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class QueueStatsFields extends AbstractEntityFields { 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 com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class RuleChainFields extends AbstractEntityFields { 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 com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class TenantFields extends AbstractEntityFields { 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; package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -23,6 +24,7 @@ import org.thingsboard.server.common.data.id.TenantId;
import java.util.UUID; import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class TenantProfileFields extends AbstractEntityFields { 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 com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class UserFields extends AbstractEntityFields { 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() { public Task() {
} }
private int attempt = 0; private int attempt;
public abstract R toFailed(Throwable error); 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; package org.thingsboard.server.common.data.kv;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class BaseDeleteTsKvQuery extends BaseTsKvQuery implements DeleteTsKvQuery { public class BaseDeleteTsKvQuery extends BaseTsKvQuery implements DeleteTsKvQuery {
private final Boolean rewriteLatestIfDeleted; private final Boolean rewriteLatestIfDeleted;

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

@ -38,6 +38,7 @@ public class MobileLayoutConfig {
@Schema(description = "List of pages") @Schema(description = "List of pages")
@JsonView(Views.Public.class) @JsonView(Views.Public.class)
@Valid @Valid
@Builder.Default
private List<MobilePage> pages = new ArrayList<>(); private List<MobilePage> pages = new ArrayList<>();
} }

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

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.query;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.ToString; import lombok.ToString;
import org.thingsboard.server.common.data.alarm.AlarmSearchStatus; import org.thingsboard.server.common.data.alarm.AlarmSearchStatus;
@ -30,6 +31,7 @@ import java.util.List;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Data @Data
@EqualsAndHashCode(callSuper = true)
@ToString @ToString
public class AlarmCountQuery extends EntityCountQuery { public class AlarmCountQuery extends EntityCountQuery {
private long startTs; private long startTs;

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.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.BaseDataWithAdditionalInfo; import org.thingsboard.server.common.data.BaseDataWithAdditionalInfo;
import org.thingsboard.server.common.data.HasName; import org.thingsboard.server.common.data.HasName;
import org.thingsboard.server.common.data.HasTenantId; import org.thingsboard.server.common.data.HasTenantId;
@ -30,6 +31,7 @@ import org.thingsboard.server.common.data.validation.NoXss;
import java.util.Optional; import java.util.Optional;
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class Queue extends BaseDataWithAdditionalInfo<QueueId> implements HasName, HasTenantId, QueueConfig { public class Queue extends BaseDataWithAdditionalInfo<QueueId> implements HasName, HasTenantId, QueueConfig {
private TenantId tenantId; private TenantId tenantId;
@NoXss @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; package org.thingsboard.server.common.data.rule;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.BaseData; import org.thingsboard.server.common.data.BaseData;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.RuleNodeId; import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.id.RuleNodeStateId; import org.thingsboard.server.common.data.id.RuleNodeStateId;
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class RuleNodeState extends BaseData<RuleNodeStateId> { public class RuleNodeState extends BaseData<RuleNodeStateId> {
private RuleNodeId ruleNodeId; private RuleNodeId ruleNodeId;

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

@ -168,16 +168,20 @@ public class DefaultTenantProfileConfiguration implements TenantProfileConfigura
private double warnThreshold; private double warnThreshold;
@Builder.Default
@Schema(example = "5") @Schema(example = "5")
private long maxCalculatedFieldsPerEntity = 5; private long maxCalculatedFieldsPerEntity = 5;
@Builder.Default
@Schema(example = "10") @Schema(example = "10")
private long maxArgumentsPerCF = 10; private long maxArgumentsPerCF = 10;
@Builder.Default @Builder.Default
@Min(value = 1, message = "must be at least 1") @Min(value = 1, message = "must be at least 1")
@Schema(example = "1000") @Schema(example = "1000")
private long maxDataPointsPerRollingArg = 1000; private long maxDataPointsPerRollingArg = 1000;
@Builder.Default
@Schema(example = "32") @Schema(example = "32")
private long maxStateSizeInKBytes = 32; private long maxStateSizeInKBytes = 32;
@Builder.Default
@Schema(example = "2") @Schema(example = "2")
private long maxSingleValueArgumentSizeInKBytes = 2; private long maxSingleValueArgumentSizeInKBytes = 2;

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

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

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 java.util.regex.Pattern;
import static com.google.common.base.Strings.nullToEmpty; 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 { public class TemplateUtils {

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

@ -63,7 +63,7 @@ public class TypeCastUtil {
} }
private static boolean isNumber(String value) { private static boolean isNumber(String value) {
return NumberUtils.isNumber(value.replace(',', '.')); return NumberUtils.isCreatable(value.replace(',', '.'));
} }
private static boolean isSimpleDouble(String valueAsString) { 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 io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.WidgetTypeId; import org.thingsboard.server.common.data.id.WidgetTypeId;
import org.thingsboard.server.common.data.validation.NoXss; import org.thingsboard.server.common.data.validation.NoXss;
@ -26,6 +27,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class WidgetTypeInfo extends BaseWidgetType { public class WidgetTypeInfo extends BaseWidgetType {
@Serial @Serial

2
common/discovery-api/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/edge-api/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

1
common/edge-api/src/main/proto/edge.proto

@ -49,6 +49,7 @@ enum EdgeVersion {
V_4_2_2_1 = 4221; V_4_2_2_1 = 4221;
V_4_2_2_2 = 4222; V_4_2_2_2 = 4222;
V_4_2_2_3 = 4223; V_4_2_2_3 = 4223;
V_4_2_2_4 = 4224;
V_LATEST = 99999; V_LATEST = 99999;
} }

2
common/edqs/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/message/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.2.2.3</version> <version>4.2.2.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

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

Loading…
Cancel
Save