Commit 14f8e58df064615f1d272ed6aa391b4a5752f5c5

Authored by Andrew Shvayka
1 parent 5aac13b5

Implementation of Generator node and improvements

Showing 29 changed files with 237 additions and 28 deletions
@@ -15,9 +15,12 @@ @@ -15,9 +15,12 @@
15 */ 15 */
16 package org.thingsboard.server.actors.ruleChain; 16 package org.thingsboard.server.actors.ruleChain;
17 17
  18 +import akka.actor.ActorContext;
  19 +import akka.actor.ActorRef;
18 import org.thingsboard.rule.engine.api.ListeningExecutor; 20 import org.thingsboard.rule.engine.api.ListeningExecutor;
19 import org.thingsboard.rule.engine.api.TbContext; 21 import org.thingsboard.rule.engine.api.TbContext;
20 import org.thingsboard.server.actors.ActorSystemContext; 22 import org.thingsboard.server.actors.ActorSystemContext;
  23 +import org.thingsboard.server.common.data.id.RuleNodeId;
21 import org.thingsboard.server.common.msg.TbMsg; 24 import org.thingsboard.server.common.msg.TbMsg;
22 import org.thingsboard.server.common.msg.cluster.ServerAddress; 25 import org.thingsboard.server.common.msg.cluster.ServerAddress;
23 import org.thingsboard.server.dao.alarm.AlarmService; 26 import org.thingsboard.server.dao.alarm.AlarmService;
@@ -30,8 +33,10 @@ import org.thingsboard.server.dao.relation.RelationService; @@ -30,8 +33,10 @@ import org.thingsboard.server.dao.relation.RelationService;
30 import org.thingsboard.server.dao.rule.RuleChainService; 33 import org.thingsboard.server.dao.rule.RuleChainService;
31 import org.thingsboard.server.dao.timeseries.TimeseriesService; 34 import org.thingsboard.server.dao.timeseries.TimeseriesService;
32 import org.thingsboard.server.dao.user.UserService; 35 import org.thingsboard.server.dao.user.UserService;
  36 +import scala.concurrent.duration.Duration;
33 37
34 import java.util.Set; 38 import java.util.Set;
  39 +import java.util.concurrent.TimeUnit;
