diff --git a/application/pom.xml b/application/pom.xml index df6195fd24..eb1971f910 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -249,11 +249,6 @@ spring-test-dbunit test - - ru.yandex.qatools.embed - postgresql-embedded - test - diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index a7c93a21c6..a06b9d3765 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -106,7 +106,7 @@ coap: timeout: "${COAP_TIMEOUT:10000}" database: - type: "${DATABASE_TYPE:cassandra}" # cassandra OR postgres + type: "${DATABASE_TYPE:cassandra}" # cassandra OR sql # Cassandra driver configuration parameters cassandra: diff --git a/application/src/test/java/org/thingsboard/server/system/SystemSqlTestSuite.java b/application/src/test/java/org/thingsboard/server/system/SystemSqlTestSuite.java index 726b2052aa..6a46edee47 100644 --- a/application/src/test/java/org/thingsboard/server/system/SystemSqlTestSuite.java +++ b/application/src/test/java/org/thingsboard/server/system/SystemSqlTestSuite.java @@ -18,7 +18,7 @@ package org.thingsboard.server.system; import org.junit.ClassRule; import org.junit.extensions.cpsuite.ClasspathSuite; import org.junit.runner.RunWith; -import org.thingsboard.server.dao.CustomPostgresUnit; +import org.thingsboard.server.dao.CustomSqlUnit; import java.util.Arrays; @@ -30,9 +30,10 @@ import java.util.Arrays; public class SystemSqlTestSuite { @ClassRule - public static CustomPostgresUnit postgresUnit = new CustomPostgresUnit( - Arrays.asList("postgres/schema.sql", "postgres/system-data.sql"), - "postgres-embedded-test.properties"); + public static CustomSqlUnit sqlUnit = new CustomSqlUnit( + Arrays.asList("sql/schema.sql", "sql/system-data.sql"), + "sql-test.properties", + "sql/drop-all-tables.sql"); } diff --git a/dao/pom.xml b/dao/pom.xml index 2bb77511bb..ff4237c1da 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -170,8 +170,8 @@ test - ru.yandex.qatools.embed - postgresql-embedded + org.hsqldb + hsqldb test 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 8abab4a135..2fd6c97689 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 @@ -45,7 +45,7 @@ public abstract class JpaAbstractDao, D> protected void setSearchText(E entity) {} @Override - @Transactional(propagation = REQUIRES_NEW) + @Transactional public D save(D domain) { E entity; try { @@ -64,7 +64,6 @@ public abstract class JpaAbstractDao, D> } @Override - @Transactional(propagation = REQUIRES_NEW) public D findById(UUID key) { log.debug("Get entity by key {}", key); E entity = getCrudRepository().findOne(key); @@ -78,7 +77,7 @@ public abstract class JpaAbstractDao, D> } @Override - @Transactional(propagation = REQUIRES_NEW) + @Transactional public boolean removeById(UUID key) { getCrudRepository().delete(key); log.debug("Remove request: {}", key); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java index 5f902bfa6c..79779e8e1e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java @@ -73,7 +73,6 @@ public class JpaAlarmDao extends JpaAbstractDao implements A } @Override - @Transactional(propagation = REQUIRES_NEW) public ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { return service.submit(() -> { List latest = alarmRepository.findLatestByOriginatorAndType( diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java index 56eb5e8b8b..feae4a6b24 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java @@ -80,7 +80,5 @@ public interface DeviceRepository extends CrudRepository { List findDevicesByTenantIdAndCustomerIdAndIdIn(UUID tenantId, UUID customerId, List deviceIds); - List findDevicesByTenantId(UUID tenantId); - List findDevicesByTenantIdAndIdIn(UUID tenantId, List deviceIds); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java index 365b90fd1c..62d1a1b683 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java @@ -30,12 +30,12 @@ import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.dao.DaoUtil; -import org.thingsboard.server.dao.util.SqlDao; import org.thingsboard.server.dao.model.sql.RelationCompositeKey; import org.thingsboard.server.dao.model.sql.RelationEntity; import org.thingsboard.server.dao.relation.RelationDao; import org.thingsboard.server.dao.sql.JpaAbstractDaoListeningExecutorService; import org.thingsboard.server.dao.sql.JpaAbstractSearchTimeDao; +import org.thingsboard.server.dao.util.SqlDao; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java index 6abbbbd610..2c2e63687e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java @@ -17,11 +17,11 @@ package org.thingsboard.server.dao.sql.relation; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.CrudRepository; -import org.thingsboard.server.dao.util.SqlDao; +import org.springframework.transaction.annotation.Transactional; import org.thingsboard.server.dao.model.sql.RelationCompositeKey; import org.thingsboard.server.dao.model.sql.RelationEntity; +import org.thingsboard.server.dao.util.SqlDao; -import javax.transaction.Transactional; import java.util.List; import java.util.UUID; @@ -51,5 +51,5 @@ public interface RelationRepository String fromType); @Transactional - List deleteByFromIdAndFromType(UUID fromId, String fromType); + void deleteByFromIdAndFromType(UUID fromId, String fromType); } 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 88a107b3eb..1ebc271706 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 = "database", value = "type", havingValue = "postgres") +@ConditionalOnProperty(prefix = "database", value = "type", havingValue = "sql") public @interface SqlDao { } diff --git a/dao/src/main/resources/postgres/demo-data.sql b/dao/src/main/resources/sql/demo-data.sql similarity index 100% rename from dao/src/main/resources/postgres/demo-data.sql rename to dao/src/main/resources/sql/demo-data.sql diff --git a/dao/src/main/resources/postgres/schema.sql b/dao/src/main/resources/sql/schema.sql similarity index 93% rename from dao/src/main/resources/postgres/schema.sql rename to dao/src/main/resources/sql/schema.sql index 038f25adaf..a3aa723b4e 100644 --- a/dao/src/main/resources/postgres/schema.sql +++ b/dao/src/main/resources/sql/schema.sql @@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS admin_settings ( id uuid NOT NULL CONSTRAINT admin_settings_pkey PRIMARY KEY, - json_value text, + json_value varchar, key character varying(255) ); @@ -25,7 +25,7 @@ CREATE TABLE IF NOT EXISTS alarm ( id uuid NOT NULL CONSTRAINT alarm_pkey PRIMARY KEY, ack_ts bigint, clear_ts bigint, - additional_info text, + additional_info varchar, end_ts bigint, originator_id uuid, originator_type integer, @@ -39,7 +39,7 @@ CREATE TABLE IF NOT EXISTS alarm ( CREATE TABLE IF NOT EXISTS asset ( id uuid NOT NULL CONSTRAINT asset_pkey PRIMARY KEY, - additional_info text, + additional_info varchar, customer_id uuid, name character varying(255), search_text character varying(255), @@ -64,7 +64,7 @@ CREATE TABLE IF NOT EXISTS component_descriptor ( id uuid NOT NULL CONSTRAINT component_descriptor_pkey PRIMARY KEY, actions character varying(255), clazz character varying(255), - configuration_descriptor text, + configuration_descriptor varchar, name character varying(255), scope character varying(255), search_text character varying(255), @@ -73,7 +73,7 @@ CREATE TABLE IF NOT EXISTS component_descriptor ( CREATE TABLE IF NOT EXISTS customer ( id uuid NOT NULL CONSTRAINT customer_pkey PRIMARY KEY, - additional_info text, + additional_info varchar, address character varying(255), address2 character varying(255), city character varying(255), @@ -89,7 +89,7 @@ CREATE TABLE IF NOT EXISTS customer ( CREATE TABLE IF NOT EXISTS dashboard ( id uuid NOT NULL CONSTRAINT dashboard_pkey PRIMARY KEY, - configuration text, + configuration varchar, customer_id uuid, search_text character varying(255), tenant_id uuid, @@ -98,7 +98,7 @@ CREATE TABLE IF NOT EXISTS dashboard ( CREATE TABLE IF NOT EXISTS device ( id uuid NOT NULL CONSTRAINT device_pkey PRIMARY KEY, - additional_info text, + additional_info varchar, customer_id uuid, type character varying(255), name character varying(255), @@ -116,7 +116,7 @@ CREATE TABLE IF NOT EXISTS device_credentials ( CREATE TABLE IF NOT EXISTS event ( id uuid NOT NULL CONSTRAINT event_pkey PRIMARY KEY, - body text, + body varchar, entity_id uuid, entity_type character varying(255), event_type character varying(255), @@ -127,10 +127,10 @@ CREATE TABLE IF NOT EXISTS event ( CREATE TABLE IF NOT EXISTS plugin ( id uuid NOT NULL CONSTRAINT plugin_pkey PRIMARY KEY, - additional_info text, + additional_info varchar, api_token character varying(255), plugin_class character varying(255), - configuration text, + configuration varchar, name character varying(255), public_access boolean, search_text character varying(255), @@ -145,18 +145,18 @@ CREATE TABLE IF NOT EXISTS relation ( to_type character varying(255), relation_type_group character varying(255), relation_type character varying(255), - additional_info text, + additional_info varchar, CONSTRAINT relation_unq_key UNIQUE (from_id, from_type, relation_type_group, relation_type, to_id, to_type) ); CREATE TABLE IF NOT EXISTS rule ( id uuid NOT NULL CONSTRAINT rule_pkey PRIMARY KEY, - action text, - additional_info text, - filters text, + action varchar, + additional_info varchar, + filters varchar, name character varying(255), plugin_token character varying(255), - processor text, + processor varchar, search_text character varying(255), state character varying(255), tenant_id uuid, @@ -165,7 +165,7 @@ CREATE TABLE IF NOT EXISTS rule ( CREATE TABLE IF NOT EXISTS tb_user ( id uuid NOT NULL CONSTRAINT tb_user_pkey PRIMARY KEY, - additional_info text, + additional_info varchar, authority character varying(255), customer_id uuid, email character varying(255) UNIQUE, @@ -177,7 +177,7 @@ CREATE TABLE IF NOT EXISTS tb_user ( CREATE TABLE IF NOT EXISTS tenant ( id uuid NOT NULL CONSTRAINT tenant_pkey PRIMARY KEY, - additional_info text, + additional_info varchar, address character varying(255), address2 character varying(255), city character varying(255), @@ -228,7 +228,7 @@ CREATE TABLE IF NOT EXISTS widget_type ( id uuid NOT NULL CONSTRAINT widget_type_pkey PRIMARY KEY, alias character varying(255), bundle_alias character varying(255), - descriptor text, + descriptor varchar(2000000), name character varying(255), tenant_id uuid ); @@ -236,7 +236,6 @@ CREATE TABLE IF NOT EXISTS widget_type ( CREATE TABLE IF NOT EXISTS widgets_bundle ( id uuid NOT NULL CONSTRAINT widgets_bundle_pkey PRIMARY KEY, alias character varying(255), - image bytea, search_text character varying(255), tenant_id uuid, title character varying(255) diff --git a/dao/src/main/resources/postgres/system-data.sql b/dao/src/main/resources/sql/system-data.sql similarity index 100% rename from dao/src/main/resources/postgres/system-data.sql rename to dao/src/main/resources/sql/system-data.sql diff --git a/dao/src/test/java/org/thingsboard/server/dao/CustomPostgresUnit.java b/dao/src/test/java/org/thingsboard/server/dao/CustomSqlUnit.java similarity index 65% rename from dao/src/test/java/org/thingsboard/server/dao/CustomPostgresUnit.java rename to dao/src/test/java/org/thingsboard/server/dao/CustomSqlUnit.java index feaaa6b1fa..3c41d1537a 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/CustomPostgresUnit.java +++ b/dao/src/test/java/org/thingsboard/server/dao/CustomSqlUnit.java @@ -19,7 +19,6 @@ import com.google.common.base.Charsets; import com.google.common.io.Resources; import lombok.extern.slf4j.Slf4j; import org.junit.rules.ExternalResource; -import ru.yandex.qatools.embed.postgresql.EmbeddedPostgres; import java.io.IOException; import java.io.InputStream; @@ -30,58 +29,58 @@ import java.sql.SQLException; import java.util.List; import java.util.Properties; -import static ru.yandex.qatools.embed.postgresql.distribution.Version.Main.V9_6; /** * Created by Valerii Sosliuk on 6/24/2017. */ @Slf4j -public class CustomPostgresUnit extends ExternalResource { - - private static final String HOST = "host"; - private static final String PORT = "port"; - private static final String DATABASE = "database"; - private static final String USERNAME = "username"; - private static final String PASSWORD = "password"; +public class CustomSqlUnit extends ExternalResource { private List sqlFiles; private Properties properties; + private String dropAllTablesSqlFile; - private EmbeddedPostgres postgres; - - public CustomPostgresUnit(List sqlFiles, String configurationFileName) { + public CustomSqlUnit(List sqlFiles, String configurationFileName, String dropAllTablesSqlFile) { this.sqlFiles = sqlFiles; this.properties = loadProperties(configurationFileName); + this.dropAllTablesSqlFile = dropAllTablesSqlFile; } @Override public void before() { - postgres = new EmbeddedPostgres(V9_6); - load(); - } - - @Override - public void after() { - postgres.stop(); - } - - private void load() { Connection conn = null; try { - String url = postgres.start(properties.getProperty(HOST), - Integer.parseInt(properties.getProperty(PORT)), - properties.getProperty(DATABASE), - properties.getProperty(USERNAME), - properties.getProperty(PASSWORD)); - - conn = DriverManager.getConnection(url); + String url = properties.getProperty("spring.datasource.url"); + conn = DriverManager.getConnection(url, "sa", ""); for (String sqlFile : sqlFiles) { URL sqlFileUrl = Resources.getResource(sqlFile); String sql = Resources.toString(sqlFileUrl, Charsets.UTF_8); conn.createStatement().execute(sql); } } catch (IOException | SQLException e) { - throw new RuntimeException("Unable to start embedded postgres. Reason: " + e.getMessage(), e); + throw new RuntimeException("Unable to start embedded hsqldb. Reason: " + e.getMessage(), e); + } finally { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + log.error(e.getMessage(), e); + } + } + } + } + + @Override + public void after() { + Connection conn = null; + try { + String url = properties.getProperty("spring.datasource.url"); + conn = DriverManager.getConnection(url, "sa", ""); + URL dropAllTableSqlFileUrl = Resources.getResource(dropAllTablesSqlFile); + String dropAllTablesSql = Resources.toString(dropAllTableSqlFileUrl, Charsets.UTF_8); + conn.createStatement().execute(dropAllTablesSql); + } catch (IOException | SQLException e) { + throw new RuntimeException("Unable to clean up embedded hsqldb. Reason: " + e.getMessage(), e); } finally { if (conn != null) { try { 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 c74aeeff27..afa991fec2 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/JpaDaoTestSuite.java +++ b/dao/src/test/java/org/thingsboard/server/dao/JpaDaoTestSuite.java @@ -24,13 +24,14 @@ import java.util.Arrays; @RunWith(ClasspathSuite.class) @ClassnameFilters({ - "org.thingsboard.server.dao.sql.*Test" + "org.thingsboard.server.dao.sql.*ABTest" }) public class JpaDaoTestSuite { @ClassRule - public static CustomPostgresUnit postgresUnit = new CustomPostgresUnit( - Arrays.asList("postgres/schema.sql", "postgres/system-data.sql"), - "postgres-embedded-test.properties"); + public static CustomSqlUnit sqlUnit = new CustomSqlUnit( + Arrays.asList("sql/schema.sql", "sql/system-data.sql"), + "sql-test.properties", + "sql/drop-all-tables.sql"); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/JpaDbunitTestConfig.java b/dao/src/test/java/org/thingsboard/server/dao/JpaDbunitTestConfig.java index 0a0f7d8dae..507eb4d4af 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/JpaDbunitTestConfig.java +++ b/dao/src/test/java/org/thingsboard/server/dao/JpaDbunitTestConfig.java @@ -18,6 +18,7 @@ package org.thingsboard.server.dao; import com.github.springtestdbunit.bean.DatabaseConfigBean; import com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean; import org.dbunit.DatabaseUnitException; +import org.dbunit.ext.hsqldb.HsqldbDataTypeFactory; import org.dbunit.ext.postgresql.PostgresqlDataTypeFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -41,7 +42,7 @@ public class JpaDbunitTestConfig { @Bean public DatabaseConfigBean databaseConfigBean() { DatabaseConfigBean databaseConfigBean = new DatabaseConfigBean(); - databaseConfigBean.setDatatypeFactory(new PostgresqlDataTypeFactory()); + databaseConfigBean.setDatatypeFactory(new HsqldbDataTypeFactory()); return databaseConfigBean; } 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 6ba4e7ab45..0f0eacc3f8 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java +++ b/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java @@ -29,8 +29,9 @@ import java.util.Arrays; public class SqlDaoServiceTestSuite { @ClassRule - public static CustomPostgresUnit postgresUnit = new CustomPostgresUnit( - Arrays.asList("postgres/schema.sql", "postgres/system-data.sql", "postgres/system-test.sql"), - "postgres-embedded-test.properties"); + public static CustomSqlUnit sqlUnit = new CustomSqlUnit( + Arrays.asList("sql/schema.sql", "sql/system-data.sql", "sql/system-test.sql"), + "sql-test.properties", + "sql/drop-all-tables.sql"); } diff --git a/dao/src/test/resources/postgres-embedded-test.properties b/dao/src/test/resources/postgres-embedded-test.properties deleted file mode 100644 index a7279b9996..0000000000 --- a/dao/src/test/resources/postgres-embedded-test.properties +++ /dev/null @@ -1,5 +0,0 @@ -host: localhost -port: 5433 -database: thingsboard-test -username: postgres -password: postgres \ No newline at end of file diff --git a/dao/src/test/resources/sql-test.properties b/dao/src/test/resources/sql-test.properties index 93402cff25..16a9d8cc00 100644 --- a/dao/src/test/resources/sql-test.properties +++ b/dao/src/test/resources/sql-test.properties @@ -1,8 +1,8 @@ -database.type=postgres +database.type=sql spring.jpa.show-sql=false 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.username=sa +spring.datasource.password= +spring.datasource.url=jdbc:hsqldb:mem:thingsboardTestDb;sql.enforce_size=false diff --git a/dao/src/test/resources/sql/drop-all-tables.sql b/dao/src/test/resources/sql/drop-all-tables.sql new file mode 100644 index 0000000000..610653d565 --- /dev/null +++ b/dao/src/test/resources/sql/drop-all-tables.sql @@ -0,0 +1,20 @@ +TRUNCATE TABLE admin_settings; +TRUNCATE TABLE alarm; +TRUNCATE TABLE asset; +TRUNCATE TABLE attribute_kv; +TRUNCATE TABLE component_descriptor; +TRUNCATE TABLE customer; +TRUNCATE TABLE dashboard; +TRUNCATE TABLE device; +TRUNCATE TABLE device_credentials; +TRUNCATE TABLE event; +TRUNCATE TABLE plugin; +TRUNCATE TABLE relation; +TRUNCATE TABLE rule; +TRUNCATE TABLE tb_user; +TRUNCATE TABLE tenant; +TRUNCATE TABLE ts_kv; +TRUNCATE TABLE ts_kv_latest; +TRUNCATE TABLE user_credentials; +TRUNCATE TABLE widget_type; +TRUNCATE TABLE widgets_bundle; \ No newline at end of file diff --git a/dao/src/test/resources/postgres/system-test.sql b/dao/src/test/resources/sql/system-test.sql similarity index 100% rename from dao/src/test/resources/postgres/system-test.sql rename to dao/src/test/resources/sql/system-test.sql diff --git a/pom.xml b/pom.xml index 7b2c5f8c34..762d0dc017 100755 --- a/pom.xml +++ b/pom.xml @@ -71,6 +71,7 @@ 2.6.1 1.56 2.0.1 + 2.4.0 2.5.3 1.2.1 9.4.1211 @@ -746,6 +747,12 @@ bcpkix-jdk15on ${bouncycastle.version} + + org.hsqldb + hsqldb + ${hsqldb.version} + test + ru.yandex.qatools.embed postgresql-embedded