Browse Source

JPA DAO Basic Implementation & Tests

pull/118/head
mp-loki 9 years ago
parent
commit
a6e9ca9eb1
  1. 3
      application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java
  2. 28
      dao/pom.xml
  3. 26
      dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java
  4. 2
      dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesDao.java
  5. 4
      dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesService.java
  6. 2
      dao/src/main/java/org/thingsboard/server/dao/attributes/BaseAttributesService.java
  7. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
  8. 5
      dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
  9. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
  10. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
  11. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java
  12. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java
  13. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java
  14. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java
  15. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java
  16. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java
  17. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java
  18. 73
      dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java
  19. 106
      dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java
  20. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java
  21. 54
      dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java
  22. 6
      dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java
  23. 71
      dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDao.java
  24. 7
      dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
  25. 18
      dao/src/main/java/org/thingsboard/server/dao/sql/user/UserCredentialsRepository.java
  26. 8
      dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
  27. 91
      dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java
  28. 50
      dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java
  29. 3
      dao/src/main/java/org/thingsboard/server/dao/timeseries/BaseTimeseriesService.java
  30. 2
      dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesDao.java
  31. 3
      dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesService.java
  32. 39
      dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java
  33. 1
      dao/src/test/java/org/thingsboard/server/dao/attributes/BaseAttributesServiceTest.java
  34. 1
      dao/src/test/java/org/thingsboard/server/dao/event/BaseEventServiceTest.java
  35. 1
      dao/src/test/java/org/thingsboard/server/dao/plugin/BasePluginServiceTest.java
  36. 1
      dao/src/test/java/org/thingsboard/server/dao/rule/BaseRuleServiceTest.java
  37. 1
      dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java
  38. 1
      dao/src/test/java/org/thingsboard/server/dao/service/CustomerServiceImplTest.java
  39. 1
      dao/src/test/java/org/thingsboard/server/dao/service/DashboardServiceImplTest.java
  40. 1
      dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsCacheTest.java
  41. 1
      dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsServiceImplTest.java
  42. 1
      dao/src/test/java/org/thingsboard/server/dao/service/DeviceServiceImplTest.java
  43. 1
      dao/src/test/java/org/thingsboard/server/dao/service/WidgetTypeServiceImplTest.java
  44. 1
      dao/src/test/java/org/thingsboard/server/dao/service/WidgetsBundleServiceImplTest.java
  45. 73
      dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserCredentialsDaoTest.java
  46. 85
      dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java
  47. 82
      dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java
  48. 3
      dao/src/test/java/org/thingsboard/server/dao/timeseries/TimeseriesServiceTest.java
  49. 4
      dao/src/test/resources/application-test.properties
  50. 1
      dao/src/test/resources/dbunit/empty_dataset.xml
  51. 28
      dao/src/test/resources/dbunit/user_credentials.xml
  52. 52
      dao/src/test/resources/dbunit/users.xml
  53. 56
      dao/src/test/resources/dbunit/widgets_bundle.xml
  54. 7
      dao/src/test/resources/jpa-test.properties
  55. 19
      pom.xml

3
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;

28
dao/pom.xml

@ -65,6 +65,16 @@
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.springtestdbunit</groupId>
<artifactId>spring-test-dbunit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
@ -154,6 +164,24 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
<build>
<plugins>

26
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();
}
}

2
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;

4
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;

2
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;