35 40
36 /** 41 /**
37 * Created by ashvayka on 19.03.18. 42 * Created by ashvayka on 19.03.18.
@@ -61,7 +66,12 @@ class DefaultTbContext implements TbContext { @@ -61,7 +66,12 @@ class DefaultTbContext implements TbContext {
61 66
62 @Override 67 @Override
63 public void tellSelf(TbMsg msg, long delayMs) { 68 public void tellSelf(TbMsg msg, long delayMs) {
64 - throw new RuntimeException("Not Implemented!"); 69 + //TODO: add persistence layer
  70 + scheduleMsgWithDelay(new RuleNodeToSelfMsg(msg), delayMs, nodeCtx.getSelfActor());
  71 + }
  72 +
  73 + private void scheduleMsgWithDelay(Object msg, long delayInMs, ActorRef target) {
  74 + mainCtx.getScheduler().scheduleOnce(Duration.create(delayInMs, TimeUnit.MILLISECONDS), target, msg, mainCtx.getActorSystem().dispatcher(), nodeCtx.getSelfActor());
65 } 75 }
66 76
67 @Override 77 @Override
@@ -93,6 +103,11 @@ class DefaultTbContext implements TbContext { @@ -93,6 +103,11 @@ class DefaultTbContext implements TbContext {
93 } 103 }
94 104
95 @Override 105 @Override
  106 + public RuleNodeId getSelfId() {
  107 + return nodeCtx.getSelf().getId();
  108 + }
  109 +
  110 + @Override
96 public void tellNext(TbMsg msg, Set<String> relationTypes) { 111 public void tellNext(TbMsg msg, Set<String> relationTypes) {
97 relationTypes.forEach(type -> tellNext(msg, type)); 112 relationTypes.forEach(type -> tellNext(msg, type));
98 } 113 }
@@ -47,12 +47,25 @@ public class RuleNodeActor extends ComponentActor<RuleNodeId, RuleNodeActorMessa @@ -47,12 +47,25 @@ public class RuleNodeActor extends ComponentActor<RuleNodeId, RuleNodeActorMessa
47 case RULE_TO_SELF_ERROR_MSG: 47 case RULE_TO_SELF_ERROR_MSG:
48 onRuleNodeToSelfErrorMsg((RuleNodeToSelfErrorMsg) msg); 48 onRuleNodeToSelfErrorMsg((RuleNodeToSelfErrorMsg) msg);
49 break; 49 break;
  50 + case RULE_TO_SELF_MSG:
  51 + onRuleNodeToSelfMsg((RuleNodeToSelfMsg) msg);
  52 + break;
50 default: 53 default:
51 return false; 54 return false;
52 } 55 }
53 return true; 56 return true;
54 } 57 }
55 58
  59 + private void onRuleNodeToSelfMsg(RuleNodeToSelfMsg msg) {
  60 + logger.debug("[{}] Going to process rule msg: {}", id, msg.getMsg());
  61 + try {
  62 + processor.onRuleToSelfMsg(msg);
  63 + increaseMessagesProcessedCount();
  64 + } catch (Exception e) {
  65 + logAndPersist("onRuleMsg", e);
  66 + }
  67 + }
  68 +
56 private void onRuleChainToRuleNodeMsg(RuleChainToRuleNodeMsg msg) { 69 private void onRuleChainToRuleNodeMsg(RuleChainToRuleNodeMsg msg) {
57 logger.debug("[{}] Going to process rule msg: {}", id, msg.getMsg()); 70 logger.debug("[{}] Going to process rule msg: {}", id, msg.getMsg());
58 try { 71 try {
@@ -18,9 +18,10 @@ package org.thingsboard.server.actors.ruleChain; @@ -18,9 +18,10 @@ package org.thingsboard.server.actors.ruleChain;
18 import akka.actor.ActorContext; 18 import akka.actor.ActorContext;
19 import akka.actor.ActorRef; 19 import akka.actor.ActorRef;
20 import akka.event.LoggingAdapter; 20 import akka.event.LoggingAdapter;
  21 +import org.thingsboard.rule.engine.api.TbContext;
21 import org.thingsboard.rule.engine.api.TbNode; 22 import org.thingsboard.rule.engine.api.TbNode;
22 import org.thingsboard.rule.engine.api.TbNodeConfiguration; 23 import org.thingsboard.rule.engine.api.TbNodeConfiguration;
23 -import org.thingsboard.rule.engine.api.TbNodeState; 24 +import org.thingsboard.rule.engine.api.TbNodeException;
24 import org.thingsboard.server.actors.ActorSystemContext; 25 import org.thingsboard.server.actors.ActorSystemContext;
25 import org.thingsboard.server.actors.shared.ComponentMsgProcessor; 26 import org.thingsboard.server.actors.shared.ComponentMsgProcessor;
26 import org.thingsboard.server.common.data.id.RuleChainId; 27 import org.thingsboard.server.common.data.id.RuleChainId;
@@ -31,6 +32,8 @@ import org.thingsboard.server.common.data.rule.RuleNode; @@ -31,6 +32,8 @@ import org.thingsboard.server.common.data.rule.RuleNode;
31 import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; 32 import org.thingsboard.server.common.msg.cluster.ClusterEventMsg;
32 import org.thingsboard.server.dao.rule.RuleChainService; 33 import org.thingsboard.server.dao.rule.RuleChainService;
33 34
  35 +import java.util.concurrent.ExecutionException;
  36 +
34 /** 37 /**
35 * @author Andrew Shvayka 38 * @author Andrew Shvayka
36 */ 39 */
@@ -41,6 +44,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod @@ -41,6 +44,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod
41 private final RuleChainService service; 44 private final RuleChainService service;
42 private RuleNode ruleNode; 45 private RuleNode ruleNode;
43 private TbNode tbNode; 46 private TbNode tbNode;
  47 + private TbContext defaultCtx;
