From 9a749bf720c221267ec427088deb5a68eaef027f Mon Sep 17 00:00:00 2001 From: Bohdan Smetaniuk Date: Fri, 5 Jun 2020 12:57:41 +0300 Subject: [PATCH 1/2] fixed bug with saving similar edges in db --- .../server/dao/edge/EdgeServiceImpl.java | 15 ++++++++++++++- .../main/resources/sql/schema-entities-hsql.sql | 4 +++- dao/src/main/resources/sql/schema-entities.sql | 4 +++- 3 files changed, 20 insertions(+), 3 deletions(-) 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 c7b1d87ab9..126899e270 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 @@ -23,6 +23,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; +import org.bouncycastle.util.test.FixedSecureRandom; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; @@ -730,6 +731,11 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic throw new DataValidationException("Edge with such name already exists!"); } ); + edgeDao.findByRoutingKey(edge.getTenantId().getId(), edge.getRoutingKey()).ifPresent( + d -> { + throw new DataValidationException("Edge with such routing_key already exists"); + } + ); } } @@ -743,13 +749,20 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic } } ); + edgeDao.findByRoutingKey(edge.getTenantId().getId(), edge.getRoutingKey()).ifPresent( + e -> { + if (!e.getUuidId().equals(edge.getUuidId())) { + throw new DataValidationException("Edge with such routing_key already exists!"); + } + } + ); } } @Override protected void validateDataImpl(TenantId tenantId, Edge edge) { if (StringUtils.isEmpty(edge.getType())) { - throw new DataValidationException("Edge type should be specified!"); + throw new DataValidationException("Edge typeshould be specified!"); } if (StringUtils.isEmpty(edge.getName())) { throw new DataValidationException("Edge name should be specified!"); diff --git a/dao/src/main/resources/sql/schema-entities-hsql.sql b/dao/src/main/resources/sql/schema-entities-hsql.sql index 42f52a2184..cd8eae9e34 100644 --- a/dao/src/main/resources/sql/schema-entities-hsql.sql +++ b/dao/src/main/resources/sql/schema-entities-hsql.sql @@ -266,5 +266,7 @@ CREATE TABLE IF NOT EXISTS edge ( routing_key varchar(255), secret varchar(255), search_text varchar(255), - tenant_id varchar(31) + tenant_id varchar(31), + CONSTRAINT edge_name_unq_key UNIQUE (tenant_id, name), + CONSTRAINT edge_routing_key_unq_key UNIQUE (routing_key) ); diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index ffea8bdf39..de526788d3 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -266,7 +266,9 @@ CREATE TABLE IF NOT EXISTS edge ( routing_key varchar(255), secret varchar(255), search_text varchar(255), - tenant_id varchar(31) + tenant_id varchar(31), + CONSTRAINT edge_name_unq_key UNIQUE (tenant_id, name), + CONSTRAINT edge_routing_key_unq_key UNIQUE (routing_key) ); CREATE OR REPLACE PROCEDURE cleanup_events_by_ttl(IN ttl bigint, IN debug_ttl bigint, INOUT deleted bigint) From a540298a078ff2bd04cb7faf1ed556b768351b80 Mon Sep 17 00:00:00 2001 From: Bohdan Smetaniuk Date: Fri, 5 Jun 2020 13:02:48 +0300 Subject: [PATCH 2/2] ref fixes --- .../org/thingsboard/server/dao/edge/EdgeServiceImpl.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) 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 126899e270..17ff2003bf 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 @@ -23,7 +23,6 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; -import org.bouncycastle.util.test.FixedSecureRandom; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; @@ -33,14 +32,12 @@ 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; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityView; import org.thingsboard.server.common.data.Event; -import org.thingsboard.server.common.data.ShortEdgeInfo; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.asset.Asset; @@ -48,13 +45,10 @@ import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeQueueEntityType; 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; -import org.thingsboard.server.common.data.id.EntityViewId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TextPageData; @@ -762,7 +756,7 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic @Override protected void validateDataImpl(TenantId tenantId, Edge edge) { if (StringUtils.isEmpty(edge.getType())) { - throw new DataValidationException("Edge typeshould be specified!"); + throw new DataValidationException("Edge type should be specified!"); } if (StringUtils.isEmpty(edge.getName())) { throw new DataValidationException("Edge name should be specified!");