Commit 14f8e58df064615f1d272ed6aa391b4a5752f5c5
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 { |
application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleNodeActorMessageProcessor.java
@@ -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() { |