From b3bfe28cc8ec8a16dc93607199eae7415fc92034 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Thu, 14 Dec 2023 13:33:37 +0200 Subject: [PATCH] added hotfix upgrade for transformation rule nodes with TbMsgSource --- ...bAbstractTransformNodeWithTbMsgSource.java | 28 +++++++++++++------ .../rule/engine/transform/TbCopyKeysNode.java | 2 +- .../engine/transform/TbDeleteKeysNode.java | 2 +- .../engine/transform/TbRenameKeysNode.java | 2 +- .../engine/transform/TbCopyKeysNodeTest.java | 4 ++- .../transform/TbDeleteKeysNodeTest.java | 4 ++- .../transform/TbRenameKeysNodeTest.java | 4 ++- 7 files changed, 31 insertions(+), 15 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbAbstractTransformNodeWithTbMsgSource.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbAbstractTransformNodeWithTbMsgSource.java index bed00659ea..2213f6a4ee 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbAbstractTransformNodeWithTbMsgSource.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbAbstractTransformNodeWithTbMsgSource.java @@ -22,9 +22,6 @@ import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.rule.engine.util.TbMsgSource; import org.thingsboard.server.common.data.util.TbPair; -import java.util.List; -import java.util.regex.Pattern; - public abstract class TbAbstractTransformNodeWithTbMsgSource implements TbNode { private static final String FROM_METADATA_PROPERTY = "fromMetadata"; @@ -33,28 +30,41 @@ public abstract class TbAbstractTransformNodeWithTbMsgSource implements TbNode { @Override public TbPair upgrade(int fromVersion, JsonNode oldConfiguration) throws TbNodeException { - return fromVersion == 0 ? - upgradeToUseTbMsgSource((ObjectNode) oldConfiguration, getKeyToUpgradeFromVersionZero()) : - new TbPair<>(false, oldConfiguration); + ObjectNode configToUpdate = (ObjectNode) oldConfiguration; + switch (fromVersion) { + case 0: + return upgradeToUseTbMsgSource(configToUpdate); + case 1: + return upgradeNodesWithVersionOneToUseTbMsgSource(configToUpdate); + default: + return new TbPair<>(false, oldConfiguration); + } } - private TbPair upgradeToUseTbMsgSource(ObjectNode configToUpdate, String newProperty) throws TbNodeException { + private TbPair upgradeToUseTbMsgSource(ObjectNode configToUpdate) throws TbNodeException { if (!configToUpdate.has(FROM_METADATA_PROPERTY)) { throw new TbNodeException("property to update: '" + FROM_METADATA_PROPERTY + "' doesn't exists in configuration!"); } var value = configToUpdate.get(FROM_METADATA_PROPERTY).asText(); if ("true".equals(value)) { configToUpdate.remove(FROM_METADATA_PROPERTY); - configToUpdate.put(newProperty, TbMsgSource.METADATA.name()); + configToUpdate.put(getKeyToUpgradeFromVersionZero(), TbMsgSource.METADATA.name()); return new TbPair<>(true, configToUpdate); } if ("false".equals(value)) { configToUpdate.remove(FROM_METADATA_PROPERTY); - configToUpdate.put(newProperty, TbMsgSource.DATA.name()); + configToUpdate.put(getKeyToUpgradeFromVersionZero(), TbMsgSource.DATA.name()); return new TbPair<>(true, configToUpdate); } throw new TbNodeException("property to update: '" + FROM_METADATA_PROPERTY + "' has unexpected value: " + value + ". Allowed values: true or false!"); } + private TbPair upgradeNodesWithVersionOneToUseTbMsgSource(ObjectNode configToUpdate) throws TbNodeException { + if (configToUpdate.has(getKeyToUpgradeFromVersionZero())) { + return new TbPair<>(false, configToUpdate); + } + return upgradeToUseTbMsgSource(configToUpdate); + } + } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbCopyKeysNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbCopyKeysNode.java index ef950ff563..7b26d2bd33 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbCopyKeysNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbCopyKeysNode.java @@ -40,7 +40,7 @@ import java.util.stream.Collectors; @RuleNode( type = ComponentType.TRANSFORMATION, name = "copy key-value pairs", - version = 1, + version = 2, configClazz = TbCopyKeysNodeConfiguration.class, nodeDescription = "Copies key-value pairs from message to message metadata or vice-versa.", nodeDetails = "Copies key-value pairs from the message to message metadata, or vice-versa, according to the configured direction and keys. " + diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java index 7bb63ee1bd..be66944280 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNode.java @@ -40,7 +40,7 @@ import java.util.stream.Collectors; @RuleNode( type = ComponentType.TRANSFORMATION, name = "delete key-value pairs", - version = 1, + version = 2, configClazz = TbDeleteKeysNodeConfiguration.class, nodeDescription = "Deletes key-value pairs from message or message metadata.", nodeDetails = "Deletes key-value pairs from the message or message metadata according to the configured " + diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java index 705ce3fc42..1b09570985 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbRenameKeysNode.java @@ -37,7 +37,7 @@ import java.util.concurrent.ExecutionException; @RuleNode( type = ComponentType.TRANSFORMATION, name = "rename keys", - version = 1, + version = 2, configClazz = TbRenameKeysNodeConfiguration.class, nodeDescription = "Renames message or message metadata keys.", nodeDetails = "Renames keys in the message or message metadata according to the provided mapping. " + diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java index 5f9efed3fb..1efe85966d 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java @@ -164,7 +164,9 @@ public class TbCopyKeysNodeTest { private static Stream givenFromVersionAndConfig_whenUpgrade_thenVerifyUpgradeResultAndConfig() { return Stream.of( Arguments.of(0, "{\"fromMetadata\":false,\"keys\":[\"temperature\"]}", true, "{\"copyFrom\":\"DATA\",\"keys\":[\"temperature\"]}"), - Arguments.of(0, "{\"fromMetadata\":true,\"keys\":[\"temperature\"]}", true, "{\"copyFrom\":\"METADATA\",\"keys\":[\"temperature\"]}") + Arguments.of(0, "{\"fromMetadata\":true,\"keys\":[\"temperature\"]}", true, "{\"copyFrom\":\"METADATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"fromMetadata\":true,\"keys\":[\"temperature\"]}", true, "{\"copyFrom\":\"METADATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"copyFrom\":\"METADATA\",\"keys\":[\"temperature\"]}", false, "{\"copyFrom\":\"METADATA\",\"keys\":[\"temperature\"]}") ); } diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java index 176979a546..9dce929ab3 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java @@ -141,7 +141,9 @@ public class TbDeleteKeysNodeTest { private static Stream givenFromVersionAndConfig_whenUpgrade_thenVerifyUpgradeResultAndConfig() { return Stream.of( Arguments.of(0, "{\"fromMetadata\":false,\"keys\":[\"temperature\"]}", true, "{\"deleteFrom\":\"DATA\",\"keys\":[\"temperature\"]}"), - Arguments.of(0, "{\"fromMetadata\":true,\"keys\":[\"temperature\"]}", true, "{\"deleteFrom\":\"METADATA\",\"keys\":[\"temperature\"]}") + Arguments.of(0, "{\"fromMetadata\":true,\"keys\":[\"temperature\"]}", true, "{\"deleteFrom\":\"METADATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"fromMetadata\":true,\"keys\":[\"temperature\"]}", true, "{\"deleteFrom\":\"METADATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"deleteFrom\":\"METADATA\",\"keys\":[\"temperature\"]}", false, "{\"deleteFrom\":\"METADATA\",\"keys\":[\"temperature\"]}") ); } diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeTest.java index ea46db2e2b..daafd4675a 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeTest.java @@ -157,7 +157,9 @@ public class TbRenameKeysNodeTest { private static Stream givenFromVersionAndConfig_whenUpgrade_thenVerifyUpgradeResultAndConfig() { return Stream.of( Arguments.of(0, "{\"fromMetadata\":false,\"renameKeysMapping\":{\"temp\":\"temperature\"}}", true, "{\"renameIn\":\"DATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}"), - Arguments.of(0, "{\"fromMetadata\":true,\"renameKeysMapping\":{\"temp\":\"temperature\"}}", true, "{\"renameIn\":\"METADATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}") + Arguments.of(0, "{\"fromMetadata\":true,\"renameKeysMapping\":{\"temp\":\"temperature\"}}", true, "{\"renameIn\":\"METADATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}"), + Arguments.of(1, "{\"fromMetadata\":true,\"renameKeysMapping\":{\"temp\":\"temperature\"}}", true, "{\"renameIn\":\"METADATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}"), + Arguments.of(1, "{\"renameIn\":\"METADATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}", false, "{\"renameIn\":\"METADATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}") ); }