From a244d7088f03c57016eb332e2e39ed0d39e7db21 Mon Sep 17 00:00:00 2001 From: dshvaika Date: Thu, 30 Oct 2025 14:30:56 +0200 Subject: [PATCH] Updated logic due to comments --- ...CalculatedFieldEntityMessageProcessor.java | 2 +- .../ctx/state/BaseCalculatedFieldState.java | 6 ++--- .../cf/ctx/state/CalculatedFieldState.java | 26 +++++++------------ .../GeofencingCalculatedFieldStateTest.java | 6 ++--- .../PropagationCalculatedFieldStateTest.java | 6 ++--- .../state/ScriptCalculatedFieldStateTest.java | 6 ++--- .../state/SimpleCalculatedFieldStateTest.java | 6 ++--- 7 files changed, 25 insertions(+), 33 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java index f727b80e80..4966b8132e 100644 --- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java @@ -482,7 +482,7 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM } } else { if (DebugModeUtil.isDebugFailuresAvailable(ctx.getCalculatedField())) { - String errorMsg = ctx.isInitialized() ? state.getReadinessStatus().stringValue() : "Calculated field state is not initialized!"; + String errorMsg = ctx.isInitialized() ? state.getReadinessStatus().errorMsg() : "Calculated field state is not initialized!"; systemContext.persistCalculatedFieldDebugEvent(tenantId, ctx.getCfId(), entityId, state.getArguments(), tbMsgId, tbMsgType, null, errorMsg); } callback.onSuccess(); diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java index 033560728e..20f944e433 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java @@ -117,7 +117,7 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, @Override public boolean isReady() { - return readinessStatus.isReady(); + return readinessStatus.ready(); } @Override @@ -162,7 +162,7 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, protected ReadinessStatus checkReadiness(List requiredArguments, Map currentArguments) { if (currentArguments == null) { - return new ReadinessStatus(requiredArguments); + return ReadinessStatus.from(requiredArguments); } List emptyArguments = null; for (String requiredArgumentKey : requiredArguments) { @@ -174,7 +174,7 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, emptyArguments.add(requiredArgumentKey); } } - return new ReadinessStatus(emptyArguments); + return ReadinessStatus.from(emptyArguments); } } diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldState.java index 1a5577e431..c649ab5dbf 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldState.java @@ -16,17 +16,14 @@ package org.thingsboard.server.service.cf.ctx.state; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.google.common.util.concurrent.ListenableFuture; -import lombok.AllArgsConstructor; -import lombok.Data; -import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.actors.TbActorRef; import org.thingsboard.server.common.data.cf.CalculatedFieldType; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.util.CollectionsUtil; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; import org.thingsboard.server.service.cf.CalculatedFieldResult; import org.thingsboard.server.service.cf.ctx.CalculatedFieldEntityCtxId; @@ -101,22 +98,17 @@ public interface CalculatedFieldState extends Closeable { } } - @Data - @AllArgsConstructor - @JsonInclude(JsonInclude.Include.NON_NULL) - class ReadinessStatus { + record ReadinessStatus(boolean ready, String errorMsg) { - private List emptyArguments; + private static final String ERROR_MESSAGE = "Required arguments are missing: "; + private static final ReadinessStatus READY = new ReadinessStatus(true, null); - public boolean isReady() { - return emptyArguments == null || emptyArguments.isEmpty(); - } - - public String stringValue() { - return JacksonUtil.toString(this); + public static ReadinessStatus from(List emptyOrMissingArguments) { + if (CollectionsUtil.isEmpty(emptyOrMissingArguments)) { + return ReadinessStatus.READY; + } + return new ReadinessStatus(false, ERROR_MESSAGE + String.join(", ", emptyOrMissingArguments)); } - - } } diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingCalculatedFieldStateTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingCalculatedFieldStateTest.java index ebda120769..d144fe4dcc 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingCalculatedFieldStateTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/GeofencingCalculatedFieldStateTest.java @@ -200,7 +200,7 @@ public class GeofencingCalculatedFieldStateTest { @Test void testIsReadyWhenNotAllArgPresent() { assertThat(state.isReady()).isFalse(); - assertThat(state.getReadinessStatus().getEmptyArguments()).containsExactlyInAnyOrderElementsOf(state.getRequiredArguments()); + assertThat(state.getReadinessStatus().errorMsg()).contains(state.getRequiredArguments()); } @Test @@ -212,7 +212,7 @@ public class GeofencingCalculatedFieldStateTest { "restrictedZones", geofencingRestrictedZoneArgEntry ), ctx); assertThat(state.isReady()).isTrue(); - assertThat(state.getReadinessStatus().getEmptyArguments()).isNull(); + assertThat(state.getReadinessStatus().errorMsg()).isNull(); } @Test @@ -224,7 +224,7 @@ public class GeofencingCalculatedFieldStateTest { "restrictedZones", new GeofencingArgumentEntry() ), ctx); assertThat(state.isReady()).isFalse(); - assertThat(state.getReadinessStatus().getEmptyArguments()).contains("restrictedZones"); + assertThat(state.getReadinessStatus().errorMsg()).contains("restrictedZones"); } @Test diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java index a03be03f59..ddb9f378b0 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/PropagationCalculatedFieldStateTest.java @@ -131,7 +131,7 @@ public class PropagationCalculatedFieldStateTest { initCtxAndState(false); state.update(Map.of(TEMPERATURE_ARGUMENT_NAME, singleValueArgEntry), ctx); assertThat(state.isReady()).isFalse(); - assertThat(state.getReadinessStatus().getEmptyArguments()).containsExactly(PROPAGATION_CONFIG_ARGUMENT); + assertThat(state.getReadinessStatus().errorMsg()).contains(PROPAGATION_CONFIG_ARGUMENT); } @Test @@ -140,7 +140,7 @@ public class PropagationCalculatedFieldStateTest { state.update(Map.of(TEMPERATURE_ARGUMENT_NAME, singleValueArgEntry, PROPAGATION_CONFIG_ARGUMENT, new PropagationArgumentEntry(Collections.emptyList())), ctx); assertThat(state.isReady()).isFalse(); - assertThat(state.getReadinessStatus().getEmptyArguments()).containsExactly(PROPAGATION_CONFIG_ARGUMENT); + assertThat(state.getReadinessStatus().errorMsg()).contains(PROPAGATION_CONFIG_ARGUMENT); } @Test @@ -148,7 +148,7 @@ public class PropagationCalculatedFieldStateTest { initCtxAndState(false); state.update(Map.of(TEMPERATURE_ARGUMENT_NAME, singleValueArgEntry, PROPAGATION_CONFIG_ARGUMENT, propagationArgEntry), ctx); assertThat(state.isReady()).isTrue(); - assertThat(state.getReadinessStatus().getEmptyArguments()).isNull(); + assertThat(state.getReadinessStatus().errorMsg()).isNull(); } diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/ScriptCalculatedFieldStateTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/ScriptCalculatedFieldStateTest.java index 39827a34fb..51e633a232 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/ScriptCalculatedFieldStateTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/ScriptCalculatedFieldStateTest.java @@ -161,21 +161,21 @@ public class ScriptCalculatedFieldStateTest { @Test void testIsReadyWhenNotAllArgPresent() { assertThat(state.isReady()).isFalse(); - assertThat(state.getReadinessStatus().getEmptyArguments()).containsExactlyInAnyOrderElementsOf(state.getRequiredArguments()); + assertThat(state.getReadinessStatus().errorMsg()).contains(state.getRequiredArguments()); } @Test void testIsReadyWhenAllArgPresent() { state.update(Map.of("deviceTemperature", deviceTemperatureArgEntry, "assetHumidity", assetHumidityArgEntry), ctx); assertThat(state.isReady()).isTrue(); - assertThat(state.getReadinessStatus().getEmptyArguments()).isNull(); + assertThat(state.getReadinessStatus().errorMsg()).isNull(); } @Test void testIsReadyWhenEmptyEntryPresents() { state.update(Map.of("deviceTemperature", new TsRollingArgumentEntry(5, 30000L), "assetHumidity", assetHumidityArgEntry), ctx); assertThat(state.isReady()).isFalse(); - assertThat(state.getReadinessStatus().getEmptyArguments()).containsExactly("deviceTemperature"); + assertThat(state.getReadinessStatus().errorMsg()).contains("deviceTemperature"); } private TsRollingArgumentEntry createRollingArgEntry() { diff --git a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldStateTest.java b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldStateTest.java index 9aa3d60ec6..a64f1e4c60 100644 --- a/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldStateTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldStateTest.java @@ -204,7 +204,7 @@ public class SimpleCalculatedFieldStateTest { @Test void testIsReadyWhenNotAllArgPresent() { assertThat(state.isReady()).isFalse(); - assertThat(state.getReadinessStatus().getEmptyArguments()).containsExactlyInAnyOrderElementsOf(state.getRequiredArguments()); + assertThat(state.getReadinessStatus().errorMsg()).contains(state.getRequiredArguments()); } @Test @@ -215,7 +215,7 @@ public class SimpleCalculatedFieldStateTest { "key3", key3ArgEntry ), ctx); assertThat(state.isReady()).isTrue(); - assertThat(state.getReadinessStatus().getEmptyArguments()).isNull(); + assertThat(state.getReadinessStatus().errorMsg()).isNull(); } @Test @@ -226,7 +226,7 @@ public class SimpleCalculatedFieldStateTest { "key3", new SingleValueArgumentEntry() ), ctx); assertThat(state.isReady()).isFalse(); - assertThat(state.getReadinessStatus().getEmptyArguments()).containsExactly("key3"); + assertThat(state.getReadinessStatus().errorMsg()).contains("key3"); } private CalculatedField getCalculatedField() {