diff --git a/application/src/main/java/org/thingsboard/server/controller/DashboardController.java b/application/src/main/java/org/thingsboard/server/controller/DashboardController.java index c8e364a570..eaa9c97ec8 100644 --- a/application/src/main/java/org/thingsboard/server/controller/DashboardController.java +++ b/application/src/main/java/org/thingsboard/server/controller/DashboardController.java @@ -540,158 +540,6 @@ public class DashboardController extends BaseController { } } - @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/dashboard/{dashboardId}/edges", method = RequestMethod.POST) - @ResponseBody - public Dashboard updateDashboardEdges(@PathVariable(DASHBOARD_ID) String strDashboardId, - @RequestBody String[] strEdgeIds) throws ThingsboardException { - checkParameter(DASHBOARD_ID, strDashboardId); - try { - DashboardId dashboardId = new DashboardId(toUUID(strDashboardId)); - Dashboard dashboard = checkDashboardId(dashboardId, Operation.ASSIGN_TO_EDGE); - - Set edgeIds = new HashSet<>(); - if (strEdgeIds != null) { - for (String strEdgeId : strEdgeIds) { - edgeIds.add(new EdgeId(toUUID(strEdgeId))); - } - } - - Set addedEdgeIds = new HashSet<>(); - Set removedEdgeIds = new HashSet<>(); - for (EdgeId edgeId : edgeIds) { - if (!dashboard.isAssignedToEdge(edgeId)) { - addedEdgeIds.add(edgeId); - } - } - - Set assignedEdges = dashboard.getAssignedEdges(); - if (assignedEdges != null) { - for (ShortEdgeInfo edgeInfo : assignedEdges) { - if (!edgeIds.contains(edgeInfo.getEdgeId())) { - removedEdgeIds.add(edgeInfo.getEdgeId()); - } - } - } - - if (addedEdgeIds.isEmpty() && removedEdgeIds.isEmpty()) { - return dashboard; - } else { - Dashboard savedDashboard = null; - for (EdgeId edgeId : addedEdgeIds) { - savedDashboard = checkNotNull(dashboardService.assignDashboardToEdge(getCurrentUser().getTenantId(), dashboardId, edgeId)); - ShortEdgeInfo edgeInfo = savedDashboard.getAssignedEdgeInfo(edgeId); - logEntityAction(dashboardId, savedDashboard, - null, - ActionType.ASSIGNED_TO_EDGE, null, strDashboardId, edgeId.toString(), edgeInfo.getTitle()); - } - for (EdgeId edgeId : removedEdgeIds) { - ShortEdgeInfo edgeInfo = dashboard.getAssignedEdgeInfo(edgeId); - savedDashboard = checkNotNull(dashboardService.unassignDashboardFromEdge(getCurrentUser().getTenantId(), dashboardId, edgeId)); - logEntityAction(dashboardId, dashboard, - null, - ActionType.UNASSIGNED_FROM_EDGE, null, strDashboardId, edgeId.toString(), edgeInfo.getTitle()); - - } - return savedDashboard; - } - } catch (Exception e) { - - logEntityAction(emptyId(EntityType.DASHBOARD), null, - null, - ActionType.ASSIGNED_TO_EDGE, e, strDashboardId); - - throw handleException(e); - } - } - - @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/dashboard/{dashboardId}/edges/add", method = RequestMethod.POST) - @ResponseBody - public Dashboard addDashboardEdges(@PathVariable(DASHBOARD_ID) String strDashboardId, - @RequestBody String[] strEdgeIds) throws ThingsboardException { - checkParameter(DASHBOARD_ID, strDashboardId); - try { - DashboardId dashboardId = new DashboardId(toUUID(strDashboardId)); - Dashboard dashboard = checkDashboardId(dashboardId, Operation.ASSIGN_TO_EDGE); - - Set edgeIds = new HashSet<>(); - if (strEdgeIds != null) { - for (String strEdgeId : strEdgeIds) { - EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); - if (!dashboard.isAssignedToEdge(edgeId)) { - edgeIds.add(edgeId); - } - } - } - - if (edgeIds.isEmpty()) { - return dashboard; - } else { - Dashboard savedDashboard = null; - for (EdgeId edgeId : edgeIds) { - savedDashboard = checkNotNull(dashboardService.assignDashboardToEdge(getCurrentUser().getTenantId(), dashboardId, edgeId)); - ShortEdgeInfo edgeInfo = savedDashboard.getAssignedEdgeInfo(edgeId); - logEntityAction(dashboardId, savedDashboard, - null, - ActionType.ASSIGNED_TO_EDGE, null, strDashboardId, edgeId.toString(), edgeInfo.getTitle()); - } - return savedDashboard; - } - } catch (Exception e) { - - logEntityAction(emptyId(EntityType.DASHBOARD), null, - null, - ActionType.ASSIGNED_TO_EDGE, e, strDashboardId); - - throw handleException(e); - } - } - - @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/dashboard/{dashboardId}/edges/remove", method = RequestMethod.POST) - @ResponseBody - public Dashboard removeDashboardEdges(@PathVariable(DASHBOARD_ID) String strDashboardId, - @RequestBody String[] strEdgeIds) throws ThingsboardException { - checkParameter(DASHBOARD_ID, strDashboardId); - try { - DashboardId dashboardId = new DashboardId(toUUID(strDashboardId)); - Dashboard dashboard = checkDashboardId(dashboardId, Operation.UNASSIGN_FROM_EDGE); - - Set edgeIds = new HashSet<>(); - if (strEdgeIds != null) { - for (String strEdgeId : strEdgeIds) { - EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); - if (dashboard.isAssignedToEdge(edgeId)) { - edgeIds.add(edgeId); - } - } - } - - if (edgeIds.isEmpty()) { - return dashboard; - } else { - Dashboard savedDashboard = null; - for (EdgeId edgeId : edgeIds) { - ShortEdgeInfo edgeInfo = dashboard.getAssignedEdgeInfo(edgeId); - savedDashboard = checkNotNull(dashboardService.unassignDashboardFromEdge(getCurrentUser().getTenantId(), dashboardId, edgeId)); - logEntityAction(dashboardId, dashboard, - null, - ActionType.UNASSIGNED_FROM_EDGE, null, strDashboardId, edgeId.toString(), edgeInfo.getTitle()); - - } - return savedDashboard; - } - } catch (Exception e) { - - logEntityAction(emptyId(EntityType.DASHBOARD), null, - null, - ActionType.UNASSIGNED_FROM_EDGE, e, strDashboardId); - - throw handleException(e); - } - } - @PreAuthorize("hasAuthority('TENANT_ADMIN')") @RequestMapping(value = "/edge/{edgeId}/dashboards", params = { "limit" }, method = RequestMethod.GET) @ResponseBody diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java index 09b809bcdc..f16d551eae 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java @@ -61,7 +61,5 @@ public interface DashboardService { void unassignEdgeDashboards(TenantId tenantId, EdgeId edgeId); - void updateEdgeDashboards(TenantId tenantId, EdgeId edgeId); - ListenableFuture> findDashboardsByTenantIdAndEdgeId(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java index 8b4baffbae..d3913cf691 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java @@ -22,6 +22,7 @@ import org.thingsboard.server.common.data.Event; import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeSearchQuery; import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; @@ -82,6 +83,8 @@ public interface EdgeService { Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException; ListenableFuture> findEdgesByTenantIdAndRuleChainId(TenantId tenantId, RuleChainId ruleChainId, TimePageLink pageLink); + + ListenableFuture> findEdgesByTenantIdAndDashboardId(TenantId tenantId, DashboardId dashboardId, TimePageLink pageLink); } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/DashboardInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/DashboardInfo.java index 263e756082..97889a488e 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/DashboardInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/DashboardInfo.java @@ -32,9 +32,6 @@ public class DashboardInfo extends SearchTextBased implements HasNa private String title; private Set assignedCustomers; - @Getter @Setter - private Set assignedEdges; - public DashboardInfo() { super(); } @@ -123,29 +120,6 @@ public class DashboardInfo extends SearchTextBased implements HasNa } } - public boolean isAssignedToEdge(EdgeId edgeId) { - return EdgeUtils.isAssignedToEdge(this.assignedEdges, edgeId); - } - - public ShortEdgeInfo getAssignedEdgeInfo(EdgeId edgeId) { - return EdgeUtils.getAssignedEdgeInfo(this.assignedEdges, edgeId); - } - - public boolean addAssignedEdge(Edge edge) { - if (this.assignedEdges == null) { - this.assignedEdges = new HashSet<>(); - } - return EdgeUtils.addAssignedEdge(this.assignedEdges, edge.toShortEdgeInfo()); - } - - public boolean updateAssignedEdge(Edge edge) { - return EdgeUtils.updateAssignedEdge(this.assignedEdges, edge.toShortEdgeInfo()); - } - - public boolean removeAssignedEdge(Edge edge) { - return EdgeUtils.removeAssignedEdge(this.assignedEdges, edge.toShortEdgeInfo()); - } - @Override @JsonProperty(access = JsonProperty.Access.READ_ONLY) public String getName() { diff --git a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java index a067fc72cb..3658dc22e8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java @@ -245,17 +245,13 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb if (!edge.getTenantId().getId().equals(dashboard.getTenantId().getId())) { throw new DataValidationException("Can't assign dashboard to edge from different tenant!"); } - if (dashboard.addAssignedEdge(edge)) { - try { - createRelation(tenantId, new EntityRelation(edgeId, dashboardId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE)); - } catch (ExecutionException | InterruptedException e) { - log.warn("[{}] Failed to create dashboard relation. Edge Id: [{}]", dashboardId, edgeId); - throw new RuntimeException(e); - } - return saveDashboard(dashboard); - } else { - return dashboard; + try { + createRelation(tenantId, new EntityRelation(edgeId, dashboardId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE)); + } catch (ExecutionException | InterruptedException e) { + log.warn("[{}] Failed to create dashboard relation. Edge Id: [{}]", dashboardId, edgeId); + throw new RuntimeException(e); } + return dashboard; } @Override @@ -265,17 +261,13 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb if (edge == null) { throw new DataValidationException("Can't unassign dashboard from non-existent edge!"); } - if (dashboard.removeAssignedEdge(edge)) { - try { - deleteRelation(tenantId, new EntityRelation(edgeId, dashboardId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE)); - } catch (ExecutionException | InterruptedException e) { - log.warn("[{}] Failed to delete dashboard relation. Edge Id: [{}]", dashboardId, edgeId); - throw new RuntimeException(e); - } - return saveDashboard(dashboard); - } else { - return dashboard; + try { + deleteRelation(tenantId, new EntityRelation(edgeId, dashboardId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE)); + } catch (ExecutionException | InterruptedException e) { + log.warn("[{}] Failed to delete dashboard relation. Edge Id: [{}]", dashboardId, edgeId); + throw new RuntimeException(e); } + return dashboard; } @Override @@ -289,17 +281,6 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb new EdgeDashboardsUnassigner(edge).removeEntities(tenantId, edge); } - @Override - public void updateEdgeDashboards(TenantId tenantId, EdgeId edgeId) { - log.trace("Executing updateEdgeDashboards, edgeId [{}]", edgeId); - Validator.validateId(edgeId, "Incorrect edgeId " + edgeId); - Edge edge = edgeDao.findById(tenantId, edgeId.getId()); - if (edge == null) { - throw new DataValidationException("Can't update dashboards for non-existent edge!"); - } - new EdgeDashboardsUpdater(edge).removeEntities(tenantId, edge); - } - @Override public ListenableFuture> findDashboardsByTenantIdAndEdgeId(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) { log.trace("Executing findDashboardsByTenantIdAndEdgeId, tenantId [{}], edgeId [{}], pageLink [{}]", tenantId, edgeId, pageLink); @@ -317,15 +298,6 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb }, MoreExecutors.directExecutor()); } - private Dashboard updateAssignedEdge(TenantId tenantId, DashboardId dashboardId, Edge edge) { - Dashboard dashboard = findDashboardById(tenantId, dashboardId); - if (dashboard.updateAssignedEdge(edge)) { - return saveDashboard(dashboard); - } else { - return dashboard; - } - } - private DataValidator dashboardValidator = new DataValidator() { @Override @@ -432,29 +404,4 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb } } - - private class EdgeDashboardsUpdater extends TimePaginatedRemover { - - private Edge edge; - - EdgeDashboardsUpdater(Edge edge) { - this.edge = edge; - } - - @Override - protected List findEntities(TenantId tenantId, Edge edge, TimePageLink pageLink) { - try { - return dashboardInfoDao.findDashboardsByTenantIdAndEdgeId(edge.getTenantId().getId(), edge.getId().getId(), pageLink).get(); - } catch (InterruptedException | ExecutionException e) { - log.warn("Failed to get dashboards by tenantId [{}] and edgeId [{}].", edge.getTenantId().getId(), edge.getId().getId()); - throw new RuntimeException(e); - } - } - - @Override - protected void removeEntity(TenantId tenantId, DashboardInfo entity) { - updateAssignedEdge(edge.getTenantId(), new DashboardId(entity.getUuidId()), this.edge); - } - - } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java b/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java index 42253db06c..835917b153 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeDao.java @@ -24,6 +24,7 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.EntitySubtype; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; @@ -120,4 +121,17 @@ public class CassandraEdgeDao extends CassandraAbstractSearchTextDao> findEdgesByTenantIdAndDashboardId(UUID tenantId, UUID dashboardId, TimePageLink pageLink) { + log.debug("Try to find edges by tenantId [{}], dashboardId [{}] and pageLink [{}]", tenantId, dashboardId, pageLink); + ListenableFuture> relations = relationDao.findAllByToAndType(new TenantId(tenantId), new DashboardId(dashboardId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); + return Futures.transformAsync(relations, input -> { + List> edgeFutures = new ArrayList<>(input.size()); + for (EntityRelation relation : input) { + edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getTo().getId())); + } + return Futures.successfulAsList(edgeFutures); + }, MoreExecutors.directExecutor()); + } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeDao.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeDao.java index 0002b96ad0..adc844f14e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeDao.java @@ -135,4 +135,14 @@ public interface EdgeDao extends Dao { * @return the list of rule chain objects */ ListenableFuture> findEdgesByTenantIdAndRuleChainId(UUID tenantId, UUID ruleChainId, TimePageLink pageLink); + + /** + * Find edges by tenantId, dashboardId and page link. + * + * @param tenantId the tenantId + * @param dashboardId the dashboardId + * @param pageLink the page link + * @return the list of rule chain objects + */ + ListenableFuture> findEdgesByTenantIdAndDashboardId(UUID tenantId, UUID dashboardId, TimePageLink pageLink); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java index 3bfb1d114e..31cbe1c765 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java @@ -32,6 +32,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Dashboard; +import org.thingsboard.server.common.data.DashboardInfo; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EntitySubtype; @@ -48,6 +49,7 @@ import org.thingsboard.server.common.data.edge.EdgeQueueEntry; import org.thingsboard.server.common.data.edge.EdgeSearchQuery; import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EntityId; @@ -191,9 +193,7 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic public Edge saveEdge(Edge edge) { log.trace("Executing saveEdge [{}]", edge); edgeValidator.validate(edge, Edge::getTenantId); - Edge savedEdge = edgeDao.save(edge.getTenantId(), edge); - dashboardService.updateEdgeDashboards(savedEdge.getTenantId(), savedEdge.getId()); - return savedEdge; + return edgeDao.save(edge.getTenantId(), edge); } @Override @@ -568,11 +568,19 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic case DataConstants.ENTITY_CREATED: case DataConstants.ENTITY_UPDATED: Dashboard dashboard = mapper.readValue(tbMsg.getData(), Dashboard.class); - if (dashboard.getAssignedEdges() != null && !dashboard.getAssignedEdges().isEmpty()) { - for (ShortEdgeInfo assignedEdge : dashboard.getAssignedEdges()) { - pushEventToEdge(tenantId, assignedEdge.getEdgeId(), EdgeQueueEntityType.DASHBOARD, tbMsg, callback); + ListenableFuture> future = findEdgesByTenantIdAndDashboardId(tenantId, dashboard.getId(), new TimePageLink(Integer.MAX_VALUE)); + Futures.transform(future, edges -> { + if (edges != null && edges.getData() != null && !edges.getData().isEmpty()) { + try { + for (Edge edge : edges.getData()) { + pushEventToEdge(tenantId, edge.getId(), EdgeQueueEntityType.DASHBOARD, tbMsg, callback); + } + } catch (IOException e) { + log.error("Can't push event to edge", e); + } } - } + return null; + }, MoreExecutors.directExecutor()); break; } } @@ -674,6 +682,24 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic }, MoreExecutors.directExecutor()); } + @Override + public ListenableFuture> findEdgesByTenantIdAndDashboardId(TenantId tenantId, DashboardId dashboardId, TimePageLink pageLink) { + log.trace("Executing findEdgesByTenantIdAndDashboardId, tenantId [{}], dashboardId [{}], pageLink [{}]", tenantId, dashboardId, pageLink); + Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); + Validator.validateId(dashboardId, "Incorrect dashboardId " + dashboardId); + Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); + ListenableFuture> edges = edgeDao.findEdgesByTenantIdAndDashboardId(tenantId.getId(), dashboardId.getId(), pageLink); + + return Futures.transform(edges, new Function, TimePageData>() { + @Nullable + @Override + public TimePageData apply(@Nullable List edges) { + return new TimePageData<>(edges, pageLink); + } + }, MoreExecutors.directExecutor()); + } + + private DataValidator edgeValidator = new DataValidator() { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index 5e5f8398b5..7c089f8975 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java @@ -302,7 +302,6 @@ public class ModelConstants { public static final String DASHBOARD_TITLE_PROPERTY = TITLE_PROPERTY; public static final String DASHBOARD_CONFIGURATION_PROPERTY = "configuration"; public static final String DASHBOARD_ASSIGNED_CUSTOMERS_PROPERTY = "assigned_customers"; - public static final String DASHBOARD_ASSIGNED_EDGES_PROPERTY = "assigned_edges"; public static final String DASHBOARD_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "dashboard_by_tenant_and_search_text"; diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java index 8c687eaccc..69eb43744c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java @@ -28,7 +28,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.DashboardInfo; import org.thingsboard.server.common.data.ShortCustomerInfo; -import org.thingsboard.server.common.data.ShortEdgeInfo; import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.model.SearchTextEntity; @@ -38,7 +37,6 @@ import java.util.HashSet; import java.util.UUID; import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_ASSIGNED_CUSTOMERS_PROPERTY; -import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_ASSIGNED_EDGES_PROPERTY; import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME; import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_TENANT_ID_PROPERTY; import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_TITLE_PROPERTY; @@ -54,8 +52,6 @@ public class DashboardInfoEntity implements SearchTextEntity { private static final ObjectMapper objectMapper = new ObjectMapper(); private static final JavaType assignedCustomersType = objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class); - private static final JavaType assignedEdgesType = - objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortEdgeInfo.class); @PartitionKey(value = 0) @Column(name = ID_PROPERTY) @@ -74,9 +70,6 @@ public class DashboardInfoEntity implements SearchTextEntity { @Column(name = DASHBOARD_ASSIGNED_CUSTOMERS_PROPERTY) private String assignedCustomers; - @Column(name = DASHBOARD_ASSIGNED_EDGES_PROPERTY) - private String assignedEdges; - public DashboardInfoEntity() { super(); } @@ -96,13 +89,6 @@ public class DashboardInfoEntity implements SearchTextEntity { log.error("Unable to serialize assigned customers to string!", e); } } - if (dashboardInfo.getAssignedEdges() != null) { - try { - this.assignedEdges = objectMapper.writeValueAsString(dashboardInfo.getAssignedEdges()); - } catch (JsonProcessingException e) { - log.error("Unable to serialize assigned edges to string!", e); - } - } } public UUID getUuid() { @@ -137,14 +123,6 @@ public class DashboardInfoEntity implements SearchTextEntity { this.assignedCustomers = assignedCustomers; } - public String getAssignedEdges() { - return assignedEdges; - } - - public void setAssignedEdges(String assignedEdges) { - this.assignedEdges = assignedEdges; - } - @Override public String getSearchTextSource() { return getTitle(); @@ -174,13 +152,6 @@ public class DashboardInfoEntity implements SearchTextEntity { log.warn("Unable to parse assigned customers!", e); } } - if (!StringUtils.isEmpty(assignedEdges)) { - try { - dashboardInfo.setAssignedEdges(objectMapper.readValue(assignedEdges, assignedEdgesType)); - } catch (IOException e) { - log.warn("Unable to parse assigned edges!", e); - } - } return dashboardInfo; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java index aef6795904..07cec4d12f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java @@ -28,7 +28,6 @@ import org.hibernate.annotations.TypeDef; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.ShortCustomerInfo; -import org.thingsboard.server.common.data.ShortEdgeInfo; import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.model.BaseSqlEntity; @@ -53,8 +52,6 @@ public final class DashboardEntity extends BaseSqlEntity implements S private static final ObjectMapper objectMapper = new ObjectMapper(); private static final JavaType assignedCustomersType = objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class); - private static final JavaType assignedEdgesType = - objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortEdgeInfo.class); @Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY) private String tenantId; @@ -68,9 +65,6 @@ public final class DashboardEntity extends BaseSqlEntity implements S @Column(name = ModelConstants.DASHBOARD_ASSIGNED_CUSTOMERS_PROPERTY) private String assignedCustomers; - @Column(name = ModelConstants.DASHBOARD_ASSIGNED_EDGES_PROPERTY) - private String assignedEdges; - @Type(type = "json") @Column(name = ModelConstants.DASHBOARD_CONFIGURATION_PROPERTY) private JsonNode configuration; @@ -94,13 +88,6 @@ public final class DashboardEntity extends BaseSqlEntity implements S log.error("Unable to serialize assigned customers to string!", e); } } - if (dashboard.getAssignedEdges() != null) { - try { - this.assignedEdges = objectMapper.writeValueAsString(dashboard.getAssignedEdges()); - } catch (JsonProcessingException e) { - log.error("Unable to serialize assigned edges to string!", e); - } - } this.configuration = dashboard.getConfiguration(); } @@ -129,13 +116,6 @@ public final class DashboardEntity extends BaseSqlEntity implements S log.warn("Unable to parse assigned customers!", e); } } - if (!StringUtils.isEmpty(assignedEdges)) { - try { - dashboard.setAssignedEdges(objectMapper.readValue(assignedEdges, assignedEdgesType)); - } catch (IOException e) { - log.warn("Unable to parse assigned edges!", e); - } - } dashboard.setConfiguration(configuration); return dashboard; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java index 0cd3102075..709ab4fee6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java @@ -5,7 +5,7 @@ * 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, @@ -25,7 +25,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.DashboardInfo; import org.thingsboard.server.common.data.ShortCustomerInfo; -import org.thingsboard.server.common.data.ShortEdgeInfo; import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.model.BaseSqlEntity; @@ -48,8 +47,6 @@ public class DashboardInfoEntity extends BaseSqlEntity implements private static final ObjectMapper objectMapper = new ObjectMapper(); private static final JavaType assignedCustomersType = objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class); - private static final JavaType assignedEdgesType = - objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortEdgeInfo.class); @Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY) private String tenantId; @@ -63,9 +60,6 @@ public class DashboardInfoEntity extends BaseSqlEntity implements @Column(name = ModelConstants.DASHBOARD_ASSIGNED_CUSTOMERS_PROPERTY) private String assignedCustomers; - @Column(name = ModelConstants.DASHBOARD_ASSIGNED_EDGES_PROPERTY) - private String assignedEdges; - public DashboardInfoEntity() { super(); } @@ -85,13 +79,6 @@ public class DashboardInfoEntity extends BaseSqlEntity implements log.error("Unable to serialize assigned customers to string!", e); } } - if (dashboardInfo.getAssignedEdges() != null) { - try { - this.assignedEdges = objectMapper.writeValueAsString(dashboardInfo.getAssignedEdges()); - } catch (JsonProcessingException e) { - log.error("Unable to serialize assigned edges to string!", e); - } - } } @Override @@ -123,13 +110,6 @@ public class DashboardInfoEntity extends BaseSqlEntity implements log.warn("Unable to parse assigned customers!", e); } } - if (!StringUtils.isEmpty(assignedEdges)) { - try { - dashboardInfo.setAssignedEdges(objectMapper.readValue(assignedEdges, assignedEdgesType)); - } catch (IOException e) { - log.warn("Unable to parse assigned edges!", e); - } - } return dashboardInfo; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java index 1bdaab82c1..e21a24ee0d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java @@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.EntitySubtype; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.UUIDConverter; import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; @@ -159,6 +160,19 @@ public class JpaEdgeDao extends JpaAbstractSearchTextDao imple }, MoreExecutors.directExecutor()); } + @Override + public ListenableFuture> findEdgesByTenantIdAndDashboardId(UUID tenantId, UUID dashboardId, TimePageLink pageLink) { + log.debug("Try to find edges by tenantId [{}], dashboardId [{}] and pageLink [{}]", tenantId, dashboardId, pageLink); + ListenableFuture> relations = relationDao.findAllByToAndType(new TenantId(tenantId), new DashboardId(dashboardId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); + return Futures.transformAsync(relations, input -> { + List> edgeFutures = new ArrayList<>(input.size()); + for (EntityRelation relation : input) { + edgeFutures.add(findByIdAsync(new TenantId(tenantId), relation.getTo().getId())); + } + return Futures.successfulAsList(edgeFutures); + }, MoreExecutors.directExecutor()); + } + private List convertTenantEdgeTypesToDto(UUID tenantId, List types) { List list = Collections.emptyList(); if (types != null && !types.isEmpty()) {