Browse Source

Merge pull request #101 from volodymyr-babak/master

DAO refactoring
pull/104/head
VoBa 9 years ago
committed by GitHub
parent
commit
8450ca1454
  1. 27
      application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java
  2. 2
      application/src/main/java/org/thingsboard/server/controller/BaseController.java
  3. 3
      application/src/main/java/org/thingsboard/server/controller/DeviceController.java
  4. 1
      application/src/main/java/org/thingsboard/server/controller/PluginController.java
  5. 12
      application/src/main/resources/thingsboard.yml
  6. 1
      application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java
  7. 1
      application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java
  8. 5
      common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleMetaData.java
  9. 4
      dao/pom.xml
  10. 2
      dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractAsyncDao.java
  11. 2
      dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractDao.java
  12. 93
      dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractModelDao.java
  13. 21
      dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractSearchTextDao.java
  14. 13
      dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractSearchTimeDao.java
  15. 3
      dao/src/main/java/org/thingsboard/server/dao/Dao.java
  16. 8
      dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java
  17. 1
      dao/src/main/java/org/thingsboard/server/dao/EncryptionUtil.java
  18. 42
      dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java
  19. 2
      dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesDao.java
  20. 4
      dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesService.java
  21. 6
      dao/src/main/java/org/thingsboard/server/dao/attributes/BaseAttributesService.java
  22. 14
      dao/src/main/java/org/thingsboard/server/dao/attributes/CassandraBaseAttributesDao.java
  23. 10
      dao/src/main/java/org/thingsboard/server/dao/cassandra/CassandraCluster.java
  24. 3
      dao/src/main/java/org/thingsboard/server/dao/cassandra/CassandraQueryOptions.java
  25. 3
      dao/src/main/java/org/thingsboard/server/dao/cassandra/CassandraSocketOptions.java
  26. 20
      dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java
  27. 45
      dao/src/main/java/org/thingsboard/server/dao/component/CassandraBaseComponentDescriptorDao.java
  28. 13
      dao/src/main/java/org/thingsboard/server/dao/component/ComponentDescriptorDao.java
  29. 31
      dao/src/main/java/org/thingsboard/server/dao/customer/CassandraCustomerDao.java
  30. 13
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerDao.java
  31. 10
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerService.java
  32. 39
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
  33. 37
      dao/src/main/java/org/thingsboard/server/dao/dashboard/CassandraDashboardDao.java
  34. 16
      dao/src/main/java/org/thingsboard/server/dao/dashboard/CassandraDashboardInfoDao.java
  35. 12
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDao.java
  36. 60
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDaoImpl.java
  37. 18
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardInfoDao.java
  38. 28
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java
  39. 59
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java
  40. 38
      dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceCredentialsDao.java
  41. 43
      dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java
  42. 15
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsDao.java
  43. 20
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java
  44. 23
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceDao.java
  45. 69
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java
  46. 47
      dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java
  47. 53
      dao/src/main/java/org/thingsboard/server/dao/event/CassandraBaseEventDao.java
  48. 15
      dao/src/main/java/org/thingsboard/server/dao/event/EventDao.java
  49. 1
      dao/src/main/java/org/thingsboard/server/dao/event/EventService.java
  50. 26
      dao/src/main/java/org/thingsboard/server/dao/exception/DatabaseException.java
  51. 4
      dao/src/main/java/org/thingsboard/server/dao/exception/IncorrectParameterException.java
  52. 3
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/AdminSettingsEntity.java
  53. 4
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/ComponentDescriptorEntity.java
  54. 47
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/CustomerEntity.java
  55. 4
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardEntity.java
  56. 7
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java
  57. 4
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceCredentialsEntity.java
  58. 20
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceEntity.java
  59. 22
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/EventEntity.java
  60. 17
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/PluginMetaDataEntity.java
  61. 31
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/RuleMetaDataEntity.java
  62. 47
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/TenantEntity.java
  63. 26
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserCredentialsEntity.java
  64. 35
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserEntity.java
  65. 4
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetTypeEntity.java
  66. 4
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetsBundleEntity.java
  67. 145
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
  68. 164
      dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
  69. 351
      dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
  70. 221
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
  71. 199
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java
  72. 187
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java
  73. 213
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java
  74. 119
      dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java
  75. 216
      dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java
  76. 228
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java
  77. 351
      dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java
  78. 189
      dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java
  79. 274
      dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java
  80. 183
      dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java
  81. 190
      dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java
  82. 49
      dao/src/main/java/org/thingsboard/server/dao/plugin/BasePluginService.java
  83. 41
      dao/src/main/java/org/thingsboard/server/dao/plugin/CassandraBasePluginDao.java
  84. 13
      dao/src/main/java/org/thingsboard/server/dao/plugin/PluginDao.java
  85. 39
      dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleService.java
  86. 31
      dao/src/main/java/org/thingsboard/server/dao/rule/CassandraBaseRuleDao.java
  87. 13
      dao/src/main/java/org/thingsboard/server/dao/rule/RuleDao.java
  88. 11
      dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java
  89. 30
      dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java
  90. 7
      dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsDao.java
  91. 6
      dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsService.java
  92. 18
      dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsServiceImpl.java
  93. 31
      dao/src/main/java/org/thingsboard/server/dao/settings/CassandraAdminSettingsDao.java
  94. 90
      dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java
  95. 31
      dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaRepository.java
  96. 52
      dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
  97. 26
      dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
  98. 33
      dao/src/main/java/org/thingsboard/server/dao/tenant/CassandraTenantDao.java
  99. 11
      dao/src/main/java/org/thingsboard/server/dao/tenant/TenantDao.java
  100. 12
      dao/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java

27
application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java

