Browse Source

Added support for Tenant Entity

pull/2436/head
Volodymyr Babak 6 years ago
parent
commit
869a492c2c
  1. 10
      application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java
  2. 4
      common/data/src/main/java/org/thingsboard/server/common/data/EdgeUtils.java
  3. 3
      common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventType.java
  4. 85
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java

10
application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java

@ -298,6 +298,12 @@ public final class EdgeGrpcSession implements Closeable {
case DASHBOARD: case DASHBOARD:
entityId = new DashboardId(edgeEvent.getEntityId()); entityId = new DashboardId(edgeEvent.getEntityId());
break; break;
case TENANT:
entityId = new TenantId(edgeEvent.getEntityId());
break;
case CUSTOMER:
entityId = new CustomerId(edgeEvent.getEntityId());
break;
} }
if (entityId != null) { if (entityId != null) {
log.debug("Sending telemetry data msg, entityId [{}], body [{}]", edgeEvent.getEntityId(), edgeEvent.getEntityBody()); log.debug("Sending telemetry data msg, entityId [{}], body [{}]", edgeEvent.getEntityId(), edgeEvent.getEntityBody());
@ -748,6 +754,10 @@ public final class EdgeGrpcSession implements Closeable {
return new EntityViewId(new UUID(entityData.getEntityIdMSB(), entityData.getEntityIdLSB())); return new EntityViewId(new UUID(entityData.getEntityIdMSB(), entityData.getEntityIdLSB()));
case DASHBOARD: case DASHBOARD:
return new DashboardId(new UUID(entityData.getEntityIdMSB(), entityData.getEntityIdLSB())); return new DashboardId(new UUID(entityData.getEntityIdMSB(), entityData.getEntityIdLSB()));
case TENANT:
return new TenantId(new UUID(entityData.getEntityIdMSB(), entityData.getEntityIdLSB()));
case CUSTOMER:
return new CustomerId(new UUID(entityData.getEntityIdMSB(), entityData.getEntityIdLSB()));
default: default:
log.warn("Unsupported entity type [{}] during construct of entity id. EntityDataProto [{}]", entityData.getEntityType(), entityData); log.warn("Unsupported entity type [{}] during construct of entity id. EntityDataProto [{}]", entityData.getEntityType(), entityData);
return null; return null;

4
common/data/src/main/java/org/thingsboard/server/common/data/EdgeUtils.java

@ -39,6 +39,10 @@ public final class EdgeUtils {
return EdgeEventType.USER; return EdgeEventType.USER;
case ALARM: case ALARM:
return EdgeEventType.ALARM; return EdgeEventType.ALARM;
case TENANT:
return EdgeEventType.TENANT;
case CUSTOMER:
return EdgeEventType.CUSTOMER;
default: default:
return null; return null;
} }

3
common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventType.java

@ -26,5 +26,6 @@ public enum EdgeEventType {
EDGE, EDGE,
USER, USER,
CUSTOMER, CUSTOMER,
RELATION RELATION,
TENANT
} }

85
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java

@ -33,11 +33,15 @@ import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.EdgeUtils; import org.thingsboard.server.common.data.EdgeUtils;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.audit.ActionType; 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.EdgeEvent;
import org.thingsboard.server.common.data.edge.EdgeEventType; import org.thingsboard.server.common.data.edge.EdgeEventType;
import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.EntityId; 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.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.plugin.ComponentType;
import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.common.data.relation.RelationTypeGroup;
@ -46,10 +50,12 @@ import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.session.SessionMsgType; import org.thingsboard.server.common.msg.session.SessionMsgType;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS; import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS;
@ -84,34 +90,38 @@ public class TbMsgPushToEdgeNode implements TbNode {
} }
if (isSupportedOriginator(msg.getOriginator().getEntityType())) { if (isSupportedOriginator(msg.getOriginator().getEntityType())) {
if (isSupportedMsgType(msg.getType())) { if (isSupportedMsgType(msg.getType())) {
ListenableFuture<EdgeId> getEdgeIdFuture = getEdgeIdByOriginatorId(ctx, ctx.getTenantId(), msg.getOriginator()); ListenableFuture<List<EdgeId>> getEdgeIdsFuture = getEdgeIdsByOriginatorId(ctx, ctx.getTenantId(), msg.getOriginator());
Futures.addCallback(getEdgeIdFuture, new FutureCallback<EdgeId>() { Futures.addCallback(getEdgeIdsFuture, new FutureCallback<List<EdgeId>>() {
@Override @Override
public void onSuccess(@Nullable EdgeId edgeId) { public void onSuccess(@Nullable List<EdgeId> edgeIds) {
try { if (edgeIds != null && !edgeIds.isEmpty()) {
EdgeEvent edgeEvent = buildEdgeEvent(msg, ctx); for (EdgeId edgeId : edgeIds) {
if (edgeEvent == null) { try {
log.debug("Edge event type is null. Entity Type {}", msg.getOriginator().getEntityType()); EdgeEvent edgeEvent = buildEdgeEvent(msg, ctx);
ctx.tellFailure(msg, new RuntimeException("Edge event type is null. Entity Type '" + msg.getOriginator().getEntityType() + "'")); if (edgeEvent == null) {
} else { log.debug("Edge event type is null. Entity Type {}", msg.getOriginator().getEntityType());
edgeEvent.setEdgeId(edgeId); ctx.tellFailure(msg, new RuntimeException("Edge event type is null. Entity Type '" + msg.getOriginator().getEntityType() + "'"));
ListenableFuture<EdgeEvent> saveFuture = ctx.getEdgeEventService().saveAsync(edgeEvent); } else {
Futures.addCallback(saveFuture, new FutureCallback<EdgeEvent>() { edgeEvent.setEdgeId(edgeId);
@Override ListenableFuture<EdgeEvent> saveFuture = ctx.getEdgeEventService().saveAsync(edgeEvent);
public void onSuccess(@Nullable EdgeEvent event) { Futures.addCallback(saveFuture, new FutureCallback<EdgeEvent>() {
ctx.tellNext(msg, SUCCESS); @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) {
@Override log.error("Failed to build edge event", e);
public void onFailure(Throwable th) { ctx.tellFailure(msg, e);
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);
} }
} }
@ -201,6 +211,8 @@ public class TbMsgPushToEdgeNode implements TbNode {
case ASSET: case ASSET:
case ENTITY_VIEW: case ENTITY_VIEW:
case DASHBOARD: case DASHBOARD:
case TENANT:
case CUSTOMER:
return true; return true;
default: default:
return false; return false;
@ -215,15 +227,20 @@ public class TbMsgPushToEdgeNode implements TbNode {
|| DataConstants.ALARM.equals(msgType); || DataConstants.ALARM.equals(msgType);
} }
private ListenableFuture<EdgeId> getEdgeIdByOriginatorId(TbContext ctx, TenantId tenantId, EntityId originatorId) { private ListenableFuture<List<EdgeId>> getEdgeIdsByOriginatorId(TbContext ctx, TenantId tenantId, EntityId originatorId) {
ListenableFuture<List<EntityRelation>> future = ctx.getRelationService().findByToAndTypeAsync(tenantId, originatorId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); if (EntityType.TENANT.equals(originatorId.getEntityType())) {
return Futures.transform(future, relations -> { TextPageData<Edge> edgesByTenantId = ctx.getEdgeService().findEdgesByTenantId(tenantId, new TextPageLink(Integer.MAX_VALUE));
if (relations != null && relations.size() > 0) { return Futures.immediateFuture(edgesByTenantId.getData().stream().map(IdBased::getId).collect(Collectors.toList()));
return new EdgeId(relations.get(0).getFrom().getId()); } else {
} else { ListenableFuture<List<EntityRelation>> future = ctx.getRelationService().findByToAndTypeAsync(tenantId, originatorId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE);
return null; return Futures.transform(future, relations -> {
} List<EdgeId> result = new ArrayList<>();
}, ctx.getDbCallbackExecutor()); if (relations != null && relations.size() > 0) {
result.add(new EdgeId(relations.get(0).getFrom().getId()));
}
return result;
}, ctx.getDbCallbackExecutor());
}
} }
@Override @Override

Loading…
Cancel
Save