|
|
|
@ -33,29 +33,20 @@ import org.thingsboard.server.common.data.DataConstants; |
|
|
|
import org.thingsboard.server.common.data.EdgeUtils; |
|
|
|
import org.thingsboard.server.common.data.EntityType; |
|
|
|
import org.thingsboard.server.common.data.audit.ActionType; |
|
|
|
import org.thingsboard.server.common.data.edge.Edge; |
|
|
|
import org.thingsboard.server.common.data.edge.EdgeEvent; |
|
|
|
import org.thingsboard.server.common.data.edge.EdgeEventType; |
|
|
|
import org.thingsboard.server.common.data.id.EdgeId; |
|
|
|
import org.thingsboard.server.common.data.id.EntityId; |
|
|
|
import org.thingsboard.server.common.data.id.IdBased; |
|
|
|
import org.thingsboard.server.common.data.id.TenantId; |
|
|
|
import org.thingsboard.server.common.data.page.TextPageData; |
|
|
|
import org.thingsboard.server.common.data.page.TextPageLink; |
|
|
|
import org.thingsboard.server.common.data.plugin.ComponentType; |
|
|
|
import org.thingsboard.server.common.data.relation.EntityRelation; |
|
|
|
import org.thingsboard.server.common.data.relation.RelationTypeGroup; |
|
|
|
import org.thingsboard.server.common.data.rule.RuleChainType; |
|
|
|
import org.thingsboard.server.common.msg.TbMsg; |
|
|
|
import org.thingsboard.server.common.msg.session.SessionMsgType; |
|
|
|
|
|
|
|
import javax.annotation.Nullable; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.UUID; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS; |
|
|
|
|
|
|
|
@ -86,51 +77,12 @@ public class TbMsgPushToEdgeNode implements TbNode { |
|
|
|
public void onMsg(TbContext ctx, TbMsg msg) { |
|
|
|
if (DataConstants.EDGE_MSG_SOURCE.equalsIgnoreCase(msg.getMetaData().getValue(DataConstants.MSG_SOURCE_KEY))) { |
|
|
|
log.debug("Ignoring msg from the cloud, msg [{}]", msg); |
|
|
|
ctx.ack(msg); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (isSupportedOriginator(msg.getOriginator().getEntityType())) { |
|
|
|
if (isSupportedMsgType(msg.getType())) { |
|
|
|
ListenableFuture<List<EdgeId>> getEdgeIdsFuture = getEdgeIdsByOriginatorId(ctx, ctx.getTenantId(), msg.getOriginator()); |
|
|
|
Futures.addCallback(getEdgeIdsFuture, new FutureCallback<List<EdgeId>>() { |
|
|
|
@Override |
|
|
|
public void onSuccess(@Nullable List<EdgeId> edgeIds) { |
|
|
|
if (edgeIds != null && !edgeIds.isEmpty()) { |
|
|
|
for (EdgeId edgeId : edgeIds) { |
|
|
|
try { |
|
|
|
EdgeEvent edgeEvent = buildEdgeEvent(msg, ctx); |
|
|
|
if (edgeEvent == null) { |
|
|
|
log.debug("Edge event type is null. Entity Type {}", msg.getOriginator().getEntityType()); |
|
|
|
ctx.tellFailure(msg, new RuntimeException("Edge event type is null. Entity Type '" + msg.getOriginator().getEntityType() + "'")); |
|
|
|
} else { |
|
|
|
edgeEvent.setEdgeId(edgeId); |
|
|
|
ListenableFuture<EdgeEvent> saveFuture = ctx.getEdgeEventService().saveAsync(edgeEvent); |
|
|
|
Futures.addCallback(saveFuture, new FutureCallback<EdgeEvent>() { |
|
|
|
@Override |
|
|
|
public void onSuccess(@Nullable EdgeEvent event) { |
|
|
|
ctx.tellNext(msg, SUCCESS); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(Throwable th) { |
|
|
|
log.error("Could not save edge event", th); |
|
|
|
ctx.tellFailure(msg, th); |
|
|
|
} |
|
|
|
}, ctx.getDbCallbackExecutor()); |
|
|
|
} |
|
|
|
} catch (JsonProcessingException e) { |
|
|
|
log.error("Failed to build edge event", e); |
|
|
|
ctx.tellFailure(msg, e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(Throwable t) { |
|
|
|
ctx.tellFailure(msg, t); |
|
|
|
} |
|
|
|
|
|
|
|
}, ctx.getDbCallbackExecutor()); |
|
|
|
processMsg(ctx, msg); |
|
|
|
} else { |
|
|
|
log.debug("Unsupported msg type {}", msg.getType()); |
|
|
|
ctx.tellFailure(msg, new RuntimeException("Unsupported msg type '" + msg.getType() + "'")); |
|
|
|
@ -141,6 +93,50 @@ public class TbMsgPushToEdgeNode implements TbNode { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void processMsg(TbContext ctx, TbMsg msg) { |
|
|
|
ListenableFuture<List<EdgeId>> getEdgeIdsFuture = ctx.getEdgeService().findRelatedEdgeIdsByEntityId(ctx.getTenantId(), msg.getOriginator()); |
|
|
|
Futures.addCallback(getEdgeIdsFuture, new FutureCallback<List<EdgeId>>() { |
|
|
|
@Override |
|
|
|
public void onSuccess(@Nullable List<EdgeId> edgeIds) { |
|
|
|
if (edgeIds != null && !edgeIds.isEmpty()) { |
|
|
|
for (EdgeId edgeId : edgeIds) { |
|
|
|
try { |
|
|
|
EdgeEvent edgeEvent = buildEdgeEvent(msg, ctx); |
|
|
|
if (edgeEvent == null) { |
|
|
|
log.debug("Edge event type is null. Entity Type {}", msg.getOriginator().getEntityType()); |
|
|
|
ctx.tellFailure(msg, new RuntimeException("Edge event type is null. Entity Type '" + msg.getOriginator().getEntityType() + "'")); |
|
|
|
} else { |
|
|
|
edgeEvent.setEdgeId(edgeId); |
|
|
|
ListenableFuture<EdgeEvent> saveFuture = ctx.getEdgeEventService().saveAsync(edgeEvent); |
|
|
|
Futures.addCallback(saveFuture, new FutureCallback<EdgeEvent>() { |
|
|
|
@Override |
|
|
|
public void onSuccess(@Nullable EdgeEvent event) { |
|
|
|
ctx.tellNext(msg, SUCCESS); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(Throwable th) { |
|
|
|
log.error("Could not save edge event", th); |
|
|
|
ctx.tellFailure(msg, th); |
|
|
|
} |
|
|
|
}, ctx.getDbCallbackExecutor()); |
|
|
|
} |
|
|
|
} catch (JsonProcessingException e) { |
|
|
|
log.error("Failed to build edge event", e); |
|
|
|
ctx.tellFailure(msg, e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(Throwable t) { |
|
|
|
ctx.tellFailure(msg, t); |
|
|
|
} |
|
|
|
|
|
|
|
}, ctx.getDbCallbackExecutor()); |
|
|
|
} |
|
|
|
|
|
|
|
private EdgeEvent buildEdgeEvent(TbMsg msg, TbContext ctx) throws JsonProcessingException { |
|
|
|
if (DataConstants.ALARM.equals(msg.getType())) { |
|
|
|
return buildEdgeEvent(ctx.getTenantId(), ActionType.ADDED, getUUIDFromMsgData(msg), EdgeEventType.ALARM, null); |
|
|
|
@ -227,15 +223,6 @@ public class TbMsgPushToEdgeNode implements TbNode { |
|
|
|
|| DataConstants.ALARM.equals(msgType); |
|
|
|
} |
|
|
|
|
|
|
|
private ListenableFuture<List<EdgeId>> getEdgeIdsByOriginatorId(TbContext ctx, TenantId tenantId, EntityId originatorId) { |
|
|
|
if (EntityType.TENANT.equals(originatorId.getEntityType())) { |
|
|
|
TextPageData<Edge> edgesByTenantId = ctx.getEdgeService().findEdgesByTenantId(tenantId, new TextPageLink(Integer.MAX_VALUE)); |
|
|
|
return Futures.immediateFuture(edgesByTenantId.getData().stream().map(IdBased::getId).collect(Collectors.toList())); |
|
|
|
} else { |
|
|
|
return ctx.getEdgeService().findRelatedEdgeIdsByEntityId(tenantId, originatorId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void destroy() { |
|
|
|
} |
|
|
|
|