Browse Source

Refactoring to introduce new DAO layer

pull/101/head
volodymyr-babak 10 years ago
parent
commit
d6965e9469
  1. 13
      dao/src/main/java/org/thingsboard/server/dao/AbstractSearchTimeDao.java
  2. 2
      dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractAsyncDao.java
  3. 2
      dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractDao.java
  4. 85
      dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractModelDao.java
  5. 19
      dao/src/main/java/org/thingsboard/server/dao/CassandraAbstractSearchTextDao.java
  6. 3
      dao/src/main/java/org/thingsboard/server/dao/Dao.java
  7. 8
      dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java
  8. 1
      dao/src/main/java/org/thingsboard/server/dao/EncryptionUtil.java
  9. 1
      dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesDao.java
  10. 4
      dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesService.java
  11. 5
      dao/src/main/java/org/thingsboard/server/dao/attributes/BaseAttributesService.java
  12. 14
      dao/src/main/java/org/thingsboard/server/dao/attributes/CassandraBaseAttributesDao.java
  13. 10
      dao/src/main/java/org/thingsboard/server/dao/cassandra/CassandraCluster.java
  14. 3
      dao/src/main/java/org/thingsboard/server/dao/cassandra/CassandraQueryOptions.java
  15. 3
      dao/src/main/java/org/thingsboard/server/dao/cassandra/CassandraSocketOptions.java
  16. 45
      dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorDao.java
  17. 20
      dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java
  18. 13
      dao/src/main/java/org/thingsboard/server/dao/component/ComponentDescriptorDao.java
  19. 29
      dao/src/main/java/org/thingsboard/server/dao/customer/CassandraCustomerDao.java
  20. 13
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerDao.java
  21. 10
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerService.java
  22. 39
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
  23. 37
      dao/src/main/java/org/thingsboard/server/dao/dashboard/CassandraDashboardDao.java
  24. 14
      dao/src/main/java/org/thingsboard/server/dao/dashboard/CassandraDashboardInfoDao.java
  25. 12
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDao.java
  26. 60
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardDaoImpl.java
  27. 18
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardInfoDao.java
  28. 28
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardService.java
  29. 59
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java
  30. 36
      dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceCredentialsDao.java
  31. 41
      dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java
  32. 15
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsDao.java
  33. 20
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java
  34. 23
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceDao.java
  35. 31
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java
  36. 21
      dao/src/main/java/org/thingsboard/server/dao/event/BaseEventService.java
  37. 27
      dao/src/main/java/org/thingsboard/server/dao/event/CassandraBaseEventDao.java
  38. 15
      dao/src/main/java/org/thingsboard/server/dao/event/EventDao.java
  39. 1
      dao/src/main/java/org/thingsboard/server/dao/event/EventService.java
  40. 49
      dao/src/main/java/org/thingsboard/server/dao/plugin/BasePluginService.java
  41. 39
      dao/src/main/java/org/thingsboard/server/dao/plugin/CassandraBasePluginDao.java
  42. 13
      dao/src/main/java/org/thingsboard/server/dao/plugin/PluginDao.java
  43. 39
      dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleService.java
  44. 29
      dao/src/main/java/org/thingsboard/server/dao/rule/CassandraBaseRuleDao.java
  45. 13
      dao/src/main/java/org/thingsboard/server/dao/rule/RuleDao.java
  46. 11
      dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java
  47. 38
      dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java
  48. 7
      dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsDao.java
  49. 6
      dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsService.java
  50. 18
      dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsServiceImpl.java
  51. 29
      dao/src/main/java/org/thingsboard/server/dao/settings/CassandraAdminSettingsDao.java
  52. 31
      dao/src/main/java/org/thingsboard/server/dao/tenant/CassandraTenantDao.java
  53. 11
      dao/src/main/java/org/thingsboard/server/dao/tenant/TenantDao.java
  54. 12
      dao/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java
  55. 37
      dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java
  56. 21
      dao/src/main/java/org/thingsboard/server/dao/timeseries/BaseTimeseriesService.java
  57. 13
      dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java
  58. 3
      dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesDao.java
  59. 3
      dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesService.java
  60. 1
      dao/src/main/java/org/thingsboard/server/dao/timeseries/TsKvQueryCursor.java
  61. 39
      dao/src/main/java/org/thingsboard/server/dao/user/CassandraUserCredentialsDao.java
  62. 42
      dao/src/main/java/org/thingsboard/server/dao/user/CassandraUserDao.java
  63. 23
      dao/src/main/java/org/thingsboard/server/dao/user/UserCredentialsDao.java
  64. 17
      dao/src/main/java/org/thingsboard/server/dao/user/UserDao.java
  65. 28
      dao/src/main/java/org/thingsboard/server/dao/user/UserService.java
  66. 104
      dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java
  67. 22
      dao/src/main/java/org/thingsboard/server/dao/widget/CassandraWidgetTypeDao.java
  68. 33
      dao/src/main/java/org/thingsboard/server/dao/widget/CassandraWidgetsBundleDao.java
  69. 11
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeDao.java
  70. 12
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java
  71. 38
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java
  72. 15
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java
  73. 20
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java
  74. 57
      dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java

