Browse Source

Added validation for Expression result propagation mode

pull/14107/head
dshvaika 8 months ago
parent
commit
f5804d928b
  1. 20
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfiguration.java
  2. 17
      common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfigurationTest.java

20
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfiguration.java

@ -50,7 +50,7 @@ public class PropagationCalculatedFieldConfiguration extends BaseCalculatedField
propagationRestriction();
if (!applyExpressionToResolvedArguments) {
arguments.forEach((name, argument) -> {
if (argument.getRefEntityId() != null || argument.getRefDynamicSourceConfiguration() != null) {
if (!currentEntitySource(argument)) {
throw new IllegalArgumentException("Arguments in 'Arguments only' propagation mode support only the 'Current entity' source entity type!");
}
if (argument.getRefEntityKey() == null) {
@ -61,8 +61,17 @@ public class PropagationCalculatedFieldConfiguration extends BaseCalculatedField
"Only 'Attribute' or 'Latest telemetry' arguments are allowed for 'Arguments only' propagation mode!");
}
});
} else if (StringUtils.isBlank(expression)) {
throw new IllegalArgumentException("Expression must be specified for 'Expression result' propagation mode!");
} else {
boolean noneMatchCurrentEntitySource = arguments.entrySet()
.stream()
.noneMatch(entry -> currentEntitySource(entry.getValue()));
if (noneMatchCurrentEntitySource) {
throw new IllegalArgumentException("At least one argument must be configured with the 'Current entity' " +
"source entity type for 'Expression result' propagation mode!");
}
if (StringUtils.isBlank(expression)) {
throw new IllegalArgumentException("Expression must be specified for 'Expression result' propagation mode!");
}
}
}
@ -79,4 +88,9 @@ public class PropagationCalculatedFieldConfiguration extends BaseCalculatedField
throw new IllegalArgumentException("Argument name '" + PROPAGATION_CONFIG_ARGUMENT + "' is reserved and cannot be used.");
}
}
private boolean currentEntitySource(Argument argument) {
return argument.getRefEntityId() == null && argument.getRefDynamicSourceConfiguration() == null;
}
}

17
common/data/src/test/java/org/thingsboard/server/common/data/cf/configuration/PropagationCalculatedFieldConfigurationTest.java

@ -52,13 +52,26 @@ public class PropagationCalculatedFieldConfigurationTest {
@Test
void validateShouldThrowWhenConfigurationDisallowArgumentsWithDynamicReferenceConfiguration() {
var cfg = new PropagationCalculatedFieldConfiguration();
Argument argumentWithDynamicRefEntitySource = new Argument();
argumentWithDynamicRefEntitySource.setRefDynamicSourceConfiguration(new CurrentOwnerDynamicSourceConfiguration());
cfg.setArguments(Map.of("argumentWithDynamicRefEntitySource", argumentWithDynamicRefEntitySource));
assertThatThrownBy(cfg::validate)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Arguments in 'Arguments only' propagation mode support only the 'Current entity' source entity type!");
}
@Test
void validateShouldThrowWhenConfigurationHasNoArgumentsWithCurrentEntitySource() {
var cfg = new PropagationCalculatedFieldConfiguration();
Argument argumentWithRefEntityIdSet = new Argument();
argumentWithRefEntityIdSet.setRefDynamicSourceConfiguration(new CurrentOwnerDynamicSourceConfiguration());
argumentWithRefEntityIdSet.setRefEntityId(new DeviceId(UUID.fromString("3703e895-3f9b-4b75-a715-b68f1ad51944")));
cfg.setArguments(Map.of("argumentWithRefEntityIdSet", argumentWithRefEntityIdSet));
cfg.setApplyExpressionToResolvedArguments(true);
assertThatThrownBy(cfg::validate)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Arguments in 'Arguments only' propagation mode support only the 'Current entity' source entity type!");
.hasMessage("At least one argument must be configured with the 'Current entity' " +
"source entity type for 'Expression result' propagation mode!");
}
@Test

Loading…
Cancel
Save