44 48
45 RuleNodeActorMessageProcessor(TenantId tenantId, RuleChainId ruleChainId, RuleNodeId ruleNodeId, ActorSystemContext systemContext 49 RuleNodeActorMessageProcessor(TenantId tenantId, RuleChainId ruleChainId, RuleNodeId ruleNodeId, ActorSystemContext systemContext
46 , LoggingAdapter logger, ActorRef parent, ActorRef self) { 50 , LoggingAdapter logger, ActorRef parent, ActorRef self) {
@@ -49,6 +53,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod @@ -49,6 +53,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod
49 this.self = self; 53 this.self = self;
50 this.service = systemContext.getRuleChainService(); 54 this.service = systemContext.getRuleChainService();
51 this.ruleNode = systemContext.getRuleChainService().findRuleNodeById(entityId); 55 this.ruleNode = systemContext.getRuleChainService().findRuleNodeById(entityId);
  56 + this.defaultCtx = new DefaultTbContext(systemContext, new RuleNodeCtx(tenantId, parent, self, ruleNode));
52 } 57 }
53 58
54 @Override 59 @Override
@@ -80,6 +85,14 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod @@ -80,6 +85,14 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod
80 85
81 } 86 }
82 87
  88 + public void onRuleToSelfMsg(RuleNodeToSelfMsg msg) throws Exception {
  89 + checkActive();
  90 + if (ruleNode.isDebugMode()) {
  91 + systemContext.persistDebugInput(tenantId, entityId, msg.getMsg());
  92 + }
  93 + tbNode.onMsg(defaultCtx, msg.getMsg());
  94 + }
  95 +
