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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -15,16 +15,17 @@
*/
package org.thingsboard.server.dao.attributes;
// CASSANDRA ???
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.dao.service.Validator;
import java.util.Collection;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -0,0 +1,37 @@
/**
* Copyright © 2016-2017 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.dashboard;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.model.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 org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.DashboardInfoEntity;
import java.util.Arrays;
@ -31,7 +33,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component
@Slf4j
public class DashboardInfoDaoImpl extends AbstractSearchTextDao<DashboardInfoEntity> implements DashboardInfoDao {
public class CassandraDashboardInfoDao extends CassandraAbstractSearchTextDao<DashboardInfoEntity, DashboardInfo> implements DashboardInfoDao {
@Override
protected Class<DashboardInfoEntity> getColumnFamilyClass() {
@ -44,18 +46,18 @@ public class DashboardInfoDaoImpl extends AbstractSearchTextDao<DashboardInfoEnt
}
@Override
public List<DashboardInfoEntity> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) {
public List<DashboardInfo> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find dashboards by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<DashboardInfoEntity> dashboardEntities = findPageWithTextSearch(DASHBOARD_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Collections.singletonList(eq(DASHBOARD_TENANT_ID_PROPERTY, tenantId)),
pageLink);
log.trace("Found dashboards [{}] by tenantId [{}] and pageLink [{}]", dashboardEntities, tenantId, pageLink);
return dashboardEntities;
return DaoUtil.convertDataList(dashboardEntities);
}
@Override
public List<DashboardInfoEntity> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
public List<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
log.debug("Try to find dashboards by tenantId [{}], customerId[{}] and pageLink [{}]", tenantId, customerId, pageLink);
List<DashboardInfoEntity> dashboardEntities = findPageWithTextSearch(DASHBOARD_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(DASHBOARD_CUSTOMER_ID_PROPERTY, customerId),
@ -63,7 +65,7 @@ public class DashboardInfoDaoImpl extends AbstractSearchTextDao<DashboardInfoEnt
pageLink);
log.trace("Found dashboards [{}] by tenantId [{}], customerId [{}] and pageLink [{}]", dashboardEntities, tenantId, customerId, pageLink);
return dashboardEntities;
return DaoUtil.convertDataList(dashboardEntities);
}
}

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

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

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

@ -1,60 +0,0 @@
/**
* Copyright © 2016-2017 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.dashboard;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_CUSTOMER_ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_TENANT_ID_PROPERTY;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.model.DashboardEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thingsboard.server.dao.model.DashboardInfoEntity;
@Component
@Slf4j
public class DashboardDaoImpl extends AbstractSearchTextDao<DashboardEntity> implements DashboardDao {
@Override
protected Class<DashboardEntity> getColumnFamilyClass() {
return DashboardEntity.class;
}
@Override
protected String getColumnFamilyName() {
return DASHBOARD_COLUMN_FAMILY_NAME;
}
@Override
public DashboardEntity save(Dashboard dashboard) {
log.debug("Save dashboard [{}] ", dashboard);
return save(new DashboardEntity(dashboard));
}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.Optional;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
import static org.thingsboard.server.dao.DaoUtil.toUUIDs;
import static org.thingsboard.server.dao.DaoUtil.*;
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.validateIds;
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
import static org.thingsboard.server.dao.service.Validator.*;
@Service
@Slf4j
@ -71,15 +67,14 @@ public class DeviceServiceImpl implements DeviceService {
public Device findDeviceById(DeviceId deviceId) {
log.trace("Executing findDeviceById [{}]", deviceId);
validateId(deviceId, "Incorrect deviceId " + deviceId);
DeviceEntity deviceEntity = deviceDao.findById(deviceId.getId());
return getData(deviceEntity);
return deviceDao.findById(deviceId.getId());
}
@Override
public ListenableFuture<Device> findDeviceByIdAsync(DeviceId deviceId) {
log.trace("Executing findDeviceById [{}]", deviceId);
validateId(deviceId, "Incorrect deviceId " + deviceId);
ListenableFuture<DeviceEntity> deviceEntity = deviceDao.findByIdAsync(deviceId.getId());
ListenableFuture<Device> deviceEntity = deviceDao.findByIdAsync(deviceId.getId());
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) {
log.trace("Executing findDeviceByTenantIdAndName [{}][{}]", tenantId, name);
validateId(tenantId, "Incorrect tenantId " + tenantId);
Optional<DeviceEntity> deviceEntityOpt = deviceDao.findDevicesByTenantIdAndName(tenantId.getId(), name);
Optional<Device> deviceEntityOpt = deviceDao.findDevicesByTenantIdAndName(tenantId.getId(), name);
if (deviceEntityOpt.isPresent()) {
return Optional.of(getData(deviceEntityOpt.get()));
return Optional.of(deviceEntityOpt.get());
} else {
return Optional.empty();
}
@ -99,15 +94,15 @@ public class DeviceServiceImpl implements DeviceService {
public Device saveDevice(Device device) {
log.trace("Executing saveDevice [{}]", device);
deviceValidator.validate(device);
DeviceEntity deviceEntity = deviceDao.save(device);
Device savedDevice = deviceDao.save(device);
if (device.getId() == null) {
DeviceCredentials deviceCredentials = new DeviceCredentials();
deviceCredentials.setDeviceId(new DeviceId(deviceEntity.getId()));
deviceCredentials.setDeviceId(new DeviceId(savedDevice.getUuidId()));
deviceCredentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN);
deviceCredentials.setCredentialsId(RandomStringUtils.randomAlphanumeric(20));
deviceCredentialsService.createDeviceCredentials(deviceCredentials);
}
return getData(deviceEntity);
return savedDevice;
}
@Override
@ -140,8 +135,7 @@ public class DeviceServiceImpl implements DeviceService {
log.trace("Executing findDevicesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
validateId(tenantId, "Incorrect tenantId " + tenantId);
validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DeviceEntity> deviceEntities = deviceDao.findDevicesByTenantId(tenantId.getId(), pageLink);
List<Device> devices = convertDataList(deviceEntities);
List<Device> devices = deviceDao.findDevicesByTenantId(tenantId.getId(), pageLink);
return new TextPageData<Device>(devices, pageLink);
}
@ -150,7 +144,7 @@ public class DeviceServiceImpl implements DeviceService {
log.trace("Executing findDevicesByTenantIdAndIdsAsync, tenantId [{}], deviceIds [{}]", tenantId, deviceIds);
validateId(tenantId, "Incorrect tenantId " + tenantId);
validateIds(deviceIds, "Incorrect deviceIds " + deviceIds);
ListenableFuture<List<DeviceEntity>> deviceEntities = deviceDao.findDevicesByTenantIdAndIdsAsync(tenantId.getId(), toUUIDs(deviceIds));
ListenableFuture<List<Device>> devices = deviceDao.findDevicesByTenantIdAndIdsAsync(tenantId.getId(), toUUIDs(deviceIds));
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(customerId, "Incorrect customerId " + customerId);
validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<DeviceEntity> deviceEntities = deviceDao.findDevicesByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink);
List<Device> devices = convertDataList(deviceEntities);
List<Device> devices = deviceDao.findDevicesByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), 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;
// CASSANDRA ???
import com.datastax.driver.core.utils.UUIDs;
import lombok.extern.slf4j.Slf4j;
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.TimePageLink;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.EventEntity;
import org.thingsboard.server.dao.service.DataValidator;
import java.util.List;
import java.util.Optional;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@Service
@ -59,7 +57,7 @@ public class BaseEventService implements EventService {
if (StringUtils.isEmpty(event.getUid())) {
event.setUid(event.getId().toString());
}
return getData(eventDao.save(event));
return eventDao.save(event);
}
@Override
@ -75,8 +73,8 @@ public class BaseEventService implements EventService {
if (event.getId() == null) {
event.setId(new EventId(UUIDs.timeBased()));
}
Optional<EventEntity> result = eventDao.saveIfNotExists(event);
return result.isPresent() ? Optional.of(getData(result.get())) : Optional.empty();
Optional<Event> result = eventDao.saveIfNotExists(event);
return result.isPresent() ? Optional.of(result.get()) : Optional.empty();
}
@Override
@ -93,22 +91,19 @@ public class BaseEventService implements EventService {
if (StringUtils.isEmpty(eventUid)) {
throw new DataValidationException("Event uid should be specified!.");
}
EventEntity entity = eventDao.findEvent(tenantId.getId(), entityId, eventType, eventUid);
return entity != null ? Optional.of(getData(entity)) : Optional.empty();
Event event = eventDao.findEvent(tenantId.getId(), entityId, eventType, eventUid);
return event != null ? Optional.of(event) : Optional.empty();
}
@Override
public TimePageData<Event> findEvents(TenantId tenantId, EntityId entityId, TimePageLink pageLink) {
List<EventEntity> entities = eventDao.findEvents(tenantId.getId(), entityId, pageLink);
List<Event> events = convertDataList(entities);
List<Event> events = eventDao.findEvents(tenantId.getId(), entityId, pageLink);
return new TimePageData<Event>(events, pageLink);
}
@Override
public TimePageData<Event> findEvents(TenantId tenantId, EntityId entityId, String eventType, TimePageLink pageLink) {
List<EventEntity> entities = eventDao.findEvents(tenantId.getId(), entityId, eventType, pageLink);
List<Event> events = convertDataList(entities);
List<Event> events = eventDao.findEvents(tenantId.getId(), entityId, eventType, 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.page.TimePageLink;
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.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.select;
import static org.thingsboard.server.dao.model.ModelConstants.EVENT_BY_ID_VIEW_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.EVENT_BY_TYPE_AND_ID_VIEW_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.EVENT_COLUMN_FAMILY_NAME;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component
@Slf4j
public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements EventDao {
public class CassandraBaseEventDao extends AbstractSearchTimeDao<EventEntity, Event> implements EventDao {
@Override
protected Class<EventEntity> getColumnFamilyClass() {
@ -55,18 +54,18 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
}
@Override
public EventEntity save(Event event) {
public Event save(Event event) {
log.debug("Save event [{}] ", event);
return save(new EventEntity(event), false).orElse(null);
}
@Override
public Optional<EventEntity> saveIfNotExists(Event event) {
public Optional<Event> saveIfNotExists(Event event) {
return save(new EventEntity(event), true);
}
@Override
public EventEntity findEvent(UUID tenantId, EntityId entityId, String eventType, String eventUid) {
public Event findEvent(UUID tenantId, EntityId entityId, String eventType, String eventUid) {
log.debug("Search event entity by [{}][{}][{}][{}]", tenantId, entityId, eventType, eventUid);
Select.Where query = select().from(getColumnFamilyName()).where(
eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId))
@ -81,11 +80,11 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
} else {
log.debug("Search result: [{}]", entity != null);
}
return entity;
return DaoUtil.getData(entity);
}
@Override
public List<EventEntity> findEvents(UUID tenantId, EntityId entityId, TimePageLink pageLink) {
public List<Event> findEvents(UUID tenantId, EntityId entityId, TimePageLink pageLink) {
log.trace("Try to find events by tenant [{}], entity [{}]and pageLink [{}]", tenantId, entityId, pageLink);
List<EventEntity> entities = findPageWithTimeSearch(EVENT_BY_ID_VIEW_NAME,
Arrays.asList(eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId),
@ -93,11 +92,11 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
eq(ModelConstants.EVENT_ENTITY_ID_PROPERTY, entityId.getId())),
pageLink);
log.trace("Found events by tenant [{}], entity [{}] and pageLink [{}]", tenantId, entityId, pageLink);
return entities;
return DaoUtil.convertDataList(entities);
}
@Override
public List<EventEntity> findEvents(UUID tenantId, EntityId entityId, String eventType, TimePageLink pageLink) {
public List<Event> findEvents(UUID tenantId, EntityId entityId, String eventType, TimePageLink pageLink) {
log.trace("Try to find events by tenant [{}], entity [{}], type [{}] and pageLink [{}]", tenantId, entityId, eventType, pageLink);
List<EventEntity> entities = findPageWithTimeSearch(EVENT_BY_TYPE_AND_ID_VIEW_NAME,
Arrays.asList(eq(ModelConstants.EVENT_TENANT_ID_PROPERTY, tenantId),
@ -108,10 +107,10 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
QueryBuilder.desc(ModelConstants.EVENT_TYPE_PROPERTY),
pageLink);
log.trace("Found events by tenant [{}], entity [{}], type [{}] and pageLink [{}]", tenantId, entityId, eventType, pageLink);
return entities;
return DaoUtil.convertDataList(entities);
}
private Optional<EventEntity> save(EventEntity entity, boolean ifNotExists) {
private Optional<Event> save(EventEntity entity, boolean ifNotExists) {
if (entity.getId() == null) {
entity.setId(UUIDs.timeBased());
}
@ -128,7 +127,7 @@ public class BaseEventDao extends AbstractSearchTimeDao<EventEntity> implements
}
ResultSet rs = executeWrite(insert);
if (rs.wasApplied()) {
return Optional.of(entity);
return Optional.of(DaoUtil.getData(entity));
} else {
return Optional.empty();
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -1,12 +1,12 @@
/**
* Copyright © 2016-2017 The Thingsboard Authors
*
* <p>
* 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
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.
@ -15,33 +15,35 @@
*/
package org.thingsboard.server.dao.service;
import org.thingsboard.server.common.data.id.IdBased;
import org.thingsboard.server.common.data.page.TextPageLink;
import java.util.List;
import java.util.UUID;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.model.BaseEntity;
public abstract class PaginatedRemover<I, D extends IdBased<?>> {
public abstract class PaginatedRemover<I, E extends BaseEntity<?>> {
private static final int DEFAULT_LIMIT = 100;
public void removeEntitites(I id) {
TextPageLink pageLink = new TextPageLink(100);
TextPageLink pageLink = new TextPageLink(DEFAULT_LIMIT);
boolean hasNext = true;
while (hasNext) {
List<E> entities = findEntities(id, pageLink);
for (E entity : entities) {
List<D> entities = findEntities(id, pageLink);
for (D entity : entities) {
removeEntity(entity);
}
hasNext = entities.size() == pageLink.getLimit();
if (hasNext) {
int index = entities.size()-1;
UUID idOffset = entities.get(index).getId();
int index = entities.size() - 1;
UUID idOffset = entities.get(index).getUuidId();
pageLink.setIdOffset(idOffset);
}
}
}
}
protected abstract List<E> findEntities(I id, TextPageLink pageLink);
protected abstract void removeEntity(E entity);
protected abstract List<D> findEntities(I id, TextPageLink pageLink);
protected abstract void removeEntity(D entity);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -15,13 +15,10 @@
*/
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 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.id.TenantId;
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.device.DeviceService;
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.rule.RuleService;
import org.thingsboard.server.dao.service.DataValidator;
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.user.UserService;
import org.thingsboard.server.dao.widget.WidgetsBundleService;
import java.util.List;
@Service
@Slf4j
public class TenantServiceImpl implements TenantService {
@ -77,8 +71,7 @@ public class TenantServiceImpl implements TenantService {
public Tenant findTenantById(TenantId tenantId) {
log.trace("Executing findTenantById [{}]", tenantId);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
TenantEntity tenantEntity = tenantDao.findById(tenantId.getId());
return getData(tenantEntity);
return tenantDao.findById(tenantId.getId());
}
@Override
@ -86,8 +79,7 @@ public class TenantServiceImpl implements TenantService {
log.trace("Executing saveTenant [{}]", tenant);
tenant.setRegion(DEFAULT_TENANT_REGION);
tenantValidator.validate(tenant);
TenantEntity tenantEntity = tenantDao.save(tenant);
return getData(tenantEntity);
return tenantDao.save(tenant);
}
@Override
@ -108,9 +100,8 @@ public class TenantServiceImpl implements TenantService {
public TextPageData<Tenant> findTenants(TextPageLink pageLink) {
log.trace("Executing findTenants pageLink [{}]", pageLink);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<TenantEntity> tenantEntities = tenantDao.findTenantsByRegion(DEFAULT_TENANT_REGION, pageLink);
List<Tenant> tenants = convertDataList(tenantEntities);
return new TextPageData<Tenant>(tenants, pageLink);
List<Tenant> tenants = tenantDao.findTenantsByRegion(DEFAULT_TENANT_REGION, pageLink);
return new TextPageData<>(tenants, pageLink);
}
@Override
@ -132,17 +123,17 @@ public class TenantServiceImpl implements TenantService {
}
};
private PaginatedRemover<String, TenantEntity> tenantsRemover =
new PaginatedRemover<String, TenantEntity>() {
private PaginatedRemover<String, Tenant> tenantsRemover =
new PaginatedRemover<String, Tenant>() {
@Override
protected List<TenantEntity> findEntities(String region, TextPageLink pageLink) {
protected List<Tenant> findEntities(String region, TextPageLink pageLink) {
return tenantDao.findTenantsByRegion(region, pageLink);
}
@Override
protected void removeEntity(TenantEntity entity) {
deleteTenant(new TenantId(entity.getId()));
protected void removeEntity(Tenant entity) {
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;
// CASSANDRA ???
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture;
import com.datastax.driver.core.Row;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
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.kv.BaseTsKvQuery;
import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.kv.TsKvQuery;
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 javax.annotation.Nullable;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
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 java.util.Collection;
import java.util.List;
import java.util.UUID;
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.thingsboard.server.common.data.kv.*;
import org.thingsboard.server.common.data.kv.DataType;
import org.thingsboard.server.dao.AbstractAsyncDao;
import org.thingsboard.server.dao.AbstractDao;
import org.thingsboard.server.dao.CassandraAbstractAsyncDao;
import org.thingsboard.server.dao.model.ModelConstants;
import javax.annotation.Nullable;
@ -38,20 +37,20 @@ import javax.annotation.PreDestroy;
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.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
/**
* @author Andrew Shvayka
*/
@Component
@Slf4j
public class BaseTimeseriesDao extends AbstractAsyncDao implements TimeseriesDao {
public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implements TimeseriesDao {
//@Value("${cassandra.query.min_aggregation_step_ms}")
//TODO:

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

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.timeseries;
// CASSANDRA ???
import com.datastax.driver.core.ResultSetFuture;
import com.datastax.driver.core.Row;
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 java.util.List;
import java.util.Optional;
import java.util.Set;
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;
// CASSANDRA ???
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture;
import com.datastax.driver.core.Row;
import com.google.common.util.concurrent.ListenableFuture;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.UUIDBased;
import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.kv.TsKvQuery;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
* @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;
import lombok.Data;
import lombok.Getter;
import org.thingsboard.server.common.data.kv.TsKvEntry;
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;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import java.util.UUID;
import com.datastax.driver.core.querybuilder.Select.Where;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.security.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.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 java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
@Component
@Slf4j
public class UserCredentialsDaoImpl extends AbstractModelDao<UserCredentialsEntity> implements UserCredentialsDao {
public class CassandraUserCredentialsDao extends CassandraAbstractModelDao<UserCredentialsEntity, UserCredentials> implements UserCredentialsDao {
@Override
protected Class<UserCredentialsEntity> getColumnFamilyClass() {
@ -47,41 +44,35 @@ public class UserCredentialsDaoImpl extends AbstractModelDao<UserCredentialsEnti
}
@Override
public UserCredentialsEntity save(UserCredentials userCredentials) {
log.debug("Save user credentials [{}] ", userCredentials);
return save(new UserCredentialsEntity(userCredentials));
}
@Override
public UserCredentialsEntity findByUserId(UUID userId) {
public UserCredentials findByUserId(UUID 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));
log.trace("Execute query {}", query);
UserCredentialsEntity userCredentialsEntity = findOneByStatement(query);
log.trace("Found user credentials [{}] by userId [{}]", userCredentialsEntity, userId);
return userCredentialsEntity;
return DaoUtil.getData(userCredentialsEntity);
}
@Override
public UserCredentialsEntity findByActivateToken(String activateToken) {
public UserCredentials findByActivateToken(String 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(eq(ModelConstants.USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY, activateToken));
log.trace("Execute query {}", query);
UserCredentialsEntity userCredentialsEntity = findOneByStatement(query);
log.trace("Found user credentials [{}] by activateToken [{}]", userCredentialsEntity, activateToken);
return userCredentialsEntity;
return DaoUtil.getData(userCredentialsEntity);
}
@Override
public UserCredentialsEntity findByResetToken(String resetToken) {
public UserCredentials findByResetToken(String 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(eq(ModelConstants.USER_CREDENTIALS_RESET_TOKEN_PROPERTY, resetToken));
log.trace("Execute query {}", query);
UserCredentialsEntity userCredentialsEntity = findOneByStatement(query);
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;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import com.datastax.driver.core.querybuilder.Select.Where;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.page.TextPageLink;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.datastax.driver.core.querybuilder.Select.Where;
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;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
@Component
@Slf4j
public class UserDaoImpl extends AbstractSearchTextDao<UserEntity> implements UserDao {
public class CassandraUserDao extends CassandraAbstractSearchTextDao<UserEntity, User> implements UserDao {
@Override
protected Class<UserEntity> getColumnFamilyClass() {
@ -50,23 +48,17 @@ public class UserDaoImpl extends AbstractSearchTextDao<UserEntity> implements Us
}
@Override
public UserEntity findByEmail(String email) {
public User findByEmail(String 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));
log.trace("Execute query {}", query);
UserEntity userEntity = findOneByStatement(query);
log.trace("Found user [{}] by email [{}]", userEntity, email);
return userEntity;
}
@Override
public UserEntity save(User user) {
log.debug("Save user [{}] ", user);
return save(new UserEntity(user));
return DaoUtil.getData(userEntity);
}
@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);
List<UserEntity> userEntities = findPageWithTextSearch(ModelConstants.USER_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
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())),
pageLink);
log.trace("Found tenant admin users [{}] by tenantId [{}] and pageLink [{}]", userEntities, tenantId, pageLink);
return userEntities;
return DaoUtil.convertDataList(userEntities);
}
@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);
List<UserEntity> userEntities = findPageWithTextSearch(ModelConstants.USER_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
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())),
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;
import java.util.UUID;
import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.UserCredentialsEntity;
import java.util.UUID;
/**
* 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
@ -34,7 +31,7 @@ public interface UserCredentialsDao extends Dao<UserCredentialsEntity> {
* @param userCredentials the user credentials object
* @return saved user credentials object
*/
UserCredentialsEntity save(UserCredentials userCredentials);
UserCredentials save(UserCredentials userCredentials);
/**
* Find user credentials by user id.
@ -42,22 +39,22 @@ public interface UserCredentialsDao extends Dao<UserCredentialsEntity> {
* @param userId the user id
* @return the user credentials object
*/
UserCredentialsEntity findByUserId(UUID userId);
UserCredentials findByUserId(UUID userId);
/**
* Find user credentials by activate token.
*
* @param activateToken the activate token
* @return the user credentials object
*/
UserCredentialsEntity findByActivateToken(String activateToken);
UserCredentials findByActivateToken(String activateToken);
/**
* Find user credentials by reset token.
*
* @param resetToken the reset token
* @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;
import java.util.List;
import java.util.UUID;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.page.TextPageLink;
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
@ -31,7 +30,7 @@ public interface UserDao extends Dao<UserEntity> {
* @param user the user object
* @return saved user entity
*/
UserEntity save(User user);
User save(User user);
/**
* Find user by email.
@ -39,7 +38,7 @@ public interface UserDao extends Dao<UserEntity> {
* @param email the email
* @return the user entity
*/
UserEntity findByEmail(String email);
User findByEmail(String email);
/**
* Find tenant admin users by tenantId and page link.
@ -48,7 +47,7 @@ public interface UserDao extends Dao<UserEntity> {
* @param pageLink the page link
* @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.
@ -58,6 +57,6 @@ public interface UserDao extends Dao<UserEntity> {
* @param pageLink the page link
* @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 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;
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 org.apache.commons.lang3.RandomStringUtils;
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.id.CustomerId;
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.exception.DataValidationException;
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.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 java.util.List;
import static org.thingsboard.server.dao.service.Validator.*;
@Service
@Slf4j
public class UserServiceImpl implements UserService {
private static final int DEFAULT_TOKEN_LENGTH = 30;
@Autowired
private UserDao userDao;
@ -66,63 +64,57 @@ public class UserServiceImpl implements UserService {
public User findUserByEmail(String email) {
log.trace("Executing findUserByEmail [{}]", email);
validateString(email, "Incorrect email " + email);
UserEntity userEntity = userDao.findByEmail(email);
return getData(userEntity);
return userDao.findByEmail(email);
}
@Override
public User findUserById(UserId userId) {
log.trace("Executing findUserById [{}]", userId);
validateId(userId, "Incorrect userId " + userId);
UserEntity userEntity = userDao.findById(userId.getId());
return getData(userEntity);
return userDao.findById(userId.getId());
}
@Override
public User saveUser(User user) {
log.trace("Executing saveUser [{}]", user);
userValidator.validate(user);
UserEntity userEntity = userDao.save(user);
User savedUser = userDao.save(user);
if (user.getId() == null) {
UserCredentials userCredentials = new UserCredentials();
userCredentials.setEnabled(false);
userCredentials.setActivateToken(RandomStringUtils.randomAlphanumeric(30));
userCredentials.setUserId(new UserId(userEntity.getId()));
userCredentials.setActivateToken(RandomStringUtils.randomAlphanumeric(DEFAULT_TOKEN_LENGTH));
userCredentials.setUserId(new UserId(savedUser.getUuidId()));
userCredentialsDao.save(userCredentials);
}
return getData(userEntity);
return savedUser;
}
@Override
public UserCredentials findUserCredentialsByUserId(UserId userId) {
log.trace("Executing findUserCredentialsByUserId [{}]", userId);
validateId(userId, "Incorrect userId " + userId);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByUserId(userId.getId());
return getData(userCredentialsEntity);
return userCredentialsDao.findByUserId(userId.getId());
}
@Override
public UserCredentials findUserCredentialsByActivateToken(String activateToken) {
log.trace("Executing findUserCredentialsByActivateToken [{}]", activateToken);
validateString(activateToken, "Incorrect activateToken " + activateToken);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByActivateToken(activateToken);
return getData(userCredentialsEntity);
return userCredentialsDao.findByActivateToken(activateToken);
}
@Override
public UserCredentials findUserCredentialsByResetToken(String resetToken) {
log.trace("Executing findUserCredentialsByResetToken [{}]", resetToken);
validateString(resetToken, "Incorrect resetToken " + resetToken);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByResetToken(resetToken);
return getData(userCredentialsEntity);
return userCredentialsDao.findByResetToken(resetToken);
}
@Override
public UserCredentials saveUserCredentials(UserCredentials userCredentials) {
log.trace("Executing saveUserCredentials [{}]", userCredentials);
userCredentialsValidator.validate(userCredentials);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.save(userCredentials);
return getData(userCredentialsEntity);
return userCredentialsDao.save(userCredentials);
}
@Override
@ -130,11 +122,10 @@ public class UserServiceImpl implements UserService {
log.trace("Executing activateUserCredentials activateToken [{}], password [{}]", activateToken, password);
validateString(activateToken, "Incorrect activateToken " + activateToken);
validateString(password, "Incorrect password " + password);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByActivateToken(activateToken);
if (userCredentialsEntity == null) {
UserCredentials userCredentials = userCredentialsDao.findByActivateToken(activateToken);
if (userCredentials == null) {
throw new IncorrectParameterException(String.format("Unable to find user credentials by activateToken [%s]", activateToken));
}
UserCredentials userCredentials = getData(userCredentialsEntity);
if (userCredentials.isEnabled()) {
throw new IncorrectParameterException("User credentials already activated");
}
@ -149,16 +140,15 @@ public class UserServiceImpl implements UserService {
public UserCredentials requestPasswordReset(String email) {
log.trace("Executing requestPasswordReset email [{}]", email);
validateString(email, "Incorrect email " + email);
UserEntity userEntity = userDao.findByEmail(email);
if (userEntity == null) {
User user = userDao.findByEmail(email);
if (user == null) {
throw new IncorrectParameterException(String.format("Unable to find user by email [%s]", email));
}
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByUserId(userEntity.getId());
UserCredentials userCredentials = getData(userCredentialsEntity);
UserCredentials userCredentials = userCredentialsDao.findByUserId(user.getUuidId());
if (!userCredentials.isEnabled()) {
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);
}
@ -167,8 +157,8 @@ public class UserServiceImpl implements UserService {
public void deleteUser(UserId userId) {
log.trace("Executing deleteUser [{}]", userId);
validateId(userId, "Incorrect userId " + userId);
UserCredentialsEntity userCredentialsEntity = userCredentialsDao.findByUserId(userId.getId());
userCredentialsDao.removeById(userCredentialsEntity.getId());
UserCredentials userCredentials = userCredentialsDao.findByUserId(userId.getId());
userCredentialsDao.removeById(userCredentials.getUuidId());
userDao.removeById(userId.getId());
}
@ -177,9 +167,8 @@ public class UserServiceImpl implements UserService {
log.trace("Executing findTenantAdmins, tenantId [{}], pageLink [{}]", tenantId, pageLink);
validateId(tenantId, "Incorrect tenantId " + tenantId);
validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<UserEntity> userEntities = userDao.findTenantAdmins(tenantId.getId(), pageLink);
List<User> users = convertDataList(userEntities);
return new TextPageData<User>(users, pageLink);
List<User> users = userDao.findTenantAdmins(tenantId.getId(), pageLink);
return new TextPageData<>(users, pageLink);
}
@Override
@ -195,9 +184,8 @@ public class UserServiceImpl implements UserService {
validateId(tenantId, "Incorrect tenantId " + tenantId);
validateId(customerId, "Incorrect customerId " + customerId);
validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<UserEntity> userEntities = userDao.findCustomerUsers(tenantId.getId(), customerId.getId(), pageLink);
List<User> users = convertDataList(userEntities);
return new TextPageData<User>(users, pageLink);
List<User> users = userDao.findCustomerUsers(tenantId.getId(), customerId.getId(), pageLink);
return new TextPageData<>(users, pageLink);
}
@Override
@ -266,16 +254,16 @@ public class UserServiceImpl implements UserService {
+ " already present in database!");
}
if (!tenantId.getId().equals(ModelConstants.NULL_UUID)) {
TenantEntity tenant = tenantDao.findById(user.getTenantId().getId());
Tenant tenant = tenantDao.findById(user.getTenantId().getId());
if (tenant == null) {
throw new DataValidationException("User is referencing to non-existent tenant!");
}
}
if (!customerId.getId().equals(ModelConstants.NULL_UUID)) {
CustomerEntity customer = customerDao.findById(user.getCustomerId().getId());
Customer customer = customerDao.findById(user.getCustomerId().getId());
if (customer == null) {
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!");
}
}
@ -303,7 +291,7 @@ public class UserServiceImpl implements UserService {
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) {
throw new DataValidationException("Unable to update non-existent user credentials!");
}
@ -314,21 +302,21 @@ public class UserServiceImpl implements UserService {
}
};
private PaginatedRemover<TenantId, UserEntity> tenantAdminsRemover =
new PaginatedRemover<TenantId, UserEntity>() {
private PaginatedRemover<TenantId, User> tenantAdminsRemover =
new PaginatedRemover<TenantId, User>() {
@Override
protected List<UserEntity> findEntities(TenantId id, TextPageLink pageLink) {
protected List<User> findEntities(TenantId id, TextPageLink pageLink) {
return userDao.findTenantAdmins(id.getId(), pageLink);
}
@Override
protected void removeEntity(UserEntity entity) {
deleteUser(new UserId(entity.getId()));
protected void removeEntity(User entity) {
deleteUser(new UserId(entity.getUuidId()));
}
};
class CustomerUsersRemover extends PaginatedRemover<CustomerId, UserEntity> {
private class CustomerUsersRemover extends PaginatedRemover<CustomerId, User> {
private TenantId tenantId;
@ -337,14 +325,14 @@ public class UserServiceImpl implements UserService {
}
@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);
}
@Override
protected void removeEntity(UserEntity entity) {
deleteUser(new UserId(entity.getId()));
protected void removeEntity(User entity) {
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 lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
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 java.util.List;
@ -34,7 +32,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component
@Slf4j
public class WidgetTypeDaoImpl extends AbstractModelDao<WidgetTypeEntity> implements WidgetTypeDao {
public class CassandraWidgetTypeDao extends CassandraAbstractModelDao<WidgetTypeEntity, WidgetType> implements WidgetTypeDao {
@Override
protected Class<WidgetTypeEntity> getColumnFamilyClass() {
@ -47,13 +45,7 @@ public class WidgetTypeDaoImpl extends AbstractModelDao<WidgetTypeEntity> implem
}
@Override
public WidgetTypeEntity save(WidgetType widgetType) {
log.debug("Save widget type [{}] ", widgetType);
return save(new WidgetTypeEntity(widgetType));
}
@Override
public List<WidgetTypeEntity> findWidgetTypesByTenantIdAndBundleAlias(UUID tenantId, String bundleAlias) {
public List<WidgetType> findWidgetTypesByTenantIdAndBundleAlias(UUID tenantId, String 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()
@ -61,11 +53,11 @@ public class WidgetTypeDaoImpl extends AbstractModelDao<WidgetTypeEntity> implem
.and(eq(WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY, bundleAlias));
List<WidgetTypeEntity> widgetTypesEntities = findListByStatement(query);
log.trace("Found widget types [{}] by tenantId [{}] and bundleAlias [{}]", widgetTypesEntities, tenantId, bundleAlias);
return widgetTypesEntities;
return DaoUtil.convertDataList(widgetTypesEntities);
}
@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);
Where query = select().from(WIDGET_TYPE_BY_TENANT_AND_ALIASES_COLUMN_FAMILY_NAME)
.where()
@ -76,7 +68,7 @@ public class WidgetTypeDaoImpl extends AbstractModelDao<WidgetTypeEntity> implem
WidgetTypeEntity widgetTypeEntity = findOneByStatement(query);
log.trace("Found widget type [{}] by tenantId [{}], bundleAlias [{}] and 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 lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.AbstractSearchTextDao;
import org.thingsboard.server.dao.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.WidgetsBundleEntity;
import java.util.Arrays;
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.in;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
import static org.thingsboard.server.dao.model.ModelConstants.*;
@Component
@Slf4j
public class WidgetsBundleDaoImpl extends AbstractSearchTextDao<WidgetsBundleEntity> implements WidgetsBundleDao {
public class CassandraWidgetsBundleDao extends CassandraAbstractSearchTextDao<WidgetsBundleEntity, WidgetsBundle> implements WidgetsBundleDao {
@Override
protected Class<WidgetsBundleEntity> getColumnFamilyClass() {
@ -49,13 +46,7 @@ public class WidgetsBundleDaoImpl extends AbstractSearchTextDao<WidgetsBundleEnt
}
@Override
public WidgetsBundleEntity save(WidgetsBundle widgetsBundle) {
log.debug("Save widgets bundle [{}] ", widgetsBundle);
return save(new WidgetsBundleEntity(widgetsBundle));
}
@Override
public WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias) {
public WidgetsBundle findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String 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)
.where()
@ -65,37 +56,37 @@ public class WidgetsBundleDaoImpl extends AbstractSearchTextDao<WidgetsBundleEnt
WidgetsBundleEntity widgetsBundleEntity = findOneByStatement(query);
log.trace("Found widgets bundle [{}] by tenantId [{}] and alias [{}]",
widgetsBundleEntity, tenantId, alias);
return widgetsBundleEntity;
return DaoUtil.getData(widgetsBundleEntity);
}
@Override
public List<WidgetsBundleEntity> findSystemWidgetsBundles(TextPageLink pageLink) {
public List<WidgetsBundle> findSystemWidgetsBundles(TextPageLink 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,
Arrays.asList(eq(WIDGETS_BUNDLE_TENANT_ID_PROPERTY, NULL_UUID)),
pageLink);
log.trace("Found system widgets bundles [{}] by pageLink [{}]", widgetsBundlesEntities, pageLink);
return widgetsBundlesEntities;
return DaoUtil.convertDataList(widgetsBundlesEntities);
}
@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);
List<WidgetsBundleEntity> widgetsBundlesEntities = findPageWithTextSearch(WIDGETS_BUNDLE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME,
Arrays.asList(eq(WIDGETS_BUNDLE_TENANT_ID_PROPERTY, tenantId)),
pageLink);
log.trace("Found tenant widgets bundles [{}] by tenantId [{}] and pageLink [{}]", widgetsBundlesEntities, tenantId, pageLink);
return widgetsBundlesEntities;
return DaoUtil.convertDataList(widgetsBundlesEntities);
}
@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);
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))),
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.dao.Dao;
import org.thingsboard.server.dao.model.WidgetTypeEntity;
import java.util.List;
import java.util.UUID;
/**
* 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
@ -35,7 +32,7 @@ public interface WidgetTypeDao extends Dao<WidgetTypeEntity> {
* @param widgetType the widget type object
* @return saved widget type object
*/
WidgetTypeEntity save(WidgetType widgetType);
WidgetType save(WidgetType widgetType);
/**
* Find widget types by tenantId and bundleAlias.
@ -44,7 +41,7 @@ public interface WidgetTypeDao extends Dao<WidgetTypeEntity> {
* @param bundleAlias the bundle alias
* @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.
@ -54,6 +51,6 @@ public interface WidgetTypeDao extends Dao<WidgetTypeEntity> {
* @param alias the alias
* @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 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 org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.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.dao.exception.DataValidationException;
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.Validator;
import org.thingsboard.server.dao.tenant.TenantDao;
import org.thingsboard.server.dao.tenant.TenantService;
import java.util.List;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
@Service
@Slf4j
public class WidgetTypeServiceImpl implements WidgetTypeService {
@ -58,16 +49,14 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
public WidgetType findWidgetTypeById(WidgetTypeId widgetTypeId) {
log.trace("Executing findWidgetTypeById [{}]", widgetTypeId);
Validator.validateId(widgetTypeId, "Incorrect widgetTypeId " + widgetTypeId);
WidgetTypeEntity widgetTypeEntity = widgetTypeDao.findById(widgetTypeId.getId());
return getData(widgetTypeEntity);
return widgetTypeDao.findById(widgetTypeId.getId());
}
@Override
public WidgetType saveWidgetType(WidgetType widgetType) {
log.trace("Executing saveWidgetType [{}]", widgetType);
widgetTypeValidator.validate(widgetType);
WidgetTypeEntity widgetTypeEntity = widgetTypeDao.save(widgetType);
return getData(widgetTypeEntity);
return widgetTypeDao.save(widgetType);
}
@Override
@ -82,8 +71,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
log.trace("Executing findWidgetTypesByTenantIdAndBundleAlias, tenantId [{}], bundleAlias [{}]", tenantId, bundleAlias);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateString(bundleAlias, "Incorrect bundleAlias " + bundleAlias);
List<WidgetTypeEntity> widgetTypesEntities = widgetTypeDao.findWidgetTypesByTenantIdAndBundleAlias(tenantId.getId(), bundleAlias);
return convertDataList(widgetTypesEntities);
return widgetTypeDao.findWidgetTypesByTenantIdAndBundleAlias(tenantId.getId(), bundleAlias);
}
@Override
@ -92,8 +80,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateString(bundleAlias, "Incorrect bundleAlias " + bundleAlias);
Validator.validateString(alias, "Incorrect alias " + alias);
WidgetTypeEntity widgetTypeEntity = widgetTypeDao.findByTenantIdBundleAliasAndAlias(tenantId.getId(), bundleAlias, alias);
return getData(widgetTypeEntity);
return widgetTypeDao.findByTenantIdBundleAliasAndAlias(tenantId.getId(), bundleAlias, alias);
}
@Override
@ -101,9 +88,9 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
log.trace("Executing deleteWidgetTypesByTenantIdAndBundleAlias, tenantId [{}], bundleAlias [{}]", tenantId, bundleAlias);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateString(bundleAlias, "Incorrect bundleAlias " + bundleAlias);
List<WidgetTypeEntity> widgetTypesEntities = widgetTypeDao.findWidgetTypesByTenantIdAndBundleAlias(tenantId.getId(), bundleAlias);
for (WidgetTypeEntity widgetTypeEntity : widgetTypesEntities) {
deleteWidgetType(new WidgetTypeId(widgetTypeEntity.getId()));
List<WidgetType> widgetTypes = widgetTypeDao.findWidgetTypesByTenantIdAndBundleAlias(tenantId.getId(), bundleAlias);
for (WidgetType widgetType : widgetTypes) {
deleteWidgetType(new WidgetTypeId(widgetType.getUuidId()));
}
}
@ -124,7 +111,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
widgetType.setTenantId(new TenantId(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) {
throw new DataValidationException("Widget type is referencing to non-existent tenant!");
}
@ -133,8 +120,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
@Override
protected void validateCreate(WidgetType widgetType) {
WidgetsBundleEntity widgetsBundle = widgetsBundleService.findWidgetsBundleByTenantIdAndAlias(widgetType.getTenantId().getId(), widgetType.getBundleAlias());
WidgetsBundle widgetsBundle = widgetsBundleService.findWidgetsBundleByTenantIdAndAlias(widgetType.getTenantId().getId(), widgetType.getBundleAlias());
if (widgetsBundle == null) {
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 originalAlias = alias;
int c = 1;
WidgetTypeEntity withSameAlias;
WidgetType withSameAlias;
do {
withSameAlias = widgetTypeDao.findByTenantIdBundleAliasAndAlias(widgetType.getTenantId().getId(), widgetType.getBundleAlias(), alias);
if (withSameAlias != null) {
@ -154,8 +140,8 @@ public class WidgetTypeServiceImpl implements WidgetTypeService {
@Override
protected void validateUpdate(WidgetType widgetType) {
WidgetTypeEntity storedWidgetType = widgetTypeDao.findById(widgetType.getId().getId());
if (!storedWidgetType.getTenantId().equals(widgetType.getTenantId().getId())) {
WidgetType storedWidgetType = widgetTypeDao.findById(widgetType.getId().getId());
if (!storedWidgetType.getTenantId().getId().equals(widgetType.getTenantId().getId())) {
throw new DataValidationException("Can't move existing widget type to different tenant!");
}
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.widget.WidgetsBundle;
import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.model.WidgetsBundleEntity;
import java.util.List;
import java.util.UUID;
/**
* 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
@ -36,7 +33,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param widgetsBundle the widgets bundle object
* @return saved widgets bundle object
*/
WidgetsBundleEntity save(WidgetsBundle widgetsBundle);
WidgetsBundle save(WidgetsBundle widgetsBundle);
/**
* Find widgets bundle by tenantId and alias.
@ -45,7 +42,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param alias the alias
* @return the widgets bundle object
*/
WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias);
WidgetsBundle findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias);
/**
* Find system widgets bundles by page link.
@ -53,7 +50,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param pageLink the page link
* @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.
@ -62,7 +59,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param pageLink the page link
* @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.
@ -71,7 +68,7 @@ public interface WidgetsBundleDao extends Dao<WidgetsBundleEntity> {
* @param pageLink the page link
* @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 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 org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.WidgetsBundleId;
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.IncorrectParameterException;
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.PaginatedRemover;
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.List;
import static org.thingsboard.server.dao.DaoUtil.convertDataList;
import static org.thingsboard.server.dao.DaoUtil.getData;
@Service
@Slf4j
public class WidgetsBundleServiceImpl implements WidgetsBundleService {
private static final int DEFAULT_WIDGETS_BUNDLE_LIMIT = 300;
@Autowired
private WidgetsBundleDao widgetsBundleDao;
@ -59,16 +55,14 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
public WidgetsBundle findWidgetsBundleById(WidgetsBundleId widgetsBundleId) {
log.trace("Executing findWidgetsBundleById [{}]", widgetsBundleId);
Validator.validateId(widgetsBundleId, "Incorrect widgetsBundleId " + widgetsBundleId);
WidgetsBundleEntity widgetsBundleEntity = widgetsBundleDao.findById(widgetsBundleId.getId());
return getData(widgetsBundleEntity);
return widgetsBundleDao.findById(widgetsBundleId.getId());
}
@Override
public WidgetsBundle saveWidgetsBundle(WidgetsBundle widgetsBundle) {
log.trace("Executing saveWidgetsBundle [{}]", widgetsBundle);
widgetsBundleValidator.validate(widgetsBundle);
WidgetsBundleEntity widgetsBundleEntity = widgetsBundleDao.save(widgetsBundle);
return getData(widgetsBundleEntity);
return widgetsBundleDao.save(widgetsBundle);
}
@Override
@ -88,25 +82,22 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
log.trace("Executing findWidgetsBundleByTenantIdAndAlias, tenantId [{}], alias [{}]", tenantId, alias);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validateString(alias, "Incorrect alias " + alias);
WidgetsBundleEntity widgetsBundleEntity = widgetsBundleDao.findWidgetsBundleByTenantIdAndAlias(tenantId.getId(), alias);
return getData(widgetsBundleEntity);
return widgetsBundleDao.findWidgetsBundleByTenantIdAndAlias(tenantId.getId(), alias);
}
@Override
public TextPageData<WidgetsBundle> findSystemWidgetsBundlesByPageLink(TextPageLink pageLink) {
log.trace("Executing findSystemWidgetsBundles, pageLink [{}]", pageLink);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<WidgetsBundleEntity> widgetsBundlesEntities = widgetsBundleDao.findSystemWidgetsBundles(pageLink);
List<WidgetsBundle> widgetsBundles = convertDataList(widgetsBundlesEntities);
return new TextPageData<>(widgetsBundles, pageLink);
return new TextPageData<>(widgetsBundleDao.findSystemWidgetsBundles(pageLink), pageLink);
}
@Override
public List<WidgetsBundle> findSystemWidgetsBundles() {
log.trace("Executing findSystemWidgetsBundles");
List<WidgetsBundle> widgetsBundles = new ArrayList<>();
TextPageLink pageLink = new TextPageLink(300);
TextPageData<WidgetsBundle> pageData = null;
TextPageLink pageLink = new TextPageLink(DEFAULT_WIDGETS_BUNDLE_LIMIT);
TextPageData<WidgetsBundle> pageData;
do {
pageData = findSystemWidgetsBundlesByPageLink(pageLink);
widgetsBundles.addAll(pageData.getData());
@ -122,9 +113,7 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
log.trace("Executing findTenantWidgetsBundlesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<WidgetsBundleEntity> widgetsBundlesEntities = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId.getId(), pageLink);
List<WidgetsBundle> widgetsBundles = convertDataList(widgetsBundlesEntities);
return new TextPageData<>(widgetsBundles, pageLink);
return new TextPageData<>(widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId.getId(), pageLink), pageLink);
}
@Override
@ -132,9 +121,7 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
log.trace("Executing findAllTenantWidgetsBundlesByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink);
List<WidgetsBundleEntity> widgetsBundlesEntities = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId.getId(), pageLink);
List<WidgetsBundle> widgetsBundles = convertDataList(widgetsBundlesEntities);
return new TextPageData<>(widgetsBundles, pageLink);
return new TextPageData<>(widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId.getId(), pageLink), pageLink);
}
@Override
@ -142,8 +129,8 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
log.trace("Executing findAllTenantWidgetsBundlesByTenantId, tenantId [{}]", tenantId);
Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
List<WidgetsBundle> widgetsBundles = new ArrayList<>();
TextPageLink pageLink = new TextPageLink(300);
TextPageData<WidgetsBundle> pageData = null;
TextPageLink pageLink = new TextPageLink(DEFAULT_WIDGETS_BUNDLE_LIMIT);
TextPageData<WidgetsBundle> pageData;
do {
pageData = findAllTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, pageLink);
widgetsBundles.addAll(pageData.getData());
@ -173,7 +160,7 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
widgetsBundle.setTenantId(new TenantId(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) {
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 originalAlias = alias;
int c = 1;
WidgetsBundleEntity withSameAlias;
WidgetsBundle withSameAlias;
do {
withSameAlias = widgetsBundleDao.findWidgetsBundleByTenantIdAndAlias(widgetsBundle.getTenantId().getId(), alias);
if (withSameAlias != null) {
@ -197,8 +184,8 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
@Override
protected void validateUpdate(WidgetsBundle widgetsBundle) {
WidgetsBundleEntity storedWidgetsBundle = widgetsBundleDao.findById(widgetsBundle.getId().getId());
if (!storedWidgetsBundle.getTenantId().equals(widgetsBundle.getTenantId().getId())) {
WidgetsBundle storedWidgetsBundle = widgetsBundleDao.findById(widgetsBundle.getId().getId());
if (!storedWidgetsBundle.getTenantId().getId().equals(widgetsBundle.getTenantId().getId())) {
throw new DataValidationException("Can't move existing widgets bundle to different tenant!");
}
if (!storedWidgetsBundle.getAlias().equals(widgetsBundle.getAlias())) {
@ -208,17 +195,17 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService {
};
private PaginatedRemover<TenantId, WidgetsBundleEntity> tenantWidgetsBundleRemover =
new PaginatedRemover<TenantId, WidgetsBundleEntity>() {
private PaginatedRemover<TenantId, WidgetsBundle> tenantWidgetsBundleRemover =
new PaginatedRemover<TenantId, WidgetsBundle>() {
@Override
protected List<WidgetsBundleEntity> findEntities(TenantId id, TextPageLink pageLink) {
protected List<WidgetsBundle> findEntities(TenantId id, TextPageLink pageLink) {
return widgetsBundleDao.findTenantWidgetsBundlesByTenantId(id.getId(), pageLink);
}
@Override
protected void removeEntity(WidgetsBundleEntity entity) {
deleteWidgetsBundle(new WidgetsBundleId(entity.getId()));
protected void removeEntity(WidgetsBundle entity) {
deleteWidgetsBundle(new WidgetsBundleId(entity.getUuidId()));
}
};

Loading…
Cancel
Save