13
dao/src/main/java/org/thingsboard/server/dao/AbstractSearchTimeDao.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;
import com.datastax.driver.core.querybuilder.Select.Where; import com.datastax.driver.core.querybuilder.Select.Where;
import com.datastax.driver.core.utils.UUIDs; 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.common.data.page.TimePageLink;
import org.thingsboard.server.dao.model.BaseEntity; import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select; import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
public abstract class AbstractSearchTimeDao<T extends BaseEntity<?>> extends AbstractModelDao<T> { public abstract class AbstractSearchTimeDao<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); 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); return findPageWithTimeSearch(searchView, clauses, Collections.singletonList(ordering), pageLink);
} }
protected List<E> findPageWithTimeSearch(String searchView, List<Clause> clauses, List<Ordering> topLevelOrderings, TimePageLink pageLink) {
protected List<T> findPageWithTimeSearch(String searchView, List<Clause> clauses, List<Ordering> topLevelOrderings, TimePageLink pageLink) {
Select select = select().from(searchView); Select select = select().from(searchView);
Where query = select.where(); Where query = select.where();
for (Clause clause : clauses) { for (Clause clause : clauses) {

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. * Created by ashvayka on 21.02.17.
*/ */
public abstract class AbstractAsyncDao extends AbstractDao { public abstract class CassandraAbstractAsyncDao extends CassandraAbstractDao {
protected ExecutorService readResultsProcessingExecutor; 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.*; import org.thingsboard.server.dao.model.type.*;
@Slf4j @Slf4j
public abstract class AbstractDao { public abstract class CassandraAbstractDao {
@Autowired @Autowired
protected CassandraCluster cluster; protected CassandraCluster cluster;

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

@ -28,8 +28,8 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.dao.model.BaseEntity; 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.ModelConstants;
import org.thingsboard.server.dao.model.wrapper.EntityResultSet;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collections; import java.util.Collections;
@ -37,26 +37,25 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; 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; import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
@Slf4j @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 abstract String getColumnFamilyName();
protected Mapper<T> getMapper() { protected Mapper<E> getMapper() {
return cluster.getMapper(getColumnFamilyClass()); return cluster.getMapper(getColumnFamilyClass());
} }
protected List<T> findListByStatement(Statement statement) { protected List<E> findListByStatement(Statement statement) {
List<T> list = Collections.emptyList(); List<E> list = Collections.emptyList();
if (statement != null) { if (statement != null) {
statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel()); statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel());
ResultSet resultSet = getSession().execute(statement); ResultSet resultSet = getSession().execute(statement);
Result<T> result = getMapper().map(resultSet); Result<E> result = getMapper().map(resultSet);
if (result != null) { if (result != null) {
list = result.all(); list = result.all();
} }
@ -64,33 +63,33 @@ public abstract class AbstractModelDao<T extends BaseEntity<?>> extends Abstract
return list; return list;
} }
protected ListenableFuture<List<T>> findListByStatementAsync(Statement statement) { protected ListenableFuture<List<D>> findListByStatementAsync(Statement statement) {
if (statement != null) { if (statement != null) {
statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel()); statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel());
ResultSetFuture resultSetFuture = getSession().executeAsync(statement); 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 @Nullable
@Override @Override
public List<T> apply(@Nullable ResultSet resultSet) { public List<D> apply(@Nullable ResultSet resultSet) {
Result<T> result = getMapper().map(resultSet); Result<E> result = getMapper().map(resultSet);
if (result != null) { if (result != null) {
return result.all(); List<E> entities = result.all();
return DaoUtil.convertDataList(entities);
} else { } else {
return Collections.emptyList(); return Collections.emptyList();
} }
} }
}); });
return result;
} }
return Futures.immediateFuture(Collections.emptyList()); return Futures.immediateFuture(Collections.emptyList());
} }
protected T findOneByStatement(Statement statement) { protected E findOneByStatement(Statement statement) {
T object = null; E object = null;
if (statement != null) { if (statement != null) {
statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel()); statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel());
ResultSet resultSet = getSession().execute(statement); ResultSet resultSet = getSession().execute(statement);
Result<T> result = getMapper().map(resultSet); Result<E> result = getMapper().map(resultSet);
if (result != null) { if (result != null) {
object = result.one(); object = result.one();
} }
@ -98,32 +97,32 @@ public abstract class AbstractModelDao<T extends BaseEntity<?>> extends Abstract
return object; return object;
} }
protected ListenableFuture<T> findOneByStatementAsync(Statement statement) { protected ListenableFuture<D> findOneByStatementAsync(Statement statement) {
if (statement != null) { if (statement != null) {
statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel()); statement.setConsistencyLevel(cluster.getDefaultReadConsistencyLevel());
ResultSetFuture resultSetFuture = getSession().executeAsync(statement); ResultSetFuture resultSetFuture = getSession().executeAsync(statement);
ListenableFuture<T> result = Futures.transform(resultSetFuture, new Function<ResultSet, T>() { return Futures.transform(resultSetFuture, new Function<ResultSet, D>() {
@Nullable @Nullable
@Override @Override
public T apply(@Nullable ResultSet resultSet) { public D apply(@Nullable ResultSet resultSet) {
Result<T> result = getMapper().map(resultSet); Result<E> result = getMapper().map(resultSet);
if (result != null) { if (result != null) {
return result.one(); E entity = result.one();
return DaoUtil.getData(entity);
} else { } else {
return null; return null;
} }
} }
}); });
return result;
} }
return Futures.immediateFuture(null); return Futures.immediateFuture(null);
} }
protected Statement getSaveQuery(T dto) { protected Statement getSaveQuery(E dto) {
return getMapper().saveQuery(dto); return getMapper().saveQuery(dto);
} }
protected EntityResultSet<T> saveWithResult(T entity) { protected EntityResultSet<E> saveWithResult(E entity) {
log.debug("Save entity {}", entity); log.debug("Save entity {}", entity);
if (entity.getId() == null) { if (entity.getId() == null) {
entity.setId(UUIDs.timeBased()); entity.setId(UUIDs.timeBased());
@ -136,34 +135,48 @@ public abstract class AbstractModelDao<T extends BaseEntity<?>> extends Abstract
return new EntityResultSet<>(resultSet, entity); return new EntityResultSet<>(resultSet, entity);
} }
public T save(T entity) { @Override
return saveWithResult(entity).getEntity(); 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);
}
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); log.debug("Get entity by key {}", key);
Select.Where query = select().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, key)); Select.Where query = select().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, key));
log.trace("Execute query {}", query); 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); log.debug("Get entity by key {}", key);
Select.Where query = select().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, key)); Select.Where query = select().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, key));
log.trace("Execute query {}", query); log.trace("Execute query {}", query);
return findOneByStatementAsync(query); return findOneByStatementAsync(query);
} }
@Override
public ResultSet removeById(UUID key) { public boolean removeById(UUID key) {
Statement delete = QueryBuilder.delete().all().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, key)); Statement delete = QueryBuilder.delete().all().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, key));
log.debug("Remove request: {}", delete.toString()); log.debug("Remove request: {}", delete.toString());
return getSession().execute(delete); return getSession().execute(delete).wasApplied();
} }
@Override
public List<T> find() { public List<D> find() {
log.debug("Get all entities from column family {}", getColumnFamilyName()); 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);
} }
} }

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

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

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

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.dao; package org.thingsboard.server.dao;
import com.datastax.driver.core.ResultSet;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import java.util.List; import java.util.List;
@ -31,6 +30,6 @@ public interface Dao<T> {
T save(T 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; 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.common.data.id.UUIDBased;
import org.thingsboard.server.dao.model.ToData; import org.thingsboard.server.dao.model.ToData;
import java.util.*;
public abstract class DaoUtil { public abstract class DaoUtil {
private DaoUtil() { private DaoUtil() {

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

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

1
dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesDao.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.dao.attributes; package org.thingsboard.server.dao.attributes;
// CASSANDRA ???
import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture; import com.datastax.driver.core.ResultSetFuture;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;

4
dao/src/main/java/org/thingsboard/server/dao/attributes/AttributesService.java

@ -15,12 +15,10 @@
*/ */
package org.thingsboard.server.dao.attributes; package org.thingsboard.server.dao.attributes;
// CASSANDRA ???
import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture;
import com.google.common.util.concurrent.ListenableFuture; 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.EntityId;
import org.thingsboard.server.common.data.id.UUIDBased;
import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import java.util.Collection; import java.util.Collection;

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

@ -15,16 +15,17 @@
*/ */
package org.thingsboard.server.dao.attributes; package org.thingsboard.server.dao.attributes;
// CASSANDRA ???
import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture; import com.datastax.driver.core.ResultSetFuture;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; 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.id.EntityId;
import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.dao.exception.IncorrectParameterException; 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 org.thingsboard.server.dao.service.Validator;
import java.util.Collection; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.id.EntityId; 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.dao.model.ModelConstants;
import org.thingsboard.server.common.data.kv.*; import org.thingsboard.server.dao.timeseries.CassandraBaseTimeseriesDao;
import org.thingsboard.server.dao.timeseries.BaseTimeseriesDao;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@ -37,15 +38,16 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; 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 org.thingsboard.server.dao.model.ModelConstants.*;
import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
/** /**
* @author Andrew Shvayka * @author Andrew Shvayka
*/ */
@Component @Component
@Slf4j @Slf4j
public class BaseAttributesDao extends AbstractAsyncDao implements AttributesDao { public class CassandraBaseAttributesDao extends CassandraAbstractAsyncDao implements AttributesDao {
private PreparedStatement saveStmt; private PreparedStatement saveStmt;
@ -161,7 +163,7 @@ public class BaseAttributesDao extends AbstractAsyncDao implements AttributesDao
AttributeKvEntry attributeEntry = null; AttributeKvEntry attributeEntry = null;
if (row != null) { if (row != null) {
long lastUpdateTs = row.get(LAST_UPDATE_TS_COLUMN, Long.class); 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; return attributeEntry;
} }

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

@ -16,13 +16,8 @@
package org.thingsboard.server.dao.cassandra; package org.thingsboard.server.dao.cassandra;
import com.datastax.driver.core.Cluster; import com.datastax.driver.core.*;
import com.datastax.driver.core.ConsistencyLevel;
import com.datastax.driver.core.HostDistance;
import com.datastax.driver.core.PoolingOptions;
import com.datastax.driver.core.ProtocolOptions.Compression; 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.Mapper;
import com.datastax.driver.mapping.MappingManager; import com.datastax.driver.mapping.MappingManager;
import lombok.Data; 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.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.dao.exception.DatabaseException;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import java.io.Closeable;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.StringTokenizer;
@Component @Component
@Slf4j @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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
@Component @Component
@Configuration @Configuration
@Data @Data

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

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

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

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

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.ComponentScope;
import org.thingsboard.server.common.data.plugin.ComponentType; import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.ComponentDescriptorEntity;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -29,17 +28,17 @@ import java.util.Optional;
/** /**
* @author Andrew Shvayka * @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); void deleteById(ComponentDescriptorId componentId);

29
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; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao; import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.CustomerEntity; import org.thingsboard.server.dao.model.CustomerEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thingsboard.server.dao.model.ModelConstants; 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 @Component
@Slf4j @Slf4j
public class CustomerDaoImpl extends AbstractSearchTextDao<CustomerEntity> implements CustomerDao { public class CassandraCustomerDao extends CassandraAbstractSearchTextDao<CustomerEntity, Customer> implements CustomerDao {
@Override @Override
protected Class<CustomerEntity> getColumnFamilyClass() { protected Class<CustomerEntity> getColumnFamilyClass() {
@ -43,21 +42,15 @@ public class CustomerDaoImpl extends AbstractSearchTextDao<CustomerEntity> imple
protected String getColumnFamilyName() { protected String getColumnFamilyName() {
return ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME; return ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME;
} }
@Override
public CustomerEntity save(Customer customer) {
log.debug("Save customer [{}] ", customer);
return save(new CustomerEntity(customer));
}
@Override @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); 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, List<CustomerEntity> customerEntities = findPageWithTextSearch(ModelConstants.CUSTOMER_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(ModelConstants.CUSTOMER_TENANT_ID_PROPERTY, tenantId)), Arrays.asList(eq(ModelConstants.CUSTOMER_TENANT_ID_PROPERTY, tenantId)),
pageLink); pageLink);
log.trace("Found customers [{}] by tenantId [{}] and pageLink [{}]", customerEntities, 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; 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.Customer;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.CustomerEntity;
import java.util.List;
import java.util.UUID;
/** /**
* The Interface CustomerDao. * The Interface CustomerDao.
*/ */
public interface CustomerDao extends Dao<CustomerEntity> { public interface CustomerDao extends Dao<Customer> {
/** /**
* Save or update customer object * Save or update customer object
@ -34,7 +33,7 @@ public interface CustomerDao extends Dao<CustomerEntity> {
* @param customer the customer object * @param customer the customer object
* @return saved customer object * @return saved customer object
*/ */
CustomerEntity save(Customer customer); Customer save(Customer customer);
/** /**
* Find customers by tenant id and page link. * Find customers by tenant id and page link.
@ -43,6 +42,6 @@ public interface CustomerDao extends Dao<CustomerEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of customer objects * @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 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; 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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; 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.Customer;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageData; 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.device.DeviceService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.exception.IncorrectParameterException; 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.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover; 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.tenant.TenantDao;
import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.dao.user.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.dao.service.Validator;
@Service @Service
@Slf4j @Slf4j
public class CustomerServiceImpl implements CustomerService { public class CustomerServiceImpl implements CustomerService {
@ -65,16 +59,14 @@ public class CustomerServiceImpl implements CustomerService {
public Customer findCustomerById(CustomerId customerId) { public Customer findCustomerById(CustomerId customerId) {
log.trace("Executing findCustomerById [{}]", customerId); log.trace("Executing findCustomerById [{}]", customerId);
Validator.validateId(customerId, "Incorrect customerId " + customerId); Validator.validateId(customerId, "Incorrect customerId " + customerId);
CustomerEntity customerEntity = customerDao.findById(customerId.getId()); return customerDao.findById(customerId.getId());
return getData(customerEntity);
} }
@Override @Override
public Customer saveCustomer(Customer customer) { public Customer saveCustomer(Customer customer) {
log.trace("Executing saveCustomer [{}]", customer); log.trace("Executing saveCustomer [{}]", customer);
customerValidator.validate(customer); customerValidator.validate(customer);
CustomerEntity customerEntity = customerDao.save(customer); return customerDao.save(customer);
return getData(customerEntity);
} }
@Override @Override
@ -96,8 +88,7 @@ public class CustomerServiceImpl implements CustomerService {
log.trace("Executing findCustomersByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); log.trace("Executing findCustomersByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<CustomerEntity> customerEntities = customerDao.findCustomersByTenantId(tenantId.getId(), pageLink); List<Customer> customers = customerDao.findCustomersByTenantId(tenantId.getId(), pageLink);
List<Customer> customers = convertDataList(customerEntities);
return new TextPageData<Customer>(customers, pageLink); return new TextPageData<Customer>(customers, pageLink);
} }
@ -121,7 +112,7 @@ public class CustomerServiceImpl implements CustomerService {
if (customer.getTenantId() == null) { if (customer.getTenantId() == null) {
throw new DataValidationException("Customer should be assigned to tenant!"); throw new DataValidationException("Customer should be assigned to tenant!");
} else { } else {
TenantEntity tenant = tenantDao.findById(customer.getTenantId().getId()); Tenant tenant = tenantDao.findById(customer.getTenantId().getId());
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Customer is referencing to non-existent tenant!"); throw new DataValidationException("Customer is referencing to non-existent tenant!");
} }
@ -129,17 +120,17 @@ public class CustomerServiceImpl implements CustomerService {
} }
}; };
private PaginatedRemover<TenantId, CustomerEntity> customersByTenantRemover = private PaginatedRemover<TenantId, Customer> customersByTenantRemover =
new PaginatedRemover<TenantId, CustomerEntity>() { new PaginatedRemover<TenantId, Customer>() {
@Override @Override
protected List<CustomerEntity> findEntities(TenantId id, TextPageLink pageLink) { protected List<Customer> findEntities(TenantId id, TextPageLink pageLink) {
return customerDao.findCustomersByTenantId(id.getId(), pageLink); return customerDao.findCustomersByTenantId(id.getId(), pageLink);
} }
@Override @Override
protected void removeEntity(CustomerEntity entity) { protected void removeEntity(Customer entity) {
deleteCustomer(new CustomerId(entity.getId())); 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.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;
}
}

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

@ -17,8 +17,10 @@ package org.thingsboard.server.dao.dashboard;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao; import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.DashboardInfoEntity; import org.thingsboard.server.dao.model.DashboardInfoEntity;
import java.util.Arrays; import java.util.Arrays;
@ -31,7 +33,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component @Component
@Slf4j @Slf4j
public class DashboardInfoDaoImpl extends AbstractSearchTextDao<DashboardInfoEntity> implements DashboardInfoDao { public class CassandraDashboardInfoDao extends CassandraAbstractSearchTextDao<DashboardInfoEntity, DashboardInfo> implements DashboardInfoDao {
@Override @Override
protected Class<DashboardInfoEntity> getColumnFamilyClass() { protected Class<DashboardInfoEntity> getColumnFamilyClass() {
@ -44,18 +46,18 @@ public class DashboardInfoDaoImpl extends AbstractSearchTextDao<DashboardInfoEnt
} }
@Override @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); 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, List<DashboardInfoEntity> dashboardEntities = findPageWithTextSearch(DASHBOARD_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Collections.singletonList(eq(DASHBOARD_TENANT_ID_PROPERTY, tenantId)), Collections.singletonList(eq(DASHBOARD_TENANT_ID_PROPERTY, tenantId)),
pageLink); pageLink);
log.trace("Found dashboards [{}] by tenantId [{}] and pageLink [{}]", dashboardEntities, tenantId, pageLink); log.trace("Found dashboards [{}] by tenantId [{}] and pageLink [{}]", dashboardEntities, tenantId, pageLink);
return dashboardEntities; return DaoUtil.convertDataList(dashboardEntities);
} }
@Override @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); 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, List<DashboardInfoEntity> dashboardEntities = findPageWithTextSearch(DASHBOARD_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(DASHBOARD_CUSTOMER_ID_PROPERTY, customerId), Arrays.asList(eq(DASHBOARD_CUSTOMER_ID_PROPERTY, customerId),
@ -63,7 +65,7 @@ public class DashboardInfoDaoImpl extends AbstractSearchTextDao<DashboardInfoEnt
pageLink); pageLink);
log.trace("Found dashboards [{}] by tenantId [{}], customerId [{}] and pageLink [{}]", dashboardEntities, tenantId, customerId, 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; 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.Dashboard;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.DashboardEntity;
import org.thingsboard.server.dao.model.DashboardInfoEntity;
/** /**
* The Interface DashboardDao. * 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 * Save or update dashboard object
@ -37,6 +29,6 @@ public interface DashboardDao extends Dao<DashboardEntity> {
* @param dashboard the dashboard object * @param dashboard the dashboard object
* @return saved 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; package org.thingsboard.server.dao.dashboard;
import java.util.List; import org.thingsboard.server.common.data.DashboardInfo;
import java.util.UUID;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao; 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. * 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. * Find dashboards by tenantId and page link.
@ -38,7 +34,7 @@ public interface DashboardInfoDao extends Dao<DashboardInfoEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of dashboard objects * @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. * Find dashboards by tenantId, customerId and page link.
@ -48,6 +44,6 @@ public interface DashboardInfoDao extends Dao<DashboardInfoEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of dashboard objects * @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 interface DashboardService {
public Dashboard findDashboardById(DashboardId dashboardId); Dashboard findDashboardById(DashboardId dashboardId);
public Dashboard saveDashboard(Dashboard dashboard);
public Dashboard assignDashboardToCustomer(DashboardId dashboardId, CustomerId customerId);
public Dashboard unassignDashboardFromCustomer(DashboardId dashboardId); Dashboard saveDashboard(Dashboard dashboard);
public void deleteDashboard(DashboardId dashboardId); Dashboard assignDashboardToCustomer(DashboardId dashboardId, CustomerId customerId);
public TextPageData<DashboardInfo> findDashboardsByTenantId(TenantId tenantId, TextPageLink pageLink);
public void deleteDashboardsByTenantId(TenantId tenantId); Dashboard unassignDashboardFromCustomer(DashboardId dashboardId);
public TextPageData<DashboardInfo> findDashboardsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, TextPageLink pageLink); 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; 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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; 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.Dashboard;
import org.thingsboard.server.common.data.DashboardInfo; 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.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.TenantId; 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.common.data.page.TextPageLink;
import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.customer.CustomerDao;
import org.thingsboard.server.dao.exception.DataValidationException; 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.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover; 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.service.Validator;
import org.thingsboard.server.dao.tenant.TenantDao;
import java.util.List;
@Service @Service
@Slf4j @Slf4j
@ -61,16 +58,14 @@ public class DashboardServiceImpl implements DashboardService {
public Dashboard findDashboardById(DashboardId dashboardId) { public Dashboard findDashboardById(DashboardId dashboardId) {
log.trace("Executing findDashboardById [{}]", dashboardId); log.trace("Executing findDashboardById [{}]", dashboardId);
Validator.validateId(dashboardId, "Incorrect dashboardId " + dashboardId); Validator.validateId(dashboardId, "Incorrect dashboardId " + dashboardId);
DashboardEntity dashboardEntity = dashboardDao.findById(dashboardId.getId()); return dashboardDao.findById(dashboardId.getId());
return getData(dashboardEntity);
} }
@Override @Override
public Dashboard saveDashboard(Dashboard dashboard) { public Dashboard saveDashboard(Dashboard dashboard) {
log.trace("Executing saveDashboard [{}]", dashboard); log.trace("Executing saveDashboard [{}]", dashboard);
dashboardValidator.validate(dashboard); dashboardValidator.validate(dashboard);
DashboardEntity dashboardEntity = dashboardDao.save(dashboard); return dashboardDao.save(dashboard);
return getData(dashboardEntity);
} }
@Override @Override
@ -99,9 +94,8 @@ public class DashboardServiceImpl implements DashboardService {
log.trace("Executing findDashboardsByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); log.trace("Executing findDashboardsByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DashboardInfoEntity> dashboardEntities = dashboardInfoDao.findDashboardsByTenantId(tenantId.getId(), pageLink); List<DashboardInfo> dashboards = dashboardInfoDao.findDashboardsByTenantId(tenantId.getId(), pageLink);
List<DashboardInfo> dashboards = convertDataList(dashboardEntities); return new TextPageData<>(dashboards, pageLink);
return new TextPageData<DashboardInfo>(dashboards, pageLink);
} }
@Override @Override
@ -117,9 +111,8 @@ public class DashboardServiceImpl implements DashboardService {
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateId(customerId, "Incorrect customerId " + customerId); Validator.validateId(customerId, "Incorrect customerId " + customerId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DashboardInfoEntity> dashboardEntities = dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink); List<DashboardInfo> dashboards = dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink);
List<DashboardInfo> dashboards = convertDataList(dashboardEntities); return new TextPageData<>(dashboards, pageLink);
return new TextPageData<DashboardInfo>(dashboards, pageLink);
} }
@Override @Override
@ -140,7 +133,7 @@ public class DashboardServiceImpl implements DashboardService {
if (dashboard.getTenantId() == null) { if (dashboard.getTenantId() == null) {
throw new DataValidationException("Dashboard should be assigned to tenant!"); throw new DataValidationException("Dashboard should be assigned to tenant!");
} else { } else {
TenantEntity tenant = tenantDao.findById(dashboard.getTenantId().getId()); Tenant tenant = tenantDao.findById(dashboard.getTenantId().getId());
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Dashboard is referencing to non-existent tenant!"); throw new DataValidationException("Dashboard is referencing to non-existent tenant!");
} }
@ -148,32 +141,32 @@ public class DashboardServiceImpl implements DashboardService {
if (dashboard.getCustomerId() == null) { if (dashboard.getCustomerId() == null) {
dashboard.setCustomerId(new CustomerId(ModelConstants.NULL_UUID)); dashboard.setCustomerId(new CustomerId(ModelConstants.NULL_UUID));
} else if (!dashboard.getCustomerId().getId().equals(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) { if (customer == null) {
throw new DataValidationException("Can't assign dashboard to non-existent customer!"); 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!"); throw new DataValidationException("Can't assign dashboard to customer from different tenant!");
} }
} }
} }
}; };
private PaginatedRemover<TenantId, DashboardInfoEntity> tenantDashboardsRemover = private PaginatedRemover<TenantId, DashboardInfo> tenantDashboardsRemover =
new PaginatedRemover<TenantId, DashboardInfoEntity>() { new PaginatedRemover<TenantId, DashboardInfo>() {
@Override @Override
protected List<DashboardInfoEntity> findEntities(TenantId id, TextPageLink pageLink) { protected List<DashboardInfo> findEntities(TenantId id, TextPageLink pageLink) {
return dashboardInfoDao.findDashboardsByTenantId(id.getId(), pageLink); return dashboardInfoDao.findDashboardsByTenantId(id.getId(), pageLink);
} }
@Override @Override
protected void removeEntity(DashboardInfoEntity entity) { protected void removeEntity(DashboardInfo entity) {
deleteDashboard(new DashboardId(entity.getId())); deleteDashboard(new DashboardId(entity.getUuidId()));
} }
}; };
class CustomerDashboardsUnassigner extends PaginatedRemover<CustomerId, DashboardInfoEntity> { private class CustomerDashboardsUnassigner extends PaginatedRemover<CustomerId, DashboardInfo> {
private TenantId tenantId; private TenantId tenantId;
@ -182,13 +175,13 @@ public class DashboardServiceImpl implements DashboardService {
} }
@Override @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); return dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId.getId(), id.getId(), pageLink);
} }
@Override @Override
protected void removeEntity(DashboardInfoEntity entity) { protected void removeEntity(DashboardInfo entity) {
unassignDashboardFromCustomer(new DashboardId(entity.getId())); unassignDashboardFromCustomer(new DashboardId(entity.getUuidId()));
} }
} }

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

41
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; 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.datastax.driver.core.querybuilder.Select;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao; import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.DeviceEntity; import org.thingsboard.server.dao.model.DeviceEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.*;
import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component @Component
@Slf4j @Slf4j
public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implements DeviceDao { public class CassandraDeviceDao extends CassandraAbstractSearchTextDao<DeviceEntity, Device> implements DeviceDao {
@Override @Override
protected Class<DeviceEntity> getColumnFamilyClass() { protected Class<DeviceEntity> getColumnFamilyClass() {
@ -48,23 +45,17 @@ public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implement
} }
@Override @Override
public DeviceEntity save(Device device) { public List<Device> findDevicesByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Save device [{}] ", device);
return save(new DeviceEntity(device));
}
@Override
public List<DeviceEntity> findDevicesByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find devices by tenantId [{}] and pageLink [{}]", tenantId, 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, List<DeviceEntity> deviceEntities = findPageWithTextSearch(DEVICE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Collections.singletonList(eq(DEVICE_TENANT_ID_PROPERTY, tenantId)), pageLink); Collections.singletonList(eq(DEVICE_TENANT_ID_PROPERTY, tenantId)), pageLink);
log.trace("Found devices [{}] by tenantId [{}] and pageLink [{}]", deviceEntities, tenantId, pageLink); log.trace("Found devices [{}] by tenantId [{}] and pageLink [{}]", deviceEntities, tenantId, pageLink);
return deviceEntities; return DaoUtil.convertDataList(deviceEntities);
} }
@Override @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); log.debug("Try to find devices by tenantId [{}] and device Ids [{}]", tenantId, deviceIds);
Select select = select().from(getColumnFamilyName()); Select select = select().from(getColumnFamilyName());
Select.Where query = select.where(); Select.Where query = select.where();
@ -74,7 +65,7 @@ public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implement
} }
@Override @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); 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, List<DeviceEntity> deviceEntities = findPageWithTextSearch(DEVICE_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(DEVICE_CUSTOMER_ID_PROPERTY, customerId), Arrays.asList(eq(DEVICE_CUSTOMER_ID_PROPERTY, customerId),
@ -82,11 +73,11 @@ public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implement
pageLink); pageLink);
log.trace("Found devices [{}] by tenantId [{}], customerId [{}] and pageLink [{}]", deviceEntities, tenantId, customerId, pageLink); log.trace("Found devices [{}] by tenantId [{}], customerId [{}] and pageLink [{}]", deviceEntities, tenantId, customerId, pageLink);
return deviceEntities; return DaoUtil.convertDataList(deviceEntities);
} }
@Override @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); log.debug("Try to find devices by tenantId [{}], customerId [{}] and device Ids [{}]", tenantId, customerId, deviceIds);
Select select = select().from(getColumnFamilyName()); Select select = select().from(getColumnFamilyName());
Select.Where query = select.where(); Select.Where query = select.where();
@ -97,12 +88,12 @@ public class DeviceDaoImpl extends AbstractSearchTextDao<DeviceEntity> implement
} }
@Override @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 select = select().from(DEVICE_BY_TENANT_AND_NAME_VIEW_NAME);
Select.Where query = select.where(); Select.Where query = select.where();
query.and(eq(DEVICE_TENANT_ID_PROPERTY, tenantId)); query.and(eq(DEVICE_TENANT_ID_PROPERTY, tenantId));
query.and(eq(DEVICE_NAME_PROPERTY, deviceName)); 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; package org.thingsboard.server.dao.device;
import java.util.UUID;
import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.DeviceCredentialsEntity;
import java.util.UUID;
/** /**
* The Interface DeviceCredentialsDao. * 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 * Save or update device credentials object
@ -34,7 +31,7 @@ public interface DeviceCredentialsDao extends Dao<DeviceCredentialsEntity> {
* @param deviceCredentials the device credentials object * @param deviceCredentials the device credentials object
* @return saved device credentials object * @return saved device credentials object
*/ */
DeviceCredentialsEntity save(DeviceCredentials deviceCredentials); DeviceCredentials save(DeviceCredentials deviceCredentials);
/** /**
* Find device credentials by device id. * Find device credentials by device id.
@ -42,7 +39,7 @@ public interface DeviceCredentialsDao extends Dao<DeviceCredentialsEntity> {
* @param deviceId the device id * @param deviceId the device id
* @return the device credentials object * @return the device credentials object
*/ */
DeviceCredentialsEntity findByDeviceId(UUID deviceId); DeviceCredentials findByDeviceId(UUID deviceId);
/** /**
* Find device credentials by credentials id. * Find device credentials by credentials id.
@ -50,6 +47,6 @@ public interface DeviceCredentialsDao extends Dao<DeviceCredentialsEntity> {
* @param credentialsId the credentials id * @param credentialsId the credentials id
* @return the device credentials object * @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.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.dao.EncryptionUtil; import org.thingsboard.server.dao.EncryptionUtil;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.DeviceCredentialsEntity;
import org.thingsboard.server.dao.service.DataValidator; 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.validateId;
import static org.thingsboard.server.dao.service.Validator.validateString; import static org.thingsboard.server.dao.service.Validator.validateString;
@ -47,16 +45,14 @@ public class DeviceCredentialsServiceImpl implements DeviceCredentialsService {
public DeviceCredentials findDeviceCredentialsByDeviceId(DeviceId deviceId) { public DeviceCredentials findDeviceCredentialsByDeviceId(DeviceId deviceId) {
log.trace("Executing findDeviceCredentialsByDeviceId [{}]", deviceId); log.trace("Executing findDeviceCredentialsByDeviceId [{}]", deviceId);
validateId(deviceId, "Incorrect deviceId " + deviceId); validateId(deviceId, "Incorrect deviceId " + deviceId);
DeviceCredentialsEntity deviceCredentialsEntity = deviceCredentialsDao.findByDeviceId(deviceId.getId()); return deviceCredentialsDao.findByDeviceId(deviceId.getId());
return getData(deviceCredentialsEntity);
} }
@Override @Override
public DeviceCredentials findDeviceCredentialsByCredentialsId(String credentialsId) { public DeviceCredentials findDeviceCredentialsByCredentialsId(String credentialsId) {
log.trace("Executing findDeviceCredentialsByCredentialsId [{}]", credentialsId); log.trace("Executing findDeviceCredentialsByCredentialsId [{}]", credentialsId);
validateString(credentialsId, "Incorrect credentialsId " + credentialsId); validateString(credentialsId, "Incorrect credentialsId " + credentialsId);
DeviceCredentialsEntity deviceCredentialsEntity = deviceCredentialsDao.findByCredentialsId(credentialsId); return deviceCredentialsDao.findByCredentialsId(credentialsId);
return getData(deviceCredentialsEntity);
} }
@Override @Override
@ -75,7 +71,7 @@ public class DeviceCredentialsServiceImpl implements DeviceCredentialsService {
} }
log.trace("Executing updateDeviceCredentials [{}]", deviceCredentials); log.trace("Executing updateDeviceCredentials [{}]", deviceCredentials);
credentialsValidator.validate(deviceCredentials); credentialsValidator.validate(deviceCredentials);
return getData(deviceCredentialsDao.save(deviceCredentials)); return deviceCredentialsDao.save(deviceCredentials);
} }
private void formatCertData(DeviceCredentials deviceCredentials) { private void formatCertData(DeviceCredentials deviceCredentials) {
@ -96,7 +92,7 @@ public class DeviceCredentialsServiceImpl implements DeviceCredentialsService {
@Override @Override
protected void validateCreate(DeviceCredentials deviceCredentials) { protected void validateCreate(DeviceCredentials deviceCredentials) {
DeviceCredentialsEntity existingCredentialsEntity = deviceCredentialsDao.findByCredentialsId(deviceCredentials.getCredentialsId()); DeviceCredentials existingCredentialsEntity = deviceCredentialsDao.findByCredentialsId(deviceCredentials.getCredentialsId());
if (existingCredentialsEntity != null) { if (existingCredentialsEntity != null) {
throw new DataValidationException("Create of existent device credentials!"); throw new DataValidationException("Create of existent device credentials!");
} }
@ -104,12 +100,12 @@ public class DeviceCredentialsServiceImpl implements DeviceCredentialsService {
@Override @Override
protected void validateUpdate(DeviceCredentials deviceCredentials) { protected void validateUpdate(DeviceCredentials deviceCredentials) {
DeviceCredentialsEntity existingCredentialsEntity = deviceCredentialsDao.findById(deviceCredentials.getUuidId()); DeviceCredentials existingCredentials = deviceCredentialsDao.findById(deviceCredentials.getUuidId());
if (existingCredentialsEntity == null) { if (existingCredentials == null) {
throw new DataValidationException("Unable to update non-existent device credentials!"); throw new DataValidationException("Unable to update non-existent device credentials!");
} }
DeviceCredentialsEntity sameCredentialsIdEntity = deviceCredentialsDao.findByCredentialsId(deviceCredentials.getCredentialsId()); DeviceCredentials sameCredentialsId = deviceCredentialsDao.findByCredentialsId(deviceCredentials.getCredentialsId());
if (sameCredentialsIdEntity != null && !sameCredentialsIdEntity.getId().equals(deviceCredentials.getUuidId())) { if (sameCredentialsId != null && !sameCredentialsId.getUuidId().equals(deviceCredentials.getUuidId())) {
throw new DataValidationException("Specified credentials are already registered!"); 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; 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 com.google.common.util.concurrent.ListenableFuture;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao; 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. * The Interface DeviceDao.
* *
*/ */
public interface DeviceDao extends Dao<DeviceEntity> { public interface DeviceDao extends Dao<Device> {
/** /**
* Save or update device object * Save or update device object
@ -37,7 +36,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param device the device object * @param device the device object
* @return saved device object * @return saved device object
*/ */
DeviceEntity save(Device device); Device save(Device device);
/** /**
* Find devices by tenantId and page link. * Find devices by tenantId and page link.
@ -46,7 +45,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of device objects * @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. * Find devices by tenantId and devices Ids.
@ -55,7 +54,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param deviceIds the device Ids * @param deviceIds the device Ids
* @return the list of device objects * @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. * Find devices by tenantId, customerId and page link.
@ -65,7 +64,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of device objects * @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. * Find devices by tenantId, customerId and devices Ids.
@ -75,7 +74,7 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param deviceIds the device Ids * @param deviceIds the device Ids
* @return the list of device objects * @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. * Find devices by tenantId and device name.
@ -84,5 +83,5 @@ public interface DeviceDao extends Dao<DeviceEntity> {
* @param name the device name * @param name the device name
* @return the optional device object * @return the optional device object
*/ */
Optional<DeviceEntity> findDevicesByTenantIdAndName(UUID tenantId, String name); Optional<Device> findDevicesByTenantIdAndName(UUID tenantId, String name);
} }

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

@ -43,13 +43,9 @@ import org.thingsboard.server.dao.tenant.TenantDao;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import static org.thingsboard.server.dao.DaoUtil.convertDataList; import static org.thingsboard.server.dao.DaoUtil.*;
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.model.ModelConstants.NULL_UUID;
import static org.thingsboard.server.dao.service.Validator.validateId; import static org.thingsboard.server.dao.service.Validator.*;
import static org.thingsboard.server.dao.service.Validator.validateIds;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
@Service @Service
@Slf4j @Slf4j
@ -71,15 +67,14 @@ public class DeviceServiceImpl implements DeviceService {
public Device findDeviceById(DeviceId deviceId) { public Device findDeviceById(DeviceId deviceId) {
log.trace("Executing findDeviceById [{}]", deviceId); log.trace("Executing findDeviceById [{}]", deviceId);
validateId(deviceId, "Incorrect deviceId " + deviceId); validateId(deviceId, "Incorrect deviceId " + deviceId);
DeviceEntity deviceEntity = deviceDao.findById(deviceId.getId()); return deviceDao.findById(deviceId.getId());
return getData(deviceEntity);
} }
@Override @Override
public ListenableFuture<Device> findDeviceByIdAsync(DeviceId deviceId) { public ListenableFuture<Device> findDeviceByIdAsync(DeviceId deviceId) {
log.trace("Executing findDeviceById [{}]", deviceId); log.trace("Executing findDeviceById [{}]", deviceId);
validateId(deviceId, "Incorrect deviceId " + deviceId); validateId(deviceId, "Incorrect deviceId " + deviceId);
ListenableFuture<DeviceEntity> deviceEntity = deviceDao.findByIdAsync(deviceId.getId()); ListenableFuture<Device> deviceEntity = deviceDao.findByIdAsync(deviceId.getId());
return Futures.transform(deviceEntity, (Function<? super DeviceEntity, ? extends Device>) input -> getData(input)); return Futures.transform(deviceEntity, (Function<? super DeviceEntity, ? extends Device>) input -> getData(input));
} }
@ -87,9 +82,9 @@ public class DeviceServiceImpl implements DeviceService {
public Optional<Device> findDeviceByTenantIdAndName(TenantId tenantId, String name) { public Optional<Device> findDeviceByTenantIdAndName(TenantId tenantId, String name) {
log.trace("Executing findDeviceByTenantIdAndName [{}][{}]", tenantId, name); log.trace("Executing findDeviceByTenantIdAndName [{}][{}]", tenantId, name);
validateId(tenantId, "Incorrect tenantId " + tenantId); validateId(tenantId, "Incorrect tenantId " + tenantId);
Optional<DeviceEntity> deviceEntityOpt = deviceDao.findDevicesByTenantIdAndName(tenantId.getId(), name); Optional<Device> deviceEntityOpt = deviceDao.findDevicesByTenantIdAndName(tenantId.getId(), name);
if (deviceEntityOpt.isPresent()) { if (deviceEntityOpt.isPresent()) {
return Optional.of(getData(deviceEntityOpt.get())); return Optional.of(deviceEntityOpt.get());
} else { } else {
return Optional.empty(); return Optional.empty();
} }
@ -99,15 +94,15 @@ public class DeviceServiceImpl implements DeviceService {
public Device saveDevice(Device device) { public Device saveDevice(Device device) {
log.trace("Executing saveDevice [{}]", device); log.trace("Executing saveDevice [{}]", device);
deviceValidator.validate(device); deviceValidator.validate(device);
DeviceEntity deviceEntity = deviceDao.save(device); Device savedDevice = deviceDao.save(device);
if (device.getId() == null) { if (device.getId() == null) {
DeviceCredentials deviceCredentials = new DeviceCredentials(); DeviceCredentials deviceCredentials = new DeviceCredentials();
deviceCredentials.setDeviceId(new DeviceId(deviceEntity.getId())); deviceCredentials.setDeviceId(new DeviceId(savedDevice.getUuidId()));
deviceCredentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN); deviceCredentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN);
deviceCredentials.setCredentialsId(RandomStringUtils.randomAlphanumeric(20)); deviceCredentials.setCredentialsId(RandomStringUtils.randomAlphanumeric(20));
deviceCredentialsService.createDeviceCredentials(deviceCredentials); deviceCredentialsService.createDeviceCredentials(deviceCredentials);
} }
return getData(deviceEntity); return savedDevice;
} }
@Override @Override
@ -140,8 +135,7 @@ public class DeviceServiceImpl implements DeviceService {
log.trace("Executing findDevicesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); log.trace("Executing findDevicesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
validateId(tenantId, "Incorrect tenantId " + tenantId); validateId(tenantId, "Incorrect tenantId " + tenantId);
validatePageLink(pageLink, "Incorrect page link " + pageLink); validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DeviceEntity> deviceEntities = deviceDao.findDevicesByTenantId(tenantId.getId(), pageLink); List<Device> devices = deviceDao.findDevicesByTenantId(tenantId.getId(), pageLink);
List<Device> devices = convertDataList(deviceEntities);
return new TextPageData<Device>(devices, pageLink); return new TextPageData<Device>(devices, pageLink);
} }
@ -150,7 +144,7 @@ public class DeviceServiceImpl implements DeviceService {
log.trace("Executing findDevicesByTenantIdAndIdsAsync, tenantId [{}], deviceIds [{}]", tenantId, deviceIds); log.trace("Executing findDevicesByTenantIdAndIdsAsync, tenantId [{}], deviceIds [{}]", tenantId, deviceIds);
validateId(tenantId, "Incorrect tenantId " + tenantId); validateId(tenantId, "Incorrect tenantId " + tenantId);
validateIds(deviceIds, "Incorrect deviceIds " + deviceIds); validateIds(deviceIds, "Incorrect deviceIds " + deviceIds);
ListenableFuture<List<DeviceEntity>> deviceEntities = deviceDao.findDevicesByTenantIdAndIdsAsync(tenantId.getId(), toUUIDs(deviceIds)); ListenableFuture<List<Device>> devices = deviceDao.findDevicesByTenantIdAndIdsAsync(tenantId.getId(), toUUIDs(deviceIds));
return Futures.transform(deviceEntities, (Function<List<DeviceEntity>, List<Device>>) input -> convertDataList(input)); return Futures.transform(deviceEntities, (Function<List<DeviceEntity>, List<Device>>) input -> convertDataList(input));
} }
@ -168,8 +162,7 @@ public class DeviceServiceImpl implements DeviceService {
validateId(tenantId, "Incorrect tenantId " + tenantId); validateId(tenantId, "Incorrect tenantId " + tenantId);
validateId(customerId, "Incorrect customerId " + customerId); validateId(customerId, "Incorrect customerId " + customerId);
validatePageLink(pageLink, "Incorrect page link " + pageLink); validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DeviceEntity> deviceEntities = deviceDao.findDevicesByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink); List<Device> devices = deviceDao.findDevicesByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink);
List<Device> devices = convertDataList(deviceEntities);
return new TextPageData<Device>(devices, pageLink); return new TextPageData<Device>(devices, pageLink);
} }

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

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.dao.event; package org.thingsboard.server.dao.event;
// CASSANDRA ???
import com.datastax.driver.core.utils.UUIDs; import com.datastax.driver.core.utils.UUIDs;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -27,14 +28,11 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TimePageData; import org.thingsboard.server.common.data.page.TimePageData;
import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.EventEntity;
import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.DataValidator;
import java.util.List; import java.util.List;
import java.util.Optional; 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; import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@Service @Service
@ -59,7 +57,7 @@ public class BaseEventService implements EventService {
if (StringUtils.isEmpty(event.getUid())) { if (StringUtils.isEmpty(event.getUid())) {
event.setUid(event.getId().toString()); event.setUid(event.getId().toString());
} }
return getData(eventDao.save(event)); return eventDao.save(event);
} }
@Override @Override
@ -75,8 +73,8 @@ public class BaseEventService implements EventService {
if (event.getId() == null) { if (event.getId() == null) {
event.setId(new EventId(UUIDs.timeBased())); event.setId(new EventId(UUIDs.timeBased()));
} }
Optional<EventEntity> result = eventDao.saveIfNotExists(event); Optional<Event> result = eventDao.saveIfNotExists(event);
return result.isPresent() ? Optional.of(getData(result.get())) : Optional.empty(); return result.isPresent() ? Optional.of(result.get()) : Optional.empty();
} }
@Override @Override
@ -93,22 +91,19 @@ public class BaseEventService implements EventService {
if (StringUtils.isEmpty(eventUid)) { if (StringUtils.isEmpty(eventUid)) {
throw new DataValidationException("Event uid should be specified!."); throw new DataValidationException("Event uid should be specified!.");
} }
EventEntity entity = eventDao.findEvent(tenantId.getId(), entityId, eventType, eventUid); Event event = eventDao.findEvent(tenantId.getId(), entityId, eventType, eventUid);
return entity != null ? Optional.of(getData(entity)) : Optional.empty(); return event != null ? Optional.of(event) : Optional.empty();
} }
@Override @Override
public TimePageData<Event> findEvents(TenantId tenantId, EntityId entityId, TimePageLink pageLink) { public TimePageData<Event> findEvents(TenantId tenantId, EntityId entityId, TimePageLink pageLink) {
List<EventEntity> entities = eventDao.findEvents(tenantId.getId(), entityId, pageLink); List<Event> events = eventDao.findEvents(tenantId.getId(), entityId, pageLink);
List<Event> events = convertDataList(entities);
return new TimePageData<Event>(events, pageLink); return new TimePageData<Event>(events, pageLink);
} }
@Override @Override
public TimePageData<Event> findEvents(TenantId tenantId, EntityId entityId, String eventType, TimePageLink pageLink) { 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 = eventDao.findEvents(tenantId.getId(), entityId, eventType, pageLink);
List<Event> events = convertDataList(entities);
return new TimePageData<Event>(events, pageLink); return new TimePageData<Event>(events, pageLink);
} }

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

@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.Event;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.AbstractSearchTimeDao; import org.thingsboard.server.dao.AbstractSearchTimeDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.EventEntity; import org.thingsboard.server.dao.model.EventEntity;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
@ -36,13 +37,11 @@ import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select; 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.*;
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;
@Component @Component
@Slf4j @Slf4j
public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements EventDao { public class CassandraBaseEventDao extends AbstractSearchTimeDao<EventEntity, Event> implements EventDao {
@Override @Override
protected Class<EventEntity> getColumnFamilyClass() { protected Class<EventEntity> getColumnFamilyClass() {
@ -55,18 +54,18 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
} }
@Override @Override
public EventEntity save(Event event) { public Event save(Event event) {
log.debug("Save event [{}] ", event); log.debug("Save event [{}] ", event);
return save(new EventEntity(event), false).orElse(null); return save(new EventEntity(event), false).orElse(null);
} }
@Override @Override
public Optional<EventEntity> saveIfNotExists(Event event) { public Optional<Event> saveIfNotExists(Event event) {
return save(new EventEntity(event), true); return save(new EventEntity(event), true);
} }
@Override @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); log.debug("Search event entity by [{}][{}][{}][{}]", tenantId, entityId, eventType, eventUid);
Select.Where query = select().from(getColumnFamilyName()).where( Select.Where query = select().from(getColumnFamilyName()).where(
eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId)) eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId))
@ -81,11 +80,11 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
} else { } else {
log.debug("Search result: [{}]", entity != null); log.debug("Search result: [{}]", entity != null);
} }
return entity; return DaoUtil.getData(entity);
} }
@Override @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); log.trace("Try to find events by tenant [{}], entity [{}]and pageLink [{}]", tenantId, entityId, pageLink);
List<EventEntity> entities = findPageWithTimeSearch(EVENT_BY_ID_VIEW_NAME, List<EventEntity> entities = findPageWithTimeSearch(EVENT_BY_ID_VIEW_NAME,
Arrays.asList(eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId), Arrays.asList(eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId),
@ -93,11 +92,11 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
eq(ModelConstants.EVENT_ENTITY_ID_PROPERTY, entityId.getId())), eq(ModelConstants.EVENT_ENTITY_ID_PROPERTY, entityId.getId())),
pageLink); pageLink);
log.trace("Found events by tenant [{}], entity [{}] and pageLink [{}]", tenantId, entityId, pageLink); log.trace("Found events by tenant [{}], entity [{}] and pageLink [{}]", tenantId, entityId, pageLink);
return entities; return DaoUtil.convertDataList(entities);
} }
@Override @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); 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, List<EventEntity> entities = findPageWithTimeSearch(EVENT_BY_TYPE_AND_ID_VIEW_NAME,
Arrays.asList(eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId), Arrays.asList(eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId),
@ -108,10 +107,10 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
QueryBuilder.desc(ModelConstants.EVENT_TYPE_PROPERTY), QueryBuilder.desc(ModelConstants.EVENT_TYPE_PROPERTY),
pageLink); pageLink);
log.trace("Found events by tenant [{}], entity [{}], type [{}] and pageLink [{}]", tenantId, entityId, eventType, 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) { if (entity.getId() == null) {
entity.setId(UUIDs.timeBased()); entity.setId(UUIDs.timeBased());
} }
@ -128,7 +127,7 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
} }
ResultSet rs = executeWrite(insert); ResultSet rs = executeWrite(insert);
if (rs.wasApplied()) { if (rs.wasApplied()) {
return Optional.of(entity); return Optional.of(DaoUtil.getData(entity));
} else { } else {
return Optional.empty(); 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.id.EntityId;
import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.EventEntity;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -27,10 +26,8 @@ import java.util.UUID;
/** /**
* The Interface DeviceDao. * 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 * Save or update event object
@ -38,7 +35,7 @@ public interface EventDao extends Dao<EventEntity> {
* @param event the event object * @param event the event object
* @return saved event object * @return saved event object
*/ */
EventEntity save(Event event); Event save(Event event);
/** /**
* Save event object if it is not yet saved * Save event object if it is not yet saved
@ -46,7 +43,7 @@ public interface EventDao extends Dao<EventEntity> {
* @param event the event object * @param event the event object
* @return saved event object * @return saved event object
*/ */
Optional<EventEntity> saveIfNotExists(Event event); Optional<Event> saveIfNotExists(Event event);
/** /**
* Find event by tenantId, entityId and eventUid. * Find event by tenantId, entityId and eventUid.
@ -57,7 +54,7 @@ public interface EventDao extends Dao<EventEntity> {
* @param eventUid the eventUid * @param eventUid the eventUid
* @return the event * @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. * Find events by tenantId, entityId and pageLink.
@ -67,7 +64,7 @@ public interface EventDao extends Dao<EventEntity> {
* @param pageLink the pageLink * @param pageLink the pageLink
* @return the event list * @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. * Find events by tenantId, entityId, eventType and pageLink.
@ -78,5 +75,5 @@ public interface EventDao extends Dao<EventEntity> {
* @param pageLink the pageLink * @param pageLink the pageLink
* @return the event list * @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.TimePageData;
import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.page.TimePageLink;
import java.util.List;
import java.util.Optional; import java.util.Optional;
public interface EventService { public interface EventService {

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

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

@ -15,17 +15,15 @@
*/ */
package org.thingsboard.server.dao.plugin; package org.thingsboard.server.dao.plugin;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.querybuilder.Select; import com.datastax.driver.core.querybuilder.Select;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.id.PluginId; import org.thingsboard.server.common.data.id.PluginId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.plugin.PluginMetaData; 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.ModelConstants;
import org.thingsboard.server.dao.model.PluginMetaDataEntity; import org.thingsboard.server.dao.model.PluginMetaDataEntity;
@ -38,7 +36,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@Component @Component
@Slf4j @Slf4j
public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> implements PluginDao { public class CassandraBasePluginDao extends CassandraAbstractSearchTextDao<PluginMetaDataEntity, PluginMetaData> implements PluginDao {
@Override @Override
protected Class<PluginMetaDataEntity> getColumnFamilyClass() { protected Class<PluginMetaDataEntity> getColumnFamilyClass() {
@ -51,24 +49,19 @@ public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> i
} }
@Override @Override
public PluginMetaDataEntity save(PluginMetaData plugin) { public PluginMetaData findById(PluginId pluginId) {
return save(new PluginMetaDataEntity(plugin));
}
@Override
public PluginMetaDataEntity findById(PluginId pluginId) {
log.debug("Search plugin meta-data entity by id [{}]", 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()) { if (log.isTraceEnabled()) {
log.trace("Search result: [{}] for plugin entity [{}]", entity != null, entity); log.trace("Search result: [{}] for plugin entity [{}]", pluginMetaData != null, pluginMetaData);
} else { } else {
log.debug("Search result: [{}]", entity != null); log.debug("Search result: [{}]", pluginMetaData != null);
} }
return entity; return pluginMetaData;
} }
@Override @Override
public PluginMetaDataEntity findByApiToken(String apiToken) { public PluginMetaData findByApiToken(String apiToken) {
log.debug("Search plugin meta-data entity by api token [{}]", 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)); 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); log.trace("Execute query [{}]", query);
@ -78,14 +71,14 @@ public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> i
} else { } else {
log.debug("Search result: [{}]", entity != null); log.debug("Search result: [{}]", entity != null);
} }
return entity; return DaoUtil.getData(entity);
} }
@Override @Override
public void deleteById(UUID id) { public void deleteById(UUID id) {
log.debug("Delete plugin meta-data entity by id [{}]", id); log.debug("Delete plugin meta-data entity by id [{}]", id);
ResultSet resultSet = removeById(id); boolean result = removeById(id);
log.debug("Delete result: [{}]", resultSet.wasApplied()); log.debug("Delete result: [{}]", result);
} }
@Override @Override
@ -94,7 +87,7 @@ public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> i
} }
@Override @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); 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, 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); Arrays.asList(eq(ModelConstants.PLUGIN_TENANT_ID_PROPERTY, tenantId.getId())), pageLink);
@ -103,11 +96,11 @@ public class BasePluginDao extends AbstractSearchTextDao<PluginMetaDataEntity> i
} else { } else {
log.debug("Search result: [{}]", entities.size()); log.debug("Search result: [{}]", entities.size());
} }
return entities; return DaoUtil.convertDataList(entities);
} }
@Override @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); 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, 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))), 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 { } else {
log.debug("Search result: [{}]", pluginEntities.size()); 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.page.TextPageLink;
import org.thingsboard.server.common.data.plugin.PluginMetaData; import org.thingsboard.server.common.data.plugin.PluginMetaData;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.PluginMetaDataEntity;
import java.util.List; import java.util.List;
import java.util.UUID; 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(UUID id);
void deleteById(PluginId pluginId); 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. * 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 * @param pageLink the page link
* @return the list of plugins objects * @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.DataValidationException;
import org.thingsboard.server.dao.exception.DatabaseException; import org.thingsboard.server.dao.exception.DatabaseException;
import org.thingsboard.server.dao.exception.IncorrectParameterException; 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.plugin.PluginService;
import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.PaginatedRemover;
@ -45,8 +44,6 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.function.Function; 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.model.ModelConstants.NULL_UUID;
import static org.thingsboard.server.dao.service.Validator.validateId; import static org.thingsboard.server.dao.service.Validator.validateId;
import static org.thingsboard.server.dao.service.Validator.validatePageLink; import static org.thingsboard.server.dao.service.Validator.validatePageLink;
@ -74,7 +71,7 @@ public class BaseRuleService implements RuleService {
rule.setTenantId(systemTenantId); rule.setTenantId(systemTenantId);
} }
if (rule.getId() != null) { if (rule.getId() != null) {
RuleMetaData oldVersion = getData(ruleDao.findById(rule.getId())); RuleMetaData oldVersion = ruleDao.findById(rule.getId());
if (rule.getState() == null) { if (rule.getState() == null) {
rule.setState(oldVersion.getState()); rule.setState(oldVersion.getState());
} else if (rule.getState() != oldVersion.getState()) { } else if (rule.getState() != oldVersion.getState()) {
@ -94,7 +91,7 @@ public class BaseRuleService implements RuleService {
} }
validateComponentJson(rule.getAction(), ComponentType.ACTION); validateComponentJson(rule.getAction(), ComponentType.ACTION);
validateRuleAndPluginState(rule); validateRuleAndPluginState(rule);
return getData(ruleDao.save(rule)); return ruleDao.save(rule);
} }
private void validateFilters(JsonNode filtersJson) { private void validateFilters(JsonNode filtersJson) {
@ -163,30 +160,27 @@ public class BaseRuleService implements RuleService {
@Override @Override
public RuleMetaData findRuleById(RuleId ruleId) { public RuleMetaData findRuleById(RuleId ruleId) {
validateId(ruleId, "Incorrect rule id for search rule request."); validateId(ruleId, "Incorrect rule id for search rule request.");
return getData(ruleDao.findById(ruleId.getId())); return ruleDao.findById(ruleId.getId());
} }
@Override @Override
public List<RuleMetaData> findPluginRules(String pluginToken) { public List<RuleMetaData> findPluginRules(String pluginToken) {
List<RuleMetaDataEntity> ruleEntities = ruleDao.findRulesByPlugin(pluginToken); return ruleDao.findRulesByPlugin(pluginToken);
return convertDataList(ruleEntities);
} }
@Override @Override
public TextPageData<RuleMetaData> findSystemRules(TextPageLink pageLink) { public TextPageData<RuleMetaData> findSystemRules(TextPageLink pageLink) {
validatePageLink(pageLink, "Incorrect PageLink object for search rule request."); validatePageLink(pageLink, "Incorrect PageLink object for search rule request.");
List<RuleMetaDataEntity> ruleEntities = ruleDao.findByTenantIdAndPageLink(systemTenantId, pageLink); List<RuleMetaData> rules = ruleDao.findByTenantIdAndPageLink(systemTenantId, pageLink);
List<RuleMetaData> plugins = convertDataList(ruleEntities); return new TextPageData<>(rules, pageLink);
return new TextPageData<>(plugins, pageLink);
} }
@Override @Override
public TextPageData<RuleMetaData> findTenantRules(TenantId tenantId, TextPageLink pageLink) { public TextPageData<RuleMetaData> findTenantRules(TenantId tenantId, TextPageLink pageLink) {
validateId(tenantId, "Incorrect tenant id for search rule request."); validateId(tenantId, "Incorrect tenant id for search rule request.");
validatePageLink(pageLink, "Incorrect PageLink object for search rule request."); validatePageLink(pageLink, "Incorrect PageLink object for search rule request.");
List<RuleMetaDataEntity> ruleEntities = ruleDao.findByTenantIdAndPageLink(tenantId, pageLink); List<RuleMetaData> rules = ruleDao.findByTenantIdAndPageLink(tenantId, pageLink);
List<RuleMetaData> plugins = convertDataList(ruleEntities); return new TextPageData<>(rules, pageLink);
return new TextPageData<>(plugins, pageLink);
} }
@Override @Override
@ -210,8 +204,7 @@ public class BaseRuleService implements RuleService {
log.trace("Executing findAllTenantRulesByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink); log.trace("Executing findAllTenantRulesByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<RuleMetaDataEntity> rulesEntities = ruleDao.findAllTenantRulesByTenantId(tenantId.getId(), pageLink); List<RuleMetaData> rules = ruleDao.findAllTenantRulesByTenantId(tenantId.getId(), pageLink);
List<RuleMetaData> rules = convertDataList(rulesEntities);
return new TextPageData<>(rules, pageLink); return new TextPageData<>(rules, pageLink);
} }
@ -251,10 +244,10 @@ public class BaseRuleService implements RuleService {
private void updateLifeCycleState(RuleId ruleId, ComponentLifecycleState state) { private void updateLifeCycleState(RuleId ruleId, ComponentLifecycleState state) {
Validator.validateId(ruleId, "Incorrect rule id for state change request."); Validator.validateId(ruleId, "Incorrect rule id for state change request.");
RuleMetaDataEntity rule = ruleDao.findById(ruleId); RuleMetaData rule = ruleDao.findById(ruleId);
if (rule != null) { if (rule != null) {
rule.setState(state); rule.setState(state);
validateRuleAndPluginState(getData(rule)); validateRuleAndPluginState(rule);
ruleDao.save(rule); ruleDao.save(rule);
} else { } else {
throw new DatabaseException("Plugin not found!"); throw new DatabaseException("Plugin not found!");
@ -277,17 +270,17 @@ public class BaseRuleService implements RuleService {
} }
}; };
private PaginatedRemover<TenantId, RuleMetaDataEntity> tenantRulesRemover = private PaginatedRemover<TenantId, RuleMetaData> tenantRulesRemover =
new PaginatedRemover<TenantId, RuleMetaDataEntity>() { new PaginatedRemover<TenantId, RuleMetaData>() {
@Override @Override
protected List<RuleMetaDataEntity> findEntities(TenantId id, TextPageLink pageLink) { protected List<RuleMetaData> findEntities(TenantId id, TextPageLink pageLink) {
return ruleDao.findByTenantIdAndPageLink(id, pageLink); return ruleDao.findByTenantIdAndPageLink(id, pageLink);
} }
@Override @Override
protected void removeEntity(RuleMetaDataEntity entity) { protected void removeEntity(RuleMetaData entity) {
ruleDao.deleteById(entity.getId()); ruleDao.deleteById(entity.getUuidId());
} }
}; };

29
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; package org.thingsboard.server.dao.rule;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.querybuilder.Select; import com.datastax.driver.core.querybuilder.Select;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -23,7 +22,8 @@ import org.thingsboard.server.common.data.id.RuleId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.rule.RuleMetaData; 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.ModelConstants;
import org.thingsboard.server.dao.model.RuleMetaDataEntity; import org.thingsboard.server.dao.model.RuleMetaDataEntity;
@ -36,7 +36,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@Component @Component
@Slf4j @Slf4j
public class BaseRuleDao extends AbstractSearchTextDao<RuleMetaDataEntity> implements RuleDao { public class CassandraBaseRuleDao extends CassandraAbstractSearchTextDao<RuleMetaDataEntity, RuleMetaData> implements RuleDao {
@Override @Override
protected Class<RuleMetaDataEntity> getColumnFamilyClass() { protected Class<RuleMetaDataEntity> getColumnFamilyClass() {
@ -49,17 +49,12 @@ public class BaseRuleDao extends AbstractSearchTextDao<RuleMetaDataEntity> imple
} }
@Override @Override
public RuleMetaDataEntity findById(RuleId ruleId) { public RuleMetaData findById(RuleId ruleId) {
return findById(ruleId.getId()); return findById(ruleId.getId());
} }
@Override @Override
public RuleMetaDataEntity save(RuleMetaData rule) { public List<RuleMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
return save(new RuleMetaDataEntity(rule));
}
@Override
public List<RuleMetaDataEntity> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
log.debug("Try to find rules by tenantId [{}] and pageLink [{}]", tenantId, 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, 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); Arrays.asList(eq(ModelConstants.RULE_TENANT_ID_PROPERTY, tenantId.getId())), pageLink);
@ -68,11 +63,11 @@ public class BaseRuleDao extends AbstractSearchTextDao<RuleMetaDataEntity> imple
} else { } else {
log.debug("Search result: [{}]", entities.size()); log.debug("Search result: [{}]", entities.size());
} }
return entities; return DaoUtil.convertDataList(entities);
} }
@Override @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); 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, 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))), 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 { } else {
log.debug("Search result: [{}]", entities.size()); log.debug("Search result: [{}]", entities.size());
} }
return entities; return DaoUtil.convertDataList(entities);
} }
@Override @Override
public List<RuleMetaDataEntity> findRulesByPlugin(String pluginToken) { public List<RuleMetaData> findRulesByPlugin(String pluginToken) {
log.debug("Search rules by api token [{}]", pluginToken); log.debug("Search rules by api token [{}]", pluginToken);
Select select = select().from(ModelConstants.RULE_BY_PLUGIN_TOKEN); Select select = select().from(ModelConstants.RULE_BY_PLUGIN_TOKEN);
Select.Where query = select.where(); Select.Where query = select.where();
query.and(eq(ModelConstants.RULE_PLUGIN_TOKEN_PROPERTY, pluginToken)); query.and(eq(ModelConstants.RULE_PLUGIN_TOKEN_PROPERTY, pluginToken));
return findListByStatement(query); return DaoUtil.convertDataList(findListByStatement(query));
} }
@Override @Override
public void deleteById(UUID id) { public void deleteById(UUID id) {
log.debug("Delete rule meta-data entity by id [{}]", id); log.debug("Delete rule meta-data entity by id [{}]", id);
ResultSet resultSet = removeById(id); boolean result = removeById(id);
log.debug("Delete result: [{}]", resultSet.wasApplied()); log.debug("Delete result: [{}]", result);
} }
@Override @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.page.TextPageLink;
import org.thingsboard.server.common.data.rule.RuleMetaData; import org.thingsboard.server.common.data.rule.RuleMetaData;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.RuleMetaDataEntity;
import java.util.List; import java.util.List;
import java.util.UUID; 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. * 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 * @param pageLink the page link
* @return the list of rules objects * @return the list of rules objects
*/ */
List<RuleMetaDataEntity> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink); List<RuleMetaData> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink);
void deleteById(UUID id); 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; package org.thingsboard.server.dao.service;
import java.util.HashSet; import com.fasterxml.jackson.databind.JsonNode;
import java.util.Iterator;
import java.util.Set;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.validator.routines.EmailValidator; import org.apache.commons.validator.routines.EmailValidator;
import org.thingsboard.server.common.data.BaseData; import org.thingsboard.server.common.data.BaseData;
import org.thingsboard.server.dao.exception.DataValidationException; 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 @Slf4j
public abstract class DataValidator<D extends BaseData<?>> { public abstract class DataValidator<D extends BaseData<?>> {

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

@ -1,12 +1,12 @@
/** /**
* Copyright © 2016-2017 The Thingsboard Authors * Copyright © 2016-2017 The Thingsboard Authors
* * <p>
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* * <p>
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* * <p>
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -15,33 +15,35 @@
*/ */
package org.thingsboard.server.dao.service; 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.List;
import java.util.UUID; import java.util.UUID;
import org.thingsboard.server.common.data.page.TextPageLink; public abstract class PaginatedRemover<I, D extends IdBased<?>> {
import org.thingsboard.server.dao.model.BaseEntity;
public abstract class PaginatedRemover<I, E extends BaseEntity<?>> { private static final int DEFAULT_LIMIT = 100;
public void removeEntitites(I id) { public void removeEntitites(I id) {
TextPageLink pageLink = new TextPageLink(100); TextPageLink pageLink = new TextPageLink(DEFAULT_LIMIT);
boolean hasNext = true; boolean hasNext = true;
while (hasNext) { while (hasNext) {
List<E> entities = findEntities(id, pageLink); List<D> entities = findEntities(id, pageLink);
for (E entity : entities) { for (D entity : entities) {
removeEntity(entity); removeEntity(entity);
} }
hasNext = entities.size() == pageLink.getLimit(); hasNext = entities.size() == pageLink.getLimit();
if (hasNext) { if (hasNext) {
int index = entities.size()-1; int index = entities.size() - 1;
UUID idOffset = entities.get(index).getId(); UUID idOffset = entities.get(index).getUuidId();
pageLink.setIdOffset(idOffset); pageLink.setIdOffset(idOffset);
} }
} }
} }
protected abstract List<E> findEntities(I id, TextPageLink pageLink); protected abstract List<D> findEntities(I id, TextPageLink pageLink);
protected abstract void removeEntity(E entity); 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.common.data.AdminSettings;
import org.thingsboard.server.dao.Dao; 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 * Save or update admin settings object
@ -27,7 +26,7 @@ public interface AdminSettingsDao extends Dao<AdminSettingsEntity> {
* @param adminSettings the admin settings object * @param adminSettings the admin settings object
* @return saved admin settings object * @return saved admin settings object
*/ */
AdminSettingsEntity save(AdminSettings adminSettings); AdminSettings save(AdminSettings adminSettings);
/** /**
* Find admin settings by key. * Find admin settings by key.
@ -35,6 +34,6 @@ public interface AdminSettingsDao extends Dao<AdminSettingsEntity> {
* @param key the key * @param key the key
* @return the admin settings object * @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 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; package org.thingsboard.server.dao.settings;
import static org.thingsboard.server.dao.DaoUtil.getData;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; 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.AdminSettings;
import org.thingsboard.server.common.data.id.AdminSettingsId; import org.thingsboard.server.common.data.id.AdminSettingsId;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.AdminSettingsEntity;
import org.thingsboard.server.dao.service.DataValidator; 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; import org.thingsboard.server.dao.service.Validator;
@Service @Service
@ -41,24 +36,21 @@ public class AdminSettingsServiceImpl implements AdminSettingsService {
public AdminSettings findAdminSettingsById(AdminSettingsId adminSettingsId) { public AdminSettings findAdminSettingsById(AdminSettingsId adminSettingsId) {
log.trace("Executing findAdminSettingsById [{}]", adminSettingsId); log.trace("Executing findAdminSettingsById [{}]", adminSettingsId);
Validator.validateId(adminSettingsId, "Incorrect adminSettingsId " + adminSettingsId); Validator.validateId(adminSettingsId, "Incorrect adminSettingsId " + adminSettingsId);
AdminSettingsEntity adminSettingsEntity = adminSettingsDao.findById(adminSettingsId.getId()); return adminSettingsDao.findById(adminSettingsId.getId());
return getData(adminSettingsEntity);
} }
@Override @Override
public AdminSettings findAdminSettingsByKey(String key) { public AdminSettings findAdminSettingsByKey(String key) {
log.trace("Executing findAdminSettingsByKey [{}]", key); log.trace("Executing findAdminSettingsByKey [{}]", key);
Validator.validateString(key, "Incorrect key " + key); Validator.validateString(key, "Incorrect key " + key);
AdminSettingsEntity adminSettingsEntity = adminSettingsDao.findByKey(key); return adminSettingsDao.findByKey(key);
return getData(adminSettingsEntity);
} }
@Override @Override
public AdminSettings saveAdminSettings(AdminSettings adminSettings) { public AdminSettings saveAdminSettings(AdminSettings adminSettings) {
log.trace("Executing saveAdminSettings [{}]", adminSettings); log.trace("Executing saveAdminSettings [{}]", adminSettings);
adminSettingsValidator.validate(adminSettings); adminSettingsValidator.validate(adminSettings);
AdminSettingsEntity adminSettingsEntity = adminSettingsDao.save(adminSettings); return adminSettingsDao.save(adminSettings);
return getData(adminSettingsEntity);
} }
private DataValidator<AdminSettings> adminSettingsValidator = private DataValidator<AdminSettings> adminSettingsValidator =

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

31
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; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao; import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.TenantEntity; import org.thingsboard.server.dao.model.TenantEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; 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 @Component
@Slf4j @Slf4j
public class TenantDaoImpl extends AbstractSearchTextDao<TenantEntity> implements TenantDao { public class CassandraTenantDao extends CassandraAbstractSearchTextDao<TenantEntity, Tenant> implements TenantDao {
@Override @Override
protected Class<TenantEntity> getColumnFamilyClass() { protected Class<TenantEntity> getColumnFamilyClass() {
@ -45,21 +42,15 @@ public class TenantDaoImpl extends AbstractSearchTextDao<TenantEntity> implement
protected String getColumnFamilyName() { protected String getColumnFamilyName() {
return TENANT_COLUMN_FAMILY_NAME; return TENANT_COLUMN_FAMILY_NAME;
} }
@Override
public TenantEntity save(Tenant tenant) {
log.debug("Save tenant [{}] ", tenant);
return save(new TenantEntity(tenant));
}
@Override @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); 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, List<TenantEntity> tenantEntities = findPageWithTextSearch(TENANT_BY_REGION_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(TENANT_REGION_PROPERTY, region)), Arrays.asList(eq(TENANT_REGION_PROPERTY, region)),
pageLink); pageLink);
log.trace("Found tenants [{}] by region [{}] and pageLink [{}]", tenantEntities, 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; package org.thingsboard.server.dao.tenant;
import java.util.List;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao; 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 * Save or update tenant object
@ -30,7 +29,7 @@ public interface TenantDao extends Dao<TenantEntity> {
* @param tenant the tenant object * @param tenant the tenant object
* @return saved tenant object * @return saved tenant object
*/ */
TenantEntity save(Tenant tenant); Tenant save(Tenant tenant);
/** /**
* Find tenants by region and page link. * Find tenants by region and page link.
@ -39,6 +38,6 @@ public interface TenantDao extends Dao<TenantEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of tenant objects * @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 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); void deleteTenants();
public void deleteTenants();
} }

37
dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java

@ -15,13 +15,10 @@
*/ */
package org.thingsboard.server.dao.tenant; package org.thingsboard.server.dao.tenant;
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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageData;
@ -30,19 +27,16 @@ import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.dashboard.DashboardService;
import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.TenantEntity;
import org.thingsboard.server.dao.plugin.PluginService; import org.thingsboard.server.dao.plugin.PluginService;
import org.thingsboard.server.dao.rule.RuleService; import org.thingsboard.server.dao.rule.RuleService;
import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.PaginatedRemover;
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 org.thingsboard.server.dao.service.Validator;
import org.thingsboard.server.dao.user.UserService;
import org.thingsboard.server.dao.widget.WidgetsBundleService; import org.thingsboard.server.dao.widget.WidgetsBundleService;
import java.util.List;
@Service @Service
@Slf4j @Slf4j
public class TenantServiceImpl implements TenantService { public class TenantServiceImpl implements TenantService {
@ -77,8 +71,7 @@ public class TenantServiceImpl implements TenantService {
public Tenant findTenantById(TenantId tenantId) { public Tenant findTenantById(TenantId tenantId) {
log.trace("Executing findTenantById [{}]", tenantId); log.trace("Executing findTenantById [{}]", tenantId);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
TenantEntity tenantEntity = tenantDao.findById(tenantId.getId()); return tenantDao.findById(tenantId.getId());
return getData(tenantEntity);
} }
@Override @Override
@ -86,8 +79,7 @@ public class TenantServiceImpl implements TenantService {
log.trace("Executing saveTenant [{}]", tenant); log.trace("Executing saveTenant [{}]", tenant);
tenant.setRegion(DEFAULT_TENANT_REGION); tenant.setRegion(DEFAULT_TENANT_REGION);
tenantValidator.validate(tenant); tenantValidator.validate(tenant);
TenantEntity tenantEntity = tenantDao.save(tenant); return tenantDao.save(tenant);
return getData(tenantEntity);
} }
@Override @Override
@ -108,9 +100,8 @@ public class TenantServiceImpl implements TenantService {
public TextPageData<Tenant> findTenants(TextPageLink pageLink) { public TextPageData<Tenant> findTenants(TextPageLink pageLink) {
log.trace("Executing findTenants pageLink [{}]", pageLink); log.trace("Executing findTenants pageLink [{}]", pageLink);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<TenantEntity> tenantEntities = tenantDao.findTenantsByRegion(DEFAULT_TENANT_REGION, pageLink); List<Tenant> tenants = tenantDao.findTenantsByRegion(DEFAULT_TENANT_REGION, pageLink);
List<Tenant> tenants = convertDataList(tenantEntities); return new TextPageData<>(tenants, pageLink);
return new TextPageData<Tenant>(tenants, pageLink);
} }
@Override @Override
@ -132,17 +123,17 @@ public class TenantServiceImpl implements TenantService {
} }
}; };
private PaginatedRemover<String, TenantEntity> tenantsRemover = private PaginatedRemover<String, Tenant> tenantsRemover =
new PaginatedRemover<String, TenantEntity>() { new PaginatedRemover<String, Tenant>() {
@Override @Override
protected List<TenantEntity> findEntities(String region, TextPageLink pageLink) { protected List<Tenant> findEntities(String region, TextPageLink pageLink) {
return tenantDao.findTenantsByRegion(region, pageLink); return tenantDao.findTenantsByRegion(region, pageLink);
} }
@Override @Override
protected void removeEntity(TenantEntity entity) { protected void removeEntity(Tenant entity) {
deleteTenant(new TenantId(entity.getId())); deleteTenant(new TenantId(entity.getUuidId()));
} }
}; };
} }

21
dao/src/main/java/org/thingsboard/server/dao/timeseries/BaseTimeseriesService.java

@ -15,34 +15,25 @@
*/ */
package org.thingsboard.server.dao.timeseries; package org.thingsboard.server.dao.timeseries;
// CASSANDRA ???
import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture; import com.datastax.driver.core.ResultSetFuture;
import com.datastax.driver.core.Row; import com.datastax.driver.core.Row;
import com.google.common.base.Function;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.id.UUIDBased; import org.thingsboard.server.common.data.id.UUIDBased;
import org.thingsboard.server.common.data.kv.BaseTsKvQuery;
import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.kv.TsKvQuery; import org.thingsboard.server.common.data.kv.TsKvQuery;
import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thingsboard.server.dao.service.Validator; import org.thingsboard.server.dao.service.Validator;
import javax.annotation.Nullable; import java.util.Collection;
import javax.annotation.PostConstruct; import java.util.List;
import javax.annotation.PreDestroy; import java.util.UUID;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isBlank;

13
dao/src/main/java/org/thingsboard/server/dao/timeseries/BaseTimeseriesDao.java → dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java

@ -28,8 +28,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.kv.*; import org.thingsboard.server.common.data.kv.*;
import org.thingsboard.server.common.data.kv.DataType; import org.thingsboard.server.common.data.kv.DataType;
import org.thingsboard.server.dao.AbstractAsyncDao; import org.thingsboard.server.dao.CassandraAbstractAsyncDao;
import org.thingsboard.server.dao.AbstractDao;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -38,20 +37,20 @@ import javax.annotation.PreDestroy;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.*; import java.util.ArrayList;
import java.util.concurrent.ExecutorService; import java.util.List;
import java.util.concurrent.Executors; import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
/** /**
* @author Andrew Shvayka * @author Andrew Shvayka
*/ */
@Component @Component
@Slf4j @Slf4j
public class BaseTimeseriesDao extends AbstractAsyncDao implements TimeseriesDao { public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implements TimeseriesDao {
//@Value("${cassandra.query.min_aggregation_step_ms}") //@Value("${cassandra.query.min_aggregation_step_ms}")
//TODO: //TODO:

3
dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesDao.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.dao.timeseries; package org.thingsboard.server.dao.timeseries;
// CASSANDRA ???
import com.datastax.driver.core.ResultSetFuture; import com.datastax.driver.core.ResultSetFuture;
import com.datastax.driver.core.Row; import com.datastax.driver.core.Row;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
@ -22,8 +23,6 @@ import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.kv.TsKvQuery; import org.thingsboard.server.common.data.kv.TsKvQuery;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
/** /**

3
dao/src/main/java/org/thingsboard/server/dao/timeseries/TimeseriesService.java

@ -15,18 +15,17 @@
*/ */
package org.thingsboard.server.dao.timeseries; package org.thingsboard.server.dao.timeseries;
// CASSANDRA ???
import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture; import com.datastax.driver.core.ResultSetFuture;
import com.datastax.driver.core.Row; import com.datastax.driver.core.Row;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.UUIDBased; import org.thingsboard.server.common.data.id.UUIDBased;
import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.kv.TsKvQuery; import org.thingsboard.server.common.data.kv.TsKvQuery;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* @author Andrew Shvayka * @author Andrew Shvayka

1
dao/src/main/java/org/thingsboard/server/dao/timeseries/TsKvQueryCursor.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.dao.timeseries; package org.thingsboard.server.dao.timeseries;
import lombok.Data;
import lombok.Getter; import lombok.Getter;
import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.kv.TsKvQuery; import org.thingsboard.server.common.data.kv.TsKvQuery;

39
dao/src/main/java/org/thingsboard/server/dao/user/UserCredentialsDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/user/CassandraUserCredentialsDao.java

@ -15,26 +15,23 @@
*/ */
package org.thingsboard.server.dao.user; package org.thingsboard.server.dao.user;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import com.datastax.driver.core.querybuilder.Select.Where;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.dao.AbstractModelDao; import org.thingsboard.server.dao.CassandraAbstractModelDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.UserCredentialsEntity; import org.thingsboard.server.dao.model.UserCredentialsEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import com.datastax.driver.core.querybuilder.Select.Where; import java.util.UUID;
import org.thingsboard.server.dao.model.ModelConstants;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
@Component @Component
@Slf4j @Slf4j
public class UserCredentialsDaoImpl extends AbstractModelDao<UserCredentialsEntity> implements UserCredentialsDao { public class CassandraUserCredentialsDao extends CassandraAbstractModelDao<UserCredentialsEntity, UserCredentials> implements UserCredentialsDao {
@Override @Override
protected Class<UserCredentialsEntity> getColumnFamilyClass() { protected Class<UserCredentialsEntity> getColumnFamilyClass() {
@ -47,41 +44,35 @@ public class UserCredentialsDaoImpl extends AbstractModelDao<UserCredentialsEnti
} }
@Override @Override
public UserCredentialsEntity save(UserCredentials userCredentials) { public UserCredentials findByUserId(UUID userId) {
log.debug("Save user credentials [{}] ", userCredentials);
return save(new UserCredentialsEntity(userCredentials));
}
@Override
public UserCredentialsEntity findByUserId(UUID userId) {
log.debug("Try to find user credentials by userId [{}] ", userId); log.debug("Try to find user credentials by userId [{}] ", userId);
Where query = select().from(ModelConstants.USER_CREDENTIALS_BY_USER_COLUMN_FAMILY_NAME).where(eq(ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY, userId)); Where query = select().from(ModelConstants.USER_CREDENTIALS_BY_USER_COLUMN_FAMILY_NAME).where(eq(ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY, userId));
log.trace("Execute query {}", query); log.trace("Execute query {}", query);
UserCredentialsEntity userCredentialsEntity = findOneByStatement(query); UserCredentialsEntity userCredentialsEntity = findOneByStatement(query);
log.trace("Found user credentials [{}] by userId [{}]", userCredentialsEntity, userId); log.trace("Found user credentials [{}] by userId [{}]", userCredentialsEntity, userId);
return userCredentialsEntity; return DaoUtil.getData(userCredentialsEntity);
} }
@Override @Override
public UserCredentialsEntity findByActivateToken(String activateToken) { public UserCredentials findByActivateToken(String activateToken) {
log.debug("Try to find user credentials by activateToken [{}] ", activateToken); log.debug("Try to find user credentials by activateToken [{}] ", activateToken);
Where query = select().from(ModelConstants.USER_CREDENTIALS_BY_ACTIVATE_TOKEN_COLUMN_FAMILY_NAME) Where query = select().from(ModelConstants.USER_CREDENTIALS_BY_ACTIVATE_TOKEN_COLUMN_FAMILY_NAME)
.where(eq(ModelConstants.USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY, activateToken)); .where(eq(ModelConstants.USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY, activateToken));
log.trace("Execute query {}", query); log.trace("Execute query {}", query);
UserCredentialsEntity userCredentialsEntity = findOneByStatement(query); UserCredentialsEntity userCredentialsEntity = findOneByStatement(query);
log.trace("Found user credentials [{}] by activateToken [{}]", userCredentialsEntity, activateToken); log.trace("Found user credentials [{}] by activateToken [{}]", userCredentialsEntity, activateToken);
return userCredentialsEntity; return DaoUtil.getData(userCredentialsEntity);
} }
@Override @Override
public UserCredentialsEntity findByResetToken(String resetToken) { public UserCredentials findByResetToken(String resetToken) {
log.debug("Try to find user credentials by resetToken [{}] ", resetToken); log.debug("Try to find user credentials by resetToken [{}] ", resetToken);
Where query = select().from(ModelConstants.USER_CREDENTIALS_BY_RESET_TOKEN_COLUMN_FAMILY_NAME) Where query = select().from(ModelConstants.USER_CREDENTIALS_BY_RESET_TOKEN_COLUMN_FAMILY_NAME)
.where(eq(ModelConstants.USER_CREDENTIALS_RESET_TOKEN_PROPERTY, resetToken)); .where(eq(ModelConstants.USER_CREDENTIALS_RESET_TOKEN_PROPERTY, resetToken));
log.trace("Execute query {}", query); log.trace("Execute query {}", query);
UserCredentialsEntity userCredentialsEntity = findOneByStatement(query); UserCredentialsEntity userCredentialsEntity = findOneByStatement(query);
log.trace("Found user credentials [{}] by resetToken [{}]", userCredentialsEntity, resetToken); log.trace("Found user credentials [{}] by resetToken [{}]", userCredentialsEntity, resetToken);
return userCredentialsEntity; return DaoUtil.getData(userCredentialsEntity);
} }
} }

42
dao/src/main/java/org/thingsboard/server/dao/user/UserDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/user/CassandraUserDao.java

@ -15,29 +15,27 @@
*/ */
package org.thingsboard.server.dao.user; package org.thingsboard.server.dao.user;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import com.datastax.driver.core.querybuilder.Select.Where;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
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.UserEntity; import org.thingsboard.server.dao.model.UserEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.datastax.driver.core.querybuilder.Select.Where; import java.util.Arrays;
import org.thingsboard.server.dao.model.ModelConstants; 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;
@Component @Component
@Slf4j @Slf4j
public class UserDaoImpl extends AbstractSearchTextDao<UserEntity> implements UserDao { public class CassandraUserDao extends CassandraAbstractSearchTextDao<UserEntity, User> implements UserDao {
@Override @Override
protected Class<UserEntity> getColumnFamilyClass() { protected Class<UserEntity> getColumnFamilyClass() {
@ -50,23 +48,17 @@ public class UserDaoImpl extends AbstractSearchTextDao<UserEntity> implements Us
} }
@Override @Override
public UserEntity findByEmail(String email) { public User findByEmail(String email) {
log.debug("Try to find user by email [{}] ", email); log.debug("Try to find user by email [{}] ", email);
Where query = select().from(ModelConstants.USER_BY_EMAIL_COLUMN_FAMILY_NAME).where(eq(ModelConstants.USER_EMAIL_PROPERTY, email)); Where query = select().from(ModelConstants.USER_BY_EMAIL_COLUMN_FAMILY_NAME).where(eq(ModelConstants.USER_EMAIL_PROPERTY, email));
log.trace("Execute query {}", query); log.trace("Execute query {}", query);
UserEntity userEntity = findOneByStatement(query); UserEntity userEntity = findOneByStatement(query);
log.trace("Found user [{}] by email [{}]", userEntity, email); log.trace("Found user [{}] by email [{}]", userEntity, email);
return userEntity; return DaoUtil.getData(userEntity);
}
@Override
public UserEntity save(User user) {
log.debug("Save user [{}] ", user);
return save(new UserEntity(user));
} }
@Override @Override
public List<UserEntity> findTenantAdmins(UUID tenantId, TextPageLink pageLink) { public List<User> findTenantAdmins(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find tenant admin users by tenantId [{}] and pageLink [{}]", tenantId, pageLink); log.debug("Try to find tenant admin users by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<UserEntity> userEntities = findPageWithTextSearch(ModelConstants.USER_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME, List<UserEntity> userEntities = findPageWithTextSearch(ModelConstants.USER_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(ModelConstants.USER_TENANT_ID_PROPERTY, tenantId), Arrays.asList(eq(ModelConstants.USER_TENANT_ID_PROPERTY, tenantId),
@ -74,11 +66,11 @@ public class UserDaoImpl extends AbstractSearchTextDao<UserEntity> implements Us
eq(ModelConstants.USER_AUTHORITY_PROPERTY, Authority.TENANT_ADMIN.name())), eq(ModelConstants.USER_AUTHORITY_PROPERTY, Authority.TENANT_ADMIN.name())),
pageLink); pageLink);
log.trace("Found tenant admin users [{}] by tenantId [{}] and pageLink [{}]", userEntities, tenantId, pageLink); log.trace("Found tenant admin users [{}] by tenantId [{}] and pageLink [{}]", userEntities, tenantId, pageLink);
return userEntities; return DaoUtil.convertDataList(userEntities);
} }
@Override @Override
public List<UserEntity> findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) { public List<User> findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) {
log.debug("Try to find customer users by tenantId [{}], customerId [{}] and pageLink [{}]", tenantId, customerId, pageLink); log.debug("Try to find customer users by tenantId [{}], customerId [{}] and pageLink [{}]", tenantId, customerId, pageLink);
List<UserEntity> userEntities = findPageWithTextSearch(ModelConstants.USER_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME, List<UserEntity> userEntities = findPageWithTextSearch(ModelConstants.USER_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(ModelConstants.USER_TENANT_ID_PROPERTY, tenantId), Arrays.asList(eq(ModelConstants.USER_TENANT_ID_PROPERTY, tenantId),
@ -86,7 +78,7 @@ public class UserDaoImpl extends AbstractSearchTextDao<UserEntity> implements Us
eq(ModelConstants.USER_AUTHORITY_PROPERTY, Authority.CUSTOMER_USER.name())), eq(ModelConstants.USER_AUTHORITY_PROPERTY, Authority.CUSTOMER_USER.name())),
pageLink); pageLink);
log.trace("Found customer users [{}] by tenantId [{}], customerId [{}] and pageLink [{}]", userEntities, tenantId, customerId, pageLink); log.trace("Found customer users [{}] by tenantId [{}], customerId [{}] and pageLink [{}]", userEntities, tenantId, customerId, pageLink);
return userEntities; return DaoUtil.convertDataList(userEntities);
} }
} }

23
dao/src/main/java/org/thingsboard/server/dao/user/UserCredentialsDao.java

@ -15,18 +15,15 @@
*/ */
package org.thingsboard.server.dao.user; package org.thingsboard.server.dao.user;
import java.util.UUID;
import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.UserCredentialsEntity;
import java.util.UUID;
/** /**
* The Interface UserCredentialsDao. * The Interface UserCredentialsDao.
*
* @param <T> the generic type
*/ */
public interface UserCredentialsDao extends Dao<UserCredentialsEntity> { public interface UserCredentialsDao extends Dao<UserCredentials> {
/** /**
* Save or update user credentials object * Save or update user credentials object
@ -34,7 +31,7 @@ public interface UserCredentialsDao extends Dao<UserCredentialsEntity> {
* @param userCredentials the user credentials object * @param userCredentials the user credentials object
* @return saved user credentials object * @return saved user credentials object
*/ */
UserCredentialsEntity save(UserCredentials userCredentials); UserCredentials save(UserCredentials userCredentials);
/** /**
* Find user credentials by user id. * Find user credentials by user id.
@ -42,22 +39,22 @@ public interface UserCredentialsDao extends Dao<UserCredentialsEntity> {
* @param userId the user id * @param userId the user id
* @return the user credentials object * @return the user credentials object
*/ */
UserCredentialsEntity findByUserId(UUID userId); UserCredentials findByUserId(UUID userId);
/** /**
* Find user credentials by activate token. * Find user credentials by activate token.
* *
* @param activateToken the activate token * @param activateToken the activate token
* @return the user credentials object * @return the user credentials object
*/ */
UserCredentialsEntity findByActivateToken(String activateToken); UserCredentials findByActivateToken(String activateToken);
/** /**
* Find user credentials by reset token. * Find user credentials by reset token.
* *
* @param resetToken the reset token * @param resetToken the reset token
* @return the user credentials object * @return the user credentials object
*/ */
UserCredentialsEntity findByResetToken(String resetToken); UserCredentials findByResetToken(String resetToken);
} }

17
dao/src/main/java/org/thingsboard/server/dao/user/UserDao.java

@ -15,15 +15,14 @@
*/ */
package org.thingsboard.server.dao.user; package org.thingsboard.server.dao.user;
import java.util.List;
import java.util.UUID;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.UserEntity;
public interface UserDao extends Dao<UserEntity> { import java.util.List;
import java.util.UUID;
public interface UserDao extends Dao<User> {
/** /**
* Save or update user object * Save or update user object
@ -31,7 +30,7 @@ public interface UserDao extends Dao<UserEntity> {
* @param user the user object * @param user the user object
* @return saved user entity * @return saved user entity
*/ */
UserEntity save(User user); User save(User user);
/** /**
* Find user by email. * Find user by email.
@ -39,7 +38,7 @@ public interface UserDao extends Dao<UserEntity> {
* @param email the email * @param email the email
* @return the user entity * @return the user entity
*/ */
UserEntity findByEmail(String email); User findByEmail(String email);
/** /**
* Find tenant admin users by tenantId and page link. * Find tenant admin users by tenantId and page link.
@ -48,7 +47,7 @@ public interface UserDao extends Dao<UserEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of user entities * @return the list of user entities
*/ */
List<UserEntity> findTenantAdmins(UUID tenantId, TextPageLink pageLink); List<User> findTenantAdmins(UUID tenantId, TextPageLink pageLink);
/** /**
* Find customer users by tenantId, customerId and page link. * Find customer users by tenantId, customerId and page link.
@ -58,6 +57,6 @@ public interface UserDao extends Dao<UserEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of user entities * @return the list of user entities
*/ */
List<UserEntity> findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink); List<User> findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink);
} }

