From 40d92b612f8bbb5710c956de5792de8be173ddb1 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Mon, 20 Nov 2023 14:03:53 +0200 Subject: [PATCH] added logic to update config version for nodes with valid config --- .../server/utils/TbNodeUpgradeUtils.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/utils/TbNodeUpgradeUtils.java b/application/src/main/java/org/thingsboard/server/utils/TbNodeUpgradeUtils.java index 5aa4176b1f..90e9c07707 100644 --- a/application/src/main/java/org/thingsboard/server/utils/TbNodeUpgradeUtils.java +++ b/application/src/main/java/org/thingsboard/server/utils/TbNodeUpgradeUtils.java @@ -17,7 +17,9 @@ package org.thingsboard.server.utils; import com.fasterxml.jackson.databind.JsonNode; import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.rule.engine.api.NodeConfiguration; import org.thingsboard.rule.engine.api.TbNode; +import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.util.TbPair; import org.thingsboard.server.service.component.RuleNodeClassInfo; @@ -26,17 +28,33 @@ public class TbNodeUpgradeUtils { public static void upgradeConfigurationAndVersion(RuleNode node, RuleNodeClassInfo nodeInfo) throws Exception { JsonNode oldConfiguration = node.getConfiguration(); + var configClass = nodeInfo.getAnnotation().configClazz(); + if (oldConfiguration == null || !oldConfiguration.isObject()) { - var configClass = nodeInfo.getAnnotation().configClazz(); node.setConfiguration(JacksonUtil.valueToTree(configClass.getDeclaredConstructor().newInstance().defaultConfiguration())); } else { var tbVersionedNode = (TbNode) nodeInfo.getClazz().getDeclaredConstructor().newInstance(); - TbPair upgradeResult = tbVersionedNode.upgrade(node.getConfigurationVersion(), oldConfiguration); - if (upgradeResult.getFirst()) { - node.setConfiguration(upgradeResult.getSecond()); + try { + TbPair upgradeResult = tbVersionedNode.upgrade(node.getConfigurationVersion(), oldConfiguration); + if (upgradeResult.getFirst()) { + node.setConfiguration(upgradeResult.getSecond()); + } + } catch (TbNodeException e) { + if (!isValidConfig(oldConfiguration, configClass)) { + throw e; + } } } node.setConfigurationVersion(nodeInfo.getCurrentVersion()); } + private static boolean isValidConfig(JsonNode oldConfiguration, Class configClass) { + try { + JacksonUtil.treeToValue(oldConfiguration, configClass); + return true; + } catch (Exception e) { + return false; + } + } + }