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..02e99d90fe 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,39 +22,70 @@ 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"; + protected static final String FROM_METADATA_PROPERTY = "fromMetadata"; + + protected abstract String getNewKeyForUpgradeFromVersionZero(); - protected abstract String getKeyToUpgradeFromVersionZero(); + protected abstract String getKeyToUpgradeFromVersionOne(); @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(getNewKeyForUpgradeFromVersionZero(), 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(getNewKeyForUpgradeFromVersionZero(), 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(getNewKeyForUpgradeFromVersionZero())) { + return new TbPair<>(false, configToUpdate); + } + return upgradeTbMsgSourceKey(configToUpdate, getKeyToUpgradeFromVersionOne()); + } + + private TbPair upgradeTbMsgSourceKey(ObjectNode configToUpdate, String oldPropertyKey) throws TbNodeException { + if (!configToUpdate.has(oldPropertyKey)) { + throw new TbNodeException("property to update: '" + oldPropertyKey + "' doesn't exists in configuration!"); + } + var value = configToUpdate.get(oldPropertyKey).asText(); + if (TbMsgSource.METADATA.name().equals(value)) { + configToUpdate.remove(oldPropertyKey); + configToUpdate.put(getNewKeyForUpgradeFromVersionZero(), TbMsgSource.METADATA.name()); + return new TbPair<>(true, configToUpdate); + } + if (TbMsgSource.DATA.name().equals(value)) { + configToUpdate.remove(oldPropertyKey); + configToUpdate.put(getNewKeyForUpgradeFromVersionZero(), TbMsgSource.DATA.name()); + return new TbPair<>(true, configToUpdate); + } + throw new TbNodeException("property to update: '" + oldPropertyKey + "' has unexpected value: " + + value + ". Allowed values: true or false!"); + } + } 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..b96486fe4c 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. " + @@ -109,10 +109,15 @@ public class TbCopyKeysNode extends TbAbstractTransformNodeWithTbMsgSource { } @Override - protected String getKeyToUpgradeFromVersionZero() { + protected String getNewKeyForUpgradeFromVersionZero() { return "copyFrom"; } + @Override + protected String getKeyToUpgradeFromVersionOne() { + return FROM_METADATA_PROPERTY; + } + boolean matches(String key) { return compiledKeyPatterns.stream().anyMatch(pattern -> pattern.matcher(key).matches()); } 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..65ecdd42e2 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 " + @@ -104,10 +104,15 @@ public class TbDeleteKeysNode extends TbAbstractTransformNodeWithTbMsgSource { } @Override - protected String getKeyToUpgradeFromVersionZero() { + protected String getNewKeyForUpgradeFromVersionZero() { return "deleteFrom"; } + @Override + protected String getKeyToUpgradeFromVersionOne() { + return "dataToFetch"; + } + boolean matches(String key) { return compiledKeyPatterns.stream().anyMatch(pattern -> pattern.matcher(key).matches()); } 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..64850ee80a 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. " + @@ -110,8 +110,13 @@ public class TbRenameKeysNode extends TbAbstractTransformNodeWithTbMsgSource { } @Override - protected String getKeyToUpgradeFromVersionZero() { + protected String getNewKeyForUpgradeFromVersionZero() { return "renameIn"; } + @Override + protected String getKeyToUpgradeFromVersionOne() { + return FROM_METADATA_PROPERTY; + } + } 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..ae58298e0d 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,11 @@ 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\":\"METADATA\",\"keys\":[\"temperature\"]}", true, "{\"copyFrom\":\"METADATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"fromMetadata\":\"DATA\",\"keys\":[\"temperature\"]}", true, "{\"copyFrom\":\"DATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"copyFrom\":\"METADATA\",\"keys\":[\"temperature\"]}", false, "{\"copyFrom\":\"METADATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"copyFrom\":\"DATA\",\"keys\":[\"temperature\"]}", false, "{\"copyFrom\":\"DATA\",\"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..5acc9f2073 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,11 @@ 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, "{\"dataToFetch\":\"METADATA\",\"keys\":[\"temperature\"]}", true, "{\"deleteFrom\":\"METADATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"dataToFetch\":\"DATA\",\"keys\":[\"temperature\"]}", true, "{\"deleteFrom\":\"DATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"deleteFrom\":\"METADATA\",\"keys\":[\"temperature\"]}", false, "{\"deleteFrom\":\"METADATA\",\"keys\":[\"temperature\"]}"), + Arguments.of(1, "{\"deleteFrom\":\"DATA\",\"keys\":[\"temperature\"]}", false, "{\"deleteFrom\":\"DATA\",\"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..23f6e33f26 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,11 @@ 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\":\"METADATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}", true, "{\"renameIn\":\"METADATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}"), + Arguments.of(1, "{\"fromMetadata\":\"DATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}", true, "{\"renameIn\":\"DATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}"), + Arguments.of(1, "{\"renameIn\":\"METADATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}", false, "{\"renameIn\":\"METADATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}"), + Arguments.of(1, "{\"renameIn\":\"DATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}", false, "{\"renameIn\":\"DATA\",\"renameKeysMapping\":{\"temp\":\"temperature\"}}") ); }