2
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<AdminSettings> {

5
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<ComponentDescriptor> {

2
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<Customer> {

2
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<Dashboard> {

2
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<DashboardInfo> {

2
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<DeviceCredentials> {

2
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<Device> {

2
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<Event> {

2
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<PluginMetaData> {

2
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<RuleMetaData> {

2
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<Tenant> {

73
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<UserCredentials> {
@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<UserCredentials>
@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<UserCredentials>
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<UserCredentials>
return userCredentials;
}
@Override
public UUID getId() {
return id;
}
@Override
public void setId(UUID id) {
this.id = id;
}
}

106
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<User> {
@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<User> {
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<User> {
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<User> {
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> {
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<User> {
return false;
return true;
}
}

2
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<WidgetType> {

54
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<WidgetsBundle> {
@ -39,10 +42,10 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
private static final long serialVersionUID = 6897035686422298096L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
@Column(name = ModelConstants.ID_PROPERTY, columnDefinition = "BINARY(16)")
private UUID id;
@Column(name = ModelConstants.WIDGETS_BUNDLE_TENANT_ID_PROPERTY)
@Column(name = ModelConstants.WIDGETS_BUNDLE_TENANT_ID_PROPERTY, columnDefinition = "BINARY(16)")
private UUID tenantId;
@Column(name = ModelConstants.WIDGETS_BUNDLE_ALIAS_PROPERTY)
@ -55,7 +58,7 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
private String searchText;
@Column(name = ModelConstants.WIDGETS_BUNDLE_IMAGE_PROPERTY)
private ByteBuffer image;
private byte[] image;
public WidgetsBundleEntity() {
super();
@ -71,7 +74,7 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
this.alias = widgetsBundle.getAlias();
this.title = widgetsBundle.getTitle();
if (widgetsBundle.getImage() != null) {
this.image = ByteBuffer.wrap(widgetsBundle.getImage());
this.image = widgetsBundle.getImage();
}
}
@ -85,38 +88,6 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
this.id = id;
}
public UUID getTenantId() {
return tenantId;
}
public void setTenantId(UUID tenantId) {
this.tenantId = tenantId;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public ByteBuffer getImage() {
return image;
}
public void setImage(ByteBuffer image) {
this.image = image;
}
@Override
public String getSearchTextSource() {
return title;
@ -127,10 +98,6 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
this.searchText = searchText;
}
public String getSearchText() {
return searchText;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
@ -155,7 +122,6 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
if (title != null ? !title.equals(that.title) : that.title != null) return false;
if (searchText != null ? !searchText.equals(that.searchText) : that.searchText != null) return false;
return image != null ? image.equals(that.image) : that.image == null;
}
@Override
@ -180,11 +146,7 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
}
widgetsBundle.setAlias(alias);
widgetsBundle.setTitle(title);
if (image != null) {
byte[] imageByteArray = new byte[image.remaining()];
image.get(imageByteArray);
widgetsBundle.setImage(imageByteArray);
}
widgetsBundle.setImage(image);
return widgetsBundle;
}
}

6
dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java

@ -18,11 +18,11 @@ package org.thingsboard.server.dao.sql;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.repository.CrudRepository;
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 org.thingsboard.server.dao.sql.user.JpaRepository;
import java.util.List;
import java.util.UUID;
@ -37,7 +37,7 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> implements Dao<
protected abstract String getColumnFamilyName();
protected abstract JpaRepository<E, UUID> getCrudRepository();
protected abstract CrudRepository<E, UUID> getCrudRepository();
protected boolean isSearchTextDao() {
return false;
@ -69,7 +69,7 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> implements Dao<
@Override
public ListenableFuture<D> findByIdAsync(UUID key) {
log.debug("Get entity by key {}", key);
org.springframework.util.concurrent.ListenableFuture<E> entityFuture = getCrudRepository().findByIdAsync(key);
// org.springframework.util.concurrent.ListenableFuture<E> entityFuture = getCrudRepository().findByIdAsync(key);
// TODO: vsosliuk implement
return null;
}

71
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<UserCredentialsEntity, UserCredentials> implements UserCredentialsDao {
@Autowired
private UserCredentialsRepository userCredentialsRepository;
@Override
protected Class<UserCredentialsEntity> getEntityClass() {
return UserCredentialsEntity.class;
}
@Override
protected String getColumnFamilyName() {
return ModelConstants.USER_CREDENTIALS_COLUMN_FAMILY_NAME;
}
@Override
protected CrudRepository<UserCredentialsEntity, UUID> 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));
}
}

7
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<UserEntity, User> implements User
}
@Override
protected JpaRepository<UserEntity, UUID> getCrudRepository() {
protected CrudRepository<UserEntity, UUID> getCrudRepository() {
return userRepository;
}
@ -61,11 +62,11 @@ public class JpaUserDao extends JpaAbstractDao<UserEntity, User> implements User
@Override
public List<User> findTenantAdmins(UUID tenantId, TextPageLink pageLink) {
return null;
throw new RuntimeException("Not Implemented");
}
@Override
public List<User> findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) {
return null;
throw new RuntimeException("Not Implemented");
}
}

18
dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaRepository.java → 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<E, ID extends Serializable> extends CrudRepository<E, ID> {
@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false)
public interface UserCredentialsRepository extends CrudRepository<UserCredentialsEntity, UUID> {
@Async
ListenableFuture<E> findByIdAsync(ID key);
UserCredentialsEntity findByUserId(UUID userId);
UserCredentialsEntity findByActivateToken(String activateToken);
UserCredentialsEntity findByResetToken(String resetToken);
}

8
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<UserEntity, UUID> {
@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false)
public interface UserRepository extends CrudRepository<UserEntity, UUID> {
UserEntity findByEmail(String email);

91
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<WidgetsBundleEntity, WidgetsBundle> implements WidgetsBundleDao {
@Autowired
private WidgetsBundleRepository widgetsBundleRepository;
@Override
protected Class<WidgetsBundleEntity> getEntityClass() {
return WidgetsBundleEntity.class;
}
@Override
protected String getColumnFamilyName() {
return WIDGETS_BUNDLE_COLUMN_FAMILY_NAME;
}
@Override
protected CrudRepository<WidgetsBundleEntity, UUID> getCrudRepository() {
return widgetsBundleRepository;
}
@Override
public WidgetsBundle findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias) {
return DaoUtil.getData(widgetsBundleRepository.findWidgetsBundleByTenantIdAndAlias(tenantId, alias));
}
@Override
public List<WidgetsBundle> 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<WidgetsBundle> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
throw new RuntimeException("Not implemented");
}
@Override
public List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
throw new RuntimeException("Not implemented");
}
@Override
protected boolean isSearchTextDao() {
return true;
}
}

50
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<WidgetsBundleEntity, UUID> {
public interface WidgetsBundleRepository extends JpaRepository<WidgetsBundleEntity, UUID>, 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<WidgetsBundleEntity> 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<WidgetsBundleEntity> findSystemWidgetsBundlesNextPage(Integer limit, String searchText, UUID idOffset);
}

3
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;

2
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;

3
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;

39
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 {
}

1
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;

1
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;

1
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;

1
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;

1
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;

1
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;

1
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;

1
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;

1
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;

1
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;

1
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;

1
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;

73
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> 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());
}
}

85
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<User> 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);
}
}

82
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<WidgetsBundle> 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<WidgetsBundle> widgetsBundles2 = widgetsBundleDao.findSystemWidgetsBundles(textPageLink2);
assertEquals(10, widgetsBundles1.size());
for (WidgetsBundle widgetsBundle : widgetsBundles2) {
System.out.println(widgetsBundle.getSearchText());
}
}
}

