From d4b8fa0312dccf9377efb4d778a41c7f4d98720e Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Fri, 3 Apr 2026 18:32:32 +0300 Subject: [PATCH] Add type guard for alarm rule updates and defensive cast in fromCalculatedField --- .../thingsboard/server/controller/AlarmRuleController.java | 3 +++ .../server/common/data/cf/AlarmRuleDefinition.java | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/AlarmRuleController.java b/application/src/main/java/org/thingsboard/server/controller/AlarmRuleController.java index bd515cd5bb..957d05d1f4 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AlarmRuleController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AlarmRuleController.java @@ -110,6 +110,9 @@ public class AlarmRuleController extends BaseController { @RequestBody AlarmRuleDefinition alarmRuleDefinition) throws Exception { alarmRuleDefinition.setTenantId(getTenantId()); checkEntityId(alarmRuleDefinition.getEntityId(), Operation.WRITE_CALCULATED_FIELD); + if (alarmRuleDefinition.getId() != null) { + checkAlarmRule(alarmRuleDefinition.getId()); + } CalculatedField calculatedField = alarmRuleDefinition.toCalculatedField(); checkReferencedEntities(calculatedField.getConfiguration()); CalculatedField saved = tbCalculatedFieldService.save(calculatedField, getCurrentUser()); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/AlarmRuleDefinition.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/AlarmRuleDefinition.java index ad46fc4050..bd0c76bc05 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/AlarmRuleDefinition.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/AlarmRuleDefinition.java @@ -138,7 +138,10 @@ public class AlarmRuleDefinition extends BaseData implements def.setDebugMode(cf.isDebugMode()); def.setDebugSettings(cf.getDebugSettings()); def.setConfigurationVersion(cf.getConfigurationVersion()); - def.setConfiguration((AlarmCalculatedFieldConfiguration) cf.getConfiguration()); + if (!(cf.getConfiguration() instanceof AlarmCalculatedFieldConfiguration config)) { + throw new IllegalArgumentException("Expected ALARM calculated field, got " + cf.getType()); + } + def.setConfiguration(config); def.setVersion(cf.getVersion()); def.setAdditionalInfo(cf.getAdditionalInfo()); return def;