28
dao/src/main/java/org/thingsboard/server/dao/user/UserService.java

@ -25,32 +25,32 @@ import org.thingsboard.server.common.data.security.UserCredentials;
public interface UserService { public interface UserService {
public User findUserById(UserId userId); User findUserById(UserId userId);
public User findUserByEmail(String email); User findUserByEmail(String email);
public User saveUser(User user); User saveUser(User user);
public UserCredentials findUserCredentialsByUserId(UserId userId); UserCredentials findUserCredentialsByUserId(UserId userId);
public UserCredentials findUserCredentialsByActivateToken(String activateToken); UserCredentials findUserCredentialsByActivateToken(String activateToken);
public UserCredentials findUserCredentialsByResetToken(String resetToken); UserCredentials findUserCredentialsByResetToken(String resetToken);
public UserCredentials saveUserCredentials(UserCredentials userCredentials); UserCredentials saveUserCredentials(UserCredentials userCredentials);
public UserCredentials activateUserCredentials(String activateToken, String password); UserCredentials activateUserCredentials(String activateToken, String password);
public UserCredentials requestPasswordReset(String email); UserCredentials requestPasswordReset(String email);
public void deleteUser(UserId userId); void deleteUser(UserId userId);
public TextPageData<User> findTenantAdmins(TenantId tenantId, TextPageLink pageLink); TextPageData<User> findTenantAdmins(TenantId tenantId, TextPageLink pageLink);
public void deleteTenantAdmins(TenantId tenantId); void deleteTenantAdmins(TenantId tenantId);
public TextPageData<User> findCustomerUsers(TenantId tenantId, CustomerId customerId, TextPageLink pageLink); TextPageData<User> findCustomerUsers(TenantId tenantId, CustomerId customerId, TextPageLink pageLink);
public void deleteCustomerUsers(TenantId tenantId, CustomerId customerId); void deleteCustomerUsers(TenantId tenantId, CustomerId customerId);
} }