3
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;

4
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
zk.zk_dir=/thingsboard
sql.enabled=false

1
dao/src/test/resources/dbunit/empty_dataset.xml

@ -0,0 +1 @@
<dataset></dataset>

28
dao/src/test/resources/dbunit/user_credentials.xml

@ -0,0 +1,28 @@
<dataset>
<user_credentials
id="uuid'3ed10af0-27d5-11e7-93ae-92361f002671'"
user_id="uuid'44ee8552-27d5-11e7-93ae-92361f002671'"
enabled="true"
password="password"
activate_token="ACTIVATE_TOKEN_1"
reset_token="RESET_TOKEN_1"
/>
<user_credentials
id="uuid'4b9e010c-27d5-11e7-93ae-92361f002671'"
user_id="uuid'787827e6-27d7-11e7-93ae-92361f002671'"
enabled="true"
password="password"
activate_token="ACTIVATE_TOKEN_2"
reset_token="RESET_TOKEN_2"
/>
<!--
<user_credentials
id=""
user_id=""
enabled="true"
password="password"
activate_token=""
reset_token=""
/>
-->
</dataset>

52
dao/src/test/resources/dbunit/users.xml

@ -0,0 +1,52 @@
<dataset>
<user id="uuid'9cb58ba0-27c1-11e7-93ae-92361f002671'"
tenant_id="uuid'c97ea14e-27c1-11e7-93ae-92361f002671'"
customer_id="uuid'cdf9c79e-27c1-11e7-93ae-92361f002671'"
authority="0"
email="sysadm@thingsboard.org"
search_text="SYSADM SEARCH TEXT"
first_name="John"
last_name="Doe"
additional_info="{&quot;key&quot;:&quot;value-0&quot;}"
/>
<user id="uuid'1312f328-27c7-11e7-93ae-92361f002671'"
tenant_id="uuid'1e1cd4c8-27c7-11e7-93ae-92361f002671'"
customer_id="uuid'22fe91e8-27c7-11e7-93ae-92361f002671'"
authority="1"
email="tenantadm1@thingsboard.org"
search_text="TENANTADM1 SEARCH TEXT"
first_name="Samuel"
last_name="Serif"
additional_info="{&quot;key&quot;:&quot;value-11&quot;}"
/>
<user id="uuid'2b090dde-27ca-11e7-93ae-92361f002671'"
tenant_id="uuid'1e1cd4c8-27c7-11e7-93ae-92361f002671'"
customer_id="uuid'34be535c-27ca-11e7-93ae-92361f002671'"
authority="1"
email="tenantadm2@thingsboard.org"
search_text="TENANTADM2 SEARCH TEXT"
first_name="Penny"
last_name="Morgan"
additional_info="{&quot;key&quot;:&quot;value-12&quot;}"
/>
<user id="uuid'cc8c1ca8-27c7-11e7-93ae-92361f002671'"
tenant_id="uuid'd2e27caa-27c7-11e7-93ae-92361f002671'"
customer_id="uuid'd89e128a-27c7-11e7-93ae-92361f002671'"
authority="2"
email="customeruser@thingsboard.org"
search_text="CUSTOMER USER SEARCH TEXT"
first_name="Norman"
last_name="Gordon"
additional_info="{&quot;key&quot;:&quot;value-2&quot;}"
/>
<user id="uuid'edb2de58-27c7-11e7-93ae-92361f002671'"
tenant_id="uuid'f229675e-27c7-11e7-93ae-92361f002671'"
customer_id="uuid'f7a3d4e4-27c7-11e7-93ae-92361f002671'"
authority="3"
email="refreshtoken@thingsboard.org"
search_text="REFRESH TOKEN SEARCH TEXT"
first_name="Dianne"
last_name="Wensleydale"
additional_info="{&quot;key&quot;:&quot;value-3&quot;}"
/>
</dataset>

