Browse Source

Merge branch 'rc' into feature/add_show_total_legend_setting_to_latest-chart-widgets

pull/13350/head
Paolo Cristiani 1 year ago
committed by GitHub
parent
commit
0d9aa9c3e1
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java
  2. 2
      application/src/test/java/org/thingsboard/server/service/job/JobManagerTest.java
  3. 2
      application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java
  4. 10
      common/actor/src/main/java/org/thingsboard/server/actors/TbActorMailbox.java
  5. 6
      common/data/src/main/java/org/thingsboard/server/common/data/AdminSettings.java
  6. 8
      common/data/src/main/java/org/thingsboard/server/common/data/BaseData.java
  7. 4
      common/data/src/main/java/org/thingsboard/server/common/data/Dashboard.java
  8. 12
      common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleNode.java
  9. 20
      common/data/src/main/java/org/thingsboard/server/common/data/settings/UserSettings.java
  10. 4
      common/data/src/main/java/org/thingsboard/server/common/data/widget/WidgetType.java
  11. 2
      common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/config/ssl/KeystoreSslCredentials.java
  12. 4
      common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/config/ssl/PemSslCredentials.java
  13. 44
      rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java

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

@ -219,7 +219,7 @@ public abstract class BaseEdgeProcessor implements EdgeProcessor {
case CREDENTIALS_UPDATED: case CREDENTIALS_UPDATED:
case ASSIGNED_TO_CUSTOMER: case ASSIGNED_TO_CUSTOMER:
case UNASSIGNED_FROM_CUSTOMER: case UNASSIGNED_FROM_CUSTOMER:
if (edgeId != null) { if (edgeId != null && !edgeId.equals(originatorEdgeId)) {
return saveEdgeEvent(tenantId, edgeId, type, actionType, entityId, body); return saveEdgeEvent(tenantId, edgeId, type, actionType, entityId, body);
} else { } else {
return processNotificationToRelatedEdges(tenantId, entityId, type, actionType, originatorEdgeId); return processNotificationToRelatedEdges(tenantId, entityId, type, actionType, originatorEdgeId);

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

@ -165,7 +165,7 @@ public class JobManagerTest extends AbstractControllerTest {
await().atMost(TIMEOUT, TimeUnit.SECONDS).untilAsserted(() -> { await().atMost(TIMEOUT, TimeUnit.SECONDS).untilAsserted(() -> {
Job job = findJobById(jobId); Job job = findJobById(jobId);
assertThat(job.getStatus()).isEqualTo(JobStatus.CANCELLED); assertThat(job.getStatus()).isEqualTo(JobStatus.CANCELLED);
assertThat(job.getResult().getDiscardedCount()).isBetween(1, tasksCount - 1); assertThat(job.getResult().getDiscardedCount()).isBetween(1, tasksCount);
assertThat(job.getResult().getTotalCount()).isEqualTo(tasksCount); assertThat(job.getResult().getTotalCount()).isEqualTo(tasksCount);
assertThat(job.getResult().getCompletedCount()).isEqualTo(tasksCount); assertThat(job.getResult().getCompletedCount()).isEqualTo(tasksCount);
}); });

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

@ -467,7 +467,7 @@ public class TbRuleEngineQueueConsumerManagerTest {
consumerManager.delete(true); consumerManager.delete(true);
await().atMost(2, TimeUnit.SECONDS) await().atMost(5, TimeUnit.SECONDS)
.untilAsserted(() -> { .untilAsserted(() -> {
verify(ruleEngineMsgProducer).send(any(), any(), any()); verify(ruleEngineMsgProducer).send(any(), any(), any());
}); });

10
common/actor/src/main/java/org/thingsboard/server/actors/TbActorMailbox.java

@ -237,8 +237,14 @@ public final class TbActorMailbox implements TbActorCtx {
try { try {
ready.set(NOT_READY); ready.set(NOT_READY);
actor.destroy(stopReason, cause); actor.destroy(stopReason, cause);
highPriorityMsgs.forEach(msg -> msg.onTbActorStopped(stopReason)); highPriorityMsgs.removeIf(msg -> {
normalPriorityMsgs.forEach(msg -> msg.onTbActorStopped(stopReason)); msg.onTbActorStopped(stopReason);
return true;
});
normalPriorityMsgs.removeIf(msg -> {
msg.onTbActorStopped(stopReason);
return true;
});
} catch (Throwable t) { } catch (Throwable t) {
log.warn("[{}] Failed to destroy actor: ", selfId, t); log.warn("[{}] Failed to destroy actor: ", selfId, t);
} }

6
common/data/src/main/java/org/thingsboard/server/common/data/AdminSettings.java

@ -32,8 +32,8 @@ public class AdminSettings extends BaseData<AdminSettingsId> implements HasTenan
@NoXss @NoXss
@Length(fieldName = "key") @Length(fieldName = "key")
private String key; private String key;
private transient JsonNode jsonValue; private JsonNode jsonValue;
public AdminSettings() { public AdminSettings() {
super(); super();
} }
@ -41,7 +41,7 @@ public class AdminSettings extends BaseData<AdminSettingsId> implements HasTenan
public AdminSettings(AdminSettingsId id) { public AdminSettings(AdminSettingsId id) {
super(id); super(id);
} }
public AdminSettings(AdminSettings adminSettings) { public AdminSettings(AdminSettings adminSettings) {
super(adminSettings); super(adminSettings);
this.tenantId = adminSettings.getTenantId(); this.tenantId = adminSettings.getTenantId();

8
common/data/src/main/java/org/thingsboard/server/common/data/BaseData.java

@ -25,9 +25,9 @@ public abstract class BaseData<I extends UUIDBased> extends IdBased<I> implement
private static final long serialVersionUID = 5422817607129962637L; private static final long serialVersionUID = 5422817607129962637L;
public static final ObjectMapper mapper = new ObjectMapper(); public static final ObjectMapper mapper = new ObjectMapper();
protected long createdTime; protected long createdTime;
public BaseData() { public BaseData() {
super(); super();
} }
@ -35,7 +35,7 @@ public abstract class BaseData<I extends UUIDBased> extends IdBased<I> implement
public BaseData(I id) { public BaseData(I id) {
super(id); super(id);
} }
public BaseData(BaseData<I> data) { public BaseData(BaseData<I> data) {
super(data.getId()); super(data.getId());
this.createdTime = data.getCreatedTime(); this.createdTime = data.getCreatedTime();
@ -53,7 +53,7 @@ public abstract class BaseData<I extends UUIDBased> extends IdBased<I> implement
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;
int result = super.hashCode(); int result = super.hashCode();
result = prime * result + (int) (createdTime ^ (createdTime >>> 32)); result = prime * result + Long.hashCode(createdTime);
return result; return result;
} }

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

@ -68,8 +68,8 @@ public class Dashboard extends DashboardInfo implements ExportableEntity<Dashboa
} }
@Schema(description = "JSON object with main configuration of the dashboard: layouts, widgets, aliases, etc. " + @Schema(description = "JSON object with main configuration of the dashboard: layouts, widgets, aliases, etc. " +
"The JSON structure of the dashboard configuration is quite complex. " + "The JSON structure of the dashboard configuration is quite complex. " +
"The easiest way to learn it is to export existing dashboard to JSON." "The easiest way to learn it is to export existing dashboard to JSON."
, implementation = com.fasterxml.jackson.databind.JsonNode.class) , implementation = com.fasterxml.jackson.databind.JsonNode.class)
public JsonNode getConfiguration() { public JsonNode getConfiguration() {
return configuration; return configuration;

12
common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleNode.java

@ -62,9 +62,7 @@ public class RuleNode extends BaseDataWithAdditionalInfo<RuleNodeId> implements
@Schema(description = "Version of rule node configuration. ", example = "0") @Schema(description = "Version of rule node configuration. ", example = "0")
private int configurationVersion; private int configurationVersion;
@Schema(description = "JSON with the rule node configuration. Structure depends on the rule node implementation.", implementation = JsonNode.class) @Schema(description = "JSON with the rule node configuration. Structure depends on the rule node implementation.", implementation = JsonNode.class)
private transient JsonNode configuration; private JsonNode configuration;
@JsonIgnore
private byte[] configurationBytes;
private RuleNodeId externalId; private RuleNodeId externalId;
@ -92,14 +90,6 @@ public class RuleNode extends BaseDataWithAdditionalInfo<RuleNodeId> implements
return name; return name;
} }
public JsonNode getConfiguration() {
return BaseDataWithAdditionalInfo.getJson(() -> configuration, () -> configurationBytes);
}
public void setConfiguration(JsonNode data) {
setJson(data, json -> this.configuration = json, bytes -> this.configurationBytes = bytes);
}
@Schema(description = "JSON object with the Rule Node Id. " + @Schema(description = "JSON object with the Rule Node Id. " +
"Specify this field to update the Rule Node. " + "Specify this field to update the Rule Node. " +
"Referencing non-existing Rule Node Id will cause error. " + "Referencing non-existing Rule Node Id will cause error. " +

20
common/data/src/main/java/org/thingsboard/server/common/data/settings/UserSettings.java

@ -15,20 +15,15 @@
*/ */
package org.thingsboard.server.common.data.settings; package org.thingsboard.server.common.data.settings;
import com.fasterxml.jackson.annotation.JsonIgnore;
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.ToString;
import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.validation.Length; import org.thingsboard.server.common.data.validation.Length;
import org.thingsboard.server.common.data.validation.NoXss; import org.thingsboard.server.common.data.validation.NoXss;
import java.io.Serializable; import java.io.Serializable;
import static org.thingsboard.server.common.data.BaseDataWithAdditionalInfo.getJson;
import static org.thingsboard.server.common.data.BaseDataWithAdditionalInfo.setJson;
@Schema @Schema
@Data @Data
public class UserSettings implements Serializable { public class UserSettings implements Serializable {
@ -43,20 +38,9 @@ public class UserSettings implements Serializable {
@Length(fieldName = "type", max = 50) @Length(fieldName = "type", max = 50)
private UserSettingsType type; private UserSettingsType type;
@Schema(description = "JSON object with user settings.",implementation = com.fasterxml.jackson.databind.JsonNode.class) @Schema(description = "JSON object with user settings.", implementation = com.fasterxml.jackson.databind.JsonNode.class)
@NoXss @NoXss
@Length(fieldName = "settings", max = 100000) @Length(fieldName = "settings", max = 100000)
private transient JsonNode settings; private JsonNode settings;
@JsonIgnore
@ToString.Exclude
private byte[] settingsBytes;
public JsonNode getSettings() {
return getJson(() -> settings, () -> settingsBytes);
}
public void setSettings(JsonNode settings) {
setJson(settings, json -> this.settings = json, bytes -> this.settingsBytes = bytes);
}
} }

4
common/data/src/main/java/org/thingsboard/server/common/data/widget/WidgetType.java

@ -21,15 +21,17 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
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.WidgetTypeId; import org.thingsboard.server.common.data.id.WidgetTypeId;
import java.util.Optional; import java.util.Optional;
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class WidgetType extends BaseWidgetType { public class WidgetType extends BaseWidgetType {
@Schema(description = "Complex JSON object that describes the widget type", accessMode = Schema.AccessMode.READ_ONLY) @Schema(description = "Complex JSON object that describes the widget type", accessMode = Schema.AccessMode.READ_ONLY)
private transient JsonNode descriptor; private JsonNode descriptor;
public WidgetType() { public WidgetType() {
super(); super();

2
common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/config/ssl/KeystoreSslCredentials.java

@ -26,7 +26,7 @@ import java.security.GeneralSecurityException;
import java.security.KeyStore; import java.security.KeyStore;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = true)
public class KeystoreSslCredentials extends AbstractSslCredentials { public class KeystoreSslCredentials extends AbstractSslCredentials {
private String type; private String type;

4
common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/config/ssl/PemSslCredentials.java

@ -46,7 +46,7 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = true)
public class PemSslCredentials extends AbstractSslCredentials { public class PemSslCredentials extends AbstractSslCredentials {
private static final String DEFAULT_KEY_ALIAS = "server"; private static final String DEFAULT_KEY_ALIAS = "server";
@ -72,7 +72,7 @@ public class PemSslCredentials extends AbstractSslCredentials {
try (InputStream inStream = ResourceUtils.getInputStream(this, this.certFile)) { try (InputStream inStream = ResourceUtils.getInputStream(this, this.certFile)) {
try (PEMParser pemParser = new PEMParser(new InputStreamReader(inStream))) { try (PEMParser pemParser = new PEMParser(new InputStreamReader(inStream))) {
Object object; Object object;
while((object = pemParser.readObject()) != null) { while ((object = pemParser.readObject()) != null) {
if (object instanceof X509CertificateHolder) { if (object instanceof X509CertificateHolder) {
X509Certificate x509Cert = certConverter.getCertificate((X509CertificateHolder) object); X509Certificate x509Cert = certConverter.getCertificate((X509CertificateHolder) object);
certificates.add(x509Cert); certificates.add(x509Cert);

44
rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java

@ -102,6 +102,7 @@ import org.thingsboard.server.common.data.id.AlarmCommentId;
import org.thingsboard.server.common.data.id.AlarmId; import org.thingsboard.server.common.data.id.AlarmId;
import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.AssetProfileId; import org.thingsboard.server.common.data.id.AssetProfileId;
import org.thingsboard.server.common.data.id.CalculatedFieldId;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
@ -4073,6 +4074,19 @@ public class RestClient implements Closeable {
return restTemplate.postForEntity(baseURL + "/api/calculatedField", calculatedField, CalculatedField.class).getBody(); return restTemplate.postForEntity(baseURL + "/api/calculatedField", calculatedField, CalculatedField.class).getBody();
} }
public Optional<CalculatedField> getCalculatedFieldById(CalculatedFieldId calculatedFieldId) {
try {
ResponseEntity<CalculatedField> calculatedField = restTemplate.getForEntity(baseURL + "/api/calculatedField/{calculatedFieldId}", CalculatedField.class, calculatedFieldId.getId());
return Optional.ofNullable(calculatedField.getBody());
} catch (HttpClientErrorException exception) {
if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
return Optional.empty();
} else {
throw exception;
}
}
}
public PageData<CalculatedField> getCalculatedFieldsByEntityId(EntityId entityId, PageLink pageLink) { public PageData<CalculatedField> getCalculatedFieldsByEntityId(EntityId entityId, PageLink pageLink) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
addPageLinkToParam(params, pageLink); addPageLinkToParam(params, pageLink);
@ -4084,6 +4098,36 @@ public class RestClient implements Closeable {
} }
public void deleteCalculatedField(CalculatedFieldId calculatedFieldId) {
restTemplate.delete(baseURL + "/api/calculatedField/{calculatedFieldId}", calculatedFieldId.getId());
}
public Optional<JsonNode> getLatestCalculatedFieldDebugEvent(CalculatedFieldId calculatedFieldId) {
try {
ResponseEntity<JsonNode> jsonNode = restTemplate.getForEntity(baseURL + "/api/calculatedField/{calculatedFieldId}/debug", JsonNode.class, calculatedFieldId.getId());
return Optional.ofNullable(jsonNode.getBody());
} catch (HttpClientErrorException exception) {
if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
return Optional.empty();
} else {
throw exception;
}
}
}
public Optional<JsonNode> testCalculatedFieldScript(JsonNode inputParams) {
try {
ResponseEntity<JsonNode> jsonNode = restTemplate.postForEntity(baseURL + "/api/calculatedField/testScript", inputParams, JsonNode.class);
return Optional.ofNullable(jsonNode.getBody());
} catch (HttpClientErrorException exception) {
if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
return Optional.empty();
} else {
throw exception;
}
}
}
private String getTimeUrlParams(TimePageLink pageLink) { private String getTimeUrlParams(TimePageLink pageLink) {
String urlParams = getUrlParams(pageLink); String urlParams = getUrlParams(pageLink);
if (pageLink.getStartTime() != null) { if (pageLink.getStartTime() != null) {

Loading…
Cancel
Save