104
dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java

@ -15,17 +15,13 @@
*/ */
package org.thingsboard.server.dao.user; package org.thingsboard.server.dao.user;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
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.validatePageLink;
import static org.thingsboard.server.dao.service.Validator.validateString;
import java.util.List;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils; 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.User; import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -37,19 +33,21 @@ import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.customer.CustomerDao;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.exception.IncorrectParameterException;
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.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.PaginatedRemover;
import org.thingsboard.server.dao.tenant.TenantDao; import org.thingsboard.server.dao.tenant.TenantDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import static org.thingsboard.server.dao.service.Validator.*;
@Service @Service
@Slf4j @Slf4j
public class UserServiceImpl implements UserService { public class UserServiceImpl implements UserService {
private static final int DEFAULT_TOKEN_LENGTH = 30;
@Autowired @Autowired
private UserDao userDao; private UserDao userDao;
@ -66,63 +64,57 @@ public class UserServiceImpl implements UserService {
public User findUserByEmail(String email) { public User findUserByEmail(String email) {
log.trace("Executing findUserByEmail [{}]", email); log.trace("Executing findUserByEmail [{}]", email);
validateString(email, "Incorrect email " + email); validateString(email, "Incorrect email " + email);
UserEntity userEntity = userDao.findByEmail(email); return userDao.findByEmail(email);
return getData(userEntity);
} }
@Override @Override
public User findUserById(UserId userId) { public User findUserById(UserId userId) {
log.trace("Executing findUserById [{}]", userId); log.trace("Executing findUserById [{}]", userId);
validateId(userId, "Incorrect userId " + userId); validateId(userId, "Incorrect userId " + userId);
UserEntity userEntity = userDao.findById(userId.getId()); return userDao.findById(userId.getId());
return getData(userEntity);
} }
@Override @Override
public User saveUser(User user) { public User saveUser(User user) {
log.trace("Executing saveUser [{}]", user); log.trace("Executing saveUser [{}]", user);
userValidator.validate(user); userValidator.validate(user);
UserEntity userEntity = userDao.save(user); User savedUser = userDao.save(user);
if (user.getId() == null) { if (user.getId() == null) {
UserCredentials userCredentials = new UserCredentials(); UserCredentials userCredentials = new UserCredentials();
userCredentials.setEnabled(false); userCredentials.setEnabled(false);
userCredentials.setActivateToken(RandomStringUtils.randomAlphanumeric(30)); userCredentials.setActivateToken(RandomStringUtils.randomAlphanumeric(DEFAULT_TOKEN_LENGTH));
userCredentials.setUserId(new UserId(userEntity.getId())); userCredentials.setUserId(new UserId(savedUser.getUuidId()));
userCredentialsDao.save(userCredentials); userCredentialsDao.save(userCredentials);
} }
return getData(userEntity); return savedUser;
} }
@Override @Override
public UserCredentials findUserCredentialsByUserId(UserId userId) { public UserCredentials findUserCredentialsByUserId(UserId userId) {
log.trace("Executing findUserCredentialsByUserId [{}]", userId); log.trace("Executing findUserCredentialsByUserId [{}]", userId);
validateId(userId, "Incorrect userId " + userId); validateId(userId, "Incorrect userId " + userId);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByUserId(userId.getId()); return userCredentialsDao.findByUserId(userId.getId());
return getData(userCredentialsEntity);
} }
@Override @Override
public UserCredentials findUserCredentialsByActivateToken(String activateToken) { public UserCredentials findUserCredentialsByActivateToken(String activateToken) {
log.trace("Executing findUserCredentialsByActivateToken [{}]", activateToken); log.trace("Executing findUserCredentialsByActivateToken [{}]", activateToken);
validateString(activateToken, "Incorrect activateToken " + activateToken); validateString(activateToken, "Incorrect activateToken " + activateToken);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByActivateToken(activateToken); return userCredentialsDao.findByActivateToken(activateToken);
return getData(userCredentialsEntity);
} }
@Override @Override
public UserCredentials findUserCredentialsByResetToken(String resetToken) { public UserCredentials findUserCredentialsByResetToken(String resetToken) {
log.trace("Executing findUserCredentialsByResetToken [{}]", resetToken); log.trace("Executing findUserCredentialsByResetToken [{}]", resetToken);
validateString(resetToken, "Incorrect resetToken " + resetToken); validateString(resetToken, "Incorrect resetToken " + resetToken);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByResetToken(resetToken); return userCredentialsDao.findByResetToken(resetToken);
return getData(userCredentialsEntity);
} }
@Override @Override
public UserCredentials saveUserCredentials(UserCredentials userCredentials) { public UserCredentials saveUserCredentials(UserCredentials userCredentials) {
log.trace("Executing saveUserCredentials [{}]", userCredentials); log.trace("Executing saveUserCredentials [{}]", userCredentials);
userCredentialsValidator.validate(userCredentials); userCredentialsValidator.validate(userCredentials);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.save(userCredentials); return userCredentialsDao.save(userCredentials);
return getData(userCredentialsEntity);
} }
@Override @Override
@ -130,11 +122,10 @@ public class UserServiceImpl implements UserService {
log.trace("Executing activateUserCredentials activateToken [{}], password [{}]", activateToken, password); log.trace("Executing activateUserCredentials activateToken [{}], password [{}]", activateToken, password);
validateString(activateToken, "Incorrect activateToken " + activateToken); validateString(activateToken, "Incorrect activateToken " + activateToken);
validateString(password, "Incorrect password " + password); validateString(password, "Incorrect password " + password);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByActivateToken(activateToken); UserCredentials userCredentials = userCredentialsDao.findByActivateToken(activateToken);
if (userCredentialsEntity == null) { if (userCredentials == null) {
throw new IncorrectParameterException(String.format("Unable to find user credentials by activateToken [%s]", activateToken)); throw new IncorrectParameterException(String.format("Unable to find user credentials by activateToken [%s]", activateToken));
} }
UserCredentials userCredentials = getData(userCredentialsEntity);
if (userCredentials.isEnabled()) { if (userCredentials.isEnabled()) {
throw new IncorrectParameterException("User credentials already activated"); throw new IncorrectParameterException("User credentials already activated");
} }
@ -149,16 +140,15 @@ public class UserServiceImpl implements UserService {
public UserCredentials requestPasswordReset(String email) { public UserCredentials requestPasswordReset(String email) {
log.trace("Executing requestPasswordReset email [{}]", email); log.trace("Executing requestPasswordReset email [{}]", email);
validateString(email, "Incorrect email " + email); validateString(email, "Incorrect email " + email);
UserEntity userEntity = userDao.findByEmail(email); User user = userDao.findByEmail(email);
if (userEntity == null) { if (user == null) {
throw new IncorrectParameterException(String.format("Unable to find user by email [%s]", email)); throw new IncorrectParameterException(String.format("Unable to find user by email [%s]", email));
} }
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByUserId(userEntity.getId()); UserCredentials userCredentials = userCredentialsDao.findByUserId(user.getUuidId());
UserCredentials userCredentials = getData(userCredentialsEntity);
if (!userCredentials.isEnabled()) { if (!userCredentials.isEnabled()) {
throw new IncorrectParameterException("Unable to reset password for inactive user"); throw new IncorrectParameterException("Unable to reset password for inactive user");
} }
userCredentials.setResetToken(RandomStringUtils.randomAlphanumeric(30)); userCredentials.setResetToken(RandomStringUtils.randomAlphanumeric(DEFAULT_TOKEN_LENGTH));
return saveUserCredentials(userCredentials); return saveUserCredentials(userCredentials);
} }
@ -167,8 +157,8 @@ public class UserServiceImpl implements UserService {
public void deleteUser(UserId userId) { public void deleteUser(UserId userId) {
log.trace("Executing deleteUser [{}]", userId); log.trace("Executing deleteUser [{}]", userId);
validateId(userId, "Incorrect userId " + userId); validateId(userId, "Incorrect userId " + userId);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByUserId(userId.getId()); UserCredentials userCredentials = userCredentialsDao.findByUserId(userId.getId());
userCredentialsDao.removeById(userCredentialsEntity.getId()); userCredentialsDao.removeById(userCredentials.getUuidId());
userDao.removeById(userId.getId()); userDao.removeById(userId.getId());
} }
@ -177,9 +167,8 @@ public class UserServiceImpl implements UserService {
log.trace("Executing findTenantAdmins, tenantId [{}], pageLink [{}]", tenantId, pageLink); log.trace("Executing findTenantAdmins, tenantId [{}], pageLink [{}]", tenantId, pageLink);
validateId(tenantId, "Incorrect tenantId " + tenantId); validateId(tenantId, "Incorrect tenantId " + tenantId);
validatePageLink(pageLink, "Incorrect page link " + pageLink); validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<UserEntity> userEntities = userDao.findTenantAdmins(tenantId.getId(), pageLink); List<User> users = userDao.findTenantAdmins(tenantId.getId(), pageLink);
List<User> users = convertDataList(userEntities); return new TextPageData<>(users, pageLink);
return new TextPageData<User>(users, pageLink);
} }
@Override @Override
@ -195,9 +184,8 @@ public class UserServiceImpl implements UserService {
validateId(tenantId, "Incorrect tenantId " + tenantId); validateId(tenantId, "Incorrect tenantId " + tenantId);
validateId(customerId, "Incorrect customerId " + customerId); validateId(customerId, "Incorrect customerId " + customerId);
validatePageLink(pageLink, "Incorrect page link " + pageLink); validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<UserEntity> userEntities = userDao.findCustomerUsers(tenantId.getId(), customerId.getId(), pageLink); List<User> users = userDao.findCustomerUsers(tenantId.getId(), customerId.getId(), pageLink);
List<User> users = convertDataList(userEntities); return new TextPageData<>(users, pageLink);
return new TextPageData<User>(users, pageLink);
} }
@Override @Override
@ -266,16 +254,16 @@ public class UserServiceImpl implements UserService {
+ " already present in database!"); + " already present in database!");
} }
if (!tenantId.getId().equals(ModelConstants.NULL_UUID)) { if (!tenantId.getId().equals(ModelConstants.NULL_UUID)) {
TenantEntity tenant = tenantDao.findById(user.getTenantId().getId()); Tenant tenant = tenantDao.findById(user.getTenantId().getId());
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("User is referencing to non-existent tenant!"); throw new DataValidationException("User is referencing to non-existent tenant!");
} }
} }
if (!customerId.getId().equals(ModelConstants.NULL_UUID)) { if (!customerId.getId().equals(ModelConstants.NULL_UUID)) {
CustomerEntity customer = customerDao.findById(user.getCustomerId().getId()); Customer customer = customerDao.findById(user.getCustomerId().getId());
if (customer == null) { if (customer == null) {
throw new DataValidationException("User is referencing to non-existent customer!"); throw new DataValidationException("User is referencing to non-existent customer!");
} else if (!customer.getTenantId().equals(tenantId.getId())) { } else if (!customer.getTenantId().getId().equals(tenantId.getId())) {
throw new DataValidationException("User can't be assigned to customer from different tenant!"); throw new DataValidationException("User can't be assigned to customer from different tenant!");
} }
} }
@ -303,7 +291,7 @@ public class UserServiceImpl implements UserService {
throw new DataValidationException("Enabled user credentials can't have activate token!"); throw new DataValidationException("Enabled user credentials can't have activate token!");
} }
} }
UserCredentialsEntity existingUserCredentialsEntity = userCredentialsDao.findById(userCredentials.getId().getId()); UserCredentials existingUserCredentialsEntity = userCredentialsDao.findById(userCredentials.getId().getId());
if (existingUserCredentialsEntity == null) { if (existingUserCredentialsEntity == null) {
throw new DataValidationException("Unable to update non-existent user credentials!"); throw new DataValidationException("Unable to update non-existent user credentials!");
} }
@ -314,21 +302,21 @@ public class UserServiceImpl implements UserService {
} }
}; };
private PaginatedRemover<TenantId, UserEntity> tenantAdminsRemover = private PaginatedRemover<TenantId, User> tenantAdminsRemover =
new PaginatedRemover<TenantId, UserEntity>() { new PaginatedRemover<TenantId, User>() {
@Override @Override
protected List<UserEntity> findEntities(TenantId id, TextPageLink pageLink) { protected List<User> findEntities(TenantId id, TextPageLink pageLink) {
return userDao.findTenantAdmins(id.getId(), pageLink); return userDao.findTenantAdmins(id.getId(), pageLink);
} }
@Override @Override
protected void removeEntity(UserEntity entity) { protected void removeEntity(User entity) {
deleteUser(new UserId(entity.getId())); deleteUser(new UserId(entity.getUuidId()));
} }
}; };
class CustomerUsersRemover extends PaginatedRemover<CustomerId, UserEntity> { private class CustomerUsersRemover extends PaginatedRemover<CustomerId, User> {
private TenantId tenantId; private TenantId tenantId;
@ -337,14 +325,14 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
protected List<UserEntity> findEntities(CustomerId id, TextPageLink pageLink) { protected List<User> findEntities(CustomerId id, TextPageLink pageLink) {
return userDao.findCustomerUsers(tenantId.getId(), id.getId(), pageLink); return userDao.findCustomerUsers(tenantId.getId(), id.getId(), pageLink);
} }
@Override @Override
protected void removeEntity(UserEntity entity) { protected void removeEntity(User entity) {
deleteUser(new UserId(entity.getId())); deleteUser(new UserId(entity.getUuidId()));
} }
} }

