From 0f0b823d0a49db57bca97ad5e8e5d42e765851c9 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Wed, 30 Jan 2019 18:46:30 +0200 Subject: [PATCH 01/12] init commit --- .../engine/filter/TbCheckMessageNode.java | 98 +++++++++++++++++++ .../TbCheckMessageNodeConfiguration.java | 30 ++++++ 2 files changed, 128 insertions(+) create mode 100644 rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java create mode 100644 rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeConfiguration.java diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java new file mode 100644 index 0000000000..acb9136ecf --- /dev/null +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java @@ -0,0 +1,98 @@ +/** + * Copyright © 2018 The Thingsboard Authors + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.rule.engine.filter; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.rule.engine.api.RuleNode; +import org.thingsboard.rule.engine.api.TbContext; +import org.thingsboard.rule.engine.api.TbNode; +import org.thingsboard.rule.engine.api.TbNodeConfiguration; +import org.thingsboard.rule.engine.api.TbNodeException; +import org.thingsboard.rule.engine.api.util.TbNodeUtils; +import org.thingsboard.server.common.data.plugin.ComponentType; +import org.thingsboard.server.common.msg.TbMsg; + +import java.util.List; + +@Slf4j +@RuleNode( + type = ComponentType.FILTER, + name = "check key", + relationTypes = {"True", "False"}, + configClazz = TbCheckMessageNodeConfiguration.class, + nodeDescription = "Checks the existence of the selected key in the message payload.", + nodeDetails = "If the selected key exists - send Message via True chain, otherwise False chain is used.", + uiResources = {"static/rulenode/custom-nodes-config.js"}, + configDirective = "tbFilterNodeCheckKeyConfig") +public class TbCheckMessageNode implements TbNode { + + private static final Gson gson = new Gson(); + + private TbCheckMessageNodeConfiguration config; + private List messageNamesList; + private List metadataNamesList; + + @Override + public void init(TbContext tbContext, TbNodeConfiguration configuration) throws TbNodeException { + this.config = TbNodeUtils.convert(configuration, TbCheckMessageNodeConfiguration.class); + messageNamesList = config.getMessageNames(); + metadataNamesList = config.getMetadataNames(); + } + + @Override + public void onMsg(TbContext ctx, TbMsg msg) { + JsonObject data = new JsonParser().parse(msg.getData()).getAsJsonObject(); + JsonObject metadata = gson.toJsonTree(msg.getMetaData().getData()).getAsJsonObject(); + try { + ctx.tellNext(msg, processAllMessageData(data) && processAllMessageMetadata(metadata) ? "True" : "False"); + } catch (Exception e) { + ctx.tellFailure(msg, e); + } + } + + @Override + public void destroy() { + } + + private boolean processAllMessageData(JsonObject data) { + if (config.isCheckMessageData()) { + return process(data, messageNamesList); + } else { + return true; + } + } + + private boolean processAllMessageMetadata(JsonObject metadata) { + if (config.isCheckMessageMetadata()) { + return process(metadata, metadataNamesList); + } else { + return true; + } + } + + private boolean process(JsonObject object, List fieldsList) { + for (String field : fieldsList) { + if (!object.has(field)) { + return false; + } + } + return true; + } + +} \ No newline at end of file diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeConfiguration.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeConfiguration.java new file mode 100644 index 0000000000..1fbedb5a00 --- /dev/null +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeConfiguration.java @@ -0,0 +1,30 @@ +package org.thingsboard.rule.engine.filter; + +import lombok.Data; +import org.thingsboard.rule.engine.api.NodeConfiguration; + +import java.util.Collections; +import java.util.List; + +@Data +public class TbCheckMessageNodeConfiguration implements NodeConfiguration { + + private List messageNames; + private List metadataNames; + + private boolean checkMessageData; + private boolean checkMessageMetadata; + private boolean checkAllKeys; + + + @Override + public TbCheckMessageNodeConfiguration defaultConfiguration() { + TbCheckMessageNodeConfiguration configuration = new TbCheckMessageNodeConfiguration(); + configuration.setMessageNames(Collections.emptyList()); + configuration.setMetadataNames(Collections.emptyList()); + configuration.setCheckMessageData(true); + configuration.setCheckMessageMetadata(false); + configuration.setCheckAllKeys(true); + return configuration; + } +} From ddc2c737170cedd141c9c9f89a694a0d75faee72 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Thu, 31 Jan 2019 11:14:09 +0200 Subject: [PATCH 02/12] add TbCheckMessageNode --- .../engine/filter/TbCheckMessageNode.java | 93 ++++++++++++------- .../TbCheckMessageNodeConfiguration.java | 19 +++- .../static/rulenode/rulenode-core-config.js | 8 +- 3 files changed, 81 insertions(+), 39 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java index acb9136ecf..f62d236bf2 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java @@ -1,12 +1,12 @@ /** - * Copyright © 2018 The Thingsboard Authors - *

+ * Copyright © 2016-2018 The Thingsboard Authors + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * + * http://www.apache.org/licenses/LICENSE-2.0 + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,7 +15,6 @@ */ package org.thingsboard.rule.engine.filter; -import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; @@ -29,20 +28,22 @@ import org.thingsboard.server.common.data.plugin.ComponentType; import org.thingsboard.server.common.msg.TbMsg; import java.util.List; +import java.util.Map; @Slf4j @RuleNode( type = ComponentType.FILTER, - name = "check key", + name = "has Hobotok", relationTypes = {"True", "False"}, configClazz = TbCheckMessageNodeConfiguration.class, - nodeDescription = "Checks the existence of the selected key in the message payload.", - nodeDetails = "If the selected key exists - send Message via True chain, otherwise False chain is used.", - uiResources = {"static/rulenode/custom-nodes-config.js"}, - configDirective = "tbFilterNodeCheckKeyConfig") + nodeDescription = "Checks the existence of the selected keys from message data and metadata.", + nodeDetails = "If selected checkbox 'Check that all selected keys are present'\" and all keys in message data and metadata are exist - send Message via True chain, otherwise False chain is used.\n" + + "Else if the checkbox is not selected, and at least one of the keys from data or metadata of the message exists - send Message via True chain, otherwise, False chain is used. ", + uiResources = {"static/rulenode/rulenode-core-config.js"}, + configDirective = "tbFilterNodeCheckMessageConfig") public class TbCheckMessageNode implements TbNode { - private static final Gson gson = new Gson(); + private static final JsonParser parser = new JsonParser(); private TbCheckMessageNodeConfiguration config; private List messageNamesList; @@ -57,42 +58,72 @@ public class TbCheckMessageNode implements TbNode { @Override public void onMsg(TbContext ctx, TbMsg msg) { - JsonObject data = new JsonParser().parse(msg.getData()).getAsJsonObject(); - JsonObject metadata = gson.toJsonTree(msg.getMetaData().getData()).getAsJsonObject(); try { - ctx.tellNext(msg, processAllMessageData(data) && processAllMessageMetadata(metadata) ? "True" : "False"); + if (config.isCheckAllKeys()) { + ctx.tellNext(msg, allDataKeysExist(msg) && allMetadataKeysExist(msg) ? "True" : "False"); + } else { + ctx.tellNext(msg, atLeastOneDataKeyExist(msg) || atLeastOneMetadataKeyExist(msg) ? "True" : "False"); + } } catch (Exception e) { ctx.tellFailure(msg, e); } } - @Override - public void destroy() { + private boolean allDataKeysExist(TbMsg msg) { + if (!messageNamesList.isEmpty()) { + JsonObject data = parser.parse(msg.getData()).getAsJsonObject(); + for (String field : messageNamesList) { + if (!data.has(field)) { + return false; + } + } + return true; + } + return true; } - private boolean processAllMessageData(JsonObject data) { - if (config.isCheckMessageData()) { - return process(data, messageNamesList); - } else { - return true; + private boolean atLeastOneDataKeyExist(TbMsg msg) { + if (!messageNamesList.isEmpty()) { + JsonObject data = parser.parse(msg.getData()).getAsJsonObject(); + for (String field : messageNamesList) { + if (data.has(field)) { + return true; + } + } + return false; } + return false; } - private boolean processAllMessageMetadata(JsonObject metadata) { - if (config.isCheckMessageMetadata()) { - return process(metadata, metadataNamesList); - } else { + private boolean allMetadataKeysExist(TbMsg msg) { + if (!metadataNamesList.isEmpty()) { + Map metadata = msg.getMetaData().getData(); + for (String field : metadataNamesList) { + if (!metadata.containsKey(field)) { + return false; + } + } return true; } + return true; } - private boolean process(JsonObject object, List fieldsList) { - for (String field : fieldsList) { - if (!object.has(field)) { - return false; + private boolean atLeastOneMetadataKeyExist(TbMsg msg) { + if (!metadataNamesList.isEmpty()) { + Map metadata = msg.getMetaData().getData(); + for (String field : metadataNamesList) { + if (metadata.containsKey(field)) { + return true; + } } + return false; } - return true; + return false; + } + + @Override + public void destroy() { + } } \ No newline at end of file diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeConfiguration.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeConfiguration.java index 1fbedb5a00..2a3f6131f9 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeConfiguration.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeConfiguration.java @@ -1,3 +1,18 @@ +/** + * Copyright © 2016-2018 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.thingsboard.rule.engine.filter; import lombok.Data; @@ -12,8 +27,6 @@ public class TbCheckMessageNodeConfiguration implements NodeConfiguration { private List messageNames; private List metadataNames; - private boolean checkMessageData; - private boolean checkMessageMetadata; private boolean checkAllKeys; @@ -22,8 +35,6 @@ public class TbCheckMessageNodeConfiguration implements NodeConfiguration { TbCheckMessageNodeConfiguration configuration = new TbCheckMessageNodeConfiguration(); configuration.setMessageNames(Collections.emptyList()); configuration.setMetadataNames(Collections.emptyList()); - configuration.setCheckMessageData(true); - configuration.setCheckMessageMetadata(false); configuration.setCheckAllKeys(true); return configuration; } diff --git a/rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js b/rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js index 1b9ef767e9..259cb996d4 100644 --- a/rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js +++ b/rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js @@ -1,5 +1,5 @@ -!function(e){function t(i){if(n[i])return n[i].exports;var a=n[i]={exports:{},id:i,loaded:!1};return e[i].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var n={};return t.m=e,t.c=n,t.p="/static/",t(0)}(function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))switch(typeof e[t]){case"function":break;case"object":e[t]=function(t){var n=t.slice(1),i=e[t[0]];return function(e,t,a){i.apply(this,[e,t,a].concat(n))}}(e[t]);break;default:e[t]=e[e[t]]}return e}([function(e,t,n){e.exports=n(89)},function(e,t){},1,1,1,1,function(e,t){e.exports="

tb.rulenode.customer-name-pattern-required
tb.rulenode.customer-name-pattern-hint
{{ 'tb.rulenode.create-customer-if-not-exists' | translate }}
tb.rulenode.customer-cache-expiration-required
tb.rulenode.customer-cache-expiration-range
tb.rulenode.customer-cache-expiration-hint
"},function(e,t){e.exports='
{{scope.name | translate}}
'},function(e,t){e.exports="
{{ 'tb.rulenode.test-details-function' | translate }}
tb.rulenode.alarm-type-required
"},function(e,t){e.exports="
{{ 'tb.rulenode.test-details-function' | translate }}
{{ 'tb.rulenode.use-message-alarm-data' | translate }}
tb.rulenode.alarm-type-required
{{ severity.name | translate}}
tb.rulenode.alarm-severity-required
{{ 'tb.rulenode.propagate' | translate }}
"},function(e,t){e.exports="
{{ ('relation.search-direction.' + direction) | translate}}
tb.rulenode.entity-name-pattern-required
tb.rulenode.entity-name-pattern-hint
tb.rulenode.entity-type-pattern-required
tb.rulenode.entity-type-pattern-hint
{{ 'tb.rulenode.create-entity-if-not-exists' | translate }}
tb.rulenode.entity-cache-expiration-required
tb.rulenode.entity-cache-expiration-range
tb.rulenode.entity-cache-expiration-hint
"},function(e,t){e.exports="
{{ 'tb.rulenode.delete-relation-to-specific-entity' | translate }}
tb.rulenode.delete-relation-hint
{{ ('relation.search-direction.' + direction) | translate}}
tb.rulenode.entity-name-pattern-required
tb.rulenode.entity-name-pattern-hint
tb.rulenode.entity-cache-expiration-required
tb.rulenode.entity-cache-expiration-range
tb.rulenode.entity-cache-expiration-hint
"},function(e,t){e.exports="
tb.rulenode.message-count-required
tb.rulenode.min-message-count-message
tb.rulenode.period-seconds-required
tb.rulenode.min-period-seconds-message
{{ 'tb.rulenode.test-generator-function' | translate }}
"},function(e,t){e.exports='
tb.rulenode.topic-pattern-required
tb.rulenode.bootstrap-servers-required
tb.rulenode.min-retries-message
tb.rulenode.min-batch-size-bytes-message
tb.rulenode.min-linger-ms-message
tb.rulenode.min-buffer-memory-bytes-message
{{ ackValue }}
tb.rulenode.key-serializer-required
tb.rulenode.value-serializer-required
'},function(e,t){e.exports="
{{ 'tb.rulenode.test-to-string-function' | translate }}
"},function(e,t){e.exports='
tb.rulenode.topic-pattern-required
tb.rulenode.mqtt-topic-pattern-hint
tb.rulenode.host-required
tb.rulenode.port-required
tb.rulenode.port-range
tb.rulenode.port-range
tb.rulenode.connect-timeout-required
tb.rulenode.connect-timeout-range
tb.rulenode.connect-timeout-range
{{ \'tb.rulenode.clean-session\' | translate }} {{ \'tb.rulenode.enable-ssl\' | translate }}
{{ \'tb.rulenode.credentials\' | translate }}
{{ ruleNodeTypes.mqttCredentialTypes[configuration.credentials.type].name | translate }}
{{ \'tb.rulenode.credentials\' | translate }}
{{ ruleNodeTypes.mqttCredentialTypes[configuration.credentials.type].name | translate }}
{{credentialsValue.name | translate}}
tb.rulenode.credentials-type-required
tb.rulenode.username-required
tb.rulenode.password-required
'},function(e,t){e.exports="
tb.rulenode.interval-seconds-required
tb.rulenode.min-interval-seconds-message
tb.rulenode.output-timeseries-key-prefix-required
"},function(e,t){e.exports="
tb.rulenode.period-seconds-required
tb.rulenode.min-period-0-seconds-message
tb.rulenode.max-pending-messages-required
tb.rulenode.max-pending-messages-range
tb.rulenode.max-pending-messages-range
"},function(e,t){e.exports='
{{ property }}
tb.rulenode.host-required
tb.rulenode.port-required
tb.rulenode.port-range
tb.rulenode.port-range
{{ \'tb.rulenode.automatic-recovery\' | translate }}
tb.rulenode.min-connection-timeout-ms-message
tb.rulenode.min-handshake-timeout-ms-message
'},function(e,t){e.exports='
tb.rulenode.endpoint-url-pattern-required
tb.rulenode.endpoint-url-pattern-hint
{{ type }}
tb.rulenode.headers-hint
'},function(e,t){e.exports="
"},function(e,t){e.exports="
tb.rulenode.timeout-required
tb.rulenode.min-timeout-message
"},function(e,t){e.exports='
{{ \'tb.rulenode.use-system-smtp-settings\' | translate }}
{{smtpProtocol.toUpperCase()}}
tb.rulenode.smtp-host-required
tb.rulenode.smtp-port-required
tb.rulenode.smtp-port-range
tb.rulenode.smtp-port-range
tb.rulenode.timeout-required
tb.rulenode.min-timeout-msec-message
{{ \'tb.rulenode.enable-tls\' | translate }}
'; -},function(e,t){e.exports="
tb.rulenode.topic-arn-pattern-required
tb.rulenode.topic-arn-pattern-hint
tb.rulenode.aws-access-key-id-required
tb.rulenode.aws-secret-access-key-required
tb.rulenode.aws-region-required
"},function(e,t){e.exports='
{{ type.name | translate }}
tb.rulenode.queue-url-pattern-required
tb.rulenode.queue-url-pattern-hint
tb.rulenode.min-delay-seconds-message
tb.rulenode.max-delay-seconds-message
tb.rulenode.message-attributes-hint
tb.rulenode.aws-access-key-id-required
tb.rulenode.aws-secret-access-key-required
tb.rulenode.aws-region-required
'},function(e,t){e.exports="
tb.rulenode.default-ttl-required
tb.rulenode.min-default-ttl-message
"},function(e,t){e.exports="
tb.rulenode.customer-name-pattern-required
tb.rulenode.customer-name-pattern-hint
tb.rulenode.customer-cache-expiration-required
tb.rulenode.customer-cache-expiration-range
tb.rulenode.customer-cache-expiration-hint
"},function(e,t){e.exports='
{{ (\'relation.search-direction.\' + direction) | translate}}
relation.relation-type
device.device-types
'},function(e,t){e.exports="
{{ 'tb.rulenode.latest-telemetry' | translate }}
"},function(e,t){e.exports='
'},function(e,t){e.exports='
{{ type }} {{ \'tb.rulenode.use-metadata-interval-patterns\' | translate }}
tb.rulenode.start-interval-value-required
tb.rulenode.time-value-range
tb.rulenode.time-value-range
{{timeUnit.name | translate}}
tb.rulenode.end-interval-value-required
tb.rulenode.time-value-range
tb.rulenode.time-value-range
{{timeUnit.name | translate}}
tb.rulenode.start-interval-pattern-required
tb.rulenode.start-interval-pattern-hint
tb.rulenode.end-interval-pattern-required
tb.rulenode.end-interval-pattern-hint
'},function(e,t){e.exports='
'},function(e,t){e.exports='
'},function(e,t){e.exports="
{{ 'tb.rulenode.latest-telemetry' | translate }}
"},28,function(e,t){e.exports="
{{ 'tb.rulenode.check-relation-to-specific-entity' | translate }}
tb.rulenode.check-relation-hint
{{ ('relation.search-direction.' + direction) | translate}}
"},function(e,t){e.exports='
{{item}}
tb.rulenode.no-message-types-found
tb.rulenode.no-message-type-matching tb.rulenode.create-new-message-type
{{$chip.name}}
'},function(e,t){e.exports='
'},function(e,t){e.exports="
{{ 'tb.rulenode.test-filter-function' | translate }}
"},function(e,t){e.exports="
{{ 'tb.rulenode.test-switch-function' | translate }}
"},function(e,t){e.exports='
{{ keyText }} {{ valText }}  
{{keyRequiredText}}
{{valRequiredText}}
{{ \'tb.key-val.remove-entry\' | translate }} close
{{ \'tb.key-val.add-entry\' | translate }} add {{ \'action.add\' | translate }}
'},function(e,t){e.exports="
{{ ('relation.search-direction.' + direction) | translate}}
relation.relation-filters
"},function(e,t){e.exports='
{{ source.name | translate}}
'},function(e,t){e.exports="
{{ 'tb.rulenode.test-transformer-function' | translate }}
"},function(e,t){e.exports="
tb.rulenode.from-template-required
tb.rulenode.from-template-hint
tb.rulenode.to-template-required
tb.rulenode.mail-address-list-template-hint
tb.rulenode.mail-address-list-template-hint
tb.rulenode.mail-address-list-template-hint
tb.rulenode.subject-template-required
tb.rulenode.subject-template-hint
tb.rulenode.body-template-required
tb.rulenode.body-template-hint
"},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(6),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(7),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n,i){var a=function(a,r,l,s){var u=o.default;r.html(u),a.types=n,a.$watch("configuration",function(e,t){angular.equals(e,t)||s.$setViewValue(a.configuration)}),s.$render=function(){a.configuration=s.$viewValue},a.testDetailsBuildJs=function(e){var n=angular.copy(a.configuration.alarmDetailsBuildJs);i.testNodeScript(e,n,"json",t.instant("tb.rulenode.details")+"","Details",["msg","metadata","msgType"],a.ruleNodeId).then(function(e){a.configuration.alarmDetailsBuildJs=e,s.$setDirty()})},e(r.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:a}}a.$inject=["$compile","$translate","types","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(8),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n,i){var a=function(a,r,l,s){var u=o.default;r.html(u),a.types=n,a.$watch("configuration",function(e,t){angular.equals(e,t)||s.$setViewValue(a.configuration)}),s.$render=function(){a.configuration=s.$viewValue},a.testDetailsBuildJs=function(e){var n=angular.copy(a.configuration.alarmDetailsBuildJs);i.testNodeScript(e,n,"json",t.instant("tb.rulenode.details")+"","Details",["msg","metadata","msgType"],a.ruleNodeId).then(function(e){a.configuration.alarmDetailsBuildJs=e,s.$setDirty()})},e(r.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:a}}a.$inject=["$compile","$translate","types","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(9),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(10),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(11),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n,i){var a=function(a,r,l,s){var u=o.default;r.html(u),a.types=n,a.originator=null,a.$watch("configuration",function(e,t){angular.equals(e,t)||s.$setViewValue(a.configuration)}),s.$render=function(){a.configuration=s.$viewValue,a.configuration.originatorId&&a.configuration.originatorType?a.originator={id:a.configuration.originatorId,entityType:a.configuration.originatorType}:a.originator=null,a.$watch("originator",function(e,t){angular.equals(e,t)||(a.originator?(s.$viewValue.originatorId=a.originator.id,s.$viewValue.originatorType=a.originator.entityType):(s.$viewValue.originatorId=null,s.$viewValue.originatorType=null))},!0)},a.testScript=function(e){var n=angular.copy(a.configuration.jsScript);i.testNodeScript(e,n,"generate",t.instant("tb.rulenode.generator")+"","Generate",["prevMsg","prevMetadata","prevMsgType"],a.ruleNodeId).then(function(e){a.configuration.jsScript=e,s.$setDirty()})},e(r.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:a}}a.$inject=["$compile","$translate","types","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a,n(1);var r=n(12),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e -}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(65),r=i(a),o=n(46),l=i(o),s=n(51),u=i(s),d=n(48),c=i(d),m=n(47),g=i(m),p=n(54),f=i(p),b=n(60),v=i(b),y=n(61),q=i(y),h=n(59),$=i(h),x=n(53),k=i(x),T=n(63),C=i(T),w=n(64),M=i(w),S=n(58),_=i(S),N=n(55),E=i(N),P=n(62),V=i(P),F=n(57),j=i(F),A=n(56),I=i(A),O=n(45),D=i(O),K=n(66),R=i(K),U=n(50),L=i(U),z=n(49),B=i(z);t.default=angular.module("thingsboard.ruleChain.config.action",[]).directive("tbActionNodeTimeseriesConfig",r.default).directive("tbActionNodeAttributesConfig",l.default).directive("tbActionNodeGeneratorConfig",u.default).directive("tbActionNodeCreateAlarmConfig",c.default).directive("tbActionNodeClearAlarmConfig",g.default).directive("tbActionNodeLogConfig",f.default).directive("tbActionNodeRpcReplyConfig",v.default).directive("tbActionNodeRpcRequestConfig",q.default).directive("tbActionNodeRestApiCallConfig",$.default).directive("tbActionNodeKafkaConfig",k.default).directive("tbActionNodeSnsConfig",C.default).directive("tbActionNodeSqsConfig",M.default).directive("tbActionNodeRabbitMqConfig",_.default).directive("tbActionNodeMqttConfig",E.default).directive("tbActionNodeSendEmailConfig",V.default).directive("tbActionNodeMsgDelayConfig",j.default).directive("tbActionNodeMsgCountConfig",I.default).directive("tbActionNodeAssignToCustomerConfig",D.default).directive("tbActionNodeUnAssignToCustomerConfig",R.default).directive("tbActionNodeDeleteRelationConfig",L.default).directive("tbActionNodeCreateRelationConfig",B.default).name},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.ackValues=["all","-1","0","1"],t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(13),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){var s=o.default;a.html(s),i.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(i.configuration)}),l.$render=function(){i.configuration=l.$viewValue},i.testScript=function(e){var a=angular.copy(i.configuration.jsScript);n.testNodeScript(e,a,"string",t.instant("tb.rulenode.to-string")+"","ToString",["msg","metadata","msgType"],i.ruleNodeId).then(function(e){i.configuration.jsScript=e,l.$setDirty()})},e(a.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:i}}a.$inject=["$compile","$translate","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(14),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){var s=o.default;a.html(s),i.$mdExpansionPanel=t,i.ruleNodeTypes=n,i.credentialsTypeChanged=function(){var e=i.configuration.credentials.type;i.configuration.credentials={},i.configuration.credentials.type=e,i.updateValidity()},i.certFileAdded=function(e,t){var n=new FileReader;n.onload=function(n){i.$apply(function(){if(n.target.result){l.$setDirty();var a=n.target.result;a&&a.length>0&&("caCert"==t&&(i.configuration.credentials.caCertFileName=e.name,i.configuration.credentials.caCert=a),"privateKey"==t&&(i.configuration.credentials.privateKeyFileName=e.name,i.configuration.credentials.privateKey=a),"Cert"==t&&(i.configuration.credentials.certFileName=e.name,i.configuration.credentials.cert=a)),i.updateValidity()}})},n.readAsText(e.file)},i.clearCertFile=function(e){l.$setDirty(),"caCert"==e&&(i.configuration.credentials.caCertFileName=null,i.configuration.credentials.caCert=null),"privateKey"==e&&(i.configuration.credentials.privateKeyFileName=null,i.configuration.credentials.privateKey=null),"Cert"==e&&(i.configuration.credentials.certFileName=null,i.configuration.credentials.cert=null),i.updateValidity()},i.updateValidity=function(){var e=!0,t=i.configuration.credentials;t.type==n.mqttCredentialTypes["cert.PEM"].value&&(t.caCert&&t.cert&&t.privateKey||(e=!1)),l.$setValidity("Certs",e)},i.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(i.configuration)}),l.$render=function(){i.configuration=l.$viewValue},e(a.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:i}}a.$inject=["$compile","$mdExpansionPanel","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a,n(2);var r=n(15),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(16),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(17),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.messageProperties=[null,"BASIC","TEXT_PLAIN","MINIMAL_BASIC","MINIMAL_PERSISTENT_BASIC","PERSISTENT_BASIC","PERSISTENT_TEXT_PLAIN"],t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(18),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(19),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(20),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(21),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.smtpProtocols=["smtp","smtps"],t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(22),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(23),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:n}}a.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(24),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(25),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(26),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("query",function(e,t){angular.equals(e,t)||r.$setViewValue(n.query)}),r.$render=function(){n.query=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(27),o=i(r)},function(e,t){"use strict";function n(e){var t=function(t,n,i,a){n.html("
"),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}n.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(28),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l);var s=186;n.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,s],n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","$mdConstant"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(29),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){var s=o.default;a.html(s);var u=186;i.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,u],i.ruleNodeTypes=n,i.aggPeriodTimeUnits={},i.aggPeriodTimeUnits.MINUTES=n.timeUnit.MINUTES,i.aggPeriodTimeUnits.HOURS=n.timeUnit.HOURS,i.aggPeriodTimeUnits.DAYS=n.timeUnit.DAYS,i.aggPeriodTimeUnits.MILLISECONDS=n.timeUnit.MILLISECONDS,i.aggPeriodTimeUnits.SECONDS=n.timeUnit.SECONDS,i.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(i.configuration)}),l.$render=function(){i.configuration=l.$viewValue},e(a.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{},link:i}}a.$inject=["$compile","$mdConstant","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(30),o=i(r);n(3)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(73),r=i(a),o=n(74),l=i(o),s=n(70),u=i(s),d=n(75),c=i(d),m=n(69),g=i(m),p=n(76),f=i(p),b=n(71),v=i(b);t.default=angular.module("thingsboard.ruleChain.config.enrichment",[]).directive("tbEnrichmentNodeOriginatorAttributesConfig",r.default).directive("tbEnrichmentNodeOriginatorFieldsConfig",l.default).directive("tbEnrichmentNodeDeviceAttributesConfig",u.default).directive("tbEnrichmentNodeRelatedAttributesConfig",c.default).directive("tbEnrichmentNodeCustomerAttributesConfig",g.default).directive("tbEnrichmentNodeTenantAttributesConfig",f.default).directive("tbEnrichmentNodeGetTelemetryFromDatabase",v.default).name},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l);var s=186;n.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,s],n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","$mdConstant"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(31),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(32),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(33),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(34),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(35),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(81),r=i(a),o=n(79),l=i(o),s=n(82),u=i(s),d=n(77),c=i(d),m=n(80),g=i(m);t.default=angular.module("thingsboard.ruleChain.config.filter",[]).directive("tbFilterNodeScriptConfig",r.default).directive("tbFilterNodeMessageTypeConfig",l.default).directive("tbFilterNodeSwitchConfig",u.default).directive("tbFilterNodeCheckRelationConfig",c.default).directive("tbFilterNodeOriginatorTypeConfig",g.default).name},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){function s(){if(l.$viewValue){for(var e=[],t=0;t-1&&t.kvList.splice(e,1)}function l(){t.kvList||(t.kvList=[]),t.kvList.push({key:"",value:""})}function s(){var e={};t.kvList.forEach(function(t){t.key&&(e[t.key]=t.value)}),a.$setViewValue(e),u()}function u(){var e=!0;t.required&&!t.kvList.length&&(e=!1),a.$setValidity("kvMap",e)}var d=o.default;n.html(d),t.ngModelCtrl=a,t.removeKeyVal=r,t.addKeyVal=l,t.kvList=[],t.$watch("query",function(e,n){angular.equals(e,n)||a.$setViewValue(t.query)}),a.$render=function(){if(a.$viewValue){var e=a.$viewValue;t.kvList.length=0;for(var n in e)t.kvList.push({key:n,value:e[n]})}t.$watch("kvList",function(e,t){angular.equals(e,t)||s()},!0),u()},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{required:"=ngRequired",disabled:"=ngDisabled",requiredText:"=",keyText:"=",keyRequiredText:"=",valText:"=",valRequiredText:"="},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(40),o=i(r);n(5)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("query",function(e,t){angular.equals(e,t)||r.$setViewValue(n.query)}),r.$render=function(){n.query=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(41),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(42),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(85),r=i(a),o=n(87),l=i(o),s=n(88),u=i(s);t.default=angular.module("thingsboard.ruleChain.config.transform",[]).directive("tbTransformationNodeChangeOriginatorConfig",r.default).directive("tbTransformationNodeScriptConfig",l.default).directive("tbTransformationNodeToEmailConfig",u.default).name},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){var s=o.default;a.html(s),i.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(i.configuration)}),l.$render=function(){i.configuration=l.$viewValue},i.testScript=function(e){var a=angular.copy(i.configuration.jsScript);n.testNodeScript(e,a,"update",t.instant("tb.rulenode.transformer")+"","Transform",["msg","metadata","msgType"],i.ruleNodeId).then(function(e){i.configuration.jsScript=e,l.$setDirty()})},e(a.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:i}}a.$inject=["$compile","$translate","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(43),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(44),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(92),r=i(a),o=n(78),l=i(o),s=n(72),u=i(s),d=n(86),c=i(d),m=n(52),g=i(m),p=n(68),f=i(p),b=n(84),v=i(b),y=n(67),q=i(y),h=n(83),$=i(h),x=n(91),k=i(x);t.default=angular.module("thingsboard.ruleChain.config",[r.default,l.default,u.default,c.default,g.default]).directive("tbNodeEmptyConfig",f.default).directive("tbRelationsQueryConfig",v.default).directive("tbDeviceRelationsQueryConfig",q.default).directive("tbKvMapConfig",$.default).config(k.default).name},function(e,t){"use strict";function n(e){var t={tb:{rulenode:{"create-entity-if-not-exists":"Create new entity if not exists","entity-name-pattern":"Name pattern","entity-name-pattern-required":"Name pattern is required","entity-name-pattern-hint":"Name pattern, use ${metaKeyName} to substitute variables from metadata","entity-type-pattern":"Type pattern","entity-type-pattern-required":"Type pattern is required","entity-type-pattern-hint":"Type pattern, use ${metaKeyName} to substitute variables from metadata","entity-cache-expiration":"Entities cache expiration time (sec)","entity-cache-expiration-hint":"Specifies maximum time interval allowed to store found entity records. 0 value means that records will never expire.","entity-cache-expiration-required":"Entities cache expiration time is required.","entity-cache-expiration-range":"Entities cache expiration time should be greater than or equal to 0.","customer-name-pattern":"Customer name pattern","customer-name-pattern-required":"Customer name pattern is required","create-customer-if-not-exists":"Create new customer if not exists","customer-cache-expiration":"Customers cache expiration time (sec)","customer-name-pattern-hint":"Customer name pattern, use ${metaKeyName} to substitute variables from metadata","customer-cache-expiration-hint":"Specifies maximum time interval allowed to store found customer records. 0 value means that records will never expire.","customer-cache-expiration-required":"Customers cache expiration time is required.","customer-cache-expiration-range":"Customers cache expiration time should be greater than or equal to 0.","start-interval":"Start Interval","end-interval":"End Interval","start-interval-time-unit":"Start Interval Time Unit","end-interval-time-unit":"End Interval Time Unit","fetch-mode":"Fetch mode","time-unit-milliseconds":"Milliseconds","time-unit-seconds":"Seconds","time-unit-minutes":"Minutes","time-unit-hours":"Hours","time-unit-days":"Days","time-value-range":"Time value should be in a range from 1 to 2147483647'.","start-interval-value-required":"Start interval value is required.","end-interval-value-required":"End interval value is required.",filter:"Filter",switch:"Switch","message-type":"Message type","message-type-required":"Message type is required.","message-types-filter":"Message types filter","no-message-types-found":"No message types found","no-message-type-matching":"'{{messageType}}' not found.","create-new-message-type":"Create a new one!","message-types-required":"Message types are required.","client-attributes":"Client attributes","shared-attributes":"Shared attributes","server-attributes":"Server attributes","latest-timeseries":"Latest timeseries","relations-query":"Relations query","device-relations-query":"Device relations query","max-relation-level":"Max relation level","unlimited-level":"Unlimited level","latest-telemetry":"Latest telemetry","attr-mapping":"Attributes mapping","source-attribute":"Source attribute","source-attribute-required":"Source attribute is required.","source-telemetry":"Source telemetry","source-telemetry-required":"Source telemetry is required.","target-attribute":"Target attribute","target-attribute-required":"Target attribute is required.","attr-mapping-required":"At least one attribute mapping should be specified.","fields-mapping":"Fields mapping","fields-mapping-required":"At least one field mapping should be specified.","source-field":"Source field","source-field-required":"Source field is required.","originator-source":"Originator source","originator-customer":"Customer","originator-tenant":"Tenant","originator-related":"Related","clone-message":"Clone message",transform:"Transform","default-ttl":"Default TTL in seconds","default-ttl-required":"Default TTL is required.","min-default-ttl-message":"Only 0 minimum TTL is allowed.","message-count":"Message count (0 - unlimited)","message-count-required":"Message count is required.","min-message-count-message":"Only 0 minimum message count is allowed.","period-seconds":"Period in seconds","period-seconds-required":"Period is required.","min-period-seconds-message":"Only 1 second minimum period is allowed.",originator:"Originator","message-body":"Message body","message-metadata":"Message metadata",generate:"Generate","test-generator-function":"Test generator function",generator:"Generator","test-filter-function":"Test filter function","test-switch-function":"Test switch function","test-transformer-function":"Test transformer function",transformer:"Transformer","alarm-create-condition":"Alarm create condition","test-condition-function":"Test condition function","alarm-clear-condition":"Alarm clear condition","alarm-details-builder":"Alarm details builder","test-details-function":"Test details function","alarm-type":"Alarm type","alarm-type-required":"Alarm type is required.","alarm-severity":"Alarm severity","alarm-severity-required":"Alarm severity is required",propagate:"Propagate",condition:"Condition",details:"Details","to-string":"To string","test-to-string-function":"Test to string function","from-template":"From Template","from-template-required":"From Template is required","from-template-hint":"From address template, use ${metaKeyName} to substitute variables from metadata","to-template":"To Template","to-template-required":"To Template is required","mail-address-list-template-hint":"Comma separated address list, use ${metaKeyName} to substitute variables from metadata","cc-template":"Cc Template","bcc-template":"Bcc Template","subject-template":"Subject Template","subject-template-required":"Subject Template is required","subject-template-hint":"Mail subject template, use ${metaKeyName} to substitute variables from metadata","body-template":"Body Template","body-template-required":"Body Template is required","body-template-hint":"Mail body template, use ${metaKeyName} to substitute variables from metadata","request-id-metadata-attribute":"Request Id Metadata attribute name","timeout-sec":"Timeout in seconds","timeout-required":"Timeout is required","min-timeout-message":"Only 0 minimum timeout value is allowed.","endpoint-url-pattern":"Endpoint URL pattern","endpoint-url-pattern-required":"Endpoint URL pattern is required","endpoint-url-pattern-hint":"HTTP URL address pattern, use ${metaKeyName} to substitute variables from metadata","request-method":"Request method",headers:"Headers","headers-hint":"Use ${metaKeyName} in header/value fields to substitute variables from metadata",header:"Header","header-required":"Header is required",value:"Value","value-required":"Value is required","topic-pattern":"Topic pattern","topic-pattern-required":"Topic pattern is required","mqtt-topic-pattern-hint":"MQTT topic pattern, use ${metaKeyName} to substitute variables from metadata","bootstrap-servers":"Bootstrap servers","bootstrap-servers-required":"Bootstrap servers value is required","other-properties":"Other properties",key:"Key","key-required":"Key is required", -retries:"Automatically retry times if fails","min-retries-message":"Only 0 minimum retries is allowed.","batch-size-bytes":"Produces batch size in bytes","min-batch-size-bytes-message":"Only 0 minimum batch size is allowed.","linger-ms":"Time to buffer locally (ms)","min-linger-ms-message":"Only 0 ms minimum value is allowed.","buffer-memory-bytes":"Client buffer max size in bytes","min-buffer-memory-message":"Only 0 minimum buffer size is allowed.",acks:"Number of acknowledgments","key-serializer":"Key serializer","key-serializer-required":"Key serializer is required","value-serializer":"Value serializer","value-serializer-required":"Value serializer is required","topic-arn-pattern":"Topic ARN pattern","topic-arn-pattern-required":"Topic ARN pattern is required","topic-arn-pattern-hint":"Topic ARN pattern, use ${metaKeyName} to substitute variables from metadata","aws-access-key-id":"AWS Access Key ID","aws-access-key-id-required":"AWS Access Key ID is required","aws-secret-access-key":"AWS Secret Access Key","aws-secret-access-key-required":"AWS Secret Access Key is required","aws-region":"AWS Region","aws-region-required":"AWS Region is required","exchange-name-pattern":"Exchange name pattern","routing-key-pattern":"Routing key pattern","message-properties":"Message properties",host:"Host","host-required":"Host is required",port:"Port","port-required":"Port is required","port-range":"Port should be in a range from 1 to 65535.","virtual-host":"Virtual host",username:"Username",password:"Password","automatic-recovery":"Automatic recovery","connection-timeout-ms":"Connection timeout (ms)","min-connection-timeout-ms-message":"Only 0 ms minimum value is allowed.","handshake-timeout-ms":"Handshake timeout (ms)","min-handshake-timeout-ms-message":"Only 0 ms minimum value is allowed.","client-properties":"Client properties","queue-url-pattern":"Queue URL pattern","queue-url-pattern-required":"Queue URL pattern is required","queue-url-pattern-hint":"Queue URL pattern, use ${metaKeyName} to substitute variables from metadata","delay-seconds":"Delay (seconds)","min-delay-seconds-message":"Only 0 seconds minimum value is allowed.","max-delay-seconds-message":"Only 900 seconds maximum value is allowed.",name:"Name","name-required":"Name is required","queue-type":"Queue type","sqs-queue-standard":"Standard","sqs-queue-fifo":"FIFO","message-attributes":"Message attributes","message-attributes-hint":"Use ${metaKeyName} in name/value fields to substitute variables from metadata","connect-timeout":"Connection timeout (sec)","connect-timeout-required":"Connection timeout is required.","connect-timeout-range":"Connection timeout should be in a range from 1 to 200.","client-id":"Client ID","clean-session":"Clean session","enable-ssl":"Enable SSL",credentials:"Credentials","credentials-type":"Credentials type","credentials-type-required":"Credentials type is required.","credentials-anonymous":"Anonymous","credentials-basic":"Basic","credentials-pem":"PEM","username-required":"Username is required.","password-required":"Password is required.","ca-cert":"CA certificate file *","private-key":"Private key file *",cert:"Certificate file *","no-file":"No file selected.","drop-file":"Drop a file or click to select a file to upload.","private-key-password":"Private key password","use-system-smtp-settings":"Use system SMTP settings","use-metadata-interval-patterns":"Use metadata interval patterns","use-message-alarm-data":"Use message alarm data","check-relation-to-specific-entity":"Check relation to specific entity","check-relation-hint":"Checks existence of relation to specific entity or to any entity based on direction and relation type.","delete-relation-to-specific-entity":"Delete relation to specific entity","delete-relation-hint":"Deletes relation from the originator of the incoming message to the specified entity or list of entities based on direction and type.","start-interval-pattern":"Start interval pattern","end-interval-pattern":"End interval pattern","start-interval-pattern-required":"Start interval pattern is required","end-interval-pattern-required":"End interval pattern is required","start-interval-pattern-hint":"Start interval pattern, use ${metaKeyName} to substitute variables from metadata","end-interval-pattern-hint":"End interval pattern, use ${metaKeyName} to substitute variables from metadata","smtp-protocol":"Protocol","smtp-host":"SMTP host","smtp-host-required":"SMTP host is required.","smtp-port":"SMTP port","smtp-port-required":"You must supply a smtp port.","smtp-port-range":"SMTP port should be in a range from 1 to 65535.","timeout-msec":"Timeout ms","min-timeout-msec-message":"Only 0 ms minimum value is allowed.","enter-username":"Enter username","enter-password":"Enter password","enable-tls":"Enable TLS","min-period-0-seconds-message":"Only 0 second minimum period is allowed.","max-pending-messages":"Maximum pending messages","max-pending-messages-required":"Maximum pending messages is required.","max-pending-messages-range":"Maximum pending messages should be in a range from 1 to 100000.","originator-types-filter":"Originator types filter","interval-seconds":"Interval in seconds","interval-seconds-required":"Interval is required.","min-interval-seconds-message":"Only 1 second minimum interval is allowed.","output-timeseries-key-prefix":"Output timeseries key prefix","output-timeseries-key-prefix-required":"Output timeseries key prefix required."},"key-val":{key:"Key",value:"Value","remove-entry":"Remove entry","add-entry":"Add entry"}}};e.translations("en_US",t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){(0,o.default)(e)}a.$inject=["$translateProvider"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(90),o=i(r)},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=angular.module("thingsboard.ruleChain.config.types",[]).constant("ruleNodeTypes",{originatorSource:{CUSTOMER:{name:"tb.rulenode.originator-customer",value:"CUSTOMER"},TENANT:{name:"tb.rulenode.originator-tenant",value:"TENANT"},RELATED:{name:"tb.rulenode.originator-related",value:"RELATED"}},fetchModeType:["FIRST","LAST","ALL"],httpRequestType:["GET","POST","PUT","DELETE"],sqsQueueType:{STANDARD:{name:"tb.rulenode.sqs-queue-standard",value:"STANDARD"},FIFO:{name:"tb.rulenode.sqs-queue-fifo",value:"FIFO"}},timeUnit:{MILLISECONDS:{value:"MILLISECONDS",name:"tb.rulenode.time-unit-milliseconds"},SECONDS:{value:"SECONDS",name:"tb.rulenode.time-unit-seconds"},MINUTES:{value:"MINUTES",name:"tb.rulenode.time-unit-minutes"},HOURS:{value:"HOURS",name:"tb.rulenode.time-unit-hours"},DAYS:{value:"DAYS",name:"tb.rulenode.time-unit-days"}},mqttCredentialTypes:{anonymous:{value:"anonymous",name:"tb.rulenode.credentials-anonymous"},basic:{value:"basic",name:"tb.rulenode.credentials-basic"},"cert.PEM":{value:"cert.PEM",name:"tb.rulenode.credentials-pem"}}}).name}])); +!function(e){function t(a){if(n[a])return n[a].exports;var i=n[a]={exports:{},id:a,loaded:!1};return e[a].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="/static/",t(0)}(function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))switch(typeof e[t]){case"function":break;case"object":e[t]=function(t){var n=t.slice(1),a=e[t[0]];return function(e,t,i){a.apply(this,[e,t,i].concat(n))}}(e[t]);break;default:e[t]=e[e[t]]}return e}([function(e,t,n){e.exports=n(91)},function(e,t){},1,1,1,1,function(e,t){e.exports="
tb.rulenode.customer-name-pattern-required
tb.rulenode.customer-name-pattern-hint
{{ 'tb.rulenode.create-customer-if-not-exists' | translate }}
tb.rulenode.customer-cache-expiration-required
tb.rulenode.customer-cache-expiration-range
tb.rulenode.customer-cache-expiration-hint
"},function(e,t){e.exports='
{{scope.name | translate}}
'},function(e,t){e.exports="
{{ 'tb.rulenode.test-details-function' | translate }}
tb.rulenode.alarm-type-required
"},function(e,t){e.exports="
{{ 'tb.rulenode.test-details-function' | translate }}
{{ 'tb.rulenode.use-message-alarm-data' | translate }}
tb.rulenode.alarm-type-required
{{ severity.name | translate}}
tb.rulenode.alarm-severity-required
{{ 'tb.rulenode.propagate' | translate }}
"},function(e,t){e.exports="
{{ ('relation.search-direction.' + direction) | translate}}
tb.rulenode.entity-name-pattern-required
tb.rulenode.entity-name-pattern-hint
tb.rulenode.entity-type-pattern-required
tb.rulenode.entity-type-pattern-hint
{{ 'tb.rulenode.create-entity-if-not-exists' | translate }}
tb.rulenode.entity-cache-expiration-required
tb.rulenode.entity-cache-expiration-range
tb.rulenode.entity-cache-expiration-hint
"},function(e,t){e.exports="
{{ 'tb.rulenode.delete-relation-to-specific-entity' | translate }}
tb.rulenode.delete-relation-hint
{{ ('relation.search-direction.' + direction) | translate}}
tb.rulenode.entity-name-pattern-required
tb.rulenode.entity-name-pattern-hint
tb.rulenode.entity-cache-expiration-required
tb.rulenode.entity-cache-expiration-range
tb.rulenode.entity-cache-expiration-hint
"},function(e,t){e.exports="
tb.rulenode.message-count-required
tb.rulenode.min-message-count-message
tb.rulenode.period-seconds-required
tb.rulenode.min-period-seconds-message
{{ 'tb.rulenode.test-generator-function' | translate }}
"},function(e,t){e.exports='
tb.rulenode.topic-pattern-required
tb.rulenode.bootstrap-servers-required
tb.rulenode.min-retries-message
tb.rulenode.min-batch-size-bytes-message
tb.rulenode.min-linger-ms-message
tb.rulenode.min-buffer-memory-bytes-message
{{ ackValue }}
tb.rulenode.key-serializer-required
tb.rulenode.value-serializer-required
'},function(e,t){e.exports="
{{ 'tb.rulenode.test-to-string-function' | translate }}
"},function(e,t){e.exports='
tb.rulenode.topic-pattern-required
tb.rulenode.mqtt-topic-pattern-hint
tb.rulenode.host-required
tb.rulenode.port-required
tb.rulenode.port-range
tb.rulenode.port-range
tb.rulenode.connect-timeout-required
tb.rulenode.connect-timeout-range
tb.rulenode.connect-timeout-range
{{ \'tb.rulenode.clean-session\' | translate }} {{ \'tb.rulenode.enable-ssl\' | translate }}
{{ \'tb.rulenode.credentials\' | translate }}
{{ ruleNodeTypes.mqttCredentialTypes[configuration.credentials.type].name | translate }}
{{ \'tb.rulenode.credentials\' | translate }}
{{ ruleNodeTypes.mqttCredentialTypes[configuration.credentials.type].name | translate }}
{{credentialsValue.name | translate}}
tb.rulenode.credentials-type-required
tb.rulenode.username-required
tb.rulenode.password-required
'},function(e,t){e.exports="
tb.rulenode.interval-seconds-required
tb.rulenode.min-interval-seconds-message
tb.rulenode.output-timeseries-key-prefix-required
"},function(e,t){e.exports="
tb.rulenode.period-seconds-required
tb.rulenode.min-period-0-seconds-message
tb.rulenode.max-pending-messages-required
tb.rulenode.max-pending-messages-range
tb.rulenode.max-pending-messages-range
"},function(e,t){e.exports='
{{ property }}
tb.rulenode.host-required
tb.rulenode.port-required
tb.rulenode.port-range
tb.rulenode.port-range
{{ \'tb.rulenode.automatic-recovery\' | translate }}
tb.rulenode.min-connection-timeout-ms-message
tb.rulenode.min-handshake-timeout-ms-message
'},function(e,t){e.exports='
tb.rulenode.endpoint-url-pattern-required
tb.rulenode.endpoint-url-pattern-hint
{{ type }}
tb.rulenode.headers-hint
'},function(e,t){e.exports="
"},function(e,t){e.exports="
tb.rulenode.timeout-required
tb.rulenode.min-timeout-message
"},function(e,t){e.exports='
{{ \'tb.rulenode.use-system-smtp-settings\' | translate }}
{{smtpProtocol.toUpperCase()}}
tb.rulenode.smtp-host-required
tb.rulenode.smtp-port-required
tb.rulenode.smtp-port-range
tb.rulenode.smtp-port-range
tb.rulenode.timeout-required
tb.rulenode.min-timeout-msec-message
{{ \'tb.rulenode.enable-tls\' | translate }}
'; +},function(e,t){e.exports="
tb.rulenode.topic-arn-pattern-required
tb.rulenode.topic-arn-pattern-hint
tb.rulenode.aws-access-key-id-required
tb.rulenode.aws-secret-access-key-required
tb.rulenode.aws-region-required
"},function(e,t){e.exports='
{{ type.name | translate }}
tb.rulenode.queue-url-pattern-required
tb.rulenode.queue-url-pattern-hint
tb.rulenode.min-delay-seconds-message
tb.rulenode.max-delay-seconds-message
tb.rulenode.message-attributes-hint
tb.rulenode.aws-access-key-id-required
tb.rulenode.aws-secret-access-key-required
tb.rulenode.aws-region-required
'},function(e,t){e.exports="
tb.rulenode.default-ttl-required
tb.rulenode.min-default-ttl-message
"},function(e,t){e.exports="
tb.rulenode.customer-name-pattern-required
tb.rulenode.customer-name-pattern-hint
tb.rulenode.customer-cache-expiration-required
tb.rulenode.customer-cache-expiration-range
tb.rulenode.customer-cache-expiration-hint
"},function(e,t){e.exports='
{{ (\'relation.search-direction.\' + direction) | translate}}
relation.relation-type
device.device-types
'},function(e,t){e.exports="
{{ 'tb.rulenode.latest-telemetry' | translate }}
"},function(e,t){e.exports='
'},function(e,t){e.exports='
{{ type }} {{ \'tb.rulenode.use-metadata-interval-patterns\' | translate }}
tb.rulenode.use-metadata-interval-patterns-hint
tb.rulenode.start-interval-value-required
tb.rulenode.time-value-range
tb.rulenode.time-value-range
{{timeUnit.name | translate}}
tb.rulenode.end-interval-value-required
tb.rulenode.time-value-range
tb.rulenode.time-value-range
{{timeUnit.name | translate}}
tb.rulenode.start-interval-pattern-required
tb.rulenode.start-interval-pattern-hint
tb.rulenode.end-interval-pattern-required
tb.rulenode.end-interval-pattern-hint
'},function(e,t){e.exports='
'},function(e,t){e.exports='
'},function(e,t){e.exports="
{{ 'tb.rulenode.latest-telemetry' | translate }}
"},28,function(e,t){e.exports='
{{ \'tb.rulenode.check-all-keys\' | translate }}
tb.rulenode.check-all-keys-hint
'},function(e,t){e.exports="
{{ 'tb.rulenode.check-relation-to-specific-entity' | translate }}
tb.rulenode.check-relation-hint
{{ ('relation.search-direction.' + direction) | translate}}
"},function(e,t){e.exports='
{{item}}
tb.rulenode.no-message-types-found
tb.rulenode.no-message-type-matching tb.rulenode.create-new-message-type
{{$chip.name}}
'},function(e,t){e.exports='
'},function(e,t){e.exports="
{{ 'tb.rulenode.test-filter-function' | translate }}
"},function(e,t){e.exports="
{{ 'tb.rulenode.test-switch-function' | translate }}
"},function(e,t){e.exports='
{{ keyText }} {{ valText }}  
{{keyRequiredText}}
{{valRequiredText}}
{{ \'tb.key-val.remove-entry\' | translate }} close
{{ \'tb.key-val.add-entry\' | translate }} add {{ \'action.add\' | translate }}
'},function(e,t){e.exports="
{{ ('relation.search-direction.' + direction) | translate}}
relation.relation-filters
"},function(e,t){e.exports='
{{ source.name | translate}}
'},function(e,t){e.exports="
{{ 'tb.rulenode.test-transformer-function' | translate }}
"},function(e,t){e.exports="
tb.rulenode.from-template-required
tb.rulenode.from-template-hint
tb.rulenode.to-template-required
tb.rulenode.mail-address-list-template-hint
tb.rulenode.mail-address-list-template-hint
tb.rulenode.mail-address-list-template-hint
tb.rulenode.subject-template-required
tb.rulenode.subject-template-hint
tb.rulenode.body-template-required
tb.rulenode.body-template-hint
"},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(6),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(7),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n,a){var i=function(i,r,l,s){var u=o.default;r.html(u),i.types=n,i.$watch("configuration",function(e,t){angular.equals(e,t)||s.$setViewValue(i.configuration)}),s.$render=function(){i.configuration=s.$viewValue},i.testDetailsBuildJs=function(e){var n=angular.copy(i.configuration.alarmDetailsBuildJs);a.testNodeScript(e,n,"json",t.instant("tb.rulenode.details")+"","Details",["msg","metadata","msgType"],i.ruleNodeId).then(function(e){i.configuration.alarmDetailsBuildJs=e,s.$setDirty()})},e(r.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:i}}i.$inject=["$compile","$translate","types","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(8),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n,a){var i=function(i,r,l,s){var u=o.default;r.html(u),i.types=n,i.$watch("configuration",function(e,t){angular.equals(e,t)||s.$setViewValue(i.configuration)}),s.$render=function(){i.configuration=s.$viewValue},i.testDetailsBuildJs=function(e){var n=angular.copy(i.configuration.alarmDetailsBuildJs);a.testNodeScript(e,n,"json",t.instant("tb.rulenode.details")+"","Details",["msg","metadata","msgType"],i.ruleNodeId).then(function(e){i.configuration.alarmDetailsBuildJs=e,s.$setDirty()})},e(r.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:i}}i.$inject=["$compile","$translate","types","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(9),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(10),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(11),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n,a){var i=function(i,r,l,s){var u=o.default;r.html(u),i.types=n,i.originator=null,i.$watch("configuration",function(e,t){angular.equals(e,t)||s.$setViewValue(i.configuration); +}),s.$render=function(){i.configuration=s.$viewValue,i.configuration.originatorId&&i.configuration.originatorType?i.originator={id:i.configuration.originatorId,entityType:i.configuration.originatorType}:i.originator=null,i.$watch("originator",function(e,t){angular.equals(e,t)||(i.originator?(s.$viewValue.originatorId=i.originator.id,s.$viewValue.originatorType=i.originator.entityType):(s.$viewValue.originatorId=null,s.$viewValue.originatorType=null))},!0)},i.testScript=function(e){var n=angular.copy(i.configuration.jsScript);a.testNodeScript(e,n,"generate",t.instant("tb.rulenode.generator")+"","Generate",["prevMsg","prevMetadata","prevMsgType"],i.ruleNodeId).then(function(e){i.configuration.jsScript=e,s.$setDirty()})},e(r.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:i}}i.$inject=["$compile","$translate","types","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i,n(1);var r=n(12),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(66),r=a(i),o=n(47),l=a(o),s=n(52),u=a(s),d=n(49),c=a(d),m=n(48),g=a(m),p=n(55),f=a(p),b=n(61),v=a(b),y=n(62),h=a(y),q=n(60),$=a(q),k=n(54),x=a(k),T=n(64),C=a(T),w=n(65),M=a(w),_=n(59),S=a(_),N=n(56),E=a(N),V=n(63),P=a(V),F=n(58),j=a(F),A=n(57),O=a(A),I=n(46),K=a(I),D=n(67),R=a(D),U=n(51),L=a(U),z=n(50),B=a(z);t.default=angular.module("thingsboard.ruleChain.config.action",[]).directive("tbActionNodeTimeseriesConfig",r.default).directive("tbActionNodeAttributesConfig",l.default).directive("tbActionNodeGeneratorConfig",u.default).directive("tbActionNodeCreateAlarmConfig",c.default).directive("tbActionNodeClearAlarmConfig",g.default).directive("tbActionNodeLogConfig",f.default).directive("tbActionNodeRpcReplyConfig",v.default).directive("tbActionNodeRpcRequestConfig",h.default).directive("tbActionNodeRestApiCallConfig",$.default).directive("tbActionNodeKafkaConfig",x.default).directive("tbActionNodeSnsConfig",C.default).directive("tbActionNodeSqsConfig",M.default).directive("tbActionNodeRabbitMqConfig",S.default).directive("tbActionNodeMqttConfig",E.default).directive("tbActionNodeSendEmailConfig",P.default).directive("tbActionNodeMsgDelayConfig",j.default).directive("tbActionNodeMsgCountConfig",O.default).directive("tbActionNodeAssignToCustomerConfig",K.default).directive("tbActionNodeUnAssignToCustomerConfig",R.default).directive("tbActionNodeDeleteRelationConfig",L.default).directive("tbActionNodeCreateRelationConfig",B.default).name},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.ackValues=["all","-1","0","1"],t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(13),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var a=function(a,i,r,l){var s=o.default;i.html(s),a.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(a.configuration)}),l.$render=function(){a.configuration=l.$viewValue},a.testScript=function(e){var i=angular.copy(a.configuration.jsScript);n.testNodeScript(e,i,"string",t.instant("tb.rulenode.to-string")+"","ToString",["msg","metadata","msgType"],a.ruleNodeId).then(function(e){a.configuration.jsScript=e,l.$setDirty()})},e(i.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:a}}i.$inject=["$compile","$translate","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(14),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var a=function(a,i,r,l){var s=o.default;i.html(s),a.$mdExpansionPanel=t,a.ruleNodeTypes=n,a.credentialsTypeChanged=function(){var e=a.configuration.credentials.type;a.configuration.credentials={},a.configuration.credentials.type=e,a.updateValidity()},a.certFileAdded=function(e,t){var n=new FileReader;n.onload=function(n){a.$apply(function(){if(n.target.result){l.$setDirty();var i=n.target.result;i&&i.length>0&&("caCert"==t&&(a.configuration.credentials.caCertFileName=e.name,a.configuration.credentials.caCert=i),"privateKey"==t&&(a.configuration.credentials.privateKeyFileName=e.name,a.configuration.credentials.privateKey=i),"Cert"==t&&(a.configuration.credentials.certFileName=e.name,a.configuration.credentials.cert=i)),a.updateValidity()}})},n.readAsText(e.file)},a.clearCertFile=function(e){l.$setDirty(),"caCert"==e&&(a.configuration.credentials.caCertFileName=null,a.configuration.credentials.caCert=null),"privateKey"==e&&(a.configuration.credentials.privateKeyFileName=null,a.configuration.credentials.privateKey=null),"Cert"==e&&(a.configuration.credentials.certFileName=null,a.configuration.credentials.cert=null),a.updateValidity()},a.updateValidity=function(){var e=!0,t=a.configuration.credentials;t.type==n.mqttCredentialTypes["cert.PEM"].value&&(t.caCert&&t.cert&&t.privateKey||(e=!1)),l.$setValidity("Certs",e)},a.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(a.configuration)}),l.$render=function(){a.configuration=l.$viewValue},e(i.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:a}}i.$inject=["$compile","$mdExpansionPanel","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i,n(2);var r=n(15),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(16),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(17),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.messageProperties=[null,"BASIC","TEXT_PLAIN","MINIMAL_BASIC","MINIMAL_PERSISTENT_BASIC","PERSISTENT_BASIC","PERSISTENT_TEXT_PLAIN"],t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(18),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(19),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(20),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(21),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.smtpProtocols=["smtp","smtps"],t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(22),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(23),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:n}}i.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(24),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(25),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(26),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.types=t,n.$watch("query",function(e,t){angular.equals(e,t)||r.$setViewValue(n.query)}),r.$render=function(){n.query=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(27),o=a(r)},function(e,t){"use strict";function n(e){var t=function(t,n,a,i){n.html("
"),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}n.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(28),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l);var s=186;n.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,s],n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","$mdConstant"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(29),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var a=function(a,i,r,l){var s=o.default;i.html(s);var u=186;a.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,u],a.ruleNodeTypes=n,a.aggPeriodTimeUnits={},a.aggPeriodTimeUnits.MINUTES=n.timeUnit.MINUTES,a.aggPeriodTimeUnits.HOURS=n.timeUnit.HOURS,a.aggPeriodTimeUnits.DAYS=n.timeUnit.DAYS,a.aggPeriodTimeUnits.MILLISECONDS=n.timeUnit.MILLISECONDS,a.aggPeriodTimeUnits.SECONDS=n.timeUnit.SECONDS,a.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(a.configuration)}),l.$render=function(){a.configuration=l.$viewValue},e(i.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{},link:a}}i.$inject=["$compile","$mdConstant","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(30),o=a(r);n(3)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(74),r=a(i),o=n(75),l=a(o),s=n(71),u=a(s),d=n(76),c=a(d),m=n(70),g=a(m),p=n(77),f=a(p),b=n(72),v=a(b);t.default=angular.module("thingsboard.ruleChain.config.enrichment",[]).directive("tbEnrichmentNodeOriginatorAttributesConfig",r.default).directive("tbEnrichmentNodeOriginatorFieldsConfig",l.default).directive("tbEnrichmentNodeDeviceAttributesConfig",u.default).directive("tbEnrichmentNodeRelatedAttributesConfig",c.default).directive("tbEnrichmentNodeCustomerAttributesConfig",g.default).directive("tbEnrichmentNodeTenantAttributesConfig",f.default).directive("tbEnrichmentNodeGetTelemetryFromDatabase",v.default).name},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l);var s=186;n.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,s],n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","$mdConstant"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(31),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(32),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(33),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(34),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l);var s=186;n.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,s],n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","$mdConstant"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(35),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(36),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(83),r=a(i),o=n(81),l=a(o),s=n(84),u=a(s),d=n(79),c=a(d),m=n(82),g=a(m),p=n(78),f=a(p);t.default=angular.module("thingsboard.ruleChain.config.filter",[]).directive("tbFilterNodeScriptConfig",r.default).directive("tbFilterNodeMessageTypeConfig",l.default).directive("tbFilterNodeSwitchConfig",u.default).directive("tbFilterNodeCheckRelationConfig",c.default).directive("tbFilterNodeOriginatorTypeConfig",g.default).directive("tbFilterNodeCheckMessageConfig",f.default).name},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var a=function(a,i,r,l){function s(){if(l.$viewValue){for(var e=[],t=0;t-1&&t.kvList.splice(e,1)}function l(){t.kvList||(t.kvList=[]),t.kvList.push({key:"",value:""})}function s(){var e={};t.kvList.forEach(function(t){t.key&&(e[t.key]=t.value)}),i.$setViewValue(e),u()}function u(){var e=!0;t.required&&!t.kvList.length&&(e=!1),i.$setValidity("kvMap",e)}var d=o.default;n.html(d),t.ngModelCtrl=i,t.removeKeyVal=r,t.addKeyVal=l,t.kvList=[],t.$watch("query",function(e,n){angular.equals(e,n)||i.$setViewValue(t.query)}),i.$render=function(){if(i.$viewValue){var e=i.$viewValue;t.kvList.length=0;for(var n in e)t.kvList.push({key:n,value:e[n]})}t.$watch("kvList",function(e,t){angular.equals(e,t)||s()},!0),u()},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{required:"=ngRequired",disabled:"=ngDisabled",requiredText:"=",keyText:"=",keyRequiredText:"=",valText:"=",valRequiredText:"="},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(41),o=a(r);n(5)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.types=t,n.$watch("query",function(e,t){angular.equals(e,t)||r.$setViewValue(n.query)}),r.$render=function(){n.query=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(42),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=function(n,a,i,r){var l=o.default;a.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}i.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(43),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(87),r=a(i),o=n(89),l=a(o),s=n(90),u=a(s);t.default=angular.module("thingsboard.ruleChain.config.transform",[]).directive("tbTransformationNodeChangeOriginatorConfig",r.default).directive("tbTransformationNodeScriptConfig",l.default).directive("tbTransformationNodeToEmailConfig",u.default).name},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var a=function(a,i,r,l){var s=o.default;i.html(s),a.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(a.configuration)}),l.$render=function(){a.configuration=l.$viewValue},a.testScript=function(e){var i=angular.copy(a.configuration.jsScript);n.testNodeScript(e,i,"update",t.instant("tb.rulenode.transformer")+"","Transform",["msg","metadata","msgType"],a.ruleNodeId).then(function(e){a.configuration.jsScript=e,l.$setDirty()})},e(i.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:a}}i.$inject=["$compile","$translate","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(44),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=function(t,n,a,i){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||i.$setViewValue(t.configuration)}),i.$render=function(){t.configuration=i.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}i.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(45),o=a(r)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(94),r=a(i),o=n(80),l=a(o),s=n(73),u=a(s),d=n(88),c=a(d),m=n(53),g=a(m),p=n(69),f=a(p),b=n(86),v=a(b),y=n(68),h=a(y),q=n(85),$=a(q),k=n(93),x=a(k);t.default=angular.module("thingsboard.ruleChain.config",[r.default,l.default,u.default,c.default,g.default]).directive("tbNodeEmptyConfig",f.default).directive("tbRelationsQueryConfig",v.default).directive("tbDeviceRelationsQueryConfig",h.default).directive("tbKvMapConfig",$.default).config(x.default).name},function(e,t){"use strict";function n(e){var t={tb:{rulenode:{"create-entity-if-not-exists":"Create new entity if not exists","entity-name-pattern":"Name pattern","entity-name-pattern-required":"Name pattern is required","entity-name-pattern-hint":"Name pattern, use ${metaKeyName} to substitute variables from metadata","entity-type-pattern":"Type pattern","entity-type-pattern-required":"Type pattern is required","entity-type-pattern-hint":"Type pattern, use ${metaKeyName} to substitute variables from metadata","entity-cache-expiration":"Entities cache expiration time (sec)","entity-cache-expiration-hint":"Specifies maximum time interval allowed to store found entity records. 0 value means that records will never expire.","entity-cache-expiration-required":"Entities cache expiration time is required.","entity-cache-expiration-range":"Entities cache expiration time should be greater than or equal to 0.","customer-name-pattern":"Customer name pattern","customer-name-pattern-required":"Customer name pattern is required","create-customer-if-not-exists":"Create new customer if not exists","customer-cache-expiration":"Customers cache expiration time (sec)","customer-name-pattern-hint":"Customer name pattern, use ${metaKeyName} to substitute variables from metadata","customer-cache-expiration-hint":"Specifies maximum time interval allowed to store found customer records. 0 value means that records will never expire.","customer-cache-expiration-required":"Customers cache expiration time is required.","customer-cache-expiration-range":"Customers cache expiration time should be greater than or equal to 0.","start-interval":"Start Interval","end-interval":"End Interval","start-interval-time-unit":"Start Interval Time Unit","end-interval-time-unit":"End Interval Time Unit","fetch-mode":"Fetch mode","time-unit-milliseconds":"Milliseconds","time-unit-seconds":"Seconds","time-unit-minutes":"Minutes","time-unit-hours":"Hours","time-unit-days":"Days","time-value-range":"Time value should be in a range from 1 to 2147483647'.","start-interval-value-required":"Start interval value is required.","end-interval-value-required":"End interval value is required.",filter:"Filter",switch:"Switch","message-type":"Message type","message-type-required":"Message type is required.","message-types-filter":"Message types filter","no-message-types-found":"No message types found","no-message-type-matching":"'{{messageType}}' not found.","create-new-message-type":"Create a new one!","message-types-required":"Message types are required.","client-attributes":"Client attributes","shared-attributes":"Shared attributes","server-attributes":"Server attributes","latest-timeseries":"Latest timeseries","data-keys":"Message data","metadata-keys":"Message metadata","relations-query":"Relations query","device-relations-query":"Device relations query","max-relation-level":"Max relation level","unlimited-level":"Unlimited level","latest-telemetry":"Latest telemetry","attr-mapping":"Attributes mapping","source-attribute":"Source attribute","source-attribute-required":"Source attribute is required.","source-telemetry":"Source telemetry","source-telemetry-required":"Source telemetry is required.","target-attribute":"Target attribute","target-attribute-required":"Target attribute is required.","attr-mapping-required":"At least one attribute mapping should be specified.","fields-mapping":"Fields mapping","fields-mapping-required":"At least one field mapping should be specified.","source-field":"Source field","source-field-required":"Source field is required.","originator-source":"Originator source","originator-customer":"Customer","originator-tenant":"Tenant","originator-related":"Related","clone-message":"Clone message",transform:"Transform","default-ttl":"Default TTL in seconds","default-ttl-required":"Default TTL is required.","min-default-ttl-message":"Only 0 minimum TTL is allowed.","message-count":"Message count (0 - unlimited)","message-count-required":"Message count is required.","min-message-count-message":"Only 0 minimum message count is allowed.","period-seconds":"Period in seconds","period-seconds-required":"Period is required.","min-period-seconds-message":"Only 1 second minimum period is allowed.",originator:"Originator","message-body":"Message body","message-metadata":"Message metadata",generate:"Generate","test-generator-function":"Test generator function",generator:"Generator","test-filter-function":"Test filter function","test-switch-function":"Test switch function","test-transformer-function":"Test transformer function",transformer:"Transformer","alarm-create-condition":"Alarm create condition","test-condition-function":"Test condition function","alarm-clear-condition":"Alarm clear condition","alarm-details-builder":"Alarm details builder","test-details-function":"Test details function","alarm-type":"Alarm type","alarm-type-required":"Alarm type is required.","alarm-severity":"Alarm severity","alarm-severity-required":"Alarm severity is required",propagate:"Propagate",condition:"Condition",details:"Details","to-string":"To string","test-to-string-function":"Test to string function","from-template":"From Template","from-template-required":"From Template is required","from-template-hint":"From address template, use ${metaKeyName} to substitute variables from metadata","to-template":"To Template","to-template-required":"To Template is required", +"mail-address-list-template-hint":"Comma separated address list, use ${metaKeyName} to substitute variables from metadata","cc-template":"Cc Template","bcc-template":"Bcc Template","subject-template":"Subject Template","subject-template-required":"Subject Template is required","subject-template-hint":"Mail subject template, use ${metaKeyName} to substitute variables from metadata","body-template":"Body Template","body-template-required":"Body Template is required","body-template-hint":"Mail body template, use ${metaKeyName} to substitute variables from metadata","request-id-metadata-attribute":"Request Id Metadata attribute name","timeout-sec":"Timeout in seconds","timeout-required":"Timeout is required","min-timeout-message":"Only 0 minimum timeout value is allowed.","endpoint-url-pattern":"Endpoint URL pattern","endpoint-url-pattern-required":"Endpoint URL pattern is required","endpoint-url-pattern-hint":"HTTP URL address pattern, use ${metaKeyName} to substitute variables from metadata","request-method":"Request method",headers:"Headers","headers-hint":"Use ${metaKeyName} in header/value fields to substitute variables from metadata",header:"Header","header-required":"Header is required",value:"Value","value-required":"Value is required","topic-pattern":"Topic pattern","topic-pattern-required":"Topic pattern is required","mqtt-topic-pattern-hint":"MQTT topic pattern, use ${metaKeyName} to substitute variables from metadata","bootstrap-servers":"Bootstrap servers","bootstrap-servers-required":"Bootstrap servers value is required","other-properties":"Other properties",key:"Key","key-required":"Key is required",retries:"Automatically retry times if fails","min-retries-message":"Only 0 minimum retries is allowed.","batch-size-bytes":"Produces batch size in bytes","min-batch-size-bytes-message":"Only 0 minimum batch size is allowed.","linger-ms":"Time to buffer locally (ms)","min-linger-ms-message":"Only 0 ms minimum value is allowed.","buffer-memory-bytes":"Client buffer max size in bytes","min-buffer-memory-message":"Only 0 minimum buffer size is allowed.",acks:"Number of acknowledgments","key-serializer":"Key serializer","key-serializer-required":"Key serializer is required","value-serializer":"Value serializer","value-serializer-required":"Value serializer is required","topic-arn-pattern":"Topic ARN pattern","topic-arn-pattern-required":"Topic ARN pattern is required","topic-arn-pattern-hint":"Topic ARN pattern, use ${metaKeyName} to substitute variables from metadata","aws-access-key-id":"AWS Access Key ID","aws-access-key-id-required":"AWS Access Key ID is required","aws-secret-access-key":"AWS Secret Access Key","aws-secret-access-key-required":"AWS Secret Access Key is required","aws-region":"AWS Region","aws-region-required":"AWS Region is required","exchange-name-pattern":"Exchange name pattern","routing-key-pattern":"Routing key pattern","message-properties":"Message properties",host:"Host","host-required":"Host is required",port:"Port","port-required":"Port is required","port-range":"Port should be in a range from 1 to 65535.","virtual-host":"Virtual host",username:"Username",password:"Password","automatic-recovery":"Automatic recovery","connection-timeout-ms":"Connection timeout (ms)","min-connection-timeout-ms-message":"Only 0 ms minimum value is allowed.","handshake-timeout-ms":"Handshake timeout (ms)","min-handshake-timeout-ms-message":"Only 0 ms minimum value is allowed.","client-properties":"Client properties","queue-url-pattern":"Queue URL pattern","queue-url-pattern-required":"Queue URL pattern is required","queue-url-pattern-hint":"Queue URL pattern, use ${metaKeyName} to substitute variables from metadata","delay-seconds":"Delay (seconds)","min-delay-seconds-message":"Only 0 seconds minimum value is allowed.","max-delay-seconds-message":"Only 900 seconds maximum value is allowed.",name:"Name","name-required":"Name is required","queue-type":"Queue type","sqs-queue-standard":"Standard","sqs-queue-fifo":"FIFO","message-attributes":"Message attributes","message-attributes-hint":"Use ${metaKeyName} in name/value fields to substitute variables from metadata","connect-timeout":"Connection timeout (sec)","connect-timeout-required":"Connection timeout is required.","connect-timeout-range":"Connection timeout should be in a range from 1 to 200.","client-id":"Client ID","clean-session":"Clean session","enable-ssl":"Enable SSL",credentials:"Credentials","credentials-type":"Credentials type","credentials-type-required":"Credentials type is required.","credentials-anonymous":"Anonymous","credentials-basic":"Basic","credentials-pem":"PEM","username-required":"Username is required.","password-required":"Password is required.","ca-cert":"CA certificate file *","private-key":"Private key file *",cert:"Certificate file *","no-file":"No file selected.","drop-file":"Drop a file or click to select a file to upload.","private-key-password":"Private key password","use-system-smtp-settings":"Use system SMTP settings","use-metadata-interval-patterns":"Use metadata interval patterns","use-metadata-interval-patterns-hint":"If selected, rule node use start and end interval patterns from message metadata assuming that intervals are in the milliseconds.","use-message-alarm-data":"Use message alarm data","check-all-keys":"Check that all selected keys are present","check-all-keys-hint":"If selected checks that all specified keys are present in the message data and metadata.","check-relation-to-specific-entity":"Check relation to specific entity","check-relation-hint":"Checks existence of relation to specific entity or to any entity based on direction and relation type.","delete-relation-to-specific-entity":"Delete relation to specific entity","delete-relation-hint":"Deletes relation from the originator of the incoming message to the specified entity or list of entities based on direction and type.","start-interval-pattern":"Start interval pattern","end-interval-pattern":"End interval pattern","start-interval-pattern-required":"Start interval pattern is required","end-interval-pattern-required":"End interval pattern is required","start-interval-pattern-hint":"Start interval pattern, use ${metaKeyName} to substitute variables from metadata","end-interval-pattern-hint":"End interval pattern, use ${metaKeyName} to substitute variables from metadata","smtp-protocol":"Protocol","smtp-host":"SMTP host","smtp-host-required":"SMTP host is required.","smtp-port":"SMTP port","smtp-port-required":"You must supply a smtp port.","smtp-port-range":"SMTP port should be in a range from 1 to 65535.","timeout-msec":"Timeout ms","min-timeout-msec-message":"Only 0 ms minimum value is allowed.","enter-username":"Enter username","enter-password":"Enter password","enable-tls":"Enable TLS","min-period-0-seconds-message":"Only 0 second minimum period is allowed.","max-pending-messages":"Maximum pending messages","max-pending-messages-required":"Maximum pending messages is required.","max-pending-messages-range":"Maximum pending messages should be in a range from 1 to 100000.","originator-types-filter":"Originator types filter","interval-seconds":"Interval in seconds","interval-seconds-required":"Interval is required.","min-interval-seconds-message":"Only 1 second minimum interval is allowed.","output-timeseries-key-prefix":"Output timeseries key prefix","output-timeseries-key-prefix-required":"Output timeseries key prefix required."},"key-val":{key:"Key",value:"Value","remove-entry":"Remove entry","add-entry":"Add entry"}}};e.translations("en_US",t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e){(0,o.default)(e)}i.$inject=["$translateProvider"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var r=n(92),o=a(r)},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=angular.module("thingsboard.ruleChain.config.types",[]).constant("ruleNodeTypes",{originatorSource:{CUSTOMER:{name:"tb.rulenode.originator-customer",value:"CUSTOMER"},TENANT:{name:"tb.rulenode.originator-tenant",value:"TENANT"},RELATED:{name:"tb.rulenode.originator-related",value:"RELATED"}},fetchModeType:["FIRST","LAST","ALL"],httpRequestType:["GET","POST","PUT","DELETE"],sqsQueueType:{STANDARD:{name:"tb.rulenode.sqs-queue-standard",value:"STANDARD"},FIFO:{name:"tb.rulenode.sqs-queue-fifo",value:"FIFO"}},timeUnit:{MILLISECONDS:{value:"MILLISECONDS",name:"tb.rulenode.time-unit-milliseconds"},SECONDS:{value:"SECONDS",name:"tb.rulenode.time-unit-seconds"},MINUTES:{value:"MINUTES",name:"tb.rulenode.time-unit-minutes"},HOURS:{value:"HOURS",name:"tb.rulenode.time-unit-hours"},DAYS:{value:"DAYS",name:"tb.rulenode.time-unit-days"}},mqttCredentialTypes:{anonymous:{value:"anonymous",name:"tb.rulenode.credentials-anonymous"},basic:{value:"basic",name:"tb.rulenode.credentials-basic"},"cert.PEM":{value:"cert.PEM",name:"tb.rulenode.credentials-pem"}}}).name}])); //# sourceMappingURL=rulenode-core-config.js.map \ No newline at end of file From 8b273e94740633035e82b358ba552efb90578e89 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Thu, 31 Jan 2019 11:27:45 +0200 Subject: [PATCH 03/12] update TbCheckMessageNode --- .../engine/filter/TbCheckMessageNode.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java index f62d236bf2..1913acaded 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java @@ -33,7 +33,7 @@ import java.util.Map; @Slf4j @RuleNode( type = ComponentType.FILTER, - name = "has Hobotok", + name = "check existence fields", relationTypes = {"True", "False"}, configClazz = TbCheckMessageNodeConfiguration.class, nodeDescription = "Checks the existence of the selected keys from message data and metadata.", @@ -71,9 +71,8 @@ public class TbCheckMessageNode implements TbNode { private boolean allDataKeysExist(TbMsg msg) { if (!messageNamesList.isEmpty()) { - JsonObject data = parser.parse(msg.getData()).getAsJsonObject(); for (String field : messageNamesList) { - if (!data.has(field)) { + if (!toJson(msg).has(field)) { return false; } } @@ -84,9 +83,8 @@ public class TbCheckMessageNode implements TbNode { private boolean atLeastOneDataKeyExist(TbMsg msg) { if (!messageNamesList.isEmpty()) { - JsonObject data = parser.parse(msg.getData()).getAsJsonObject(); for (String field : messageNamesList) { - if (data.has(field)) { + if (toJson(msg).has(field)) { return true; } } @@ -97,9 +95,8 @@ public class TbCheckMessageNode implements TbNode { private boolean allMetadataKeysExist(TbMsg msg) { if (!metadataNamesList.isEmpty()) { - Map metadata = msg.getMetaData().getData(); for (String field : metadataNamesList) { - if (!metadata.containsKey(field)) { + if (!toMap(msg).containsKey(field)) { return false; } } @@ -110,9 +107,8 @@ public class TbCheckMessageNode implements TbNode { private boolean atLeastOneMetadataKeyExist(TbMsg msg) { if (!metadataNamesList.isEmpty()) { - Map metadata = msg.getMetaData().getData(); for (String field : metadataNamesList) { - if (metadata.containsKey(field)) { + if (toMap(msg).containsKey(field)) { return true; } } @@ -121,6 +117,14 @@ public class TbCheckMessageNode implements TbNode { return false; } + private Map toMap(TbMsg msg) { + return msg.getMetaData().getData(); + } + + private JsonObject toJson(TbMsg msg) { + return parser.parse(msg.getData()).getAsJsonObject(); + } + @Override public void destroy() { From 01a20c567c1a5fb82f97aa4a03d467ef5155483b Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Thu, 31 Jan 2019 12:59:07 +0200 Subject: [PATCH 04/12] modify TbCheckMessageNode --- .../engine/filter/TbCheckMessageNode.java | 58 ++++++------------- 1 file changed, 18 insertions(+), 40 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java index 1913acaded..6d93638657 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java @@ -15,8 +15,7 @@ */ package org.thingsboard.rule.engine.filter; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; +import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.TbContext; @@ -43,7 +42,7 @@ import java.util.Map; configDirective = "tbFilterNodeCheckMessageConfig") public class TbCheckMessageNode implements TbNode { - private static final JsonParser parser = new JsonParser(); + private static final Gson gson = new Gson(); private TbCheckMessageNodeConfiguration config; private List messageNamesList; @@ -59,20 +58,22 @@ public class TbCheckMessageNode implements TbNode { @Override public void onMsg(TbContext ctx, TbMsg msg) { try { + Map dataMap = dataToMap(msg); + Map metadataMap = metadataToMap(msg); if (config.isCheckAllKeys()) { - ctx.tellNext(msg, allDataKeysExist(msg) && allMetadataKeysExist(msg) ? "True" : "False"); + ctx.tellNext(msg, allKeysExist(messageNamesList, dataMap) && allKeysExist(metadataNamesList, metadataMap) ? "True" : "False"); } else { - ctx.tellNext(msg, atLeastOneDataKeyExist(msg) || atLeastOneMetadataKeyExist(msg) ? "True" : "False"); + ctx.tellNext(msg, atLeastOneKeyExist(messageNamesList, dataMap) || atLeastOneKeyExist(metadataNamesList, metadataMap) ? "True" : "False"); } } catch (Exception e) { ctx.tellFailure(msg, e); } } - private boolean allDataKeysExist(TbMsg msg) { - if (!messageNamesList.isEmpty()) { - for (String field : messageNamesList) { - if (!toJson(msg).has(field)) { + private boolean allKeysExist(List data, Map map) { + if (!data.isEmpty()) { + for (String field : data) { + if (!map.containsKey(field)) { return false; } } @@ -81,10 +82,10 @@ public class TbCheckMessageNode implements TbNode { return true; } - private boolean atLeastOneDataKeyExist(TbMsg msg) { - if (!messageNamesList.isEmpty()) { - for (String field : messageNamesList) { - if (toJson(msg).has(field)) { + private boolean atLeastOneKeyExist(List data, Map map) { + if (!data.isEmpty()) { + for (String field : data) { + if (map.containsKey(field)) { return true; } } @@ -93,36 +94,13 @@ public class TbCheckMessageNode implements TbNode { return false; } - private boolean allMetadataKeysExist(TbMsg msg) { - if (!metadataNamesList.isEmpty()) { - for (String field : metadataNamesList) { - if (!toMap(msg).containsKey(field)) { - return false; - } - } - return true; - } - return true; - } - - private boolean atLeastOneMetadataKeyExist(TbMsg msg) { - if (!metadataNamesList.isEmpty()) { - for (String field : metadataNamesList) { - if (toMap(msg).containsKey(field)) { - return true; - } - } - return false; - } - return false; - } - - private Map toMap(TbMsg msg) { + private Map metadataToMap(TbMsg msg) { return msg.getMetaData().getData(); } - private JsonObject toJson(TbMsg msg) { - return parser.parse(msg.getData()).getAsJsonObject(); + @SuppressWarnings("unchecked") + private Map dataToMap(TbMsg msg) { ; + return (Map) gson.fromJson(msg.getData(), Map.class); } @Override From e2b9420abd94660aaa5b88dc5955ab45efb0eace Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Fri, 1 Feb 2019 11:56:00 +0200 Subject: [PATCH 05/12] Update TbCheckMessageNode --- .../engine/filter/TbCheckMessageNode.java | 74 ++++++++++++------- 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java index 6d93638657..f1538e0bbb 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java @@ -58,38 +58,66 @@ public class TbCheckMessageNode implements TbNode { @Override public void onMsg(TbContext ctx, TbMsg msg) { try { - Map dataMap = dataToMap(msg); - Map metadataMap = metadataToMap(msg); if (config.isCheckAllKeys()) { - ctx.tellNext(msg, allKeysExist(messageNamesList, dataMap) && allKeysExist(metadataNamesList, metadataMap) ? "True" : "False"); + ctx.tellNext(msg, allKeysData(msg) && allKeysMetadata(msg) ? "True" : "False"); } else { - ctx.tellNext(msg, atLeastOneKeyExist(messageNamesList, dataMap) || atLeastOneKeyExist(metadataNamesList, metadataMap) ? "True" : "False"); + ctx.tellNext(msg, atLeastOneData(msg) || atLeastOneMetadata(msg) ? "True" : "False"); } } catch (Exception e) { ctx.tellFailure(msg, e); } } - private boolean allKeysExist(List data, Map map) { - if (!data.isEmpty()) { - for (String field : data) { - if (!map.containsKey(field)) { - return false; - } + @Override + public void destroy() { + } + + private boolean allKeysData(TbMsg msg) { + if (!messageNamesList.isEmpty()) { + Map dataMap = dataToMap(msg); + return processAllKeys(messageNamesList, dataMap); + } + return true; + } + + private boolean allKeysMetadata(TbMsg msg) { + if (!metadataNamesList.isEmpty()) { + Map metadataMap = metadataToMap(msg); + return processAllKeys(metadataNamesList, metadataMap); + } + return true; + } + + private boolean atLeastOneData(TbMsg msg) { + if (!messageNamesList.isEmpty()) { + Map dataMap = dataToMap(msg); + return processAtLeastOne(messageNamesList, dataMap); + } + return false; + } + + private boolean atLeastOneMetadata(TbMsg msg) { + if (!metadataNamesList.isEmpty()) { + Map metadataMap = metadataToMap(msg); + return processAtLeastOne(metadataNamesList, metadataMap); + } + return false; + } + + private boolean processAllKeys(List data, Map map) { + for (String field : data) { + if (!map.containsKey(field)) { + return false; } - return true; } return true; } - private boolean atLeastOneKeyExist(List data, Map map) { - if (!data.isEmpty()) { - for (String field : data) { - if (map.containsKey(field)) { - return true; - } + private boolean processAtLeastOne(List data, Map map) { + for (String field : data) { + if (map.containsKey(field)) { + return true; } - return false; } return false; } @@ -99,13 +127,9 @@ public class TbCheckMessageNode implements TbNode { } @SuppressWarnings("unchecked") - private Map dataToMap(TbMsg msg) { ; - return (Map) gson.fromJson(msg.getData(), Map.class); - } - - @Override - public void destroy() { - + private Map dataToMap(TbMsg msg) { + ; + return (Map) gson.fromJson(msg.getData(), Map.class); } } \ No newline at end of file From 7f639655ee594085d67c2bfe9bbd879d75b3607d Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Fri, 1 Feb 2019 11:58:02 +0200 Subject: [PATCH 06/12] fix typo --- .../org/thingsboard/rule/engine/filter/TbCheckMessageNode.java | 1 - 1 file changed, 1 deletion(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java index f1538e0bbb..d16538499e 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckMessageNode.java @@ -128,7 +128,6 @@ public class TbCheckMessageNode implements TbNode { @SuppressWarnings("unchecked") private Map dataToMap(TbMsg msg) { - ; return (Map) gson.fromJson(msg.getData(), Map.class); } From 88f11d4322d683c9e530fe0388e253e63fca6bbc Mon Sep 17 00:00:00 2001 From: Sergey Tarnavskiy Date: Fri, 1 Feb 2019 12:12:38 +0200 Subject: [PATCH 07/12] fixed issue with chart-label vertical position --- ui/src/app/widget/lib/flot-widget.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ui/src/app/widget/lib/flot-widget.js b/ui/src/app/widget/lib/flot-widget.js index acaaf10791..5e9130c0af 100644 --- a/ui/src/app/widget/lib/flot-widget.js +++ b/ui/src/app/widget/lib/flot-widget.js @@ -1225,16 +1225,23 @@ export default class TbFlot { if (tooltipHtml) { tbFlot.ctx.tooltip.html(tooltipHtml) - .css({top: pageY+5, left: 0}) + .css({top: 0, left: 0}) .fadeIn(200); var windowWidth = $( window ).width(); //eslint-disable-line + var windowHeight = $( window ).height(); //eslint-disable-line var tooltipWidth = tbFlot.ctx.tooltip.width(); + var tooltipHeight = tbFlot.ctx.tooltip.height(); var left = pageX+5; + var top = pageY+5; if (windowWidth - pageX < tooltipWidth + 50) { left = pageX - tooltipWidth - 10; } + if (windowHeight - pageY < tooltipHeight + 20) { + top = pageY - tooltipHeight - 10; + } tbFlot.ctx.tooltip.css({ + top: top, left: left }); From 54eb3a3e882f1f1e63d2985da6059ec9511ecf63 Mon Sep 17 00:00:00 2001 From: okolesnik Date: Fri, 1 Feb 2019 15:03:04 +0200 Subject: [PATCH 08/12] UI:fix(#1427). "Input" widgets (boolean) save wrong value --- .../main/data/json/system/widget_bundles/input_widgets.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/src/main/data/json/system/widget_bundles/input_widgets.json b/application/src/main/data/json/system/widget_bundles/input_widgets.json index e7f0acf6e4..6dc7f2aad0 100644 --- a/application/src/main/data/json/system/widget_bundles/input_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/input_widgets.json @@ -63,7 +63,7 @@ "resources": [], "templateHtml": "
\n
\n
\n
\n \n {{currentValue}}\n \n
\n
\n\n
\n
\n No attribute is selected\n
\n
\n Timeseries parameter cannot be used in this widget\n
\n
\n
", "templateCss": ".attribute-update-form {\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.entity-title {\n font-weight: bold;\n font-size: 22px;\n padding-top: 12px;\n padding-bottom: 6px;\n color: #666;\n}\n\n.attribute-update-form__grid {\n display: flex;\n}\n.grid__element:first-child {\n flex: 1;\n}\n\n.grid__element {\n display: flex;\n}\n\n.attribute-update-form .md-button.md-icon-button {\n margin: 0;\n}\n\n.attribute-update-form .md-button.md-icon-button {\n width: 32px;\n min-width: 32px;\n height: 32px;\n min-height: 32px;\n padding: 0 !important;\n margin: 0 !important;\n line-height: 20px;\n}\n\n.attribute-update-form .md-icon-button md-icon {\n width: 20px;\n min-width: 20px;\n height: 20px;\n min-height: 20px;\n font-size: 20px;\n}\n\n\nmd-toast{\n min-width: 0;\n}\nmd-toast .md-toast-content {\n font-size: 14px!important;\n}", - "controllerScript": "let $scope;\nlet settings;\nlet attributeService;\nlet toast;\nlet utils;\nlet types;\nlet map;\nlet mapReverse;\n\nself.onInit = function() {\n $scope = self.ctx.$scope;\n attributeService = $scope.$injector.get('attributeService');\n toast = $scope.$injector.get('toast');\n utils = $scope.$injector.get('utils');\n types = $scope.$injector.get('types');\n settings = angular.copy(self.ctx.settings) || {};\n $scope.settings = settings;\n $scope.isValidParameter = true;\n $scope.dataKeyDetected = false;\n $scope.message = 'No entity selected';\n\n settings.trueValue = settings.trueValue || true;\n settings.falseValue = settings.falseValue || false;\n \n map = {\"true\":settings.trueValue, \"false\": settings.falseValue};\n mapReverse = {[settings.trueValue]:\"true\", [settings.falseValue]:\"false\"};\n $scope.checkboxValue = \"false\";\n $scope.currentValue = map[$scope.checkboxValue];\n\n $scope.changed = function () {\n $scope.currentValue = map[$scope.checkboxValue];\n $scope.updateAttribute();\n }\n\n if (self.ctx.datasources && self.ctx.datasources.length) {\n var datasource = self.ctx.datasources[0];\n if (datasource.type === 'entity') {\n if (datasource.entityType && datasource.entityId) {\n $scope.entityName = datasource.entityName;\n if (settings.widgetTitle && settings.widgetTitle.length) {\n $scope.titleTemplate = utils.customTranslation(settings.widgetTitle, settings.widgetTitle);\n } else {\n $scope.titleTemplate = self.ctx.widgetConfig.title;\n }\n\n $scope.entityDetected = true;\n }\n }\n if (datasource.dataKeys.length) {\n if (datasource.dataKeys[0].type != \"attribute\") {\n $scope.isValidParameter = false;\n } else {\n $scope.currentKey = datasource.dataKeys[0].name;\n $scope.dataKeyType = datasource.dataKeys[0].type;\n $scope.dataKeyDetected = true;\n }\n }\n }\n\n self.ctx.widgetTitle = utils.createLabelFromDatasource(self.ctx.datasources[0], $scope.titleTemplate);\n\n $scope.updateAttribute = function () {\n if ($scope.entityDetected) {\n var datasource = self.ctx.datasources[0];\n\n attributeService.saveEntityAttributes(\n datasource.entityType,\n datasource.entityId,\n types.attributesScope.server.value,\n [\n {\n key: $scope.currentKey,\n value: $scope.currentValue\n }\n ]\n ).then(\n function success() {\n $scope.originalValue = $scope.currentValue;\n if (settings.showResultMessage) {\n toast.showSuccess('Update successful', 1000, angular.element(self.ctx.$container), 'bottom left');\n }\n },\n function fail() {\n if (settings.showResultMessage) {\n toast.showError('Update failed', angular.element(self.ctx.$container), 'bottom left');\n }\n }\n );\n }\n };\n}\n\nself.onDataUpdated = function() {\n\n try {\n if ($scope.dataKeyDetected) {\n $scope.checkboxValue = mapReverse[$scope.originalValue = self.ctx.data[0].data[0][1]] || 'false';\n $scope.currentValue = map[$scope.checkboxValue];\n $scope.$digest();\n }\n } catch (e) {\n console.log(e);\n }\n}\n\nself.onResize = function() {\n\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1\n }\n}\n\nself.onDestroy = function() {\n\n}\n", + "controllerScript": "let $scope;\nlet settings;\nlet attributeService;\nlet toast;\nlet utils;\nlet types;\nlet map;\nlet mapReverse;\n\nself.onInit = function() {\n $scope = self.ctx.$scope;\n attributeService = $scope.$injector.get('attributeService');\n toast = $scope.$injector.get('toast');\n utils = $scope.$injector.get('utils');\n types = $scope.$injector.get('types');\n settings = angular.copy(self.ctx.settings) || {};\n $scope.settings = settings;\n $scope.isValidParameter = true;\n $scope.dataKeyDetected = false;\n $scope.message = 'No entity selected';\n\n settings.trueValue = settings.trueValue || true;\n settings.falseValue = settings.falseValue || false;\n\n map = {\"true\":settings.trueValue, \"false\": settings.falseValue};\n mapReverse = {[settings.trueValue]:true, [settings.falseValue]:false};\n $scope.checkboxValue = \"false\";\n $scope.currentValue = map[$scope.checkboxValue];\n\n $scope.changed = function () {\n $scope.currentValue = map[$scope.checkboxValue];\n $scope.updateAttribute();\n }\n\n if (self.ctx.datasources && self.ctx.datasources.length) {\n var datasource = self.ctx.datasources[0];\n if (datasource.type === 'entity') {\n if (datasource.entityType && datasource.entityId) {\n $scope.entityName = datasource.entityName;\n if (settings.widgetTitle && settings.widgetTitle.length) {\n $scope.titleTemplate = utils.customTranslation(settings.widgetTitle, settings.widgetTitle);\n } else {\n $scope.titleTemplate = self.ctx.widgetConfig.title;\n }\n\n $scope.entityDetected = true;\n }\n }\n if (datasource.dataKeys.length) {\n if (datasource.dataKeys[0].type != \"attribute\") {\n $scope.isValidParameter = false;\n } else {\n $scope.currentKey = datasource.dataKeys[0].name;\n $scope.dataKeyType = datasource.dataKeys[0].type;\n $scope.dataKeyDetected = true;\n }\n }\n }\n\n self.ctx.widgetTitle = utils.createLabelFromDatasource(self.ctx.datasources[0], $scope.titleTemplate);\n\n $scope.updateAttribute = function () {\n if ($scope.entityDetected) {\n var datasource = self.ctx.datasources[0];\n\n attributeService.saveEntityAttributes(\n datasource.entityType,\n datasource.entityId,\n types.attributesScope.server.value,\n [\n {\n key: $scope.currentKey,\n value: mapReverse[$scope.currentValue] || false\n }\n ]\n ).then(\n function success() {\n $scope.originalValue = $scope.currentValue;\n if (settings.showResultMessage) {\n toast.showSuccess('Update successful', 1000, angular.element(self.ctx.$container), 'bottom left');\n }\n },\n function fail() {\n if (settings.showResultMessage) {\n toast.showError('Update failed', angular.element(self.ctx.$container), 'bottom left');\n }\n }\n );\n }\n };\n}\n\nself.onDataUpdated = function() {\n try {\n if ($scope.dataKeyDetected) {\n $scope.checkboxValue = ($scope.originalValue = self.ctx.data[0].data[0][1]) || false;\n $scope.currentValue = map[$scope.checkboxValue];\n $scope.$digest();\n }\n } catch (e) {\n console.log(e);\n }\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1\n }\n}\n\nself.onResize = function() {}\nself.onDestroy = function() {}\n", "settingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"EntitiesTableSettings\",\n \"properties\": {\n \"widgetTitle\": {\n \"title\": \"Widget title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"trueValue\": {\n \"title\": \"True value\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"falseValue\": {\n \"title\": \"False value\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"showResultMessage\":{\n \"title\":\"Show result message\",\n \"type\":\"boolean\",\n \"default\":true\n }\n },\n \"required\": []\n },\n \"form\": [\n \"widgetTitle\",\n \"showResultMessage\",\n \"trueValue\",\n \"falseValue\"\n ]\n}", "dataKeySettingsSchema": "{}\n", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{},\"title\":\"Update server boolean attribute\",\"dropShadow\":true,\"enableFullscreen\":false,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}" @@ -127,7 +127,7 @@ "resources": [], "templateHtml": "
\n
\n
\n
\n \n {{currentValue}}\n \n
\n
\n\n
\n
\n No attribute is selected\n
\n
\n Timeseries parameter cannot be used in this widget\n
\n
\n
", "templateCss": ".attribute-update-form {\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.entity-title {\n font-weight: bold;\n font-size: 22px;\n padding-top: 12px;\n padding-bottom: 6px;\n color: #666;\n}\n\n.attribute-update-form__grid {\n display: flex;\n}\n.grid__element:first-child {\n flex: 1;\n}\n.grid__element:last-child {\n margin-top: 19px;\n margin-left: 7px;\n}\n.grid__element {\n display: flex;\n}\n\n.attribute-update-form .md-button.md-icon-button {\n margin: 0;\n}\n\n.attribute-update-form .md-button.md-icon-button {\n width: 32px;\n min-width: 32px;\n height: 32px;\n min-height: 32px;\n padding: 0 !important;\n margin: 0 !important;\n line-height: 20px;\n}\n\n.attribute-update-form .md-icon-button md-icon {\n width: 20px;\n min-width: 20px;\n height: 20px;\n min-height: 20px;\n font-size: 20px;\n}\n\n\nmd-toast{\n min-width: 0;\n}\nmd-toast .md-toast-content {\n font-size: 14px!important;\n}", - "controllerScript": "let $scope;\nlet settings;\nlet attributeService;\nlet toast;\nlet utils;\nlet types;\nlet map;\nlet mapReverse;\n\nself.onInit = function() {\n $scope = self.ctx.$scope;\n attributeService = $scope.$injector.get('attributeService');\n toast = $scope.$injector.get('toast');\n utils = $scope.$injector.get('utils');\n types = $scope.$injector.get('types');\n settings = angular.copy(self.ctx.settings) || {};\n $scope.settings = settings;\n $scope.isValidParameter = true;\n $scope.dataKeyDetected = false;\n $scope.message = 'No entity selected';\n\n settings.trueValue = settings.trueValue || true;\n settings.falseValue = settings.falseValue || false;\n \n map = {\"true\":settings.trueValue, \"false\": settings.falseValue};\n mapReverse = {[settings.trueValue]:\"true\", [settings.falseValue]:\"false\"};\n $scope.checkboxValue = \"false\";\n $scope.currentValue = map[$scope.checkboxValue];\n\n $scope.changed = function () {\n $scope.currentValue = map[$scope.checkboxValue];\n $scope.updateAttribute();\n }\n \n if (self.ctx.datasources && self.ctx.datasources.length) {\n var datasource = self.ctx.datasources[0];\n if (datasource.type === 'entity') {\n if (datasource.entityType === \"DEVICE\") {\n if (datasource.entityType && datasource.entityId) {\n $scope.entityName = datasource.entityName;\n if (settings.widgetTitle && settings.widgetTitle.length) {\n $scope.titleTemplate = utils.customTranslation(settings.widgetTitle, settings.widgetTitle);\n } else {\n $scope.titleTemplate = self.ctx.widgetConfig.title;\n }\n\n $scope.entityDetected = true;\n }\n } else {\n $scope.message = 'Selected entity cannot have shared attributes';\n }\n }\n if (datasource.dataKeys.length) {\n if (datasource.dataKeys[0].type != \"attribute\") {\n $scope.isValidParameter = false;\n } else {\n $scope.currentKey = datasource.dataKeys[0].name;\n $scope.dataKeyType = datasource.dataKeys[0].type;\n $scope.dataKeyDetected = true;\n }\n }\n }\n\n self.ctx.widgetTitle = utils.createLabelFromDatasource(self.ctx.datasources[0], $scope.titleTemplate);\n\n $scope.updateAttribute = function () {\n if ($scope.entityDetected) {\n var datasource = self.ctx.datasources[0];\n\n attributeService.saveEntityAttributes(\n datasource.entityType,\n datasource.entityId,\n types.attributesScope.shared.value,\n [\n {\n key: $scope.currentKey,\n value: $scope.currentValue\n }\n ]\n ).then(\n function success() {\n $scope.originalValue = $scope.currentValue;\n if (settings.showResultMessage) {\n toast.showSuccess('Update successful', 1000, angular.element(self.ctx.$container), 'bottom left');\n }\n },\n function fail() {\n if (settings.showResultMessage) {\n toast.showError('Update failed', angular.element(self.ctx.$container), 'bottom left');\n }\n }\n );\n }\n };\n}\n\nself.onDataUpdated = function() {\n\n try {\n $scope.checkboxValue = mapReverse[$scope.originalValue = self.ctx.data[0].data[0][1]] || 'false';\n $scope.currentValue = map[$scope.checkboxValue];\n $scope.$digest();\n\n } catch (e) {\n console.log(e);\n }\n}\n\nself.onResize = function() {\n\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1\n }\n}\n\nself.onDestroy = function() {\n\n}\n", + "controllerScript": "let $scope;\nlet settings;\nlet attributeService;\nlet toast;\nlet utils;\nlet types;\nlet map;\nlet mapReverse;\n\nself.onInit = function() {\n $scope = self.ctx.$scope;\n attributeService = $scope.$injector.get('attributeService');\n toast = $scope.$injector.get('toast');\n utils = $scope.$injector.get('utils');\n types = $scope.$injector.get('types');\n settings = angular.copy(self.ctx.settings) || {};\n $scope.settings = settings;\n $scope.isValidParameter = true;\n $scope.dataKeyDetected = false;\n $scope.message = 'No entity selected';\n\n settings.trueValue = settings.trueValue || true;\n settings.falseValue = settings.falseValue || false;\n\n map = {\"true\":settings.trueValue, \"false\": settings.falseValue};\n mapReverse = {[settings.trueValue]:true, [settings.falseValue]:false};\n $scope.checkboxValue = \"false\";\n $scope.currentValue = map[$scope.checkboxValue];\n\n $scope.changed = function () {\n $scope.currentValue = map[$scope.checkboxValue];\n $scope.updateAttribute();\n }\n\n if (self.ctx.datasources && self.ctx.datasources.length) {\n var datasource = self.ctx.datasources[0];\n if (datasource.type === 'entity') {\n if (datasource.entityType === \"DEVICE\") {\n if (datasource.entityType && datasource.entityId) {\n $scope.entityName = datasource.entityName;\n if (settings.widgetTitle && settings.widgetTitle.length) {\n $scope.titleTemplate = utils.customTranslation(settings.widgetTitle, settings.widgetTitle);\n } else {\n $scope.titleTemplate = self.ctx.widgetConfig.title;\n }\n\n $scope.entityDetected = true;\n }\n } else {\n $scope.message = 'Selected entity cannot have shared attributes';\n }\n }\n if (datasource.dataKeys.length) {\n if (datasource.dataKeys[0].type != \"attribute\") {\n $scope.isValidParameter = false;\n } else {\n $scope.currentKey = datasource.dataKeys[0].name;\n $scope.dataKeyType = datasource.dataKeys[0].type;\n $scope.dataKeyDetected = true;\n }\n }\n }\n\n self.ctx.widgetTitle = utils.createLabelFromDatasource(self.ctx.datasources[0], $scope.titleTemplate);\n\n $scope.updateAttribute = function () {\n if ($scope.entityDetected) {\n var datasource = self.ctx.datasources[0];\n\n attributeService.saveEntityAttributes(\n datasource.entityType,\n datasource.entityId,\n types.attributesScope.shared.value,\n [\n {\n key: $scope.currentKey,\n value: mapReverse[$scope.currentValue] || false\n }\n ]\n ).then(\n function success() {\n $scope.originalValue = $scope.currentValue;\n if (settings.showResultMessage) {\n toast.showSuccess('Update successful', 1000, angular.element(self.ctx.$container), 'bottom left');\n }\n },\n function fail() {\n if (settings.showResultMessage) {\n toast.showError('Update failed', angular.element(self.ctx.$container), 'bottom left');\n }\n }\n );\n }\n };\n}\n\nself.onDataUpdated = function() {\n try {\n $scope.checkboxValue = ($scope.originalValue = self.ctx.data[0].data[0][1]) || 'false';\n $scope.currentValue = map[$scope.checkboxValue];\n $scope.$digest();\n\n } catch (e) {\n console.log(e);\n }\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1\n }\n}\n\nself.onResize = function() {}\nself.onDestroy = function() {}\n", "settingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"EntitiesTableSettings\",\n \"properties\": {\n \"widgetTitle\": {\n \"title\": \"Widget title\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"trueValue\": {\n \"title\": \"True value\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"falseValue\": {\n \"title\": \"False value\",\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"showResultMessage\":{\n \"title\":\"Show result message\",\n \"type\":\"boolean\",\n \"default\":true\n }\n },\n \"required\": []\n },\n \"form\": [\n \"widgetTitle\",\n \"showResultMessage\",\n \"trueValue\",\n \"falseValue\"\n ]\n}", "dataKeySettingsSchema": "{}\n", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"trueValue\":\"active\",\"falseValue\":\"inactive\"},\"title\":\"Update shared boolean attribute\",\"dropShadow\":true,\"enableFullscreen\":false,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}" From 0fd84dc311a9b4d470ab4549b01c3e1f00ecb5fa Mon Sep 17 00:00:00 2001 From: Maksym Dudnik Date: Fri, 1 Feb 2019 15:08:19 +0200 Subject: [PATCH 09/12] Fix init fit to bounds --- ui/src/app/widget/lib/map-widget2.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/src/app/widget/lib/map-widget2.js b/ui/src/app/widget/lib/map-widget2.js index fed9cb5de8..0c8bafa411 100644 --- a/ui/src/app/widget/lib/map-widget2.js +++ b/ui/src/app/widget/lib/map-widget2.js @@ -539,10 +539,14 @@ export default class TbMapWidgetV2 { } } if (locationsChanged && tbMap.initBounds) { - tbMap.initBounds = !datasources.every( + let dataReceived = datasources.every( function (ds) { return ds.dataReceived === true; }); + let dataValid = dataReceived && dataMap.dsDataMap.every(function (ds) { + return !(!ds[tbMap.locationSettings.latKeyName] && !ds[tbMap.locationSettings.lngKeyName]); + }); + tbMap.initBounds = !dataValid; tbMap.map.fitBounds(bounds); } } From 83a499e00471bb2b3fbdd0076b1c0a4b960c38e3 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 1 Feb 2019 15:18:20 +0200 Subject: [PATCH 10/12] IE fix: String.includes polyfill --- ui/src/app/ie.support.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ui/src/app/ie.support.js b/ui/src/app/ie.support.js index 7f78459433..52b3329468 100644 --- a/ui/src/app/ie.support.js +++ b/ui/src/app/ie.support.js @@ -53,6 +53,19 @@ return result; }; } + if (!String.prototype.includes) { + String.prototype.includes = function(search, start) { + if (angular.isNumber(start)) { + start = 0; + } + + if (start + search.length > this.length) { + return false; + } else { + return this.indexOf(search, start) !== -1; + } + }; + } (function (arr) { arr.forEach(function (item) { From ced63c4e70579f9567e05e1632322f226c7cce19 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 1 Feb 2019 16:39:33 +0200 Subject: [PATCH 11/12] Update License Header year to 2019 --- application/build.gradle | 2 +- application/pom.xml | 2 +- application/src/main/assembly/windows.xml | 2 +- application/src/main/conf/logback.xml | 2 +- application/src/main/conf/thingsboard.conf | 2 +- application/src/main/data/upgrade/1.3.0/schema_update.cql | 2 +- application/src/main/data/upgrade/1.3.1/schema_update.sql | 2 +- application/src/main/data/upgrade/1.4.0/schema_update.cql | 2 +- application/src/main/data/upgrade/1.4.0/schema_update.sql | 2 +- application/src/main/data/upgrade/2.0.0/schema_update.cql | 2 +- application/src/main/data/upgrade/2.0.0/schema_update.sql | 2 +- application/src/main/data/upgrade/2.1.1/schema_update.cql | 2 +- application/src/main/data/upgrade/2.1.1/schema_update.sql | 2 +- application/src/main/data/upgrade/2.1.2/schema_update.cql | 2 +- application/src/main/data/upgrade/2.1.2/schema_update.sql | 2 +- application/src/main/data/upgrade/2.2.0/schema_update.sql | 2 +- .../org/thingsboard/server/ThingsboardInstallApplication.java | 2 +- .../org/thingsboard/server/ThingsboardServerApplication.java | 2 +- .../java/org/thingsboard/server/actors/ActorSystemContext.java | 2 +- .../main/java/org/thingsboard/server/actors/app/AppActor.java | 2 +- .../java/org/thingsboard/server/actors/app/AppInitMsg.java | 2 +- .../java/org/thingsboard/server/actors/device/DeviceActor.java | 2 +- .../thingsboard/server/actors/device/DeviceActorCreator.java | 2 +- .../server/actors/device/DeviceActorMessageProcessor.java | 2 +- .../server/actors/device/DeviceActorToRuleEngineMsg.java | 2 +- .../java/org/thingsboard/server/actors/device/SessionInfo.java | 2 +- .../thingsboard/server/actors/device/SessionInfoMetaData.java | 2 +- .../server/actors/device/SessionTimeoutCheckMsg.java | 2 +- .../server/actors/device/ToDeviceRpcRequestMetadata.java | 2 +- .../server/actors/device/ToServerRpcRequestMetadata.java | 2 +- .../thingsboard/server/actors/rpc/BasicRpcSessionListener.java | 2 +- .../org/thingsboard/server/actors/rpc/RpcBroadcastMsg.java | 2 +- .../org/thingsboard/server/actors/rpc/RpcManagerActor.java | 2 +- .../org/thingsboard/server/actors/rpc/RpcSessionActor.java | 2 +- .../org/thingsboard/server/actors/rpc/RpcSessionClosedMsg.java | 2 +- .../thingsboard/server/actors/rpc/RpcSessionConnectedMsg.java | 2 +- .../server/actors/rpc/RpcSessionCreateRequestMsg.java | 2 +- .../server/actors/rpc/RpcSessionDisconnectedMsg.java | 2 +- .../org/thingsboard/server/actors/rpc/RpcSessionTellMsg.java | 2 +- .../org/thingsboard/server/actors/rpc/SessionActorInfo.java | 2 +- .../thingsboard/server/actors/ruleChain/DefaultTbContext.java | 2 +- .../server/actors/ruleChain/RemoteToRuleChainTellNextMsg.java | 2 +- .../thingsboard/server/actors/ruleChain/RuleChainActor.java | 2 +- .../actors/ruleChain/RuleChainActorMessageProcessor.java | 2 +- .../server/actors/ruleChain/RuleChainManagerActor.java | 2 +- .../server/actors/ruleChain/RuleChainToRuleChainMsg.java | 2 +- .../server/actors/ruleChain/RuleChainToRuleNodeMsg.java | 2 +- .../org/thingsboard/server/actors/ruleChain/RuleNodeActor.java | 2 +- .../server/actors/ruleChain/RuleNodeActorMessageProcessor.java | 2 +- .../org/thingsboard/server/actors/ruleChain/RuleNodeCtx.java | 2 +- .../thingsboard/server/actors/ruleChain/RuleNodeRelation.java | 2 +- .../actors/ruleChain/RuleNodeToRuleChainTellNextMsg.java | 2 +- .../server/actors/ruleChain/RuleNodeToSelfErrorMsg.java | 2 +- .../thingsboard/server/actors/ruleChain/RuleNodeToSelfMsg.java | 2 +- .../org/thingsboard/server/actors/service/ActorService.java | 2 +- .../org/thingsboard/server/actors/service/ComponentActor.java | 2 +- .../thingsboard/server/actors/service/ContextAwareActor.java | 2 +- .../thingsboard/server/actors/service/ContextBasedCreator.java | 2 +- .../thingsboard/server/actors/service/DefaultActorService.java | 2 +- .../server/actors/shared/AbstractContextAwareMsgProcessor.java | 2 +- .../thingsboard/server/actors/shared/ActorTerminationMsg.java | 2 +- .../server/actors/shared/ComponentMsgProcessor.java | 2 +- .../thingsboard/server/actors/shared/EntityActorsManager.java | 2 +- .../server/actors/shared/rulechain/RuleChainManager.java | 2 +- .../server/actors/shared/rulechain/SystemRuleChainManager.java | 2 +- .../server/actors/shared/rulechain/TenantRuleChainManager.java | 2 +- .../java/org/thingsboard/server/actors/stats/StatsActor.java | 2 +- .../org/thingsboard/server/actors/stats/StatsPersistMsg.java | 2 +- .../org/thingsboard/server/actors/stats/StatsPersistTick.java | 2 +- .../java/org/thingsboard/server/actors/tenant/TenantActor.java | 2 +- .../org/thingsboard/server/config/AuditLogLevelProperties.java | 2 +- .../main/java/org/thingsboard/server/config/JwtSettings.java | 2 +- .../java/org/thingsboard/server/config/MvcCorsProperties.java | 2 +- .../thingsboard/server/config/RateLimitProcessingFilter.java | 2 +- .../org/thingsboard/server/config/SwaggerConfiguration.java | 2 +- .../server/config/ThingsboardMessageConfiguration.java | 2 +- .../server/config/ThingsboardSecurityConfiguration.java | 2 +- .../src/main/java/org/thingsboard/server/config/WebConfig.java | 2 +- .../org/thingsboard/server/config/WebSocketConfiguration.java | 2 +- .../org/thingsboard/server/controller/AdminController.java | 2 +- .../org/thingsboard/server/controller/AlarmController.java | 2 +- .../org/thingsboard/server/controller/AssetController.java | 2 +- .../org/thingsboard/server/controller/AuditLogController.java | 2 +- .../java/org/thingsboard/server/controller/AuthController.java | 2 +- .../java/org/thingsboard/server/controller/BaseController.java | 2 +- .../server/controller/ComponentDescriptorController.java | 2 +- .../org/thingsboard/server/controller/CustomerController.java | 2 +- .../org/thingsboard/server/controller/DashboardController.java | 2 +- .../org/thingsboard/server/controller/DeviceController.java | 2 +- .../server/controller/EntityRelationController.java | 2 +- .../thingsboard/server/controller/EntityViewController.java | 2 +- .../org/thingsboard/server/controller/EventController.java | 2 +- .../thingsboard/server/controller/HttpValidationCallback.java | 2 +- .../java/org/thingsboard/server/controller/RpcController.java | 2 +- .../org/thingsboard/server/controller/RuleChainController.java | 2 +- .../java/org/thingsboard/server/controller/TbUrlConstants.java | 2 +- .../org/thingsboard/server/controller/TelemetryController.java | 2 +- .../org/thingsboard/server/controller/TenantController.java | 2 +- .../java/org/thingsboard/server/controller/UserController.java | 2 +- .../thingsboard/server/controller/WidgetTypeController.java | 2 +- .../thingsboard/server/controller/WidgetsBundleController.java | 2 +- .../server/controller/plugin/TbWebSocketHandler.java | 2 +- .../thingsboard/server/exception/ThingsboardErrorResponse.java | 2 +- .../server/exception/ThingsboardErrorResponseHandler.java | 2 +- .../server/install/ThingsboardInstallConfiguration.java | 2 +- .../server/install/ThingsboardInstallException.java | 2 +- .../thingsboard/server/install/ThingsboardInstallService.java | 2 +- .../cluster/discovery/CurrentServerInstanceService.java | 2 +- .../server/service/cluster/discovery/DiscoveryService.java | 2 +- .../service/cluster/discovery/DiscoveryServiceListener.java | 2 +- .../service/cluster/discovery/DummyDiscoveryService.java | 2 +- .../server/service/cluster/discovery/ServerInstance.java | 2 +- .../service/cluster/discovery/ServerInstanceService.java | 2 +- .../server/service/cluster/discovery/ZkDiscoveryService.java | 2 +- .../server/service/cluster/routing/ClusterRoutingService.java | 2 +- .../cluster/routing/ConsistentClusterRoutingService.java | 2 +- .../server/service/cluster/routing/ConsistentHashCircle.java | 2 +- .../server/service/cluster/rpc/ClusterGrpcService.java | 2 +- .../server/service/cluster/rpc/ClusterRpcService.java | 2 +- .../thingsboard/server/service/cluster/rpc/GrpcSession.java | 2 +- .../server/service/cluster/rpc/GrpcSessionListener.java | 2 +- .../thingsboard/server/service/cluster/rpc/RpcMsgListener.java | 2 +- .../service/component/AnnotationComponentDiscoveryService.java | 2 +- .../server/service/component/ComponentDiscoveryService.java | 2 +- .../server/service/encoding/DataDecodingEncodingService.java | 2 +- .../server/service/encoding/ProtoWithFSTService.java | 2 +- .../server/service/environment/EnvironmentLogService.java | 2 +- .../server/service/executors/AbstractListeningExecutor.java | 2 +- .../service/executors/ClusterRpcCallbackExecutorService.java | 2 +- .../server/service/executors/DbCallbackExecutorService.java | 2 +- .../server/service/executors/ExternalCallExecutorService.java | 2 +- .../install/CassandraAbstractDatabaseSchemaService.java | 2 +- .../service/install/CassandraDatabaseUpgradeService.java | 2 +- .../service/install/CassandraEntityDatabaseSchemaService.java | 2 +- .../service/install/CassandraTsDatabaseSchemaService.java | 2 +- .../thingsboard/server/service/install/DataUpdateService.java | 2 +- .../org/thingsboard/server/service/install/DatabaseHelper.java | 2 +- .../server/service/install/DatabaseSchemaService.java | 2 +- .../server/service/install/DatabaseUpgradeService.java | 2 +- .../server/service/install/DefaultDataUpdateService.java | 2 +- .../server/service/install/DefaultSystemDataLoaderService.java | 2 +- .../server/service/install/EntityDatabaseSchemaService.java | 2 +- .../org/thingsboard/server/service/install/InstallScripts.java | 2 +- .../service/install/SqlAbstractDatabaseSchemaService.java | 2 +- .../server/service/install/SqlDatabaseUpgradeService.java | 2 +- .../server/service/install/SqlEntityDatabaseSchemaService.java | 2 +- .../server/service/install/SqlTsDatabaseSchemaService.java | 2 +- .../server/service/install/SystemDataLoaderService.java | 2 +- .../server/service/install/TsDatabaseSchemaService.java | 2 +- .../server/service/install/cql/CQLStatementsParser.java | 2 +- .../server/service/install/cql/CassandraDbHelper.java | 2 +- .../thingsboard/server/service/install/sql/SqlDbHelper.java | 2 +- .../thingsboard/server/service/mail/DefaultMailService.java | 2 +- .../thingsboard/server/service/mail/MailExecutorService.java | 2 +- .../server/service/rpc/DefaultDeviceRpcService.java | 2 +- .../org/thingsboard/server/service/rpc/DeviceRpcService.java | 2 +- .../thingsboard/server/service/rpc/FromDeviceRpcResponse.java | 2 +- .../thingsboard/server/service/rpc/LocalRequestMetaData.java | 2 +- .../server/service/rpc/ToDeviceRpcRequestActorMsg.java | 2 +- .../server/service/rpc/ToServerRpcResponseActorMsg.java | 2 +- .../server/service/script/AbstractJsInvokeService.java | 2 +- .../server/service/script/AbstractNashornJsInvokeService.java | 2 +- .../thingsboard/server/service/script/JsExecutorService.java | 2 +- .../org/thingsboard/server/service/script/JsInvokeRequest.java | 2 +- .../thingsboard/server/service/script/JsInvokeResponse.java | 2 +- .../org/thingsboard/server/service/script/JsInvokeService.java | 3 +-- .../org/thingsboard/server/service/script/JsScriptType.java | 3 +-- .../server/service/script/NashornJsInvokeService.java | 3 +-- .../server/service/script/RemoteJsInvokeService.java | 2 +- .../server/service/script/RemoteJsRequestEncoder.java | 2 +- .../server/service/script/RemoteJsResponseDecoder.java | 2 +- .../server/service/script/RuleNodeJsScriptEngine.java | 2 +- .../server/service/script/RuleNodeScriptFactory.java | 3 +-- .../thingsboard/server/service/security/AccessValidator.java | 2 +- .../server/service/security/ValidationCallback.java | 2 +- .../thingsboard/server/service/security/ValidationResult.java | 2 +- .../server/service/security/ValidationResultCode.java | 2 +- .../service/security/auth/AbstractJwtAuthenticationToken.java | 2 +- .../server/service/security/auth/JwtAuthenticationToken.java | 2 +- .../service/security/auth/RefreshAuthenticationToken.java | 2 +- .../service/security/auth/jwt/JwtAuthenticationProvider.java | 2 +- .../auth/jwt/JwtTokenAuthenticationProcessingFilter.java | 2 +- .../security/auth/jwt/RefreshTokenAuthenticationProvider.java | 2 +- .../security/auth/jwt/RefreshTokenProcessingFilter.java | 2 +- .../service/security/auth/jwt/RefreshTokenRepository.java | 2 +- .../server/service/security/auth/jwt/RefreshTokenRequest.java | 2 +- .../service/security/auth/jwt/SkipPathRequestMatcher.java | 2 +- .../security/auth/jwt/extractor/JwtHeaderTokenExtractor.java | 2 +- .../security/auth/jwt/extractor/JwtQueryTokenExtractor.java | 2 +- .../service/security/auth/jwt/extractor/TokenExtractor.java | 2 +- .../server/service/security/auth/rest/LoginRequest.java | 2 +- .../server/service/security/auth/rest/PublicLoginRequest.java | 2 +- .../service/security/auth/rest/RestAuthenticationProvider.java | 2 +- .../auth/rest/RestAwareAuthenticationFailureHandler.java | 2 +- .../auth/rest/RestAwareAuthenticationSuccessHandler.java | 2 +- .../service/security/auth/rest/RestLoginProcessingFilter.java | 2 +- .../security/auth/rest/RestPublicLoginProcessingFilter.java | 2 +- .../service/security/device/DefaultDeviceAuthService.java | 2 +- .../security/exception/AuthMethodNotSupportedException.java | 2 +- .../service/security/exception/JwtExpiredTokenException.java | 2 +- .../server/service/security/model/SecurityUser.java | 2 +- .../server/service/security/model/UserPrincipal.java | 2 +- .../server/service/security/model/token/AccessJwtToken.java | 2 +- .../server/service/security/model/token/JwtToken.java | 2 +- .../server/service/security/model/token/JwtTokenFactory.java | 2 +- .../server/service/security/model/token/RawAccessJwtToken.java | 2 +- .../service/session/DefaultDeviceSessionCacheService.java | 2 +- .../server/service/session/DeviceSessionCacheService.java | 2 +- .../server/service/state/DefaultDeviceStateService.java | 2 +- .../java/org/thingsboard/server/service/state/DeviceState.java | 2 +- .../org/thingsboard/server/service/state/DeviceStateData.java | 2 +- .../thingsboard/server/service/state/DeviceStateService.java | 2 +- .../thingsboard/server/service/telemetry/AttributeData.java | 2 +- .../service/telemetry/DefaultTelemetrySubscriptionService.java | 2 +- .../service/telemetry/DefaultTelemetryWebSocketService.java | 2 +- .../org/thingsboard/server/service/telemetry/SessionEvent.java | 2 +- .../thingsboard/server/service/telemetry/TelemetryFeature.java | 2 +- .../server/service/telemetry/TelemetrySubscriptionService.java | 2 +- .../service/telemetry/TelemetryWebSocketMsgEndpoint.java | 2 +- .../server/service/telemetry/TelemetryWebSocketService.java | 2 +- .../server/service/telemetry/TelemetryWebSocketSessionRef.java | 2 +- .../server/service/telemetry/TelemetryWebSocketTextMsg.java | 2 +- .../java/org/thingsboard/server/service/telemetry/TsData.java | 2 +- .../server/service/telemetry/WsSessionMetaData.java | 2 +- .../service/telemetry/cmd/AttributesSubscriptionCmd.java | 2 +- .../server/service/telemetry/cmd/GetHistoryCmd.java | 2 +- .../server/service/telemetry/cmd/SubscriptionCmd.java | 2 +- .../server/service/telemetry/cmd/TelemetryPluginCmd.java | 2 +- .../service/telemetry/cmd/TelemetryPluginCmdsWrapper.java | 2 +- .../service/telemetry/cmd/TimeseriesSubscriptionCmd.java | 2 +- .../service/telemetry/exception/AccessDeniedException.java | 2 +- .../service/telemetry/exception/EntityNotFoundException.java | 2 +- .../service/telemetry/exception/InternalErrorException.java | 2 +- .../telemetry/exception/InvalidParametersException.java | 2 +- .../service/telemetry/exception/ToErrorResponseEntity.java | 2 +- .../service/telemetry/exception/UnauthorizedException.java | 2 +- .../service/telemetry/exception/UncheckedApiException.java | 2 +- .../thingsboard/server/service/telemetry/sub/Subscription.java | 2 +- .../server/service/telemetry/sub/SubscriptionErrorCode.java | 2 +- .../server/service/telemetry/sub/SubscriptionState.java | 2 +- .../server/service/telemetry/sub/SubscriptionUpdate.java | 2 +- .../service/transaction/BaseRuleChainTransactionService.java | 2 +- .../server/service/transaction/TbTransactionTask.java | 2 +- .../server/service/transport/LocalTransportApiService.java | 2 +- .../server/service/transport/LocalTransportService.java | 2 +- .../service/transport/RemoteRuleEngineTransportService.java | 2 +- .../server/service/transport/RemoteTransportApiService.java | 2 +- .../server/service/transport/RuleEngineTransportService.java | 2 +- .../server/service/transport/ToRuleEngineMsgDecoder.java | 2 +- .../server/service/transport/ToTransportMsgEncoder.java | 2 +- .../server/service/transport/TransportApiRequestDecoder.java | 2 +- .../server/service/transport/TransportApiResponseEncoder.java | 2 +- .../server/service/transport/TransportApiService.java | 2 +- .../transport/msg/TransportToDeviceActorMsgWrapper.java | 2 +- .../server/service/update/DefaultUpdateService.java | 2 +- .../org/thingsboard/server/service/update/UpdateService.java | 2 +- .../thingsboard/server/service/update/model/UpdateMessage.java | 2 +- .../src/main/java/org/thingsboard/server/utils/MiscUtils.java | 2 +- application/src/main/proto/cluster.proto | 2 +- application/src/main/proto/jsinvoke.proto | 2 +- application/src/main/resources/actor-system.conf | 2 +- application/src/main/resources/logback.xml | 2 +- application/src/main/resources/templates/account.activated.vm | 2 +- application/src/main/resources/templates/activation.vm | 2 +- application/src/main/resources/templates/password.was.reset.vm | 2 +- application/src/main/resources/templates/reset.password.vm | 2 +- application/src/main/resources/templates/test.vm | 2 +- application/src/main/resources/thingsboard.yml | 2 +- application/src/main/scripts/install/install.sh | 2 +- application/src/main/scripts/install/install_dev_db.sh | 2 +- application/src/main/scripts/install/logback.xml | 2 +- application/src/main/scripts/install/upgrade.sh | 2 +- .../thingsboard/server/controller/AbstractControllerTest.java | 2 +- .../server/controller/AbstractRuleEngineControllerTest.java | 2 +- .../thingsboard/server/controller/BaseAdminControllerTest.java | 2 +- .../thingsboard/server/controller/BaseAssetControllerTest.java | 2 +- .../server/controller/BaseAuditLogControllerTest.java | 2 +- .../thingsboard/server/controller/BaseAuthControllerTest.java | 2 +- .../controller/BaseComponentDescriptorControllerTest.java | 2 +- .../server/controller/BaseCustomerControllerTest.java | 2 +- .../server/controller/BaseDashboardControllerTest.java | 2 +- .../server/controller/BaseDeviceControllerTest.java | 2 +- .../server/controller/BaseEntityViewControllerTest.java | 2 +- .../server/controller/BaseTenantControllerTest.java | 2 +- .../thingsboard/server/controller/BaseUserControllerTest.java | 2 +- .../server/controller/BaseWidgetTypeControllerTest.java | 2 +- .../server/controller/BaseWidgetsBundleControllerTest.java | 2 +- .../server/controller/ControllerNoSqlTestSuite.java | 2 +- .../thingsboard/server/controller/ControllerSqlTestSuite.java | 2 +- .../server/controller/nosql/AdminControllerNoSqlTest.java | 2 +- .../server/controller/nosql/AssetControllerNoSqlTest.java | 2 +- .../server/controller/nosql/AuditLogControllerNoSqlTest.java | 2 +- .../server/controller/nosql/AuthControllerNoSqlTest.java | 2 +- .../nosql/ComponentDescriptorControllerNoSqlTest.java | 2 +- .../server/controller/nosql/CustomerControllerNoSqlTest.java | 2 +- .../server/controller/nosql/DashboardControllerNoSqlTest.java | 2 +- .../server/controller/nosql/DeviceControllerNoSqlTest.java | 2 +- .../server/controller/nosql/EntityViewControllerNoSqlTest.java | 2 +- .../server/controller/nosql/TenantControllerNoSqlTest.java | 2 +- .../server/controller/nosql/UserControllerNoSqlTest.java | 2 +- .../server/controller/nosql/WidgetTypeControllerNoSqlTest.java | 2 +- .../controller/nosql/WidgetsBundleControllerNoSqlTest.java | 2 +- .../server/controller/sql/AdminControllerSqlTest.java | 2 +- .../server/controller/sql/AssetControllerSqlTest.java | 2 +- .../server/controller/sql/AuditLogControllerSqlTest.java | 2 +- .../server/controller/sql/AuthControllerSqlTest.java | 2 +- .../controller/sql/ComponentDescriptorControllerSqlTest.java | 2 +- .../server/controller/sql/CustomerControllerSqlTest.java | 2 +- .../server/controller/sql/DashboardControllerSqlTest.java | 2 +- .../server/controller/sql/DeviceControllerSqlTest.java | 2 +- .../server/controller/sql/EntityViewControllerSqlTest.java | 2 +- .../server/controller/sql/TenantControllerSqlTest.java | 2 +- .../server/controller/sql/UserControllerSqlTest.java | 2 +- .../server/controller/sql/WidgetTypeControllerSqlTest.java | 2 +- .../server/controller/sql/WidgetsBundleControllerSqlTest.java | 2 +- .../org/thingsboard/server/mqtt/DbConfigurationTestRule.java | 2 +- .../java/org/thingsboard/server/mqtt/MqttNoSqlTestSuite.java | 2 +- .../java/org/thingsboard/server/mqtt/MqttSqlTestSuite.java | 2 +- .../mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java | 2 +- .../mqtt/rpc/nosql/MqttServerSideRpcNoSqlIntegrationTest.java | 2 +- .../mqtt/rpc/sql/MqttServerSideRpcSqlIntegrationTest.java | 2 +- .../mqtt/telemetry/AbstractMqttTelemetryIntegrationTest.java | 2 +- .../telemetry/nosql/MqttTelemetryNoSqlIntegrationTest.java | 2 +- .../mqtt/telemetry/sql/MqttTelemetrySqlIntegrationTest.java | 2 +- .../org/thingsboard/server/rules/RuleEngineNoSqlTestSuite.java | 2 +- .../org/thingsboard/server/rules/RuleEngineSqlTestSuite.java | 2 +- .../rules/flow/AbstractRuleEngineFlowIntegrationTest.java | 2 +- .../rules/flow/nosql/RuleEngineFlowNoSqlIntegrationTest.java | 2 +- .../rules/flow/sql/RuleEngineFlowSqlIntegrationTest.java | 2 +- .../lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java | 2 +- .../nosql/RuleEngineLifecycleNoSqlIntegrationTest.java | 2 +- .../lifecycle/sql/RuleEngineLifecycleSqlIntegrationTest.java | 2 +- .../org/thingsboard/server/service/mail/TestMailService.java | 2 +- .../server/service/script/RuleNodeJsScriptEngineTest.java | 2 +- .../server/service/script/TestNashornJsInvokeService.java | 3 +-- .../org/thingsboard/server/system/BaseHttpDeviceApiTest.java | 2 +- .../org/thingsboard/server/system/SystemNoSqlTestSuite.java | 2 +- .../java/org/thingsboard/server/system/SystemSqlTestSuite.java | 2 +- .../thingsboard/server/system/nosql/DeviceApiNoSqlTest.java | 2 +- .../org/thingsboard/server/system/sql/DeviceApiSqlTest.java | 2 +- common/data/pom.xml | 2 +- .../java/org/thingsboard/server/common/data/AdminSettings.java | 2 +- .../main/java/org/thingsboard/server/common/data/BaseData.java | 2 +- .../org/thingsboard/server/common/data/CacheConstants.java | 2 +- .../java/org/thingsboard/server/common/data/ContactBased.java | 2 +- .../main/java/org/thingsboard/server/common/data/Customer.java | 2 +- .../java/org/thingsboard/server/common/data/Dashboard.java | 2 +- .../java/org/thingsboard/server/common/data/DashboardInfo.java | 2 +- .../java/org/thingsboard/server/common/data/DataConstants.java | 2 +- .../main/java/org/thingsboard/server/common/data/Device.java | 2 +- .../org/thingsboard/server/common/data/EntityFieldsData.java | 2 +- .../java/org/thingsboard/server/common/data/EntitySubtype.java | 2 +- .../java/org/thingsboard/server/common/data/EntityType.java | 2 +- .../java/org/thingsboard/server/common/data/EntityView.java | 2 +- .../main/java/org/thingsboard/server/common/data/Event.java | 2 +- .../org/thingsboard/server/common/data/HasAdditionalInfo.java | 2 +- .../java/org/thingsboard/server/common/data/HasCustomerId.java | 2 +- .../main/java/org/thingsboard/server/common/data/HasName.java | 2 +- .../java/org/thingsboard/server/common/data/HasTenantId.java | 2 +- .../org/thingsboard/server/common/data/SearchTextBased.java | 2 +- .../server/common/data/SearchTextBasedWithAdditionalInfo.java | 2 +- .../org/thingsboard/server/common/data/ShortCustomerInfo.java | 2 +- .../main/java/org/thingsboard/server/common/data/Tenant.java | 2 +- .../java/org/thingsboard/server/common/data/UUIDConverter.java | 2 +- .../src/main/java/org/thingsboard/server/common/data/User.java | 2 +- .../java/org/thingsboard/server/common/data/alarm/Alarm.java | 2 +- .../java/org/thingsboard/server/common/data/alarm/AlarmId.java | 2 +- .../org/thingsboard/server/common/data/alarm/AlarmInfo.java | 2 +- .../org/thingsboard/server/common/data/alarm/AlarmQuery.java | 2 +- .../server/common/data/alarm/AlarmSearchStatus.java | 2 +- .../thingsboard/server/common/data/alarm/AlarmSeverity.java | 2 +- .../org/thingsboard/server/common/data/alarm/AlarmStatus.java | 2 +- .../java/org/thingsboard/server/common/data/asset/Asset.java | 2 +- .../thingsboard/server/common/data/asset/AssetSearchQuery.java | 2 +- .../org/thingsboard/server/common/data/audit/ActionStatus.java | 2 +- .../org/thingsboard/server/common/data/audit/ActionType.java | 2 +- .../org/thingsboard/server/common/data/audit/AuditLog.java | 2 +- .../server/common/data/device/DeviceSearchQuery.java | 2 +- .../server/common/data/entityview/EntityViewSearchQuery.java | 2 +- .../server/common/data/exception/ThingsboardErrorCode.java | 2 +- .../server/common/data/exception/ThingsboardException.java | 2 +- .../org/thingsboard/server/common/data/id/AdminSettingsId.java | 2 +- .../java/org/thingsboard/server/common/data/id/AssetId.java | 2 +- .../java/org/thingsboard/server/common/data/id/AuditLogId.java | 2 +- .../server/common/data/id/ComponentDescriptorId.java | 2 +- .../java/org/thingsboard/server/common/data/id/CustomerId.java | 2 +- .../org/thingsboard/server/common/data/id/DashboardId.java | 2 +- .../thingsboard/server/common/data/id/DeviceCredentialsId.java | 2 +- .../java/org/thingsboard/server/common/data/id/DeviceId.java | 2 +- .../java/org/thingsboard/server/common/data/id/EntityId.java | 2 +- .../server/common/data/id/EntityIdDeserializer.java | 2 +- .../org/thingsboard/server/common/data/id/EntityIdFactory.java | 2 +- .../thingsboard/server/common/data/id/EntityIdSerializer.java | 2 +- .../org/thingsboard/server/common/data/id/EntityViewId.java | 2 +- .../java/org/thingsboard/server/common/data/id/EventId.java | 2 +- .../java/org/thingsboard/server/common/data/id/IdBased.java | 2 +- .../java/org/thingsboard/server/common/data/id/NodeId.java | 2 +- .../org/thingsboard/server/common/data/id/RuleChainId.java | 2 +- .../java/org/thingsboard/server/common/data/id/RuleNodeId.java | 2 +- .../java/org/thingsboard/server/common/data/id/TenantId.java | 2 +- .../java/org/thingsboard/server/common/data/id/UUIDBased.java | 2 +- .../thingsboard/server/common/data/id/UserCredentialsId.java | 2 +- .../java/org/thingsboard/server/common/data/id/UserId.java | 2 +- .../org/thingsboard/server/common/data/id/WidgetTypeId.java | 2 +- .../org/thingsboard/server/common/data/id/WidgetsBundleId.java | 2 +- .../org/thingsboard/server/common/data/kv/Aggregation.java | 2 +- .../org/thingsboard/server/common/data/kv/AttributeKey.java | 2 +- .../thingsboard/server/common/data/kv/AttributeKvEntry.java | 2 +- .../server/common/data/kv/BaseAttributeKvEntry.java | 2 +- .../thingsboard/server/common/data/kv/BaseDeleteTsKvQuery.java | 2 +- .../thingsboard/server/common/data/kv/BaseReadTsKvQuery.java | 2 +- .../org/thingsboard/server/common/data/kv/BaseTsKvQuery.java | 2 +- .../org/thingsboard/server/common/data/kv/BasicKvEntry.java | 2 +- .../org/thingsboard/server/common/data/kv/BasicTsKvEntry.java | 2 +- .../thingsboard/server/common/data/kv/BooleanDataEntry.java | 2 +- .../java/org/thingsboard/server/common/data/kv/DataType.java | 2 +- .../org/thingsboard/server/common/data/kv/DeleteTsKvQuery.java | 2 +- .../org/thingsboard/server/common/data/kv/DoubleDataEntry.java | 2 +- .../java/org/thingsboard/server/common/data/kv/KvEntry.java | 2 +- .../org/thingsboard/server/common/data/kv/LongDataEntry.java | 2 +- .../org/thingsboard/server/common/data/kv/ReadTsKvQuery.java | 2 +- .../org/thingsboard/server/common/data/kv/StringDataEntry.java | 2 +- .../java/org/thingsboard/server/common/data/kv/TsKvEntry.java | 2 +- .../java/org/thingsboard/server/common/data/kv/TsKvQuery.java | 2 +- .../server/common/data/objects/AttributesEntityView.java | 2 +- .../server/common/data/objects/TelemetryEntityView.java | 2 +- .../org/thingsboard/server/common/data/page/BasePageLink.java | 2 +- .../thingsboard/server/common/data/page/PageDataIterable.java | 2 +- .../org/thingsboard/server/common/data/page/TextPageData.java | 2 +- .../org/thingsboard/server/common/data/page/TextPageLink.java | 2 +- .../org/thingsboard/server/common/data/page/TimePageData.java | 2 +- .../org/thingsboard/server/common/data/page/TimePageLink.java | 2 +- .../server/common/data/plugin/ComponentDescriptor.java | 2 +- .../server/common/data/plugin/ComponentLifecycleEvent.java | 2 +- .../server/common/data/plugin/ComponentLifecycleState.java | 2 +- .../thingsboard/server/common/data/plugin/ComponentScope.java | 2 +- .../thingsboard/server/common/data/plugin/ComponentType.java | 2 +- .../server/common/data/relation/EntityRelation.java | 2 +- .../server/common/data/relation/EntityRelationInfo.java | 2 +- .../server/common/data/relation/EntityRelationsQuery.java | 2 +- .../server/common/data/relation/EntitySearchDirection.java | 2 +- .../server/common/data/relation/EntityTypeFilter.java | 2 +- .../server/common/data/relation/RelationTypeGroup.java | 2 +- .../server/common/data/relation/RelationsSearchParameters.java | 2 +- .../org/thingsboard/server/common/data/rpc/RpcRequest.java | 2 +- .../server/common/data/rpc/ToDeviceRpcRequestBody.java | 2 +- .../server/common/data/rule/NodeConnectionInfo.java | 2 +- .../org/thingsboard/server/common/data/rule/RuleChain.java | 2 +- .../server/common/data/rule/RuleChainConnectionInfo.java | 2 +- .../thingsboard/server/common/data/rule/RuleChainMetaData.java | 2 +- .../java/org/thingsboard/server/common/data/rule/RuleNode.java | 2 +- .../java/org/thingsboard/server/common/data/rule/RuleType.java | 2 +- .../java/org/thingsboard/server/common/data/rule/Scope.java | 2 +- .../org/thingsboard/server/common/data/security/Authority.java | 2 +- .../server/common/data/security/DeviceCredentials.java | 2 +- .../server/common/data/security/DeviceCredentialsFilter.java | 2 +- .../server/common/data/security/DeviceCredentialsType.java | 2 +- .../server/common/data/security/DeviceTokenCredentials.java | 2 +- .../server/common/data/security/DeviceX509Credentials.java | 2 +- .../server/common/data/security/UserCredentials.java | 2 +- .../org/thingsboard/server/common/data/widget/WidgetType.java | 2 +- .../thingsboard/server/common/data/widget/WidgetsBundle.java | 2 +- .../org/thingsboard/server/common/data/UUIDConverterTest.java | 2 +- common/message/pom.xml | 2 +- .../java/org/thingsboard/server/common/msg/EncryptionUtil.java | 2 +- .../main/java/org/thingsboard/server/common/msg/MsgType.java | 2 +- .../java/org/thingsboard/server/common/msg/TbActorMsg.java | 2 +- .../src/main/java/org/thingsboard/server/common/msg/TbMsg.java | 2 +- .../java/org/thingsboard/server/common/msg/TbMsgDataType.java | 2 +- .../java/org/thingsboard/server/common/msg/TbMsgMetaData.java | 2 +- .../thingsboard/server/common/msg/TbMsgTransactionData.java | 2 +- .../thingsboard/server/common/msg/aware/CustomerAwareMsg.java | 2 +- .../thingsboard/server/common/msg/aware/DeviceAwareMsg.java | 2 +- .../org/thingsboard/server/common/msg/aware/NodeAwareMsg.java | 2 +- .../thingsboard/server/common/msg/aware/RuleChainAwareMsg.java | 2 +- .../thingsboard/server/common/msg/aware/TenantAwareMsg.java | 2 +- .../thingsboard/server/common/msg/cluster/ClusterEventMsg.java | 2 +- .../server/common/msg/cluster/SendToClusterMsg.java | 2 +- .../thingsboard/server/common/msg/cluster/ServerAddress.java | 2 +- .../org/thingsboard/server/common/msg/cluster/ServerType.java | 2 +- .../thingsboard/server/common/msg/cluster/ToAllNodesMsg.java | 2 +- .../server/common/msg/core/ToServerRpcResponseMsg.java | 2 +- .../org/thingsboard/server/common/msg/kv/AttributesKVMsg.java | 2 +- .../thingsboard/server/common/msg/kv/BasicAttributeKVMsg.java | 2 +- .../server/common/msg/plugin/ComponentLifecycleMsg.java | 2 +- .../thingsboard/server/common/msg/rpc/ToDeviceRpcRequest.java | 2 +- .../org/thingsboard/server/common/msg/session/FeatureType.java | 2 +- .../thingsboard/server/common/msg/session/SessionContext.java | 2 +- .../thingsboard/server/common/msg/session/SessionMsgType.java | 2 +- .../common/msg/session/ex/ProcessingTimeoutException.java | 2 +- .../server/common/msg/session/ex/SessionAuthException.java | 2 +- .../server/common/msg/session/ex/SessionException.java | 2 +- .../server/common/msg/system/ServiceToRuleEngineMsg.java | 2 +- .../common/msg/timeout/DeviceActorClientSideRpcTimeoutMsg.java | 2 +- .../common/msg/timeout/DeviceActorServerSideRpcTimeoutMsg.java | 2 +- .../org/thingsboard/server/common/msg/timeout/TimeoutMsg.java | 2 +- .../org/thingsboard/server/common/msg/tools/TbRateLimits.java | 2 +- .../server/common/msg/tools/TbRateLimitsException.java | 2 +- common/message/src/main/proto/tbmsg.proto | 2 +- common/pom.xml | 2 +- common/queue/pom.xml | 2 +- .../org/thingsboard/server/kafka/AbstractTbKafkaTemplate.java | 2 +- .../org/thingsboard/server/kafka/AsyncCallbackTemplate.java | 2 +- .../main/java/org/thingsboard/server/kafka/TBKafkaAdmin.java | 2 +- .../org/thingsboard/server/kafka/TBKafkaConsumerTemplate.java | 2 +- .../org/thingsboard/server/kafka/TBKafkaProducerTemplate.java | 2 +- .../main/java/org/thingsboard/server/kafka/TbKafkaDecoder.java | 2 +- .../main/java/org/thingsboard/server/kafka/TbKafkaEncoder.java | 2 +- .../java/org/thingsboard/server/kafka/TbKafkaEnricher.java | 2 +- .../main/java/org/thingsboard/server/kafka/TbKafkaHandler.java | 2 +- .../java/org/thingsboard/server/kafka/TbKafkaPartitioner.java | 2 +- .../java/org/thingsboard/server/kafka/TbKafkaProperty.java | 2 +- .../thingsboard/server/kafka/TbKafkaRequestIdExtractor.java | 2 +- .../org/thingsboard/server/kafka/TbKafkaRequestTemplate.java | 2 +- .../org/thingsboard/server/kafka/TbKafkaResponseTemplate.java | 2 +- .../java/org/thingsboard/server/kafka/TbKafkaSettings.java | 2 +- .../java/org/thingsboard/server/kafka/TbNodeIdProvider.java | 2 +- common/queue/src/main/resources/logback.xml | 2 +- common/transport/coap/pom.xml | 2 +- .../server/transport/coap/CoapTransportContext.java | 2 +- .../server/transport/coap/CoapTransportResource.java | 2 +- .../server/transport/coap/CoapTransportService.java | 2 +- .../server/transport/coap/adaptors/CoapTransportAdaptor.java | 2 +- .../server/transport/coap/adaptors/JsonCoapAdaptor.java | 2 +- .../server/transport/coap/client/DeviceEmulator.java | 2 +- common/transport/http/pom.xml | 2 +- .../thingsboard/server/transport/http/DeviceApiController.java | 2 +- .../server/transport/http/HttpTransportContext.java | 2 +- common/transport/mqtt/pom.xml | 2 +- .../server/transport/mqtt/MqttSslHandlerProvider.java | 2 +- .../java/org/thingsboard/server/transport/mqtt/MqttTopics.java | 2 +- .../server/transport/mqtt/MqttTransportContext.java | 2 +- .../server/transport/mqtt/MqttTransportHandler.java | 2 +- .../server/transport/mqtt/MqttTransportServerInitializer.java | 2 +- .../server/transport/mqtt/MqttTransportService.java | 2 +- .../server/transport/mqtt/adaptors/JsonMqttAdaptor.java | 2 +- .../server/transport/mqtt/adaptors/MqttTransportAdaptor.java | 2 +- .../server/transport/mqtt/session/DeviceSessionCtx.java | 2 +- .../server/transport/mqtt/session/GatewayDeviceSessionCtx.java | 2 +- .../server/transport/mqtt/session/GatewaySessionHandler.java | 2 +- .../transport/mqtt/session/MqttDeviceAwareSessionContext.java | 2 +- .../server/transport/mqtt/session/MqttTopicMatcher.java | 2 +- .../org/thingsboard/server/transport/mqtt/util/SslUtil.java | 2 +- common/transport/pom.xml | 2 +- common/transport/transport-api/pom.xml | 2 +- .../server/common/transport/SessionMsgListener.java | 2 +- .../server/common/transport/SessionMsgProcessor.java | 2 +- .../thingsboard/server/common/transport/TransportAdaptor.java | 2 +- .../thingsboard/server/common/transport/TransportContext.java | 2 +- .../thingsboard/server/common/transport/TransportService.java | 2 +- .../server/common/transport/TransportServiceCallback.java | 2 +- .../server/common/transport/adaptor/AdaptorException.java | 2 +- .../server/common/transport/adaptor/JsonConverter.java | 2 +- .../server/common/transport/adaptor/JsonConverterConfig.java | 2 +- .../server/common/transport/auth/DeviceAuthResult.java | 2 +- .../server/common/transport/auth/DeviceAuthService.java | 2 +- .../common/transport/service/AbstractTransportService.java | 2 +- .../common/transport/service/RemoteTransportService.java | 2 +- .../server/common/transport/service/SessionMetaData.java | 2 +- .../common/transport/service/ToRuleEngineMsgEncoder.java | 2 +- .../transport/service/ToTransportMsgResponseDecoder.java | 2 +- .../common/transport/service/TransportApiRequestEncoder.java | 2 +- .../common/transport/service/TransportApiResponseDecoder.java | 2 +- .../common/transport/session/DeviceAwareSessionContext.java | 2 +- common/transport/transport-api/src/main/proto/transport.proto | 2 +- dao/pom.xml | 2 +- dao/src/main/java/org/thingsboard/server/dao/Dao.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java | 2 +- .../main/java/org/thingsboard/server/dao/NoSqlDaoConfig.java | 2 +- .../main/java/org/thingsboard/server/dao/alarm/AlarmDao.java | 2 +- .../java/org/thingsboard/server/dao/alarm/AlarmService.java | 2 +- .../org/thingsboard/server/dao/alarm/BaseAlarmService.java | 2 +- .../org/thingsboard/server/dao/alarm/CassandraAlarmDao.java | 2 +- .../main/java/org/thingsboard/server/dao/asset/AssetDao.java | 2 +- .../java/org/thingsboard/server/dao/asset/AssetService.java | 2 +- .../java/org/thingsboard/server/dao/asset/AssetTypeFilter.java | 2 +- .../org/thingsboard/server/dao/asset/BaseAssetService.java | 2 +- .../org/thingsboard/server/dao/asset/CassandraAssetDao.java | 2 +- .../org/thingsboard/server/dao/attributes/AttributesDao.java | 2 +- .../thingsboard/server/dao/attributes/AttributesService.java | 2 +- .../server/dao/attributes/BaseAttributesService.java | 2 +- .../server/dao/attributes/CassandraBaseAttributesDao.java | 2 +- .../java/org/thingsboard/server/dao/audit/AuditLogDao.java | 2 +- .../org/thingsboard/server/dao/audit/AuditLogLevelFilter.java | 2 +- .../org/thingsboard/server/dao/audit/AuditLogLevelMask.java | 2 +- .../org/thingsboard/server/dao/audit/AuditLogQueryCursor.java | 2 +- .../java/org/thingsboard/server/dao/audit/AuditLogService.java | 2 +- .../org/thingsboard/server/dao/audit/AuditLogServiceImpl.java | 2 +- .../org/thingsboard/server/dao/audit/CassandraAuditLogDao.java | 2 +- .../thingsboard/server/dao/audit/DummyAuditLogServiceImpl.java | 2 +- .../org/thingsboard/server/dao/audit/sink/AuditLogSink.java | 2 +- .../thingsboard/server/dao/audit/sink/DummyAuditLogSink.java | 2 +- .../server/dao/audit/sink/ElasticsearchAuditLogSink.java | 2 +- .../main/java/org/thingsboard/server/dao/cache/CacheSpecs.java | 2 +- .../server/dao/cache/CaffeineCacheConfiguration.java | 2 +- .../dao/cache/PreviousDeviceCredentialsIdKeyGenerator.java | 2 +- .../server/dao/cache/TBRedisCacheConfiguration.java | 2 +- .../server/dao/cassandra/AbstractCassandraCluster.java | 2 +- .../org/thingsboard/server/dao/cassandra/CassandraCluster.java | 2 +- .../server/dao/cassandra/CassandraInstallCluster.java | 2 +- .../server/dao/cassandra/CassandraQueryOptions.java | 2 +- .../server/dao/cassandra/CassandraSocketOptions.java | 2 +- .../server/dao/component/BaseComponentDescriptorService.java | 2 +- .../dao/component/CassandraBaseComponentDescriptorDao.java | 2 +- .../server/dao/component/ComponentDescriptorDao.java | 2 +- .../server/dao/component/ComponentDescriptorService.java | 2 +- .../thingsboard/server/dao/customer/CassandraCustomerDao.java | 2 +- .../java/org/thingsboard/server/dao/customer/CustomerDao.java | 2 +- .../org/thingsboard/server/dao/customer/CustomerService.java | 2 +- .../thingsboard/server/dao/customer/CustomerServiceImpl.java | 2 +- .../server/dao/dashboard/CassandraDashboardDao.java | 2 +- .../server/dao/dashboard/CassandraDashboardInfoDao.java | 2 +- .../org/thingsboard/server/dao/dashboard/DashboardDao.java | 2 +- .../org/thingsboard/server/dao/dashboard/DashboardInfoDao.java | 2 +- .../org/thingsboard/server/dao/dashboard/DashboardService.java | 2 +- .../thingsboard/server/dao/dashboard/DashboardServiceImpl.java | 2 +- .../server/dao/device/CassandraDeviceCredentialsDao.java | 2 +- .../org/thingsboard/server/dao/device/CassandraDeviceDao.java | 2 +- .../thingsboard/server/dao/device/DeviceCredentialsDao.java | 2 +- .../server/dao/device/DeviceCredentialsService.java | 2 +- .../server/dao/device/DeviceCredentialsServiceImpl.java | 2 +- .../main/java/org/thingsboard/server/dao/device/DeviceDao.java | 2 +- .../java/org/thingsboard/server/dao/device/DeviceService.java | 2 +- .../org/thingsboard/server/dao/device/DeviceServiceImpl.java | 2 +- .../thingsboard/server/dao/entity/AbstractEntityService.java | 2 +- .../org/thingsboard/server/dao/entity/BaseEntityService.java | 2 +- .../java/org/thingsboard/server/dao/entity/EntityService.java | 2 +- .../server/dao/entityview/CassandraEntityViewDao.java | 2 +- .../org/thingsboard/server/dao/entityview/EntityViewDao.java | 2 +- .../thingsboard/server/dao/entityview/EntityViewService.java | 2 +- .../server/dao/entityview/EntityViewServiceImpl.java | 2 +- .../org/thingsboard/server/dao/event/BaseEventService.java | 2 +- .../thingsboard/server/dao/event/CassandraBaseEventDao.java | 2 +- .../main/java/org/thingsboard/server/dao/event/EventDao.java | 2 +- .../java/org/thingsboard/server/dao/event/EventService.java | 2 +- .../thingsboard/server/dao/exception/BufferLimitException.java | 2 +- .../server/dao/exception/DataValidationException.java | 2 +- .../thingsboard/server/dao/exception/DatabaseException.java | 2 +- .../server/dao/exception/IncorrectParameterException.java | 2 +- .../main/java/org/thingsboard/server/dao/model/BaseEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/BaseSqlEntity.java | 2 +- .../org/thingsboard/server/dao/model/EntitySubtypeEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/ModelConstants.java | 2 +- .../org/thingsboard/server/dao/model/SearchTextEntity.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/model/ToData.java | 2 +- .../server/dao/model/nosql/AdminSettingsEntity.java | 2 +- .../org/thingsboard/server/dao/model/nosql/AlarmEntity.java | 2 +- .../org/thingsboard/server/dao/model/nosql/AssetEntity.java | 2 +- .../org/thingsboard/server/dao/model/nosql/AuditLogEntity.java | 2 +- .../server/dao/model/nosql/ComponentDescriptorEntity.java | 2 +- .../org/thingsboard/server/dao/model/nosql/CustomerEntity.java | 2 +- .../thingsboard/server/dao/model/nosql/DashboardEntity.java | 2 +- .../server/dao/model/nosql/DashboardInfoEntity.java | 2 +- .../server/dao/model/nosql/DeviceCredentialsEntity.java | 2 +- .../org/thingsboard/server/dao/model/nosql/DeviceEntity.java | 2 +- .../thingsboard/server/dao/model/nosql/EntityViewEntity.java | 2 +- .../org/thingsboard/server/dao/model/nosql/EventEntity.java | 2 +- .../thingsboard/server/dao/model/nosql/RuleChainEntity.java | 2 +- .../org/thingsboard/server/dao/model/nosql/RuleNodeEntity.java | 2 +- .../org/thingsboard/server/dao/model/nosql/TenantEntity.java | 2 +- .../server/dao/model/nosql/UserCredentialsEntity.java | 2 +- .../org/thingsboard/server/dao/model/nosql/UserEntity.java | 2 +- .../thingsboard/server/dao/model/nosql/WidgetTypeEntity.java | 2 +- .../server/dao/model/nosql/WidgetsBundleEntity.java | 2 +- .../thingsboard/server/dao/model/sql/AdminSettingsEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/AlarmEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/AssetEntity.java | 2 +- .../server/dao/model/sql/AttributeKvCompositeKey.java | 2 +- .../thingsboard/server/dao/model/sql/AttributeKvEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/AuditLogEntity.java | 2 +- .../server/dao/model/sql/ComponentDescriptorEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/CustomerEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/DashboardEntity.java | 2 +- .../thingsboard/server/dao/model/sql/DashboardInfoEntity.java | 2 +- .../server/dao/model/sql/DeviceCredentialsEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/DeviceEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/EntityViewEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/EventEntity.java | 2 +- .../thingsboard/server/dao/model/sql/RelationCompositeKey.java | 2 +- .../org/thingsboard/server/dao/model/sql/RelationEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/RuleChainEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/RuleNodeEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/TenantEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/TsKvCompositeKey.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/TsKvEntity.java | 2 +- .../server/dao/model/sql/TsKvLatestCompositeKey.java | 2 +- .../org/thingsboard/server/dao/model/sql/TsKvLatestEntity.java | 2 +- .../server/dao/model/sql/UserCredentialsEntity.java | 2 +- .../java/org/thingsboard/server/dao/model/sql/UserEntity.java | 2 +- .../org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java | 2 +- .../thingsboard/server/dao/model/sql/WidgetsBundleEntity.java | 2 +- .../thingsboard/server/dao/model/type/ActionStatusCodec.java | 2 +- .../org/thingsboard/server/dao/model/type/ActionTypeCodec.java | 2 +- .../thingsboard/server/dao/model/type/AlarmSeverityCodec.java | 2 +- .../thingsboard/server/dao/model/type/AlarmStatusCodec.java | 2 +- .../org/thingsboard/server/dao/model/type/AuthorityCodec.java | 2 +- .../server/dao/model/type/ComponentLifecycleStateCodec.java | 2 +- .../thingsboard/server/dao/model/type/ComponentScopeCodec.java | 2 +- .../thingsboard/server/dao/model/type/ComponentTypeCodec.java | 2 +- .../server/dao/model/type/DeviceCredentialsTypeCodec.java | 2 +- .../org/thingsboard/server/dao/model/type/EntityTypeCodec.java | 2 +- .../java/org/thingsboard/server/dao/model/type/JsonCodec.java | 2 +- .../server/dao/model/type/RelationTypeGroupCodec.java | 2 +- .../thingsboard/server/dao/model/wrapper/EntityResultSet.java | 2 +- .../server/dao/nosql/CassandraAbstractAsyncDao.java | 2 +- .../org/thingsboard/server/dao/nosql/CassandraAbstractDao.java | 2 +- .../server/dao/nosql/CassandraAbstractModelDao.java | 2 +- .../server/dao/nosql/CassandraAbstractSearchTextDao.java | 2 +- .../server/dao/nosql/CassandraAbstractSearchTimeDao.java | 2 +- .../server/dao/nosql/CassandraBufferedRateExecutor.java | 2 +- .../thingsboard/server/dao/nosql/CassandraStatementTask.java | 2 +- .../server/dao/nosql/RateLimitedResultSetFuture.java | 2 +- .../org/thingsboard/server/dao/nosql/TbResultSetFuture.java | 2 +- .../org/thingsboard/server/dao/relation/BaseRelationDao.java | 2 +- .../thingsboard/server/dao/relation/BaseRelationService.java | 2 +- .../java/org/thingsboard/server/dao/relation/RelationDao.java | 2 +- .../org/thingsboard/server/dao/relation/RelationService.java | 2 +- .../org/thingsboard/server/dao/rule/BaseRuleChainService.java | 2 +- .../org/thingsboard/server/dao/rule/CassandraRuleChainDao.java | 2 +- .../org/thingsboard/server/dao/rule/CassandraRuleNodeDao.java | 2 +- .../java/org/thingsboard/server/dao/rule/RuleChainDao.java | 3 +-- .../java/org/thingsboard/server/dao/rule/RuleChainService.java | 3 +-- .../main/java/org/thingsboard/server/dao/rule/RuleNodeDao.java | 3 +-- .../java/org/thingsboard/server/dao/service/DataValidator.java | 2 +- .../org/thingsboard/server/dao/service/PaginatedRemover.java | 2 +- .../thingsboard/server/dao/service/TimePaginatedRemover.java | 2 +- .../java/org/thingsboard/server/dao/service/Validator.java | 2 +- .../org/thingsboard/server/dao/settings/AdminSettingsDao.java | 2 +- .../thingsboard/server/dao/settings/AdminSettingsService.java | 2 +- .../server/dao/settings/AdminSettingsServiceImpl.java | 2 +- .../server/dao/settings/CassandraAdminSettingsDao.java | 2 +- .../java/org/thingsboard/server/dao/sql/JpaAbstractDao.java | 2 +- .../server/dao/sql/JpaAbstractDaoListeningExecutorService.java | 2 +- .../thingsboard/server/dao/sql/JpaAbstractSearchTextDao.java | 2 +- .../thingsboard/server/dao/sql/JpaAbstractSearchTimeDao.java | 2 +- .../org/thingsboard/server/dao/sql/alarm/AlarmRepository.java | 2 +- .../java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java | 2 +- .../org/thingsboard/server/dao/sql/asset/AssetRepository.java | 2 +- .../java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java | 2 +- .../server/dao/sql/attributes/AttributeKvRepository.java | 2 +- .../thingsboard/server/dao/sql/attributes/JpaAttributeDao.java | 2 +- .../thingsboard/server/dao/sql/audit/AuditLogRepository.java | 2 +- .../org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java | 2 +- .../dao/sql/component/ComponentDescriptorRepository.java | 2 +- .../dao/sql/component/JpaBaseComponentDescriptorDao.java | 2 +- .../server/dao/sql/customer/CustomerRepository.java | 2 +- .../thingsboard/server/dao/sql/customer/JpaCustomerDao.java | 2 +- .../server/dao/sql/dashboard/DashboardInfoRepository.java | 2 +- .../server/dao/sql/dashboard/DashboardRepository.java | 2 +- .../thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java | 2 +- .../server/dao/sql/dashboard/JpaDashboardInfoDao.java | 2 +- .../server/dao/sql/device/DeviceCredentialsRepository.java | 2 +- .../thingsboard/server/dao/sql/device/DeviceRepository.java | 2 +- .../server/dao/sql/device/JpaDeviceCredentialsDao.java | 2 +- .../org/thingsboard/server/dao/sql/device/JpaDeviceDao.java | 2 +- .../server/dao/sql/entityview/EntityViewRepository.java | 2 +- .../server/dao/sql/entityview/JpaEntityViewDao.java | 2 +- .../org/thingsboard/server/dao/sql/event/EventRepository.java | 2 +- .../org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java | 2 +- .../thingsboard/server/dao/sql/relation/JpaRelationDao.java | 2 +- .../server/dao/sql/relation/RelationRepository.java | 2 +- .../org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java | 2 +- .../org/thingsboard/server/dao/sql/rule/JpaRuleNodeDao.java | 2 +- .../thingsboard/server/dao/sql/rule/RuleChainRepository.java | 2 +- .../thingsboard/server/dao/sql/rule/RuleNodeRepository.java | 2 +- .../server/dao/sql/settings/AdminSettingsRepository.java | 2 +- .../server/dao/sql/settings/JpaAdminSettingsDao.java | 2 +- .../org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java | 2 +- .../thingsboard/server/dao/sql/tenant/TenantRepository.java | 2 +- .../server/dao/sql/timeseries/JpaTimeseriesDao.java | 2 +- .../server/dao/sql/timeseries/TsKvLatestRepository.java | 2 +- .../thingsboard/server/dao/sql/timeseries/TsKvRepository.java | 2 +- .../thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java | 2 +- .../java/org/thingsboard/server/dao/sql/user/JpaUserDao.java | 2 +- .../server/dao/sql/user/UserCredentialsRepository.java | 2 +- .../org/thingsboard/server/dao/sql/user/UserRepository.java | 2 +- .../thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java | 2 +- .../thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java | 2 +- .../server/dao/sql/widget/WidgetTypeRepository.java | 2 +- .../server/dao/sql/widget/WidgetsBundleRepository.java | 2 +- .../org/thingsboard/server/dao/tenant/CassandraTenantDao.java | 2 +- .../main/java/org/thingsboard/server/dao/tenant/TenantDao.java | 2 +- .../java/org/thingsboard/server/dao/tenant/TenantService.java | 2 +- .../org/thingsboard/server/dao/tenant/TenantServiceImpl.java | 2 +- .../server/dao/timeseries/AggregatePartitionsFunction.java | 2 +- .../server/dao/timeseries/BaseTimeseriesService.java | 2 +- .../server/dao/timeseries/CassandraBaseTimeseriesDao.java | 2 +- .../org/thingsboard/server/dao/timeseries/QueryCursor.java | 2 +- .../server/dao/timeseries/SimpleListenableFuture.java | 2 +- .../org/thingsboard/server/dao/timeseries/TimeseriesDao.java | 2 +- .../thingsboard/server/dao/timeseries/TimeseriesService.java | 2 +- .../server/dao/timeseries/TsInsertExecutorType.java | 2 +- .../org/thingsboard/server/dao/timeseries/TsKvQueryCursor.java | 2 +- .../org/thingsboard/server/dao/timeseries/TsPartitionDate.java | 2 +- .../server/dao/user/CassandraUserCredentialsDao.java | 2 +- .../java/org/thingsboard/server/dao/user/CassandraUserDao.java | 2 +- .../org/thingsboard/server/dao/user/UserCredentialsDao.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/user/UserDao.java | 2 +- .../main/java/org/thingsboard/server/dao/user/UserService.java | 2 +- .../java/org/thingsboard/server/dao/user/UserServiceImpl.java | 2 +- .../server/dao/util/AbstractBufferedRateExecutor.java | 2 +- .../java/org/thingsboard/server/dao/util/AsyncRateLimiter.java | 2 +- .../main/java/org/thingsboard/server/dao/util/AsyncTask.java | 2 +- .../java/org/thingsboard/server/dao/util/AsyncTaskContext.java | 2 +- .../org/thingsboard/server/dao/util/BufferedRateExecutor.java | 2 +- .../main/java/org/thingsboard/server/dao/util/NoSqlAnyDao.java | 2 +- .../main/java/org/thingsboard/server/dao/util/NoSqlDao.java | 2 +- .../main/java/org/thingsboard/server/dao/util/NoSqlTsDao.java | 2 +- dao/src/main/java/org/thingsboard/server/dao/util/SqlDao.java | 2 +- .../main/java/org/thingsboard/server/dao/util/SqlTsDao.java | 2 +- .../thingsboard/server/dao/util/TenantRateLimitException.java | 2 +- .../server/dao/util/mapping/AbstractJsonSqlTypeDescriptor.java | 2 +- .../org/thingsboard/server/dao/util/mapping/JacksonUtil.java | 2 +- .../server/dao/util/mapping/JsonStringSqlTypeDescriptor.java | 2 +- .../thingsboard/server/dao/util/mapping/JsonStringType.java | 2 +- .../server/dao/util/mapping/JsonTypeDescriptor.java | 2 +- .../thingsboard/server/dao/widget/CassandraWidgetTypeDao.java | 2 +- .../server/dao/widget/CassandraWidgetsBundleDao.java | 2 +- .../java/org/thingsboard/server/dao/widget/WidgetTypeDao.java | 2 +- .../org/thingsboard/server/dao/widget/WidgetTypeService.java | 2 +- .../thingsboard/server/dao/widget/WidgetTypeServiceImpl.java | 2 +- .../org/thingsboard/server/dao/widget/WidgetsBundleDao.java | 2 +- .../thingsboard/server/dao/widget/WidgetsBundleService.java | 2 +- .../server/dao/widget/WidgetsBundleServiceImpl.java | 2 +- dao/src/main/resources/cassandra/schema-entities.cql | 2 +- dao/src/main/resources/cassandra/schema-ts.cql | 2 +- dao/src/main/resources/cassandra/system-data.cql | 2 +- dao/src/main/resources/sql/schema-entities.sql | 2 +- dao/src/main/resources/sql/schema-ts.sql | 2 +- dao/src/main/resources/sql/system-data.sql | 2 +- .../java/org/thingsboard/server/dao/AbstractJpaDaoTest.java | 2 +- .../org/thingsboard/server/dao/CustomCassandraCQLUnit.java | 2 +- .../test/java/org/thingsboard/server/dao/CustomSqlUnit.java | 2 +- .../test/java/org/thingsboard/server/dao/JpaDaoTestSuite.java | 2 +- .../java/org/thingsboard/server/dao/JpaDbunitTestConfig.java | 2 +- .../org/thingsboard/server/dao/NoSqlDaoServiceTestSuite.java | 2 +- .../org/thingsboard/server/dao/SqlDaoServiceTestSuite.java | 2 +- .../server/dao/nosql/RateLimitedResultSetFutureTest.java | 2 +- .../thingsboard/server/dao/service/AbstractServiceTest.java | 2 +- .../server/dao/service/BaseAdminSettingsServiceTest.java | 2 +- .../thingsboard/server/dao/service/BaseAlarmServiceTest.java | 2 +- .../thingsboard/server/dao/service/BaseAssetServiceTest.java | 2 +- .../server/dao/service/BaseCustomerServiceTest.java | 2 +- .../server/dao/service/BaseDashboardServiceTest.java | 2 +- .../server/dao/service/BaseDeviceCredentialsCacheTest.java | 2 +- .../server/dao/service/BaseDeviceCredentialsServiceTest.java | 2 +- .../thingsboard/server/dao/service/BaseDeviceServiceTest.java | 2 +- .../thingsboard/server/dao/service/BaseRelationCacheTest.java | 2 +- .../server/dao/service/BaseRelationServiceTest.java | 2 +- .../server/dao/service/BaseRuleChainServiceTest.java | 3 +-- .../thingsboard/server/dao/service/BaseTenantServiceTest.java | 2 +- .../thingsboard/server/dao/service/BaseUserServiceTest.java | 2 +- .../server/dao/service/BaseWidgetTypeServiceTest.java | 2 +- .../server/dao/service/BaseWidgetsBundleServiceTest.java | 2 +- .../java/org/thingsboard/server/dao/service/DaoNoSqlTest.java | 2 +- .../java/org/thingsboard/server/dao/service/DaoSqlTest.java | 2 +- .../dao/service/attributes/BaseAttributesServiceTest.java | 2 +- .../service/attributes/nosql/AttributesServiceNoSqlTest.java | 2 +- .../dao/service/attributes/sql/AttributesServiceSqlTest.java | 2 +- .../server/dao/service/event/BaseEventServiceTest.java | 2 +- .../server/dao/service/event/nosql/EventServiceNoSqlTest.java | 2 +- .../server/dao/service/event/sql/EventServiceSqlTest.java | 2 +- .../dao/service/nosql/AdminSettingsServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/AlarmServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/AssetServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/CustomerServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/DashboardServiceNoSqlTest.java | 2 +- .../dao/service/nosql/DeviceCredentialCacheNoSqlTest.java | 2 +- .../dao/service/nosql/DeviceCredentialServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/DeviceServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/RelationCacheNoSqlTest.java | 2 +- .../server/dao/service/nosql/RelationServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/RuleChainServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/TenantServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/UserServiceNoSqlTest.java | 2 +- .../server/dao/service/nosql/WidgetTypeServiceNoSqlTest.java | 2 +- .../dao/service/nosql/WidgetsBundleServiceNoSqlTest.java | 2 +- .../server/dao/service/sql/AdminSettingsServiceSqlTest.java | 2 +- .../server/dao/service/sql/AlarmServiceSqlTest.java | 2 +- .../server/dao/service/sql/AssetServiceSqlTest.java | 2 +- .../server/dao/service/sql/CustomerServiceSqlTest.java | 2 +- .../server/dao/service/sql/DashboardServiceSqlTest.java | 2 +- .../server/dao/service/sql/DeviceCredentialsCacheSqlTest.java | 2 +- .../dao/service/sql/DeviceCredentialsServiceSqlTest.java | 2 +- .../server/dao/service/sql/DeviceServiceSqlTest.java | 2 +- .../server/dao/service/sql/RelationCacheSqlTest.java | 2 +- .../server/dao/service/sql/RelationServiceSqlTest.java | 2 +- .../server/dao/service/sql/RuleChainServiceSqlTest.java | 2 +- .../server/dao/service/sql/TenantServiceSqlTest.java | 2 +- .../thingsboard/server/dao/service/sql/UserServiceSqlTest.java | 2 +- .../server/dao/service/sql/WidgetTypeServiceSqlTest.java | 2 +- .../server/dao/service/sql/WidgetsBundleServiceSqlTest.java | 2 +- .../dao/service/timeseries/BaseTimeseriesServiceTest.java | 2 +- .../service/timeseries/nosql/TimeseriesServiceNoSqlTest.java | 2 +- .../dao/service/timeseries/sql/TimeseriesServiceSqlTest.java | 2 +- .../org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java | 2 +- .../org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java | 2 +- .../thingsboard/server/dao/sql/audit/JpaAuditLogDaoTest.java | 2 +- .../dao/sql/component/JpaBaseComponentDescriptorDaoTest.java | 2 +- .../server/dao/sql/customer/JpaCustomerDaoTest.java | 2 +- .../server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java | 2 +- .../server/dao/sql/device/JpaDeviceCredentialsDaoTest.java | 2 +- .../thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java | 2 +- .../thingsboard/server/dao/sql/event/JpaBaseEventDaoTest.java | 2 +- .../thingsboard/server/dao/sql/tenant/JpaTenantDaoTest.java | 2 +- .../server/dao/sql/user/JpaUserCredentialsDaoTest.java | 2 +- .../org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java | 2 +- .../server/dao/sql/widget/JpaWidgetTypeDaoTest.java | 2 +- .../server/dao/sql/widget/JpaWidgetsBundleDaoTest.java | 2 +- docker/compose-utils.sh | 2 +- docker/docker-compose.cassandra.yml | 2 +- docker/docker-compose.postgres.volumes.yml | 2 +- docker/docker-compose.postgres.yml | 2 +- docker/docker-compose.yml | 2 +- docker/docker-install-tb.sh | 2 +- docker/docker-remove-services.sh | 2 +- docker/docker-start-services.sh | 2 +- docker/docker-stop-services.sh | 2 +- docker/docker-update-service.sh | 2 +- docker/docker-upgrade-tb.sh | 2 +- docker/tb-transports/coap/conf/logback.xml | 2 +- docker/tb-transports/coap/conf/tb-coap-transport.conf | 2 +- docker/tb-transports/http/conf/logback.xml | 2 +- docker/tb-transports/http/conf/tb-http-transport.conf | 2 +- docker/tb-transports/mqtt/conf/logback.xml | 2 +- docker/tb-transports/mqtt/conf/tb-mqtt-transport.conf | 2 +- license-header-template.txt | 2 +- msa/black-box-tests/pom.xml | 2 +- .../java/org/thingsboard/server/msa/AbstractContainerTest.java | 2 +- .../java/org/thingsboard/server/msa/ContainerTestSuite.java | 2 +- .../java/org/thingsboard/server/msa/DockerComposeExecutor.java | 3 +-- .../org/thingsboard/server/msa/ThingsBoardDbInstaller.java | 2 +- .../src/test/java/org/thingsboard/server/msa/WsClient.java | 2 +- .../thingsboard/server/msa/connectivity/HttpClientTest.java | 2 +- .../thingsboard/server/msa/connectivity/MqttClientTest.java | 2 +- .../org/thingsboard/server/msa/mapper/AttributesResponse.java | 2 +- .../org/thingsboard/server/msa/mapper/WsTelemetryResponse.java | 2 +- msa/js-executor/api/jsExecutor.js | 2 +- msa/js-executor/api/jsInvokeMessageProcessor.js | 3 +-- msa/js-executor/api/utils.js | 3 +-- msa/js-executor/build.gradle | 2 +- msa/js-executor/config/custom-environment-variables.yml | 2 +- msa/js-executor/config/default.yml | 2 +- msa/js-executor/config/logger.js | 2 +- msa/js-executor/config/tb-js-executor.conf | 2 +- msa/js-executor/docker/Dockerfile | 2 +- msa/js-executor/docker/start-js-executor.sh | 2 +- msa/js-executor/install.js | 2 +- msa/js-executor/pom.xml | 2 +- msa/js-executor/server.js | 3 +-- msa/js-executor/src/main/assembly/windows.xml | 2 +- msa/pom.xml | 2 +- msa/tb-node/docker/Dockerfile | 2 +- msa/tb-node/docker/start-tb-node.sh | 2 +- msa/tb-node/pom.xml | 2 +- msa/tb/docker-cassandra/Dockerfile | 2 +- msa/tb/docker-cassandra/start-db.sh | 2 +- msa/tb/docker-cassandra/stop-db.sh | 2 +- msa/tb/docker-postgres/Dockerfile | 2 +- msa/tb/docker-postgres/start-db.sh | 2 +- msa/tb/docker-postgres/stop-db.sh | 2 +- msa/tb/docker-tb/Dockerfile | 2 +- msa/tb/docker-tb/start-db.sh | 2 +- msa/tb/docker-tb/stop-db.sh | 2 +- msa/tb/docker/install-tb.sh | 2 +- msa/tb/docker/logback.xml | 2 +- msa/tb/docker/start-tb.sh | 2 +- msa/tb/docker/thingsboard.conf | 2 +- msa/tb/docker/upgrade-tb.sh | 2 +- msa/tb/pom.xml | 2 +- msa/transport/coap/docker/Dockerfile | 2 +- msa/transport/coap/docker/start-tb-coap-transport.sh | 2 +- msa/transport/coap/pom.xml | 2 +- msa/transport/http/docker/Dockerfile | 2 +- msa/transport/http/docker/start-tb-http-transport.sh | 2 +- msa/transport/http/pom.xml | 2 +- msa/transport/mqtt/docker/Dockerfile | 2 +- msa/transport/mqtt/docker/start-tb-mqtt-transport.sh | 2 +- msa/transport/mqtt/pom.xml | 2 +- msa/transport/pom.xml | 2 +- msa/web-ui/build.gradle | 2 +- msa/web-ui/config/custom-environment-variables.yml | 2 +- msa/web-ui/config/default.yml | 2 +- msa/web-ui/config/logger.js | 2 +- msa/web-ui/config/tb-web-ui.conf | 2 +- msa/web-ui/docker/Dockerfile | 2 +- msa/web-ui/docker/start-web-ui.sh | 2 +- msa/web-ui/install.js | 2 +- msa/web-ui/pom.xml | 2 +- msa/web-ui/server.js | 3 +-- msa/web-ui/src/main/assembly/windows.xml | 2 +- netty-mqtt/pom.xml | 2 +- .../main/java/org/thingsboard/mqtt/ChannelClosedException.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttChannelHandler.java | 2 +- netty-mqtt/src/main/java/org/thingsboard/mqtt/MqttClient.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttClientCallback.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttClientConfig.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttClientImpl.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttConnectResult.java | 2 +- netty-mqtt/src/main/java/org/thingsboard/mqtt/MqttHandler.java | 2 +- .../java/org/thingsboard/mqtt/MqttIncomingQos2Publish.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttLastWill.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttPendingPublish.java | 2 +- .../java/org/thingsboard/mqtt/MqttPendingSubscription.java | 2 +- .../java/org/thingsboard/mqtt/MqttPendingUnsubscription.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttPingHandler.java | 2 +- .../src/main/java/org/thingsboard/mqtt/MqttSubscription.java | 2 +- .../main/java/org/thingsboard/mqtt/RetransmissionHandler.java | 2 +- pom.xml | 2 +- rule-engine/pom.xml | 2 +- rule-engine/rule-engine-api/pom.xml | 2 +- .../thingsboard/rule/engine/api/EmptyNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/api/ListeningExecutor.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/MailService.java | 2 +- .../org/thingsboard/rule/engine/api/NodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/api/NodeDefinition.java | 3 +-- .../main/java/org/thingsboard/rule/engine/api/RpcError.java | 2 +- .../rule/engine/api/RuleChainTransactionService.java | 2 +- .../rule/engine/api/RuleEngineDeviceRpcRequest.java | 2 +- .../rule/engine/api/RuleEngineDeviceRpcResponse.java | 2 +- .../org/thingsboard/rule/engine/api/RuleEngineRpcService.java | 2 +- .../rule/engine/api/RuleEngineTelemetryService.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/RuleNode.java | 2 +- .../java/org/thingsboard/rule/engine/api/ScriptEngine.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/TbContext.java | 2 +- .../src/main/java/org/thingsboard/rule/engine/api/TbNode.java | 2 +- .../org/thingsboard/rule/engine/api/TbNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/api/TbNodeException.java | 2 +- .../main/java/org/thingsboard/rule/engine/api/TbNodeState.java | 2 +- .../java/org/thingsboard/rule/engine/api/TbRelationTypes.java | 2 +- .../org/thingsboard/rule/engine/api/msg/DeviceAttributes.java | 2 +- .../engine/api/msg/DeviceAttributesEventNotificationMsg.java | 2 +- .../engine/api/msg/DeviceCredentialsUpdateNotificationMsg.java | 2 +- .../org/thingsboard/rule/engine/api/msg/DeviceMetaData.java | 2 +- .../rule/engine/api/msg/DeviceNameOrTypeUpdateMsg.java | 2 +- .../rule/engine/api/msg/ToDeviceActorNotificationMsg.java | 2 +- .../org/thingsboard/rule/engine/api/util/DonAsynchron.java | 2 +- .../java/org/thingsboard/rule/engine/api/util/TbNodeUtils.java | 2 +- rule-engine/rule-engine-components/pom.xml | 2 +- .../thingsboard/rule/engine/action/TbAbstractAlarmNode.java | 2 +- .../rule/engine/action/TbAbstractAlarmNodeConfiguration.java | 2 +- .../rule/engine/action/TbAbstractCustomerActionNode.java | 2 +- .../action/TbAbstractCustomerActionNodeConfiguration.java | 2 +- .../rule/engine/action/TbAbstractRelationActionNode.java | 2 +- .../action/TbAbstractRelationActionNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/action/TbAssignToCustomerNode.java | 2 +- .../engine/action/TbAssignToCustomerNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/action/TbClearAlarmNode.java | 2 +- .../rule/engine/action/TbClearAlarmNodeConfiguration.java | 2 +- .../rule/engine/action/TbCopyAttributesToEntityViewNode.java | 2 +- .../org/thingsboard/rule/engine/action/TbCreateAlarmNode.java | 2 +- .../rule/engine/action/TbCreateAlarmNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/action/TbCreateRelationNode.java | 2 +- .../rule/engine/action/TbCreateRelationNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/action/TbDeleteRelationNode.java | 2 +- .../rule/engine/action/TbDeleteRelationNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/action/TbLogNode.java | 2 +- .../thingsboard/rule/engine/action/TbLogNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/action/TbMsgCountNode.java | 2 +- .../rule/engine/action/TbMsgCountNodeConfiguration.java | 2 +- .../rule/engine/action/TbUnassignFromCustomerNode.java | 2 +- .../engine/action/TbUnassignFromCustomerNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/aws/sns/TbSnsNode.java | 2 +- .../rule/engine/aws/sns/TbSnsNodeConfiguration.java | 3 +-- .../java/org/thingsboard/rule/engine/aws/sqs/TbSqsNode.java | 3 +-- .../rule/engine/aws/sqs/TbSqsNodeConfiguration.java | 3 +-- .../org/thingsboard/rule/engine/data/DeviceRelationsQuery.java | 2 +- .../java/org/thingsboard/rule/engine/data/RelationsQuery.java | 2 +- .../org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java | 2 +- .../rule/engine/debug/TbMsgGeneratorNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/delay/TbMsgDelayNode.java | 2 +- .../rule/engine/delay/TbMsgDelayNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/filter/TbCheckMessageNode.java | 2 +- .../rule/engine/filter/TbCheckMessageNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/filter/TbCheckRelationNode.java | 2 +- .../rule/engine/filter/TbCheckRelationNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/filter/TbJsFilterNode.java | 2 +- .../rule/engine/filter/TbJsFilterNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/filter/TbJsSwitchNode.java | 2 +- .../rule/engine/filter/TbJsSwitchNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/filter/TbMsgTypeFilterNode.java | 2 +- .../rule/engine/filter/TbMsgTypeFilterNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/filter/TbMsgTypeSwitchNode.java | 2 +- .../rule/engine/filter/TbOriginatorTypeFilterNode.java | 2 +- .../engine/filter/TbOriginatorTypeFilterNodeConfiguration.java | 2 +- .../rule/engine/filter/TbOriginatorTypeSwitchNode.java | 2 +- .../java/org/thingsboard/rule/engine/kafka/TbKafkaNode.java | 2 +- .../rule/engine/kafka/TbKafkaNodeConfiguration.java | 3 +-- .../main/java/org/thingsboard/rule/engine/mail/EmailPojo.java | 2 +- .../org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java | 2 +- .../rule/engine/mail/TbMsgToEmailNodeConfiguration.java | 2 +- .../java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java | 2 +- .../rule/engine/mail/TbSendEmailNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbAbstractGetAttributesNode.java | 2 +- .../thingsboard/rule/engine/metadata/TbEntityGetAttrNode.java | 2 +- .../thingsboard/rule/engine/metadata/TbGetAttributesNode.java | 2 +- .../rule/engine/metadata/TbGetAttributesNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbGetCustomerAttributeNode.java | 2 +- .../thingsboard/rule/engine/metadata/TbGetDeviceAttrNode.java | 2 +- .../rule/engine/metadata/TbGetDeviceAttrNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbGetEntityAttrNodeConfiguration.java | 2 +- .../engine/metadata/TbGetOriginatorFieldsConfiguration.java | 2 +- .../rule/engine/metadata/TbGetOriginatorFieldsNode.java | 2 +- .../engine/metadata/TbGetRelatedAttrNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbGetRelatedAttributeNode.java | 2 +- .../thingsboard/rule/engine/metadata/TbGetTelemetryNode.java | 2 +- .../rule/engine/metadata/TbGetTelemetryNodeConfiguration.java | 2 +- .../rule/engine/metadata/TbGetTenantAttributeNode.java | 2 +- .../main/java/org/thingsboard/rule/engine/mqtt/TbMqttNode.java | 3 +-- .../thingsboard/rule/engine/mqtt/TbMqttNodeConfiguration.java | 3 +-- .../rule/engine/mqtt/credentials/AnonymousCredentials.java | 3 +-- .../rule/engine/mqtt/credentials/BasicCredentials.java | 3 +-- .../rule/engine/mqtt/credentials/CertPemClientCredentials.java | 3 +-- .../rule/engine/mqtt/credentials/MqttClientCredentials.java | 3 +-- .../org/thingsboard/rule/engine/rabbitmq/TbRabbitMqNode.java | 3 +-- .../rule/engine/rabbitmq/TbRabbitMqNodeConfiguration.java | 3 +-- .../org/thingsboard/rule/engine/rest/TbRestApiCallNode.java | 2 +- .../rule/engine/rest/TbRestApiCallNodeConfiguration.java | 2 +- .../org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java | 2 +- .../org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java | 2 +- .../rule/engine/rpc/TbSendRpcReplyNodeConfiguration.java | 2 +- .../rule/engine/rpc/TbSendRpcRequestNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java | 2 +- .../engine/telemetry/TbMsgAttributesNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/telemetry/TbMsgTimeseriesNode.java | 2 +- .../engine/telemetry/TbMsgTimeseriesNodeConfiguration.java | 2 +- .../rule/engine/telemetry/TelemetryNodeCallback.java | 2 +- .../rule/engine/transaction/TbSynchronizationBeginNode.java | 2 +- .../rule/engine/transaction/TbSynchronizationEndNode.java | 2 +- .../rule/engine/transform/TbAbstractTransformNode.java | 2 +- .../rule/engine/transform/TbChangeOriginatorNode.java | 2 +- .../engine/transform/TbChangeOriginatorNodeConfiguration.java | 2 +- .../thingsboard/rule/engine/transform/TbTransformMsgNode.java | 2 +- .../rule/engine/transform/TbTransformMsgNodeConfiguration.java | 2 +- .../rule/engine/transform/TbTransformNodeConfiguration.java | 2 +- .../rule/engine/util/EntitiesCustomerIdAsyncLoader.java | 2 +- .../rule/engine/util/EntitiesFieldsAsyncLoader.java | 2 +- .../rule/engine/util/EntitiesRelatedDeviceIdAsyncLoader.java | 2 +- .../rule/engine/util/EntitiesRelatedEntityIdAsyncLoader.java | 2 +- .../rule/engine/util/EntitiesTenantIdAsyncLoader.java | 2 +- .../java/org/thingsboard/rule/engine/util/EntityContainer.java | 2 +- .../org/thingsboard/rule/engine/action/TbAlarmNodeTest.java | 2 +- .../org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java | 2 +- .../org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java | 2 +- .../org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java | 2 +- .../rule/engine/metadata/TbGetCustomerAttributeNodeTest.java | 2 +- .../rule/engine/transform/TbChangeOriginatorNodeTest.java | 2 +- .../rule/engine/transform/TbTransformMsgNodeTest.java | 2 +- tools/pom.xml | 2 +- .../main/java/org/thingsboard/client/tools/MqttSslClient.java | 2 +- .../src/main/java/org/thingsboard/client/tools/RestClient.java | 2 +- tools/src/main/python/mqtt-send-telemetry.py | 2 +- tools/src/main/python/one-way-ssl-mqtt-client.py | 2 +- tools/src/main/python/simple-mqtt-client.py | 2 +- tools/src/main/python/two-way-ssl-mqtt-client.py | 2 +- tools/src/main/shell/client.keygen.sh | 2 +- tools/src/main/shell/server.keygen.sh | 2 +- transport/coap/build.gradle | 2 +- transport/coap/pom.xml | 2 +- transport/coap/src/main/assembly/windows.xml | 2 +- transport/coap/src/main/conf/logback.xml | 2 +- transport/coap/src/main/conf/tb-coap-transport.conf | 2 +- .../server/coap/ThingsboardCoapTransportApplication.java | 2 +- transport/coap/src/main/resources/logback.xml | 2 +- transport/coap/src/main/resources/tb-coap-transport.yml | 2 +- transport/http/build.gradle | 2 +- transport/http/pom.xml | 2 +- transport/http/src/main/assembly/windows.xml | 2 +- transport/http/src/main/conf/logback.xml | 2 +- transport/http/src/main/conf/tb-http-transport.conf | 2 +- .../server/http/ThingsboardHttpTransportApplication.java | 3 +-- transport/http/src/main/resources/logback.xml | 2 +- transport/http/src/main/resources/tb-http-transport.yml | 2 +- transport/mqtt/build.gradle | 2 +- transport/mqtt/pom.xml | 2 +- transport/mqtt/src/main/assembly/windows.xml | 2 +- transport/mqtt/src/main/conf/logback.xml | 2 +- transport/mqtt/src/main/conf/tb-mqtt-transport.conf | 2 +- .../server/mqtt/ThingsboardMqttTransportApplication.java | 3 +-- transport/mqtt/src/main/resources/logback.xml | 2 +- transport/mqtt/src/main/resources/tb-mqtt-transport.yml | 2 +- transport/pom.xml | 2 +- ui/pom.xml | 2 +- ui/server.js | 2 +- ui/src/app/admin/admin.controller.js | 2 +- ui/src/app/admin/admin.routes.js | 2 +- ui/src/app/admin/general-settings.tpl.html | 2 +- ui/src/app/admin/index.js | 2 +- ui/src/app/admin/outgoing-mail-settings.tpl.html | 2 +- ui/src/app/alarm/alarm-details-dialog.controller.js | 2 +- ui/src/app/alarm/alarm-details-dialog.scss | 3 +-- ui/src/app/alarm/alarm-details-dialog.tpl.html | 2 +- ui/src/app/alarm/alarm-header.directive.js | 2 +- ui/src/app/alarm/alarm-header.tpl.html | 2 +- ui/src/app/alarm/alarm-row.directive.js | 2 +- ui/src/app/alarm/alarm-row.tpl.html | 2 +- ui/src/app/alarm/alarm-table.directive.js | 2 +- ui/src/app/alarm/alarm-table.tpl.html | 2 +- ui/src/app/alarm/alarm.scss | 3 +-- ui/src/app/alarm/index.js | 2 +- ui/src/app/api/admin.service.js | 2 +- ui/src/app/api/alarm.service.js | 2 +- ui/src/app/api/alias-controller.js | 2 +- ui/src/app/api/asset.service.js | 2 +- ui/src/app/api/attribute.service.js | 2 +- ui/src/app/api/audit-log.service.js | 2 +- ui/src/app/api/component-descriptor.service.js | 2 +- ui/src/app/api/customer.service.js | 2 +- ui/src/app/api/dashboard.service.js | 2 +- ui/src/app/api/data-aggregator.js | 2 +- ui/src/app/api/datasource.service.js | 2 +- ui/src/app/api/device.service.js | 2 +- ui/src/app/api/entity-relation.service.js | 2 +- ui/src/app/api/entity-view.service.js | 2 +- ui/src/app/api/entity.service.js | 2 +- ui/src/app/api/event.service.js | 2 +- ui/src/app/api/login.service.js | 2 +- ui/src/app/api/rule-chain.service.js | 2 +- ui/src/app/api/subscription.js | 2 +- ui/src/app/api/telemetry-websocket.service.js | 2 +- ui/src/app/api/tenant.service.js | 2 +- ui/src/app/api/time.service.js | 2 +- ui/src/app/api/user.service.js | 2 +- ui/src/app/api/widget.service.js | 2 +- ui/src/app/app.config.js | 2 +- ui/src/app/app.js | 2 +- ui/src/app/app.run.js | 2 +- ui/src/app/asset/add-asset.tpl.html | 2 +- ui/src/app/asset/add-assets-to-customer.controller.js | 2 +- ui/src/app/asset/add-assets-to-customer.tpl.html | 2 +- ui/src/app/asset/asset-card.tpl.html | 2 +- ui/src/app/asset/asset-fieldset.tpl.html | 2 +- ui/src/app/asset/asset.controller.js | 2 +- ui/src/app/asset/asset.directive.js | 2 +- ui/src/app/asset/asset.routes.js | 2 +- ui/src/app/asset/assets.tpl.html | 2 +- ui/src/app/asset/assign-to-customer.controller.js | 2 +- ui/src/app/asset/assign-to-customer.tpl.html | 2 +- ui/src/app/asset/index.js | 2 +- ui/src/app/audit/audit-log-details-dialog.controller.js | 2 +- ui/src/app/audit/audit-log-details-dialog.scss | 3 +-- ui/src/app/audit/audit-log-details-dialog.tpl.html | 2 +- ui/src/app/audit/audit-log-header.directive.js | 2 +- ui/src/app/audit/audit-log-header.tpl.html | 2 +- ui/src/app/audit/audit-log-row.directive.js | 2 +- ui/src/app/audit/audit-log-row.tpl.html | 2 +- ui/src/app/audit/audit-log-table.directive.js | 2 +- ui/src/app/audit/audit-log-table.tpl.html | 2 +- ui/src/app/audit/audit-log.routes.js | 2 +- ui/src/app/audit/audit-log.scss | 3 +-- ui/src/app/audit/audit-logs.controller.js | 2 +- ui/src/app/audit/audit-logs.tpl.html | 2 +- ui/src/app/audit/index.js | 2 +- ui/src/app/common/dashboard-utils.service.js | 2 +- ui/src/app/common/raf.provider.js | 2 +- ui/src/app/common/thirdparty-fix.js | 3 +-- ui/src/app/common/types.constant.js | 2 +- ui/src/app/common/utf8-support.js | 2 +- ui/src/app/common/utils.service.js | 2 +- ui/src/app/components/ace-editor-fix.js | 3 +-- ui/src/app/components/circular-progress.directive.js | 2 +- ui/src/app/components/confirm-on-exit.directive.js | 2 +- ui/src/app/components/contact-short.filter.js | 2 +- ui/src/app/components/contact.directive.js | 2 +- ui/src/app/components/contact.tpl.html | 2 +- ui/src/app/components/dashboard-autocomplete.directive.js | 2 +- ui/src/app/components/dashboard-autocomplete.scss | 3 +-- ui/src/app/components/dashboard-autocomplete.tpl.html | 2 +- ui/src/app/components/dashboard-select-panel.controller.js | 2 +- ui/src/app/components/dashboard-select-panel.tpl.html | 2 +- ui/src/app/components/dashboard-select.directive.js | 2 +- ui/src/app/components/dashboard-select.scss | 2 +- ui/src/app/components/dashboard-select.tpl.html | 2 +- ui/src/app/components/dashboard.directive.js | 2 +- ui/src/app/components/dashboard.scss | 2 +- ui/src/app/components/dashboard.tpl.html | 2 +- ui/src/app/components/datakey-config-dialog.controller.js | 2 +- ui/src/app/components/datakey-config-dialog.tpl.html | 2 +- ui/src/app/components/datakey-config.directive.js | 2 +- ui/src/app/components/datakey-config.scss | 3 +-- ui/src/app/components/datakey-config.tpl.html | 2 +- ui/src/app/components/datasource-entity.directive.js | 2 +- ui/src/app/components/datasource-entity.scss | 2 +- ui/src/app/components/datasource-entity.tpl.html | 2 +- ui/src/app/components/datasource-func.directive.js | 2 +- ui/src/app/components/datasource-func.scss | 2 +- ui/src/app/components/datasource-func.tpl.html | 2 +- ui/src/app/components/datasource.directive.js | 2 +- ui/src/app/components/datasource.scss | 3 +-- ui/src/app/components/datasource.tpl.html | 2 +- ui/src/app/components/datetime-period.directive.js | 2 +- ui/src/app/components/datetime-period.scss | 3 +-- ui/src/app/components/datetime-period.tpl.html | 2 +- ui/src/app/components/details-sidenav.directive.js | 2 +- ui/src/app/components/details-sidenav.scss | 2 +- ui/src/app/components/details-sidenav.tpl.html | 2 +- ui/src/app/components/entity-alias-select.directive.js | 2 +- ui/src/app/components/entity-alias-select.scss | 3 +-- ui/src/app/components/entity-alias-select.tpl.html | 2 +- ui/src/app/components/expand-fullscreen.directive.js | 2 +- ui/src/app/components/expand-fullscreen.scss | 2 +- ui/src/app/components/finish-render.directive.js | 2 +- ui/src/app/components/grid.directive.js | 2 +- ui/src/app/components/grid.scss | 2 +- ui/src/app/components/grid.tpl.html | 2 +- ui/src/app/components/js-func.directive.js | 2 +- ui/src/app/components/js-func.scss | 3 +-- ui/src/app/components/js-func.tpl.html | 2 +- ui/src/app/components/json-content.directive.js | 2 +- ui/src/app/components/json-content.scss | 3 +-- ui/src/app/components/json-content.tpl.html | 2 +- ui/src/app/components/json-form.directive.js | 2 +- ui/src/app/components/json-form.scss | 3 +-- ui/src/app/components/json-form.tpl.html | 2 +- ui/src/app/components/json-object-edit.directive.js | 2 +- ui/src/app/components/json-object-edit.scss | 3 +-- ui/src/app/components/json-object-edit.tpl.html | 2 +- ui/src/app/components/keyboard-shortcut.filter.js | 2 +- ui/src/app/components/kv-map.directive.js | 2 +- ui/src/app/components/kv-map.scss | 3 +-- ui/src/app/components/kv-map.tpl.html | 2 +- ui/src/app/components/led-light.directive.js | 2 +- ui/src/app/components/legend-config-button.tpl.html | 2 +- ui/src/app/components/legend-config-panel.controller.js | 2 +- ui/src/app/components/legend-config-panel.tpl.html | 2 +- ui/src/app/components/legend-config.directive.js | 2 +- ui/src/app/components/legend-config.scss | 3 +-- ui/src/app/components/legend.directive.js | 2 +- ui/src/app/components/legend.scss | 3 +-- ui/src/app/components/legend.tpl.html | 2 +- ui/src/app/components/material-icon-select.directive.js | 2 +- ui/src/app/components/material-icon-select.scss | 3 +-- ui/src/app/components/material-icon-select.tpl.html | 2 +- ui/src/app/components/material-icons-dialog.controller.js | 2 +- ui/src/app/components/material-icons-dialog.scss | 3 +-- ui/src/app/components/material-icons-dialog.tpl.html | 2 +- ui/src/app/components/menu-link.directive.js | 2 +- ui/src/app/components/menu-link.scss | 2 +- ui/src/app/components/menu-link.tpl.html | 2 +- ui/src/app/components/menu-toggle.tpl.html | 2 +- ui/src/app/components/mousepoint-menu.directive.js | 2 +- ui/src/app/components/no-animate.directive.js | 2 +- ui/src/app/components/react/json-form-ace-editor.jsx | 2 +- ui/src/app/components/react/json-form-ace-editor.scss | 3 +-- ui/src/app/components/react/json-form-array.jsx | 2 +- ui/src/app/components/react/json-form-base-component.jsx | 2 +- ui/src/app/components/react/json-form-checkbox.jsx | 2 +- ui/src/app/components/react/json-form-color.jsx | 2 +- ui/src/app/components/react/json-form-color.scss | 2 +- ui/src/app/components/react/json-form-css.jsx | 2 +- ui/src/app/components/react/json-form-date.jsx | 2 +- ui/src/app/components/react/json-form-fieldset.jsx | 2 +- ui/src/app/components/react/json-form-html.jsx | 2 +- ui/src/app/components/react/json-form-image.jsx | 2 +- ui/src/app/components/react/json-form-image.scss | 2 +- ui/src/app/components/react/json-form-javascript.jsx | 2 +- ui/src/app/components/react/json-form-json.jsx | 2 +- ui/src/app/components/react/json-form-number.jsx | 2 +- ui/src/app/components/react/json-form-rc-select.jsx | 2 +- ui/src/app/components/react/json-form-react.jsx | 2 +- ui/src/app/components/react/json-form-schema-form.jsx | 2 +- ui/src/app/components/react/json-form-text.jsx | 2 +- ui/src/app/components/react/json-form.scss | 2 +- ui/src/app/components/react/styles/thingsboardTheme.js | 2 +- ui/src/app/components/related-entity-autocomplete.directive.js | 2 +- ui/src/app/components/related-entity-autocomplete.scss | 3 +-- ui/src/app/components/related-entity-autocomplete.tpl.html | 2 +- ui/src/app/components/scope-element.directive.js | 2 +- ui/src/app/components/side-menu.directive.js | 2 +- ui/src/app/components/side-menu.scss | 2 +- ui/src/app/components/side-menu.tpl.html | 2 +- ui/src/app/components/socialshare-panel.directive.js | 2 +- ui/src/app/components/socialshare-panel.tpl.html | 2 +- ui/src/app/components/tb-event-directives.js | 2 +- ui/src/app/components/timeinterval.directive.js | 2 +- ui/src/app/components/timeinterval.scss | 3 +-- ui/src/app/components/timeinterval.tpl.html | 2 +- ui/src/app/components/timewindow-button.tpl.html | 2 +- ui/src/app/components/timewindow-panel.controller.js | 2 +- ui/src/app/components/timewindow-panel.tpl.html | 2 +- ui/src/app/components/timewindow.directive.js | 2 +- ui/src/app/components/timewindow.scss | 3 +-- ui/src/app/components/timewindow.tpl.html | 2 +- ui/src/app/components/truncate.filter.js | 2 +- .../widget/action/manage-widget-actions.directive.js | 2 +- ui/src/app/components/widget/action/manage-widget-actions.scss | 3 +-- .../components/widget/action/manage-widget-actions.tpl.html | 2 +- .../widget/action/widget-action-dialog.controller.js | 2 +- .../app/components/widget/action/widget-action-dialog.tpl.html | 2 +- ui/src/app/components/widget/widget-config.directive.js | 2 +- ui/src/app/components/widget/widget-config.scss | 3 +-- ui/src/app/components/widget/widget-config.tpl.html | 2 +- ui/src/app/components/widget/widget.controller.js | 2 +- ui/src/app/components/widget/widget.directive.js | 2 +- ui/src/app/components/widget/widget.scss | 3 +-- ui/src/app/components/widgets-bundle-select.directive.js | 2 +- ui/src/app/components/widgets-bundle-select.scss | 2 +- ui/src/app/components/widgets-bundle-select.tpl.html | 2 +- ui/src/app/customer/add-customer.tpl.html | 2 +- ui/src/app/customer/customer-card.tpl.html | 2 +- ui/src/app/customer/customer-fieldset.tpl.html | 2 +- ui/src/app/customer/customer.controller.js | 2 +- ui/src/app/customer/customer.directive.js | 2 +- ui/src/app/customer/customer.routes.js | 2 +- ui/src/app/customer/customers.tpl.html | 2 +- ui/src/app/customer/index.js | 2 +- ui/src/app/dashboard/add-dashboard.tpl.html | 2 +- ui/src/app/dashboard/add-dashboards-to-customer.controller.js | 2 +- ui/src/app/dashboard/add-dashboards-to-customer.tpl.html | 2 +- ui/src/app/dashboard/add-widget.controller.js | 2 +- ui/src/app/dashboard/add-widget.tpl.html | 2 +- ui/src/app/dashboard/dashboard-card.scss | 3 +-- ui/src/app/dashboard/dashboard-card.tpl.html | 2 +- ui/src/app/dashboard/dashboard-fieldset.tpl.html | 2 +- ui/src/app/dashboard/dashboard-settings.controller.js | 2 +- ui/src/app/dashboard/dashboard-settings.scss | 2 +- ui/src/app/dashboard/dashboard-settings.tpl.html | 2 +- ui/src/app/dashboard/dashboard-toolbar.directive.js | 2 +- ui/src/app/dashboard/dashboard-toolbar.scss | 2 +- ui/src/app/dashboard/dashboard-toolbar.tpl.html | 2 +- ui/src/app/dashboard/dashboard.controller.js | 2 +- ui/src/app/dashboard/dashboard.directive.js | 2 +- ui/src/app/dashboard/dashboard.routes.js | 2 +- ui/src/app/dashboard/dashboard.scss | 2 +- ui/src/app/dashboard/dashboard.tpl.html | 2 +- ui/src/app/dashboard/dashboards.controller.js | 2 +- ui/src/app/dashboard/dashboards.tpl.html | 2 +- ui/src/app/dashboard/edit-widget.directive.js | 2 +- ui/src/app/dashboard/edit-widget.tpl.html | 2 +- ui/src/app/dashboard/index.js | 2 +- ui/src/app/dashboard/layouts/dashboard-layout.directive.js | 2 +- ui/src/app/dashboard/layouts/dashboard-layout.tpl.html | 2 +- ui/src/app/dashboard/layouts/index.js | 2 +- .../dashboard/layouts/manage-dashboard-layouts.controller.js | 2 +- ui/src/app/dashboard/layouts/manage-dashboard-layouts.tpl.html | 2 +- .../app/dashboard/layouts/select-target-layout.controller.js | 2 +- ui/src/app/dashboard/layouts/select-target-layout.tpl.html | 2 +- ui/src/app/dashboard/make-dashboard-public-dialog.tpl.html | 2 +- ui/src/app/dashboard/manage-assigned-customers.controller.js | 2 +- ui/src/app/dashboard/manage-assigned-customers.tpl.html | 2 +- .../app/dashboard/states/dashboard-state-dialog.controller.js | 2 +- ui/src/app/dashboard/states/dashboard-state-dialog.tpl.html | 2 +- ui/src/app/dashboard/states/default-state-controller.js | 2 +- ui/src/app/dashboard/states/default-state-controller.scss | 3 +-- ui/src/app/dashboard/states/default-state-controller.tpl.html | 2 +- ui/src/app/dashboard/states/entity-state-controller.js | 2 +- ui/src/app/dashboard/states/entity-state-controller.scss | 2 +- ui/src/app/dashboard/states/entity-state-controller.tpl.html | 2 +- ui/src/app/dashboard/states/index.js | 2 +- .../app/dashboard/states/manage-dashboard-states.controller.js | 2 +- ui/src/app/dashboard/states/manage-dashboard-states.scss | 3 +-- ui/src/app/dashboard/states/manage-dashboard-states.tpl.html | 2 +- ui/src/app/dashboard/states/select-target-state.controller.js | 2 +- ui/src/app/dashboard/states/select-target-state.tpl.html | 2 +- ui/src/app/dashboard/states/states-component.directive.js | 2 +- ui/src/app/dashboard/states/states-controller.service.js | 2 +- ui/src/app/device/add-device.tpl.html | 2 +- ui/src/app/device/add-devices-to-customer.controller.js | 2 +- ui/src/app/device/add-devices-to-customer.tpl.html | 2 +- ui/src/app/device/assign-to-customer.controller.js | 2 +- ui/src/app/device/assign-to-customer.tpl.html | 2 +- ui/src/app/device/device-card.tpl.html | 2 +- ui/src/app/device/device-credentials.controller.js | 2 +- ui/src/app/device/device-credentials.tpl.html | 2 +- ui/src/app/device/device-fieldset.tpl.html | 2 +- ui/src/app/device/device.controller.js | 2 +- ui/src/app/device/device.directive.js | 2 +- ui/src/app/device/device.routes.js | 2 +- ui/src/app/device/devices.tpl.html | 2 +- ui/src/app/device/index.js | 2 +- ui/src/app/entity-view/add-entity-view.tpl.html | 2 +- .../app/entity-view/add-entity-views-to-customer.controller.js | 2 +- ui/src/app/entity-view/add-entity-views-to-customer.tpl.html | 2 +- ui/src/app/entity-view/assign-to-customer.controller.js | 2 +- ui/src/app/entity-view/assign-to-customer.tpl.html | 2 +- ui/src/app/entity-view/entity-view-card.tpl.html | 2 +- ui/src/app/entity-view/entity-view-fieldset.tpl.html | 2 +- ui/src/app/entity-view/entity-view.controller.js | 2 +- ui/src/app/entity-view/entity-view.directive.js | 3 +-- ui/src/app/entity-view/entity-view.routes.js | 2 +- ui/src/app/entity-view/entity-view.scss | 3 +-- ui/src/app/entity-view/entity-views.tpl.html | 2 +- ui/src/app/entity-view/index.js | 2 +- ui/src/app/entity/alias/aliases-entity-select-button.tpl.html | 2 +- .../app/entity/alias/aliases-entity-select-panel.controller.js | 2 +- ui/src/app/entity/alias/aliases-entity-select-panel.tpl.html | 2 +- ui/src/app/entity/alias/aliases-entity-select.directive.js | 2 +- ui/src/app/entity/alias/aliases-entity-select.scss | 2 +- ui/src/app/entity/alias/entity-alias-dialog.controller.js | 2 +- ui/src/app/entity/alias/entity-alias-dialog.scss | 3 +-- ui/src/app/entity/alias/entity-alias-dialog.tpl.html | 2 +- ui/src/app/entity/alias/entity-aliases.controller.js | 2 +- ui/src/app/entity/alias/entity-aliases.scss | 3 +-- ui/src/app/entity/alias/entity-aliases.tpl.html | 2 +- ui/src/app/entity/attribute/add-attribute-dialog.controller.js | 2 +- ui/src/app/entity/attribute/add-attribute-dialog.tpl.html | 2 +- .../attribute/add-widget-to-dashboard-dialog.controller.js | 2 +- .../entity/attribute/add-widget-to-dashboard-dialog.tpl.html | 2 +- ui/src/app/entity/attribute/attribute-table.directive.js | 2 +- ui/src/app/entity/attribute/attribute-table.scss | 2 +- ui/src/app/entity/attribute/attribute-table.tpl.html | 2 +- ui/src/app/entity/attribute/edit-attribute-value.controller.js | 2 +- ui/src/app/entity/attribute/edit-attribute-value.tpl.html | 2 +- ui/src/app/entity/entity-autocomplete.directive.js | 2 +- ui/src/app/entity/entity-autocomplete.scss | 3 +-- ui/src/app/entity/entity-autocomplete.tpl.html | 2 +- ui/src/app/entity/entity-filter-view.directive.js | 2 +- ui/src/app/entity/entity-filter-view.scss | 3 +-- ui/src/app/entity/entity-filter-view.tpl.html | 2 +- ui/src/app/entity/entity-filter.directive.js | 2 +- ui/src/app/entity/entity-filter.scss | 3 +-- ui/src/app/entity/entity-filter.tpl.html | 2 +- ui/src/app/entity/entity-list.directive.js | 2 +- ui/src/app/entity/entity-list.scss | 3 +-- ui/src/app/entity/entity-list.tpl.html | 2 +- ui/src/app/entity/entity-select.directive.js | 2 +- ui/src/app/entity/entity-select.scss | 3 +-- ui/src/app/entity/entity-select.tpl.html | 2 +- ui/src/app/entity/entity-subtype-autocomplete.directive.js | 2 +- ui/src/app/entity/entity-subtype-autocomplete.scss | 3 +-- ui/src/app/entity/entity-subtype-autocomplete.tpl.html | 2 +- ui/src/app/entity/entity-subtype-list.directive.js | 2 +- ui/src/app/entity/entity-subtype-list.scss | 3 +-- ui/src/app/entity/entity-subtype-list.tpl.html | 2 +- ui/src/app/entity/entity-subtype-select.directive.js | 2 +- ui/src/app/entity/entity-subtype-select.scss | 3 +-- ui/src/app/entity/entity-subtype-select.tpl.html | 2 +- ui/src/app/entity/entity-type-list.directive.js | 2 +- ui/src/app/entity/entity-type-list.scss | 3 +-- ui/src/app/entity/entity-type-list.tpl.html | 2 +- ui/src/app/entity/entity-type-select.directive.js | 2 +- ui/src/app/entity/entity-type-select.scss | 3 +-- ui/src/app/entity/entity-type-select.tpl.html | 2 +- ui/src/app/entity/index.js | 2 +- ui/src/app/entity/relation/relation-dialog.controller.js | 2 +- ui/src/app/entity/relation/relation-dialog.scss | 3 +-- ui/src/app/entity/relation/relation-dialog.tpl.html | 2 +- ui/src/app/entity/relation/relation-filters.directive.js | 2 +- ui/src/app/entity/relation/relation-filters.scss | 3 +-- ui/src/app/entity/relation/relation-filters.tpl.html | 2 +- ui/src/app/entity/relation/relation-table.directive.js | 2 +- ui/src/app/entity/relation/relation-table.scss | 2 +- ui/src/app/entity/relation/relation-table.tpl.html | 2 +- .../entity/relation/relation-type-autocomplete.directive.js | 2 +- ui/src/app/entity/relation/relation-type-autocomplete.scss | 3 +-- ui/src/app/entity/relation/relation-type-autocomplete.tpl.html | 2 +- ui/src/app/event/event-content-dialog.controller.js | 2 +- ui/src/app/event/event-content-dialog.tpl.html | 2 +- ui/src/app/event/event-header-debug-rulenode.tpl.html | 2 +- ui/src/app/event/event-header-error.tpl.html | 2 +- ui/src/app/event/event-header-lc-event.tpl.html | 2 +- ui/src/app/event/event-header-stats.tpl.html | 2 +- ui/src/app/event/event-header.directive.js | 2 +- ui/src/app/event/event-row-debug-rulenode.tpl.html | 2 +- ui/src/app/event/event-row-error.tpl.html | 2 +- ui/src/app/event/event-row-lc-event.tpl.html | 2 +- ui/src/app/event/event-row-stats.tpl.html | 2 +- ui/src/app/event/event-row.directive.js | 2 +- ui/src/app/event/event-table.directive.js | 2 +- ui/src/app/event/event-table.tpl.html | 2 +- ui/src/app/event/event.scss | 3 +-- ui/src/app/event/index.js | 2 +- ui/src/app/extension/extension-dialog.controller.js | 2 +- ui/src/app/extension/extension-dialog.tpl.html | 2 +- ui/src/app/extension/extension-table.directive.js | 2 +- ui/src/app/extension/extension-table.scss | 2 +- ui/src/app/extension/extension-table.tpl.html | 2 +- .../extensions-forms/extension-form-http.directive.js | 2 +- .../extension/extensions-forms/extension-form-http.tpl.html | 2 +- .../extensions-forms/extension-form-modbus.directive.js | 2 +- .../extension/extensions-forms/extension-form-modbus.tpl.html | 2 +- .../extensions-forms/extension-form-mqtt.directive.js | 2 +- .../extension/extensions-forms/extension-form-mqtt.tpl.html | 2 +- .../extension/extensions-forms/extension-form-opc.directive.js | 2 +- .../app/extension/extensions-forms/extension-form-opc.tpl.html | 2 +- ui/src/app/extension/extensions-forms/extension-form.scss | 3 +-- ui/src/app/extension/index.js | 2 +- ui/src/app/global-interceptor.service.js | 2 +- ui/src/app/help/help-links.constant.js | 3 +-- ui/src/app/help/help.directive.js | 2 +- ui/src/app/help/help.scss | 2 +- ui/src/app/home/home-links.controller.js | 2 +- ui/src/app/home/home-links.routes.js | 2 +- ui/src/app/home/home-links.scss | 2 +- ui/src/app/home/home-links.tpl.html | 2 +- ui/src/app/home/index.js | 2 +- ui/src/app/ie.support.js | 2 +- ui/src/app/import-export/import-dialog.controller.js | 2 +- ui/src/app/import-export/import-dialog.scss | 2 +- ui/src/app/import-export/import-dialog.tpl.html | 2 +- ui/src/app/import-export/import-export.service.js | 2 +- ui/src/app/import-export/index.js | 2 +- ui/src/app/jsonform/index.js | 2 +- ui/src/app/jsonform/jsonform.controller.js | 2 +- ui/src/app/jsonform/jsonform.routes.js | 2 +- ui/src/app/jsonform/jsonform.scss | 3 +-- ui/src/app/jsonform/jsonform.tpl.html | 2 +- ui/src/app/layout/breadcrumb-icon.filter.js | 2 +- ui/src/app/layout/breadcrumb-label.filter.js | 2 +- ui/src/app/layout/breadcrumb.tpl.html | 2 +- ui/src/app/layout/home.controller.js | 2 +- ui/src/app/layout/home.routes.js | 2 +- ui/src/app/layout/home.scss | 2 +- ui/src/app/layout/home.tpl.html | 2 +- ui/src/app/layout/index.js | 2 +- ui/src/app/layout/user-menu.directive.js | 2 +- ui/src/app/layout/user-menu.scss | 3 +-- ui/src/app/layout/user-menu.tpl.html | 2 +- ui/src/app/locale/translate-handler.js | 2 +- ui/src/app/login/create-password.controller.js | 2 +- ui/src/app/login/create-password.tpl.html | 2 +- ui/src/app/login/index.js | 2 +- ui/src/app/login/login.controller.js | 2 +- ui/src/app/login/login.routes.js | 2 +- ui/src/app/login/login.scss | 2 +- ui/src/app/login/login.tpl.html | 2 +- ui/src/app/login/reset-password-request.controller.js | 2 +- ui/src/app/login/reset-password-request.tpl.html | 2 +- ui/src/app/login/reset-password.controller.js | 2 +- ui/src/app/login/reset-password.tpl.html | 2 +- ui/src/app/profile/change-password.controller.js | 2 +- ui/src/app/profile/change-password.tpl.html | 2 +- ui/src/app/profile/index.js | 2 +- ui/src/app/profile/profile.controller.js | 2 +- ui/src/app/profile/profile.routes.js | 2 +- ui/src/app/profile/profile.tpl.html | 2 +- ui/src/app/rulechain/add-link.tpl.html | 2 +- ui/src/app/rulechain/add-rulechain.tpl.html | 2 +- ui/src/app/rulechain/add-rulenode.tpl.html | 2 +- ui/src/app/rulechain/index.js | 3 +-- ui/src/app/rulechain/link-fieldset.tpl.html | 2 +- ui/src/app/rulechain/link.directive.js | 3 +-- ui/src/app/rulechain/link.scss | 3 +-- ui/src/app/rulechain/message-type-autocomplete.directive.js | 2 +- ui/src/app/rulechain/message-type-autocomplete.scss | 3 +-- ui/src/app/rulechain/message-type-autocomplete.tpl.html | 2 +- ui/src/app/rulechain/rulechain-card.tpl.html | 2 +- ui/src/app/rulechain/rulechain-fieldset.tpl.html | 2 +- ui/src/app/rulechain/rulechain.controller.js | 3 +-- ui/src/app/rulechain/rulechain.directive.js | 3 +-- ui/src/app/rulechain/rulechain.routes.js | 2 +- ui/src/app/rulechain/rulechain.scss | 3 +-- ui/src/app/rulechain/rulechain.tpl.html | 3 +-- ui/src/app/rulechain/rulechains.controller.js | 2 +- ui/src/app/rulechain/rulechains.tpl.html | 2 +- ui/src/app/rulechain/rulenode-config.directive.js | 3 +-- ui/src/app/rulechain/rulenode-config.tpl.html | 3 +-- ui/src/app/rulechain/rulenode-defined-config.directive.js | 3 +-- ui/src/app/rulechain/rulenode-fieldset.tpl.html | 2 +- ui/src/app/rulechain/rulenode.directive.js | 3 +-- ui/src/app/rulechain/rulenode.scss | 3 +-- ui/src/app/rulechain/rulenode.tpl.html | 2 +- ui/src/app/rulechain/script/node-script-test.controller.js | 3 +-- ui/src/app/rulechain/script/node-script-test.scss | 2 +- ui/src/app/rulechain/script/node-script-test.service.js | 3 +-- ui/src/app/rulechain/script/node-script-test.tpl.html | 2 +- ui/src/app/services/clipboard.service.js | 2 +- ui/src/app/services/error-toast.tpl.html | 2 +- ui/src/app/services/info-toast.tpl.html | 2 +- ui/src/app/services/item-buffer.service.js | 2 +- ui/src/app/services/menu.service.js | 2 +- ui/src/app/services/success-toast.tpl.html | 2 +- ui/src/app/services/toast.controller.js | 2 +- ui/src/app/services/toast.js | 2 +- ui/src/app/services/toast.scss | 3 +-- ui/src/app/services/toast.service.js | 2 +- ui/src/app/tenant/add-tenant.tpl.html | 2 +- ui/src/app/tenant/index.js | 2 +- ui/src/app/tenant/tenant-card.tpl.html | 2 +- ui/src/app/tenant/tenant-fieldset.tpl.html | 2 +- ui/src/app/tenant/tenant.controller.js | 2 +- ui/src/app/tenant/tenant.directive.js | 2 +- ui/src/app/tenant/tenant.routes.js | 2 +- ui/src/app/tenant/tenants.tpl.html | 2 +- ui/src/app/url.handler.js | 2 +- ui/src/app/user/activation-link.controller.js | 2 +- ui/src/app/user/activation-link.dialog.tpl.html | 2 +- ui/src/app/user/add-user.controller.js | 2 +- ui/src/app/user/add-user.tpl.html | 2 +- ui/src/app/user/index.js | 2 +- ui/src/app/user/user-card.tpl.html | 2 +- ui/src/app/user/user-fieldset.scss | 2 +- ui/src/app/user/user-fieldset.tpl.html | 2 +- ui/src/app/user/user.controller.js | 2 +- ui/src/app/user/user.directive.js | 2 +- ui/src/app/user/user.routes.js | 2 +- ui/src/app/user/users.tpl.html | 2 +- ui/src/app/widget/add-widgets-bundle.tpl.html | 2 +- ui/src/app/widget/index.js | 2 +- ui/src/app/widget/lib/CanvasDigitalGauge.js | 2 +- ui/src/app/widget/lib/alarm-status-filter-panel.scss | 3 +-- ui/src/app/widget/lib/alarm-status-filter-panel.tpl.html | 3 +-- ui/src/app/widget/lib/alarms-table-widget.js | 2 +- ui/src/app/widget/lib/alarms-table-widget.scss | 3 +-- ui/src/app/widget/lib/alarms-table-widget.tpl.html | 2 +- ui/src/app/widget/lib/analogue-compass.js | 2 +- ui/src/app/widget/lib/analogue-linear-gauge.js | 2 +- ui/src/app/widget/lib/analogue-radial-gauge.js | 2 +- ui/src/app/widget/lib/canvas-digital-gauge.js | 2 +- ui/src/app/widget/lib/display-columns-panel.scss | 3 +-- ui/src/app/widget/lib/display-columns-panel.tpl.html | 3 +-- ui/src/app/widget/lib/entities-table-widget.js | 2 +- ui/src/app/widget/lib/entities-table-widget.scss | 3 +-- ui/src/app/widget/lib/entities-table-widget.tpl.html | 2 +- ui/src/app/widget/lib/extensions-table-widget.js | 2 +- ui/src/app/widget/lib/extensions-table-widget.scss | 3 +-- ui/src/app/widget/lib/extensions-table-widget.tpl.html | 2 +- ui/src/app/widget/lib/flot-widget.js | 2 +- ui/src/app/widget/lib/google-map.js | 2 +- ui/src/app/widget/lib/image-map.js | 2 +- ui/src/app/widget/lib/map-widget.js | 2 +- ui/src/app/widget/lib/map-widget2.js | 2 +- ui/src/app/widget/lib/openstreet-map.js | 2 +- ui/src/app/widget/lib/rpc/index.js | 2 +- ui/src/app/widget/lib/rpc/knob.directive.js | 2 +- ui/src/app/widget/lib/rpc/knob.scss | 2 +- ui/src/app/widget/lib/rpc/knob.tpl.html | 2 +- ui/src/app/widget/lib/rpc/led-indicator.directive.js | 2 +- ui/src/app/widget/lib/rpc/led-indicator.scss | 2 +- ui/src/app/widget/lib/rpc/led-indicator.tpl.html | 2 +- ui/src/app/widget/lib/rpc/round-switch.directive.js | 2 +- ui/src/app/widget/lib/rpc/round-switch.scss | 2 +- ui/src/app/widget/lib/rpc/round-switch.tpl.html | 2 +- ui/src/app/widget/lib/rpc/switch.directive.js | 2 +- ui/src/app/widget/lib/rpc/switch.scss | 2 +- ui/src/app/widget/lib/rpc/switch.tpl.html | 2 +- ui/src/app/widget/lib/tencent-map.js | 2 +- ui/src/app/widget/lib/timeseries-table-widget.js | 2 +- ui/src/app/widget/lib/timeseries-table-widget.scss | 3 +-- ui/src/app/widget/lib/timeseries-table-widget.tpl.html | 2 +- ui/src/app/widget/lib/widget-utils.js | 2 +- ui/src/app/widget/save-widget-type-as.controller.js | 2 +- ui/src/app/widget/save-widget-type-as.tpl.html | 2 +- ui/src/app/widget/select-widget-type.controller.js | 2 +- ui/src/app/widget/select-widget-type.tpl.html | 2 +- ui/src/app/widget/widget-editor.controller.js | 2 +- ui/src/app/widget/widget-editor.scss | 2 +- ui/src/app/widget/widget-editor.tpl.html | 2 +- ui/src/app/widget/widget-library.controller.js | 2 +- ui/src/app/widget/widget-library.routes.js | 2 +- ui/src/app/widget/widget-library.tpl.html | 2 +- ui/src/app/widget/widgets-bundle-card.tpl.html | 2 +- ui/src/app/widget/widgets-bundle-fieldset.tpl.html | 2 +- ui/src/app/widget/widgets-bundle.controller.js | 2 +- ui/src/app/widget/widgets-bundle.directive.js | 2 +- ui/src/app/widget/widgets-bundles.tpl.html | 2 +- ui/src/index.html | 2 +- ui/src/scss/animations.scss | 2 +- ui/src/scss/constants.scss | 2 +- ui/src/scss/fonts.scss | 2 +- ui/src/scss/main.scss | 2 +- ui/src/scss/mixins.scss | 2 +- ui/webpack.config.dev.js | 2 +- ui/webpack.config.js | 2 +- ui/webpack.config.prod.js | 2 +- 1756 files changed, 1756 insertions(+), 1861 deletions(-) diff --git a/application/build.gradle b/application/build.gradle index 01761692f2..fe90904683 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2018 The Thingsboard Authors + * Copyright © 2016-2019 The Thingsboard Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/application/pom.xml b/application/pom.xml index bc0856beb1..b2e6fada28 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -1,6 +1,6 @@ - - - diff --git a/ui/src/app/widget/lib/alarms-table-widget.js b/ui/src/app/widget/lib/alarms-table-widget.js index 3d91e9abbc..9fb41851ad 100644 --- a/ui/src/app/widget/lib/alarms-table-widget.js +++ b/ui/src/app/widget/lib/alarms-table-widget.js @@ -1,5 +1,5 @@ /* - * Copyright © 2016-2018 The Thingsboard Authors + * Copyright © 2016-2019 The Thingsboard Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ui/src/app/widget/lib/alarms-table-widget.scss b/ui/src/app/widget/lib/alarms-table-widget.scss index a03152360f..7edbed9afb 100644 --- a/ui/src/app/widget/lib/alarms-table-widget.scss +++ b/ui/src/app/widget/lib/alarms-table-widget.scss @@ -1,5 +1,5 @@ /** - * Copyright © 2016-2018 The Thingsboard Authors + * Copyright © 2016-2019 The Thingsboard Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - .tb-has-timewindow { .tb-alarms-table { md-toolbar { diff --git a/ui/src/app/widget/lib/alarms-table-widget.tpl.html b/ui/src/app/widget/lib/alarms-table-widget.tpl.html index e795ed30cb..802ea5de99 100644 --- a/ui/src/app/widget/lib/alarms-table-widget.tpl.html +++ b/ui/src/app/widget/lib/alarms-table-widget.tpl.html @@ -1,6 +1,6 @@ - tr.md-row { height: 40px; diff --git a/ui/src/app/widget/lib/timeseries-table-widget.tpl.html b/ui/src/app/widget/lib/timeseries-table-widget.tpl.html index 1b95e62103..962270e56b 100644 --- a/ui/src/app/widget/lib/timeseries-table-widget.tpl.html +++ b/ui/src/app/widget/lib/timeseries-table-widget.tpl.html @@ -1,6 +1,6 @@