From 09c8f9bbbb3f55b0e7744805c71991168b9e2a47 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Wed, 21 Nov 2018 13:21:38 +0200 Subject: [PATCH] Create TbCreateRelationNode --- .../engine/action/TbCreateRelationNode.java | 72 +++++++++++++++++++ .../TbCreateRelationNodeConfiguration.java | 23 ++++++ 2 files changed, 95 insertions(+) create mode 100644 rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java create mode 100644 rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeConfiguration.java diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java new file mode 100644 index 0000000000..3abad894a8 --- /dev/null +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java @@ -0,0 +1,72 @@ +package org.thingsboard.rule.engine.action; + +import com.google.common.util.concurrent.ListenableFuture; +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.rule.engine.api.*; +import org.thingsboard.rule.engine.api.util.DonAsynchron; +import org.thingsboard.rule.engine.api.util.TbNodeUtils; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.EntityIdFactory; +import org.thingsboard.server.common.data.plugin.ComponentType; +import org.thingsboard.server.common.data.relation.EntityRelation; +import org.thingsboard.server.common.data.relation.EntitySearchDirection; +import org.thingsboard.server.common.data.relation.RelationTypeGroup; +import org.thingsboard.server.common.msg.TbMsg; + +import static org.thingsboard.rule.engine.api.TbRelationTypes.FAILURE; +import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS; +import static org.thingsboard.rule.engine.api.util.DonAsynchron.withCallback; + +@Slf4j +@RuleNode( + type = ComponentType.ACTION, + name = "create relation", + configClazz = TbCreateRelationNodeConfiguration.class, + nodeDescription = "Create the relation from the selected entity to originator of the message by type and direction", + nodeDetails = "If relation is already exists - send Message via Success chain with error message, otherwise is also used Success chain without error message.", + uiResources = {"static/rulenode/rulenode-core-config.js"}, + configDirective = "tbFilterNodeCheckRelationConfig") +public class TbCreateRelationNode implements TbNode { + + private TbCreateRelationNodeConfiguration config; + private EntityId fromId; + private EntityId toId; + + @Override + public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException { + this.config = TbNodeUtils.convert(configuration, TbCreateRelationNodeConfiguration.class); + } + + @Override + public void onMsg(TbContext ctx, TbMsg msg) { + DonAsynchron.withCallback(checkRelation(ctx, msg), result -> { + if (result) { + ctx.tellNext(msg, SUCCESS, new Throwable("Relation between message originator and Entity: " + config.getEntityId() + " is already exist")); + } else { + processCreateRelation(ctx, msg); + } + }, error -> ctx.tellFailure(msg, error), ctx.getDbCallbackExecutor()); + } + + @Override + public void destroy() { + } + + private ListenableFuture checkRelation(TbContext ctx, TbMsg msg) { + if (EntitySearchDirection.TO.name().equals(config.getDirection())) { + fromId = EntityIdFactory.getByTypeAndId(config.getEntityType(), config.getEntityId()); + toId = msg.getOriginator(); + } else { + fromId = EntityIdFactory.getByTypeAndId(config.getEntityType(), config.getEntityId()); + toId = msg.getOriginator(); + } + return ctx.getRelationService().checkRelation(ctx.getTenantId(), fromId, toId, config.getRelationType(), RelationTypeGroup.COMMON); + } + + private void processCreateRelation(TbContext ctx, TbMsg msg) { + EntityRelation entityRelation = new EntityRelation(fromId, toId, config.getRelationType(), RelationTypeGroup.COMMON); + withCallback(ctx.getRelationService().saveRelationAsync(ctx.getTenantId(), entityRelation), + filterResult -> ctx.tellNext(msg, filterResult ? SUCCESS : FAILURE), t -> ctx.tellFailure(msg, t), ctx.getDbCallbackExecutor()); + } + +} diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeConfiguration.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeConfiguration.java new file mode 100644 index 0000000000..e20bd935e7 --- /dev/null +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeConfiguration.java @@ -0,0 +1,23 @@ +package org.thingsboard.rule.engine.action; + +import lombok.Data; +import org.thingsboard.rule.engine.api.NodeConfiguration; +import org.thingsboard.server.common.data.relation.EntitySearchDirection; + +@Data +public class TbCreateRelationNodeConfiguration implements NodeConfiguration { + + private String direction; + private String entityId; + private String entityType; + private String relationType; + + + @Override + public TbCreateRelationNodeConfiguration defaultConfiguration() { + TbCreateRelationNodeConfiguration configuration = new TbCreateRelationNodeConfiguration(); + configuration.setDirection(EntitySearchDirection.FROM.name()); + configuration.setRelationType("Contains"); + return configuration; + } +}