@ -15,16 +15,7 @@
*/
package org.thingsboard.server.actors.plugin;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture;
import com.datastax.driver.core.Row;
import akka.actor.ActorRef;
import com.google.common.base.Function;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
@ -32,18 +23,20 @@ import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.id.*;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.PluginId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.kv.AttributeKey;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.kv.TsKvQuery;
import org.thingsboard.server.common.data.page.TextPageData;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotificationMsg;
import org.thingsboard.server.extensions.api.plugins.PluginApiCallSecurityContext;
import org.thingsboard.server.extensions.api.plugins.PluginContext;
import org.thingsboard.server.extensions.api.plugins.PluginCallback;
import org.thingsboard.server.extensions.api.plugins.PluginContext;
import org.thingsboard.server.extensions.api.plugins.msg.PluginToRuleMsg;
import org.thingsboard.server.extensions.api.plugins.msg.TimeoutMsg;
import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequest;
@ -52,10 +45,12 @@ import org.thingsboard.server.extensions.api.plugins.rpc.RpcMsg;
import org.thingsboard.server.extensions.api.plugins.ws.PluginWebsocketSessionRef;
import org.thingsboard.server.extensions.api.plugins.ws.msg.PluginWebsocketMsg;
import akka.actor.ActorRef;
import org.w3c.dom.Attr;
import javax.annotation.Nullable;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
@Slf4j
public final class PluginProcessingContext implements PluginContext {

2
application/src/main/java/org/thingsboard/server/controller/BaseController.java

@ -15,8 +15,6 @@
*/
package org.thingsboard.server.controller;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

3
application/src/main/java/org/thingsboard/server/controller/DeviceController.java

@ -23,19 +23,16 @@ import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UUIDBased;
import org.thingsboard.server.common.data.page.TextPageData;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.exception.ThingsboardException;
import org.thingsboard.server.extensions.api.device.DeviceCredentialsUpdateNotificationMsg;
import org.thingsboard.server.service.security.model.SecurityUser;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@RestController
@RequestMapping("/api")

1
application/src/main/java/org/thingsboard/server/controller/PluginController.java

@ -25,7 +25,6 @@ import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
import org.thingsboard.server.common.data.plugin.PluginMetaData;
import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.exception.ThingsboardException;

12
application/src/main/resources/thingsboard.yml

@ -188,3 +188,15 @@ cache:
updates:
# Enable/disable updates checking.
enabled: "${UPDATES_ENABLED:true}"
cassandra:
enabled: "${CASSANDRA_ENABLED:true}"
# SQL DAO Configuration
sql:
enabled: "${SQL_ENABLED:false}"
datasource:
url: "${SQL_DATASOURCE_URL:jdbc:postgresql://localhost:5432/thingsboard}"
username: "${SQL_DATASOURCE_USERNAME:postgres}"
password: "${SQL_DATASOURCE_PASSWORD:postgres}"

1
application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java

@ -35,7 +35,6 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.datastax.driver.core.utils.UUIDs;
import com.fasterxml.jackson.core.type.TypeReference;
public class DashboardControllerTest extends AbstractControllerTest {

1
application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java

@ -42,7 +42,6 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.datastax.driver.core.utils.UUIDs;
import com.fasterxml.jackson.core.type.TypeReference;
public class DeviceControllerTest extends AbstractControllerTest {

5
common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleMetaData.java

@ -15,14 +15,11 @@
*/
package org.thingsboard.server.common.data.rule;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.ToString;
import org.thingsboard.server.common.data.SearchTextBased;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.RuleId;
import org.thingsboard.server.common.data.id.TenantId;
import com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
@Data

4
dao/pom.xml

@ -150,6 +150,10 @@
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
<build>
<plugins>

2
dao/src/main/java/org/thingsboard/server/dao/AbstractAsyncDao.java → dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractAsyncDao.java

@ -23,7 +23,7 @@ import java.util.concurrent.Executors;
/**
* Created by ashvayka on 21.02.17.
*/
public abstract class AbstractAsyncDao extends AbstractDao {
public abstract class CassandraAbstractAsyncDao extends CassandraAbstractDao {
protected ExecutorService readResultsProcessingExecutor;

2
dao/src/main/java/org/thingsboard/server/dao/AbstractDao.java → dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractDao.java

@ -23,7 +23,7 @@ import org.thingsboard.server.dao.cassandra.CassandraCluster;
import org.thingsboard.server.dao.model.type.*;
@Slf4j
public abstract class AbstractDao {
public abstract class CassandraAbstractDao {
@Autowired
protected CassandraCluster cluster;

93
dao/src/main/java/org/thingsboard/server/dao/AbstractModelDao.java → dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractModelDao.java

@ -28,8 +28,9 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.wrapper.EntityResultSet;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.wrapper.EntityResultSet;
import javax.annotation.Nullable;
import java.util.Collections;
@ -37,26 +38,29 @@ import java.util.List;
import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.lt;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
@Slf4j
public abstract class AbstractModelDao<T extends BaseEntity<?>> extends AbstractDao implements Dao<T> {
public abstract class CassandraAbstractModelDao<E extends BaseEntity<D>, D> extends CassandraAbstractDao implements Dao<D> {
protected abstract Class<T> getColumnFamilyClass();
protected abstract Class<E> getColumnFamilyClass();
protected abstract String getColumnFamilyName();
protected Mapper<T> getMapper() {
protected boolean isSearchTextDao() {
return false;
}
protected Mapper<E> getMapper() {
return cluster.getMapper(getColumnFamilyClass());
}
protected List<T> findListByStatement(Statement statement) {
List<T> list = Collections.emptyList();
protected List<E> findListByStatement(Statement statement) {
List<E> list = Collections.emptyList();
if (statement != null) {
statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel());
ResultSet resultSet = getSession().execute(statement);
Result<T> result = getMapper().map(resultSet);
Result<E> result = getMapper().map(resultSet);
if (result != null) {
list = result.all();
}
@ -64,33 +68,33 @@ public abstract class AbstractModelDao<T extends BaseEntity<?>> extends Abstract
return list;
}
protected ListenableFuture<List<T>> findListByStatementAsync(Statement statement) {
protected ListenableFuture<List<D>> findListByStatementAsync(Statement statement) {
if (statement != null) {
statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel());
ResultSetFuture resultSetFuture = getSession().executeAsync(statement);
ListenableFuture<List<T>> result = Futures.transform(resultSetFuture, new Function<ResultSet, List<T>>() {
return Futures.transform(resultSetFuture, new Function<ResultSet, List<D>>() {
@Nullable
@Override
public List<T> apply(@Nullable ResultSet resultSet) {
Result<T> result = getMapper().map(resultSet);
public List<D> apply(@Nullable ResultSet resultSet) {
Result<E> result = getMapper().map(resultSet);
if (result != null) {
return result.all();
List<E> entities = result.all();
return DaoUtil.convertDataList(entities);
} else {
return Collections.emptyList();
}
}
});
return result;
}
return Futures.immediateFuture(Collections.emptyList());
}
protected T findOneByStatement(Statement statement) {
T object = null;
protected E findOneByStatement(Statement statement) {
E object = null;
if (statement != null) {
statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel());
ResultSet resultSet = getSession().execute(statement);
Result<T> result = getMapper().map(resultSet);
Result<E> result = getMapper().map(resultSet);
if (result != null) {
object = result.one();
}
@ -98,32 +102,32 @@ public abstract class AbstractModelDao<T extends BaseEntity<?>> extends Abstract
return object;
}
protected ListenableFuture<T> findOneByStatementAsync(Statement statement) {
protected ListenableFuture<D> findOneByStatementAsync(Statement statement) {
if (statement != null) {
statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel());
ResultSetFuture resultSetFuture = getSession().executeAsync(statement);
ListenableFuture<T> result = Futures.transform(resultSetFuture, new Function<ResultSet, T>() {
return Futures.transform(resultSetFuture, new Function<ResultSet, D>() {
@Nullable
@Override
public T apply(@Nullable ResultSet resultSet) {
Result<T> result = getMapper().map(resultSet);
public D apply(@Nullable ResultSet resultSet) {
Result<E> result = getMapper().map(resultSet);
if (result != null) {
return result.one();
E entity = result.one();
return DaoUtil.getData(entity);
} else {
return null;
}
}
});
return result;
}
return Futures.immediateFuture(null);
}
protected Statement getSaveQuery(T dto) {
protected Statement getSaveQuery(E dto) {
return getMapper().saveQuery(dto);
}
protected EntityResultSet<T> saveWithResult(T entity) {
protected EntityResultSet<E> saveWithResult(E entity) {
log.debug("Save entity {}", entity);
if (entity.getId() == null) {
entity.setId(UUIDs.timeBased());
@ -136,34 +140,51 @@ public abstract class AbstractModelDao<T extends BaseEntity<?>> extends Abstract
return new EntityResultSet<>(resultSet, entity);
}
public T save(T entity) {
return saveWithResult(entity).getEntity();
@Override
public D save(D domain) {
E entity;
try {
entity = getColumnFamilyClass().getConstructor(domain.getClass()).newInstance(domain);
} catch (Exception e) {
log.error("Can't create entity for domain object {}", domain, e);
throw new IllegalArgumentException("Can't create entity for domain object {" + domain + "}", e);
}
if (isSearchTextDao()) {
((SearchTextEntity) entity).setSearchText(((SearchTextEntity) entity).getSearchTextSource().toLowerCase());
}
log.debug("Saving entity {}", entity);
entity = saveWithResult(entity).getEntity();
return DaoUtil.getData(entity);
}
public T findById(UUID key) {
@Override
public D findById(UUID key) {
log.debug("Get entity by key {}", key);
Select.Where query = select().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, key));
log.trace("Execute query {}", query);
return findOneByStatement(query);
E entity = findOneByStatement(query);
return DaoUtil.getData(entity);
}
public ListenableFuture<T> findByIdAsync(UUID key) {
@Override
public ListenableFuture<D> findByIdAsync(UUID key) {
log.debug("Get entity by key {}", key);
Select.Where query = select().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, key));
log.trace("Execute query {}", query);
return findOneByStatementAsync(query);
}
public ResultSet removeById(UUID key) {
@Override
public boolean removeById(UUID key) {
Statement delete = QueryBuilder.delete().all().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, key));
log.debug("Remove request: {}", delete.toString());
return getSession().execute(delete);
return getSession().execute(delete).wasApplied();
}
public List<T> find() {
@Override
public List<D> find() {
log.debug("Get all entities from column family {}", getColumnFamilyName());
return findListByStatement(QueryBuilder.select().all().from(getColumnFamilyName()).setConsistencyLevel(cluster.getDefaultReadConsistencyLevel()));
List<E> entities = findListByStatement(QueryBuilder.select().all().from(getColumnFamilyName()).setConsistencyLevel(cluster.getDefaultReadConsistencyLevel()));
return DaoUtil.convertDataList(entities);
}
}

21
dao/src/main/java/org/thingsboard/server/dao/AbstractSearchTextDao.java → dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractSearchTextDao.java

@ -19,27 +19,26 @@ import com.datastax.driver.core.querybuilder.Clause;
import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.datastax.driver.core.querybuilder.Select;
import com.datastax.driver.core.querybuilder.Select.Where;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.List;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.gt;
import static com.datastax.driver.core.querybuilder.QueryBuilder.gte;
import static com.datastax.driver.core.querybuilder.QueryBuilder.lt;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
public abstract class AbstractSearchTextDao<T extends SearchTextEntity<?>> extends AbstractModelDao<T> {
@Slf4j
public abstract class CassandraAbstractSearchTextDao<E extends SearchTextEntity<D>, D> extends CassandraAbstractModelDao<E, D> {
public T save(T entity) {
entity.setSearchText(entity.getSearchTextSource().toLowerCase());
return super.save(entity);
@Override
protected boolean isSearchTextDao() {
return true;
}
protected List<T> findPageWithTextSearch(String searchView, List<Clause> clauses, TextPageLink pageLink) {
protected List<E> findPageWithTextSearch(String searchView, List<Clause> clauses, TextPageLink pageLink) {
Select select = select().from(searchView);
Where query = select.where();
for (Clause clause : clauses) {
@ -49,7 +48,7 @@ public abstract class AbstractSearchTextDao<T extends SearchTextEntity<?>> exten
if (!StringUtils.isEmpty(pageLink.getTextOffset())) {
query.and(eq(ModelConstants.SEARCH_TEXT_PROPERTY, pageLink.getTextOffset()));
query.and(QueryBuilder.lt(ModelConstants.ID_PROPERTY, pageLink.getIdOffset()));
List<T> result = findListByStatement(query);
List<E> result = findListByStatement(query);
if (result.size() < pageLink.getLimit()) {
select = select().from(searchView);
query = select.where();

13
dao/src/main/java/org/thingsboard/server/dao/AbstractSearchTimeDao.java → dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractSearchTimeDao.java

@ -21,34 +21,29 @@ import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.datastax.driver.core.querybuilder.Select;
import com.datastax.driver.core.querybuilder.Select.Where;
import com.datastax.driver.core.utils.UUIDs;
import org.apache.commons.lang3.StringUtils;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
public abstract class AbstractSearchTimeDao<T extends BaseEntity<?>> extends AbstractModelDao<T> {
public abstract class CassandraAbstractSearchTimeDao<E extends BaseEntity<D>, D> extends CassandraAbstractModelDao<E, D> {
protected List<T> findPageWithTimeSearch(String searchView, List<Clause> clauses, TimePageLink pageLink) {
protected List<E> findPageWithTimeSearch(String searchView, List<Clause> clauses, TimePageLink pageLink) {
return findPageWithTimeSearch(searchView, clauses, Collections.emptyList(), pageLink);
}
protected List<T> findPageWithTimeSearch(String searchView, List<Clause> clauses, Ordering ordering, TimePageLink pageLink) {
protected List<E> findPageWithTimeSearch(String searchView, List<Clause> clauses, Ordering ordering, TimePageLink pageLink) {
return findPageWithTimeSearch(searchView, clauses, Collections.singletonList(ordering), pageLink);
}
protected List<T> findPageWithTimeSearch(String searchView, List<Clause> clauses, List<Ordering> topLevelOrderings, TimePageLink pageLink) {
protected List<E> findPageWithTimeSearch(String searchView, List<Clause> clauses, List<Ordering> topLevelOrderings, TimePageLink pageLink) {
Select select = select().from(searchView);
Where query = select.where();
for (Clause clause : clauses) {

3
dao/src/main/java/org/thingsboard/server/dao/Dao.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao;
import com.datastax.driver.core.ResultSet;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.List;
@ -31,6 +30,6 @@ public interface Dao<T> {
T save(T t);
ResultSet removeById(UUID id);
boolean removeById(UUID id);
}

8
dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java

@ -15,15 +15,11 @@
*/
package org.thingsboard.server.dao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import org.thingsboard.server.common.data.id.UUIDBased;
import org.thingsboard.server.dao.model.ToData;
import java.util.*;
public abstract class DaoUtil {
private DaoUtil() {

1
dao/src/main/java/org/thingsboard/server/dao/EncryptionUtil.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao;
import com.google.common.base.CharMatcher;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.crypto.digests.SHA3Digest;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;

42
dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java

@ -0,0 +1,42 @@
/**
* 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 org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @author Valerii Sosliuk
*/
@Configuration
@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false)
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,8 +15,6 @@
*/
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,12 +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.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;

6
dao/src/main/java/org/thingsboard/server/dao/attributes/BaseAttributesService.java

@ -15,16 +15,14 @@
*/
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.dao.service.Validator;
import java.util.Collection;

14
dao/src/main/java/org/thingsboard/server/dao/attributes/BaseAttributesDao.java → dao/src/main/java/org/thingsboard/server/dao/attributes/CassandraBaseAttributesDao.java

@ -24,10 +24,11 @@ import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.dao.AbstractAsyncDao;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry;
import org.thingsboard.server.dao.CassandraAbstractAsyncDao;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.common.data.kv.*;
import org.thingsboard.server.dao.timeseries.BaseTimeseriesDao;
import org.thingsboard.server.dao.timeseries.CassandraBaseTimeseriesDao;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@ -37,15 +38,16 @@ import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import static org.thingsboard.server.dao.model.ModelConstants.*;
import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
/**
* @author Andrew Shvayka
*/
@Component
@Slf4j
public class BaseAttributesDao extends AbstractAsyncDao implements AttributesDao {
public class CassandraBaseAttributesDao extends CassandraAbstractAsyncDao implements AttributesDao {
private PreparedStatement saveStmt;
@ -161,7 +163,7 @@ public class BaseAttributesDao extends AbstractAsyncDao implements AttributesDao
AttributeKvEntry attributeEntry = null;
if (row != null) {
long lastUpdateTs = row.get(LAST_UPDATE_TS_COLUMN, Long.class);
attributeEntry = new BaseAttributeKvEntry(BaseTimeseriesDao.toKvEntry(row, key), lastUpdateTs);
attributeEntry = new BaseAttributeKvEntry(CassandraBaseTimeseriesDao.toKvEntry(row, key), lastUpdateTs);
}
return attributeEntry;
}

10
dao/src/main/java/org/thingsboard/server/dao/cassandra/CassandraCluster.java

@ -16,13 +16,8 @@
package org.thingsboard.server.dao.cassandra;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ConsistencyLevel;
import com.datastax.driver.core.HostDistance;
import com.datastax.driver.core.PoolingOptions;
import com.datastax.driver.core.*;
import com.datastax.driver.core.ProtocolOptions.Compression;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.exceptions.NoHostAvailableException;
import com.datastax.driver.mapping.Mapper;
import com.datastax.driver.mapping.MappingManager;
import lombok.Data;
@ -31,16 +26,13 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.thingsboard.server.dao.exception.DatabaseException;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.Closeable;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
@Component
@Slf4j

3
dao/src/main/java/org/thingsboard/server/dao/cassandra/CassandraQueryOptions.java

@ -21,12 +21,9 @@ import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.PostConstruct;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
@Component
@Configuration
@Data

3
dao/src/main/java/org/thingsboard/server/dao/cassandra/CassandraSocketOptions.java

@ -15,13 +15,12 @@
*/
package org.thingsboard.server.dao.cassandra;
import com.datastax.driver.core.SocketOptions;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import com.datastax.driver.core.SocketOptions;
import javax.annotation.PostConstruct;
@Component

20
dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java

@ -32,16 +32,12 @@ import org.thingsboard.server.common.data.plugin.ComponentScope;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.model.ComponentDescriptorEntity;
import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.Validator;
import java.util.List;
import java.util.Optional;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
/**
* @author Andrew Shvayka
*/
@ -55,39 +51,37 @@ public class BaseComponentDescriptorService implements ComponentDescriptorServic
@Override
public ComponentDescriptor saveComponent(ComponentDescriptor component) {
componentValidator.validate(component);
Optional<ComponentDescriptorEntity> result = componentDescriptorDao.save(component);
Optional<ComponentDescriptor> result = componentDescriptorDao.saveIfNotExist(component);
if (result.isPresent()) {
return getData(result.get());
return result.get();
} else {
return getData(componentDescriptorDao.findByClazz(component.getClazz()));
return componentDescriptorDao.findByClazz(component.getClazz());
}
}
@Override
public ComponentDescriptor findById(ComponentDescriptorId componentId) {
Validator.validateId(componentId, "Incorrect component id for search request.");
return getData(componentDescriptorDao.findById(componentId));
return componentDescriptorDao.findById(componentId);
}
@Override
public ComponentDescriptor findByClazz(String clazz) {
Validator.validateString(clazz, "Incorrect clazz for search request.");
return getData(componentDescriptorDao.findByClazz(clazz));
return componentDescriptorDao.findByClazz(clazz);
}
@Override
public TextPageData<ComponentDescriptor> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) {
Validator.validatePageLink(pageLink, "Incorrect PageLink object for search plugin components request.");
List<ComponentDescriptorEntity> pluginEntities = componentDescriptorDao.findByTypeAndPageLink(type, pageLink);
List<ComponentDescriptor> components = convertDataList(pluginEntities);
List<ComponentDescriptor> components = componentDescriptorDao.findByTypeAndPageLink(type, pageLink);
return new TextPageData<>(components, pageLink);
}
@Override
public TextPageData<ComponentDescriptor> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) {
Validator.validatePageLink(pageLink, "Incorrect PageLink object for search plugin components request.");
List<ComponentDescriptorEntity> pluginEntities = componentDescriptorDao.findByScopeAndTypeAndPageLink(scope, type, pageLink);
List<ComponentDescriptor> components = convertDataList(pluginEntities);
List<ComponentDescriptor> components = componentDescriptorDao.findByScopeAndTypeAndPageLink(scope, type, pageLink);
return new TextPageData<>(components, pageLink);
}

45
dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorDao.java → dao/src/main/java/org/thingsboard/server/dao/component/CassandraBaseComponentDescriptorDao.java

@ -27,9 +27,10 @@ import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
import org.thingsboard.server.common.data.plugin.ComponentScope;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.nosql.ComponentDescriptorEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.ComponentDescriptorEntity;
import java.util.Arrays;
import java.util.List;
@ -44,7 +45,7 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
*/
@Component
@Slf4j
public class BaseComponentDescriptorDao extends AbstractSearchTextDao<ComponentDescriptorEntity> implements ComponentDescriptorDao {
public class CassandraBaseComponentDescriptorDao extends CassandraAbstractSearchTextDao<ComponentDescriptorEntity, ComponentDescriptor> implements ComponentDescriptorDao {
@Override
protected Class<ComponentDescriptorEntity> getColumnFamilyClass() {
@ -57,10 +58,10 @@ public class BaseComponentDescriptorDao extends AbstractSearchTextDao<ComponentD
}
@Override
public Optional<ComponentDescriptorEntity> save(ComponentDescriptor component) {
public Optional<ComponentDescriptor> saveIfNotExist(ComponentDescriptor component) {
ComponentDescriptorEntity entity = new ComponentDescriptorEntity(component);
log.debug("Save component entity [{}]", entity);
Optional<ComponentDescriptorEntity> result = saveIfNotExist(entity);
Optional<ComponentDescriptor> result = saveIfNotExist(entity);
if (log.isTraceEnabled()) {
log.trace("Saved result: [{}] for component entity [{}]", result.isPresent(), result.orElse(null));
} else {
@ -70,19 +71,19 @@ public class BaseComponentDescriptorDao extends AbstractSearchTextDao<ComponentD
}
@Override
public ComponentDescriptorEntity findById(ComponentDescriptorId componentId) {
public ComponentDescriptor findById(ComponentDescriptorId componentId) {
log.debug("Search component entity by id [{}]", componentId);
ComponentDescriptorEntity entity = super.findById(componentId.getId());
ComponentDescriptor componentDescriptor = super.findById(componentId.getId());
if (log.isTraceEnabled()) {
log.trace("Search result: [{}] for component entity [{}]", entity != null, entity);
log.trace("Search result: [{}] for component entity [{}]", componentDescriptor != null, componentDescriptor);
} else {
log.debug("Search result: [{}]", entity != null);
log.debug("Search result: [{}]", componentDescriptor != null);
}
return entity;
return componentDescriptor;
}
@Override
public ComponentDescriptorEntity findByClazz(String clazz) {
public ComponentDescriptor findByClazz(String clazz) {
log.debug("Search component entity by clazz [{}]", clazz);
Select.Where query = select().from(getColumnFamilyName()).where(eq(ModelConstants.COMPONENT_DESCRIPTOR_CLASS_PROPERTY, clazz));
log.trace("Execute query [{}]", query);
@ -92,11 +93,11 @@ public class BaseComponentDescriptorDao extends AbstractSearchTextDao<ComponentD
} else {
log.debug("Search result: [{}]", entity != null);
}
return entity;
return DaoUtil.getData(entity);
}
@Override
public List<ComponentDescriptorEntity> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) {
public List<ComponentDescriptor> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) {
log.debug("Try to find component by type [{}] and pageLink [{}]", type, pageLink);
List<ComponentDescriptorEntity> entities = findPageWithTextSearch(ModelConstants.COMPONENT_DESCRIPTOR_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(ModelConstants.COMPONENT_DESCRIPTOR_TYPE_PROPERTY, type.name())), pageLink);
@ -105,11 +106,11 @@ public class BaseComponentDescriptorDao extends AbstractSearchTextDao<ComponentD
} else {
log.debug("Search result: [{}]", entities.size());
}
return entities;
return DaoUtil.convertDataList(entities);
}
@Override
public List<ComponentDescriptorEntity> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) {
public List<ComponentDescriptor> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) {
log.debug("Try to find component by scope [{}] and type [{}] and pageLink [{}]", scope, type, pageLink);
List<ComponentDescriptorEntity> entities = findPageWithTextSearch(ModelConstants.COMPONENT_DESCRIPTOR_BY_SCOPE_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(ModelConstants.COMPONENT_DESCRIPTOR_TYPE_PROPERTY, type.name()),
@ -119,20 +120,20 @@ public class BaseComponentDescriptorDao extends AbstractSearchTextDao<ComponentD
} else {
log.debug("Search result: [{}]", entities.size());
}
return entities;
return DaoUtil.convertDataList(entities);
}
public ResultSet removeById(UUID key) {
public boolean removeById(UUID key) {
Statement delete = QueryBuilder.delete().all().from(ModelConstants.COMPONENT_DESCRIPTOR_BY_ID).where(eq(ModelConstants.ID_PROPERTY, key));
log.debug("Remove request: {}", delete.toString());
return getSession().execute(delete);
return getSession().execute(delete).wasApplied();
}
@Override
public void deleteById(ComponentDescriptorId id) {
log.debug("Delete plugin meta-data entity by id [{}]", id);
ResultSet resultSet = removeById(id.getId());
log.debug("Delete result: [{}]", resultSet.wasApplied());
boolean result = removeById(id.getId());
log.debug("Delete result: [{}]", result);
}
@Override
@ -144,7 +145,7 @@ public class BaseComponentDescriptorDao extends AbstractSearchTextDao<ComponentD
log.debug("Delete result: [{}]", resultSet.wasApplied());
}
private Optional<ComponentDescriptorEntity> saveIfNotExist(ComponentDescriptorEntity entity) {
private Optional<ComponentDescriptor> saveIfNotExist(ComponentDescriptorEntity entity) {
if (entity.getId() == null) {
entity.setId(UUIDs.timeBased());
}
@ -161,7 +162,7 @@ public class BaseComponentDescriptorDao extends AbstractSearchTextDao<ComponentD
.ifNotExists()
);
if (rs.wasApplied()) {
return Optional.of(entity);
return Optional.of(DaoUtil.getData(entity));
} else {
return Optional.empty();
}

13
dao/src/main/java/org/thingsboard/server/dao/component/ComponentDescriptorDao.java

@ -21,7 +21,6 @@ import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
import org.thingsboard.server.common.data.plugin.ComponentScope;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.ComponentDescriptorEntity;
import java.util.List;
import java.util.Optional;
@ -29,17 +28,17 @@ import java.util.Optional;
/**
* @author Andrew Shvayka
*/
public interface ComponentDescriptorDao extends Dao<ComponentDescriptorEntity> {
public interface ComponentDescriptorDao extends Dao<ComponentDescriptor> {
Optional<ComponentDescriptorEntity> save(ComponentDescriptor component);
Optional<ComponentDescriptor> saveIfNotExist(ComponentDescriptor component);
ComponentDescriptorEntity findById(ComponentDescriptorId componentId);
ComponentDescriptor findById(ComponentDescriptorId componentId);
ComponentDescriptorEntity findByClazz(String clazz);
ComponentDescriptor findByClazz(String clazz);
List<ComponentDescriptorEntity> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink);
List<ComponentDescriptor> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink);
List<ComponentDescriptorEntity> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink);
List<ComponentDescriptor> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink);
void deleteById(ComponentDescriptorId componentId);

31
dao/src/main/java/org/thingsboard/server/dao/customer/CustomerDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/customer/CassandraCustomerDao.java

@ -15,24 +15,23 @@
*/
package org.thingsboard.server.dao.customer;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.model.CustomerEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.nosql.CustomerEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
@Component
@Slf4j
public class CustomerDaoImpl extends AbstractSearchTextDao<CustomerEntity> implements CustomerDao {
public class CassandraCustomerDao extends CassandraAbstractSearchTextDao<CustomerEntity, Customer> implements CustomerDao {
@Override
protected Class<CustomerEntity> getColumnFamilyClass() {
@ -43,21 +42,15 @@ public class CustomerDaoImpl extends AbstractSearchTextDao<CustomerEntity> imple
protected String getColumnFamilyName() {
return ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME;
}
@Override
public CustomerEntity save(Customer customer) {
log.debug("Save customer [{}] ", customer);
return save(new CustomerEntity(customer));
}
@Override
public List<CustomerEntity> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) {
public List<Customer> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find customers by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<CustomerEntity> customerEntities = findPageWithTextSearch(ModelConstants.CUSTOMER_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(ModelConstants.CUSTOMER_TENANT_ID_PROPERTY, tenantId)),
pageLink);
log.trace("Found customers [{}] by tenantId [{}] and pageLink [{}]", customerEntities, tenantId, pageLink);
return customerEntities;
return DaoUtil.convertDataList(customerEntities);
}
}

13
dao/src/main/java/org/thingsboard/server/dao/customer/CustomerDao.java

@ -15,18 +15,17 @@
*/
package org.thingsboard.server.dao.customer;
import java.util.List;
import java.util.UUID;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.CustomerEntity;
import java.util.List;
import java.util.UUID;
/**
* The Interface CustomerDao.
*/
public interface CustomerDao extends Dao<CustomerEntity> {
public interface CustomerDao extends Dao<Customer> {
/**
* Save or update customer object
@ -34,7 +33,7 @@ public interface CustomerDao extends Dao<CustomerEntity> {
* @param customer the customer object
* @return saved customer object
*/
CustomerEntity save(Customer customer);
Customer save(Customer customer);
/**
* Find customers by tenant id and page link.
@ -43,6 +42,6 @@ public interface CustomerDao extends Dao<CustomerEntity> {
* @param pageLink the page link
* @return the list of customer objects
*/
List<CustomerEntity> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink);
List<Customer> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink);
}

10
dao/src/main/java/org/thingsboard/server/dao/customer/CustomerService.java

@ -23,14 +23,14 @@ import org.thingsboard.server.common.data.page.TextPageLink;
public interface CustomerService {
public Customer findCustomerById(CustomerId customerId);
Customer findCustomerById(CustomerId customerId);
public Customer saveCustomer(Customer customer);
Customer saveCustomer(Customer customer);
public void deleteCustomer(CustomerId customerId);
void deleteCustomer(CustomerId customerId);
public TextPageData<Customer> findCustomersByTenantId(TenantId tenantId, TextPageLink pageLink);
TextPageData<Customer> findCustomersByTenantId(TenantId tenantId, TextPageLink pageLink);
public void deleteCustomersByTenantId(TenantId tenantId);
void deleteCustomersByTenantId(TenantId tenantId);
}

39
dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java

@ -15,14 +15,12 @@
*/
package org.thingsboard.server.dao.customer;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageData;
@ -31,17 +29,13 @@ import org.thingsboard.server.dao.dashboard.DashboardService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.model.CustomerEntity;
import org.thingsboard.server.dao.model.TenantEntity;
import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover;
import org.thingsboard.server.dao.service.Validator;
import org.thingsboard.server.dao.tenant.TenantDao;
import org.thingsboard.server.dao.user.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.dao.service.Validator;
import java.util.List;
@Service
@Slf4j
public class CustomerServiceImpl implements CustomerService {
@ -65,16 +59,14 @@ public class CustomerServiceImpl implements CustomerService {
public Customer findCustomerById(CustomerId customerId) {
log.trace("Executing findCustomerById [{}]", customerId);
Validator.validateId(customerId, "Incorrect customerId " + customerId);
CustomerEntity customerEntity = customerDao.findById(customerId.getId());
return getData(customerEntity);
return customerDao.findById(customerId.getId());
}
@Override
public Customer saveCustomer(Customer customer) {
log.trace("Executing saveCustomer [{}]", customer);
customerValidator.validate(customer);
CustomerEntity customerEntity = customerDao.save(customer);
return getData(customerEntity);
return customerDao.save(customer);
}
@Override
@ -96,8 +88,7 @@ public class CustomerServiceImpl implements CustomerService {
log.trace("Executing findCustomersByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<CustomerEntity> customerEntities = customerDao.findCustomersByTenantId(tenantId.getId(), pageLink);
List<Customer> customers = convertDataList(customerEntities);
List<Customer> customers = customerDao.findCustomersByTenantId(tenantId.getId(), pageLink);
return new TextPageData<Customer>(customers, pageLink);
}
@ -121,7 +112,7 @@ public class CustomerServiceImpl implements CustomerService {
if (customer.getTenantId() == null) {
throw new DataValidationException("Customer should be assigned to tenant!");
} else {
TenantEntity tenant = tenantDao.findById(customer.getTenantId().getId());
Tenant tenant = tenantDao.findById(customer.getTenantId().getId());
if (tenant == null) {
throw new DataValidationException("Customer is referencing to non-existent tenant!");
}
@ -129,17 +120,17 @@ public class CustomerServiceImpl implements CustomerService {
}
};
private PaginatedRemover<TenantId, CustomerEntity> customersByTenantRemover =
new PaginatedRemover<TenantId, CustomerEntity>() {
private PaginatedRemover<TenantId, Customer> customersByTenantRemover =
new PaginatedRemover<TenantId, Customer>() {
@Override
protected List<CustomerEntity> findEntities(TenantId id, TextPageLink pageLink) {
protected List<Customer> findEntities(TenantId id, TextPageLink pageLink) {
return customerDao.findCustomersByTenantId(id.getId(), pageLink);
}
@Override
protected void removeEntity(CustomerEntity entity) {
deleteCustomer(new CustomerId(entity.getId()));
protected void removeEntity(Customer entity) {
deleteCustomer(new CustomerId(entity.getUuidId()));
}
};
}

37
dao/src/main/java/org/thingsboard/server/dao/dashboard/CassandraDashboardDao.java

@ -0,0 +1,37 @@
/**
* 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.dashboard;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.model.nosql.DashboardEntity;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME;
@Component
public class CassandraDashboardDao extends CassandraAbstractSearchTextDao<DashboardEntity, Dashboard> implements DashboardDao {
@Override
protected Class<DashboardEntity> getColumnFamilyClass() {
return DashboardEntity.class;
}
@Override
protected String getColumnFamilyName() {
return DASHBOARD_COLUMN_FAMILY_NAME;
}
}

16
dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardInfoDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/dashboard/CassandraDashboardInfoDao.java

@ -17,9 +17,11 @@ package org.thingsboard.server.dao.dashboard;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.model.DashboardInfoEntity;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.nosql.DashboardInfoEntity;
import java.util.Arrays;
import java.util.Collections;
@ -31,7 +33,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component
@Slf4j
public class DashboardInfoDaoImpl extends AbstractSearchTextDao<DashboardInfoEntity> implements DashboardInfoDao {
public class CassandraDashboardInfoDao extends CassandraAbstractSearchTextDao<DashboardInfoEntity, DashboardInfo> implements DashboardInfoDao {
@Override
protected Class<DashboardInfoEntity> getColumnFamilyClass() {
@ -44,18 +46,18 @@ public class DashboardInfoDaoImpl extends AbstractSearchTextDao<DashboardInfoEnt
}
@Override
public List<DashboardInfoEntity> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) {
public List<DashboardInfo> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find dashboards by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<DashboardInfoEntity> dashboardEntities = findPageWithTextSearch(DASHBOARD_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Collections.singletonList(eq(DASHBOARD_TENANT_ID_PROPERTY, tenantId)),
pageLink);
log.trace("Found dashboards [{}] by tenantId [{}] and pageLink [{}]", dashboardEntities, tenantId, pageLink);
return dashboardEntities;
return DaoUtil.convertDataList(dashboardEntities);
}
@Override
public List<DashboardInfoEntity> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
public List<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
log.debug("Try to find dashboards by tenantId [{}], customerId[{}] and pageLink [{}]", tenantId, customerId, pageLink);
List<DashboardInfoEntity> dashboardEntities = findPageWithTextSearch(DASHBOARD_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(DASHBOARD_CUSTOMER_ID_PROPERTY, customerId),
@ -63,7 +65,7 @@ public class DashboardInfoDaoImpl extends AbstractSearchTextDao<DashboardInfoEnt
pageLink);
log.trace("Found dashboards [{}] by tenantId [{}], customerId [{}] and pageLink [{}]", dashboardEntities, tenantId, customerId, pageLink);
return dashboardEntities;
return DaoUtil.convertDataList(dashboardEntities);
}
}

12
dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDao.java

@ -15,21 +15,13 @@
*/
package org.thingsboard.server.dao.dashboard;
import java.util.List;
import java.util.UUID;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.DashboardEntity;
import org.thingsboard.server.dao.model.DashboardInfoEntity;
/**
* The Interface DashboardDao.
*
* @param <T> the generic type
*/
public interface DashboardDao extends Dao<DashboardEntity> {
public interface DashboardDao extends Dao<Dashboard> {
/**
* Save or update dashboard object
@ -37,6 +29,6 @@ public interface DashboardDao extends Dao<DashboardEntity> {
* @param dashboard the dashboard object
* @return saved dashboard object
*/
DashboardEntity save(Dashboard dashboard);
Dashboard save(Dashboard dashboard);
}

60
dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDaoImpl.java

@ -1,60 +0,0 @@
/**
* 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.dashboard;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_CUSTOMER_ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_TENANT_ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.model.DashboardEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thingsboard.server.dao.model.DashboardInfoEntity;
@Component
@Slf4j
public class DashboardDaoImpl extends AbstractSearchTextDao<DashboardEntity> implements DashboardDao {
@Override
protected Class<DashboardEntity> getColumnFamilyClass() {
return DashboardEntity.class;
}
@Override
protected String getColumnFamilyName() {
return DASHBOARD_COLUMN_FAMILY_NAME;
}
@Override
public DashboardEntity save(Dashboard dashboard) {
log.debug("Save dashboard [{}] ", dashboard);
return save(new DashboardEntity(dashboard));
}
}

18
dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardInfoDao.java

@ -15,21 +15,17 @@
*/
package org.thingsboard.server.dao.dashboard;
import java.util.List;
import java.util.UUID;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.DashboardEntity;
import org.thingsboard.server.dao.model.DashboardInfoEntity;
import java.util.List;
import java.util.UUID;
/**
* The Interface DashboardInfoDao.
*
* @param <T> the generic type
*/
public interface DashboardInfoDao extends Dao<DashboardInfoEntity> {
public interface DashboardInfoDao extends Dao<DashboardInfo> {
/**
* Find dashboards by tenantId and page link.
@ -38,7 +34,7 @@ public interface DashboardInfoDao extends Dao<DashboardInfoEntity> {
* @param pageLink the page link
* @return the list of dashboard objects
*/
List<DashboardInfoEntity> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink);
List<DashboardInfo> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink);
/**
* Find dashboards by tenantId, customerId and page link.
@ -48,6 +44,6 @@ public interface DashboardInfoDao extends Dao<DashboardInfoEntity> {
* @param pageLink the page link
* @return the list of dashboard objects
*/
List<DashboardInfoEntity> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink);
List<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink);
}

28
dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java

@ -25,22 +25,22 @@ import org.thingsboard.server.common.data.page.TextPageLink;
public interface DashboardService {
public Dashboard findDashboardById(DashboardId dashboardId);
public Dashboard saveDashboard(Dashboard dashboard);
public Dashboard assignDashboardToCustomer(DashboardId dashboardId, CustomerId customerId);
Dashboard findDashboardById(DashboardId dashboardId);
public Dashboard unassignDashboardFromCustomer(DashboardId dashboardId);
Dashboard saveDashboard(Dashboard dashboard);
public void deleteDashboard(DashboardId dashboardId);
public TextPageData<DashboardInfo> findDashboardsByTenantId(TenantId tenantId, TextPageLink pageLink);
Dashboard assignDashboardToCustomer(DashboardId dashboardId, CustomerId customerId);
public void deleteDashboardsByTenantId(TenantId tenantId);
public TextPageData<DashboardInfo> findDashboardsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, TextPageLink pageLink);
Dashboard unassignDashboardFromCustomer(DashboardId dashboardId);
void deleteDashboard(DashboardId dashboardId);
TextPageData<DashboardInfo> findDashboardsByTenantId(TenantId tenantId, TextPageLink pageLink);
void deleteDashboardsByTenantId(TenantId tenantId);
TextPageData<DashboardInfo> findDashboardsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, TextPageLink pageLink);
void unassignCustomerDashboards(TenantId tenantId, CustomerId customerId);
public void unassignCustomerDashboards(TenantId tenantId, CustomerId customerId);
}

59
dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java

@ -15,15 +15,14 @@
*/
package org.thingsboard.server.dao.dashboard;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.TenantId;
@ -31,15 +30,13 @@ import org.thingsboard.server.common.data.page.TextPageData;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.customer.CustomerDao;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.*;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover;
import org.thingsboard.server.dao.tenant.TenantDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.dao.service.Validator;
import org.thingsboard.server.dao.tenant.TenantDao;
import java.util.List;
@Service
@Slf4j
@ -61,16 +58,14 @@ public class DashboardServiceImpl implements DashboardService {
public Dashboard findDashboardById(DashboardId dashboardId) {
log.trace("Executing findDashboardById [{}]", dashboardId);
Validator.validateId(dashboardId, "Incorrect dashboardId " + dashboardId);
DashboardEntity dashboardEntity = dashboardDao.findById(dashboardId.getId());
return getData(dashboardEntity);
return dashboardDao.findById(dashboardId.getId());
}
@Override
public Dashboard saveDashboard(Dashboard dashboard) {
log.trace("Executing saveDashboard [{}]", dashboard);
dashboardValidator.validate(dashboard);
DashboardEntity dashboardEntity = dashboardDao.save(dashboard);
return getData(dashboardEntity);
return dashboardDao.save(dashboard);
}
@Override
@ -99,9 +94,8 @@ public class DashboardServiceImpl implements DashboardService {
log.trace("Executing findDashboardsByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DashboardInfoEntity> dashboardEntities = dashboardInfoDao.findDashboardsByTenantId(tenantId.getId(), pageLink);
List<DashboardInfo> dashboards = convertDataList(dashboardEntities);
return new TextPageData<DashboardInfo>(dashboards, pageLink);
List<DashboardInfo> dashboards = dashboardInfoDao.findDashboardsByTenantId(tenantId.getId(), pageLink);
return new TextPageData<>(dashboards, pageLink);
}
@Override
@ -117,9 +111,8 @@ public class DashboardServiceImpl implements DashboardService {
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateId(customerId, "Incorrect customerId " + customerId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DashboardInfoEntity> dashboardEntities = dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink);
List<DashboardInfo> dashboards = convertDataList(dashboardEntities);
return new TextPageData<DashboardInfo>(dashboards, pageLink);
List<DashboardInfo> dashboards = dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink);
return new TextPageData<>(dashboards, pageLink);
}
@Override
@ -140,7 +133,7 @@ public class DashboardServiceImpl implements DashboardService {
if (dashboard.getTenantId() == null) {
throw new DataValidationException("Dashboard should be assigned to tenant!");
} else {
TenantEntity tenant = tenantDao.findById(dashboard.getTenantId().getId());
Tenant tenant = tenantDao.findById(dashboard.getTenantId().getId());
if (tenant == null) {
throw new DataValidationException("Dashboard is referencing to non-existent tenant!");
}
@ -148,32 +141,32 @@ public class DashboardServiceImpl implements DashboardService {
if (dashboard.getCustomerId() == null) {
dashboard.setCustomerId(new CustomerId(ModelConstants.NULL_UUID));
} else if (!dashboard.getCustomerId().getId().equals(ModelConstants.NULL_UUID)) {
CustomerEntity customer = customerDao.findById(dashboard.getCustomerId().getId());
Customer customer = customerDao.findById(dashboard.getCustomerId().getId());
if (customer == null) {
throw new DataValidationException("Can't assign dashboard to non-existent customer!");
}
if (!customer.getTenantId().equals(dashboard.getTenantId().getId())) {
if (!customer.getTenantId().getId().equals(dashboard.getTenantId().getId())) {
throw new DataValidationException("Can't assign dashboard to customer from different tenant!");
}
}
}
};
private PaginatedRemover<TenantId, DashboardInfoEntity> tenantDashboardsRemover =
new PaginatedRemover<TenantId, DashboardInfoEntity>() {
private PaginatedRemover<TenantId, DashboardInfo> tenantDashboardsRemover =
new PaginatedRemover<TenantId, DashboardInfo>() {
@Override
protected List<DashboardInfoEntity> findEntities(TenantId id, TextPageLink pageLink) {
protected List<DashboardInfo> findEntities(TenantId id, TextPageLink pageLink) {
return dashboardInfoDao.findDashboardsByTenantId(id.getId(), pageLink);
}
@Override
protected void removeEntity(DashboardInfoEntity entity) {
deleteDashboard(new DashboardId(entity.getId()));
protected void removeEntity(DashboardInfo entity) {
deleteDashboard(new DashboardId(entity.getUuidId()));
}
};
class CustomerDashboardsUnassigner extends PaginatedRemover<CustomerId, DashboardInfoEntity> {
private class CustomerDashboardsUnassigner extends PaginatedRemover<CustomerId, DashboardInfo> {
private TenantId tenantId;
@ -182,13 +175,13 @@ public class DashboardServiceImpl implements DashboardService {
}
@Override
protected List<DashboardInfoEntity> findEntities(CustomerId id, TextPageLink pageLink) {
protected List<DashboardInfo> findEntities(CustomerId id, TextPageLink pageLink) {
return dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId.getId(), id.getId(), pageLink);
}
@Override
protected void removeEntity(DashboardInfoEntity entity) {
unassignDashboardFromCustomer(new DashboardId(entity.getId()));
protected void removeEntity(DashboardInfo entity) {
unassignDashboardFromCustomer(new DashboardId(entity.getUuidId()));
}
}

38
dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceCredentialsDao.java

@ -15,26 +15,23 @@
*/
package org.thingsboard.server.dao.device;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import java.util.UUID;
import com.datastax.driver.core.querybuilder.Select.Where;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.dao.AbstractModelDao;
import org.thingsboard.server.dao.model.DeviceCredentialsEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import com.datastax.driver.core.querybuilder.Select.Where;
import org.thingsboard.server.dao.CassandraAbstractModelDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.nosql.DeviceCredentialsEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
@Component
@Slf4j
public class DeviceCredentialsDaoImpl extends AbstractModelDao<DeviceCredentialsEntity> implements DeviceCredentialsDao {
public class CassandraDeviceCredentialsDao extends CassandraAbstractModelDao<DeviceCredentialsEntity, DeviceCredentials> implements DeviceCredentialsDao {
@Override
protected Class<DeviceCredentialsEntity> getColumnFamilyClass() {
@ -47,31 +44,24 @@ public class DeviceCredentialsDaoImpl extends AbstractModelDao<DeviceCredentials
}
@Override
public DeviceCredentialsEntity findByDeviceId(UUID deviceId) {
public DeviceCredentials findByDeviceId(UUID deviceId) {
log.debug("Try to find device credentials by deviceId [{}] ", deviceId);
Where query = select().from(ModelConstants.DEVICE_CREDENTIALS_BY_DEVICE_COLUMN_FAMILY_NAME)
.where(eq(ModelConstants.DEVICE_CREDENTIALS_DEVICE_ID_PROPERTY, deviceId));
log.trace("Execute query {}", query);
DeviceCredentialsEntity deviceCredentialsEntity = findOneByStatement(query);
log.trace("Found device credentials [{}] by deviceId [{}]", deviceCredentialsEntity, deviceId);
return deviceCredentialsEntity;
return DaoUtil.getData(deviceCredentialsEntity);
}
@Override
public DeviceCredentialsEntity findByCredentialsId(String credentialsId) {
public DeviceCredentials findByCredentialsId(String credentialsId) {
log.debug("Try to find device credentials by credentialsId [{}] ", credentialsId);
Where query = select().from(ModelConstants.DEVICE_CREDENTIALS_BY_CREDENTIALS_ID_COLUMN_FAMILY_NAME)
.where(eq(ModelConstants.DEVICE_CREDENTIALS_CREDENTIALS_ID_PROPERTY, credentialsId));
log.trace("Execute query {}", query);
DeviceCredentialsEntity deviceCredentialsEntity = findOneByStatement(query);
log.trace("Found device credentials [{}] by credentialsId [{}]", deviceCredentialsEntity, credentialsId);
return deviceCredentialsEntity;
return DaoUtil.getData(deviceCredentialsEntity);
}
@Override
public DeviceCredentialsEntity save(DeviceCredentials deviceCredentials) {
log.debug("Save device credentials [{}] ", deviceCredentials);
return save(new DeviceCredentialsEntity(deviceCredentials));
}
}

43
dao/src/main/java/org/thingsboard/server/dao/device/DeviceDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java

@ -15,27 +15,24 @@
*/
package org.thingsboard.server.dao.device;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.in;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import static org.thingsboard.server.dao.model.ModelConstants.*;
import java.util.*;
import com.datastax.driver.core.querybuilder.Select;
import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.model.DeviceEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.nosql.DeviceEntity;
import java.util.*;
import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component
@Slf4j
public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implements DeviceDao {
public class CassandraDeviceDao extends CassandraAbstractSearchTextDao<DeviceEntity, Device> implements DeviceDao {
@Override
protected Class<DeviceEntity> getColumnFamilyClass() {
@ -48,23 +45,17 @@ public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implement
}
@Override
public DeviceEntity save(Device device) {
log.debug("Save device [{}] ", device);
return save(new DeviceEntity(device));
}
@Override
public List<DeviceEntity> findDevicesByTenantId(UUID tenantId, TextPageLink pageLink) {
public List<Device> findDevicesByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find devices by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<DeviceEntity> deviceEntities = findPageWithTextSearch(DEVICE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Collections.singletonList(eq(DEVICE_TENANT_ID_PROPERTY, tenantId)), pageLink);
log.trace("Found devices [{}] by tenantId [{}] and pageLink [{}]", deviceEntities, tenantId, pageLink);
return deviceEntities;
return DaoUtil.convertDataList(deviceEntities);
}
@Override
public ListenableFuture<List<DeviceEntity>> findDevicesByTenantIdAndIdsAsync(UUID tenantId, List<UUID> deviceIds) {
public ListenableFuture<List<Device>> findDevicesByTenantIdAndIdsAsync(UUID tenantId, List<UUID> deviceIds) {
log.debug("Try to find devices by tenantId [{}] and device Ids [{}]", tenantId, deviceIds);
Select select = select().from(getColumnFamilyName());
Select.Where query = select.where();
@ -74,7 +65,7 @@ public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implement
}
@Override
public List<DeviceEntity> findDevicesByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
public List<Device> findDevicesByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
log.debug("Try to find devices by tenantId [{}], customerId[{}] and pageLink [{}]", tenantId, customerId, pageLink);
List<DeviceEntity> deviceEntities = findPageWithTextSearch(DEVICE_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(DEVICE_CUSTOMER_ID_PROPERTY, customerId),
@ -82,11 +73,11 @@ public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implement
pageLink);
log.trace("Found devices [{}] by tenantId [{}], customerId [{}] and pageLink [{}]", deviceEntities, tenantId, customerId, pageLink);
return deviceEntities;
return DaoUtil.convertDataList(deviceEntities);
}
@Override
public ListenableFuture<List<DeviceEntity>> findDevicesByTenantIdCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> deviceIds) {
public ListenableFuture<List<Device>> findDevicesByTenantIdCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> deviceIds) {
log.debug("Try to find devices by tenantId [{}], customerId [{}] and device Ids [{}]", tenantId, customerId, deviceIds);
Select select = select().from(getColumnFamilyName());
Select.Where query = select.where();
@ -97,12 +88,12 @@ public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implement
}
@Override
public Optional<DeviceEntity> findDevicesByTenantIdAndName(UUID tenantId, String deviceName) {
public Optional<Device> findDevicesByTenantIdAndName(UUID tenantId, String deviceName) {
Select select = select().from(DEVICE_BY_TENANT_AND_NAME_VIEW_NAME);
Select.Where query = select.where();
query.and(eq(DEVICE_TENANT_ID_PROPERTY, tenantId));
query.and(eq(DEVICE_NAME_PROPERTY, deviceName));
return Optional.ofNullable(findOneByStatement(query));
return Optional.ofNullable(DaoUtil.getData(findOneByStatement(query)));
}
}

15
dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsDao.java

@ -15,18 +15,15 @@
*/
package org.thingsboard.server.dao.device;
import java.util.UUID;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.DeviceCredentialsEntity;
import java.util.UUID;
/**
* The Interface DeviceCredentialsDao.
*
* @param <T> the generic type
*/
public interface DeviceCredentialsDao extends Dao<DeviceCredentialsEntity> {
public interface DeviceCredentialsDao extends Dao<DeviceCredentials> {
/**
* Save or update device credentials object
@ -34,7 +31,7 @@ public interface DeviceCredentialsDao extends Dao<DeviceCredentialsEntity> {
* @param deviceCredentials the device credentials object
* @return saved device credentials object
*/
DeviceCredentialsEntity save(DeviceCredentials deviceCredentials);
DeviceCredentials save(DeviceCredentials deviceCredentials);
/**
* Find device credentials by device id.
@ -42,7 +39,7 @@ public interface DeviceCredentialsDao extends Dao<DeviceCredentialsEntity> {
* @param deviceId the device id
* @return the device credentials object
*/
DeviceCredentialsEntity findByDeviceId(UUID deviceId);
DeviceCredentials findByDeviceId(UUID deviceId);
/**
* Find device credentials by credentials id.
@ -50,6 +47,6 @@ public interface DeviceCredentialsDao extends Dao<DeviceCredentialsEntity> {
* @param credentialsId the credentials id
* @return the device credentials object
*/
DeviceCredentialsEntity findByCredentialsId(String credentialsId);
DeviceCredentials findByCredentialsId(String credentialsId);
}

20
dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java

@ -26,10 +26,8 @@ import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.dao.EncryptionUtil;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.DeviceCredentialsEntity;
import org.thingsboard.server.dao.service.DataValidator;
import static org.thingsboard.server.dao.DaoUtil.getData;
import static org.thingsboard.server.dao.service.Validator.validateId;
import static org.thingsboard.server.dao.service.Validator.validateString;
@ -47,16 +45,14 @@ public class DeviceCredentialsServiceImpl implements DeviceCredentialsService {
public DeviceCredentials findDeviceCredentialsByDeviceId(DeviceId deviceId) {
log.trace("Executing findDeviceCredentialsByDeviceId [{}]", deviceId);
validateId(deviceId, "Incorrect deviceId " + deviceId);
DeviceCredentialsEntity deviceCredentialsEntity = deviceCredentialsDao.findByDeviceId(deviceId.getId());
return getData(deviceCredentialsEntity);
return deviceCredentialsDao.findByDeviceId(deviceId.getId());
}
@Override
public DeviceCredentials findDeviceCredentialsByCredentialsId(String credentialsId) {
log.trace("Executing findDeviceCredentialsByCredentialsId [{}]", credentialsId);
validateString(credentialsId, "Incorrect credentialsId " + credentialsId);
DeviceCredentialsEntity deviceCredentialsEntity = deviceCredentialsDao.findByCredentialsId(credentialsId);
return getData(deviceCredentialsEntity);
return deviceCredentialsDao.findByCredentialsId(credentialsId);
}
@Override
@ -75,7 +71,7 @@ public class DeviceCredentialsServiceImpl implements DeviceCredentialsService {
}
log.trace("Executing updateDeviceCredentials [{}]", deviceCredentials);
credentialsValidator.validate(deviceCredentials);
return getData(deviceCredentialsDao.save(deviceCredentials));
return deviceCredentialsDao.save(deviceCredentials);
}
private void formatCertData(DeviceCredentials deviceCredentials) {
@ -96,7 +92,7 @@ public class DeviceCredentialsServiceImpl implements DeviceCredentialsService {
@Override
protected void validateCreate(DeviceCredentials deviceCredentials) {
DeviceCredentialsEntity existingCredentialsEntity = deviceCredentialsDao.findByCredentialsId(deviceCredentials.getCredentialsId());
DeviceCredentials existingCredentialsEntity = deviceCredentialsDao.findByCredentialsId(deviceCredentials.getCredentialsId());
if (existingCredentialsEntity != null) {
throw new DataValidationException("Create of existent device credentials!");
}
@ -104,12 +100,12 @@ public class DeviceCredentialsServiceImpl implements DeviceCredentialsService {
@Override
protected void validateUpdate(DeviceCredentials deviceCredentials) {
DeviceCredentialsEntity existingCredentialsEntity = deviceCredentialsDao.findById(deviceCredentials.getUuidId());
if (existingCredentialsEntity == null) {
DeviceCredentials existingCredentials = deviceCredentialsDao.findById(deviceCredentials.getUuidId());
if (existingCredentials == null) {
throw new DataValidationException("Unable to update non-existent device credentials!");
}
DeviceCredentialsEntity sameCredentialsIdEntity = deviceCredentialsDao.findByCredentialsId(deviceCredentials.getCredentialsId());
if (sameCredentialsIdEntity != null && !sameCredentialsIdEntity.getId().equals(deviceCredentials.getUuidId())) {
DeviceCredentials sameCredentialsId = deviceCredentialsDao.findByCredentialsId(deviceCredentials.getCredentialsId());
if (sameCredentialsId != null && !sameCredentialsId.getUuidId().equals(deviceCredentials.getUuidId())) {
throw new DataValidationException("Specified credentials are already registered!");
}
}

23
dao/src/main/java/org/thingsboard/server/dao/device/DeviceDao.java

@ -15,21 +15,20 @@
*/
package org.thingsboard.server.dao.device;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import com.google.common.util.concurrent.ListenableFuture;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.DeviceEntity;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
/**
* The Interface DeviceDao.
*
*/
public interface DeviceDao extends Dao<DeviceEntity> {
public interface DeviceDao extends Dao<Device> {
/**
* Save or update device object
@ -37,7 +36,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param device the device object
* @return saved device object
*/
DeviceEntity save(Device device);
Device save(Device device);
/**
* Find devices by tenantId and page link.
@ -46,7 +45,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param pageLink the page link
* @return the list of device objects
*/
List<DeviceEntity> findDevicesByTenantId(UUID tenantId, TextPageLink pageLink);
List<Device> findDevicesByTenantId(UUID tenantId, TextPageLink pageLink);
/**
* Find devices by tenantId and devices Ids.
@ -55,7 +54,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param deviceIds the device Ids
* @return the list of device objects
*/
ListenableFuture<List<DeviceEntity>> findDevicesByTenantIdAndIdsAsync(UUID tenantId, List<UUID> deviceIds);
ListenableFuture<List<Device>> findDevicesByTenantIdAndIdsAsync(UUID tenantId, List<UUID> deviceIds);
/**
* Find devices by tenantId, customerId and page link.
@ -65,7 +64,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param pageLink the page link
* @return the list of device objects
*/
List<DeviceEntity> findDevicesByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink);
List<Device> findDevicesByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink);
/**
* Find devices by tenantId, customerId and devices Ids.
@ -75,7 +74,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param deviceIds the device Ids
* @return the list of device objects
*/
ListenableFuture<List<DeviceEntity>> findDevicesByTenantIdCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> deviceIds);
ListenableFuture<List<Device>> findDevicesByTenantIdCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> deviceIds);
/**
* Find devices by tenantId and device name.
@ -84,5 +83,5 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param name the device name
* @return the optional device object
*/
Optional<DeviceEntity> findDevicesByTenantIdAndName(UUID tenantId, String name);
Optional<Device> findDevicesByTenantIdAndName(UUID tenantId, String name);
}

69
dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java

@ -15,15 +15,15 @@
*/
package org.thingsboard.server.dao.device;
import com.google.common.base.Function;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
@ -33,9 +33,6 @@ import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.dao.customer.CustomerDao;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.CustomerEntity;
import org.thingsboard.server.dao.model.DeviceEntity;
import org.thingsboard.server.dao.model.TenantEntity;
import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover;
import org.thingsboard.server.dao.tenant.TenantDao;
@ -43,8 +40,6 @@ import org.thingsboard.server.dao.tenant.TenantDao;
import java.util.List;
import java.util.Optional;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
import static org.thingsboard.server.dao.DaoUtil.toUUIDs;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
import static org.thingsboard.server.dao.service.Validator.validateId;
@ -71,25 +66,23 @@ public class DeviceServiceImpl implements DeviceService {
public Device findDeviceById(DeviceId deviceId) {
log.trace("Executing findDeviceById [{}]", deviceId);
validateId(deviceId, "Incorrect deviceId " + deviceId);
DeviceEntity deviceEntity = deviceDao.findById(deviceId.getId());
return getData(deviceEntity);
return deviceDao.findById(deviceId.getId());
}
@Override
public ListenableFuture<Device> findDeviceByIdAsync(DeviceId deviceId) {
log.trace("Executing findDeviceById [{}]", deviceId);
validateId(deviceId, "Incorrect deviceId " + deviceId);
ListenableFuture<DeviceEntity> deviceEntity = deviceDao.findByIdAsync(deviceId.getId());
return Futures.transform(deviceEntity, (Function<? super DeviceEntity, ? extends Device>) input -> getData(input));
return deviceDao.findByIdAsync(deviceId.getId());
}
@Override
public Optional<Device> findDeviceByTenantIdAndName(TenantId tenantId, String name) {
log.trace("Executing findDeviceByTenantIdAndName [{}][{}]", tenantId, name);
validateId(tenantId, "Incorrect tenantId " + tenantId);
Optional<DeviceEntity> deviceEntityOpt = deviceDao.findDevicesByTenantIdAndName(tenantId.getId(), name);
if (deviceEntityOpt.isPresent()) {
return Optional.of(getData(deviceEntityOpt.get()));
Optional<Device> deviceOpt = deviceDao.findDevicesByTenantIdAndName(tenantId.getId(), name);
if (deviceOpt.isPresent()) {
return Optional.of(deviceOpt.get());
} else {
return Optional.empty();
}
@ -99,15 +92,15 @@ public class DeviceServiceImpl implements DeviceService {
public Device saveDevice(Device device) {
log.trace("Executing saveDevice [{}]", device);
deviceValidator.validate(device);
DeviceEntity deviceEntity = deviceDao.save(device);
Device savedDevice = deviceDao.save(device);
if (device.getId() == null) {
DeviceCredentials deviceCredentials = new DeviceCredentials();
deviceCredentials.setDeviceId(new DeviceId(deviceEntity.getId()));
deviceCredentials.setDeviceId(new DeviceId(savedDevice.getUuidId()));
deviceCredentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN);
deviceCredentials.setCredentialsId(RandomStringUtils.randomAlphanumeric(20));
deviceCredentialsService.createDeviceCredentials(deviceCredentials);
}
return getData(deviceEntity);
return savedDevice;
}
@Override
@ -140,9 +133,8 @@ public class DeviceServiceImpl implements DeviceService {
log.trace("Executing findDevicesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
validateId(tenantId, "Incorrect tenantId " + tenantId);
validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DeviceEntity> deviceEntities = deviceDao.findDevicesByTenantId(tenantId.getId(), pageLink);
List<Device> devices = convertDataList(deviceEntities);
return new TextPageData<Device>(devices, pageLink);
List<Device> devices = deviceDao.findDevicesByTenantId(tenantId.getId(), pageLink);
return new TextPageData<>(devices, pageLink);
}
@Override
@ -150,8 +142,7 @@ public class DeviceServiceImpl implements DeviceService {
log.trace("Executing findDevicesByTenantIdAndIdsAsync, tenantId [{}], deviceIds [{}]", tenantId, deviceIds);
validateId(tenantId, "Incorrect tenantId " + tenantId);
validateIds(deviceIds, "Incorrect deviceIds " + deviceIds);
ListenableFuture<List<DeviceEntity>> deviceEntities = deviceDao.findDevicesByTenantIdAndIdsAsync(tenantId.getId(), toUUIDs(deviceIds));
return Futures.transform(deviceEntities, (Function<List<DeviceEntity>, List<Device>>) input -> convertDataList(input));
return deviceDao.findDevicesByTenantIdAndIdsAsync(tenantId.getId(), toUUIDs(deviceIds));
}
@ -168,9 +159,8 @@ public class DeviceServiceImpl implements DeviceService {
validateId(tenantId, "Incorrect tenantId " + tenantId);
validateId(customerId, "Incorrect customerId " + customerId);
validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DeviceEntity> deviceEntities = deviceDao.findDevicesByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink);
List<Device> devices = convertDataList(deviceEntities);
return new TextPageData<Device>(devices, pageLink);
List<Device> devices = deviceDao.findDevicesByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink);
return new TextPageData<>(devices, pageLink);
}
@Override
@ -179,9 +169,8 @@ public class DeviceServiceImpl implements DeviceService {
validateId(tenantId, "Incorrect tenantId " + tenantId);
validateId(customerId, "Incorrect customerId " + customerId);
validateIds(deviceIds, "Incorrect deviceIds " + deviceIds);
ListenableFuture<List<DeviceEntity>> deviceEntities = deviceDao.findDevicesByTenantIdCustomerIdAndIdsAsync(tenantId.getId(),
return deviceDao.findDevicesByTenantIdCustomerIdAndIdsAsync(tenantId.getId(),
customerId.getId(), toUUIDs(deviceIds));
return Futures.transform(deviceEntities, (Function<List<DeviceEntity>, List<Device>>) input -> convertDataList(input));
}
@Override
@ -208,7 +197,7 @@ public class DeviceServiceImpl implements DeviceService {
protected void validateUpdate(Device device) {
deviceDao.findDevicesByTenantIdAndName(device.getTenantId().getId(), device.getName()).ifPresent(
d -> {
if (!d.getId().equals(device.getUuidId())) {
if (!d.getUuidId().equals(device.getUuidId())) {
throw new DataValidationException("Device with such name already exists!");
}
}
@ -223,7 +212,7 @@ public class DeviceServiceImpl implements DeviceService {
if (device.getTenantId() == null) {
throw new DataValidationException("Device should be assigned to tenant!");
} else {
TenantEntity tenant = tenantDao.findById(device.getTenantId().getId());
Tenant tenant = tenantDao.findById(device.getTenantId().getId());
if (tenant == null) {
throw new DataValidationException("Device is referencing to non-existent tenant!");
}
@ -231,32 +220,32 @@ public class DeviceServiceImpl implements DeviceService {
if (device.getCustomerId() == null) {
device.setCustomerId(new CustomerId(NULL_UUID));
} else if (!device.getCustomerId().getId().equals(NULL_UUID)) {
CustomerEntity customer = customerDao.findById(device.getCustomerId().getId());
Customer customer = customerDao.findById(device.getCustomerId().getId());
if (customer == null) {
throw new DataValidationException("Can't assign device to non-existent customer!");
}
if (!customer.getTenantId().equals(device.getTenantId().getId())) {
if (!customer.getTenantId().getId().equals(device.getTenantId().getId())) {
throw new DataValidationException("Can't assign device to customer from different tenant!");
}
}
}
};
private PaginatedRemover<TenantId, DeviceEntity> tenantDevicesRemover =
new PaginatedRemover<TenantId, DeviceEntity>() {
private PaginatedRemover<TenantId, Device> tenantDevicesRemover =
new PaginatedRemover<TenantId, Device>() {
@Override
protected List<DeviceEntity> findEntities(TenantId id, TextPageLink pageLink) {
protected List<Device> findEntities(TenantId id, TextPageLink pageLink) {
return deviceDao.findDevicesByTenantId(id.getId(), pageLink);
}
@Override
protected void removeEntity(DeviceEntity entity) {
deleteDevice(new DeviceId(entity.getId()));
protected void removeEntity(Device entity) {
deleteDevice(new DeviceId(entity.getUuidId()));
}
};
class CustomerDevicesUnassigner extends PaginatedRemover<CustomerId, DeviceEntity> {
private class CustomerDevicesUnassigner extends PaginatedRemover<CustomerId, Device> {
private TenantId tenantId;
@ -265,13 +254,13 @@ public class DeviceServiceImpl implements DeviceService {
}
@Override
protected List<DeviceEntity> findEntities(CustomerId id, TextPageLink pageLink) {
protected List<Device> findEntities(CustomerId id, TextPageLink pageLink) {
return deviceDao.findDevicesByTenantIdAndCustomerId(tenantId.getId(), id.getId(), pageLink);
}
@Override
protected void removeEntity(DeviceEntity entity) {
unassignDeviceFromCustomer(new DeviceId(entity.getId()));
protected void removeEntity(Device entity) {
unassignDeviceFromCustomer(new DeviceId(entity.getUuidId()));
}
}

47
dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java

@ -15,51 +15,32 @@
*/
package org.thingsboard.server.dao.event;
import com.datastax.driver.core.utils.UUIDs;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.Event;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EventId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TimePageData;
import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.EventEntity;
import org.thingsboard.server.dao.service.DataValidator;
import java.util.List;
import java.util.Optional;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@Service
@Slf4j
public class BaseEventService implements EventService {
private final TenantId systemTenantId = new TenantId(NULL_UUID);
@Autowired
public EventDao eventDao;
@Override
public Event save(Event event) {
eventValidator.validate(event);
if (event.getTenantId() == null) {
log.trace("Save system event with predefined id {}", systemTenantId);
event.setTenantId(systemTenantId);
}
if (event.getId() == null) {
event.setId(new EventId(UUIDs.timeBased()));
}
if (StringUtils.isEmpty(event.getUid())) {
event.setUid(event.getId().toString());
}
return getData(eventDao.save(event));
return eventDao.save(event);
}
@Override
@ -68,15 +49,8 @@ public class BaseEventService implements EventService {
if (StringUtils.isEmpty(event.getUid())) {
throw new DataValidationException("Event uid should be specified!.");
}
if (event.getTenantId() == null) {
log.trace("Save system event with predefined id {}", systemTenantId);
event.setTenantId(systemTenantId);
}
if (event.getId() == null) {
event.setId(new EventId(UUIDs.timeBased()));
}
Optional<EventEntity> result = eventDao.saveIfNotExists(event);
return result.isPresent() ? Optional.of(getData(result.get())) : Optional.empty();
Optional<Event> result = eventDao.saveIfNotExists(event);
return result.isPresent() ? Optional.of(result.get()) : Optional.empty();
}
@Override
@ -93,23 +67,20 @@ public class BaseEventService implements EventService {
if (StringUtils.isEmpty(eventUid)) {
throw new DataValidationException("Event uid should be specified!.");
}
EventEntity entity = eventDao.findEvent(tenantId.getId(), entityId, eventType, eventUid);
return entity != null ? Optional.of(getData(entity)) : Optional.empty();
Event event = eventDao.findEvent(tenantId.getId(), entityId, eventType, eventUid);
return event != null ? Optional.of(event) : Optional.empty();
}
@Override
public TimePageData<Event> findEvents(TenantId tenantId, EntityId entityId, TimePageLink pageLink) {
List<EventEntity> entities = eventDao.findEvents(tenantId.getId(), entityId, pageLink);
List<Event> events = convertDataList(entities);
return new TimePageData<Event>(events, pageLink);
List<Event> events = eventDao.findEvents(tenantId.getId(), entityId, pageLink);
return new TimePageData<>(events, pageLink);
}
@Override
public TimePageData<Event> findEvents(TenantId tenantId, EntityId entityId, String eventType, TimePageLink pageLink) {
List<EventEntity> entities = eventDao.findEvents(tenantId.getId(), entityId, eventType, pageLink);
List<Event> events = convertDataList(entities);
return new TimePageData<Event>(events, pageLink);
List<Event> events = eventDao.findEvents(tenantId.getId(), entityId, eventType, pageLink);
return new TimePageData<>(events, pageLink);
}
private DataValidator<Event> eventValidator =

53
dao/src/main/java/org/thingsboard/server/dao/event/BaseEventDao.java → dao/src/main/java/org/thingsboard/server/dao/event/CassandraBaseEventDao.java

@ -21,12 +21,16 @@ import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.datastax.driver.core.querybuilder.Select;
import com.datastax.driver.core.utils.UUIDs;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Event;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EventId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.AbstractSearchTimeDao;
import org.thingsboard.server.dao.model.EventEntity;
import org.thingsboard.server.dao.CassandraAbstractSearchTimeDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.nosql.EventEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import java.util.Arrays;
@ -36,13 +40,13 @@ import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import static org.thingsboard.server.dao.model.ModelConstants.EVENT_BY_ID_VIEW_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.EVENT_BY_TYPE_AND_ID_VIEW_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.EVENT_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component
@Slf4j
public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements EventDao {
public class CassandraBaseEventDao extends CassandraAbstractSearchTimeDao<EventEntity, Event> implements EventDao {
private final TenantId systemTenantId = new TenantId(NULL_UUID);
@Override
protected Class<EventEntity> getColumnFamilyClass() {
@ -55,18 +59,35 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
}
@Override
public EventEntity save(Event event) {
public Event save(Event event) {
log.debug("Save event [{}] ", event);
if (event.getTenantId() == null) {
log.trace("Save system event with predefined id {}", systemTenantId);
event.setTenantId(systemTenantId);
}
if (event.getId() == null) {
event.setId(new EventId(UUIDs.timeBased()));
}
if (StringUtils.isEmpty(event.getUid())) {
event.setUid(event.getId().toString());
}
return save(new EventEntity(event), false).orElse(null);
}
@Override
public Optional<EventEntity> saveIfNotExists(Event event) {
public Optional<Event> saveIfNotExists(Event event) {
if (event.getTenantId() == null) {
log.trace("Save system event with predefined id {}", systemTenantId);
event.setTenantId(systemTenantId);
}
if (event.getId() == null) {
event.setId(new EventId(UUIDs.timeBased()));
}
return save(new EventEntity(event), true);
}
@Override
public EventEntity findEvent(UUID tenantId, EntityId entityId, String eventType, String eventUid) {
public Event findEvent(UUID tenantId, EntityId entityId, String eventType, String eventUid) {
log.debug("Search event entity by [{}][{}][{}][{}]", tenantId, entityId, eventType, eventUid);
Select.Where query = select().from(getColumnFamilyName()).where(
eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId))
@ -81,11 +102,11 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
} else {
log.debug("Search result: [{}]", entity != null);
}
return entity;
return DaoUtil.getData(entity);
}
@Override
public List<EventEntity> findEvents(UUID tenantId, EntityId entityId, TimePageLink pageLink) {
public List<Event> findEvents(UUID tenantId, EntityId entityId, TimePageLink pageLink) {
log.trace("Try to find events by tenant [{}], entity [{}]and pageLink [{}]", tenantId, entityId, pageLink);
List<EventEntity> entities = findPageWithTimeSearch(EVENT_BY_ID_VIEW_NAME,
Arrays.asList(eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId),
@ -93,11 +114,11 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
eq(ModelConstants.EVENT_ENTITY_ID_PROPERTY, entityId.getId())),
pageLink);
log.trace("Found events by tenant [{}], entity [{}] and pageLink [{}]", tenantId, entityId, pageLink);
return entities;
return DaoUtil.convertDataList(entities);
}
@Override
public List<EventEntity> findEvents(UUID tenantId, EntityId entityId, String eventType, TimePageLink pageLink) {
public List<Event> findEvents(UUID tenantId, EntityId entityId, String eventType, TimePageLink pageLink) {
log.trace("Try to find events by tenant [{}], entity [{}], type [{}] and pageLink [{}]", tenantId, entityId, eventType, pageLink);
List<EventEntity> entities = findPageWithTimeSearch(EVENT_BY_TYPE_AND_ID_VIEW_NAME,
Arrays.asList(eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId),
@ -108,10 +129,10 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
QueryBuilder.desc(ModelConstants.EVENT_TYPE_PROPERTY),
pageLink);
log.trace("Found events by tenant [{}], entity [{}], type [{}] and pageLink [{}]", tenantId, entityId, eventType, pageLink);
return entities;
return DaoUtil.convertDataList(entities);
}
private Optional<EventEntity> save(EventEntity entity, boolean ifNotExists) {
private Optional<Event> save(EventEntity entity, boolean ifNotExists) {
if (entity.getId() == null) {
entity.setId(UUIDs.timeBased());
}
@ -128,7 +149,7 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
}
ResultSet rs = executeWrite(insert);
if (rs.wasApplied()) {
return Optional.of(entity);
return Optional.of(DaoUtil.getData(entity));
} else {
return Optional.empty();
}

15
dao/src/main/java/org/thingsboard/server/dao/event/EventDao.java

@ -19,7 +19,6 @@ import org.thingsboard.server.common.data.Event;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.EventEntity;
import java.util.List;
import java.util.Optional;
@ -27,10 +26,8 @@ import java.util.UUID;
/**
* The Interface DeviceDao.
*
* @param <T> the generic type
*/
public interface EventDao extends Dao<EventEntity> {
public interface EventDao extends Dao<Event> {
/**
* Save or update event object
@ -38,7 +35,7 @@ public interface EventDao extends Dao<EventEntity> {
* @param event the event object
* @return saved event object
*/
EventEntity save(Event event);
Event save(Event event);
/**
* Save event object if it is not yet saved
@ -46,7 +43,7 @@ public interface EventDao extends Dao<EventEntity> {
* @param event the event object
* @return saved event object
*/
Optional<EventEntity> saveIfNotExists(Event event);
Optional<Event> saveIfNotExists(Event event);
/**
* Find event by tenantId, entityId and eventUid.
@ -57,7 +54,7 @@ public interface EventDao extends Dao<EventEntity> {
* @param eventUid the eventUid
* @return the event
*/
EventEntity findEvent(UUID tenantId, EntityId entityId, String eventType, String eventUid);
Event findEvent(UUID tenantId, EntityId entityId, String eventType, String eventUid);
/**
* Find events by tenantId, entityId and pageLink.
@ -67,7 +64,7 @@ public interface EventDao extends Dao<EventEntity> {
* @param pageLink the pageLink
* @return the event list
*/
List<EventEntity> findEvents(UUID tenantId, EntityId entityId, TimePageLink pageLink);
List<Event> findEvents(UUID tenantId, EntityId entityId, TimePageLink pageLink);
/**
* Find events by tenantId, entityId, eventType and pageLink.
@ -78,5 +75,5 @@ public interface EventDao extends Dao<EventEntity> {
* @param pageLink the pageLink
* @return the event list
*/
List<EventEntity> findEvents(UUID tenantId, EntityId entityId, String eventType, TimePageLink pageLink);
List<Event> findEvents(UUID tenantId, EntityId entityId, String eventType, TimePageLink pageLink);
}

1
dao/src/main/java/org/thingsboard/server/dao/event/EventService.java

@ -21,7 +21,6 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TimePageData;
import org.thingsboard.server.common.data.page.TimePageLink;
import java.util.List;
import java.util.Optional;
public interface EventService {

26
dao/src/main/java/org/thingsboard/server/dao/exception/DatabaseException.java

@ -17,22 +17,22 @@ package org.thingsboard.server.dao.exception;
public class DatabaseException extends RuntimeException {
private static final long serialVersionUID = 3463762014441887103L;
private static final long serialVersionUID = 3463762014441887103L;
public DatabaseException() {
super();
}
public DatabaseException() {
super();
}
public DatabaseException(String message, Throwable cause) {
super(message, cause);
}
public DatabaseException(String message, Throwable cause) {
super(message, cause);
}
public DatabaseException(String message) {
super(message);
}
public DatabaseException(String message) {
super(message);
}
public DatabaseException(Throwable cause) {
super(cause);
}
public DatabaseException(Throwable cause) {
super(cause);
}
}

4
dao/src/main/java/org/thingsboard/server/dao/exception/IncorrectParameterException.java

@ -18,9 +18,9 @@ package org.thingsboard.server.dao.exception;
public class IncorrectParameterException extends RuntimeException {
private static final long serialVersionUID = 601995650578985289L;
private static final long serialVersionUID = 601995650578985289L;
public IncorrectParameterException(String message) {
public IncorrectParameterException(String message) {
super(message);
}

3
dao/src/main/java/org/thingsboard/server/dao/model/AdminSettingsEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/AdminSettingsEntity.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_JSON_VALUE_PROPERTY;
@ -24,6 +24,7 @@ import java.util.UUID;
import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.id.AdminSettingsId;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.type.JsonCodec;
import com.datastax.driver.core.utils.UUIDs;

4
dao/src/main/java/org/thingsboard/server/dao/model/ComponentDescriptorEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/ComponentDescriptorEntity.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.PartitionKey;
@ -23,6 +23,8 @@ import org.thingsboard.server.common.data.id.ComponentDescriptorId;
import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
import org.thingsboard.server.common.data.plugin.ComponentScope;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.type.JsonCodec;
import java.util.UUID;

47
dao/src/main/java/org/thingsboard/server/dao/model/CustomerEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/CustomerEntity.java

@ -13,28 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
import static org.thingsboard.server.dao.model.ModelConstants.ADDRESS2_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.ADDRESS_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.CITY_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.COUNTRY_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.CUSTOMER_TENANT_ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.CUSTOMER_TITLE_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.EMAIL_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.PHONE_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.SEARCH_TEXT_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.STATE_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.ZIP_PROPERTY;
package org.thingsboard.server.dao.model.nosql;
import java.util.UUID;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.type.JsonCodec;
import com.datastax.driver.core.utils.UUIDs;
@ -44,51 +31,51 @@ import com.datastax.driver.mapping.annotations.Table;
import com.datastax.driver.mapping.annotations.Transient;
import com.fasterxml.jackson.databind.JsonNode;
@Table(name = CUSTOMER_COLUMN_FAMILY_NAME)
@Table(name = ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME)
public final class CustomerEntity implements SearchTextEntity<Customer> {
@Transient
private static final long serialVersionUID = -7732527103760948490L;
@PartitionKey(value = 0)
@Column(name = ID_PROPERTY)
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@PartitionKey(value = 1)
@Column(name = CUSTOMER_TENANT_ID_PROPERTY)
@Column(name = ModelConstants.CUSTOMER_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = CUSTOMER_TITLE_PROPERTY)
@Column(name = ModelConstants.CUSTOMER_TITLE_PROPERTY)
private String title;
@Column(name = SEARCH_TEXT_PROPERTY)
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = COUNTRY_PROPERTY)
@Column(name = ModelConstants.COUNTRY_PROPERTY)
private String country;
@Column(name = STATE_PROPERTY)
@Column(name = ModelConstants.STATE_PROPERTY)
private String state;
@Column(name = CITY_PROPERTY)
@Column(name = ModelConstants.CITY_PROPERTY)
private String city;
@Column(name = ADDRESS_PROPERTY)
@Column(name = ModelConstants.ADDRESS_PROPERTY)
private String address;
@Column(name = ADDRESS2_PROPERTY)
@Column(name = ModelConstants.ADDRESS2_PROPERTY)
private String address2;
@Column(name = ZIP_PROPERTY)
@Column(name = ModelConstants.ZIP_PROPERTY)
private String zip;
@Column(name = PHONE_PROPERTY)
@Column(name = ModelConstants.PHONE_PROPERTY)
private String phone;
@Column(name = EMAIL_PROPERTY)
@Column(name = ModelConstants.EMAIL_PROPERTY)
private String email;
@Column(name = CUSTOMER_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
@Column(name = ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
private JsonNode additionalInfo;
public CustomerEntity() {

4
dao/src/main/java/org/thingsboard/server/dao/model/DashboardEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardEntity.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import java.util.UUID;
@ -21,6 +21,8 @@ import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.type.JsonCodec;
import com.datastax.driver.core.utils.UUIDs;

7
dao/src/main/java/org/thingsboard/server/dao/model/DashboardInfoEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java

@ -13,23 +13,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import java.util.UUID;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.type.JsonCodec;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import com.datastax.driver.core.utils.UUIDs;
import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.PartitionKey;
import com.datastax.driver.mapping.annotations.Table;
import com.datastax.driver.mapping.annotations.Transient;
import com.fasterxml.jackson.databind.JsonNode;
@Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME)
public class DashboardInfoEntity implements SearchTextEntity<DashboardInfo> {

4
dao/src/main/java/org/thingsboard/server/dao/model/DeviceCredentialsEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceCredentialsEntity.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import java.util.UUID;
@ -21,6 +21,8 @@ import org.thingsboard.server.common.data.id.DeviceCredentialsId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.type.DeviceCredentialsTypeCodec;
import com.datastax.driver.core.utils.UUIDs;

20
dao/src/main/java/org/thingsboard/server/dao/model/DeviceEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceEntity.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import com.datastax.driver.core.utils.UUIDs;
import com.datastax.driver.mapping.annotations.Column;
@ -25,37 +25,37 @@ import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.type.JsonCodec;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Table(name = DEVICE_COLUMN_FAMILY_NAME)
@Table(name = ModelConstants.DEVICE_COLUMN_FAMILY_NAME)
public final class DeviceEntity implements SearchTextEntity<Device> {
@Transient
private static final long serialVersionUID = -1265181166886910152L;
@PartitionKey(value = 0)
@Column(name = ID_PROPERTY)
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@PartitionKey(value = 1)
@Column(name = DEVICE_TENANT_ID_PROPERTY)
@Column(name = ModelConstants.DEVICE_TENANT_ID_PROPERTY)
private UUID tenantId;
@PartitionKey(value = 2)
@Column(name = DEVICE_CUSTOMER_ID_PROPERTY)
@Column(name = ModelConstants.DEVICE_CUSTOMER_ID_PROPERTY)
private UUID customerId;
@Column(name = DEVICE_NAME_PROPERTY)
@Column(name = ModelConstants.DEVICE_NAME_PROPERTY)
private String name;
@Column(name = SEARCH_TEXT_PROPERTY)
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = DEVICE_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
@Column(name = ModelConstants.DEVICE_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
private JsonNode additionalInfo;
public DeviceEntity() {

22
dao/src/main/java/org/thingsboard/server/dao/model/EventEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/EventEntity.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import com.datastax.driver.core.utils.UUIDs;
import com.datastax.driver.mapping.annotations.*;
@ -23,48 +23,48 @@ import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.Event;
import org.thingsboard.server.common.data.id.*;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.type.EntityTypeCodec;
import org.thingsboard.server.dao.model.type.JsonCodec;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.*;
/**
* @author Andrew Shvayka
*/
@Data
@NoArgsConstructor
@Table(name = DEVICE_COLUMN_FAMILY_NAME)
@Table(name = ModelConstants.DEVICE_COLUMN_FAMILY_NAME)
public class EventEntity implements BaseEntity<Event> {
@Transient
private static final long serialVersionUID = -1265181166886910153L;
@Column(name = ID_PROPERTY)
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@PartitionKey()
@Column(name = EVENT_TENANT_ID_PROPERTY)
@Column(name = ModelConstants.EVENT_TENANT_ID_PROPERTY)
private UUID tenantId;
@PartitionKey(value = 1)
@Column(name = EVENT_ENTITY_TYPE_PROPERTY, codec = EntityTypeCodec.class)
@Column(name = ModelConstants.EVENT_ENTITY_TYPE_PROPERTY, codec = EntityTypeCodec.class)
private EntityType entityType;
@PartitionKey(value = 2)
@Column(name = EVENT_ENTITY_ID_PROPERTY)
@Column(name = ModelConstants.EVENT_ENTITY_ID_PROPERTY)
private UUID entityId;
@ClusteringColumn()
@Column(name = EVENT_TYPE_PROPERTY)
@Column(name = ModelConstants.EVENT_TYPE_PROPERTY)
private String eventType;
@ClusteringColumn(value = 1)
@Column(name = EVENT_UID_PROPERTY)
@Column(name = ModelConstants.EVENT_UID_PROPERTY)
private String eventUId;
@Column(name = EVENT_BODY_PROPERTY, codec = JsonCodec.class)
@Column(name = ModelConstants.EVENT_BODY_PROPERTY, codec = JsonCodec.class)
private JsonNode body;
public EventEntity(Event event) {

17
dao/src/main/java/org/thingsboard/server/dao/model/PluginMetaDataEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/PluginMetaDataEntity.java

@ -13,31 +13,28 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import com.datastax.driver.core.utils.UUIDs;
import com.datastax.driver.mapping.annotations.ClusteringColumn;
import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.PartitionKey;
import com.datastax.driver.mapping.annotations.Table;
import com.datastax.driver.mapping.annotations.*;
import com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.id.PluginId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
import org.thingsboard.server.common.data.plugin.PluginMetaData;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.type.ComponentLifecycleStateCodec;
import org.thingsboard.server.dao.model.type.JsonCodec;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.ADDITIONAL_INFO_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.RULE_ACTION;
@Table(name = ModelConstants.PLUGIN_COLUMN_FAMILY_NAME)
public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
private static final long serialVersionUID = 1L;
@Transient
private static final long serialVersionUID = -5231612734979707866L;
@PartitionKey
@Column(name = ModelConstants.ID_PROPERTY)
@ -68,7 +65,7 @@ public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
private JsonNode additionalInfo;
public PluginMetaDataEntity() {

31
dao/src/main/java/org/thingsboard/server/dao/model/RuleMetaDataEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/RuleMetaDataEntity.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import com.datastax.driver.core.utils.UUIDs;
import com.datastax.driver.mapping.annotations.ClusteringColumn;
@ -26,40 +26,43 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
import org.thingsboard.server.common.data.rule.RuleMetaData;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.type.ComponentLifecycleStateCodec;
import org.thingsboard.server.dao.model.type.JsonCodec;
import javax.persistence.Transient;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Table(name = RULE_COLUMN_FAMILY_NAME)
@Table(name = ModelConstants.RULE_COLUMN_FAMILY_NAME)
public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
@Transient
private static final long serialVersionUID = 4011728715100800304L;
@PartitionKey
@Column(name = ID_PROPERTY)
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@ClusteringColumn
@Column(name = RULE_TENANT_ID_PROPERTY)
@Column(name = ModelConstants.RULE_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = RULE_NAME_PROPERTY)
@Column(name = ModelConstants.RULE_NAME_PROPERTY)
private String name;
@Column(name = ModelConstants.RULE_STATE_PROPERTY, codec = ComponentLifecycleStateCodec.class)
private ComponentLifecycleState state;
@Column(name = RULE_WEIGHT_PROPERTY)
@Column(name = ModelConstants.RULE_WEIGHT_PROPERTY)
private int weight;
@Column(name = SEARCH_TEXT_PROPERTY)
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = RULE_PLUGIN_TOKEN_PROPERTY)
@Column(name = ModelConstants.RULE_PLUGIN_TOKEN_PROPERTY)
private String pluginToken;
@Column(name = RULE_FILTERS, codec = JsonCodec.class)
@Column(name = ModelConstants.RULE_FILTERS, codec = JsonCodec.class)
private JsonNode filters;
@Column(name = RULE_PROCESSOR, codec = JsonCodec.class)
@Column(name = ModelConstants.RULE_PROCESSOR, codec = JsonCodec.class)
private JsonNode processor;
@Column(name = RULE_ACTION, codec = JsonCodec.class)
@Column(name = ModelConstants.RULE_ACTION, codec = JsonCodec.class)
private JsonNode action;
@Column(name = ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
private JsonNode additionalInfo;
public RuleMetaDataEntity() {

47
dao/src/main/java/org/thingsboard/server/dao/model/TenantEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/TenantEntity.java

@ -13,27 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
import static org.thingsboard.server.dao.model.ModelConstants.ADDRESS2_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.ADDRESS_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.CITY_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.COUNTRY_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.EMAIL_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.PHONE_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.STATE_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.TENANT_ADDITIONAL_INFO_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.TENANT_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.TENANT_REGION_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.TENANT_TITLE_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.ZIP_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.SEARCH_TEXT_PROPERTY;
package org.thingsboard.server.dao.model.nosql;
import java.util.UUID;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.type.JsonCodec;
import com.datastax.driver.core.utils.UUIDs;
@ -43,50 +30,50 @@ import com.datastax.driver.mapping.annotations.Table;
import com.datastax.driver.mapping.annotations.Transient;
import com.fasterxml.jackson.databind.JsonNode;
@Table(name = TENANT_COLUMN_FAMILY_NAME)
@Table(name = ModelConstants.TENANT_COLUMN_FAMILY_NAME)
public final class TenantEntity implements SearchTextEntity<Tenant> {
@Transient
private static final long serialVersionUID = -6198635547142409206L;
@PartitionKey(value = 0)
@Column(name = ID_PROPERTY)
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = TENANT_TITLE_PROPERTY)
@Column(name = ModelConstants.TENANT_TITLE_PROPERTY)
private String title;
@Column(name = SEARCH_TEXT_PROPERTY)
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = TENANT_REGION_PROPERTY)
@Column(name = ModelConstants.TENANT_REGION_PROPERTY)
private String region;
@Column(name = COUNTRY_PROPERTY)
@Column(name = ModelConstants.COUNTRY_PROPERTY)
private String country;
@Column(name = STATE_PROPERTY)
@Column(name = ModelConstants.STATE_PROPERTY)
private String state;
@Column(name = CITY_PROPERTY)
@Column(name = ModelConstants.CITY_PROPERTY)
private String city;
@Column(name = ADDRESS_PROPERTY)
@Column(name = ModelConstants.ADDRESS_PROPERTY)
private String address;
@Column(name = ADDRESS2_PROPERTY)
@Column(name = ModelConstants.ADDRESS2_PROPERTY)
private String address2;
@Column(name = ZIP_PROPERTY)
@Column(name = ModelConstants.ZIP_PROPERTY)
private String zip;
@Column(name = PHONE_PROPERTY)
@Column(name = ModelConstants.PHONE_PROPERTY)
private String phone;
@Column(name = EMAIL_PROPERTY)
@Column(name = ModelConstants.EMAIL_PROPERTY)
private String email;
@Column(name = TENANT_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
@Column(name = ModelConstants.TENANT_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
private JsonNode additionalInfo;
public TenantEntity() {

26
dao/src/main/java/org/thingsboard/server/dao/model/UserCredentialsEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserCredentialsEntity.java

@ -13,15 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
import static org.thingsboard.server.dao.model.ModelConstants.ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_CREDENTIALS_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.USER_CREDENTIALS_PASSWORD_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_CREDENTIALS_ENABLED_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_CREDENTIALS_RESET_TOKEN_PROPERTY;
package org.thingsboard.server.dao.model.nosql;
import java.util.UUID;
@ -34,30 +26,32 @@ import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.PartitionKey;
import com.datastax.driver.mapping.annotations.Table;
import com.datastax.driver.mapping.annotations.Transient;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants;
@Table(name = USER_CREDENTIALS_COLUMN_FAMILY_NAME)
@Table(name = ModelConstants.USER_CREDENTIALS_COLUMN_FAMILY_NAME)
public final class UserCredentialsEntity implements BaseEntity<UserCredentials> {
@Transient
private static final long serialVersionUID = 1348221414123438374L;
@PartitionKey(value = 0)
@Column(name = ID_PROPERTY)
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = USER_CREDENTIALS_USER_ID_PROPERTY)
@Column(name = ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY)
private UUID userId;
@Column(name = USER_CREDENTIALS_ENABLED_PROPERTY)
@Column(name = ModelConstants.USER_CREDENTIALS_ENABLED_PROPERTY)
private boolean enabled;
@Column(name = USER_CREDENTIALS_PASSWORD_PROPERTY)
@Column(name = ModelConstants.USER_CREDENTIALS_PASSWORD_PROPERTY)
private String password;
@Column(name = USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY)
@Column(name = ModelConstants.USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY)
private String activateToken;
@Column(name = USER_CREDENTIALS_RESET_TOKEN_PROPERTY)
@Column(name = ModelConstants.USER_CREDENTIALS_RESET_TOKEN_PROPERTY)
private String resetToken;
public UserCredentialsEntity() {

35
dao/src/main/java/org/thingsboard/server/dao/model/UserEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserEntity.java

@ -13,18 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
import static org.thingsboard.server.dao.model.ModelConstants.ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.SEARCH_TEXT_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_ADDITIONAL_INFO_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_AUTHORITY_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.USER_CUSTOMER_ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_EMAIL_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_FIRST_NAME_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_LAST_NAME_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.USER_TENANT_ID_PROPERTY;
package org.thingsboard.server.dao.model.nosql;
import java.util.UUID;
@ -33,6 +22,8 @@ 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.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.model.type.AuthorityCodec;
import org.thingsboard.server.dao.model.type.JsonCodec;
@ -43,41 +34,41 @@ import com.datastax.driver.mapping.annotations.Table;
import com.datastax.driver.mapping.annotations.Transient;
import com.fasterxml.jackson.databind.JsonNode;
@Table(name = USER_COLUMN_FAMILY_NAME)
@Table(name = ModelConstants.USER_COLUMN_FAMILY_NAME)
public final class UserEntity implements SearchTextEntity<User> {
@Transient
private static final long serialVersionUID = -7740338274987723489L;
@PartitionKey(value = 0)
@Column(name = ID_PROPERTY)
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@PartitionKey(value = 1)
@Column(name = USER_TENANT_ID_PROPERTY)
@Column(name = ModelConstants.USER_TENANT_ID_PROPERTY)
private UUID tenantId;
@PartitionKey(value = 2)
@Column(name = USER_CUSTOMER_ID_PROPERTY)
@Column(name = ModelConstants.USER_CUSTOMER_ID_PROPERTY)
private UUID customerId;
@PartitionKey(value = 3)
@Column(name = USER_AUTHORITY_PROPERTY, codec = AuthorityCodec.class)
@Column(name = ModelConstants.USER_AUTHORITY_PROPERTY, codec = AuthorityCodec.class)
private Authority authority;
@Column(name = USER_EMAIL_PROPERTY)
@Column(name = ModelConstants.USER_EMAIL_PROPERTY)
private String email;
@Column(name = SEARCH_TEXT_PROPERTY)
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = USER_FIRST_NAME_PROPERTY)
@Column(name = ModelConstants.USER_FIRST_NAME_PROPERTY)
private String firstName;
@Column(name = USER_LAST_NAME_PROPERTY)
@Column(name = ModelConstants.USER_LAST_NAME_PROPERTY)
private String lastName;
@Column(name = USER_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
@Column(name = ModelConstants.USER_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
private JsonNode additionalInfo;
public UserEntity() {

4
dao/src/main/java/org/thingsboard/server/dao/model/WidgetTypeEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetTypeEntity.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import com.datastax.driver.core.utils.UUIDs;
import com.datastax.driver.mapping.annotations.Column;
@ -24,6 +24,8 @@ import com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.WidgetTypeId;
import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.type.JsonCodec;
import java.util.UUID;

4
dao/src/main/java/org/thingsboard/server/dao/model/WidgetsBundleEntity.java → dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetsBundleEntity.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.model;
package org.thingsboard.server.dao.model.nosql;
import com.datastax.driver.core.utils.UUIDs;
@ -24,6 +24,8 @@ import com.datastax.driver.mapping.annotations.Transient;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.WidgetsBundleId;
import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.nio.ByteBuffer;
import java.util.UUID;

145
dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java

@ -0,0 +1,145 @@
/**
* 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.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 com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.id.AdminSettingsId;
import org.thingsboard.server.dao.model.BaseEntity;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Entity
@Table(name = ADMIN_SETTINGS_COLUMN_FAMILY_NAME)
public final class AdminSettingsEntity implements BaseEntity<AdminSettings> {
@Transient
private static final long serialVersionUID = 842759712850362147L;
@Id
@Column(name = ID_PROPERTY)
private UUID id;
@Column(name = ADMIN_SETTINGS_KEY_PROPERTY)
private String key;
@Column(name = ADMIN_SETTINGS_JSON_VALUE_PROPERTY)
private JsonNode jsonValue;
public AdminSettingsEntity() {
super();
}
public AdminSettingsEntity(AdminSettings adminSettings) {
if (adminSettings.getId() != null) {
this.id = adminSettings.getId().getId();
}
this.key = adminSettings.getKey();
this.jsonValue = adminSettings.getJsonValue();
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public JsonNode getJsonValue() {
return jsonValue;
}
public void setJsonValue(JsonNode jsonValue) {
this.jsonValue = jsonValue;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((jsonValue == null) ? 0 : jsonValue.hashCode());
result = prime * result + ((key == null) ? 0 : key.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AdminSettingsEntity other = (AdminSettingsEntity) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (jsonValue == null) {
if (other.jsonValue != null)
return false;
} else if (!jsonValue.equals(other.jsonValue))
return false;
if (key == null) {
if (other.key != null)
return false;
} else if (!key.equals(other.key))
return false;
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("AdminSettingsEntity [id=");
builder.append(id);
builder.append(", key=");
builder.append(key);
builder.append(", jsonValue=");
builder.append(jsonValue);
builder.append("]");
return builder.toString();
}
@Override
public AdminSettings toData() {
AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(id));
adminSettings.setCreatedTime(UUIDs.unixTimestamp(id));
adminSettings.setKey(key);
adminSettings.setJsonValue(jsonValue);
return adminSettings;
}
}

164
dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java

@ -0,0 +1,164 @@
/**
* 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.model.sql;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.id.ComponentDescriptorId;
import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
import org.thingsboard.server.common.data.plugin.ComponentScope;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.COMPONENT_DESCRIPTOR_COLUMN_FAMILY_NAME)
public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDescriptor> {
@Transient
private static final long serialVersionUID = 253590350877992402L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.COMPONENT_DESCRIPTOR_TYPE_PROPERTY)
private ComponentType type;
@Column(name = ModelConstants.COMPONENT_DESCRIPTOR_SCOPE_PROPERTY)
private ComponentScope scope;
@Column(name = ModelConstants.COMPONENT_DESCRIPTOR_NAME_PROPERTY)
private String name;
@Column(name = ModelConstants.COMPONENT_DESCRIPTOR_CLASS_PROPERTY)
private String clazz;
@Column(name = ModelConstants.COMPONENT_DESCRIPTOR_CONFIGURATION_DESCRIPTOR_PROPERTY)
private JsonNode configurationDescriptor;
@Column(name = ModelConstants.COMPONENT_DESCRIPTOR_ACTIONS_PROPERTY)
private String actions;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
public ComponentDescriptorEntity() {
}
public ComponentDescriptorEntity(ComponentDescriptor component) {
if (component.getId() != null) {
this.id = component.getId().getId();
}
this.actions = component.getActions();
this.type = component.getType();
this.scope = component.getScope();
this.name = component.getName();
this.clazz = component.getClazz();
this.configurationDescriptor = component.getConfigurationDescriptor();
this.searchText = component.getName();
}
@Override
public ComponentDescriptor toData() {
ComponentDescriptor data = new ComponentDescriptor(new ComponentDescriptorId(id));
data.setType(type);
data.setScope(scope);
data.setName(this.getName());
data.setClazz(this.getClazz());
data.setActions(this.getActions());
data.setConfigurationDescriptor(this.getConfigurationDescriptor());
return data;
}
@Override
public UUID getId() {
return id;
}
@Override
public void setId(UUID id) {
this.id = id;
}
public String getActions() {
return actions;
}
public void setActions(String actions) {
this.actions = actions;
}
public ComponentType getType() {
return type;
}
public void setType(ComponentType type) {
this.type = type;
}
public ComponentScope getScope() {
return scope;
}
public void setScope(ComponentScope scope) {
this.scope = scope;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public JsonNode getConfigurationDescriptor() {
return configurationDescriptor;
}
public void setConfigurationDescriptor(JsonNode configurationDescriptor) {
this.configurationDescriptor = configurationDescriptor;
}
public String getSearchText() {
return searchText;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
@Override
public String getSearchTextSource() {
return searchText;
}
}

351
dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java

@ -0,0 +1,351 @@
/**
* 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.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 com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME)
public final class CustomerEntity implements SearchTextEntity<Customer> {
@Transient
private static final long serialVersionUID = 8951342124082981556L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.CUSTOMER_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.CUSTOMER_TITLE_PROPERTY)
private String title;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ModelConstants.COUNTRY_PROPERTY)
private String country;
@Column(name = ModelConstants.STATE_PROPERTY)
private String state;
@Column(name = ModelConstants.CITY_PROPERTY)
private String city;
@Column(name = ModelConstants.ADDRESS_PROPERTY)
private String address;
@Column(name = ModelConstants.ADDRESS2_PROPERTY)
private String address2;
@Column(name = ModelConstants.ZIP_PROPERTY)
private String zip;
@Column(name = ModelConstants.PHONE_PROPERTY)
private String phone;
@Column(name = ModelConstants.EMAIL_PROPERTY)
private String email;
@Column(name = ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public CustomerEntity() {
super();
}
public CustomerEntity(Customer customer) {
if (customer.getId() != null) {
this.id = customer.getId().getId();
}
this.tenantId = customer.getTenantId().getId();
this.title = customer.getTitle();
this.country = customer.getCountry();
this.state = customer.getState();
this.city = customer.getCity();
this.address = customer.getAddress();
this.address2 = customer.getAddress2();
this.zip = customer.getZip();
this.phone = customer.getPhone();
this.email = customer.getEmail();
this.additionalInfo = customer.getAdditionalInfo();
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public UUID getTenantId() {
return tenantId;
}
public void setTenantId(UUID tenantId) {
this.tenantId = tenantId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public JsonNode getAdditionalInfo() {
return additionalInfo;
}
public void setAdditionalInfo(JsonNode additionalInfo) {
this.additionalInfo = additionalInfo;
}
@Override
public String getSearchTextSource() {
return title;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
public String getSearchText() {
return searchText;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode());
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + ((address2 == null) ? 0 : address2.hashCode());
result = prime * result + ((city == null) ? 0 : city.hashCode());
result = prime * result + ((country == null) ? 0 : country.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((phone == null) ? 0 : phone.hashCode());
result = prime * result + ((state == null) ? 0 : state.hashCode());
result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode());
result = prime * result + ((title == null) ? 0 : title.hashCode());
result = prime * result + ((zip == null) ? 0 : zip.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CustomerEntity other = (CustomerEntity) obj;
if (additionalInfo == null) {
if (other.additionalInfo != null)
return false;
} else if (!additionalInfo.equals(other.additionalInfo))
return false;
if (address == null) {
if (other.address != null)
return false;
} else if (!address.equals(other.address))
return false;
if (address2 == null) {
if (other.address2 != null)
return false;
} else if (!address2.equals(other.address2))
return false;
if (city == null) {
if (other.city != null)
return false;
} else if (!city.equals(other.city))
return false;
if (country == null) {
if (other.country != null)
return false;
} else if (!country.equals(other.country))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (phone == null) {
if (other.phone != null)
return false;
} else if (!phone.equals(other.phone))
return false;
if (state == null) {
if (other.state != null)
return false;
} else if (!state.equals(other.state))
return false;
if (tenantId == null) {
if (other.tenantId != null)
return false;
} else if (!tenantId.equals(other.tenantId))
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
if (zip == null) {
if (other.zip != null)
return false;
} else if (!zip.equals(other.zip))
return false;
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("CustomerEntity [id=");
builder.append(id);
builder.append(", tenantId=");
builder.append(tenantId);
builder.append(", title=");
builder.append(title);
builder.append(", country=");
builder.append(country);
builder.append(", state=");
builder.append(state);
builder.append(", city=");
builder.append(city);
builder.append(", address=");
builder.append(address);
builder.append(", address2=");
builder.append(address2);
builder.append(", zip=");
builder.append(zip);
builder.append(", phone=");
builder.append(phone);
builder.append(", email=");
builder.append(email);
builder.append(", additionalInfo=");
builder.append(additionalInfo);
builder.append("]");
return builder.toString();
}
@Override
public Customer toData() {
Customer customer = new Customer(new CustomerId(id));
customer.setCreatedTime(UUIDs.unixTimestamp(id));
customer.setTenantId(new TenantId(tenantId));
customer.setTitle(title);
customer.setCountry(country);
customer.setState(state);
customer.setCity(city);
customer.setAddress(address);
customer.setAddress2(address2);
customer.setZip(zip);
customer.setPhone(phone);
customer.setEmail(email);
customer.setAdditionalInfo(additionalInfo);
return customer;
}
}

221
dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java

@ -0,0 +1,221 @@
/**
* 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.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 com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME)
public final class DashboardEntity implements SearchTextEntity<Dashboard> {
@Transient
private static final long serialVersionUID = -4838084363113078898L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.DASHBOARD_CUSTOMER_ID_PROPERTY)
private UUID customerId;
@Column(name = ModelConstants.DASHBOARD_TITLE_PROPERTY)
private String title;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ModelConstants.DASHBOARD_CONFIGURATION_PROPERTY)
private JsonNode configuration;
public DashboardEntity() {
super();
}
public DashboardEntity(Dashboard dashboard) {
if (dashboard.getId() != null) {
this.id = dashboard.getId().getId();
}
if (dashboard.getTenantId() != null) {
this.tenantId = dashboard.getTenantId().getId();
}
if (dashboard.getCustomerId() != null) {
this.customerId = dashboard.getCustomerId().getId();
}
this.title = dashboard.getTitle();
this.configuration = dashboard.getConfiguration();
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
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 String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public JsonNode getConfiguration() {
return configuration;
}
public void setConfiguration(JsonNode configuration) {
this.configuration = configuration;
}
@Override
public String getSearchTextSource() {
return title;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
public String getSearchText() {
return searchText;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((configuration == null) ? 0 : configuration.hashCode());
result = prime * result + ((customerId == null) ? 0 : customerId.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((searchText == null) ? 0 : searchText.hashCode());
result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode());
result = prime * result + ((title == null) ? 0 : title.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DashboardEntity other = (DashboardEntity) obj;
if (configuration == null) {
if (other.configuration != null)
return false;
} else if (!configuration.equals(other.configuration))
return false;
if (customerId == null) {
if (other.customerId != null)
return false;
} else if (!customerId.equals(other.customerId))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (searchText == null) {
if (other.searchText != null)
return false;
} else if (!searchText.equals(other.searchText))
return false;
if (tenantId == null) {
if (other.tenantId != null)
return false;
} else if (!tenantId.equals(other.tenantId))
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("DashboardEntity [id=");
builder.append(id);
builder.append(", tenantId=");
builder.append(tenantId);
builder.append(", customerId=");
builder.append(customerId);
builder.append(", title=");
builder.append(title);
builder.append(", searchText=");
builder.append(searchText);
builder.append(", configuration=");
builder.append(configuration);
builder.append("]");
return builder.toString();
}
@Override
public Dashboard toData() {
Dashboard dashboard = new Dashboard(new DashboardId(id));
dashboard.setCreatedTime(UUIDs.unixTimestamp(id));
if (tenantId != null) {
dashboard.setTenantId(new TenantId(tenantId));
}
if (customerId != null) {
dashboard.setCustomerId(new CustomerId(customerId));
}
dashboard.setTitle(title);
dashboard.setConfiguration(configuration);
return dashboard;
}
}

199
dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java

@ -0,0 +1,199 @@
/**
* 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.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 org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME)
public class DashboardInfoEntity implements SearchTextEntity<DashboardInfo> {
@Transient
private static final long serialVersionUID = -5525675905528050250L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.DASHBOARD_CUSTOMER_ID_PROPERTY)
private UUID customerId;
@Column(name = ModelConstants.DASHBOARD_TITLE_PROPERTY)
private String title;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
public DashboardInfoEntity() {
super();
}
public DashboardInfoEntity(DashboardInfo dashboardInfo) {
if (dashboardInfo.getId() != null) {
this.id = dashboardInfo.getId().getId();
}
if (dashboardInfo.getTenantId() != null) {
this.tenantId = dashboardInfo.getTenantId().getId();
}
if (dashboardInfo.getCustomerId() != null) {
this.customerId = dashboardInfo.getCustomerId().getId();
}
this.title = dashboardInfo.getTitle();
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
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 String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String getSearchTextSource() {
return title;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
public String getSearchText() {
return searchText;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((customerId == null) ? 0 : customerId.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((searchText == null) ? 0 : searchText.hashCode());
result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode());
result = prime * result + ((title == null) ? 0 : title.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DashboardInfoEntity other = (DashboardInfoEntity) obj;
if (customerId == null) {
if (other.customerId != null)
return false;
} else if (!customerId.equals(other.customerId))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (searchText == null) {
if (other.searchText != null)
return false;
} else if (!searchText.equals(other.searchText))
return false;
if (tenantId == null) {
if (other.tenantId != null)
return false;
} else if (!tenantId.equals(other.tenantId))
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("DashboardInfoEntity [id=");
builder.append(id);
builder.append(", tenantId=");
builder.append(tenantId);
builder.append(", customerId=");
builder.append(customerId);
builder.append(", title=");
builder.append(title);
builder.append(", searchText=");
builder.append(searchText);
builder.append("]");
return builder.toString();
}
@Override
public DashboardInfo toData() {
DashboardInfo dashboardInfo = new DashboardInfo(new DashboardId(id));
dashboardInfo.setCreatedTime(UUIDs.unixTimestamp(id));
if (tenantId != null) {
dashboardInfo.setTenantId(new TenantId(tenantId));
}
if (customerId != null) {
dashboardInfo.setCustomerId(new CustomerId(customerId));
}
dashboardInfo.setTitle(title);
return dashboardInfo;
}
}

187
dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java

@ -0,0 +1,187 @@
/**
* 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.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 org.thingsboard.server.common.data.id.DeviceCredentialsId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.DEVICE_CREDENTIALS_COLUMN_FAMILY_NAME)
public final class DeviceCredentialsEntity implements BaseEntity<DeviceCredentials> {
@Transient
private static final long serialVersionUID = -2512362753385470464L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.DEVICE_CREDENTIALS_DEVICE_ID_PROPERTY)
private UUID deviceId;
@Column(name = ModelConstants.DEVICE_CREDENTIALS_CREDENTIALS_TYPE_PROPERTY)
private DeviceCredentialsType credentialsType;
@Column(name = ModelConstants.DEVICE_CREDENTIALS_CREDENTIALS_ID_PROPERTY)
private String credentialsId;
@Column(name = ModelConstants.DEVICE_CREDENTIALS_CREDENTIALS_VALUE_PROPERTY)
private String credentialsValue;
public DeviceCredentialsEntity() {
super();
}
public DeviceCredentialsEntity(DeviceCredentials deviceCredentials) {
if (deviceCredentials.getId() != null) {
this.id = deviceCredentials.getId().getId();
}
if (deviceCredentials.getDeviceId() != null) {
this.deviceId = deviceCredentials.getDeviceId().getId();
}
this.credentialsType = deviceCredentials.getCredentialsType();
this.credentialsId = deviceCredentials.getCredentialsId();
this.credentialsValue = deviceCredentials.getCredentialsValue();
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public UUID getDeviceId() {
return deviceId;
}
public void setDeviceId(UUID deviceId) {
this.deviceId = deviceId;
}
public DeviceCredentialsType getCredentialsType() {
return credentialsType;
}
public void setCredentialsType(DeviceCredentialsType credentialsType) {
this.credentialsType = credentialsType;
}
public String getCredentialsId() {
return credentialsId;
}
public void setCredentialsId(String credentialsId) {
this.credentialsId = credentialsId;
}
public String getCredentialsValue() {
return credentialsValue;
}
public void setCredentialsValue(String credentialsValue) {
this.credentialsValue = credentialsValue;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((credentialsId == null) ? 0 : credentialsId.hashCode());
result = prime * result + ((credentialsType == null) ? 0 : credentialsType.hashCode());
result = prime * result + ((credentialsValue == null) ? 0 : credentialsValue.hashCode());
result = prime * result + ((deviceId == null) ? 0 : deviceId.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DeviceCredentialsEntity other = (DeviceCredentialsEntity) obj;
if (credentialsId == null) {
if (other.credentialsId != null)
return false;
} else if (!credentialsId.equals(other.credentialsId))
return false;
if (credentialsType != other.credentialsType)
return false;
if (credentialsValue == null) {
if (other.credentialsValue != null)
return false;
} else if (!credentialsValue.equals(other.credentialsValue))
return false;
if (deviceId == null) {
if (other.deviceId != null)
return false;
} else if (!deviceId.equals(other.deviceId))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("DeviceCredentialsEntity [id=");
builder.append(id);
builder.append(", deviceId=");
builder.append(deviceId);
builder.append(", credentialsType=");
builder.append(credentialsType);
builder.append(", credentialsId=");
builder.append(credentialsId);
builder.append(", credentialsValue=");
builder.append(credentialsValue);
builder.append("]");
return builder.toString();
}
@Override
public DeviceCredentials toData() {
DeviceCredentials deviceCredentials = new DeviceCredentials(new DeviceCredentialsId(id));
deviceCredentials.setCreatedTime(UUIDs.unixTimestamp(id));
if (deviceId != null) {
deviceCredentials.setDeviceId(new DeviceId(deviceId));
}
deviceCredentials.setCredentialsType(credentialsType);
deviceCredentials.setCredentialsId(credentialsId);
deviceCredentials.setCredentialsValue(credentialsValue);
return deviceCredentials;
}
}

213
dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java

@ -0,0 +1,213 @@
/**
* 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.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 com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.DEVICE_COLUMN_FAMILY_NAME)
public final class DeviceEntity implements SearchTextEntity<Device> {
@Transient
private static final long serialVersionUID = 8050086401213322856L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.DEVICE_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.DEVICE_CUSTOMER_ID_PROPERTY)
private UUID customerId;
@Column(name = ModelConstants.DEVICE_NAME_PROPERTY)
private String name;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ModelConstants.DEVICE_ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public DeviceEntity() {
super();
}
public DeviceEntity(Device device) {
if (device.getId() != null) {
this.id = device.getId().getId();
}
if (device.getTenantId() != null) {
this.tenantId = device.getTenantId().getId();
}
if (device.getCustomerId() != null) {
this.customerId = device.getCustomerId().getId();
}
this.name = device.getName();
this.additionalInfo = device.getAdditionalInfo();
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
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 String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public JsonNode getAdditionalInfo() {
return additionalInfo;
}
public void setAdditionalInfo(JsonNode additionalInfo) {
this.additionalInfo = additionalInfo;
}
@Override
public String getSearchTextSource() {
return name;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
public String getSearchText() {
return searchText;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode());
result = prime * result + ((customerId == null) ? 0 : customerId.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DeviceEntity other = (DeviceEntity) obj;
if (additionalInfo == null) {
if (other.additionalInfo != null)
return false;
} else if (!additionalInfo.equals(other.additionalInfo))
return false;
if (customerId == null) {
if (other.customerId != null)
return false;
} else if (!customerId.equals(other.customerId))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (tenantId == null) {
if (other.tenantId != null)
return false;
} else if (!tenantId.equals(other.tenantId))
return false;
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("DeviceEntity [id=");
builder.append(id);
builder.append(", tenantId=");
builder.append(tenantId);
builder.append(", customerId=");
builder.append(customerId);
builder.append(", name=");
builder.append(name);
builder.append(", additionalInfo=");
builder.append(additionalInfo);
builder.append("]");
return builder.toString();
}
@Override
public Device toData() {
Device device = new Device(new DeviceId(id));
device.setCreatedTime(UUIDs.unixTimestamp(id));
if (tenantId != null) {
device.setTenantId(new TenantId(tenantId));
}
if (customerId != null) {
device.setCustomerId(new CustomerId(customerId));
}
device.setName(name);
device.setAdditionalInfo(additionalInfo);
return device;
}
}

119
dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java

@ -0,0 +1,119 @@
/**
* 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.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 com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.Event;
import org.thingsboard.server.common.data.id.*;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import java.util.UUID;
@Data
@NoArgsConstructor
@Entity
@Table(name = ModelConstants.DEVICE_COLUMN_FAMILY_NAME)
public class EventEntity implements BaseEntity<Event> {
@Transient
private static final long serialVersionUID = -5717830061727466727L;
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Id
@Column(name = ModelConstants.EVENT_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.EVENT_ENTITY_TYPE_PROPERTY)
private EntityType entityType;
@Column(name = ModelConstants.EVENT_ENTITY_ID_PROPERTY)
private UUID entityId;
@Column(name = ModelConstants.EVENT_TYPE_PROPERTY)
private String eventType;
@Column(name = ModelConstants.EVENT_UID_PROPERTY)
private String eventUId;
@Column(name = ModelConstants.EVENT_BODY_PROPERTY)
private JsonNode body;
public EventEntity(Event event) {
if (event.getId() != null) {
this.id = event.getId().getId();
}
if (event.getTenantId() != null) {
this.tenantId = event.getTenantId().getId();
}
if (event.getEntityId() != null) {
this.entityType = event.getEntityId().getEntityType();
this.entityId = event.getEntityId().getId();
}
this.eventType = event.getType();
this.eventUId = event.getUid();
this.body = event.getBody();
}
@Override
public UUID getId() {
return id;
}
@Override
public void setId(UUID id) {
this.id = id;
}
@Override
public Event toData() {
Event event = new Event(new EventId(id));
event.setCreatedTime(UUIDs.unixTimestamp(id));
event.setTenantId(new TenantId(tenantId));
switch (entityType) {
case TENANT:
event.setEntityId(new TenantId(entityId));
break;
case DEVICE:
event.setEntityId(new DeviceId(entityId));
break;
case CUSTOMER:
event.setEntityId(new CustomerId(entityId));
break;
case RULE:
event.setEntityId(new RuleId(entityId));
break;
case PLUGIN:
event.setEntityId(new PluginId(entityId));
break;
}
event.setBody(body);
event.setType(eventType);
event.setUid(eventUId);
return event;
}
}

216
dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java

@ -0,0 +1,216 @@
/**
* 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.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 com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.id.PluginId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
import org.thingsboard.server.common.data.plugin.PluginMetaData;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.Objects;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.PLUGIN_COLUMN_FAMILY_NAME)
public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
@Transient
private static final long serialVersionUID = -6164321050824823149L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.PLUGIN_API_TOKEN_PROPERTY)
private String apiToken;
@Column(name = ModelConstants.PLUGIN_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.PLUGIN_NAME_PROPERTY)
private String name;
@Column(name = ModelConstants.PLUGIN_CLASS_PROPERTY)
private String clazz;
@Column(name = ModelConstants.PLUGIN_ACCESS_PROPERTY)
private boolean publicAccess;
@Column(name = ModelConstants.PLUGIN_STATE_PROPERTY)
private ComponentLifecycleState state;
@Column(name = ModelConstants.PLUGIN_CONFIGURATION_PROPERTY)
private JsonNode configuration;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public PluginMetaDataEntity() {
}
public PluginMetaDataEntity(PluginMetaData pluginMetaData) {
if (pluginMetaData.getId() != null) {
this.id = pluginMetaData.getId().getId();
}
this.tenantId = pluginMetaData.getTenantId().getId();
this.apiToken = pluginMetaData.getApiToken();
this.clazz = pluginMetaData.getClazz();
this.name = pluginMetaData.getName();
this.publicAccess = pluginMetaData.isPublicAccess();
this.state = pluginMetaData.getState();
this.configuration = pluginMetaData.getConfiguration();
this.searchText = pluginMetaData.getName();
this.additionalInfo = pluginMetaData.getAdditionalInfo();
}
@Override
public String getSearchTextSource() {
return searchText;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
@Override
public UUID getId() {
return id;
}
@Override
public void setId(UUID id) {
this.id = id;
}
public String getApiToken() {
return apiToken;
}
public void setApiToken(String apiToken) {
this.apiToken = apiToken;
}
public UUID getTenantId() {
return tenantId;
}
public void setTenantId(UUID tenantId) {
this.tenantId = tenantId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public JsonNode getConfiguration() {
return configuration;
}
public void setConfiguration(JsonNode configuration) {
this.configuration = configuration;
}
public boolean isPublicAccess() {
return publicAccess;
}
public void setPublicAccess(boolean publicAccess) {
this.publicAccess = publicAccess;
}
public ComponentLifecycleState getState() {
return state;
}
public void setState(ComponentLifecycleState state) {
this.state = state;
}
public String getSearchText() {
return searchText;
}
public JsonNode getAdditionalInfo() {
return additionalInfo;
}
public void setAdditionalInfo(JsonNode additionalInfo) {
this.additionalInfo = additionalInfo;
}
@Override
public PluginMetaData toData() {
PluginMetaData data = new PluginMetaData(new PluginId(id));
data.setTenantId(new TenantId(tenantId));
data.setCreatedTime(UUIDs.unixTimestamp(id));
data.setName(name);
data.setConfiguration(configuration);
data.setClazz(clazz);
data.setPublicAccess(publicAccess);
data.setState(state);
data.setApiToken(apiToken);
data.setAdditionalInfo(additionalInfo);
return data;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
PluginMetaDataEntity entity = (PluginMetaDataEntity) o;
return Objects.equals(id, entity.id) && Objects.equals(apiToken, entity.apiToken) && Objects.equals(tenantId, entity.tenantId)
&& Objects.equals(name, entity.name) && Objects.equals(clazz, entity.clazz) && Objects.equals(state, entity.state)
&& Objects.equals(configuration, entity.configuration)
&& Objects.equals(searchText, entity.searchText);
}
@Override
public int hashCode() {
return Objects.hash(id, apiToken, tenantId, name, clazz, state, configuration, searchText);
}
@Override
public String toString() {
return "PluginMetaDataEntity{" + "id=" + id + ", apiToken='" + apiToken + '\'' + ", tenantId=" + tenantId + ", name='" + name + '\'' + ", clazz='"
+ clazz + '\'' + ", state=" + state + ", configuration=" + configuration + ", searchText='" + searchText + '\'' + '}';
}
}

228
dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java

@ -0,0 +1,228 @@
/**
* 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.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 com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.id.RuleId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
import org.thingsboard.server.common.data.rule.RuleMetaData;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.Objects;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.RULE_COLUMN_FAMILY_NAME)
public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
@Transient
private static final long serialVersionUID = -1506905644259463884L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.RULE_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.RULE_NAME_PROPERTY)
private String name;
@Column(name = ModelConstants.RULE_STATE_PROPERTY)
private ComponentLifecycleState state;
@Column(name = ModelConstants.RULE_WEIGHT_PROPERTY)
private int weight;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ModelConstants.RULE_PLUGIN_TOKEN_PROPERTY)
private String pluginToken;
@Column(name = ModelConstants.RULE_FILTERS)
private JsonNode filters;
@Column(name = ModelConstants.RULE_PROCESSOR)
private JsonNode processor;
@Column(name = ModelConstants.RULE_ACTION)
private JsonNode action;
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public RuleMetaDataEntity() {
}
public RuleMetaDataEntity(RuleMetaData rule) {
if (rule.getId() != null) {
this.id = rule.getUuidId();
}
this.tenantId = DaoUtil.getId(rule.getTenantId());
this.name = rule.getName();
this.pluginToken = rule.getPluginToken();
this.state = rule.getState();
this.weight = rule.getWeight();
this.searchText = rule.getName();
this.filters = rule.getFilters();
this.processor = rule.getProcessor();
this.action = rule.getAction();
this.additionalInfo = rule.getAdditionalInfo();
}
@Override
public String getSearchTextSource() {
return searchText;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
@Override
public UUID getId() {
return id;
}
@Override
public void setId(UUID id) {
this.id = id;
}
public UUID getTenantId() {
return tenantId;
}
public void setTenantId(UUID tenantId) {
this.tenantId = tenantId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ComponentLifecycleState getState() {
return state;
}
public void setState(ComponentLifecycleState state) {
this.state = state;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public String getPluginToken() {
return pluginToken;
}
public void setPluginToken(String pluginToken) {
this.pluginToken = pluginToken;
}
public String getSearchText() {
return searchText;
}
public JsonNode getFilters() {
return filters;
}
public void setFilters(JsonNode filters) {
this.filters = filters;
}
public JsonNode getProcessor() {
return processor;
}
public void setProcessor(JsonNode processor) {
this.processor = processor;
}
public JsonNode getAction() {
return action;
}
public void setAction(JsonNode action) {
this.action = action;
}
public JsonNode getAdditionalInfo() {
return additionalInfo;
}
public void setAdditionalInfo(JsonNode additionalInfo) {
this.additionalInfo = additionalInfo;
}
@Override
public RuleMetaData toData() {
RuleMetaData rule = new RuleMetaData(new RuleId(id));
rule.setTenantId(new TenantId(tenantId));
rule.setName(name);
rule.setState(state);
rule.setWeight(weight);
rule.setCreatedTime(UUIDs.unixTimestamp(id));
rule.setPluginToken(pluginToken);
rule.setFilters(filters);
rule.setProcessor(processor);
rule.setAction(action);
rule.setAdditionalInfo(additionalInfo);
return rule;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RuleMetaDataEntity that = (RuleMetaDataEntity) o;
return weight == that.weight &&
Objects.equals(id, that.id) &&
Objects.equals(tenantId, that.tenantId) &&
Objects.equals(name, that.name) &&
Objects.equals(pluginToken, that.pluginToken) &&
Objects.equals(state, that.state) &&
Objects.equals(searchText, that.searchText);
}
@Override
public int hashCode() {
return Objects.hash(id, tenantId, name, pluginToken, state, weight, searchText);
}
@Override
public String toString() {
return "RuleMetaDataEntity{" +
"id=" + id +
", tenantId=" + tenantId +
", name='" + name + '\'' +
", pluginToken='" + pluginToken + '\'' +
", state='" + state + '\'' +
", weight=" + weight +
", searchText='" + searchText + '\'' +
'}';
}
}

351
dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java

@ -0,0 +1,351 @@
/**
* 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.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 org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import com.fasterxml.jackson.databind.JsonNode;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.TENANT_COLUMN_FAMILY_NAME)
public final class TenantEntity implements SearchTextEntity<Tenant> {
@Transient
private static final long serialVersionUID = -4330655990232136337L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.TENANT_TITLE_PROPERTY)
private String title;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ModelConstants.TENANT_REGION_PROPERTY)
private String region;
@Column(name = ModelConstants.COUNTRY_PROPERTY)
private String country;
@Column(name = ModelConstants.STATE_PROPERTY)
private String state;
@Column(name = ModelConstants.CITY_PROPERTY)
private String city;
@Column(name = ModelConstants.ADDRESS_PROPERTY)
private String address;
@Column(name = ModelConstants.ADDRESS2_PROPERTY)
private String address2;
@Column(name = ModelConstants.ZIP_PROPERTY)
private String zip;
@Column(name = ModelConstants.PHONE_PROPERTY)
private String phone;
@Column(name = ModelConstants.EMAIL_PROPERTY)
private String email;
@Column(name = ModelConstants.TENANT_ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public TenantEntity() {
super();
}
public TenantEntity(Tenant tenant) {
if (tenant.getId() != null) {
this.id = tenant.getId().getId();
}
this.title = tenant.getTitle();
this.region = tenant.getRegion();
this.country = tenant.getCountry();
this.state = tenant.getState();
this.city = tenant.getCity();
this.address = tenant.getAddress();
this.address2 = tenant.getAddress2();
this.zip = tenant.getZip();
this.phone = tenant.getPhone();
this.email = tenant.getEmail();
this.additionalInfo = tenant.getAdditionalInfo();
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public JsonNode getAdditionalInfo() {
return additionalInfo;
}
public void setAdditionalInfo(JsonNode additionalInfo) {
this.additionalInfo = additionalInfo;
}
@Override
public String getSearchTextSource() {
return title;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
public String getSearchText() {
return searchText;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode());
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + ((address2 == null) ? 0 : address2.hashCode());
result = prime * result + ((city == null) ? 0 : city.hashCode());
result = prime * result + ((country == null) ? 0 : country.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((phone == null) ? 0 : phone.hashCode());
result = prime * result + ((region == null) ? 0 : region.hashCode());
result = prime * result + ((state == null) ? 0 : state.hashCode());
result = prime * result + ((title == null) ? 0 : title.hashCode());
result = prime * result + ((zip == null) ? 0 : zip.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TenantEntity other = (TenantEntity) obj;
if (additionalInfo == null) {
if (other.additionalInfo != null)
return false;
} else if (!additionalInfo.equals(other.additionalInfo))
return false;
if (address == null) {
if (other.address != null)
return false;
} else if (!address.equals(other.address))
return false;
if (address2 == null) {
if (other.address2 != null)
return false;
} else if (!address2.equals(other.address2))
return false;
if (city == null) {
if (other.city != null)
return false;
} else if (!city.equals(other.city))
return false;
if (country == null) {
if (other.country != null)
return false;
} else if (!country.equals(other.country))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (phone == null) {
if (other.phone != null)
return false;
} else if (!phone.equals(other.phone))
return false;
if (region == null) {
if (other.region != null)
return false;
} else if (!region.equals(other.region))
return false;
if (state == null) {
if (other.state != null)
return false;
} else if (!state.equals(other.state))
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
if (zip == null) {
if (other.zip != null)
return false;
} else if (!zip.equals(other.zip))
return false;
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("TenantEntity [id=");
builder.append(id);
builder.append(", title=");
builder.append(title);
builder.append(", region=");
builder.append(region);
builder.append(", country=");
builder.append(country);
builder.append(", state=");
builder.append(state);
builder.append(", city=");
builder.append(city);
builder.append(", address=");
builder.append(address);
builder.append(", address2=");
builder.append(address2);
builder.append(", zip=");
builder.append(zip);
builder.append(", phone=");
builder.append(phone);
builder.append(", email=");
builder.append(email);
builder.append(", additionalInfo=");
builder.append(additionalInfo);
builder.append("]");
return builder.toString();
}
@Override
public Tenant toData() {
Tenant tenant = new Tenant(new TenantId(id));
tenant.setCreatedTime(UUIDs.unixTimestamp(id));
tenant.setTitle(title);
tenant.setRegion(region);
tenant.setCountry(country);
tenant.setState(state);
tenant.setCity(city);
tenant.setAddress(address);
tenant.setAddress2(address2);
tenant.setZip(zip);
tenant.setPhone(phone);
tenant.setEmail(email);
tenant.setAdditionalInfo(additionalInfo);
return tenant;
}
}

189
dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java

@ -0,0 +1,189 @@
/**
* 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.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 org.thingsboard.server.common.data.id.UserCredentialsId;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.USER_CREDENTIALS_COLUMN_FAMILY_NAME)
public final class UserCredentialsEntity implements BaseEntity<UserCredentials> {
@Transient
private static final long serialVersionUID = 1348221414123438374L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY)
private UUID userId;
@Column(name = ModelConstants.USER_CREDENTIALS_ENABLED_PROPERTY)
private boolean enabled;
@Column(name = ModelConstants.USER_CREDENTIALS_PASSWORD_PROPERTY)
private String password;
@Column(name = ModelConstants.USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY)
private String activateToken;
@Column(name = ModelConstants.USER_CREDENTIALS_RESET_TOKEN_PROPERTY)
private String resetToken;
public UserCredentialsEntity() {
super();
}
public UserCredentialsEntity(UserCredentials userCredentials) {
if (userCredentials.getId() != null) {
this.id = userCredentials.getId().getId();
}
if (userCredentials.getUserId() != null) {
this.userId = userCredentials.getUserId().getId();
}
this.enabled = userCredentials.isEnabled();
this.password = userCredentials.getPassword();
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() {
final int prime = 31;
int result = 1;
result = prime * result + ((activateToken == null) ? 0 : activateToken.hashCode());
result = prime * result + (enabled ? 1231 : 1237);
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((password == null) ? 0 : password.hashCode());
result = prime * result + ((resetToken == null) ? 0 : resetToken.hashCode());
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserCredentialsEntity other = (UserCredentialsEntity) obj;
if (activateToken == null) {
if (other.activateToken != null)
return false;
} else if (!activateToken.equals(other.activateToken))
return false;
if (enabled != other.enabled)
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (resetToken == null) {
if (other.resetToken != null)
return false;
} else if (!resetToken.equals(other.resetToken))
return false;
if (userId == null) {
if (other.userId != null)
return false;
} else if (!userId.equals(other.userId))
return false;
return true;
}
@Override
public UserCredentials toData() {
UserCredentials userCredentials = new UserCredentials(new UserCredentialsId(id));
userCredentials.setCreatedTime(UUIDs.unixTimestamp(id));
if (userId != null) {
userCredentials.setUserId(new UserId(userId));
}
userCredentials.setEnabled(enabled);
userCredentials.setPassword(password);
userCredentials.setActivateToken(activateToken);
userCredentials.setResetToken(resetToken);
return userCredentials;
}
}

274
dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java

@ -0,0 +1,274 @@
/**
* 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.model.sql;
import com.datastax.driver.core.utils.UUIDs;
import com.fasterxml.jackson.databind.JsonNode;
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 javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.UUID;
/**
* @author Valerii Sosliuk
*/
@Entity
@Table(name= ModelConstants.USER_COLUMN_FAMILY_NAME)
public class UserEntity implements SearchTextEntity<User> {
@Transient
private static final long serialVersionUID = 4349485207981226785L;
@Id
@Column(name=ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.USER_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.USER_CUSTOMER_ID_PROPERTY)
private UUID customerId;
@Column(name = ModelConstants.USER_AUTHORITY_PROPERTY)
private Authority authority;
@Column(name = ModelConstants.USER_EMAIL_PROPERTY)
private String email;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ModelConstants.USER_FIRST_NAME_PROPERTY)
private String firstName;
@Column(name = ModelConstants.USER_LAST_NAME_PROPERTY)
private String lastName;
@Column(name = ModelConstants.USER_ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public UserEntity(User user) {
if (user.getId() != null) {
this.id = user.getId().getId();
}
this.authority = user.getAuthority();
if (user.getTenantId() != null) {
this.tenantId = user.getTenantId().getId();
}
if (user.getCustomerId() != null) {
this.customerId = user.getCustomerId().getId();
}
this.email = user.getEmail();
this.firstName = user.getFirstName();
this.lastName = user.getLastName();
this.additionalInfo = user.getAdditionalInfo();
}
public String getSearchText() {
return searchText;
}
@Override
public String getSearchTextSource() {
return searchText;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
@Override
public UUID getId() {
return id;
}
@Override
public void setId(UUID id) {
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();
builder.append("UserEntity [id=");
builder.append(id);
builder.append(", authority=");
builder.append(authority);
builder.append(", tenantId=");
builder.append(tenantId);
builder.append(", customerId=");
builder.append(customerId);
builder.append(", email=");
builder.append(email);
builder.append(", firstName=");
builder.append(firstName);
builder.append(", lastName=");
builder.append(lastName);
builder.append(", additionalInfo=");
builder.append(additionalInfo);
builder.append("]");
return builder.toString();
}
@Override
public User toData() {
User user = new User(new UserId(id));
user.setCreatedTime(UUIDs.unixTimestamp(id));
user.setAuthority(authority);
if (tenantId != null) {
user.setTenantId(new TenantId(tenantId));
}
if (customerId != null) {
user.setCustomerId(new CustomerId(customerId));
}
user.setEmail(email);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setAdditionalInfo(additionalInfo);
return user;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode());
result = prime * result + ((authority == null) ? 0 : authority.hashCode());
result = prime * result + ((customerId == null) ? 0 : customerId.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserEntity other = (UserEntity) obj;
if (additionalInfo == null) {
if (other.additionalInfo != null)
return false;
} else if (!additionalInfo.equals(other.additionalInfo))
return false;
if (authority != other.authority)
return false;
if (customerId == null) {
if (other.customerId != null)
return false;
} else if (!customerId.equals(other.customerId))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
if (tenantId == null) {
if (other.tenantId != null)
return false;
} else if (!tenantId.equals(other.tenantId))
return false;
return true;
}
}

183
dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java

@ -0,0 +1,183 @@
/**
* 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.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 com.datastax.driver.mapping.annotations.PartitionKey;
import com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.WidgetTypeId;
import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.WIDGET_TYPE_COLUMN_FAMILY_NAME)
public final class WidgetTypeEntity implements BaseEntity<WidgetType> {
@Transient
private static final long serialVersionUID = -5436279069884988630L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@PartitionKey(value = 1)
@Column(name = ModelConstants.WIDGET_TYPE_TENANT_ID_PROPERTY)
private UUID tenantId;
@PartitionKey(value = 2)
@Column(name = ModelConstants.WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY)
private String bundleAlias;
@Column(name = ModelConstants.WIDGET_TYPE_ALIAS_PROPERTY)
private String alias;
@Column(name = ModelConstants.WIDGET_TYPE_NAME_PROPERTY)
private String name;
@Column(name = ModelConstants.WIDGET_TYPE_DESCRIPTOR_PROPERTY)
private JsonNode descriptor;
public WidgetTypeEntity() {
super();
}
public WidgetTypeEntity(WidgetType widgetType) {
if (widgetType.getId() != null) {
this.id = widgetType.getId().getId();
}
if (widgetType.getTenantId() != null) {
this.tenantId = widgetType.getTenantId().getId();
}
this.bundleAlias = widgetType.getBundleAlias();
this.alias = widgetType.getAlias();
this.name = widgetType.getName();
this.descriptor = widgetType.getDescriptor();
}
@Override
public UUID getId() {
return id;
}
@Override
public void setId(UUID id) {
this.id = id;
}
public UUID getTenantId() {
return tenantId;
}
public void setTenantId(UUID tenantId) {
this.tenantId = tenantId;
}
public String getBundleAlias() {
return bundleAlias;
}
public void setBundleAlias(String bundleAlias) {
this.bundleAlias = bundleAlias;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public JsonNode getDescriptor() {
return descriptor;
}
public void setDescriptor(JsonNode descriptor) {
this.descriptor = descriptor;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (tenantId != null ? tenantId.hashCode() : 0);
result = 31 * result + (bundleAlias != null ? bundleAlias.hashCode() : 0);
result = 31 * result + (alias != null ? alias.hashCode() : 0);
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (descriptor != null ? descriptor.hashCode() : 0);
return result;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
WidgetTypeEntity that = (WidgetTypeEntity) o;
if (id != null ? !id.equals(that.id) : that.id != null) return false;
if (tenantId != null ? !tenantId.equals(that.tenantId) : that.tenantId != null) return false;
if (bundleAlias != null ? !bundleAlias.equals(that.bundleAlias) : that.bundleAlias != null) return false;
if (alias != null ? !alias.equals(that.alias) : that.alias != null) return false;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
return descriptor != null ? descriptor.equals(that.descriptor) : that.descriptor == null;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("WidgetTypeEntity{");
sb.append("id=").append(id);
sb.append(", tenantId=").append(tenantId);
sb.append(", bundleAlias='").append(bundleAlias).append('\'');
sb.append(", alias='").append(alias).append('\'');
sb.append(", name='").append(name).append('\'');
sb.append(", descriptor=").append(descriptor);
sb.append('}');
return sb.toString();
}
@Override
public WidgetType toData() {
WidgetType widgetType = new WidgetType(new WidgetTypeId(id));
widgetType.setCreatedTime(UUIDs.unixTimestamp(id));
if (tenantId != null) {
widgetType.setTenantId(new TenantId(tenantId));
}
widgetType.setBundleAlias(bundleAlias);
widgetType.setAlias(alias);
widgetType.setName(name);
widgetType.setDescriptor(descriptor);
return widgetType;
}
}

190
dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java

@ -0,0 +1,190 @@
/**
* 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.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 org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.WidgetsBundleId;
import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.nio.ByteBuffer;
import java.util.UUID;
@Entity
@Table(name = ModelConstants.WIDGETS_BUNDLE_COLUMN_FAMILY_NAME)
public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle> {
@Transient
private static final long serialVersionUID = 6897035686422298096L;
@Id
@Column(name = ModelConstants.ID_PROPERTY)
private UUID id;
@Column(name = ModelConstants.WIDGETS_BUNDLE_TENANT_ID_PROPERTY)
private UUID tenantId;
@Column(name = ModelConstants.WIDGETS_BUNDLE_ALIAS_PROPERTY)
private String alias;
@Column(name = ModelConstants.WIDGETS_BUNDLE_TITLE_PROPERTY)
private String title;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ModelConstants.WIDGETS_BUNDLE_IMAGE_PROPERTY)
private ByteBuffer image;
public WidgetsBundleEntity() {
super();
}
public WidgetsBundleEntity(WidgetsBundle widgetsBundle) {
if (widgetsBundle.getId() != null) {
this.id = widgetsBundle.getId().getId();
}
if (widgetsBundle.getTenantId() != null) {
this.tenantId = widgetsBundle.getTenantId().getId();
}
this.alias = widgetsBundle.getAlias();
this.title = widgetsBundle.getTitle();
if (widgetsBundle.getImage() != null) {
this.image = ByteBuffer.wrap(widgetsBundle.getImage());
}
}
@Override
public UUID getId() {
return id;
}
@Override
public void setId(UUID id) {
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;
}
@Override
public void setSearchText(String searchText) {
this.searchText = searchText;
}
public String getSearchText() {
return searchText;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (tenantId != null ? tenantId.hashCode() : 0);
result = 31 * result + (alias != null ? alias.hashCode() : 0);
result = 31 * result + (title != null ? title.hashCode() : 0);
result = 31 * result + (searchText != null ? searchText.hashCode() : 0);
result = 31 * result + (image != null ? image.hashCode() : 0);
return result;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
WidgetsBundleEntity that = (WidgetsBundleEntity) o;
if (id != null ? !id.equals(that.id) : that.id != null) return false;
if (tenantId != null ? !tenantId.equals(that.tenantId) : that.tenantId != null) return false;
if (alias != null ? !alias.equals(that.alias) : that.alias != null) return false;
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
public String toString() {
final StringBuilder sb = new StringBuilder("WidgetsBundleEntity{");
sb.append("id=").append(id);
sb.append(", tenantId=").append(tenantId);
sb.append(", alias='").append(alias).append('\'');
sb.append(", title='").append(title).append('\'');
sb.append(", searchText='").append(searchText).append('\'');
sb.append(", image=").append(image);
sb.append('}');
return sb.toString();
}
@Override
public WidgetsBundle toData() {
WidgetsBundle widgetsBundle = new WidgetsBundle(new WidgetsBundleId(id));
widgetsBundle.setCreatedTime(UUIDs.unixTimestamp(id));
if (tenantId != null) {
widgetsBundle.setTenantId(new TenantId(tenantId));
}
widgetsBundle.setAlias(alias);
widgetsBundle.setTitle(title);
if (image != null) {
byte[] imageByteArray = new byte[image.remaining()];
image.get(imageByteArray);
widgetsBundle.setImage(imageByteArray);
}
return widgetsBundle;
}
}

49
dao/src/main/java/org/thingsboard/server/dao/plugin/BasePluginService.java

@ -17,8 +17,6 @@ package org.thingsboard.server.dao.plugin;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.id.PluginId;
@ -29,13 +27,12 @@ import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.data.plugin.PluginMetaData;
import org.thingsboard.server.common.data.rule.RuleMetaData;
import org.thingsboard.server.dao.component.ComponentDescriptorService;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.exception.DatabaseException;
import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.PluginMetaDataEntity;
import org.thingsboard.server.dao.model.RuleMetaDataEntity;
import org.thingsboard.server.dao.rule.RuleDao;
import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover;
@ -46,9 +43,6 @@ import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
@Service
@Slf4j
public class BasePluginService implements PluginService {
@ -73,7 +67,7 @@ public class BasePluginService implements PluginService {
plugin.setTenantId(SYSTEM_TENANT);
}
if (plugin.getId() != null) {
PluginMetaData oldVersion = getData(pluginDao.findById(plugin.getId()));
PluginMetaData oldVersion = pluginDao.findById(plugin.getId());
if (plugin.getState() == null) {
plugin.setState(oldVersion.getState());
} else if (plugin.getState() != oldVersion.getState()) {
@ -92,33 +86,32 @@ public class BasePluginService implements PluginService {
} else if (!ComponentType.PLUGIN.equals(descriptor.getType())) {
throw new IncorrectParameterException("Plugin class is actually " + descriptor.getType() + "!");
}
PluginMetaDataEntity entity = pluginDao.findByApiToken(plugin.getApiToken());
if (entity != null && (plugin.getId() == null || !entity.getId().equals(plugin.getId().getId()))) {
PluginMetaData savedPlugin = pluginDao.findByApiToken(plugin.getApiToken());
if (savedPlugin != null && (plugin.getId() == null || !savedPlugin.getId().getId().equals(plugin.getId().getId()))) {
throw new IncorrectParameterException("API token is already reserved!");
}
if (!componentDescriptorService.validate(descriptor, plugin.getConfiguration())) {
throw new IncorrectParameterException("Filters configuration is not valid!");
}
return getData(pluginDao.save(plugin));
return pluginDao.save(plugin);
}
@Override
public PluginMetaData findPluginById(PluginId pluginId) {
Validator.validateId(pluginId, "Incorrect plugin id for search request.");
return getData(pluginDao.findById(pluginId));
return pluginDao.findById(pluginId);
}
@Override
public PluginMetaData findPluginByApiToken(String apiToken) {
Validator.validateString(apiToken, "Incorrect plugin apiToken for search request.");
return getData(pluginDao.findByApiToken(apiToken));
return pluginDao.findByApiToken(apiToken);
}
@Override
public TextPageData<PluginMetaData> findSystemPlugins(TextPageLink pageLink) {
Validator.validatePageLink(pageLink, "Incorrect PageLink object for search system plugin request.");
List<PluginMetaDataEntity> pluginEntities = pluginDao.findByTenantIdAndPageLink(SYSTEM_TENANT, pageLink);
List<PluginMetaData> plugins = convertDataList(pluginEntities);
List<PluginMetaData> plugins = pluginDao.findByTenantIdAndPageLink(SYSTEM_TENANT, pageLink);
return new TextPageData<>(plugins, pageLink);
}
@ -126,8 +119,7 @@ public class BasePluginService implements PluginService {
public TextPageData<PluginMetaData> findTenantPlugins(TenantId tenantId, TextPageLink pageLink) {
Validator.validateId(tenantId, "Incorrect tenant id for search plugins request.");
Validator.validatePageLink(pageLink, "Incorrect PageLink object for search plugin request.");
List<PluginMetaDataEntity> pluginEntities = pluginDao.findByTenantIdAndPageLink(tenantId, pageLink);
List<PluginMetaData> plugins = convertDataList(pluginEntities);
List<PluginMetaData> plugins = pluginDao.findByTenantIdAndPageLink(tenantId, pageLink);
return new TextPageData<>(plugins, pageLink);
}
@ -152,8 +144,7 @@ public class BasePluginService implements PluginService {
log.trace("Executing findAllTenantPluginsByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<PluginMetaDataEntity> pluginsEntities = pluginDao.findAllTenantPluginsByTenantId(tenantId.getId(), pageLink);
List<PluginMetaData> plugins = convertDataList(pluginsEntities);
List<PluginMetaData> plugins = pluginDao.findAllTenantPluginsByTenantId(tenantId.getId(), pageLink);
return new TextPageData<>(plugins, pageLink);
}
@ -181,8 +172,8 @@ public class BasePluginService implements PluginService {
@Override
public void suspendPluginById(PluginId pluginId) {
PluginMetaDataEntity plugin = pluginDao.findById(pluginId);
List<RuleMetaDataEntity> affectedRules = ruleDao.findRulesByPlugin(plugin.getApiToken())
PluginMetaData plugin = pluginDao.findById(pluginId);
List<RuleMetaData> affectedRules = ruleDao.findRulesByPlugin(plugin.getApiToken())
.stream().filter(rule -> rule.getState() == ComponentLifecycleState.ACTIVE).collect(Collectors.toList());
if (affectedRules.isEmpty()) {
updateLifeCycleState(pluginId, ComponentLifecycleState.SUSPENDED);
@ -193,7 +184,7 @@ public class BasePluginService implements PluginService {
private void updateLifeCycleState(PluginId pluginId, ComponentLifecycleState state) {
Validator.validateId(pluginId, "Incorrect plugin id for state change request.");
PluginMetaDataEntity plugin = pluginDao.findById(pluginId);
PluginMetaData plugin = pluginDao.findById(pluginId);
if (plugin != null) {
plugin.setState(state);
pluginDao.save(plugin);
@ -209,8 +200,8 @@ public class BasePluginService implements PluginService {
}
private void checkRulesAndDelete(UUID pluginId) {
PluginMetaDataEntity plugin = pluginDao.findById(pluginId);
List<RuleMetaDataEntity> affectedRules = ruleDao.findRulesByPlugin(plugin.getApiToken());
PluginMetaData plugin = pluginDao.findById(pluginId);
List<RuleMetaData> affectedRules = ruleDao.findRulesByPlugin(plugin.getApiToken());
if (affectedRules.isEmpty()) {
pluginDao.deleteById(pluginId);
} else {
@ -244,17 +235,17 @@ public class BasePluginService implements PluginService {
}
};
private PaginatedRemover<TenantId, PluginMetaDataEntity> tenantPluginRemover =
new PaginatedRemover<TenantId, PluginMetaDataEntity>() {
private PaginatedRemover<TenantId, PluginMetaData> tenantPluginRemover =
new PaginatedRemover<TenantId, PluginMetaData>() {
@Override
protected List<PluginMetaDataEntity> findEntities(TenantId id, TextPageLink pageLink) {
protected List<PluginMetaData> findEntities(TenantId id, TextPageLink pageLink) {
return pluginDao.findByTenantIdAndPageLink(id, pageLink);
}
@Override
protected void removeEntity(PluginMetaDataEntity entity) {
checkRulesAndDelete(entity.getId());
protected void removeEntity(PluginMetaData entity) {
checkRulesAndDelete(entity.getUuidId());
}
};
}

41
dao/src/main/java/org/thingsboard/server/dao/plugin/BasePluginDao.java → dao/src/main/java/org/thingsboard/server/dao/plugin/CassandraBasePluginDao.java

@ -15,19 +15,17 @@
*/
package org.thingsboard.server.dao.plugin;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.querybuilder.Select;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.id.PluginId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.plugin.PluginMetaData;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.PluginMetaDataEntity;
import org.thingsboard.server.dao.model.nosql.PluginMetaDataEntity;
import java.util.Arrays;
import java.util.List;
@ -38,7 +36,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@Component
@Slf4j
public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> implements PluginDao {
public class CassandraBasePluginDao extends CassandraAbstractSearchTextDao<PluginMetaDataEntity, PluginMetaData> implements PluginDao {
@Override
protected Class<PluginMetaDataEntity> getColumnFamilyClass() {
@ -51,24 +49,19 @@ public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> i
}
@Override
public PluginMetaDataEntity save(PluginMetaData plugin) {
return save(new PluginMetaDataEntity(plugin));
}
@Override
public PluginMetaDataEntity findById(PluginId pluginId) {
public PluginMetaData findById(PluginId pluginId) {
log.debug("Search plugin meta-data entity by id [{}]", pluginId);
PluginMetaDataEntity entity = super.findById(pluginId.getId());
PluginMetaData pluginMetaData = super.findById(pluginId.getId());
if (log.isTraceEnabled()) {
log.trace("Search result: [{}] for plugin entity [{}]", entity != null, entity);
log.trace("Search result: [{}] for plugin entity [{}]", pluginMetaData != null, pluginMetaData);
} else {
log.debug("Search result: [{}]", entity != null);
log.debug("Search result: [{}]", pluginMetaData != null);
}
return entity;
return pluginMetaData;
}
@Override
public PluginMetaDataEntity findByApiToken(String apiToken) {
public PluginMetaData findByApiToken(String apiToken) {
log.debug("Search plugin meta-data entity by api token [{}]", apiToken);
Select.Where query = select().from(ModelConstants.PLUGIN_BY_API_TOKEN_COLUMN_FAMILY_NAME).where(eq(ModelConstants.PLUGIN_API_TOKEN_PROPERTY, apiToken));
log.trace("Execute query [{}]", query);
@ -78,14 +71,14 @@ public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> i
} else {
log.debug("Search result: [{}]", entity != null);
}
return entity;
return DaoUtil.getData(entity);
}
@Override
public void deleteById(UUID id) {
log.debug("Delete plugin meta-data entity by id [{}]", id);
ResultSet resultSet = removeById(id);
log.debug("Delete result: [{}]", resultSet.wasApplied());
boolean result = removeById(id);
log.debug("Delete result: [{}]", result);
}
@Override
@ -94,7 +87,7 @@ public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> i
}
@Override
public List<PluginMetaDataEntity> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
public List<PluginMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
log.debug("Try to find plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<PluginMetaDataEntity> entities = findPageWithTextSearch(ModelConstants.PLUGIN_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(ModelConstants.PLUGIN_TENANT_ID_PROPERTY, tenantId.getId())), pageLink);
@ -103,11 +96,11 @@ public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> i
} else {
log.debug("Search result: [{}]", entities.size());
}
return entities;
return DaoUtil.convertDataList(entities);
}
@Override
public List<PluginMetaDataEntity> findAllTenantPluginsByTenantId(UUID tenantId, TextPageLink pageLink) {
public List<PluginMetaData> findAllTenantPluginsByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find all tenant plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<PluginMetaDataEntity> pluginEntities = findPageWithTextSearch(ModelConstants.PLUGIN_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(in(ModelConstants.PLUGIN_TENANT_ID_PROPERTY, Arrays.asList(NULL_UUID, tenantId))),
@ -117,7 +110,7 @@ public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> i
} else {
log.debug("Search result: [{}]", pluginEntities.size());
}
return pluginEntities;
return DaoUtil.convertDataList(pluginEntities);
}
}

13
dao/src/main/java/org/thingsboard/server/dao/plugin/PluginDao.java

@ -20,24 +20,23 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.plugin.PluginMetaData;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.PluginMetaDataEntity;
import java.util.List;
import java.util.UUID;
public interface PluginDao extends Dao<PluginMetaDataEntity> {
public interface PluginDao extends Dao<PluginMetaData> {
PluginMetaDataEntity save(PluginMetaData plugin);
PluginMetaData save(PluginMetaData plugin);
PluginMetaDataEntity findById(PluginId pluginId);
PluginMetaData findById(PluginId pluginId);
PluginMetaDataEntity findByApiToken(String apiToken);
PluginMetaData findByApiToken(String apiToken);
void deleteById(UUID id);
void deleteById(PluginId pluginId);
List<PluginMetaDataEntity> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink);
List<PluginMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink);
/**
* Find all tenant plugins (including system) by tenantId and page link.
@ -46,6 +45,6 @@ public interface PluginDao extends Dao<PluginMetaDataEntity> {
* @param pageLink the page link
* @return the list of plugins objects
*/
List<PluginMetaDataEntity> findAllTenantPluginsByTenantId(UUID tenantId, TextPageLink pageLink);
List<PluginMetaData> findAllTenantPluginsByTenantId(UUID tenantId, TextPageLink pageLink);
}

39
dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleService.java

@ -34,7 +34,6 @@ import org.thingsboard.server.dao.component.ComponentDescriptorService;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.exception.DatabaseException;
import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.model.RuleMetaDataEntity;
import org.thingsboard.server.dao.plugin.PluginService;
import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover;
@ -45,8 +44,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
import static org.thingsboard.server.dao.service.Validator.validateId;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
@ -74,7 +71,7 @@ public class BaseRuleService implements RuleService {
rule.setTenantId(systemTenantId);
}
if (rule.getId() != null) {
RuleMetaData oldVersion = getData(ruleDao.findById(rule.getId()));
RuleMetaData oldVersion = ruleDao.findById(rule.getId());
if (rule.getState() == null) {
rule.setState(oldVersion.getState());
} else if (rule.getState() != oldVersion.getState()) {
@ -94,7 +91,7 @@ public class BaseRuleService implements RuleService {
}
validateComponentJson(rule.getAction(), ComponentType.ACTION);
validateRuleAndPluginState(rule);
return getData(ruleDao.save(rule));
return ruleDao.save(rule);
}
private void validateFilters(JsonNode filtersJson) {
@ -163,30 +160,27 @@ public class BaseRuleService implements RuleService {
@Override
public RuleMetaData findRuleById(RuleId ruleId) {
validateId(ruleId, "Incorrect rule id for search rule request.");
return getData(ruleDao.findById(ruleId.getId()));
return ruleDao.findById(ruleId.getId());
}
@Override
public List<RuleMetaData> findPluginRules(String pluginToken) {
List<RuleMetaDataEntity> ruleEntities = ruleDao.findRulesByPlugin(pluginToken);
return convertDataList(ruleEntities);
return ruleDao.findRulesByPlugin(pluginToken);
}
@Override
public TextPageData<RuleMetaData> findSystemRules(TextPageLink pageLink) {
validatePageLink(pageLink, "Incorrect PageLink object for search rule request.");
List<RuleMetaDataEntity> ruleEntities = ruleDao.findByTenantIdAndPageLink(systemTenantId, pageLink);
List<RuleMetaData> plugins = convertDataList(ruleEntities);
return new TextPageData<>(plugins, pageLink);
List<RuleMetaData> rules = ruleDao.findByTenantIdAndPageLink(systemTenantId, pageLink);
return new TextPageData<>(rules, pageLink);
}
@Override
public TextPageData<RuleMetaData> findTenantRules(TenantId tenantId, TextPageLink pageLink) {
validateId(tenantId, "Incorrect tenant id for search rule request.");
validatePageLink(pageLink, "Incorrect PageLink object for search rule request.");
List<RuleMetaDataEntity> ruleEntities = ruleDao.findByTenantIdAndPageLink(tenantId, pageLink);
List<RuleMetaData> plugins = convertDataList(ruleEntities);
return new TextPageData<>(plugins, pageLink);
List<RuleMetaData> rules = ruleDao.findByTenantIdAndPageLink(tenantId, pageLink);
return new TextPageData<>(rules, pageLink);
}
@Override
@ -210,8 +204,7 @@ public class BaseRuleService implements RuleService {
log.trace("Executing findAllTenantRulesByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<RuleMetaDataEntity> rulesEntities = ruleDao.findAllTenantRulesByTenantId(tenantId.getId(), pageLink);
List<RuleMetaData> rules = convertDataList(rulesEntities);
List<RuleMetaData> rules = ruleDao.findAllTenantRulesByTenantId(tenantId.getId(), pageLink);
return new TextPageData<>(rules, pageLink);
}
@ -251,10 +244,10 @@ public class BaseRuleService implements RuleService {
private void updateLifeCycleState(RuleId ruleId, ComponentLifecycleState state) {
Validator.validateId(ruleId, "Incorrect rule id for state change request.");
RuleMetaDataEntity rule = ruleDao.findById(ruleId);
RuleMetaData rule = ruleDao.findById(ruleId);
if (rule != null) {
rule.setState(state);
validateRuleAndPluginState(getData(rule));
validateRuleAndPluginState(rule);
ruleDao.save(rule);
} else {
throw new DatabaseException("Plugin not found!");
@ -277,17 +270,17 @@ public class BaseRuleService implements RuleService {
}
};
private PaginatedRemover<TenantId, RuleMetaDataEntity> tenantRulesRemover =
new PaginatedRemover<TenantId, RuleMetaDataEntity>() {
private PaginatedRemover<TenantId, RuleMetaData> tenantRulesRemover =
new PaginatedRemover<TenantId, RuleMetaData>() {
@Override
protected List<RuleMetaDataEntity> findEntities(TenantId id, TextPageLink pageLink) {
protected List<RuleMetaData> findEntities(TenantId id, TextPageLink pageLink) {
return ruleDao.findByTenantIdAndPageLink(id, pageLink);
}
@Override
protected void removeEntity(RuleMetaDataEntity entity) {
ruleDao.deleteById(entity.getId());
protected void removeEntity(RuleMetaData entity) {
ruleDao.deleteById(entity.getUuidId());
}
};

31
dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleDao.java → dao/src/main/java/org/thingsboard/server/dao/rule/CassandraBaseRuleDao.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.rule;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.querybuilder.Select;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -23,9 +22,10 @@ import org.thingsboard.server.common.data.id.RuleId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.rule.RuleMetaData;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.RuleMetaDataEntity;
import org.thingsboard.server.dao.model.nosql.RuleMetaDataEntity;
import java.util.Arrays;
import java.util.List;
@ -36,7 +36,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@Component
@Slf4j
public class BaseRuleDao extends AbstractSearchTextDao<RuleMetaDataEntity> implements RuleDao {
public class CassandraBaseRuleDao extends CassandraAbstractSearchTextDao<RuleMetaDataEntity, RuleMetaData> implements RuleDao {
@Override
protected Class<RuleMetaDataEntity> getColumnFamilyClass() {
@ -49,17 +49,12 @@ public class BaseRuleDao extends AbstractSearchTextDao<RuleMetaDataEntity> imple
}
@Override
public RuleMetaDataEntity findById(RuleId ruleId) {
public RuleMetaData findById(RuleId ruleId) {
return findById(ruleId.getId());
}
@Override
public RuleMetaDataEntity save(RuleMetaData rule) {
return save(new RuleMetaDataEntity(rule));
}
@Override
public List<RuleMetaDataEntity> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
public List<RuleMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
log.debug("Try to find rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<RuleMetaDataEntity> entities = findPageWithTextSearch(ModelConstants.RULE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(ModelConstants.RULE_TENANT_ID_PROPERTY, tenantId.getId())), pageLink);
@ -68,11 +63,11 @@ public class BaseRuleDao extends AbstractSearchTextDao<RuleMetaDataEntity> imple
} else {
log.debug("Search result: [{}]", entities.size());
}
return entities;
return DaoUtil.convertDataList(entities);
}
@Override
public List<RuleMetaDataEntity> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink) {
public List<RuleMetaData> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find all tenant rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<RuleMetaDataEntity> entities = findPageWithTextSearch(ModelConstants.RULE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(in(ModelConstants.RULE_TENANT_ID_PROPERTY, Arrays.asList(NULL_UUID, tenantId))),
@ -82,23 +77,23 @@ public class BaseRuleDao extends AbstractSearchTextDao<RuleMetaDataEntity> imple
} else {
log.debug("Search result: [{}]", entities.size());
}
return entities;
return DaoUtil.convertDataList(entities);
}
@Override
public List<RuleMetaDataEntity> findRulesByPlugin(String pluginToken) {
public List<RuleMetaData> findRulesByPlugin(String pluginToken) {
log.debug("Search rules by api token [{}]", pluginToken);
Select select = select().from(ModelConstants.RULE_BY_PLUGIN_TOKEN);
Select.Where query = select.where();
query.and(eq(ModelConstants.RULE_PLUGIN_TOKEN_PROPERTY, pluginToken));
return findListByStatement(query);
return DaoUtil.convertDataList(findListByStatement(query));
}
@Override
public void deleteById(UUID id) {
log.debug("Delete rule meta-data entity by id [{}]", id);
ResultSet resultSet = removeById(id);
log.debug("Delete result: [{}]", resultSet.wasApplied());
boolean result = removeById(id);
log.debug("Delete result: [{}]", result);
}
@Override

13
dao/src/main/java/org/thingsboard/server/dao/rule/RuleDao.java

@ -20,20 +20,19 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.rule.RuleMetaData;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.RuleMetaDataEntity;
import java.util.List;
import java.util.UUID;
public interface RuleDao extends Dao<RuleMetaDataEntity> {
public interface RuleDao extends Dao<RuleMetaData> {
RuleMetaDataEntity save(RuleMetaData rule);
RuleMetaData save(RuleMetaData rule);
RuleMetaDataEntity findById(RuleId ruleId);
RuleMetaData findById(RuleId ruleId);
List<RuleMetaDataEntity> findRulesByPlugin(String pluginToken);
List<RuleMetaData> findRulesByPlugin(String pluginToken);
List<RuleMetaDataEntity> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink);
List<RuleMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink);
/**
* Find all tenant rules (including system) by tenantId and page link.
@ -42,7 +41,7 @@ public interface RuleDao extends Dao<RuleMetaDataEntity> {
* @param pageLink the page link
* @return the list of rules objects
*/
List<RuleMetaDataEntity> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink);
List<RuleMetaData> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink);
void deleteById(UUID id);

11
dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java

@ -15,18 +15,15 @@
*/
package org.thingsboard.server.dao.service;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.validator.routines.EmailValidator;
import org.thingsboard.server.common.data.BaseData;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.JsonNode;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
@Slf4j
public abstract class DataValidator<D extends BaseData<?>> {

30
dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java

@ -15,33 +15,35 @@
*/
package org.thingsboard.server.dao.service;
import org.thingsboard.server.common.data.id.IdBased;
import org.thingsboard.server.common.data.page.TextPageLink;
import java.util.List;
import java.util.UUID;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.model.BaseEntity;
public abstract class PaginatedRemover<I, D extends IdBased<?>> {
public abstract class PaginatedRemover<I, E extends BaseEntity<?>> {
private static final int DEFAULT_LIMIT = 100;
public void removeEntitites(I id) {
TextPageLink pageLink = new TextPageLink(100);
TextPageLink pageLink = new TextPageLink(DEFAULT_LIMIT);
boolean hasNext = true;
while (hasNext) {
List<E> entities = findEntities(id, pageLink);
for (E entity : entities) {
List<D> entities = findEntities(id, pageLink);
for (D entity : entities) {
removeEntity(entity);
}
hasNext = entities.size() == pageLink.getLimit();
if (hasNext) {
int index = entities.size()-1;
UUID idOffset = entities.get(index).getId();
int index = entities.size() - 1;
UUID idOffset = entities.get(index).getUuidId();
pageLink.setIdOffset(idOffset);
}
}
}
}
protected abstract List<E> findEntities(I id, TextPageLink pageLink);
protected abstract void removeEntity(E entity);
protected abstract List<D> findEntities(I id, TextPageLink pageLink);
protected abstract void removeEntity(D entity);
}

7
dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsDao.java

@ -17,9 +17,8 @@ package org.thingsboard.server.dao.settings;
import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.AdminSettingsEntity;
public interface AdminSettingsDao extends Dao<AdminSettingsEntity> {
public interface AdminSettingsDao extends Dao<AdminSettings> {
/**
* Save or update admin settings object
@ -27,7 +26,7 @@ public interface AdminSettingsDao extends Dao<AdminSettingsEntity> {
* @param adminSettings the admin settings object
* @return saved admin settings object
*/
AdminSettingsEntity save(AdminSettings adminSettings);
AdminSettings save(AdminSettings adminSettings);
/**
* Find admin settings by key.
@ -35,6 +34,6 @@ public interface AdminSettingsDao extends Dao<AdminSettingsEntity> {
* @param key the key
* @return the admin settings object
*/
AdminSettingsEntity findByKey(String key);
AdminSettings findByKey(String key);
}

6
dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsService.java

@ -20,10 +20,10 @@ import org.thingsboard.server.common.data.id.AdminSettingsId;
public interface AdminSettingsService {
public AdminSettings findAdminSettingsById(AdminSettingsId adminSettingsId);
AdminSettings findAdminSettingsById(AdminSettingsId adminSettingsId);
public AdminSettings findAdminSettingsByKey(String key);
AdminSettings findAdminSettingsByKey(String key);
public AdminSettings saveAdminSettings(AdminSettings adminSettings);
AdminSettings saveAdminSettings(AdminSettings adminSettings);
}

18
dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsServiceImpl.java

@ -15,19 +15,14 @@
*/
package org.thingsboard.server.dao.settings;
import static org.thingsboard.server.dao.DaoUtil.getData;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.id.AdminSettingsId;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.AdminSettingsEntity;
import org.thingsboard.server.dao.service.DataValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.dao.service.Validator;
@Service
@ -41,24 +36,21 @@ public class AdminSettingsServiceImpl implements AdminSettingsService {
public AdminSettings findAdminSettingsById(AdminSettingsId adminSettingsId) {
log.trace("Executing findAdminSettingsById [{}]", adminSettingsId);
Validator.validateId(adminSettingsId, "Incorrect adminSettingsId " + adminSettingsId);
AdminSettingsEntity adminSettingsEntity = adminSettingsDao.findById(adminSettingsId.getId());
return getData(adminSettingsEntity);
return adminSettingsDao.findById(adminSettingsId.getId());
}
@Override
public AdminSettings findAdminSettingsByKey(String key) {
log.trace("Executing findAdminSettingsByKey [{}]", key);
Validator.validateString(key, "Incorrect key " + key);
AdminSettingsEntity adminSettingsEntity = adminSettingsDao.findByKey(key);
return getData(adminSettingsEntity);
return adminSettingsDao.findByKey(key);
}
@Override
public AdminSettings saveAdminSettings(AdminSettings adminSettings) {
log.trace("Executing saveAdminSettings [{}]", adminSettings);
adminSettingsValidator.validate(adminSettings);
AdminSettingsEntity adminSettingsEntity = adminSettingsDao.save(adminSettings);
return getData(adminSettingsEntity);
return adminSettingsDao.save(adminSettings);
}
private DataValidator<AdminSettings> adminSettingsValidator =

31
dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/settings/CassandraAdminSettingsDao.java

@ -15,26 +15,21 @@
*/
package org.thingsboard.server.dao.settings;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_BY_KEY_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_KEY_PROPERTY;
import com.datastax.driver.core.querybuilder.Select.Where;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.dao.AbstractModelDao;
import org.thingsboard.server.dao.model.AdminSettingsEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import org.thingsboard.server.dao.CassandraAbstractModelDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.nosql.AdminSettingsEntity;
import com.datastax.driver.core.querybuilder.Select.Where;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component
@Slf4j
public class AdminSettingsDaoImpl extends AbstractModelDao<AdminSettingsEntity> implements AdminSettingsDao {
public class CassandraAdminSettingsDao extends CassandraAbstractModelDao<AdminSettingsEntity, AdminSettings> implements AdminSettingsDao {
@Override
protected Class<AdminSettingsEntity> getColumnFamilyClass() {
@ -45,21 +40,15 @@ public class AdminSettingsDaoImpl extends AbstractModelDao<AdminSettingsEntity>
protected String getColumnFamilyName() {
return ADMIN_SETTINGS_COLUMN_FAMILY_NAME;
}
@Override
public AdminSettingsEntity save(AdminSettings adminSettings) {
log.debug("Save admin settings [{}] ", adminSettings);
return save(new AdminSettingsEntity(adminSettings));
}
@Override
public AdminSettingsEntity findByKey(String key) {
public AdminSettings findByKey(String key) {
log.debug("Try to find admin settings by key [{}] ", key);
Where query = select().from(ADMIN_SETTINGS_BY_KEY_COLUMN_FAMILY_NAME).where(eq(ADMIN_SETTINGS_KEY_PROPERTY, key));
log.trace("Execute query {}", query);
AdminSettingsEntity adminSettingsEntity = findOneByStatement(query);
log.trace("Found admin settings [{}] by key [{}]", adminSettingsEntity, key);
return adminSettingsEntity;
return DaoUtil.getData(adminSettingsEntity);
}
}

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

@ -0,0 +1,90 @@
/**
* 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;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
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;
/**
* @author Valerii Sosliuk
*/
@Slf4j
public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> implements Dao<D> {
protected abstract Class<E> getColumnFamilyClass();
protected abstract String getColumnFamilyName();
protected abstract JpaRepository<E, UUID> getCrudRepository();
protected boolean isSearchTextDao() {
return false;
}
@Override
public D save(D domain) {
E entity;
try {
entity = getColumnFamilyClass().getConstructor(domain.getClass()).newInstance(domain);
} catch (Exception e) {
log.error("Can't create entity for domain object {}", domain, e);
throw new IllegalArgumentException("Can't create entity for domain object {" + domain + "}", e);
} if (isSearchTextDao()) {
((SearchTextEntity) entity).setSearchText(((SearchTextEntity) entity).getSearchTextSource().toLowerCase());
}
log.debug("Saving entity {}", entity);
entity = getCrudRepository().save(entity);
return DaoUtil.getData(entity);
}
@Override
public D findById(UUID key) {
log.debug("Get entity by key {}", key);
E entity = getCrudRepository().findOne(key);
return DaoUtil.getData(entity);
}
@Override
public ListenableFuture<D> findByIdAsync(UUID key) {
log.debug("Get entity by key {}", key);
org.springframework.util.concurrent.ListenableFuture<E> entityFuture = getCrudRepository().findByIdAsync(key);
// TODO: vsosliuk implement
return null;
}
@Override
public boolean removeById(UUID key) {
getCrudRepository().delete(key);
log.debug("Remove request: {}", key);
return getCrudRepository().equals(key);
}
@Override
public List<D> find() {
log.debug("Get all entities from column family {}", getColumnFamilyName());
List<E> entities = Lists.newArrayList(getCrudRepository().findAll());
return DaoUtil.convertDataList(entities);
}
}

31
dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaRepository.java

@ -0,0 +1,31 @@
/**
* 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.data.repository.CrudRepository;
import org.springframework.scheduling.annotation.Async;
import org.springframework.util.concurrent.ListenableFuture;
import java.io.Serializable;
/**
* @author Valerii Sosliuk
*/
public interface JpaRepository<E, ID extends Serializable> extends CrudRepository<E, ID> {
@Async
ListenableFuture<E> findByIdAsync(ID key);
}

52
dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java

@ -0,0 +1,52 @@
/**
* 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.stereotype.Component;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.sql.UserEntity;
import org.thingsboard.server.dao.sql.JpaAbstractDao;
import java.util.UUID;
/**
* @author Valerii Sosliuk
*/
@Component
@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false)
public class JpaUserDao extends JpaAbstractDao<UserEntity, User> {
@Autowired
private UserRepository userRepository;
@Override
protected Class<UserEntity> getColumnFamilyClass() {
return UserEntity.class;
}
@Override
protected String getColumnFamilyName() {
return ModelConstants.USER_COLUMN_FAMILY_NAME;
}
@Override
protected JpaRepository<UserEntity, UUID> getCrudRepository() {
return userRepository;
}
}

26
dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java

@ -0,0 +1,26 @@
/**
* 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.thingsboard.server.dao.model.sql.UserEntity;
import java.util.UUID;
/**
* @author Valerii Sosliuk
*/
public interface UserRepository extends JpaRepository<UserEntity, UUID> {
}

33
dao/src/main/java/org/thingsboard/server/dao/tenant/TenantDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/tenant/CassandraTenantDao.java

@ -15,26 +15,23 @@
*/
package org.thingsboard.server.dao.tenant;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static org.thingsboard.server.dao.model.ModelConstants.TENANT_BY_REGION_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.TENANT_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.TENANT_REGION_PROPERTY;
import java.util.Arrays;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.model.TenantEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.nosql.TenantEntity;
import java.util.Arrays;
import java.util.List;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component
@Slf4j
public class TenantDaoImpl extends AbstractSearchTextDao<TenantEntity> implements TenantDao {
public class CassandraTenantDao extends CassandraAbstractSearchTextDao<TenantEntity, Tenant> implements TenantDao {
@Override
protected Class<TenantEntity> getColumnFamilyClass() {
@ -45,21 +42,15 @@ public class TenantDaoImpl extends AbstractSearchTextDao<TenantEntity> implement
protected String getColumnFamilyName() {
return TENANT_COLUMN_FAMILY_NAME;
}
@Override
public TenantEntity save(Tenant tenant) {
log.debug("Save tenant [{}] ", tenant);
return save(new TenantEntity(tenant));
}
@Override
public List<TenantEntity> findTenantsByRegion(String region, TextPageLink pageLink) {
public List<Tenant> findTenantsByRegion(String region, TextPageLink pageLink) {
log.debug("Try to find tenants by region [{}] and pageLink [{}]", region, pageLink);
List<TenantEntity> tenantEntities = findPageWithTextSearch(TENANT_BY_REGION_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(TENANT_REGION_PROPERTY, region)),
pageLink);
log.trace("Found tenants [{}] by region [{}] and pageLink [{}]", tenantEntities, region, pageLink);
return tenantEntities;
return DaoUtil.convertDataList(tenantEntities);
}
}

11
dao/src/main/java/org/thingsboard/server/dao/tenant/TenantDao.java

@ -15,14 +15,13 @@
*/
package org.thingsboard.server.dao.tenant;
import java.util.List;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.TenantEntity;
public interface TenantDao extends Dao<TenantEntity> {
import java.util.List;
public interface TenantDao extends Dao<Tenant> {
/**
* Save or update tenant object
@ -30,7 +29,7 @@ public interface TenantDao extends Dao<TenantEntity> {
* @param tenant the tenant object
* @return saved tenant object
*/
TenantEntity save(Tenant tenant);
Tenant save(Tenant tenant);
/**
* Find tenants by region and page link.
@ -39,6 +38,6 @@ public interface TenantDao extends Dao<TenantEntity> {
* @param pageLink the page link
* @return the list of tenant objects
*/
List<TenantEntity> findTenantsByRegion(String region, TextPageLink pageLink);
List<Tenant> findTenantsByRegion(String region, TextPageLink pageLink);
}

12
dao/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java

@ -22,16 +22,14 @@ import org.thingsboard.server.common.data.page.TextPageLink;
public interface TenantService {
public Tenant findTenantById(TenantId tenantId);
Tenant findTenantById(TenantId tenantId);
public Tenant saveTenant(Tenant tenant);
Tenant saveTenant(Tenant tenant);
public void deleteTenant(TenantId tenantId);
void deleteTenant(TenantId tenantId);
public TextPageData<Tenant> findTenants(TextPageLink pageLink);
TextPageData<Tenant> findTenants(TextPageLink pageLink);
//public TextPageData<Tenant> findTenantsByTitle(String title, PageLink pageLink);
public void deleteTenants();
void deleteTenants();
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save