diff --git a/application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java b/application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java index ed75b10bc7..0b9e37c4e7 100644 --- a/application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java @@ -16,6 +16,9 @@ package org.thingsboard.server.actors.plugin; import akka.actor.ActorRef; +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.ResultSetFuture; +import com.datastax.driver.core.Row; import com.google.common.base.Function; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; diff --git a/dao/pom.xml b/dao/pom.xml index 977be95f95..fddc440eea 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -65,6 +65,16 @@ junit test + + org.dbunit + dbunit + test + + + com.github.springtestdbunit + spring-test-dbunit + test + org.mockito mockito-all @@ -154,6 +164,24 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.springframework + spring-test + test + + + org.springframework + spring-test + compile + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-data-jpa + diff --git a/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java b/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java index 167518a6b7..f349baae6e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java +++ b/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java @@ -16,27 +16,33 @@ package org.thingsboard.server.dao; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.test.context.TestPropertySource; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; /** * @author Valerii Sosliuk */ @Configuration +@EnableAutoConfiguration @ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false) +@ComponentScan("org.thingsboard.server.dao.sql") +@EnableJpaRepositories("org.thingsboard.server.dao.sql") +@EntityScan("org.thingsboard.server.dao.model.sql") +@EnableTransactionManagement public class JpaDaoConfig { - @Value("sql.datasource.url") - private String url; - @Value("sql.datasource.username") - private String username; - @Value("sql.datasource.password") - private String password; - - public DataSource dataSource() { - return DataSourceBuilder.create().url(url).username(username).password(password).build(); - } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesDao.java b/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesDao.java index 6696f39556..ae58d4d9c6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesDao.java @@ -15,6 +15,8 @@ */ package org.thingsboard.server.dao.attributes; +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.ResultSetFuture; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; diff --git a/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesService.java b/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesService.java index 222ffa3b1a..6bf9fb2bd5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesService.java @@ -15,8 +15,12 @@ */ package org.thingsboard.server.dao.attributes; +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.ResultSetFuture; import com.google.common.util.concurrent.ListenableFuture; +import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.UUIDBased; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import java.util.Collection; diff --git a/dao/src/main/java/org/thingsboard/server/dao/attributes/BaseAttributesService.java b/dao/src/main/java/org/thingsboard/server/dao/attributes/BaseAttributesService.java index 5ed231bd9f..da4611973d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/attributes/BaseAttributesService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/attributes/BaseAttributesService.java @@ -15,6 +15,8 @@ */ package org.thingsboard.server.dao.attributes; +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.ResultSetFuture; import com.google.common.collect.Lists; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java index 40580ee1f4..b090d7da84 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java @@ -30,7 +30,7 @@ import java.util.UUID; import static org.thingsboard.server.dao.model.ModelConstants.*; -@Entity +//@Entity @Table(name = ADMIN_SETTINGS_COLUMN_FAMILY_NAME) public final class AdminSettingsEntity implements BaseEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java index 53bac762c2..f32a89ec23 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java @@ -30,7 +30,10 @@ import org.thingsboard.server.dao.model.SearchTextEntity; import java.util.UUID; -@Entity +/** + * @author Andrew Shvayka + */ +//@Entity @Table(name = ModelConstants.COMPONENT_DESCRIPTOR_COLUMN_FAMILY_NAME) public class ComponentDescriptorEntity implements SearchTextEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java index bf7404f50e..b651306861 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java @@ -30,7 +30,7 @@ import org.thingsboard.server.dao.model.SearchTextEntity; import java.util.UUID; -@Entity +//@Entity @Table(name = ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME) public final class CustomerEntity implements SearchTextEntity { 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 12a12c1403..77e12e2381 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 @@ -31,7 +31,7 @@ import org.thingsboard.server.dao.model.SearchTextEntity; import java.util.UUID; -@Entity +//@Entity @Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME) public final class DashboardEntity implements SearchTextEntity { 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 5fb052b55b..f0a50f1ffb 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 @@ -30,7 +30,7 @@ import org.thingsboard.server.dao.model.SearchTextEntity; import java.util.UUID; -@Entity +//@Entity @Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME) public class DashboardInfoEntity implements SearchTextEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java index de4399463d..56ebc43154 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java @@ -30,7 +30,7 @@ import org.thingsboard.server.dao.model.ModelConstants; import java.util.UUID; -@Entity +//@Entity @Table(name = ModelConstants.DEVICE_CREDENTIALS_COLUMN_FAMILY_NAME) public final class DeviceCredentialsEntity implements BaseEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java index 72c2dd5310..4cab621e10 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java @@ -31,7 +31,7 @@ import org.thingsboard.server.dao.model.SearchTextEntity; import java.util.UUID; -@Entity +//@Entity @Table(name = ModelConstants.DEVICE_COLUMN_FAMILY_NAME) public final class DeviceEntity implements SearchTextEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java index 4618f42b13..92808ba2b5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java @@ -34,7 +34,7 @@ import java.util.UUID; @Data @NoArgsConstructor -@Entity +//@Entity @Table(name = ModelConstants.DEVICE_COLUMN_FAMILY_NAME) public class EventEntity implements BaseEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java index fc58f90736..239e51d40c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java @@ -32,7 +32,7 @@ import org.thingsboard.server.dao.model.SearchTextEntity; import java.util.Objects; import java.util.UUID; -@Entity +//@Entity @Table(name = ModelConstants.PLUGIN_COLUMN_FAMILY_NAME) public class PluginMetaDataEntity implements SearchTextEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java index 506b74abc3..56b8260ae4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java @@ -33,7 +33,7 @@ import org.thingsboard.server.dao.model.SearchTextEntity; import java.util.Objects; import java.util.UUID; -@Entity +//@Entity @Table(name = ModelConstants.RULE_COLUMN_FAMILY_NAME) public class RuleMetaDataEntity implements SearchTextEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java index 06b6131799..8987425f00 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java @@ -29,7 +29,7 @@ import com.fasterxml.jackson.databind.JsonNode; import java.util.UUID; -@Entity +//@Entity @Table(name = ModelConstants.TENANT_COLUMN_FAMILY_NAME) public final class TenantEntity implements SearchTextEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java index 42d4e92762..b750ecea00 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java @@ -16,11 +16,14 @@ package org.thingsboard.server.dao.model.sql; import com.datastax.driver.core.utils.UUIDs; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; + +import lombok.Data; import org.thingsboard.server.common.data.id.UserCredentialsId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.security.UserCredentials; @@ -29,18 +32,19 @@ import org.thingsboard.server.dao.model.ModelConstants; import java.util.UUID; +@Data @Entity @Table(name = ModelConstants.USER_CREDENTIALS_COLUMN_FAMILY_NAME) public final class UserCredentialsEntity implements BaseEntity { @Transient - private static final long serialVersionUID = 1348221414123438374L; + private static final long serialVersionUID = -3989724854149114846L; @Id - @Column(name = ModelConstants.ID_PROPERTY) + @Column(name = ModelConstants.ID_PROPERTY, columnDefinition = "BINARY(16)") private UUID id; - - @Column(name = ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY) + + @Column(name = ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY, columnDefinition = "BINARY(16)", unique = true) private UUID userId; @Column(name = ModelConstants.USER_CREDENTIALS_ENABLED_PROPERTY) @@ -49,10 +53,10 @@ public final class UserCredentialsEntity implements BaseEntity @Column(name = ModelConstants.USER_CREDENTIALS_PASSWORD_PROPERTY) private String password; - @Column(name = ModelConstants.USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY) + @Column(name = ModelConstants.USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY, unique = true) private String activateToken; - @Column(name = ModelConstants.USER_CREDENTIALS_RESET_TOKEN_PROPERTY) + @Column(name = ModelConstants.USER_CREDENTIALS_RESET_TOKEN_PROPERTY, unique = true) private String resetToken; public UserCredentialsEntity() { @@ -71,54 +75,6 @@ public final class UserCredentialsEntity implements BaseEntity this.activateToken = userCredentials.getActivateToken(); this.resetToken = userCredentials.getResetToken(); } - - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public UUID getUserId() { - return userId; - } - - public void setUserId(UUID userId) { - this.userId = userId; - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getActivateToken() { - return activateToken; - } - - public void setActivateToken(String activateToken) { - this.activateToken = activateToken; - } - - public String getResetToken() { - return resetToken; - } - - public void setResetToken(String resetToken) { - this.resetToken = resetToken; - } @Override public int hashCode() { @@ -186,4 +142,13 @@ public final class UserCredentialsEntity implements BaseEntity return userCredentials; } + @Override + public UUID getId() { + return id; + } + + @Override + public void setId(UUID id) { + this.id = id; + } } \ No newline at end of file diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java index a02341d204..bf006bb22d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java @@ -17,45 +17,44 @@ package org.thingsboard.server.dao.model.sql; import com.datastax.driver.core.utils.UUIDs; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.security.Authority; -import org.thingsboard.server.dao.model.SearchTextEntity; import org.thingsboard.server.dao.model.ModelConstants; +import org.thingsboard.server.dao.model.SearchTextEntity; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; +import javax.persistence.*; +import java.io.IOException; import java.util.UUID; /** - * @author Valerii Sosliuk + * Created by Valerii Sosliuk on 4/21/2017. */ +@Data @Entity -@Table(name= ModelConstants.USER_COLUMN_FAMILY_NAME) +@Table(name = ModelConstants.USER_COLUMN_FAMILY_NAME) public class UserEntity implements SearchTextEntity { - @Transient - private static final long serialVersionUID = 4349485207981226785L; + private static final long serialVersionUID = -271106508790582977L; @Id - @Column(name=ModelConstants.ID_PROPERTY) + @Column(name = ModelConstants.ID_PROPERTY, columnDefinition = "BINARY(16)") private UUID id; - @Column(name = ModelConstants.USER_TENANT_ID_PROPERTY) + @Column(name = ModelConstants.USER_TENANT_ID_PROPERTY, columnDefinition = "BINARY(16)") private UUID tenantId; - @Column(name = ModelConstants.USER_CUSTOMER_ID_PROPERTY) + @Column(name = ModelConstants.USER_CUSTOMER_ID_PROPERTY, columnDefinition = "BINARY(16)") private UUID customerId; @Column(name = ModelConstants.USER_AUTHORITY_PROPERTY) private Authority authority; - @Column(name = ModelConstants.USER_EMAIL_PROPERTY) + @Column(name = ModelConstants.USER_EMAIL_PROPERTY, unique = true) private String email; @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY) @@ -68,7 +67,10 @@ public class UserEntity implements SearchTextEntity { private String lastName; @Column(name = ModelConstants.USER_ADDITIONAL_INFO_PROPERTY) - private JsonNode additionalInfo; + private String additionalInfo; + + public UserEntity() { + } public UserEntity(User user) { if (user.getId() != null) { @@ -84,11 +86,7 @@ public class UserEntity implements SearchTextEntity { this.email = user.getEmail(); this.firstName = user.getFirstName(); this.lastName = user.getLastName(); - this.additionalInfo = user.getAdditionalInfo(); - } - - public String getSearchText() { - return searchText; + this.additionalInfo = user.getAdditionalInfo().toString(); } @Override @@ -111,62 +109,6 @@ public class UserEntity implements SearchTextEntity { this.id = id; } - public UUID getTenantId() { - return tenantId; - } - - public void setTenantId(UUID tenantId) { - this.tenantId = tenantId; - } - - public UUID getCustomerId() { - return customerId; - } - - public void setCustomerId(UUID customerId) { - this.customerId = customerId; - } - - public Authority getAuthority() { - return authority; - } - - public void setAuthority(Authority authority) { - this.authority = authority; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public JsonNode getAdditionalInfo() { - return additionalInfo; - } - - public void setAdditionalInfo(JsonNode additionalInfo) { - this.additionalInfo = additionalInfo; - } - @Override public String toString() { StringBuilder builder = new StringBuilder(); @@ -204,9 +146,18 @@ public class UserEntity implements SearchTextEntity { user.setEmail(email); user.setFirstName(firstName); user.setLastName(lastName); - user.setAdditionalInfo(additionalInfo); + ObjectMapper mapper = new ObjectMapper(); + if (additionalInfo != null) { + try { + JsonNode jsonNode = mapper.readTree(additionalInfo); + user.setAdditionalInfo(jsonNode); + } catch (IOException e) { + e.printStackTrace(); + } + } return user; } + @Override public int hashCode() { final int prime = 31; @@ -270,5 +221,4 @@ public class UserEntity implements SearchTextEntity { return false; return true; } - } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java index 6c1b949720..2c84f72d9e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java @@ -32,7 +32,7 @@ import org.thingsboard.server.dao.model.ModelConstants; import java.util.UUID; -@Entity +//@Entity @Table(name = ModelConstants.WIDGET_TYPE_COLUMN_FAMILY_NAME) public final class WidgetTypeEntity implements BaseEntity { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java index c972709926..92f2e414da 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java @@ -22,6 +22,8 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; + +import lombok.Data; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.WidgetsBundleId; import org.thingsboard.server.common.data.widget.WidgetsBundle; @@ -31,6 +33,7 @@ import org.thingsboard.server.dao.model.SearchTextEntity; import java.nio.ByteBuffer; import java.util.UUID; +@Data @Entity @Table(name = ModelConstants.WIDGETS_BUNDLE_COLUMN_FAMILY_NAME) public final class WidgetsBundleEntity implements SearchTextEntity { @@ -39,10 +42,10 @@ public final class WidgetsBundleEntity implements SearchTextEntity, D> implements Dao< protected abstract String getColumnFamilyName(); - protected abstract JpaRepository getCrudRepository(); + protected abstract CrudRepository getCrudRepository(); protected boolean isSearchTextDao() { return false; @@ -69,7 +69,7 @@ public abstract class JpaAbstractDao, D> implements Dao< @Override public ListenableFuture findByIdAsync(UUID key) { log.debug("Get entity by key {}", key); - org.springframework.util.concurrent.ListenableFuture entityFuture = getCrudRepository().findByIdAsync(key); + // org.springframework.util.concurrent.ListenableFuture entityFuture = getCrudRepository().findByIdAsync(key); // TODO: vsosliuk implement return null; } 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 new file mode 100644 index 0000000000..fa119b679f --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java @@ -0,0 +1,71 @@ +/** + * 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.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 java.util.UUID; + +/** + * Created by Valerii Sosliuk on 4/22/2017. + */ +@Component +@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false) +public class JpaUserCredentialsDao extends JpaAbstractDao implements UserCredentialsDao { + + @Autowired + private UserCredentialsRepository userCredentialsRepository; + + @Override + protected Class getEntityClass() { + return UserCredentialsEntity.class; + } + + @Override + protected String getColumnFamilyName() { + return ModelConstants.USER_CREDENTIALS_COLUMN_FAMILY_NAME; + } + + @Override + protected CrudRepository getCrudRepository() { + return userCredentialsRepository; + } + + @Override + public UserCredentials findByUserId(UUID userId) { + return DaoUtil.getData(userCredentialsRepository.findByUserId(userId)); + } + + @Override + public UserCredentials findByActivateToken(String activateToken) { + return DaoUtil.getData(userCredentialsRepository.findByActivateToken(activateToken)); + } + + @Override + public UserCredentials findByResetToken(String resetToken) { + return DaoUtil.getData(userCredentialsRepository.findByResetToken(resetToken)); + } +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java index 551f658af1..662dbeea06 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java @@ -17,6 +17,7 @@ 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.page.TextPageLink; @@ -50,7 +51,7 @@ public class JpaUserDao extends JpaAbstractDao implements User } @Override - protected JpaRepository getCrudRepository() { + protected CrudRepository getCrudRepository() { return userRepository; } @@ -61,11 +62,11 @@ public class JpaUserDao extends JpaAbstractDao implements User @Override public List findTenantAdmins(UUID tenantId, TextPageLink pageLink) { - return null; + throw new RuntimeException("Not Implemented"); } @Override public List findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) { - return null; + throw new RuntimeException("Not Implemented"); } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserCredentialsRepository.java similarity index 55% rename from dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaRepository.java rename to dao/src/main/java/org/thingsboard/server/dao/sql/user/UserCredentialsRepository.java index 0af2bf8fc0..bb61aed13d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserCredentialsRepository.java @@ -15,17 +15,21 @@ */ package org.thingsboard.server.dao.sql.user; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.repository.CrudRepository; -import org.springframework.scheduling.annotation.Async; -import org.springframework.util.concurrent.ListenableFuture; +import org.thingsboard.server.dao.model.sql.UserCredentialsEntity; -import java.io.Serializable; +import java.util.UUID; /** - * @author Valerii Sosliuk + * Created by Valerii Sosliuk on 4/22/2017. */ -public interface JpaRepository extends CrudRepository { +@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false) +public interface UserCredentialsRepository extends CrudRepository { - @Async - ListenableFuture findByIdAsync(ID key); + UserCredentialsEntity findByUserId(UUID userId); + + UserCredentialsEntity findByActivateToken(String activateToken); + + UserCredentialsEntity findByResetToken(String resetToken); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java index a3bcfa6d1d..aec4137366 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java @@ -15,17 +15,17 @@ */ package org.thingsboard.server.dao.sql.user; -import org.thingsboard.server.common.data.User; -import org.thingsboard.server.common.data.page.TextPageLink; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.repository.CrudRepository; import org.thingsboard.server.dao.model.sql.UserEntity; -import java.util.List; import java.util.UUID; /** * @author Valerii Sosliuk */ -public interface UserRepository extends JpaRepository { +@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false) +public interface UserRepository extends CrudRepository { UserEntity findByEmail(String email); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java new file mode 100644 index 0000000000..afa409a74b --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java @@ -0,0 +1,91 @@ +/** + * 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.dao.sql.widget; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.common.data.widget.WidgetsBundle; +import org.thingsboard.server.dao.DaoUtil; +import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity; +import org.thingsboard.server.dao.sql.JpaAbstractDao; +import org.thingsboard.server.dao.widget.WidgetsBundleDao; + +import java.util.List; +import java.util.UUID; + +import static org.thingsboard.server.dao.model.ModelConstants.WIDGETS_BUNDLE_COLUMN_FAMILY_NAME; + +/** + * Created by Valerii Sosliuk on 4/23/2017. + */ +@Component +public class JpaWidgetsBundleDao extends JpaAbstractDao implements WidgetsBundleDao { + + @Autowired + private WidgetsBundleRepository widgetsBundleRepository; + + @Override + protected Class getEntityClass() { + return WidgetsBundleEntity.class; + } + + @Override + protected String getColumnFamilyName() { + return WIDGETS_BUNDLE_COLUMN_FAMILY_NAME; + } + + @Override + protected CrudRepository getCrudRepository() { + return widgetsBundleRepository; + } + + @Override + public WidgetsBundle findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias) { + return DaoUtil.getData(widgetsBundleRepository.findWidgetsBundleByTenantIdAndAlias(tenantId, alias)); + } + + @Override + public List findSystemWidgetsBundles(TextPageLink pageLink) { + if (pageLink.getIdOffset() == null) { + return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesFirstPage(pageLink.getLimit() + , pageLink.getTextSearch())); + } else { + return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesNextPage(pageLink.getLimit() + , pageLink.getTextSearch(), pageLink.getIdOffset())); + } + //return DaoUtil.convertDataList(widgetsBundleRepository.findBySearchTextStartsWithIgnoreCase(pageLink.getTextSearch().toLowerCase())); + //return DaoUtil.convertDataList(widgetsBundleRepository.findBySearchTextStartsWithIgnoreCase(pageLink.getTextSearch().toLowerCase() ,pageable)); + } + + @Override + public List findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { + throw new RuntimeException("Not implemented"); + } + + @Override + public List findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { + throw new RuntimeException("Not implemented"); + } + + @Override + protected boolean isSearchTextDao() { + return true; + } +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java new file mode 100644 index 0000000000..ac163df189 --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -0,0 +1,50 @@ +/** + * 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.dao.sql.widget; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.dao.model.ToData; +import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +/** + * Created by Valerii Sosliuk on 4/23/2017. + */ +//public interface WidgetsBundleRepository extends CrudRepository { +public interface WidgetsBundleRepository extends JpaRepository, JpaSpecificationExecutor { + + WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias); + + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID IS NULL " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?2, '%')) " + + "ORDER BY ID LIMIT ?1") + List findSystemWidgetsBundlesFirstPage(Integer limit, String searchText); + + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID IS NULL " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?2, '%')) " + + "AND ID > ?3 ORDER BY ID LIMIT ?1") + List findSystemWidgetsBundlesNextPage(Integer limit, String searchText, UUID idOffset); + +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/timeseries/BaseTimeseriesService.java b/dao/src/main/java/org/thingsboard/server/dao/timeseries/BaseTimeseriesService.java index d58815f955..7a59dcc51b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/timeseries/BaseTimeseriesService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/timeseries/BaseTimeseriesService.java @@ -15,6 +15,9 @@ */ package org.thingsboard.server.dao.timeseries; +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.ResultSetFuture; +import com.datastax.driver.core.Row; import com.google.common.collect.Lists; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; diff --git a/dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesDao.java b/dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesDao.java index 733200d976..452eb2cae3 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesDao.java @@ -15,6 +15,8 @@ */ package org.thingsboard.server.dao.timeseries; +import com.datastax.driver.core.ResultSetFuture; +import com.datastax.driver.core.Row; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.kv.TsKvQuery; diff --git a/dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesService.java b/dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesService.java index b2bf2e02dc..20731b22c0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesService.java @@ -15,6 +15,9 @@ */ package org.thingsboard.server.dao.timeseries; +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.ResultSetFuture; +import com.datastax.driver.core.Row; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.id.UUIDBased; import org.thingsboard.server.common.data.kv.TsKvEntry; diff --git a/dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java new file mode 100644 index 0000000000..e610245f96 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java @@ -0,0 +1,39 @@ +/** + * 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.dao; + +import com.github.springtestdbunit.DbUnitTestExecutionListener; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +import org.springframework.test.context.support.DirtiesContextTestExecutionListener; + +/** + * Created by Valerii Sosliuk on 4/22/2017. + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {JpaDaoConfig.class}) +@TestPropertySource("classpath:jpa-test.properties") +@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, + DirtiesContextTestExecutionListener.class, + DbUnitTestExecutionListener.class }) +public class AbstractJpaDaoTest extends AbstractTransactionalJUnit4SpringContextTests { + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/attributes/BaseAttributesServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/attributes/BaseAttributesServiceTest.java index a9835cbe45..559a3130e8 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/attributes/BaseAttributesServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/attributes/BaseAttributesServiceTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.attributes; +import com.datastax.driver.core.utils.UUIDs; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; diff --git a/dao/src/test/java/org/thingsboard/server/dao/event/BaseEventServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/event/BaseEventServiceTest.java index b185d2c3ce..e2c473f82c 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/event/BaseEventServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/event/BaseEventServiceTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.event; +import com.datastax.driver.core.utils.UUIDs; import org.junit.Assert; import org.junit.Test; import org.thingsboard.server.common.data.DataConstants; diff --git a/dao/src/test/java/org/thingsboard/server/dao/plugin/BasePluginServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/plugin/BasePluginServiceTest.java index 80acec71e4..7c0291cf56 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/plugin/BasePluginServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/plugin/BasePluginServiceTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.plugin; +import com.datastax.driver.core.utils.UUIDs; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.Test; diff --git a/dao/src/test/java/org/thingsboard/server/dao/rule/BaseRuleServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/rule/BaseRuleServiceTest.java index fe40b84edf..f62f26c2fb 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/rule/BaseRuleServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/rule/BaseRuleServiceTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.rule; +import com.datastax.driver.core.utils.UUIDs; import org.junit.Assert; import org.junit.Test; import org.thingsboard.server.common.data.id.TenantId; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java index 01de94f365..f66e6eee69 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.service; +import com.datastax.driver.core.utils.UUIDs; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/CustomerServiceImplTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/CustomerServiceImplTest.java index 67ff8b0fa3..0271cad6df 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/CustomerServiceImplTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/CustomerServiceImplTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.service; +import com.datastax.driver.core.utils.UUIDs; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.junit.Assert; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DashboardServiceImplTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DashboardServiceImplTest.java index 95f9430b2d..949198c553 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DashboardServiceImplTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DashboardServiceImplTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.service; +import com.datastax.driver.core.utils.UUIDs; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.junit.Assert; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsCacheTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsCacheTest.java index f9068ed0d5..4428d020eb 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsCacheTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsCacheTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.service; +import com.datastax.driver.core.utils.UUIDs; import com.hazelcast.core.HazelcastInstance; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsServiceImplTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsServiceImplTest.java index c31fd2babc..efdab8a08a 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsServiceImplTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsServiceImplTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.service; +import com.datastax.driver.core.utils.UUIDs; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.junit.Assert; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceImplTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceImplTest.java index 8126bfaa83..b256daa7bb 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceImplTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceImplTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.service; +import com.datastax.driver.core.utils.UUIDs; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.junit.Assert; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/WidgetTypeServiceImplTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/WidgetTypeServiceImplTest.java index 9c5fb64313..8f0a9f710f 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/WidgetTypeServiceImplTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/WidgetTypeServiceImplTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.service; +import com.datastax.driver.core.utils.UUIDs; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.After; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/WidgetsBundleServiceImplTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/WidgetsBundleServiceImplTest.java index f7794626c3..6345567832 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/WidgetsBundleServiceImplTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/WidgetsBundleServiceImplTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.service; +import com.datastax.driver.core.utils.UUIDs; import org.junit.After; import org.junit.Assert; import org.junit.Before; diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDaoTest.java new file mode 100644 index 0000000000..8c754015e0 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDaoTest.java @@ -0,0 +1,73 @@ +/** + * 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.dao.sql.user; + +import com.github.springtestdbunit.annotation.DatabaseSetup; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.thingsboard.server.common.data.security.UserCredentials; +import org.thingsboard.server.dao.AbstractJpaDaoTest; +import org.thingsboard.server.dao.user.UserCredentialsDao; + +import java.util.List; +import java.util.UUID; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * Created by Valerii Sosliuk on 4/22/2017. + */ +public class JpaUserCredentialsDaoTest extends AbstractJpaDaoTest { + + @Autowired + private UserCredentialsDao userCredentialsDao; + + @Test + @DatabaseSetup("classpath:dbunit/user_credentials.xml") + public void testFindAll() { + List userCredentials = userCredentialsDao.find(); + assertEquals(2, userCredentials.size()); + } + + @Test + @DatabaseSetup("classpath:dbunit/user_credentials.xml") + public void testFindByUserId() { + UserCredentials userCredentials = userCredentialsDao.findByUserId(UUID.fromString("787827e6-27d7-11e7-93ae-92361f002671")); + assertNotNull(userCredentials); + assertEquals("4b9e010c-27d5-11e7-93ae-92361f002671", userCredentials.getId().toString()); + assertEquals(true, userCredentials.isEnabled()); + assertEquals("password", userCredentials.getPassword()); + assertEquals("ACTIVATE_TOKEN_2", userCredentials.getActivateToken()); + assertEquals("RESET_TOKEN_2", userCredentials.getResetToken()); + } + + @Test + @DatabaseSetup("classpath:dbunit/user_credentials.xml") + public void testFindByActivateToken() { + UserCredentials userCredentials = userCredentialsDao.findByActivateToken("ACTIVATE_TOKEN_1"); + assertNotNull(userCredentials); + assertEquals("3ed10af0-27d5-11e7-93ae-92361f002671", userCredentials.getId().toString()); + } + + @Test + @DatabaseSetup("classpath:dbunit/user_credentials.xml") + public void testFindByResetToken() { + UserCredentials userCredentials = userCredentialsDao.findByResetToken("RESET_TOKEN_2"); + assertNotNull(userCredentials); + assertEquals("4b9e010c-27d5-11e7-93ae-92361f002671", userCredentials.getId().toString()); + } +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java new file mode 100644 index 0000000000..5bd254fa67 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java @@ -0,0 +1,85 @@ +/** + * 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.dao.sql.user; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.springtestdbunit.annotation.DatabaseSetup; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.thingsboard.server.common.data.User; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.id.UserId; +import org.thingsboard.server.common.data.security.Authority; +import org.thingsboard.server.dao.AbstractJpaDaoTest; +import org.thingsboard.server.dao.user.UserDao; + +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +import static org.junit.Assert.*; + +/** + * Created by Valerii Sosliuk on 4/18/2017. + */ +public class JpaUserDaoTest extends AbstractJpaDaoTest { + + @Autowired + private UserDao userDao; + + @Test + @DatabaseSetup("classpath:dbunit/users.xml") + public void testFindAll() { + List users = userDao.find(); + assertEquals(users.size(), 5); + } + + @Test + @DatabaseSetup("classpath:dbunit/users.xml") + public void findByEmail() { + User user = userDao.findByEmail("sysadm@thingsboard.org"); + assertNotNull("User is expected to be not null", user); + assertEquals("9cb58ba0-27c1-11e7-93ae-92361f002671", user.getId().toString()); + assertEquals("c97ea14e-27c1-11e7-93ae-92361f002671", user.getTenantId().toString()); + assertEquals("cdf9c79e-27c1-11e7-93ae-92361f002671", user.getCustomerId().toString()); + assertEquals(Authority.SYS_ADMIN, user.getAuthority()); + assertEquals("John", user.getFirstName()); + assertEquals("Doe", user.getLastName()); + assertEquals("{\"key\":\"value-0\"}", user.getAdditionalInfo().toString()); + } + + @Test + @DatabaseSetup("classpath:dbunit/users.xml") + public void testSave() throws IOException { + User user = new User(); + user.setId(new UserId(UUID.fromString("cd481534-27cc-11e7-93ae-92361f002671"))); + user.setTenantId(new TenantId(UUID.fromString("1edcb2c6-27cb-11e7-93ae-92361f002671"))); + user.setCustomerId(new CustomerId(UUID.fromString("51477cb4-27cb-11e7-93ae-92361f002671"))); + user.setEmail("user@thingsboard.org"); + user.setFirstName("Jackson"); + user.setLastName("Roberts"); + ObjectMapper mapper = new ObjectMapper(); + String additionalInfo = "{\"key\":\"value-100\"}"; + JsonNode jsonNode = mapper.readTree(additionalInfo); + user.setAdditionalInfo(jsonNode); + userDao.save(user); + assertEquals(6, userDao.find().size()); + User savedUser = userDao.findByEmail("user@thingsboard.org"); + assertNotNull(savedUser); + } +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java new file mode 100644 index 0000000000..4fcf7cb924 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java @@ -0,0 +1,82 @@ +/** + * 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.dao.sql.widget; + +import com.datastax.driver.core.utils.UUIDs; +import com.github.springtestdbunit.annotation.DatabaseSetup; +import org.junit.Ignore; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.thingsboard.server.common.data.id.WidgetsBundleId; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.common.data.widget.WidgetsBundle; +import org.thingsboard.server.dao.AbstractJpaDaoTest; +import org.thingsboard.server.dao.widget.WidgetsBundleDao; + +import java.util.List; +import java.util.UUID; + +import static org.junit.Assert.*; + +/** + * Created by Valerii Sosliuk on 4/23/2017. + */ +public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { + + @Autowired + private WidgetsBundleDao widgetsBundleDao; + + @Test + @DatabaseSetup("classpath:dbunit/widgets_bundle.xml") + public void testFindAll() { + assertEquals(7, widgetsBundleDao.find().size()); + } + + @Test + @DatabaseSetup("classpath:dbunit/widgets_bundle.xml") + public void testFindWidgetsBundleByTenantIdAndAlias() { + WidgetsBundle widgetsBundle = widgetsBundleDao.findWidgetsBundleByTenantIdAndAlias( + UUID.fromString("250aca8e-2825-11e7-93ae-92361f002671"), "WB3"); + assertEquals("44e6af4e-2825-11e7-93ae-92361f002671", widgetsBundle.getId().toString()); + } + + @Test + @DatabaseSetup("classpath:dbunit/empty_dataset.xml") + public void testFindSystemWidgetsBundles() { + for (int i = 0; i < 30; i++) { + WidgetsBundle widgetsBundle = new WidgetsBundle(); + widgetsBundle.setAlias("WB" + i); + widgetsBundle.setTitle("WB" + i); + widgetsBundle.setId(new WidgetsBundleId(UUIDs.timeBased())); + widgetsBundleDao.save(widgetsBundle); + } + assertEquals(30, widgetsBundleDao.find().size()); + // Get first page + TextPageLink textPageLink1 = new TextPageLink(10, "WB"); + List widgetsBundles1 = widgetsBundleDao.findSystemWidgetsBundles(textPageLink1); + assertEquals(10, widgetsBundles1.size()); + for (WidgetsBundle widgetsBundle : widgetsBundles1) { + System.out.println(widgetsBundle.getSearchText()); + } + TextPageLink textPageLink2 = new TextPageLink(10, "WB", widgetsBundles1.get(9).getId().getId(), null); + List widgetsBundles2 = widgetsBundleDao.findSystemWidgetsBundles(textPageLink2); + assertEquals(10, widgetsBundles1.size()); + for (WidgetsBundle widgetsBundle : widgetsBundles2) { + System.out.println(widgetsBundle.getSearchText()); + } + + } +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/timeseries/TimeseriesServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/timeseries/TimeseriesServiceTest.java index 49b77c2b32..ae49cb1c23 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/timeseries/TimeseriesServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/timeseries/TimeseriesServiceTest.java @@ -15,6 +15,9 @@ */ package org.thingsboard.server.dao.timeseries; +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.ResultSetFuture; +import com.datastax.driver.core.utils.UUIDs; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.Test; diff --git a/dao/src/test/resources/application-test.properties b/dao/src/test/resources/application-test.properties index 289f94689b..1430eb4f10 100644 --- a/dao/src/test/resources/application-test.properties +++ b/dao/src/test/resources/application-test.properties @@ -5,4 +5,6 @@ cache.device_credentials.max_size.policy=PER_NODE zk.enabled=false zk.url=localhost:2181 -zk.zk_dir=/thingsboard \ No newline at end of file +zk.zk_dir=/thingsboard + +sql.enabled=false \ No newline at end of file diff --git a/dao/src/test/resources/dbunit/empty_dataset.xml b/dao/src/test/resources/dbunit/empty_dataset.xml new file mode 100644 index 0000000000..5ed00ba028 --- /dev/null +++ b/dao/src/test/resources/dbunit/empty_dataset.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dao/src/test/resources/dbunit/user_credentials.xml b/dao/src/test/resources/dbunit/user_credentials.xml new file mode 100644 index 0000000000..c6607e9895 --- /dev/null +++ b/dao/src/test/resources/dbunit/user_credentials.xml @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/dao/src/test/resources/dbunit/users.xml b/dao/src/test/resources/dbunit/users.xml new file mode 100644 index 0000000000..644a6e982d --- /dev/null +++ b/dao/src/test/resources/dbunit/users.xml @@ -0,0 +1,52 @@ + + + + + + + \ No newline at end of file diff --git a/dao/src/test/resources/dbunit/widgets_bundle.xml b/dao/src/test/resources/dbunit/widgets_bundle.xml new file mode 100644 index 0000000000..10a8d22e05 --- /dev/null +++ b/dao/src/test/resources/dbunit/widgets_bundle.xml @@ -0,0 +1,56 @@ + + + + + + + + + + \ No newline at end of file diff --git a/dao/src/test/resources/jpa-test.properties b/dao/src/test/resources/jpa-test.properties new file mode 100644 index 0000000000..7fff922c93 --- /dev/null +++ b/dao/src/test/resources/jpa-test.properties @@ -0,0 +1,7 @@ +cassandra.enabled=false + +sql.enabled=true +sql.datasource.url=jdbc:h2:mem:thingsboard +sql.datasource.username=sa +sql.datasource.password= + diff --git a/pom.xml b/pom.xml index 64017d79a4..909936f074 100755 --- a/pom.xml +++ b/pom.xml @@ -71,6 +71,9 @@ 2.6.1 1.56 2.0.1 + 1.4.194 + 2.5.3 + 1.2.1 @@ -442,6 +445,11 @@ ${spring-security.version} test + + com.github.springtestdbunit + spring-test-dbunit + ${spring-test-dbunit.version} + io.jsonwebtoken jjwt @@ -640,6 +648,12 @@ ${junit.version} test + + org.dbunit + dbunit + ${dbunit.version} + test + org.mockito mockito-all @@ -712,6 +726,11 @@ bcpkix-jdk15on ${bouncycastle.version} + + com.h2database + h2 + ${h2.version} + com.sun.winsw winsw