22
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/widget/CassandraWidgetTypeDao.java

@ -17,12 +17,10 @@ package org.thingsboard.server.dao.widget;
import com.datastax.driver.core.querybuilder.Select.Where; import com.datastax.driver.core.querybuilder.Select.Where;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.dao.AbstractModelDao; import org.thingsboard.server.dao.CassandraAbstractModelDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.WidgetTypeEntity; import org.thingsboard.server.dao.model.WidgetTypeEntity;
import java.util.List; import java.util.List;
@ -34,7 +32,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component @Component
@Slf4j @Slf4j
public class WidgetTypeDaoImpl extends AbstractModelDao<WidgetTypeEntity> implements WidgetTypeDao { public class CassandraWidgetTypeDao extends CassandraAbstractModelDao<WidgetTypeEntity, WidgetType> implements WidgetTypeDao {
@Override @Override
protected Class<WidgetTypeEntity> getColumnFamilyClass() { protected Class<WidgetTypeEntity> getColumnFamilyClass() {
@ -47,13 +45,7 @@ public class WidgetTypeDaoImpl extends AbstractModelDao<WidgetTypeEntity> implem
} }
@Override @Override
public WidgetTypeEntity save(WidgetType widgetType) { public List<WidgetType> findWidgetTypesByTenantIdAndBundleAlias(UUID tenantId, String bundleAlias) {
log.debug("Save widget type [{}] ", widgetType);
return save(new WidgetTypeEntity(widgetType));
}
@Override
public List<WidgetTypeEntity> findWidgetTypesByTenantIdAndBundleAlias(UUID tenantId, String bundleAlias) {
log.debug("Try to find widget types by tenantId [{}] and bundleAlias [{}]", tenantId, bundleAlias); log.debug("Try to find widget types by tenantId [{}] and bundleAlias [{}]", tenantId, bundleAlias);
Where query = select().from(WIDGET_TYPE_BY_TENANT_AND_ALIASES_COLUMN_FAMILY_NAME) Where query = select().from(WIDGET_TYPE_BY_TENANT_AND_ALIASES_COLUMN_FAMILY_NAME)
.where() .where()
@ -61,11 +53,11 @@ public class WidgetTypeDaoImpl extends AbstractModelDao<WidgetTypeEntity> implem
.and(eq(WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY, bundleAlias)); .and(eq(WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY, bundleAlias));
List<WidgetTypeEntity> widgetTypesEntities = findListByStatement(query); List<WidgetTypeEntity> widgetTypesEntities = findListByStatement(query);
log.trace("Found widget types [{}] by tenantId [{}] and bundleAlias [{}]", widgetTypesEntities, tenantId, bundleAlias); log.trace("Found widget types [{}] by tenantId [{}] and bundleAlias [{}]", widgetTypesEntities, tenantId, bundleAlias);
return widgetTypesEntities; return DaoUtil.convertDataList(widgetTypesEntities);
} }
@Override @Override
public WidgetTypeEntity findByTenantIdBundleAliasAndAlias(UUID tenantId, String bundleAlias, String alias) { public WidgetType findByTenantIdBundleAliasAndAlias(UUID tenantId, String bundleAlias, String alias) {
log.debug("Try to find widget type by tenantId [{}], bundleAlias [{}] and alias [{}]", tenantId, bundleAlias, alias); log.debug("Try to find widget type by tenantId [{}], bundleAlias [{}] and alias [{}]", tenantId, bundleAlias, alias);
Where query = select().from(WIDGET_TYPE_BY_TENANT_AND_ALIASES_COLUMN_FAMILY_NAME) Where query = select().from(WIDGET_TYPE_BY_TENANT_AND_ALIASES_COLUMN_FAMILY_NAME)
.where() .where()
@ -76,7 +68,7 @@ public class WidgetTypeDaoImpl extends AbstractModelDao<WidgetTypeEntity> implem
WidgetTypeEntity widgetTypeEntity = findOneByStatement(query); WidgetTypeEntity widgetTypeEntity = findOneByStatement(query);
log.trace("Found widget type [{}] by tenantId [{}], bundleAlias [{}] and alias [{}]", log.trace("Found widget type [{}] by tenantId [{}], bundleAlias [{}] and alias [{}]",
widgetTypeEntity, tenantId, bundleAlias, alias); widgetTypeEntity, tenantId, bundleAlias, alias);
return widgetTypeEntity; return DaoUtil.getData(widgetTypeEntity);
} }
} }