56
dao/src/test/resources/dbunit/widgets_bundle.xml

@ -0,0 +1,56 @@
<dataset>
<widgets_bundle
id="uuid'250ac7b4-2825-11e7-93ae-92361f002671'"
tenant_id="uuid'250aca8e-2825-11e7-93ae-92361f002671'"
alias="WB1"
title="Widgets Bundle 1"
search_text="WB SEARCH TEXT 1"
/>
<widgets_bundle
id="uuid'3269c18a-2825-11e7-93ae-92361f002671'"
tenant_id="uuid'3269c18a-2825-11e7-93ae-92361f002671'"
alias="WB2"
title="Widgets Bundle 2"
search_text="WB SEARCH TEXT 2"
/>
<widgets_bundle
id="uuid'44e6af4e-2825-11e7-93ae-92361f002671'"
tenant_id="uuid'250aca8e-2825-11e7-93ae-92361f002671'"
alias="WB3"
title="Widgets Bundle 3"
search_text="WB SEARCH TEXT 3"
/>
<widgets_bundle
id="uuid'696dc9b4-2830-11e7-93ae-92361f002671'"
alias="WB4"
title="Widgets Bundle 4"
search_text="SYSTEM BUNDLE 1"
/>
<widgets_bundle
id="uuid'1a83fc50-2840-11e7-93ae-92361f002671'"
alias="WB5"
title="Widgets Bundle 5"
search_text="SYSTEM BUNDLE 2"
/>
<widgets_bundle
id="uuid'6a593dde-2841-11e7-93ae-92361f002671'"
alias="WB6"
title="Widgets Bundle 6"
search_text="SYSTEM BUNDLE 1"
/>
<widgets_bundle
id="uuid'3beb4b1a-294d-11e7-93ae-92361f002671'"
alias="WB6"
title="Widgets Bundle 7"
search_text="ABC DEF"
/>
<!--
<widgets_bundle
id=""
tenant_id=""
alias=""
title=""
search_text=""
/>
-->
</dataset>

7
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=

19
pom.xml

@ -71,6 +71,9 @@
<springfox-swagger.version>2.6.1</springfox-swagger.version>
<bouncycastle.version>1.56</bouncycastle.version>
<winsw.version>2.0.1</winsw.version>
<h2.version>1.4.194</h2.version>
<dbunit.version>2.5.3</dbunit.version>
<spring-test-dbunit.version>1.2.1</spring-test-dbunit.version>
</properties>
<modules>
@ -442,6 +445,11 @@
<version>${spring-security.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.springtestdbunit</groupId>
<artifactId>spring-test-dbunit</artifactId>
<version>${spring-test-dbunit.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
@ -640,6 +648,12 @@
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>${dbunit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
@ -712,6 +726,11 @@
<artifactId>bcpkix-jdk15on</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
</dependency>
<dependency>
<groupId>com.sun.winsw</groupId>
<artifactId>winsw</artifactId>

Loading…
Cancel
Save