From 61baafe6fb7909360a33ee14cee0a753dd4e163a Mon Sep 17 00:00:00 2001 From: vparomskiy Date: Fri, 11 May 2018 12:08:35 +0300 Subject: [PATCH] use FAILURE chain in Customer/Tenant/Related entity not found in Change Originator Node --- .../transform/TbAbstractTransformNode.java | 22 ++++++++++++++----- .../transform/TbChangeOriginatorNode.java | 22 +++++++++++++------ .../transform/TbChangeOriginatorNodeTest.java | 16 ++++++-------- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbAbstractTransformNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbAbstractTransformNode.java index 4d7d048df6..3bd72e1439 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbAbstractTransformNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbAbstractTransformNode.java @@ -1,12 +1,12 @@ /** * 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. @@ -18,10 +18,14 @@ package org.thingsboard.rule.engine.transform; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.thingsboard.rule.engine.TbNodeUtils; -import org.thingsboard.rule.engine.api.*; +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.server.common.msg.TbMsg; import static org.thingsboard.rule.engine.DonAsynchron.withCallback; +import static org.thingsboard.rule.engine.api.TbRelationTypes.FAILURE; import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS; /** @@ -40,7 +44,13 @@ public abstract class TbAbstractTransformNode implements TbNode { @Override public void onMsg(TbContext ctx, TbMsg msg) { withCallback(transform(ctx, msg), - m -> ctx.tellNext(m, SUCCESS), + m -> { + if (m != null) { + ctx.tellNext(m, SUCCESS); + } else { + ctx.tellNext(msg, FAILURE); + } + }, t -> ctx.tellError(msg, t)); } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNode.java index f6c4eba188..ca0e8e22ed 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNode.java @@ -1,12 +1,12 @@ /** * 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. @@ -21,7 +21,10 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.thingsboard.rule.engine.TbNodeUtils; -import org.thingsboard.rule.engine.api.*; +import org.thingsboard.rule.engine.api.RuleNode; +import org.thingsboard.rule.engine.api.TbContext; +import org.thingsboard.rule.engine.api.TbNodeConfiguration; +import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.rule.engine.util.EntitiesCustomerIdAsyncLoader; import org.thingsboard.rule.engine.util.EntitiesRelatedEntityIdAsyncLoader; import org.thingsboard.rule.engine.util.EntitiesTenantIdAsyncLoader; @@ -34,7 +37,7 @@ import java.util.HashSet; @Slf4j @RuleNode( type = ComponentType.TRANSFORMATION, - name="change originator", + name = "change originator", configClazz = TbChangeOriginatorNodeConfiguration.class, nodeDescription = "Change Message Originator To Tenant/Customer/Related Entity", nodeDetails = "Related Entity found using configured relation direction and Relation Type. " + @@ -61,7 +64,12 @@ public class TbChangeOriginatorNode extends TbAbstractTransformNode { @Override protected ListenableFuture transform(TbContext ctx, TbMsg msg) { ListenableFuture newOriginator = getNewOriginator(ctx, msg.getOriginator()); - return Futures.transform(newOriginator, (Function) n -> ctx.transformMsg(msg, msg.getType(), n, msg.getMetaData(), msg.getData())); + return Futures.transform(newOriginator, (Function) n -> { + if (n == null || n.isNullUid()) { + return null; + } + return ctx.transformMsg(msg, msg.getType(), n, msg.getMetaData(), msg.getData()); + }); } private ListenableFuture getNewOriginator(TbContext ctx, EntityId original) { diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java index bf4fd9abff..a31458c981 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java @@ -40,6 +40,7 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.same; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.thingsboard.rule.engine.api.TbRelationTypes.FAILURE; @RunWith(MockitoJUnitRunner.class) public class TbChangeOriginatorNodeTest { @@ -54,7 +55,7 @@ public class TbChangeOriginatorNodeTest { @Test public void originatorCanBeChangedToCustomerId() throws TbNodeException { - init(false); + init(); AssetId assetId = new AssetId(UUIDs.timeBased()); CustomerId customerId = new CustomerId(UUIDs.timeBased()); Asset asset = new Asset(); @@ -82,7 +83,7 @@ public class TbChangeOriginatorNodeTest { @Test public void newChainCanBeStarted() throws TbNodeException { - init(true); + init(); AssetId assetId = new AssetId(UUIDs.timeBased()); CustomerId customerId = new CustomerId(UUIDs.timeBased()); Asset asset = new Asset(); @@ -109,7 +110,7 @@ public class TbChangeOriginatorNodeTest { @Test public void exceptionThrownIfCannotFindNewOriginator() throws TbNodeException { - init(true); + init(); AssetId assetId = new AssetId(UUIDs.timeBased()); CustomerId customerId = new CustomerId(UUIDs.timeBased()); Asset asset = new Asset(); @@ -121,16 +122,13 @@ public class TbChangeOriginatorNodeTest { TbMsg msg = new TbMsg(UUIDs.timeBased(), "ASSET", assetId, new TbMsgMetaData(), "{}", ruleChainId, ruleNodeId, 0L); when(ctx.getAssetService()).thenReturn(assetService); - when(assetService.findAssetByIdAsync(assetId)).thenReturn(Futures.immediateFailedFuture(new IllegalStateException("wrong"))); + when(assetService.findAssetByIdAsync(assetId)).thenReturn(Futures.immediateFuture(null)); node.onMsg(ctx, msg); - ArgumentCaptor captor = ArgumentCaptor.forClass(Throwable.class); - verify(ctx).tellError(same(msg), captor.capture()); - Throwable value = captor.getValue(); - assertEquals("wrong", value.getMessage()); + verify(ctx).tellNext(same(msg), same(FAILURE)); } - public void init(boolean startNewChain) throws TbNodeException { + public void init() throws TbNodeException { TbChangeOriginatorNodeConfiguration config = new TbChangeOriginatorNodeConfiguration(); config.setOriginatorSource(TbChangeOriginatorNode.CUSTOMER_SOURCE); ObjectMapper mapper = new ObjectMapper();