33
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDaoImpl.java → dao/src/main/java/org/thingsboard/server/dao/widget/CassandraWidgetsBundleDao.java

@ -17,26 +17,23 @@ package org.thingsboard.server.dao.widget;
import com.datastax.driver.core.querybuilder.Select; import com.datastax.driver.core.querybuilder.Select;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.AbstractSearchTextDao; import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.WidgetsBundleEntity; import org.thingsboard.server.dao.model.WidgetsBundleEntity;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
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 static org.thingsboard.server.dao.model.ModelConstants.*;
@Component @Component
@Slf4j @Slf4j
public class WidgetsBundleDaoImpl extends AbstractSearchTextDao<WidgetsBundleEntity> implements WidgetsBundleDao { public class CassandraWidgetsBundleDao extends CassandraAbstractSearchTextDao<WidgetsBundleEntity, WidgetsBundle> implements WidgetsBundleDao {
@Override @Override
protected Class<WidgetsBundleEntity> getColumnFamilyClass() { protected Class<WidgetsBundleEntity> getColumnFamilyClass() {
@ -49,13 +46,7 @@ public class WidgetsBundleDaoImpl extends AbstractSearchTextDao<WidgetsBundleEnt
} }
@Override @Override
public WidgetsBundleEntity save(WidgetsBundle widgetsBundle) { public WidgetsBundle findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias) {
log.debug("Save widgets bundle [{}] ", widgetsBundle);
return save(new WidgetsBundleEntity(widgetsBundle));
}
@Override
public WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias) {
log.debug("Try to find widgets bundle by tenantId [{}] and alias [{}]", tenantId, alias); log.debug("Try to find widgets bundle by tenantId [{}] and alias [{}]", tenantId, alias);
Select.Where query = select().from(WIDGETS_BUNDLE_BY_TENANT_AND_ALIAS_COLUMN_FAMILY_NAME) Select.Where query = select().from(WIDGETS_BUNDLE_BY_TENANT_AND_ALIAS_COLUMN_FAMILY_NAME)
.where() .where()
@ -65,37 +56,37 @@ public class WidgetsBundleDaoImpl extends AbstractSearchTextDao<WidgetsBundleEnt
WidgetsBundleEntity widgetsBundleEntity = findOneByStatement(query); WidgetsBundleEntity widgetsBundleEntity = findOneByStatement(query);
log.trace("Found widgets bundle [{}] by tenantId [{}] and alias [{}]", log.trace("Found widgets bundle [{}] by tenantId [{}] and alias [{}]",
widgetsBundleEntity, tenantId, alias); widgetsBundleEntity, tenantId, alias);
return widgetsBundleEntity; return DaoUtil.getData(widgetsBundleEntity);
} }
@Override @Override
public List<WidgetsBundleEntity> findSystemWidgetsBundles(TextPageLink pageLink) { public List<WidgetsBundle> findSystemWidgetsBundles(TextPageLink pageLink) {
log.debug("Try to find system widgets bundles by pageLink [{}]", pageLink); log.debug("Try to find system widgets bundles by pageLink [{}]", pageLink);
List<WidgetsBundleEntity> widgetsBundlesEntities = findPageWithTextSearch(WIDGETS_BUNDLE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME, List<WidgetsBundleEntity> widgetsBundlesEntities = findPageWithTextSearch(WIDGETS_BUNDLE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(WIDGETS_BUNDLE_TENANT_ID_PROPERTY, NULL_UUID)), Arrays.asList(eq(WIDGETS_BUNDLE_TENANT_ID_PROPERTY, NULL_UUID)),
pageLink); pageLink);
log.trace("Found system widgets bundles [{}] by pageLink [{}]", widgetsBundlesEntities, pageLink); log.trace("Found system widgets bundles [{}] by pageLink [{}]", widgetsBundlesEntities, pageLink);
return widgetsBundlesEntities; return DaoUtil.convertDataList(widgetsBundlesEntities);
} }
@Override @Override
public List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { public List<WidgetsBundle> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find tenant widgets bundles by tenantId [{}] and pageLink [{}]", tenantId, pageLink); log.debug("Try to find tenant widgets bundles by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<WidgetsBundleEntity> widgetsBundlesEntities = findPageWithTextSearch(WIDGETS_BUNDLE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME, List<WidgetsBundleEntity> widgetsBundlesEntities = findPageWithTextSearch(WIDGETS_BUNDLE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(WIDGETS_BUNDLE_TENANT_ID_PROPERTY, tenantId)), Arrays.asList(eq(WIDGETS_BUNDLE_TENANT_ID_PROPERTY, tenantId)),
pageLink); pageLink);
log.trace("Found tenant widgets bundles [{}] by tenantId [{}] and pageLink [{}]", widgetsBundlesEntities, tenantId, pageLink); log.trace("Found tenant widgets bundles [{}] by tenantId [{}] and pageLink [{}]", widgetsBundlesEntities, tenantId, pageLink);
return widgetsBundlesEntities; return DaoUtil.convertDataList(widgetsBundlesEntities);
} }
@Override @Override
public List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { public List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find all tenant widgets bundles by tenantId [{}] and pageLink [{}]", tenantId, pageLink); log.debug("Try to find all tenant widgets bundles by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<WidgetsBundleEntity> widgetsBundlesEntities = findPageWithTextSearch(WIDGETS_BUNDLE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME, List<WidgetsBundleEntity> widgetsBundlesEntities = findPageWithTextSearch(WIDGETS_BUNDLE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(in(WIDGETS_BUNDLE_TENANT_ID_PROPERTY, Arrays.asList(NULL_UUID, tenantId))), Arrays.asList(in(WIDGETS_BUNDLE_TENANT_ID_PROPERTY, Arrays.asList(NULL_UUID, tenantId))),
pageLink); pageLink);
log.trace("Found all tenant widgets bundles [{}] by tenantId [{}] and pageLink [{}]", widgetsBundlesEntities, tenantId, pageLink); log.trace("Found all tenant widgets bundles [{}] by tenantId [{}] and pageLink [{}]", widgetsBundlesEntities, tenantId, pageLink);
return widgetsBundlesEntities; return DaoUtil.convertDataList(widgetsBundlesEntities);
} }
} }

