diff --git a/application/pom.xml b/application/pom.xml
index ab26655052..d2cc11f069 100644
--- a/application/pom.xml
+++ b/application/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
application
diff --git a/application/src/main/data/upgrade/basic/schema_update.sql b/application/src/main/data/upgrade/basic/schema_update.sql
index 66243461e2..a2dfeac358 100644
--- a/application/src/main/data/upgrade/basic/schema_update.sql
+++ b/application/src/main/data/upgrade/basic/schema_update.sql
@@ -14,69 +14,3 @@
-- limitations under the License.
--
--- UPDATE TENANT PROFILE CONFIGURATION START
-
-UPDATE tenant_profile
-SET profile_data = jsonb_set(
- profile_data,
- '{configuration}',
- jsonb_build_object(
- 'minAllowedScheduledUpdateIntervalInSecForCF', 10,
- 'maxRelationLevelPerCfArgument', 2,
- 'maxRelatedEntitiesToReturnPerCfArgument', 100,
- 'minAllowedDeduplicationIntervalInSecForCF', 10,
- 'minAllowedAggregationIntervalInSecForCF', 60,
- 'intermediateAggregationIntervalInSecForCF', 300,
- 'cfReevaluationCheckInterval', 60,
- 'alarmsReevaluationInterval', 60
- )
- ||
- jsonb_strip_nulls(profile_data -> 'configuration')
-)
-WHERE NOT (
- jsonb_strip_nulls(profile_data -> 'configuration') ?& ARRAY[
- 'minAllowedScheduledUpdateIntervalInSecForCF',
- 'maxRelationLevelPerCfArgument',
- 'maxRelatedEntitiesToReturnPerCfArgument',
- 'minAllowedDeduplicationIntervalInSecForCF',
- 'minAllowedAggregationIntervalInSecForCF',
- 'intermediateAggregationIntervalInSecForCF',
- 'cfReevaluationCheckInterval',
- 'alarmsReevaluationInterval'
- ]
-);
-
--- UPDATE TENANT PROFILE CONFIGURATION END
-
--- CALCULATED FIELD UNIQUE CONSTRAINT UPDATE START
-
-ALTER TABLE calculated_field DROP CONSTRAINT IF EXISTS calculated_field_unq_key;
-ALTER TABLE calculated_field ADD CONSTRAINT calculated_field_unq_key UNIQUE (entity_id, type, name);
-
--- CALCULATED FIELD UNIQUE CONSTRAINT UPDATE END
-
--- CALCULATED FIELD OUTPUT STRATEGY UPDATE START
-
-UPDATE calculated_field
-SET configuration = jsonb_set(
- configuration::jsonb,
- '{output}',
- (configuration::jsonb -> 'output')
- || jsonb_build_object(
- 'strategy',
- jsonb_build_object(
- 'type', 'RULE_CHAIN'
- )
- ),
- false
- )
-WHERE (configuration::jsonb -> 'output' -> 'strategy') IS NULL;
-
--- CALCULATED FIELD OUTPUT STRATEGY UPDATE END
-
--- REMOVAL OF CALCULATED FIELD LINKS PERSISTENCE START
-
-DROP TABLE IF EXISTS calculated_field_link;
-ANALYZE calculated_field;
-
--- REMOVAL OF CALCULATED FIELD LINKS PERSISTENCE END
diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java
index 4de50b1ccf..a1d7477a36 100644
--- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java
@@ -425,7 +425,7 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware
try {
cfCtx.init();
} catch (Exception e) {
- throw CalculatedFieldException.builder().ctx(cfCtx).eventEntity(cf.getEntityId()).cause(e).errorMessage("Failed to initialize CF context").build();
+ throw CalculatedFieldException.builder().ctx(cfCtx).eventEntity(cf.getEntityId()).cause(e).errorMessage(e.getMessage()).build();
}
calculatedFields.put(cf.getId(), cfCtx);
// We use copy on write lists to safely pass the reference to another actor for the iteration.
@@ -456,7 +456,7 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware
try {
newCfCtx.init();
} catch (Exception e) {
- throw CalculatedFieldException.builder().ctx(newCfCtx).eventEntity(newCfCtx.getEntityId()).cause(e).errorMessage("Failed to initialize CF context").build();
+ throw CalculatedFieldException.builder().ctx(newCfCtx).eventEntity(newCfCtx.getEntityId()).cause(e).errorMessage(e.getMessage()).build();
} finally {
calculatedFields.put(newCf.getId(), newCfCtx);
List oldCfList = entityIdCalculatedFields.get(newCf.getEntityId());
@@ -819,7 +819,7 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware
try {
cfCtx.init();
} catch (Exception e) {
- throw CalculatedFieldException.builder().ctx(cfCtx).eventEntity(cf.getEntityId()).cause(e).errorMessage("Failed to initialize CF context").build();
+ throw CalculatedFieldException.builder().ctx(cfCtx).eventEntity(cf.getEntityId()).cause(e).errorMessage(e.getMessage()).build();
} finally {
calculatedFields.put(cf.getId(), cfCtx);
// We use copy on write lists to safely pass the reference to another actor for the iteration.
diff --git a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java
index 8ea989fc01..66695c396f 100644
--- a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java
+++ b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java
@@ -116,7 +116,6 @@ public class ThingsboardInstallService {
entityDatabaseSchemaService.createDatabaseIndexes();
// TODO: cleanup update code after each release
- systemDataLoaderService.updateDefaultNotificationConfigs(false);
// Runs upgrade scripts that are not possible in plain SQL.
dataUpdateService.updateData();
diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java
index ab38287b89..5d7107b15e 100644
--- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java
+++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java
@@ -387,7 +387,7 @@ public class CalculatedFieldCtx implements Closeable {
tbelExpressions.put(expression, engine);
} catch (Exception e) {
initialized = false;
- throw new RuntimeException("Failed to init calculated field ctx. Invalid expression syntax.", e);
+ throw new RuntimeException("Failed to initialize CF context. The script expression is invalid. Please check for syntax errors or unsupported functions.", e);
}
}
@@ -404,7 +404,7 @@ public class CalculatedFieldCtx implements Closeable {
simpleExpressions.put(expression, compiledExpression);
} else {
initialized = false;
- throw new RuntimeException("Failed to init calculated field ctx. Invalid expression syntax.");
+ throw new RuntimeException("Failed to initialize CF context. The expression has invalid syntax or unknown variables. Ensure all mathematical operators are correct.");
}
}
@@ -726,6 +726,9 @@ public class CalculatedFieldCtx implements Closeable {
return true;
}
}
+ if (cfType == CalculatedFieldType.PROPAGATION && !propagationArgument.equals(other.propagationArgument)) {
+ return true;
+ }
if (hasGeofencingZoneGroupConfigurationChanges(other)) {
return true;
}
diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java
index d8bcf666f7..468aa80e6c 100644
--- a/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java
+++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultDatabaseSchemaSettingsService.java
@@ -31,7 +31,7 @@ public class DefaultDatabaseSchemaSettingsService implements DatabaseSchemaSetti
// This list should include all versions that are compatible for the upgrade in 4 digits format (like 4.2.0.0, etc.).
// The compatibility cycle usually breaks when we have some scripts written in Java that may not work after a new release.
// TODO: don't check the "patch" number, since upgrade is not required for patch releases
- private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.2.1.0", "4.2.1.1", "4.2.1.2");
+ private static final List SUPPORTED_VERSIONS_FOR_UPGRADE = List.of("4.3.0.0");
private final ProjectInfo projectInfo;
private final JdbcTemplate jdbcTemplate;
diff --git a/common/actor/pom.xml b/common/actor/pom.xml
index bd441e3a58..64727ab3f7 100644
--- a/common/actor/pom.xml
+++ b/common/actor/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/cache/pom.xml b/common/cache/pom.xml
index 7d22f5d3dc..163c47356d 100644
--- a/common/cache/pom.xml
+++ b/common/cache/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/cluster-api/pom.xml b/common/cluster-api/pom.xml
index a7240c8b42..9be12f3b18 100644
--- a/common/cluster-api/pom.xml
+++ b/common/cluster-api/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/coap-server/pom.xml b/common/coap-server/pom.xml
index 3fba2211d5..2e8aca2ba4 100644
--- a/common/coap-server/pom.xml
+++ b/common/coap-server/pom.xml
@@ -22,7 +22,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml
index bcab0249ef..3468f51be0 100644
--- a/common/dao-api/pom.xml
+++ b/common/dao-api/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/data/pom.xml b/common/data/pom.xml
index 43f3a5a38e..ccb0eda1f3 100644
--- a/common/data/pom.xml
+++ b/common/data/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/discovery-api/pom.xml b/common/discovery-api/pom.xml
index 5aa66562ed..9bcf02dd94 100644
--- a/common/discovery-api/pom.xml
+++ b/common/discovery-api/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/edge-api/pom.xml b/common/edge-api/pom.xml
index 507bfc73f8..d52074ace6 100644
--- a/common/edge-api/pom.xml
+++ b/common/edge-api/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/edqs/pom.xml b/common/edqs/pom.xml
index 5512d47b79..b953da6d11 100644
--- a/common/edqs/pom.xml
+++ b/common/edqs/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/message/pom.xml b/common/message/pom.xml
index 1f6bfb20e1..615989da81 100644
--- a/common/message/pom.xml
+++ b/common/message/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/pom.xml b/common/pom.xml
index c0140e733d..211578b1d2 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
common
diff --git a/common/proto/pom.xml b/common/proto/pom.xml
index 27ca58ac0e..f024f41992 100644
--- a/common/proto/pom.xml
+++ b/common/proto/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/queue/pom.xml b/common/queue/pom.xml
index b4fd04ef55..4cb3f449a3 100644
--- a/common/queue/pom.xml
+++ b/common/queue/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/script/pom.xml b/common/script/pom.xml
index 2a5856782e..5f352fb70b 100644
--- a/common/script/pom.xml
+++ b/common/script/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/script/remote-js-client/pom.xml b/common/script/remote-js-client/pom.xml
index 6a50189371..d1c71bbd9d 100644
--- a/common/script/remote-js-client/pom.xml
+++ b/common/script/remote-js-client/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.common
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
script
org.thingsboard.common.script
diff --git a/common/script/script-api/pom.xml b/common/script/script-api/pom.xml
index 38e32661d1..0ba928ebe1 100644
--- a/common/script/script-api/pom.xml
+++ b/common/script/script-api/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.common
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
script
org.thingsboard.common.script
diff --git a/common/stats/pom.xml b/common/stats/pom.xml
index fe35fedaec..d2942cd813 100644
--- a/common/stats/pom.xml
+++ b/common/stats/pom.xml
@@ -22,7 +22,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/transport/coap/pom.xml b/common/transport/coap/pom.xml
index bb8213666f..273e7e2a7d 100644
--- a/common/transport/coap/pom.xml
+++ b/common/transport/coap/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.common
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.common.transport
diff --git a/common/transport/http/pom.xml b/common/transport/http/pom.xml
index d341540104..cd64cc36d2 100644
--- a/common/transport/http/pom.xml
+++ b/common/transport/http/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.common
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.common.transport
diff --git a/common/transport/lwm2m/pom.xml b/common/transport/lwm2m/pom.xml
index cd579c9011..6f61468ed7 100644
--- a/common/transport/lwm2m/pom.xml
+++ b/common/transport/lwm2m/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.common
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.common.transport
diff --git a/common/transport/mqtt/pom.xml b/common/transport/mqtt/pom.xml
index a1e13b9d37..5521d83c13 100644
--- a/common/transport/mqtt/pom.xml
+++ b/common/transport/mqtt/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.common
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.common.transport
diff --git a/common/transport/pom.xml b/common/transport/pom.xml
index 697874ea7e..b1c85d22e3 100644
--- a/common/transport/pom.xml
+++ b/common/transport/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/transport/snmp/pom.xml b/common/transport/snmp/pom.xml
index 011c01a453..eb6ddc4c16 100644
--- a/common/transport/snmp/pom.xml
+++ b/common/transport/snmp/pom.xml
@@ -21,7 +21,7 @@
org.thingsboard.common
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
diff --git a/common/transport/transport-api/pom.xml b/common/transport/transport-api/pom.xml
index 50a0a07b03..26c15a8c9f 100644
--- a/common/transport/transport-api/pom.xml
+++ b/common/transport/transport-api/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.common
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.common.transport
diff --git a/common/util/pom.xml b/common/util/pom.xml
index c540f756a7..96e393dc57 100644
--- a/common/util/pom.xml
+++ b/common/util/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/common/version-control/pom.xml b/common/version-control/pom.xml
index ce7102d3f2..f41fe2b4c0 100644
--- a/common/version-control/pom.xml
+++ b/common/version-control/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
common
org.thingsboard.common
diff --git a/dao/pom.xml b/dao/pom.xml
index 4ec8d13fd0..0b1874919b 100644
--- a/dao/pom.xml
+++ b/dao/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
dao
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeAssetRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeAssetRepository.java
index 7a648cea3c..4775d5d35b 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeAssetRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeAssetRepository.java
@@ -50,7 +50,8 @@ public class DefaultNativeAssetRepository extends AbstractNativeRepository imple
@Override
public PageData findProfileEntityIdInfosByTenantId(UUID tenantId, Pageable pageable) {
String PROFILE_ASSET_ID_INFO_QUERY = String.format("SELECT tenant_id as tenantId, customer_id as customerId, asset_profile_id as profileId, id as id FROM asset WHERE tenant_id = '%s' ORDER BY created_time ASC LIMIT %%s OFFSET %%s", tenantId);
- return find(COUNT_QUERY, PROFILE_ASSET_ID_INFO_QUERY, pageable, DefaultNativeAssetRepository::toInfo);
+ String COUNT_QUERY_BY_TENANT = String.format("SELECT count(id) FROM asset WHERE tenant_id = '%s';", tenantId);
+ return find(COUNT_QUERY_BY_TENANT, PROFILE_ASSET_ID_INFO_QUERY, pageable, DefaultNativeAssetRepository::toInfo);
}
private static ProfileEntityIdInfo toInfo(Map row) {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeDeviceRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeDeviceRepository.java
index 275729f1e9..2a15aee984 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeDeviceRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DefaultNativeDeviceRepository.java
@@ -62,7 +62,8 @@ public class DefaultNativeDeviceRepository extends AbstractNativeRepository impl
@Override
public PageData findProfileEntityIdInfosByTenantId(UUID tenantId, Pageable pageable) {
String PROFILE_DEVICE_ID_INFO_QUERY = String.format("SELECT tenant_id as tenantId, customer_id as customerId, device_profile_id as profileId, id as id FROM device WHERE tenant_id = '%s' ORDER BY created_time ASC LIMIT %%s OFFSET %%s", tenantId);
- return find(COUNT_QUERY, PROFILE_DEVICE_ID_INFO_QUERY, pageable, DefaultNativeDeviceRepository::toInfo);
+ String COUNT_QUERY_BY_TENANT = String.format("SELECT count(id) FROM device WHERE tenant_id = '%s';", tenantId);
+ return find(COUNT_QUERY_BY_TENANT, PROFILE_DEVICE_ID_INFO_QUERY, pageable, DefaultNativeDeviceRepository::toInfo);
}
private static ProfileEntityIdInfo toInfo(Map row) {
diff --git a/edqs/pom.xml b/edqs/pom.xml
index 25c6125d82..57b843bfb9 100644
--- a/edqs/pom.xml
+++ b/edqs/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
edqs
diff --git a/monitoring/pom.xml b/monitoring/pom.xml
index a1addced5d..23c857204c 100644
--- a/monitoring/pom.xml
+++ b/monitoring/pom.xml
@@ -21,7 +21,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
diff --git a/msa/black-box-tests/pom.xml b/msa/black-box-tests/pom.xml
index 425948ae43..6f59dd3a3d 100644
--- a/msa/black-box-tests/pom.xml
+++ b/msa/black-box-tests/pom.xml
@@ -21,7 +21,7 @@
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
org.thingsboard.msa
diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractContainerTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractContainerTest.java
index ebf90bb7f0..ec1bdcf658 100644
--- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractContainerTest.java
+++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractContainerTest.java
@@ -44,7 +44,6 @@ import java.util.Map;
import java.util.Random;
import java.util.function.Consumer;
-
@Slf4j
@Listeners(TestListener.class)
public abstract class AbstractContainerTest {
@@ -170,19 +169,14 @@ public abstract class AbstractContainerTest {
DeviceProfileProvisionConfiguration provisionConfiguration;
String testProvisionDeviceKey = TEST_PROVISION_DEVICE_KEY;
deviceProfile.setProvisionType(provisionType);
- switch(provisionType) {
- case ALLOW_CREATE_NEW_DEVICES:
- provisionConfiguration = new AllowCreateNewDevicesDeviceProfileProvisionConfiguration(TEST_PROVISION_DEVICE_SECRET);
- break;
- case CHECK_PRE_PROVISIONED_DEVICES:
- provisionConfiguration = new CheckPreProvisionedDevicesDeviceProfileProvisionConfiguration(TEST_PROVISION_DEVICE_SECRET);
- break;
- default:
- case DISABLED:
+ provisionConfiguration = switch (provisionType) {
+ case ALLOW_CREATE_NEW_DEVICES -> new AllowCreateNewDevicesDeviceProfileProvisionConfiguration(TEST_PROVISION_DEVICE_SECRET);
+ case CHECK_PRE_PROVISIONED_DEVICES -> new CheckPreProvisionedDevicesDeviceProfileProvisionConfiguration(TEST_PROVISION_DEVICE_SECRET);
+ default -> {
testProvisionDeviceKey = null;
- provisionConfiguration = new DisabledDeviceProfileProvisionConfiguration(null);
- break;
- }
+ yield new DisabledDeviceProfileProvisionConfiguration(null);
+ }
+ };
DeviceProfileData deviceProfileData = deviceProfile.getProfileData();
deviceProfileData.setProvisionConfiguration(provisionConfiguration);
deviceProfile.setProfileData(deviceProfileData);
diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/JavaRestClientTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/JavaRestClientTest.java
index c9ebfad3e2..24e7e78039 100644
--- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/JavaRestClientTest.java
+++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/JavaRestClientTest.java
@@ -16,6 +16,7 @@
package org.thingsboard.server.msa.connectivity;
import com.google.gson.JsonObject;
+import org.apache.commons.lang3.RandomStringUtils;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
@@ -26,7 +27,6 @@ import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
import org.apache.hc.core5.ssl.SSLContexts;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
-import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
@@ -34,6 +34,10 @@ import org.testng.annotations.Test;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rest.client.RestClient;
import org.thingsboard.server.common.data.Device;
+import org.thingsboard.server.common.data.DeviceProfile;
+import org.thingsboard.server.common.data.DeviceProfileInfo;
+import org.thingsboard.server.common.data.DeviceProfileType;
+import org.thingsboard.server.common.data.DeviceTransportType;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.User;
@@ -41,6 +45,11 @@ import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.alarm.AlarmInfo;
import org.thingsboard.server.common.data.alarm.AlarmSearchStatus;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
+import org.thingsboard.server.common.data.asset.AssetProfile;
+import org.thingsboard.server.common.data.asset.AssetProfileInfo;
+import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileConfiguration;
+import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileTransportConfiguration;
+import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
import org.thingsboard.server.common.data.domain.Domain;
import org.thingsboard.server.common.data.domain.DomainInfo;
import org.thingsboard.server.common.data.id.NotificationTargetId;
@@ -94,6 +103,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -109,8 +119,10 @@ public class JavaRestClientTest extends AbstractContainerTest {
public static final String DEFAULT_NOTIFICATION_SUBJECT = "Just a test";
public static final NotificationType DEFAULT_NOTIFICATION_TYPE = NotificationType.GENERAL;
private RestClient restClient;
- private Tenant tenant;
- private User user;
+ private Tenant tenant1;
+ private Tenant tenant2;
+ private User tenantAdmin1;
+ private User tenantAdmin2;
@BeforeClass
public void beforeClass() throws Exception {
@@ -140,31 +152,45 @@ public class JavaRestClientTest extends AbstractContainerTest {
public void setUp() throws Exception {
restClient.login("sysadmin@thingsboard.org", "sysadmin");
- // create tenant and tenant admin
- tenant = new Tenant();
- tenant.setTitle("Java Rest Client Test Tenant " + RandomStringUtils.randomAlphabetic(5));
- tenant = restClient.saveTenant(tenant);
+ // create tenant 1 and tenant admin 1
+ tenant1 = new Tenant();
+ tenant1.setTitle("Java Rest Client Test Tenant " + RandomStringUtils.insecure().randomAlphabetic(5));
+ tenant1 = restClient.saveTenant(tenant1);
- String email = RandomStringUtils.randomAlphabetic(5) + "@gmail.com";
- user = restClient.saveUser(defaultTenantAdmin(tenant.getId(), email), false);
- restClient.activateUser(user.getId(), "password123", false);
- restClient.login(email, "password123");
+ String email1 = RandomStringUtils.insecure().randomAlphabetic(5) + "@gmail.com";
+ tenantAdmin1 = restClient.saveUser(defaultTenantAdmin(tenant1.getId(), email1), false);
+ restClient.activateUser(tenantAdmin1.getId(), "password123", false);
+
+ // create tenant 2 and tenant admin 2
+ tenant2 = new Tenant();
+ tenant2.setTitle("Java Rest Client Test Tenant " + RandomStringUtils.insecure().randomAlphabetic(5));
+ tenant2 = restClient.saveTenant(tenant2);
+
+ String email2 = RandomStringUtils.insecure().randomAlphabetic(5) + "@gmail.com";
+ tenantAdmin2 = restClient.saveUser(defaultTenantAdmin(tenant2.getId(), email2), false);
+ restClient.activateUser(tenantAdmin2.getId(), "password123", false);
+
+ // tenant 1 tenant admin by default
+ restClient.login(tenantAdmin1.getEmail(), "password123");
}
@AfterMethod
public void tearDown() {
restClient.login("sysadmin@thingsboard.org", "sysadmin");
- if (tenant != null) {
- restClient.deleteTenant(tenant.getId());
+ if (tenant1 != null) {
+ restClient.deleteTenant(tenant1.getId());
+ }
+ if (tenant2 != null) {
+ restClient.deleteTenant(tenant2.getId());
}
}
@Test
public void testGetAlarmsV2() {
- Device device = restClient.saveDevice(defaultDevicePrototype(RandomStringUtils.randomAlphabetic(5)));
+ Device device = restClient.saveDevice(defaultDevicePrototype(RandomStringUtils.insecure().randomAlphabetic(5)));
assertThat(device).isNotNull();
- String type = "High temp" + RandomStringUtils.randomAlphabetic(5);
+ String type = "High temp" + RandomStringUtils.insecure().randomAlphabetic(5);
Alarm alarm = Alarm.builder()
.originator(device.getId())
.severity(AlarmSeverity.CRITICAL)
@@ -202,7 +228,7 @@ public class JavaRestClientTest extends AbstractContainerTest {
@Test
public void testTimeSeriesByReadTsKvQueries() {
- Device device = restClient.saveDevice(defaultDevicePrototype(RandomStringUtils.randomAlphabetic(5)));
+ Device device = restClient.saveDevice(defaultDevicePrototype(RandomStringUtils.insecure().randomAlphabetic(5)));
assertThat(device).isNotNull();
DeviceCredentials deviceCredentials = restClient.getDeviceCredentialsByDeviceId(device.getId()).get();
@@ -230,7 +256,7 @@ public class JavaRestClientTest extends AbstractContainerTest {
@Test
public void testFindNotifications() {
- NotificationTarget notificationTarget = createNotificationTarget(user.getId());
+ NotificationTarget notificationTarget = createNotificationTarget(tenantAdmin1.getId());
String notificationText1 = "Notification 1";
NotificationTemplate notificationTemplate = createNotificationTemplate(DEFAULT_NOTIFICATION_TYPE, DEFAULT_NOTIFICATION_SUBJECT, notificationText1, new NotificationDeliveryMethod[]{WEB});
NotificationRequest notificationRequest = submitNotificationRequest(notificationTarget.getId(), notificationTemplate.getId());
@@ -248,7 +274,7 @@ public class JavaRestClientTest extends AbstractContainerTest {
NotificationRequestPreview requestPreview = restClient.getNotificationRequestPreview(notificationRequest, 10);
assertThat(requestPreview.getTotalRecipientsCount()).isEqualTo(1);
- assertThat(requestPreview.getRecipientsPreview()).isEqualTo(List.of(user.getEmail()));
+ assertThat(requestPreview.getRecipientsPreview()).isEqualTo(List.of(tenantAdmin1.getEmail()));
PageData notifications = restClient.getNotifications(false, WEB, new PageLink(30));
assertThat(notifications.getTotalElements()).isEqualTo(2);
@@ -316,7 +342,7 @@ public class JavaRestClientTest extends AbstractContainerTest {
restClient.login("sysadmin@thingsboard.org", "sysadmin");
Domain domain = new Domain();
- String prefix = RandomStringUtils.randomAlphabetic(5).toLowerCase();
+ String prefix = RandomStringUtils.insecure().randomAlphabetic(5).toLowerCase();
domain.setName(prefix + ".test.com");
Domain savedDomain = restClient.saveDomain(domain);
assertThat(savedDomain.getName()).isEqualTo(domain.getName());
@@ -330,10 +356,10 @@ public class JavaRestClientTest extends AbstractContainerTest {
restClient.login("sysadmin@thingsboard.org", "sysadmin");
MobileApp mobileApp = new MobileApp();
- String prefix = RandomStringUtils.randomAlphabetic(5).toLowerCase();
+ String prefix = RandomStringUtils.insecure().randomAlphabetic(5).toLowerCase();
mobileApp.setPkgName(prefix + "test.app.apple");
mobileApp.setPlatformType(PlatformType.ANDROID);
- mobileApp.setAppSecret(RandomStringUtils.randomAlphabetic(20));
+ mobileApp.setAppSecret(RandomStringUtils.insecure().randomAlphabetic(20));
mobileApp.setStatus(MobileAppStatus.DRAFT);
MobileApp savedMobileApp = restClient.saveMobileApp(mobileApp);
@@ -343,7 +369,7 @@ public class JavaRestClientTest extends AbstractContainerTest {
assertThat(retrieved.getData()).hasSize(1);
MobileAppBundle mobileAppBundle = new MobileAppBundle();
- String bundlePrefix = RandomStringUtils.randomAlphabetic(5).toLowerCase();
+ String bundlePrefix = RandomStringUtils.insecure().randomAlphabetic(5).toLowerCase();
mobileAppBundle.setTitle(bundlePrefix + "Test Bundle");
mobileAppBundle.setAndroidAppId(savedMobileApp.getId());
@@ -357,7 +383,7 @@ public class JavaRestClientTest extends AbstractContainerTest {
filter.setUsersIds(Arrays.stream(usersIds).map(UUIDBased::getId).toList());
NotificationTarget notificationTarget = new NotificationTarget();
- notificationTarget.setName(filter + RandomStringUtils.randomNumeric(5));
+ notificationTarget.setName(filter + RandomStringUtils.insecure().randomNumeric(5));
PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig();
targetConfig.setUsersFilter(filter);
notificationTarget.setConfiguration(targetConfig);
@@ -367,7 +393,7 @@ public class JavaRestClientTest extends AbstractContainerTest {
private NotificationTemplate createNotificationTemplate(NotificationType notificationType, String subject,
String text, NotificationDeliveryMethod... deliveryMethods) {
NotificationTemplate notificationTemplate = new NotificationTemplate();
- notificationTemplate.setName("Notification template: " + RandomStringUtils.randomAlphabetic(5));
+ notificationTemplate.setName("Notification template: " + RandomStringUtils.insecure().randomAlphabetic(5));
notificationTemplate.setNotificationType(notificationType);
NotificationTemplateConfig config = new NotificationTemplateConfig();
config.setDeliveryMethodsTemplates(new HashMap<>());
@@ -418,9 +444,9 @@ public class JavaRestClientTest extends AbstractContainerTest {
public void testApiKeyOperations() {
// Create an API key
ApiKeyInfo apiKeyInfo = new ApiKeyInfo();
- apiKeyInfo.setDescription("Test API Key " + RandomStringUtils.randomAlphabetic(5));
+ apiKeyInfo.setDescription("Test API Key " + RandomStringUtils.insecure().randomAlphabetic(5));
apiKeyInfo.setEnabled(true);
- apiKeyInfo.setUserId(user.getId());
+ apiKeyInfo.setUserId(tenantAdmin1.getId());
apiKeyInfo.setExpirationTime(0);
ApiKey savedApiKey = restClient.saveApiKey(apiKeyInfo);
@@ -428,18 +454,18 @@ public class JavaRestClientTest extends AbstractContainerTest {
assertThat(savedApiKey.getId()).isNotNull();
assertThat(savedApiKey.getDescription()).isEqualTo(apiKeyInfo.getDescription());
assertThat(savedApiKey.isEnabled()).isTrue();
- assertThat(savedApiKey.getUserId()).isEqualTo(user.getId());
- assertThat(savedApiKey.getTenantId()).isEqualTo(tenant.getId());
+ assertThat(savedApiKey.getUserId()).isEqualTo(tenantAdmin1.getId());
+ assertThat(savedApiKey.getTenantId()).isEqualTo(tenant1.getId());
assertThat(savedApiKey.getValue()).isNotNull();
// Get user API keys
- PageData apiKeys = restClient.getUserApiKeys(user.getId(), new PageLink(10));
+ PageData apiKeys = restClient.getUserApiKeys(tenantAdmin1.getId(), new PageLink(10));
assertThat(apiKeys).isNotNull();
assertThat(apiKeys.getData()).hasSize(1);
assertThat(apiKeys.getData().get(0).getId()).isEqualTo(savedApiKey.getId());
// Update API key description
- String updatedDescription = "Updated description " + RandomStringUtils.randomAlphabetic(5);
+ String updatedDescription = "Updated description " + RandomStringUtils.insecure().randomAlphabetic(5);
ApiKeyInfo updatedApiKeyInfo = restClient.updateApiKeyDescription(savedApiKey.getId(), updatedDescription);
assertThat(updatedApiKeyInfo).isNotNull();
assertThat(updatedApiKeyInfo.getDescription()).isEqualTo(updatedDescription);
@@ -458,8 +484,96 @@ public class JavaRestClientTest extends AbstractContainerTest {
restClient.deleteApiKey(savedApiKey.getId());
// Verify the API key is deleted
- PageData apiKeysAfterDelete = restClient.getUserApiKeys(user.getId(), new PageLink(10));
+ PageData apiKeysAfterDelete = restClient.getUserApiKeys(tenantAdmin1.getId(), new PageLink(10));
assertThat(apiKeysAfterDelete.getData()).isEmpty();
}
+ @Test
+ public void testGetDeviceProfileInfosByIds() {
+ var profileData = new DeviceProfileData();
+ profileData.setConfiguration(new DefaultDeviceProfileConfiguration());
+ profileData.setTransportConfiguration(new DefaultDeviceProfileTransportConfiguration());
+
+ // Create a device profile in tenant1 (current tenant)
+ var deviceProfile1 = new DeviceProfile();
+ deviceProfile1.setTenantId(tenant1.getId());
+ deviceProfile1.setName("Device Profile 1");
+ deviceProfile1.setType(DeviceProfileType.DEFAULT);
+ deviceProfile1.setTransportType(DeviceTransportType.DEFAULT);
+ deviceProfile1.setProfileData(profileData);
+ deviceProfile1 = restClient.saveDeviceProfile(deviceProfile1);
+
+ var deviceProfile2 = new DeviceProfile();
+ deviceProfile2.setTenantId(tenant1.getId());
+ deviceProfile2.setName("Device Profile 2");
+ deviceProfile2.setType(DeviceProfileType.DEFAULT);
+ deviceProfile2.setTransportType(DeviceTransportType.DEFAULT);
+ deviceProfile2.setProfileData(profileData);
+ deviceProfile2 = restClient.saveDeviceProfile(deviceProfile2);
+
+ // Create two more device profiles in tenant2 (different tenant)
+ restClient.login(tenantAdmin2.getEmail(), "password123");
+
+ var deviceProfile3 = new DeviceProfile();
+ deviceProfile3.setTenantId(tenant2.getId());
+ deviceProfile3.setName("Device Profile 3");
+ deviceProfile3.setType(DeviceProfileType.DEFAULT);
+ deviceProfile3.setTransportType(DeviceTransportType.DEFAULT);
+ deviceProfile3.setProfileData(profileData);
+ deviceProfile3 = restClient.saveDeviceProfile(deviceProfile3);
+
+ var deviceProfile4 = new DeviceProfile();
+ deviceProfile4.setTenantId(tenant2.getId());
+ deviceProfile4.setName("Device Profile 4");
+ deviceProfile4.setType(DeviceProfileType.DEFAULT);
+ deviceProfile4.setTransportType(DeviceTransportType.DEFAULT);
+ deviceProfile4.setProfileData(profileData);
+ deviceProfile4 = restClient.saveDeviceProfile(deviceProfile4);
+
+ // Attempt to fetch profiles 1 and 3 while acting as Tenant 2.
+ // - Profile 1: Filtered out because it belongs to a different tenant.
+ // - Profile 2: Filtered out because it belongs to a different tenant and was not requested.
+ // - Profile 3: Should be returned.
+ // - Profile 4: Filtered out; it belongs to the correct tenant, but was not requested by ID.
+ List profiles = restClient.getDeviceProfileInfosByIds(Set.of(deviceProfile1.getUuidId(), deviceProfile3.getUuidId()));
+ assertThat(profiles).hasSize(1);
+ assertThat(profiles.get(0).getId()).isEqualTo(deviceProfile3.getId());
+ }
+
+ @Test
+ public void testGetAssetProfilesByIds() {
+ // Create two asset profiles in tenant1 (current tenant)
+ var assetProfile1 = new AssetProfile();
+ assetProfile1.setTenantId(tenant1.getId());
+ assetProfile1.setName("Asset Profile 1");
+ assetProfile1 = restClient.saveAssetProfile(assetProfile1);
+
+ var assetProfile2 = new AssetProfile();
+ assetProfile2.setTenantId(tenant1.getId());
+ assetProfile2.setName("Asset Profile 2");
+ assetProfile2 = restClient.saveAssetProfile(assetProfile2);
+
+ // Create two more asset profiles in tenant2 (different tenant)
+ restClient.login(tenantAdmin2.getEmail(), "password123");
+
+ var assetProfile3 = new AssetProfile();
+ assetProfile3.setTenantId(tenant2.getId());
+ assetProfile3.setName("Asset Profile 3");
+ assetProfile3 = restClient.saveAssetProfile(assetProfile3);
+
+ var assetProfile4 = new AssetProfile();
+ assetProfile4.setTenantId(tenant2.getId());
+ assetProfile4.setName("Asset Profile 4");
+ assetProfile4 = restClient.saveAssetProfile(assetProfile4);
+
+ // Attempt to fetch profiles 1 and 3 while acting as Tenant 2.
+ // - Profile 1: Filtered out because it belongs to a different tenant.
+ // - Profile 2: Filtered out because it belongs to a different tenant and was not requested.
+ // - Profile 3: Should be returned.
+ // - Profile 4: Filtered out; it belongs to the correct tenant, but was not requested by ID.
+ List profiles = restClient.getAssetProfilesByIds(Set.of(assetProfile1.getUuidId(), assetProfile3.getUuidId()));
+ assertThat(profiles).hasSize(1);
+ assertThat(profiles.get(0).getId()).isEqualTo(assetProfile3.getId());
+ }
+
}
diff --git a/msa/edqs/pom.xml b/msa/edqs/pom.xml
index 8de67e23b3..2082f134b0 100644
--- a/msa/edqs/pom.xml
+++ b/msa/edqs/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
org.thingsboard.msa
diff --git a/msa/js-executor/package.json b/msa/js-executor/package.json
index df1d327c1b..7d4d858f22 100644
--- a/msa/js-executor/package.json
+++ b/msa/js-executor/package.json
@@ -1,7 +1,7 @@
{
"name": "thingsboard-js-executor",
"private": true,
- "version": "4.3.0",
+ "version": "4.3.0.1",
"description": "ThingsBoard JavaScript Executor Microservice",
"main": "server.ts",
"bin": "server.js",
diff --git a/msa/js-executor/pom.xml b/msa/js-executor/pom.xml
index 6bd15adc43..31ea60943d 100644
--- a/msa/js-executor/pom.xml
+++ b/msa/js-executor/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
org.thingsboard.msa
diff --git a/msa/monitoring/pom.xml b/msa/monitoring/pom.xml
index fb10c11ec0..188f1f8bb2 100644
--- a/msa/monitoring/pom.xml
+++ b/msa/monitoring/pom.xml
@@ -22,7 +22,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
diff --git a/msa/pom.xml b/msa/pom.xml
index b5c40015f7..c03701ca93 100644
--- a/msa/pom.xml
+++ b/msa/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
msa
diff --git a/msa/tb-node/pom.xml b/msa/tb-node/pom.xml
index 078f2e1756..d6f08dd6f7 100644
--- a/msa/tb-node/pom.xml
+++ b/msa/tb-node/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
org.thingsboard.msa
diff --git a/msa/tb/pom.xml b/msa/tb/pom.xml
index 8825ea7e33..f9449f97ce 100644
--- a/msa/tb/pom.xml
+++ b/msa/tb/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
org.thingsboard.msa
diff --git a/msa/transport/coap/pom.xml b/msa/transport/coap/pom.xml
index 9222a95ec2..9809bc2b1e 100644
--- a/msa/transport/coap/pom.xml
+++ b/msa/transport/coap/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.msa
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.msa.transport
diff --git a/msa/transport/http/pom.xml b/msa/transport/http/pom.xml
index 4ecf529b2c..9ec5f75cd0 100644
--- a/msa/transport/http/pom.xml
+++ b/msa/transport/http/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.msa
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.msa.transport
diff --git a/msa/transport/lwm2m/pom.xml b/msa/transport/lwm2m/pom.xml
index 9aec571309..a43ef587b9 100644
--- a/msa/transport/lwm2m/pom.xml
+++ b/msa/transport/lwm2m/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.msa
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.msa.transport
diff --git a/msa/transport/mqtt/pom.xml b/msa/transport/mqtt/pom.xml
index 2ad9d62c9d..75e8da0d74 100644
--- a/msa/transport/mqtt/pom.xml
+++ b/msa/transport/mqtt/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard.msa
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.msa.transport
diff --git a/msa/transport/pom.xml b/msa/transport/pom.xml
index f26c27cb4b..60aa6e123f 100644
--- a/msa/transport/pom.xml
+++ b/msa/transport/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
org.thingsboard.msa
diff --git a/msa/transport/snmp/pom.xml b/msa/transport/snmp/pom.xml
index a6bb9ebc8f..fb28fbba16 100644
--- a/msa/transport/snmp/pom.xml
+++ b/msa/transport/snmp/pom.xml
@@ -21,7 +21,7 @@
org.thingsboard.msa
transport
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
org.thingsboard.msa.transport
diff --git a/msa/vc-executor-docker/pom.xml b/msa/vc-executor-docker/pom.xml
index a740f99743..285761d35a 100644
--- a/msa/vc-executor-docker/pom.xml
+++ b/msa/vc-executor-docker/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
org.thingsboard.msa
diff --git a/msa/vc-executor/pom.xml b/msa/vc-executor/pom.xml
index cb71d86ef4..1fbe33abaf 100644
--- a/msa/vc-executor/pom.xml
+++ b/msa/vc-executor/pom.xml
@@ -21,7 +21,7 @@
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
org.thingsboard.msa
diff --git a/msa/web-ui/package.json b/msa/web-ui/package.json
index 0c22a38465..13d040b836 100644
--- a/msa/web-ui/package.json
+++ b/msa/web-ui/package.json
@@ -1,7 +1,7 @@
{
"name": "thingsboard-web-ui",
"private": true,
- "version": "4.3.0",
+ "version": "4.3.0.1",
"description": "ThingsBoard Web UI Microservice",
"main": "server.ts",
"bin": "server.js",
diff --git a/msa/web-ui/pom.xml b/msa/web-ui/pom.xml
index 40059304ba..0a84e52620 100644
--- a/msa/web-ui/pom.xml
+++ b/msa/web-ui/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
msa
org.thingsboard.msa
diff --git a/netty-mqtt/pom.xml b/netty-mqtt/pom.xml
index 4ea598d363..c7c077ef38 100644
--- a/netty-mqtt/pom.xml
+++ b/netty-mqtt/pom.xml
@@ -19,11 +19,11 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
netty-mqtt
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
jar
Netty MQTT Client
diff --git a/pom.xml b/pom.xml
index 92a002cde0..353c295038 100755
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
pom
Thingsboard
diff --git a/rest-client/pom.xml b/rest-client/pom.xml
index 1b33aca512..a63cca91fd 100644
--- a/rest-client/pom.xml
+++ b/rest-client/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
rest-client
@@ -51,6 +51,10 @@
com.auth0
java-jwt
+
+ org.apache.httpcomponents.core5
+ httpcore5
+
diff --git a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java
index bd1d7b05c3..6c97a23a90 100644
--- a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java
+++ b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java
@@ -23,6 +23,7 @@ import lombok.Getter;
import lombok.SneakyThrows;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.concurrent.LazyInitializer;
+import org.apache.hc.core5.net.URIBuilder;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
@@ -157,11 +158,11 @@ import org.thingsboard.server.common.data.oauth2.PlatformType;
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
import org.thingsboard.server.common.data.ota.OtaPackageType;
import org.thingsboard.server.common.data.page.PageData;
-import org.thingsboard.server.common.data.pat.ApiKey;
-import org.thingsboard.server.common.data.pat.ApiKeyInfo;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.page.SortOrder;
import org.thingsboard.server.common.data.page.TimePageLink;
+import org.thingsboard.server.common.data.pat.ApiKey;
+import org.thingsboard.server.common.data.pat.ApiKeyInfo;
import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.data.query.AlarmCountQuery;
@@ -210,17 +211,21 @@ import org.thingsboard.server.common.data.widget.WidgetsBundle;
import java.io.Closeable;
import java.io.IOException;
import java.net.URI;
+import java.net.URISyntaxException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
+import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
+import static java.util.stream.Collectors.joining;
import static org.thingsboard.server.common.data.StringUtils.isEmpty;
public class RestClient implements Closeable {
@@ -1588,6 +1593,33 @@ public class RestClient implements Closeable {
}, activeOnly).getBody();
}
+ public List getDeviceProfileInfosByIds(Set ids) {
+ URIBuilder builder;
+ try {
+ builder = new URIBuilder(baseURL);
+ } catch (URISyntaxException e) {
+ throw new IllegalArgumentException("Invalid base URL: " + baseURL, e);
+ }
+
+ builder.appendPath("/api/deviceProfileInfos");
+
+ String commaSeparatedIds = ids.stream()
+ .filter(Objects::nonNull)
+ .map(UUID::toString)
+ .collect(joining(","));
+
+ builder.addParameter("deviceProfileIds", commaSeparatedIds);
+
+ URI uri;
+ try {
+ uri = builder.build();
+ } catch (URISyntaxException e) {
+ throw new IllegalStateException("Failed to construct API URI from base URL and provided params", e);
+ }
+
+ return restTemplate.exchange(uri, HttpMethod.GET, null, new ParameterizedTypeReference>() {}).getBody();
+ }
+
public JsonNode claimDevice(String deviceName, ClaimRequest claimRequest) {
return restTemplate.exchange(
baseURL + "/api/customer/device/{deviceName}/claim",
@@ -1824,6 +1856,33 @@ public class RestClient implements Closeable {
}, params).getBody();
}
+ public List getAssetProfilesByIds(Set ids) {
+ URIBuilder builder;
+ try {
+ builder = new URIBuilder(baseURL);
+ } catch (URISyntaxException e) {
+ throw new IllegalArgumentException("Invalid base URL: " + baseURL, e);
+ }
+
+ builder.appendPath("/api/assetProfileInfos");
+
+ String commaSeparatedIds = ids.stream()
+ .filter(Objects::nonNull)
+ .map(UUID::toString)
+ .collect(joining(","));
+
+ builder.addParameter("assetProfileIds", commaSeparatedIds);
+
+ URI uri;
+ try {
+ uri = builder.build();
+ } catch (URISyntaxException e) {
+ throw new IllegalStateException("Failed to construct API URI from base URL and provided params", e);
+ }
+
+ return restTemplate.exchange(uri, HttpMethod.GET, null, new ParameterizedTypeReference>() {}).getBody();
+ }
+
public Long countEntitiesByQuery(EntityCountQuery query) {
return restTemplate.postForObject(baseURL + "/api/entitiesQuery/count", query, Long.class);
}
diff --git a/rule-engine/pom.xml b/rule-engine/pom.xml
index feb8cbf8f1..a03695f64f 100644
--- a/rule-engine/pom.xml
+++ b/rule-engine/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
rule-engine
diff --git a/rule-engine/rule-engine-api/pom.xml b/rule-engine/rule-engine-api/pom.xml
index 7523afc0b6..07719631be 100644
--- a/rule-engine/rule-engine-api/pom.xml
+++ b/rule-engine/rule-engine-api/pom.xml
@@ -22,7 +22,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
rule-engine
org.thingsboard.rule-engine
diff --git a/rule-engine/rule-engine-components/pom.xml b/rule-engine/rule-engine-components/pom.xml
index f9218b69de..97f2ad65b1 100644
--- a/rule-engine/rule-engine-components/pom.xml
+++ b/rule-engine/rule-engine-components/pom.xml
@@ -22,7 +22,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
rule-engine
org.thingsboard.rule-engine
diff --git a/tools/pom.xml b/tools/pom.xml
index 20c8fc95fc..4d94ff81df 100644
--- a/tools/pom.xml
+++ b/tools/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
tools
diff --git a/transport/coap/pom.xml b/transport/coap/pom.xml
index ded25e8260..d9b28c7a5e 100644
--- a/transport/coap/pom.xml
+++ b/transport/coap/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.transport
diff --git a/transport/http/pom.xml b/transport/http/pom.xml
index 2c83bebd0a..a5d093e726 100644
--- a/transport/http/pom.xml
+++ b/transport/http/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.transport
diff --git a/transport/lwm2m/pom.xml b/transport/lwm2m/pom.xml
index e28fd452cf..5e744d7fca 100644
--- a/transport/lwm2m/pom.xml
+++ b/transport/lwm2m/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.transport
diff --git a/transport/mqtt/pom.xml b/transport/mqtt/pom.xml
index 2bee6f94e4..c53b606704 100644
--- a/transport/mqtt/pom.xml
+++ b/transport/mqtt/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
org.thingsboard.transport
diff --git a/transport/pom.xml b/transport/pom.xml
index 89c0355407..83c0fccd83 100644
--- a/transport/pom.xml
+++ b/transport/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
transport
diff --git a/transport/snmp/pom.xml b/transport/snmp/pom.xml
index 38682ade69..39f72755e5 100644
--- a/transport/snmp/pom.xml
+++ b/transport/snmp/pom.xml
@@ -21,7 +21,7 @@
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
transport
diff --git a/ui-ngx/package.json b/ui-ngx/package.json
index 3403e7a3aa..329f249912 100644
--- a/ui-ngx/package.json
+++ b/ui-ngx/package.json
@@ -1,6 +1,6 @@
{
"name": "thingsboard",
- "version": "4.3.0",
+ "version": "4.3.0.1",
"scripts": {
"ng": "ng",
"start": "node --max_old_space_size=8048 ./node_modules/@angular/cli/bin/ng serve --configuration development --host 0.0.0.0 --open",
diff --git a/ui-ngx/pom.xml b/ui-ngx/pom.xml
index bc0f5a4ed8..eaca4ec83c 100644
--- a/ui-ngx/pom.xml
+++ b/ui-ngx/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.3.0-RC
+ 4.3.0.1-SNAPSHOT
thingsboard
org.thingsboard