From 6e2bbe024173627f8f213d4a1dad7482e96ce56d Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 29 Jun 2017 11:11:20 +0300 Subject: [PATCH 1/7] Added deviceType and deviceName update. Merged sql.enabled and cassandra.enabled into single property - database.type. --- .../server/actors/device/DeviceActor.java | 5 ++- .../device/DeviceActorMessageProcessor.java | 12 ++--- .../server/actors/service/ActorService.java | 2 + .../actors/service/DefaultActorService.java | 16 +++++-- .../server/controller/DeviceController.java | 4 +- .../src/main/resources/thingsboard.yml | 8 ++-- .../controller/ControllerTestSuite.java | 2 +- .../dao/sql/user/JpaUserCredentialsDao.java | 6 +-- .../sql/user/UserCredentialsRepository.java | 4 +- .../thingsboard/server/dao/util/NoSqlDao.java | 2 +- .../thingsboard/server/dao/util/SqlDao.java | 2 +- .../server/dao/NoSqlDaoServiceTestSuite.java | 2 +- .../server/dao/SqlDaoServiceTestSuite.java | 2 +- .../resources/{ => cassandra}/system-test.cql | 0 dao/src/test/resources/nosql-test.properties | 3 +- .../resources/{ => postgres}/system-test.sql | 0 dao/src/test/resources/sql-test.properties | 7 +-- .../api/device/DeviceNameOrTypeUpdateMsg.java | 44 +++++++++++++++++++ 18 files changed, 88 insertions(+), 33 deletions(-) rename dao/src/test/resources/{ => cassandra}/system-test.cql (100%) rename dao/src/test/resources/{ => postgres}/system-test.sql (100%) create mode 100644 extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java index f878e7b9dd..29b1589cd4 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java @@ -28,6 +28,7 @@ import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotificationMsg; import org.thingsboard.server.extensions.api.device.DeviceCredentialsUpdateNotificationMsg; +import org.thingsboard.server.extensions.api.device.DeviceNameOrTypeUpdateMsg; import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg; import org.thingsboard.server.extensions.api.plugins.msg.*; @@ -60,7 +61,9 @@ public class DeviceActor extends ContextAwareActor { } else if (msg instanceof ToDeviceRpcRequestPluginMsg) { processor.processRpcRequest(context(), (ToDeviceRpcRequestPluginMsg) msg); } else if (msg instanceof DeviceCredentialsUpdateNotificationMsg){ - processor.processCredentialsUpdate(context(), (DeviceCredentialsUpdateNotificationMsg) msg); + processor.processCredentialsUpdate(); + } else if (msg instanceof DeviceNameOrTypeUpdateMsg){ + processor.processNameOrTypeUpdate((DeviceNameOrTypeUpdateMsg) msg); } } else if (msg instanceof TimeoutMsg) { processor.processTimeout(context(), (TimeoutMsg) msg); diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java index 10f5005b98..00af0461d1 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java @@ -37,10 +37,7 @@ import org.thingsboard.server.common.msg.session.FromDeviceMsg; import org.thingsboard.server.common.msg.session.MsgType; import org.thingsboard.server.common.msg.session.SessionType; import org.thingsboard.server.common.msg.session.ToDeviceMsg; -import org.thingsboard.server.extensions.api.device.DeviceAttributes; -import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotificationMsg; -import org.thingsboard.server.extensions.api.device.DeviceCredentialsUpdateNotificationMsg; -import org.thingsboard.server.extensions.api.device.DeviceMetaData; +import org.thingsboard.server.extensions.api.device.*; import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse; import org.thingsboard.server.extensions.api.plugins.msg.RpcError; import org.thingsboard.server.extensions.api.plugins.msg.TimeoutIntMsg; @@ -372,11 +369,16 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso } } - public void processCredentialsUpdate(ActorContext context, DeviceCredentialsUpdateNotificationMsg msg) { + public void processCredentialsUpdate() { sessions.forEach((k, v) -> { sendMsgToSessionActor(new BasicToDeviceSessionActorMsg(new SessionCloseNotification(), k), v.getServer()); }); attributeSubscriptions.clear(); rpcSubscriptions.clear(); } + + public void processNameOrTypeUpdate(DeviceNameOrTypeUpdateMsg msg) { + this.deviceName = msg.getDeviceName(); + this.deviceType = msg.getDeviceType(); + } } diff --git a/application/src/main/java/org/thingsboard/server/actors/service/ActorService.java b/application/src/main/java/org/thingsboard/server/actors/service/ActorService.java index a717d86472..dea16f000b 100644 --- a/application/src/main/java/org/thingsboard/server/actors/service/ActorService.java +++ b/application/src/main/java/org/thingsboard/server/actors/service/ActorService.java @@ -31,4 +31,6 @@ public interface ActorService extends SessionMsgProcessor, WebSocketMsgProcessor void onRuleStateChange(TenantId tenantId, RuleId ruleId, ComponentLifecycleEvent state); void onCredentialsUpdate(TenantId tenantId, DeviceId deviceId); + + void onDeviceNameOrTypeUpdate(TenantId tenantId, DeviceId deviceId, String deviceName, String deviceType); } diff --git a/application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java b/application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java index 65d2c69321..3ebe905133 100644 --- a/application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java +++ b/application/src/main/java/org/thingsboard/server/actors/service/DefaultActorService.java @@ -20,8 +20,6 @@ import akka.actor.ActorSystem; import akka.actor.Props; import akka.actor.Terminated; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.thingsboard.server.actors.ActorSystemContext; @@ -42,13 +40,13 @@ import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; import org.thingsboard.server.common.msg.cluster.ServerAddress; import org.thingsboard.server.common.msg.cluster.ToAllNodesMsg; import org.thingsboard.server.common.msg.core.ToDeviceSessionActorMsg; +import org.thingsboard.server.extensions.api.device.DeviceNameOrTypeUpdateMsg; import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; import org.thingsboard.server.extensions.api.device.DeviceCredentialsUpdateNotificationMsg; import org.thingsboard.server.extensions.api.device.ToDeviceActorNotificationMsg; import org.thingsboard.server.extensions.api.plugins.msg.ToPluginActorMsg; import org.thingsboard.server.extensions.api.plugins.rest.PluginRestMsg; -import org.thingsboard.server.extensions.api.plugins.rpc.PluginRpcMsg; import org.thingsboard.server.extensions.api.plugins.ws.msg.PluginWebsocketMsg; import org.thingsboard.server.service.cluster.discovery.DiscoveryService; import org.thingsboard.server.service.cluster.discovery.ServerInstance; @@ -238,6 +236,18 @@ public class DefaultActorService implements ActorService { } } + @Override + public void onDeviceNameOrTypeUpdate(TenantId tenantId, DeviceId deviceId, String deviceName, String deviceType) { + log.trace("[{}] Processing onDeviceNameOrTypeUpdate event, deviceName: {}, deviceType: {}", deviceId, deviceName, deviceType); + DeviceNameOrTypeUpdateMsg msg = new DeviceNameOrTypeUpdateMsg(tenantId, deviceId, deviceName, deviceType); + Optional address = actorContext.getRoutingService().resolveById(deviceId); + if (address.isPresent()) { + rpcService.tell(address.get(), msg); + } else { + onMsg(msg); + } + } + public void broadcast(ToAllNodesMsg msg) { rpcService.broadcast(msg); appActor.tell(msg, ActorRef.noSender()); diff --git a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java index 8257767140..81ddf8e585 100644 --- a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java +++ b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java @@ -61,7 +61,9 @@ public class DeviceController extends BaseController { public Device saveDevice(@RequestBody Device device) throws ThingsboardException { try { device.setTenantId(getCurrentUser().getTenantId()); - return checkNotNull(deviceService.saveDevice(device)); + Device savedDevice = checkNotNull(deviceService.saveDevice(device)); + actorService.onDeviceNameOrTypeUpdate(device.getTenantId(), device.getId(), device.getName(), device.getType()); + return savedDevice; } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index b443dcdb5c..a7c93a21c6 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -105,9 +105,11 @@ coap: adaptor: "${COAP_ADAPTOR_NAME:JsonCoapAdaptor}" timeout: "${COAP_TIMEOUT:10000}" +database: + type: "${DATABASE_TYPE:cassandra}" # cassandra OR postgres + # Cassandra driver configuration parameters cassandra: - enabled: "${CASSANDRA_ENABLED:false}" # Thingsboard cluster name cluster_name: "${CASSANDRA_CLUSTER_NAME:Thingsboard Cluster}" # Thingsboard keyspace name @@ -202,7 +204,7 @@ updates: # Enable/disable updates checking. enabled: "${UPDATES_ENABLED:true}" - # spring CORS configuration +# spring CORS configuration spring.mvc.cors: mappings: # Intercept path @@ -225,8 +227,6 @@ spring.mvc.cors: allow-credentials: "true" # SQL DAO Configuration -sql: - enabled: "${SQL_ENABLED:true}" spring: data: diff --git a/application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java b/application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java index 98e558fc0a..84e9ecdb33 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java +++ b/application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java @@ -34,6 +34,6 @@ public class ControllerTestSuite { Arrays.asList( new ClassPathCQLDataSet("cassandra/schema.cql", false, false), new ClassPathCQLDataSet("cassandra/system-data.cql", false, false), - new ClassPathCQLDataSet("system-test.cql", false, false)), + new ClassPathCQLDataSet("cassandra/system-test.cql", false, false)), "cassandra-test.yaml", 30000l); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java index 828909cca2..d333591489 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java @@ -16,16 +16,14 @@ package org.thingsboard.server.dao.sql.user; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; -import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.dao.DaoUtil; -import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.sql.UserCredentialsEntity; import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.user.UserCredentialsDao; +import org.thingsboard.server.dao.util.SqlDao; import java.util.UUID; @@ -33,7 +31,7 @@ import java.util.UUID; * Created by Valerii Sosliuk on 4/22/2017. */ @Component -@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false) +@SqlDao public class JpaUserCredentialsDao extends JpaAbstractDao implements UserCredentialsDao { @Autowired diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserCredentialsRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserCredentialsRepository.java index bb61aed13d..895aab0c54 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserCredentialsRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserCredentialsRepository.java @@ -15,16 +15,16 @@ */ package org.thingsboard.server.dao.sql.user; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.repository.CrudRepository; import org.thingsboard.server.dao.model.sql.UserCredentialsEntity; +import org.thingsboard.server.dao.util.SqlDao; import java.util.UUID; /** * Created by Valerii Sosliuk on 4/22/2017. */ -@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false) +@SqlDao public interface UserCredentialsRepository extends CrudRepository { UserCredentialsEntity findByUserId(UUID userId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/util/NoSqlDao.java b/dao/src/main/java/org/thingsboard/server/dao/util/NoSqlDao.java index 16951f539f..32b173287a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/util/NoSqlDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/util/NoSqlDao.java @@ -17,6 +17,6 @@ package org.thingsboard.server.dao.util; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -@ConditionalOnProperty(prefix = "cassandra", value = "enabled", havingValue = "true") +@ConditionalOnProperty(prefix = "database", value = "type", havingValue = "cassandra") public @interface NoSqlDao { } diff --git a/dao/src/main/java/org/thingsboard/server/dao/util/SqlDao.java b/dao/src/main/java/org/thingsboard/server/dao/util/SqlDao.java index f3def0fdc1..88a107b3eb 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/util/SqlDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/util/SqlDao.java @@ -17,6 +17,6 @@ package org.thingsboard.server.dao.util; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true") +@ConditionalOnProperty(prefix = "database", value = "type", havingValue = "postgres") public @interface SqlDao { } diff --git a/dao/src/test/java/org/thingsboard/server/dao/NoSqlDaoServiceTestSuite.java b/dao/src/test/java/org/thingsboard/server/dao/NoSqlDaoServiceTestSuite.java index d5e2199d2b..8250a219a6 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/NoSqlDaoServiceTestSuite.java +++ b/dao/src/test/java/org/thingsboard/server/dao/NoSqlDaoServiceTestSuite.java @@ -34,7 +34,7 @@ public class NoSqlDaoServiceTestSuite { new CustomCassandraCQLUnit( Arrays.asList(new ClassPathCQLDataSet("cassandra/schema.cql", false, false), new ClassPathCQLDataSet("cassandra/system-data.cql", false, false), - new ClassPathCQLDataSet("system-test.cql", false, false)), + new ClassPathCQLDataSet("cassandra/system-test.cql", false, false)), "cassandra-test.yaml", 30000L); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java b/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java index 6853cb47b1..6ba4e7ab45 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java +++ b/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java @@ -30,7 +30,7 @@ public class SqlDaoServiceTestSuite { @ClassRule public static CustomPostgresUnit postgresUnit = new CustomPostgresUnit( - Arrays.asList("postgres/schema.sql", "postgres/system-data.sql", "system-test.sql"), + Arrays.asList("postgres/schema.sql", "postgres/system-data.sql", "postgres/system-test.sql"), "postgres-embedded-test.properties"); } diff --git a/dao/src/test/resources/system-test.cql b/dao/src/test/resources/cassandra/system-test.cql similarity index 100% rename from dao/src/test/resources/system-test.cql rename to dao/src/test/resources/cassandra/system-test.cql diff --git a/dao/src/test/resources/nosql-test.properties b/dao/src/test/resources/nosql-test.properties index 3c02a6f31f..482c6e7ed3 100644 --- a/dao/src/test/resources/nosql-test.properties +++ b/dao/src/test/resources/nosql-test.properties @@ -1,2 +1 @@ -sql.enabled=false -cassandra.enabled=true \ No newline at end of file +database.type=cassandra \ No newline at end of file diff --git a/dao/src/test/resources/system-test.sql b/dao/src/test/resources/postgres/system-test.sql similarity index 100% rename from dao/src/test/resources/system-test.sql rename to dao/src/test/resources/postgres/system-test.sql diff --git a/dao/src/test/resources/sql-test.properties b/dao/src/test/resources/sql-test.properties index 3c66279d72..93402cff25 100644 --- a/dao/src/test/resources/sql-test.properties +++ b/dao/src/test/resources/sql-test.properties @@ -1,5 +1,4 @@ -cassandra.enabled=false -sql.enabled=true +database.type=postgres spring.jpa.show-sql=false spring.jpa.hibernate.ddl-auto=validate @@ -7,7 +6,3 @@ spring.jpa.hibernate.ddl-auto=validate spring.datasource.url=jdbc:postgresql://localhost:5433/thingsboard-test spring.datasource.username=postgres spring.datasource.password=postgres - -#spring.datasource.url=jdbc:h2:mem:test;MODE=PostgreSQL -#spring.datasource.schema=classpath:postgres/schema.sql -#spring.datasource.data=classpath:postgres/system-data.sql;classpath:system-test.sql \ No newline at end of file diff --git a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java new file mode 100644 index 0000000000..882d8a91de --- /dev/null +++ b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java @@ -0,0 +1,44 @@ +/** + * Copyright © 2016-2017 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 + * + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.extensions.api.device; + +import lombok.Getter; +import lombok.ToString; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.TenantId; + +/** + * @author Andrew Shvayka + */ +@ToString +public class DeviceNameOrTypeUpdateMsg implements ToDeviceActorNotificationMsg { + + @Getter + private final TenantId tenantId; + @Getter + private final DeviceId deviceId; + @Getter + private final String deviceName; + @Getter + private final String deviceType; + + public DeviceNameOrTypeUpdateMsg(TenantId tenantId, DeviceId deviceId, String deviceName, String deviceType) { + this.tenantId = tenantId; + this.deviceId = deviceId; + this.deviceName = deviceName; + this.deviceType = deviceType; + } +} From 52d53c952e18dc41fa4c414c62f705a025dcae36 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 29 Jun 2017 12:22:37 +0300 Subject: [PATCH 2/7] Fixed nullpointerexception --- .../server/controller/DeviceController.java | 11 ++++++++--- .../org/thingsboard/server/dao/JpaDaoTestSuite.java | 3 +-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java index 81ddf8e585..f0cde3316f 100644 --- a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java +++ b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java @@ -62,7 +62,12 @@ public class DeviceController extends BaseController { try { device.setTenantId(getCurrentUser().getTenantId()); Device savedDevice = checkNotNull(deviceService.saveDevice(device)); - actorService.onDeviceNameOrTypeUpdate(device.getTenantId(), device.getId(), device.getName(), device.getType()); + actorService + .onDeviceNameOrTypeUpdate( + savedDevice.getTenantId(), + savedDevice.getId(), + savedDevice.getName(), + savedDevice.getType()); return savedDevice; } catch (Exception e) { throw handleException(e); @@ -176,7 +181,7 @@ public class DeviceController extends BaseController { try { TenantId tenantId = getCurrentUser().getTenantId(); TextPageLink pageLink = createPageLink(limit, textSearch, idOffset, textOffset); - if (type != null && type.trim().length()>0) { + if (type != null && type.trim().length() > 0) { return checkNotNull(deviceService.findDevicesByTenantIdAndType(tenantId, type, pageLink)); } else { return checkNotNull(deviceService.findDevicesByTenantId(tenantId, pageLink)); @@ -215,7 +220,7 @@ public class DeviceController extends BaseController { CustomerId customerId = new CustomerId(toUUID(strCustomerId)); checkCustomerId(customerId); TextPageLink pageLink = createPageLink(limit, textSearch, idOffset, textOffset); - if (type != null && type.trim().length()>0) { + if (type != null && type.trim().length() > 0) { return checkNotNull(deviceService.findDevicesByTenantIdAndCustomerIdAndType(tenantId, customerId, type, pageLink)); } else { return checkNotNull(deviceService.findDevicesByTenantIdAndCustomerId(tenantId, customerId, pageLink)); diff --git a/dao/src/test/java/org/thingsboard/server/dao/JpaDaoTestSuite.java b/dao/src/test/java/org/thingsboard/server/dao/JpaDaoTestSuite.java index 7b880fa295..c74aeeff27 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/JpaDaoTestSuite.java +++ b/dao/src/test/java/org/thingsboard/server/dao/JpaDaoTestSuite.java @@ -24,8 +24,7 @@ import java.util.Arrays; @RunWith(ClasspathSuite.class) @ClassnameFilters({ -// "org.thingsboard.server.dao.sql.alarm.", - "org.thingsboard.server.dao.sql.*Test", + "org.thingsboard.server.dao.sql.*Test" }) public class JpaDaoTestSuite { From acbe5e73785ffd99373dc90a51d118effa361f24 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 29 Jun 2017 14:23:48 +0300 Subject: [PATCH 3/7] Added mvn memory limits --- .mvn/jvm.config | 1 + 1 file changed, 1 insertion(+) create mode 100644 .mvn/jvm.config diff --git a/.mvn/jvm.config b/.mvn/jvm.config new file mode 100644 index 0000000000..8e83f05c3b --- /dev/null +++ b/.mvn/jvm.config @@ -0,0 +1 @@ +-Xmx2048m -Xms1024m \ No newline at end of file From 8abb57387cf2b4c788e423870b28e26c52d1031a Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 29 Jun 2017 14:55:39 +0300 Subject: [PATCH 4/7] Increased maven max memory --- .mvn/jvm.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mvn/jvm.config b/.mvn/jvm.config index 8e83f05c3b..4dd7491565 100644 --- a/.mvn/jvm.config +++ b/.mvn/jvm.config @@ -1 +1 @@ --Xmx2048m -Xms1024m \ No newline at end of file +-Xmx4096m -Xms1024m \ No newline at end of file From 611995121b48f89550a50e6e54a8e11fadc5f2c2 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 29 Jun 2017 15:06:14 +0300 Subject: [PATCH 5/7] Code review fixes --- .../api/device/DeviceNameOrTypeUpdateMsg.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java index 882d8a91de..57d623c474 100644 --- a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java +++ b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java @@ -15,15 +15,14 @@ */ package org.thingsboard.server.extensions.api.device; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; -/** - * @author Andrew Shvayka - */ @ToString +@AllArgsConstructor public class DeviceNameOrTypeUpdateMsg implements ToDeviceActorNotificationMsg { @Getter @@ -34,11 +33,4 @@ public class DeviceNameOrTypeUpdateMsg implements ToDeviceActorNotificationMsg { private final String deviceName; @Getter private final String deviceType; - - public DeviceNameOrTypeUpdateMsg(TenantId tenantId, DeviceId deviceId, String deviceName, String deviceType) { - this.tenantId = tenantId; - this.deviceId = deviceId; - this.deviceName = deviceName; - this.deviceType = deviceType; - } } From 47361b016624dfd8b7eaf27a493b4e26d09c4b9d Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 29 Jun 2017 15:55:05 +0300 Subject: [PATCH 6/7] Code review fixes --- .../thingsboard/server/dao/sql/JpaAbstractDao.java | 12 ++---------- .../server/dao/sql/JpaAbstractSearchTextDao.java | 5 +++-- .../api/device/DeviceNameOrTypeUpdateMsg.java | 10 ++-------- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java index a911711c98..8abab4a135 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java @@ -18,19 +18,15 @@ package org.thingsboard.server.dao.sql; import com.datastax.driver.core.utils.UUIDs; import com.google.common.collect.Lists; import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.data.repository.CrudRepository; import org.springframework.transaction.annotation.Transactional; import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.model.BaseEntity; -import org.thingsboard.server.dao.model.SearchTextEntity; import java.util.List; import java.util.UUID; -import java.util.concurrent.Executors; import static org.springframework.transaction.annotation.Propagation.REQUIRES_NEW; @@ -46,9 +42,7 @@ public abstract class JpaAbstractDao, D> protected abstract CrudRepository getCrudRepository(); - protected boolean isSearchTextDao() { - return false; - } + protected void setSearchText(E entity) {} @Override @Transactional(propagation = REQUIRES_NEW) @@ -60,9 +54,7 @@ public abstract class JpaAbstractDao, D> log.error("Can't create entity for domain object {}", domain, e); throw new IllegalArgumentException("Can't create entity for domain object {" + domain + "}", e); } - if (isSearchTextDao()) { - ((SearchTextEntity) entity).setSearchText(((SearchTextEntity) entity).getSearchTextSource().toLowerCase()); - } + setSearchText(entity); log.debug("Saving entity {}", entity); if (entity.getId() == null) { entity.setId(UUIDs.timeBased()); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTextDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTextDao.java index a6e72c6a94..dab5f33872 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTextDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTextDao.java @@ -16,6 +16,7 @@ package org.thingsboard.server.dao.sql; import org.thingsboard.server.dao.model.BaseEntity; +import org.thingsboard.server.dao.model.SearchTextEntity; /** * Created by Valerii Sosliuk on 5/6/2017. @@ -23,7 +24,7 @@ import org.thingsboard.server.dao.model.BaseEntity; public abstract class JpaAbstractSearchTextDao , D> extends JpaAbstractDao { @Override - protected boolean isSearchTextDao() { - return true; + protected void setSearchText(E entity) { + ((SearchTextEntity) entity).setSearchText(((SearchTextEntity) entity).getSearchTextSource().toLowerCase()); } } diff --git a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java index 57d623c474..aab48f4978 100644 --- a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java +++ b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceNameOrTypeUpdateMsg.java @@ -16,21 +16,15 @@ package org.thingsboard.server.extensions.api.device; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.ToString; +import lombok.Data; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; -@ToString +@Data @AllArgsConstructor public class DeviceNameOrTypeUpdateMsg implements ToDeviceActorNotificationMsg { - - @Getter private final TenantId tenantId; - @Getter private final DeviceId deviceId; - @Getter private final String deviceName; - @Getter private final String deviceType; } From 8e272b0162b1b9b8761049534a147b2a594c3159 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 30 Jun 2017 16:35:03 +0300 Subject: [PATCH 7/7] UI: Minor fixes --- ui/src/app/api/entity.service.js | 51 +++++++++++++------ .../entity/relation/relation-table.tpl.html | 2 +- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/ui/src/app/api/entity.service.js b/ui/src/app/api/entity.service.js index 9cf08d996e..138853629f 100644 --- a/ui/src/app/api/entity.service.js +++ b/ui/src/app/api/entity.service.js @@ -892,10 +892,10 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device } } - function getRelatedEntities(rootEntityId, entityType, entitySubTypes, maxLevel, keys, typeTranslatePrefix) { + function getRelatedEntities(rootEntityId, entityType, entitySubTypes, maxLevel, keys, typeTranslatePrefix, relationType) { var deferred = $q.defer(); - var entitySearchQuery = constructRelatedEntitiesSearchQuery(rootEntityId, entityType, entitySubTypes, maxLevel); + var entitySearchQuery = constructRelatedEntitiesSearchQuery(rootEntityId, entityType, entitySubTypes, maxLevel, relationType); if (!entitySearchQuery) { deferred.reject(); } else { @@ -930,12 +930,12 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device return deferred.promise; } - function saveRelatedEntity(relatedEntity, parentEntityId, keys) { + function saveRelatedEntity(relatedEntity, parentEntityId, keys, relation) { var deferred = $q.defer(); if (relatedEntity.id.id) { - updateRelatedEntity(relatedEntity, keys, deferred); + updateRelatedEntity(relatedEntity, keys, deferred, relation); } else { - addRelatedEntity(relatedEntity, parentEntityId, keys, deferred); + addRelatedEntity(relatedEntity, parentEntityId, keys, deferred, relation); } return deferred.promise; } @@ -1073,7 +1073,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device } } - function addRelatedEntity(relatedEntity, parentEntityId, keys, deferred) { + function addRelatedEntity(relatedEntity, parentEntityId, keys, deferred, relation) { var entity = {}; entity.id = relatedEntity.id; entity.name = relatedEntity.name; @@ -1081,14 +1081,18 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device saveEntityPromise(entity).then( function success(entity) { relatedEntity.id = entity.id; - var relation = { - from: parentEntityId, - to: relatedEntity.id, - type: types.entityRelationType.contains - }; + if (!relation) { + relation = { + from: parentEntityId, + to: relatedEntity.id, + type: types.entityRelationType.contains + }; + } else { + relation.to = relatedEntity.id; + } entityRelationService.saveRelation(relation).then( function success() { - updateEntity(entity, relatedEntity, keys, deferred); + updateEntity(entity, relatedEntity, keys, deferred, relation); }, function fail() { deferred.reject(); @@ -1101,10 +1105,22 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device ); } - function updateRelatedEntity(relatedEntity, keys, deferred) { + function updateRelatedEntity(relatedEntity, keys, deferred, relation) { getEntityPromise(relatedEntity.id.entityType, relatedEntity.id.id, {ignoreLoading: true}).then( function success(entity) { - updateEntity(entity, relatedEntity, keys, deferred); + if (relation) { + relation.to = relatedEntity.id; + entityRelationService.saveRelation(relation).then( + function success() { + updateEntity(entity, relatedEntity, keys, deferred); + }, + function fail() { + deferred.reject(); + } + ); + } else { + updateEntity(entity, relatedEntity, keys, deferred); + } }, function fail() { deferred.reject(); @@ -1146,7 +1162,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device ); } - function constructRelatedEntitiesSearchQuery(rootEntityId, entityType, entitySubTypes, maxLevel) { + function constructRelatedEntitiesSearchQuery(rootEntityId, entityType, entitySubTypes, maxLevel, relationType) { var searchQuery = { parameters: { @@ -1154,8 +1170,11 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device rootType: rootEntityId.entityType, direction: types.entitySearchDirection.from }, - relationType: types.entityRelationType.contains + relationType: relationType }; + if (!relationType) { + searchQuery.relationType = types.entityRelationType.contains; + } if (maxLevel) { searchQuery.parameters.maxLevel = maxLevel; diff --git a/ui/src/app/entity/relation/relation-table.tpl.html b/ui/src/app/entity/relation/relation-table.tpl.html index c93755b2e5..56970f9815 100644 --- a/ui/src/app/entity/relation/relation-table.tpl.html +++ b/ui/src/app/entity/relation/relation-table.tpl.html @@ -125,7 +125,7 @@ + md-on-paginate="vm.onPaginate" md-page-select>