11
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeDao.java

@ -17,17 +17,14 @@ package org.thingsboard.server.dao.widget;
import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.WidgetTypeEntity;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
/** /**
* The Interface WidgetTypeDao. * The Interface WidgetTypeDao.
*
* @param <T> the generic type
*/ */
public interface WidgetTypeDao extends Dao<WidgetTypeEntity> { public interface WidgetTypeDao extends Dao<WidgetType> {
/** /**
* Save or update widget type object * Save or update widget type object
@ -35,7 +32,7 @@ public interface WidgetTypeDao extends Dao<WidgetTypeEntity> {
* @param widgetType the widget type object * @param widgetType the widget type object
* @return saved widget type object * @return saved widget type object
*/ */
WidgetTypeEntity save(WidgetType widgetType); WidgetType save(WidgetType widgetType);
/** /**
* Find widget types by tenantId and bundleAlias. * Find widget types by tenantId and bundleAlias.
@ -44,7 +41,7 @@ public interface WidgetTypeDao extends Dao<WidgetTypeEntity> {
* @param bundleAlias the bundle alias * @param bundleAlias the bundle alias
* @return the list of widget types objects * @return the list of widget types objects
*/ */
List<WidgetTypeEntity> findWidgetTypesByTenantIdAndBundleAlias(UUID tenantId, String bundleAlias); List<WidgetType> findWidgetTypesByTenantIdAndBundleAlias(UUID tenantId, String bundleAlias);
/** /**
* Find widget type by tenantId, bundleAlias and alias. * Find widget type by tenantId, bundleAlias and alias.
@ -54,6 +51,6 @@ public interface WidgetTypeDao extends Dao<WidgetTypeEntity> {
* @param alias the alias * @param alias the alias
* @return the widget type object * @return the widget type object
*/ */
WidgetTypeEntity findByTenantIdBundleAliasAndAlias(UUID tenantId, String bundleAlias, String alias); WidgetType findByTenantIdBundleAliasAndAlias(UUID tenantId, String bundleAlias, String alias);
} }

12
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java

@ -23,16 +23,16 @@ import java.util.List;
public interface WidgetTypeService { public interface WidgetTypeService {
public WidgetType findWidgetTypeById(WidgetTypeId widgetTypeId); WidgetType findWidgetTypeById(WidgetTypeId widgetTypeId);
public WidgetType saveWidgetType(WidgetType widgetType); WidgetType saveWidgetType(WidgetType widgetType);
public void deleteWidgetType(WidgetTypeId widgetTypeId); void deleteWidgetType(WidgetTypeId widgetTypeId);
public List<WidgetType> findWidgetTypesByTenantIdAndBundleAlias(TenantId tenantId, String bundleAlias); List<WidgetType> findWidgetTypesByTenantIdAndBundleAlias(TenantId tenantId, String bundleAlias);
public WidgetType findWidgetTypeByTenantIdBundleAliasAndAlias(TenantId tenantId, String bundleAlias, String alias); WidgetType findWidgetTypeByTenantIdBundleAliasAndAlias(TenantId tenantId, String bundleAlias, String alias);
public void deleteWidgetTypesByTenantIdAndBundleAlias(TenantId tenantId, String bundleAlias); void deleteWidgetTypesByTenantIdAndBundleAlias(TenantId tenantId, String bundleAlias);
} }

38
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java