83 void onRuleChainToRuleNodeMsg(RuleChainToRuleNodeMsg msg) throws Exception { 96 void onRuleChainToRuleNodeMsg(RuleChainToRuleNodeMsg msg) throws Exception {
84 checkActive(); 97 checkActive();
85 if (ruleNode.isDebugMode()) { 98 if (ruleNode.isDebugMode()) {
@@ -91,9 +104,8 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod @@ -91,9 +104,8 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod
91 private TbNode initComponent(RuleNode ruleNode) throws Exception { 104 private TbNode initComponent(RuleNode ruleNode) throws Exception {
92 Class<?> componentClazz = Class.forName(ruleNode.getType()); 105 Class<?> componentClazz = Class.forName(ruleNode.getType());
93 TbNode tbNode = (TbNode) (componentClazz.newInstance()); 106 TbNode tbNode = (TbNode) (componentClazz.newInstance());
94 - tbNode.init(new TbNodeConfiguration(ruleNode.getConfiguration()), new TbNodeState()); 107 + tbNode.init(defaultCtx, new TbNodeConfiguration(ruleNode.getConfiguration()));
95 return tbNode; 108 return tbNode;
96 } 109 }
97 110
98 -  
99 } 111 }
  1 +/**
  2 + * Copyright © 2016-2018 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.actors.ruleChain;
  17 +
  18 +import lombok.Data;
  19 +import org.thingsboard.server.common.data.id.RuleNodeId;
  20 +import org.thingsboard.server.common.msg.MsgType;
  21 +import org.thingsboard.server.common.msg.TbActorMsg;
  22 +import org.thingsboard.server.common.msg.TbMsg;
  23 +
  24 +/**
  25 + * Created by ashvayka on 19.03.18.
  26 + */
  27 +@Data
  28 +final class RuleNodeToSelfMsg implements TbActorMsg {
  29 +
  30 + private final TbMsg msg;
  31 +
  32 + @Override
  33 + public MsgType getMsgType() {
  34 + return MsgType.RULE_TO_SELF_MSG;
  35 + }
  36 +
  37 +}
@@ -54,4 +54,9 @@ public enum MsgType { @@ -54,4 +54,9 @@ public enum MsgType {
54 */ 54 */
55 RULE_TO_SELF_ERROR_MSG, 55 RULE_TO_SELF_ERROR_MSG,
56 56
  57 + /**
  58 + * Message that is sent by RuleActor implementation to RuleActor itself to process the message.
  59 + */
  60 + RULE_TO_SELF_MSG,
  61 +
57 } 62 }
@@ -15,8 +15,8 @@ @@ -15,8 +15,8 @@
15 */ 15 */
16 package org.thingsboard.rule.engine.api; 16 package org.thingsboard.rule.engine.api;
17 17
18 -public interface NodeConfiguration { 18 +public interface NodeConfiguration<T extends NodeConfiguration> {
19 19
20 - NodeConfiguration defaultConfiguration(); 20 + T defaultConfiguration();
21 21
22 } 22 }
@@ -15,6 +15,7 @@ @@ -15,6 +15,7 @@
15 */ 15 */
16 package org.thingsboard.rule.engine.api; 16 package org.thingsboard.rule.engine.api;
17 17
  18 +import org.thingsboard.server.common.data.id.RuleNodeId;
18 import org.thingsboard.server.common.msg.TbMsg; 19 import org.thingsboard.server.common.msg.TbMsg;
19 import org.thingsboard.server.common.msg.cluster.ServerAddress; 20 import org.thingsboard.server.common.msg.cluster.ServerAddress;
20 import org.thingsboard.server.dao.alarm.AlarmService; 21 import org.thingsboard.server.dao.alarm.AlarmService;
@@ -55,6 +56,8 @@ public interface TbContext { @@ -55,6 +56,8 @@ public interface TbContext {
55 56
56 void tellError(TbMsg msg, Throwable th); 57 void tellError(TbMsg msg, Throwable th);
57 58
  59 + RuleNodeId getSelfId();
  60 +
58 AttributesService getAttributesService(); 61 AttributesService getAttributesService();
59 62
60 CustomerService getCustomerService(); 63 CustomerService getCustomerService();
@@ -24,7 +24,7 @@ import java.util.concurrent.ExecutionException; @@ -24,7 +24,7 @@ import java.util.concurrent.ExecutionException;
24 */ 24 */
25 public interface TbNode { 25 public interface TbNode {
26 26
27 - void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException; 27 + void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException;
28 28
29 void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException; 29 void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException;
30 30
  1 +/**
  2 + * Copyright © 2016-2018 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.rule.engine.debug;
  17 +
  18 +import com.datastax.driver.core.utils.UUIDs;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.thingsboard.rule.engine.TbNodeUtils;
  21 +import org.thingsboard.rule.engine.api.ListeningExecutor;
  22 +import org.thingsboard.rule.engine.api.RuleNode;
  23 +import org.thingsboard.rule.engine.api.TbContext;
  24 +import org.thingsboard.rule.engine.api.TbNode;
  25 +import org.thingsboard.rule.engine.api.TbNodeConfiguration;
  26 +import org.thingsboard.rule.engine.api.TbNodeException;
  27 +import org.thingsboard.rule.engine.filter.TbJsFilterNodeConfiguration;
  28 +import org.thingsboard.rule.engine.js.NashornJsEngine;
  29 +import org.thingsboard.server.common.data.plugin.ComponentType;
  30 +import org.thingsboard.server.common.msg.TbMsg;
  31 +import org.thingsboard.server.common.msg.TbMsgMetaData;
  32 +
  33 +import javax.script.Bindings;
  34 +
  35 +import java.nio.charset.StandardCharsets;
  36 +import java.util.concurrent.TimeUnit;
  37 +
  38 +import static org.thingsboard.rule.engine.DonAsynchron.withCallback;
  39 +
  40 +@Slf4j
  41 +@RuleNode(
  42 + type = ComponentType.ACTION,
  43 + name = "generator",
  44 + configClazz = TbMsgGeneratorNodeConfiguration.class,
  45 + nodeDescription = "Periodically generates messages",
  46 + nodeDetails = "Generates messages with configurable period. ",
  47 + inEnabled = false
  48 +)
  49 +
  50 +public class TbMsgGeneratorNode implements TbNode {
  51 +
  52 + public static final String TB_MSG_GENERATOR_NODE_MSG = "TbMsgGeneratorNodeMsg";
  53 +
  54 + private TbMsgGeneratorNodeConfiguration config;
  55 + private long delay;
  56 +
  57 + @Override
  58 + public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
  59 + this.config = TbNodeUtils.convert(configuration, TbMsgGeneratorNodeConfiguration.class);
  60 + this.delay = TimeUnit.SECONDS.toMillis(config.getPeriodInSeconds());
  61 + ctx.tellSelf(newTickMsg(ctx), delay);
  62 + }
  63 +
  64 + @Override
  65 + public void onMsg(TbContext ctx, TbMsg msg) {
  66 + if (msg.getType().equals(TB_MSG_GENERATOR_NODE_MSG)) {
  67 + TbMsgMetaData metaData = new TbMsgMetaData();
  68 + if (config.getMsgMetaData() != null) {
  69 + config.getMsgMetaData().forEach(metaData::putValue);
  70 + }
  71 + ctx.tellNext(new TbMsg(UUIDs.timeBased(), config.getMsgType(), ctx.getSelfId(), metaData, config.getMsgBody().getBytes(StandardCharsets.UTF_8)));
  72 + ctx.tellSelf(newTickMsg(ctx), delay);
  73 + }
  74 + }
  75 +
  76 + private TbMsg newTickMsg(TbContext ctx) {
  77 + return new TbMsg(UUIDs.timeBased(), TB_MSG_GENERATOR_NODE_MSG, ctx.getSelfId(), new TbMsgMetaData(), new byte[]{});
  78 + }
  79 +
  80 + @Override
  81 + public void destroy() {
  82 + }
  83 +}
  1 +/**
  2 + * Copyright © 2016-2018 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.rule.engine.debug;
  17 +
  18 +import lombok.Data;
  19 +import org.thingsboard.rule.engine.api.NodeConfiguration;
  20 +import java.util.Map;
  21 +
  22 +@Data
  23 +public class TbMsgGeneratorNodeConfiguration implements NodeConfiguration<TbMsgGeneratorNodeConfiguration> {
  24 +
  25 + private int msgCount;
  26 + private int periodInSeconds;
  27 + private String msgType;
  28 + private String msgBody;
  29 + private Map<String, String> msgMetaData;
  30 +
  31 + @Override
  32 + public TbMsgGeneratorNodeConfiguration defaultConfiguration() {
  33 + TbMsgGeneratorNodeConfiguration configuration = new TbMsgGeneratorNodeConfiguration();
  34 + configuration.setMsgCount(0);
  35 + configuration.setPeriodInSeconds(1);
  36 + configuration.setMsgType("DebugMsg");
  37 + configuration.setMsgBody("{}");
  38 + return configuration;
  39 + }
  40 +}
@@ -29,7 +29,7 @@ import static org.thingsboard.rule.engine.DonAsynchron.withCallback; @@ -29,7 +29,7 @@ import static org.thingsboard.rule.engine.DonAsynchron.withCallback;
29 @Slf4j 29 @Slf4j
30 @RuleNode( 30 @RuleNode(
31 type = ComponentType.FILTER, 31 type = ComponentType.FILTER,
32 - name = "script", relationTypes = {"True", "False", "Failure"}, 32 + name = "script", relationTypes = {"True", "False"},
33 configClazz = TbJsFilterNodeConfiguration.class, 33 configClazz = TbJsFilterNodeConfiguration.class,
34 nodeDescription = "Filter incoming messages using JS script", 34 nodeDescription = "Filter incoming messages using JS script",
35 nodeDetails = "Evaluate incoming Message with configured JS condition. " + 35 nodeDetails = "Evaluate incoming Message with configured JS condition. " +
@@ -45,7 +45,7 @@ public class TbJsFilterNode implements TbNode { @@ -45,7 +45,7 @@ public class TbJsFilterNode implements TbNode {
45 private NashornJsEngine jsEngine; 45 private NashornJsEngine jsEngine;
46 46
47 @Override 47 @Override
48 - public void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException { 48 + public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
49 this.config = TbNodeUtils.convert(configuration, TbJsFilterNodeConfiguration.class); 49 this.config = TbNodeUtils.convert(configuration, TbJsFilterNodeConfiguration.class);
50 this.jsEngine = new NashornJsEngine(config.getJsScript(), "Filter"); 50 this.jsEngine = new NashornJsEngine(config.getJsScript(), "Filter");
51 } 51 }
@@ -19,7 +19,7 @@ import lombok.Data; @@ -19,7 +19,7 @@ import lombok.Data;
19 import org.thingsboard.rule.engine.api.NodeConfiguration; 19 import org.thingsboard.rule.engine.api.NodeConfiguration;
20 20
21 @Data 21 @Data
22 -public class TbJsFilterNodeConfiguration implements NodeConfiguration { 22 +public class TbJsFilterNodeConfiguration implements NodeConfiguration<TbJsFilterNodeConfiguration> {
23 23
24 private String jsScript; 24 private String jsScript;
25 25
@@ -45,7 +45,7 @@ public class TbJsSwitchNode implements TbNode { @@ -45,7 +45,7 @@ public class TbJsSwitchNode implements TbNode {
45 private NashornJsEngine jsEngine; 45 private NashornJsEngine jsEngine;
46 46
47 @Override 47 @Override
48 - public void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException { 48 + public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
49 this.config = TbNodeUtils.convert(configuration, TbJsSwitchNodeConfiguration.class); 49 this.config = TbNodeUtils.convert(configuration, TbJsSwitchNodeConfiguration.class);
50 this.jsEngine = new NashornJsEngine(config.getJsScript(), "Switch"); 50 this.jsEngine = new NashornJsEngine(config.getJsScript(), "Switch");
51 } 51 }
@@ -22,7 +22,7 @@ import org.thingsboard.rule.engine.api.NodeConfiguration; @@ -22,7 +22,7 @@ import org.thingsboard.rule.engine.api.NodeConfiguration;
22 import java.util.Set; 22 import java.util.Set;
23 23
24 @Data 24 @Data
25 -public class TbJsSwitchNodeConfiguration implements NodeConfiguration { 25 +public class TbJsSwitchNodeConfiguration implements NodeConfiguration<TbJsSwitchNodeConfiguration> {
26 26
27 private String jsScript; 27 private String jsScript;
28 28
@@ -29,6 +29,7 @@ import org.thingsboard.server.common.msg.TbMsg; @@ -29,6 +29,7 @@ import org.thingsboard.server.common.msg.TbMsg;
29 type = ComponentType.FILTER, 29 type = ComponentType.FILTER,
30 name = "message type", 30 name = "message type",
31 configClazz = TbMsgTypeFilterNodeConfiguration.class, 31 configClazz = TbMsgTypeFilterNodeConfiguration.class,
  32 + relationTypes = {"True", "False"},
32 nodeDescription = "Filter incoming messages by Message Type", 33 nodeDescription = "Filter incoming messages by Message Type",
33 nodeDetails = "Evaluate incoming Message with configured JS condition. " + 34 nodeDetails = "Evaluate incoming Message with configured JS condition. " +
34 "If incoming MessageType is expected - send Message via <b>Success</b> chain, otherwise <b>Failure</b> chain is used.", 35 "If incoming MessageType is expected - send Message via <b>Success</b> chain, otherwise <b>Failure</b> chain is used.",
@@ -39,7 +40,7 @@ public class TbMsgTypeFilterNode implements TbNode { @@ -39,7 +40,7 @@ public class TbMsgTypeFilterNode implements TbNode {
39 TbMsgTypeFilterNodeConfiguration config; 40 TbMsgTypeFilterNodeConfiguration config;
40 41
41 @Override 42 @Override
42 - public void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException { 43 + public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
43 this.config = TbNodeUtils.convert(configuration, TbMsgTypeFilterNodeConfiguration.class); 44 this.config = TbNodeUtils.convert(configuration, TbMsgTypeFilterNodeConfiguration.class);
44 } 45 }
45 46
@@ -26,7 +26,7 @@ import java.util.List; @@ -26,7 +26,7 @@ import java.util.List;
26 * Created by ashvayka on 19.01.18. 26 * Created by ashvayka on 19.01.18.
27 */ 27 */
28 @Data 28 @Data
29 -public class TbMsgTypeFilterNodeConfiguration implements NodeConfiguration { 29 +public class TbMsgTypeFilterNodeConfiguration implements NodeConfiguration<TbMsgTypeFilterNodeConfiguration> {
30 30
31 private List<String> messageTypes; 31 private List<String> messageTypes;
32 32
@@ -37,7 +37,7 @@ public abstract class TbEntityGetAttrNode<T extends EntityId> implements TbNode @@ -37,7 +37,7 @@ public abstract class TbEntityGetAttrNode<T extends EntityId> implements TbNode
37 private TbGetEntityAttrNodeConfiguration config; 37 private TbGetEntityAttrNodeConfiguration config;
38 38
39 @Override 39 @Override
40 - public void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException { 40 + public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
41 this.config = TbNodeUtils.convert(configuration, TbGetEntityAttrNodeConfiguration.class); 41 this.config = TbNodeUtils.convert(configuration, TbGetEntityAttrNodeConfiguration.class);
42 } 42 }
43 43
@@ -49,7 +49,7 @@ public class TbGetAttributesNode implements TbNode { @@ -49,7 +49,7 @@ public class TbGetAttributesNode implements TbNode {
49 private TbGetAttributesNodeConfiguration config; 49 private TbGetAttributesNodeConfiguration config;
50 50
51 @Override 51 @Override
52 - public void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException { 52 + public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
53 this.config = TbNodeUtils.convert(configuration, TbGetAttributesNodeConfiguration.class); 53 this.config = TbNodeUtils.convert(configuration, TbGetAttributesNodeConfiguration.class);
54 } 54 }
55 55
@@ -25,7 +25,7 @@ import java.util.List; @@ -25,7 +25,7 @@ import java.util.List;
25 * Created by ashvayka on 19.01.18. 25 * Created by ashvayka on 19.01.18.
26 */ 26 */
27 @Data 27 @Data
28 -public class TbGetAttributesNodeConfiguration implements NodeConfiguration { 28 +public class TbGetAttributesNodeConfiguration implements NodeConfiguration<TbGetAttributesNodeConfiguration> {
29 29
30 private List<String> clientAttributeNames; 30 private List<String> clientAttributeNames;
31 private List<String> sharedAttributeNames; 31 private List<String> sharedAttributeNames;
@@ -23,7 +23,7 @@ import java.util.Map; @@ -23,7 +23,7 @@ import java.util.Map;
23 import java.util.Optional; 23 import java.util.Optional;
24 24
25 @Data 25 @Data
26 -public class TbGetEntityAttrNodeConfiguration implements NodeConfiguration { 26 +public class TbGetEntityAttrNodeConfiguration implements NodeConfiguration<TbGetEntityAttrNodeConfiguration> {
27 27
28 private Map<String, String> attrMapping; 28 private Map<String, String> attrMapping;
29 private boolean isTelemetry = false; 29 private boolean isTelemetry = false;
@@ -38,7 +38,7 @@ public class TbGetRelatedAttributeNode extends TbEntityGetAttrNode<EntityId> { @@ -38,7 +38,7 @@ public class TbGetRelatedAttributeNode extends TbEntityGetAttrNode<EntityId> {
38 private TbGetRelatedAttrNodeConfiguration config; 38 private TbGetRelatedAttrNodeConfiguration config;
39 39
40 @Override 40 @Override
41 - public void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException { 41 + public void init(TbContext context, TbNodeConfiguration configuration) throws TbNodeException {
42 this.config = TbNodeUtils.convert(configuration, TbGetRelatedAttrNodeConfiguration.class); 42 this.config = TbNodeUtils.convert(configuration, TbGetRelatedAttrNodeConfiguration.class);
43 setConfig(config); 43 setConfig(config);
44 } 44 }
@@ -32,7 +32,7 @@ public abstract class TbAbstractTransformNode implements TbNode { @@ -32,7 +32,7 @@ public abstract class TbAbstractTransformNode implements TbNode {
32 private TbTransformNodeConfiguration config; 32 private TbTransformNodeConfiguration config;
33 33
34 @Override 34 @Override
35 - public void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException { 35 + public void init(TbContext context, TbNodeConfiguration configuration) throws TbNodeException {
36 this.config = TbNodeUtils.convert(configuration, TbTransformNodeConfiguration.class); 36 this.config = TbNodeUtils.convert(configuration, TbTransformNodeConfiguration.class);
37 } 37 }
38 38
@@ -49,7 +49,7 @@ public class TbChangeOriginatorNode extends TbAbstractTransformNode { @@ -49,7 +49,7 @@ public class TbChangeOriginatorNode extends TbAbstractTransformNode {
49 private TbChangeOriginatorNodeConfiguration config; 49 private TbChangeOriginatorNodeConfiguration config;
50 50
51 @Override 51 @Override
52 - public void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException { 52 + public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
53 this.config = TbNodeUtils.convert(configuration, TbChangeOriginatorNodeConfiguration.class); 53 this.config = TbNodeUtils.convert(configuration, TbChangeOriginatorNodeConfiguration.class);
54 validateConfig(config); 54 validateConfig(config);
55 setConfig(config); 55 setConfig(config);
@@ -38,7 +38,7 @@ public class TbTransformMsgNode extends TbAbstractTransformNode { @@ -38,7 +38,7 @@ public class TbTransformMsgNode extends TbAbstractTransformNode {
38 private NashornJsEngine jsEngine; 38 private NashornJsEngine jsEngine;
39 39
40 @Override 40 @Override
41 - public void init(TbNodeConfiguration configuration, TbNodeState state) throws TbNodeException { 41 + public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
42 this.config = TbNodeUtils.convert(configuration, TbTransformMsgNodeConfiguration.class); 42 this.config = TbNodeUtils.convert(configuration, TbTransformMsgNodeConfiguration.class);
43 this.jsEngine = new NashornJsEngine(config.getJsScript(), "Transform"); 43 this.jsEngine = new NashornJsEngine(config.getJsScript(), "Transform");
44 setConfig(config); 44 setConfig(config);
@@ -144,7 +144,7 @@ public class TbJsFilterNodeTest { @@ -144,7 +144,7 @@ public class TbJsFilterNodeTest {
144 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); 144 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
145 145
146 node = new TbJsFilterNode(); 146 node = new TbJsFilterNode();
147 - node.init(nodeConfiguration, null); 147 + node.init(null, nodeConfiguration);
148 } 148 }
149 149
150 private void mockJsExecutor() { 150 private void mockJsExecutor() {
@@ -107,7 +107,7 @@ public class TbJsSwitchNodeTest { @@ -107,7 +107,7 @@ public class TbJsSwitchNodeTest {
107 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); 107 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
108 108
109 node = new TbJsSwitchNode(); 109 node = new TbJsSwitchNode();
110 - node.init(nodeConfiguration, null); 110 + node.init(null, nodeConfiguration);
111 } 111 }
112 112
113 private void mockJsExecutor() { 113 private void mockJsExecutor() {
@@ -88,7 +88,7 @@ public class TbGetCustomerAttributeNodeTest { @@ -88,7 +88,7 @@ public class TbGetCustomerAttributeNodeTest {
88 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); 88 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
89 89
90 node = new TbGetCustomerAttributeNode(); 90 node = new TbGetCustomerAttributeNode();
91 - node.init(nodeConfiguration, null); 91 + node.init(null, nodeConfiguration);
92 } 92 }
93 93
94 @Test 94 @Test
@@ -226,7 +226,7 @@ public class TbGetCustomerAttributeNodeTest { @@ -226,7 +226,7 @@ public class TbGetCustomerAttributeNodeTest {
226 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); 226 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
227 227
228 node = new TbGetCustomerAttributeNode(); 228 node = new TbGetCustomerAttributeNode();
229 - node.init(nodeConfiguration, null); 229 + node.init(null, nodeConfiguration);
230 230
231 231
232 DeviceId deviceId = new DeviceId(UUIDs.timeBased()); 232 DeviceId deviceId = new DeviceId(UUIDs.timeBased());
@@ -119,6 +119,6 @@ public class TbChangeOriginatorNodeTest { @@ -119,6 +119,6 @@ public class TbChangeOriginatorNodeTest {
119 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); 119 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
120 120
121 node = new TbChangeOriginatorNode(); 121 node = new TbChangeOriginatorNode();
122 - node.init(nodeConfiguration, null); 122 + node.init(null, nodeConfiguration);
123 } 123 }
124 } 124 }
@@ -114,7 +114,7 @@ public class TbTransformMsgNodeTest { @@ -114,7 +114,7 @@ public class TbTransformMsgNodeTest {
114 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); 114 TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
115 115
116 node = new TbTransformMsgNode(); 116 node = new TbTransformMsgNode();
117 - node.init(nodeConfiguration, null); 117 + node.init(null, nodeConfiguration);
118 } 118 }
119 119
120 private void mockJsExecutor() { 120 private void mockJsExecutor() {