@ -17,8 +17,6 @@ package org.thingsboard.server.dao.widget;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
@ -28,19 +26,12 @@ import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.TenantEntity;
import org.thingsboard.server.dao.model.WidgetTypeEntity;
import org.thingsboard.server.dao.model.WidgetsBundleEntity;
import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.Validator; import org.thingsboard.server.dao.service.Validator;
import org.thingsboard.server.dao.tenant.TenantDao; import org.thingsboard.server.dao.tenant.TenantDao;
import org.thingsboard.server.dao.tenant.TenantService;
import java.util.List; import java.util.List;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
@Service @Service
@Slf4j @Slf4j
public class WidgetTypeServiceImpl implements WidgetTypeService { public class WidgetTypeServiceImpl implements WidgetTypeService {
@ -58,16 +49,14 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
public WidgetType findWidgetTypeById(WidgetTypeId widgetTypeId) { public WidgetType findWidgetTypeById(WidgetTypeId widgetTypeId) {
log.trace("Executing findWidgetTypeById [{}]", widgetTypeId); log.trace("Executing findWidgetTypeById [{}]", widgetTypeId);
Validator.validateId(widgetTypeId, "Incorrect widgetTypeId " + widgetTypeId); Validator.validateId(widgetTypeId, "Incorrect widgetTypeId " + widgetTypeId);
WidgetTypeEntity widgetTypeEntity = widgetTypeDao.findById(widgetTypeId.getId()); return widgetTypeDao.findById(widgetTypeId.getId());
return getData(widgetTypeEntity);
} }
@Override @Override
public WidgetType saveWidgetType(WidgetType widgetType) { public WidgetType saveWidgetType(WidgetType widgetType) {
log.trace("Executing saveWidgetType [{}]", widgetType); log.trace("Executing saveWidgetType [{}]", widgetType);
widgetTypeValidator.validate(widgetType); widgetTypeValidator.validate(widgetType);
WidgetTypeEntity widgetTypeEntity = widgetTypeDao.save(widgetType); return widgetTypeDao.save(widgetType);
return getData(widgetTypeEntity);
} }
@Override @Override
@ -82,8 +71,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
log.trace("Executing findWidgetTypesByTenantIdAndBundleAlias, tenantId [{}], bundleAlias [{}]", tenantId, bundleAlias); log.trace("Executing findWidgetTypesByTenantIdAndBundleAlias, tenantId [{}], bundleAlias [{}]", tenantId, bundleAlias);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateString(bundleAlias, "Incorrect bundleAlias " + bundleAlias); Validator.validateString(bundleAlias, "Incorrect bundleAlias " + bundleAlias);
List<WidgetTypeEntity> widgetTypesEntities = widgetTypeDao.findWidgetTypesByTenantIdAndBundleAlias(tenantId.getId(), bundleAlias); return widgetTypeDao.findWidgetTypesByTenantIdAndBundleAlias(tenantId.getId(), bundleAlias);
return convertDataList(widgetTypesEntities);
} }
@Override @Override
@ -92,8 +80,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateString(bundleAlias, "Incorrect bundleAlias " + bundleAlias); Validator.validateString(bundleAlias, "Incorrect bundleAlias " + bundleAlias);
Validator.validateString(alias, "Incorrect alias " + alias); Validator.validateString(alias, "Incorrect alias " + alias);
WidgetTypeEntity widgetTypeEntity = widgetTypeDao.findByTenantIdBundleAliasAndAlias(tenantId.getId(), bundleAlias, alias); return widgetTypeDao.findByTenantIdBundleAliasAndAlias(tenantId.getId(), bundleAlias, alias);
return getData(widgetTypeEntity);
} }
@Override @Override
@ -101,9 +88,9 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
log.trace("Executing deleteWidgetTypesByTenantIdAndBundleAlias, tenantId [{}], bundleAlias [{}]", tenantId, bundleAlias); log.trace("Executing deleteWidgetTypesByTenantIdAndBundleAlias, tenantId [{}], bundleAlias [{}]", tenantId, bundleAlias);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateString(bundleAlias, "Incorrect bundleAlias " + bundleAlias); Validator.validateString(bundleAlias, "Incorrect bundleAlias " + bundleAlias);
List<WidgetTypeEntity> widgetTypesEntities = widgetTypeDao.findWidgetTypesByTenantIdAndBundleAlias(tenantId.getId(), bundleAlias); List<WidgetType> widgetTypes = widgetTypeDao.findWidgetTypesByTenantIdAndBundleAlias(tenantId.getId(), bundleAlias);
for (WidgetTypeEntity widgetTypeEntity : widgetTypesEntities) { for (WidgetType widgetType : widgetTypes) {
deleteWidgetType(new WidgetTypeId(widgetTypeEntity.getId())); deleteWidgetType(new WidgetTypeId(widgetType.getUuidId()));
} }
} }
@ -124,7 +111,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
widgetType.setTenantId(new TenantId(ModelConstants.NULL_UUID)); widgetType.setTenantId(new TenantId(ModelConstants.NULL_UUID));
} }
if (!widgetType.getTenantId().getId().equals(ModelConstants.NULL_UUID)) { if (!widgetType.getTenantId().getId().equals(ModelConstants.NULL_UUID)) {
TenantEntity tenant = tenantDao.findById(widgetType.getTenantId().getId()); Tenant tenant = tenantDao.findById(widgetType.getTenantId().getId());
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Widget type is referencing to non-existent tenant!"); throw new DataValidationException("Widget type is referencing to non-existent tenant!");
} }
@ -133,8 +120,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
@Override @Override
protected void validateCreate(WidgetType widgetType) { protected void validateCreate(WidgetType widgetType) {
WidgetsBundle widgetsBundle = widgetsBundleService.findWidgetsBundleByTenantIdAndAlias(widgetType.getTenantId().getId(), widgetType.getBundleAlias());
WidgetsBundleEntity widgetsBundle = widgetsBundleService.findWidgetsBundleByTenantIdAndAlias(widgetType.getTenantId().getId(), widgetType.getBundleAlias());
if (widgetsBundle == null) { if (widgetsBundle == null) {
throw new DataValidationException("Widget type is referencing to non-existent widgets bundle!"); throw new DataValidationException("Widget type is referencing to non-existent widgets bundle!");
} }
@ -142,7 +128,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
String alias = widgetType.getName().toLowerCase().replaceAll("\\W+", "_"); String alias = widgetType.getName().toLowerCase().replaceAll("\\W+", "_");
String originalAlias = alias; String originalAlias = alias;
int c = 1; int c = 1;
WidgetTypeEntity withSameAlias; WidgetType withSameAlias;
do { do {
withSameAlias = widgetTypeDao.findByTenantIdBundleAliasAndAlias(widgetType.getTenantId().getId(), widgetType.getBundleAlias(), alias); withSameAlias = widgetTypeDao.findByTenantIdBundleAliasAndAlias(widgetType.getTenantId().getId(), widgetType.getBundleAlias(), alias);
if (withSameAlias != null) { if (withSameAlias != null) {
@ -154,8 +140,8 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
@Override @Override
protected void validateUpdate(WidgetType widgetType) { protected void validateUpdate(WidgetType widgetType) {
WidgetTypeEntity storedWidgetType = widgetTypeDao.findById(widgetType.getId().getId()); WidgetType storedWidgetType = widgetTypeDao.findById(widgetType.getId().getId());
if (!storedWidgetType.getTenantId().equals(widgetType.getTenantId().getId())) { if (!storedWidgetType.getTenantId().getId().equals(widgetType.getTenantId().getId())) {
throw new DataValidationException("Can't move existing widget type to different tenant!"); throw new DataValidationException("Can't move existing widget type to different tenant!");
} }
if (!storedWidgetType.getBundleAlias().equals(widgetType.getBundleAlias())) { if (!storedWidgetType.getBundleAlias().equals(widgetType.getBundleAlias())) {

15
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java

@ -18,17 +18,14 @@ package org.thingsboard.server.dao.widget;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.WidgetsBundleEntity;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
/** /**
* The Interface WidgetsBundleDao. * The Interface WidgetsBundleDao.
*
* @param <T> the generic type
*/ */
public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> { public interface WidgetsBundleDao extends Dao<WidgetsBundle> {
/** /**
* Save or update widgets bundle object * Save or update widgets bundle object
@ -36,7 +33,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param widgetsBundle the widgets bundle object * @param widgetsBundle the widgets bundle object
* @return saved widgets bundle object * @return saved widgets bundle object
*/ */
WidgetsBundleEntity save(WidgetsBundle widgetsBundle); WidgetsBundle save(WidgetsBundle widgetsBundle);
/** /**
* Find widgets bundle by tenantId and alias. * Find widgets bundle by tenantId and alias.
@ -45,7 +42,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param alias the alias * @param alias the alias
* @return the widgets bundle object * @return the widgets bundle object
*/ */
WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias); WidgetsBundle findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias);
/** /**
* Find system widgets bundles by page link. * Find system widgets bundles by page link.
@ -53,7 +50,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of widgets bundles objects * @return the list of widgets bundles objects
*/ */
List<WidgetsBundleEntity> findSystemWidgetsBundles(TextPageLink pageLink); List<WidgetsBundle> findSystemWidgetsBundles(TextPageLink pageLink);
/** /**
* Find tenant widgets bundles by tenantId and page link. * Find tenant widgets bundles by tenantId and page link.
@ -62,7 +59,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of widgets bundles objects * @return the list of widgets bundles objects
*/ */
List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink); List<WidgetsBundle> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink);
/** /**
* Find all tenant widgets bundles (including system) by tenantId and page link. * Find all tenant widgets bundles (including system) by tenantId and page link.
@ -71,7 +68,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param pageLink the page link * @param pageLink the page link
* @return the list of widgets bundles objects * @return the list of widgets bundles objects
*/ */
List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink); List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink);
} }

20
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java

@ -25,24 +25,24 @@ import java.util.List;
public interface WidgetsBundleService { public interface WidgetsBundleService {
public WidgetsBundle findWidgetsBundleById(WidgetsBundleId widgetsBundleId); WidgetsBundle findWidgetsBundleById(WidgetsBundleId widgetsBundleId);
public WidgetsBundle saveWidgetsBundle(WidgetsBundle widgetsBundle); WidgetsBundle saveWidgetsBundle(WidgetsBundle widgetsBundle);
public void deleteWidgetsBundle(WidgetsBundleId widgetsBundleId); void deleteWidgetsBundle(WidgetsBundleId widgetsBundleId);
public WidgetsBundle findWidgetsBundleByTenantIdAndAlias(TenantId tenantId, String alias); WidgetsBundle findWidgetsBundleByTenantIdAndAlias(TenantId tenantId, String alias);
public TextPageData<WidgetsBundle> findSystemWidgetsBundlesByPageLink(TextPageLink pageLink); TextPageData<WidgetsBundle> findSystemWidgetsBundlesByPageLink(TextPageLink pageLink);
public List<WidgetsBundle> findSystemWidgetsBundles(); List<WidgetsBundle> findSystemWidgetsBundles();
public TextPageData<WidgetsBundle> findTenantWidgetsBundlesByTenantId(TenantId tenantId, TextPageLink pageLink); TextPageData<WidgetsBundle> findTenantWidgetsBundlesByTenantId(TenantId tenantId, TextPageLink pageLink);
public TextPageData<WidgetsBundle> findAllTenantWidgetsBundlesByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink); TextPageData<WidgetsBundle> findAllTenantWidgetsBundlesByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink);
public List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(TenantId tenantId); List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(TenantId tenantId);
public void deleteWidgetsBundlesByTenantId(TenantId tenantId); void deleteWidgetsBundlesByTenantId(TenantId tenantId);
} }

57
dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java

@ -17,10 +17,9 @@ package org.thingsboard.server.dao.widget;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.WidgetsBundleId; import org.thingsboard.server.common.data.id.WidgetsBundleId;
import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageData;
@ -29,8 +28,6 @@ import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.TenantEntity;
import org.thingsboard.server.dao.model.WidgetsBundleEntity;
import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.PaginatedRemover;
import org.thingsboard.server.dao.service.Validator; import org.thingsboard.server.dao.service.Validator;
@ -39,13 +36,12 @@ import org.thingsboard.server.dao.tenant.TenantDao;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
@Service @Service
@Slf4j @Slf4j
public class WidgetsBundleServiceImpl implements WidgetsBundleService { public class WidgetsBundleServiceImpl implements WidgetsBundleService {
private static final int DEFAULT_WIDGETS_BUNDLE_LIMIT = 300;
@Autowired @Autowired
private WidgetsBundleDao widgetsBundleDao; private WidgetsBundleDao widgetsBundleDao;
@ -59,16 +55,14 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
public WidgetsBundle findWidgetsBundleById(WidgetsBundleId widgetsBundleId) { public WidgetsBundle findWidgetsBundleById(WidgetsBundleId widgetsBundleId) {
log.trace("Executing findWidgetsBundleById [{}]", widgetsBundleId); log.trace("Executing findWidgetsBundleById [{}]", widgetsBundleId);
Validator.validateId(widgetsBundleId, "Incorrect widgetsBundleId " + widgetsBundleId); Validator.validateId(widgetsBundleId, "Incorrect widgetsBundleId " + widgetsBundleId);
WidgetsBundleEntity widgetsBundleEntity = widgetsBundleDao.findById(widgetsBundleId.getId()); return widgetsBundleDao.findById(widgetsBundleId.getId());
return getData(widgetsBundleEntity);
} }
@Override @Override
public WidgetsBundle saveWidgetsBundle(WidgetsBundle widgetsBundle) { public WidgetsBundle saveWidgetsBundle(WidgetsBundle widgetsBundle) {
log.trace("Executing saveWidgetsBundle [{}]", widgetsBundle); log.trace("Executing saveWidgetsBundle [{}]", widgetsBundle);
widgetsBundleValidator.validate(widgetsBundle); widgetsBundleValidator.validate(widgetsBundle);
WidgetsBundleEntity widgetsBundleEntity = widgetsBundleDao.save(widgetsBundle); return widgetsBundleDao.save(widgetsBundle);
return getData(widgetsBundleEntity);
} }
@Override @Override
@ -88,25 +82,22 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
log.trace("Executing findWidgetsBundleByTenantIdAndAlias, tenantId [{}], alias [{}]", tenantId, alias); log.trace("Executing findWidgetsBundleByTenantIdAndAlias, tenantId [{}], alias [{}]", tenantId, alias);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateString(alias, "Incorrect alias " + alias); Validator.validateString(alias, "Incorrect alias " + alias);
WidgetsBundleEntity widgetsBundleEntity = widgetsBundleDao.findWidgetsBundleByTenantIdAndAlias(tenantId.getId(), alias); return widgetsBundleDao.findWidgetsBundleByTenantIdAndAlias(tenantId.getId(), alias);
return getData(widgetsBundleEntity);
} }
@Override @Override
public TextPageData<WidgetsBundle> findSystemWidgetsBundlesByPageLink(TextPageLink pageLink) { public TextPageData<WidgetsBundle> findSystemWidgetsBundlesByPageLink(TextPageLink pageLink) {
log.trace("Executing findSystemWidgetsBundles, pageLink [{}]", pageLink); log.trace("Executing findSystemWidgetsBundles, pageLink [{}]", pageLink);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<WidgetsBundleEntity> widgetsBundlesEntities = widgetsBundleDao.findSystemWidgetsBundles(pageLink); return new TextPageData<>(widgetsBundleDao.findSystemWidgetsBundles(pageLink), pageLink);
List<WidgetsBundle> widgetsBundles = convertDataList(widgetsBundlesEntities);
return new TextPageData<>(widgetsBundles, pageLink);
} }
@Override @Override
public List<WidgetsBundle> findSystemWidgetsBundles() { public List<WidgetsBundle> findSystemWidgetsBundles() {
log.trace("Executing findSystemWidgetsBundles"); log.trace("Executing findSystemWidgetsBundles");
List<WidgetsBundle> widgetsBundles = new ArrayList<>(); List<WidgetsBundle> widgetsBundles = new ArrayList<>();
TextPageLink pageLink = new TextPageLink(300); TextPageLink pageLink = new TextPageLink(DEFAULT_WIDGETS_BUNDLE_LIMIT);
TextPageData<WidgetsBundle> pageData = null; TextPageData<WidgetsBundle> pageData;
do { do {
pageData = findSystemWidgetsBundlesByPageLink(pageLink); pageData = findSystemWidgetsBundlesByPageLink(pageLink);
widgetsBundles.addAll(pageData.getData()); widgetsBundles.addAll(pageData.getData());
@ -122,9 +113,7 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
log.trace("Executing findTenantWidgetsBundlesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); log.trace("Executing findTenantWidgetsBundlesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<WidgetsBundleEntity> widgetsBundlesEntities = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId.getId(), pageLink); return new TextPageData<>(widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId.getId(), pageLink), pageLink);
List<WidgetsBundle> widgetsBundles = convertDataList(widgetsBundlesEntities);
return new TextPageData<>(widgetsBundles, pageLink);
} }
@Override @Override
@ -132,9 +121,7 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
log.trace("Executing findAllTenantWidgetsBundlesByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink); log.trace("Executing findAllTenantWidgetsBundlesByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<WidgetsBundleEntity> widgetsBundlesEntities = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId.getId(), pageLink); return new TextPageData<>(widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId.getId(), pageLink), pageLink);
List<WidgetsBundle> widgetsBundles = convertDataList(widgetsBundlesEntities);
return new TextPageData<>(widgetsBundles, pageLink);
} }
@Override @Override
@ -142,8 +129,8 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
log.trace("Executing findAllTenantWidgetsBundlesByTenantId, tenantId [{}]", tenantId); log.trace("Executing findAllTenantWidgetsBundlesByTenantId, tenantId [{}]", tenantId);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
List<WidgetsBundle> widgetsBundles = new ArrayList<>(); List<WidgetsBundle> widgetsBundles = new ArrayList<>();
TextPageLink pageLink = new TextPageLink(300); TextPageLink pageLink = new TextPageLink(DEFAULT_WIDGETS_BUNDLE_LIMIT);
TextPageData<WidgetsBundle> pageData = null; TextPageData<WidgetsBundle> pageData;
do { do {
pageData = findAllTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, pageLink); pageData = findAllTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, pageLink);
widgetsBundles.addAll(pageData.getData()); widgetsBundles.addAll(pageData.getData());
@ -173,7 +160,7 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
widgetsBundle.setTenantId(new TenantId(ModelConstants.NULL_UUID)); widgetsBundle.setTenantId(new TenantId(ModelConstants.NULL_UUID));
} }
if (!widgetsBundle.getTenantId().getId().equals(ModelConstants.NULL_UUID)) { if (!widgetsBundle.getTenantId().getId().equals(ModelConstants.NULL_UUID)) {
TenantEntity tenant = tenantDao.findById(widgetsBundle.getTenantId().getId()); Tenant tenant = tenantDao.findById(widgetsBundle.getTenantId().getId());
if (tenant == null) { if (tenant == null) {
throw new DataValidationException("Widgets bundle is referencing to non-existent tenant!"); throw new DataValidationException("Widgets bundle is referencing to non-existent tenant!");
} }
@ -185,7 +172,7 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
String alias = widgetsBundle.getTitle().toLowerCase().replaceAll("\\W+", "_"); String alias = widgetsBundle.getTitle().toLowerCase().replaceAll("\\W+", "_");
String originalAlias = alias; String originalAlias = alias;
int c = 1; int c = 1;
WidgetsBundleEntity withSameAlias; WidgetsBundle withSameAlias;
do { do {
withSameAlias = widgetsBundleDao.findWidgetsBundleByTenantIdAndAlias(widgetsBundle.getTenantId().getId(), alias); withSameAlias = widgetsBundleDao.findWidgetsBundleByTenantIdAndAlias(widgetsBundle.getTenantId().getId(), alias);
if (withSameAlias != null) { if (withSameAlias != null) {
@ -197,8 +184,8 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
@Override @Override
protected void validateUpdate(WidgetsBundle widgetsBundle) { protected void validateUpdate(WidgetsBundle widgetsBundle) {
WidgetsBundleEntity storedWidgetsBundle = widgetsBundleDao.findById(widgetsBundle.getId().getId()); WidgetsBundle storedWidgetsBundle = widgetsBundleDao.findById(widgetsBundle.getId().getId());
if (!storedWidgetsBundle.getTenantId().equals(widgetsBundle.getTenantId().getId())) { if (!storedWidgetsBundle.getTenantId().getId().equals(widgetsBundle.getTenantId().getId())) {
throw new DataValidationException("Can't move existing widgets bundle to different tenant!"); throw new DataValidationException("Can't move existing widgets bundle to different tenant!");
} }
if (!storedWidgetsBundle.getAlias().equals(widgetsBundle.getAlias())) { if (!storedWidgetsBundle.getAlias().equals(widgetsBundle.getAlias())) {
@ -208,17 +195,17 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
}; };
private PaginatedRemover<TenantId, WidgetsBundleEntity> tenantWidgetsBundleRemover = private PaginatedRemover<TenantId, WidgetsBundle> tenantWidgetsBundleRemover =
new PaginatedRemover<TenantId, WidgetsBundleEntity>() { new PaginatedRemover<TenantId, WidgetsBundle>() {
@Override @Override
protected List<WidgetsBundleEntity> findEntities(TenantId id, TextPageLink pageLink) { protected List<WidgetsBundle> findEntities(TenantId id, TextPageLink pageLink) {
return widgetsBundleDao.findTenantWidgetsBundlesByTenantId(id.getId(), pageLink); return widgetsBundleDao.findTenantWidgetsBundlesByTenantId(id.getId(), pageLink);
} }
@Override @Override
protected void removeEntity(WidgetsBundleEntity entity) { protected void removeEntity(WidgetsBundle entity) {
deleteWidgetsBundle(new WidgetsBundleId(entity.getId())); deleteWidgetsBundle(new WidgetsBundleId(entity.getUuidId()));
} }
}; };

Loading…
Cancel
Save