From 76300e400e1e1882c69780eb1d1959071cb8446c Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 8 May 2020 15:45:54 +0300 Subject: [PATCH] Update Cassandra Driver --- application/pom.xml | 10 + .../actors/ruleChain/DefaultTbContext.java | 4 +- .../controller/RuleChainController.java | 1 - .../CassandraTsDatabaseUpgradeService.java | 2 +- .../install/cql/CassandraDbHelper.java | 102 ++++---- .../install/migrate/CassandraToSqlColumn.java | 6 +- .../migrate/CassandraToSqlEventTsColumn.java | 6 +- .../install/migrate/CassandraToSqlTable.java | 20 +- .../src/main/resources/thingsboard.yml | 2 +- .../controller/BaseAssetControllerTest.java | 4 +- .../BaseDashboardControllerTest.java | 4 +- .../controller/BaseDeviceControllerTest.java | 8 +- .../BaseEntityViewControllerTest.java | 4 +- ...tractMqttServerSideRpcIntegrationTest.java | 6 +- ...AbstractRuleEngineFlowIntegrationTest.java | 1 - ...actRuleEngineLifecycleIntegrationTest.java | 1 - .../routing/HashPartitionServiceTest.java | 4 +- .../script/RuleNodeJsScriptEngineTest.java | 6 +- common/dao-api/pom.xml | 13 +- .../cassandra/AbstractCassandraCluster.java | 157 +++--------- .../dao/cassandra/CassandraDriverOptions.java | 232 +++++++++++++++++ .../dao/cassandra/CassandraQueryOptions.java | 73 ------ .../dao/cassandra/CassandraSocketOptions.java | 76 ------ .../cassandra/guava/DefaultGuavaSession.java | 13 +- .../cassandra/guava/GuavaDriverContext.java | 84 ++++++ .../guava/GuavaRequestAsyncProcessor.java | 79 ++++++ .../dao/cassandra/guava/GuavaSession.java | 51 ++++ .../cassandra/guava/GuavaSessionBuilder.java | 59 +++++ .../cassandra/guava/GuavaSessionUtils.java | 13 +- .../dao/nosql/CassandraStatementTask.java | 6 +- .../server/dao/nosql/TbResultSetFuture.java | 24 +- common/data/pom.xml | 4 +- .../server/common/data/UUIDConverterTest.java | 6 +- dao/pom.xml | 28 +- .../org/thingsboard/server/dao/DaoUtil.java | 6 +- .../server/dao/audit/AuditLogServiceImpl.java | 4 +- .../server/dao/model/EntitySubtypeEntity.java | 121 --------- .../server/dao/model/ModelConstants.java | 4 +- .../dao/model/sql/AbstractAlarmEntity.java | 4 +- .../dao/model/sql/AbstractAssetEntity.java | 4 +- .../dao/model/sql/AbstractDeviceEntity.java | 4 +- .../model/sql/AbstractEntityViewEntity.java | 4 +- .../dao/model/sql/AdminSettingsEntity.java | 6 +- .../server/dao/model/sql/AuditLogEntity.java | 4 +- .../server/dao/model/sql/CustomerEntity.java | 6 +- .../server/dao/model/sql/DashboardEntity.java | 6 +- .../dao/model/sql/DashboardInfoEntity.java | 6 +- .../model/sql/DeviceCredentialsEntity.java | 6 +- .../server/dao/model/sql/EventEntity.java | 4 +- .../server/dao/model/sql/RuleChainEntity.java | 4 +- .../server/dao/model/sql/RuleNodeEntity.java | 4 +- .../server/dao/model/sql/TenantEntity.java | 6 +- .../dao/model/sql/UserCredentialsEntity.java | 6 +- .../server/dao/model/sql/UserEntity.java | 4 +- .../dao/model/sql/WidgetTypeEntity.java | 4 +- .../dao/model/sql/WidgetsBundleEntity.java | 4 +- .../type/ComponentLifecycleStateCodec.java | 27 -- .../dao/model/wrapper/EntityResultSet.java | 38 --- .../dao/nosql/CassandraAbstractAsyncDao.java | 34 ++- .../dao/nosql/CassandraAbstractDao.java | 43 ++-- .../nosql/CassandraBufferedRateExecutor.java | 12 +- .../dao/nosql/RateLimitedResultSetFuture.java | 156 ------------ .../server/dao/nosql/ResultSetUtils.java | 65 +++++ .../server/dao/sql/JpaAbstractDao.java | 4 +- .../dao/sql/JpaAbstractSearchTimeDao.java | 6 +- .../JpaBaseComponentDescriptorDao.java | 4 +- .../server/dao/sql/event/JpaBaseEventDao.java | 8 +- .../AggregatePartitionsFunction.java | 55 ++-- .../CassandraBaseTimeseriesDao.java | 239 +++++++++++------- .../util/AbstractBufferedRateExecutor.java | 23 +- .../server/dao/CustomCassandraCQLUnit.java | 20 +- .../nosql/RateLimitedResultSetFutureTest.java | 195 -------------- .../dao/service/AbstractServiceTest.java | 4 +- .../dao/service/BaseAlarmServiceTest.java | 14 +- .../dao/service/BaseAssetServiceTest.java | 6 +- .../dao/service/BaseCustomerServiceTest.java | 4 +- .../dao/service/BaseDashboardServiceTest.java | 6 +- .../BaseDeviceCredentialsServiceTest.java | 6 +- .../dao/service/BaseDeviceServiceTest.java | 6 +- .../dao/service/BaseRelationServiceTest.java | 56 ++-- .../dao/service/BaseRuleChainServiceTest.java | 4 +- .../service/BaseWidgetTypeServiceTest.java | 4 +- .../service/BaseWidgetsBundleServiceTest.java | 4 +- .../attributes/BaseAttributesServiceTest.java | 8 +- .../service/event/BaseEventServiceTest.java | 22 +- .../timeseries/BaseTimeseriesServiceTest.java | 16 +- .../server/dao/sql/asset/JpaAssetDaoTest.java | 80 +++--- .../JpaBaseComponentDescriptorDaoTest.java | 4 +- .../dao/sql/customer/JpaCustomerDaoTest.java | 10 +- .../dashboard/JpaDashboardInfoDaoTest.java | 8 +- .../dao/sql/device/JpaDeviceDaoTest.java | 40 +-- .../dao/sql/event/JpaBaseEventDaoTest.java | 28 +- .../dao/sql/tenant/JpaTenantDaoTest.java | 4 +- .../server/dao/sql/user/JpaUserDaoTest.java | 12 +- .../sql/widget/JpaWidgetsBundleDaoTest.java | 16 +- pom.xml | 19 +- rule-engine/rule-engine-api/pom.xml | 14 +- .../rule/engine/api/TbContext.java | 4 +- rule-engine/rule-engine-components/pom.xml | 4 + .../rule/engine/action/TbMsgCountNode.java | 3 +- .../TbSaveToCustomCassandraTableNode.java | 60 ++--- .../rule/engine/rpc/TbSendRPCRequestNode.java | 4 +- .../rule/engine/action/TbAlarmNodeTest.java | 10 +- .../engine/filter/TbJsFilterNodeTest.java | 6 +- .../engine/filter/TbJsSwitchNodeTest.java | 6 +- .../engine/mail/TbMsgToEmailNodeTest.java | 10 +- .../TbGetCustomerAttributeNodeTest.java | 38 +-- .../transform/TbChangeOriginatorNodeTest.java | 26 +- .../transform/TbTransformMsgNodeTest.java | 10 +- tools/pom.xml | 4 +- 110 files changed, 1337 insertions(+), 1502 deletions(-) create mode 100644 common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraDriverOptions.java delete mode 100644 common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraQueryOptions.java delete mode 100644 common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraSocketOptions.java rename dao/src/main/java/org/thingsboard/server/dao/model/type/EntityTypeCodec.java => common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/DefaultGuavaSession.java (65%) create mode 100644 common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaDriverContext.java create mode 100644 common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaRequestAsyncProcessor.java create mode 100644 common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSession.java create mode 100644 common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionBuilder.java rename dao/src/main/java/org/thingsboard/server/dao/model/type/JsonCodec.java => common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionUtils.java (69%) rename {dao => common/dao-api}/src/main/java/org/thingsboard/server/dao/nosql/TbResultSetFuture.java (71%) delete mode 100644 dao/src/main/java/org/thingsboard/server/dao/model/EntitySubtypeEntity.java delete mode 100644 dao/src/main/java/org/thingsboard/server/dao/model/type/ComponentLifecycleStateCodec.java delete mode 100644 dao/src/main/java/org/thingsboard/server/dao/model/wrapper/EntityResultSet.java delete mode 100644 dao/src/main/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFuture.java create mode 100644 dao/src/main/java/org/thingsboard/server/dao/nosql/ResultSetUtils.java delete mode 100644 dao/src/test/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFutureTest.java diff --git a/application/pom.xml b/application/pom.xml index 91dec1847e..269e1d9dac 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -111,6 +111,10 @@ org.slf4j slf4j-log4j12 + + org.hibernate + hibernate-validator + test @@ -241,6 +245,12 @@ org.springframework.boot spring-boot-starter-test test + + + com.vaadin.external.google + android-json + + org.springframework.security diff --git a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java index 6a3994a36f..7c89eef1c5 100644 --- a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java @@ -16,7 +16,6 @@ package org.thingsboard.server.actors.ruleChain; import akka.actor.ActorRef; -import com.datastax.driver.core.ResultSetFuture; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.channel.EventLoopGroup; @@ -53,6 +52,7 @@ import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.entityview.EntityViewService; import org.thingsboard.server.dao.nosql.CassandraStatementTask; +import org.thingsboard.server.dao.nosql.TbResultSetFuture; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.tenant.TenantService; @@ -405,7 +405,7 @@ class DefaultTbContext implements TbContext { } @Override - public ResultSetFuture submitCassandraTask(CassandraStatementTask task) { + public TbResultSetFuture submitCassandraTask(CassandraStatementTask task) { return mainCtx.getCassandraBufferedRateExecutor().submit(task); } diff --git a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java index eb04c3ee73..20d0c08e50 100644 --- a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java +++ b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.controller; -import com.datastax.driver.core.utils.UUIDs; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/application/src/main/java/org/thingsboard/server/service/install/CassandraTsDatabaseUpgradeService.java b/application/src/main/java/org/thingsboard/server/service/install/CassandraTsDatabaseUpgradeService.java index 4bc68e92bc..96bf414240 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/CassandraTsDatabaseUpgradeService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/CassandraTsDatabaseUpgradeService.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.service.install; -import com.datastax.driver.core.exceptions.InvalidQueryException; +import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; diff --git a/application/src/main/java/org/thingsboard/server/service/install/cql/CassandraDbHelper.java b/application/src/main/java/org/thingsboard/server/service/install/cql/CassandraDbHelper.java index fb75a12dac..7e0ee6c539 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/cql/CassandraDbHelper.java +++ b/application/src/main/java/org/thingsboard/server/service/install/cql/CassandraDbHelper.java @@ -15,25 +15,27 @@ */ package org.thingsboard.server.service.install.cql; -import com.datastax.driver.core.BoundStatement; -import com.datastax.driver.core.DataType; -import com.datastax.driver.core.KeyspaceMetadata; -import com.datastax.driver.core.PreparedStatement; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.Row; -import com.datastax.driver.core.Session; -import com.datastax.driver.core.SimpleStatement; -import com.datastax.driver.core.Statement; -import com.datastax.driver.core.TableMetadata; +import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.Row; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.core.cql.Statement; +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; +import com.datastax.oss.driver.api.core.type.DataType; +import com.datastax.oss.protocol.internal.ProtocolConstants; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.CSVRecord; +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.time.Instant; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; @@ -44,12 +46,12 @@ import static org.thingsboard.server.service.install.DatabaseHelper.CSV_DUMP_FOR public class CassandraDbHelper { - public static Path dumpCfIfExists(KeyspaceMetadata ks, Session session, String cfName, + public static Path dumpCfIfExists(KeyspaceMetadata ks, GuavaSession session, String cfName, String[] columns, String[] defaultValues, String dumpPrefix) throws Exception { return dumpCfIfExists(ks, session, cfName, columns, defaultValues, dumpPrefix, false); } - public static Path dumpCfIfExists(KeyspaceMetadata ks, Session session, String cfName, + public static Path dumpCfIfExists(KeyspaceMetadata ks, GuavaSession session, String cfName, String[] columns, String[] defaultValues, String dumpPrefix, boolean printHeader) throws Exception { if (ks.getTable(cfName) != null) { Path dumpFile = Files.createTempFile(dumpPrefix, null); @@ -59,8 +61,8 @@ public class CassandraDbHelper { csvFormat = csvFormat.withHeader(columns); } try (CSVPrinter csvPrinter = new CSVPrinter(Files.newBufferedWriter(dumpFile), csvFormat)) { - Statement stmt = new SimpleStatement("SELECT * FROM " + cfName); - stmt.setFetchSize(1000); + Statement stmt = SimpleStatement.newInstance("SELECT * FROM " + cfName); + stmt.setPageSize(1000); ResultSet rs = session.execute(stmt); Iterator iter = rs.iterator(); while (iter.hasNext()) { @@ -95,12 +97,12 @@ public class CassandraDbHelper { Files.move(tmp, targetDumpFile, StandardCopyOption.REPLACE_EXISTING); } - public static void loadCf(KeyspaceMetadata ks, Session session, String cfName, String[] columns, Path sourceFile) throws Exception { + public static void loadCf(KeyspaceMetadata ks, GuavaSession session, String cfName, String[] columns, Path sourceFile) throws Exception { loadCf(ks, session, cfName, columns, sourceFile, false); } - public static void loadCf(KeyspaceMetadata ks, Session session, String cfName, String[] columns, Path sourceFile, boolean parseHeader) throws Exception { - TableMetadata tableMetadata = ks.getTable(cfName); + public static void loadCf(KeyspaceMetadata ks, GuavaSession session, String cfName, String[] columns, Path sourceFile, boolean parseHeader) throws Exception { + TableMetadata tableMetadata = ks.getTable(cfName).get(); PreparedStatement prepared = session.prepare(createInsertStatement(cfName, columns)); CSVFormat csvFormat = CSV_DUMP_FORMAT; if (parseHeader) { @@ -110,11 +112,11 @@ public class CassandraDbHelper { } try (CSVParser csvParser = new CSVParser(Files.newBufferedReader(sourceFile), csvFormat)) { csvParser.forEach(record -> { - BoundStatement boundStatement = prepared.bind(); + BoundStatementBuilder boundStatementBuilder = new BoundStatementBuilder(prepared.bind()); for (String column : columns) { - setColumnValue(tableMetadata, column, record, boundStatement); + setColumnValue(tableMetadata, column, record, boundStatementBuilder); } - session.execute(boundStatement); + session.execute(boundStatementBuilder.build()); }); } } @@ -136,27 +138,27 @@ public class CassandraDbHelper { } private static String getColumnValue(String column, String defaultValue, Row row) { - int index = row.getColumnDefinitions().getIndexOf(column); + int index = row.getColumnDefinitions().firstIndexOf(column); if (index > -1) { String str; - DataType type = row.getColumnDefinitions().getType(index); + DataType type = row.getColumnDefinitions().get(index).getType(); try { if (row.isNull(index)) { return null; - } else if (type == DataType.cdouble()) { + } else if (type.getProtocolCode() == ProtocolConstants.DataType.DOUBLE) { str = new Double(row.getDouble(index)).toString(); - } else if (type == DataType.cint()) { + } else if (type.getProtocolCode() == ProtocolConstants.DataType.INT) { str = new Integer(row.getInt(index)).toString(); - } else if (type == DataType.bigint()) { + } else if (type.getProtocolCode() == ProtocolConstants.DataType.BIGINT) { str = new Long(row.getLong(index)).toString(); - } else if (type == DataType.uuid()) { - str = row.getUUID(index).toString(); - } else if (type == DataType.timeuuid()) { - str = row.getUUID(index).toString(); - } else if (type == DataType.cfloat()) { + } else if (type.getProtocolCode() == ProtocolConstants.DataType.UUID) { + str = row.getUuid(index).toString(); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.TIMEUUID) { + str = row.getUuid(index).toString(); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.FLOAT) { str = new Float(row.getFloat(index)).toString(); - } else if (type == DataType.timestamp()) { - str = ""+row.getTimestamp(index).getTime(); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.TIMESTAMP) { + str = ""+row.getInstant(index).toEpochMilli(); } else { str = row.getString(index); } @@ -186,27 +188,27 @@ public class CassandraDbHelper { } private static void setColumnValue(TableMetadata tableMetadata, String column, - CSVRecord record, BoundStatement boundStatement) { + CSVRecord record, BoundStatementBuilder boundStatementBuilder) { String value = record.get(column); - DataType type = tableMetadata.getColumn(column).getType(); + DataType type = tableMetadata.getColumn(column).get().getType(); if (value == null) { - boundStatement.setToNull(column); - } else if (type == DataType.cdouble()) { - boundStatement.setDouble(column, Double.valueOf(value)); - } else if (type == DataType.cint()) { - boundStatement.setInt(column, Integer.valueOf(value)); - } else if (type == DataType.bigint()) { - boundStatement.setLong(column, Long.valueOf(value)); - } else if (type == DataType.uuid()) { - boundStatement.setUUID(column, UUID.fromString(value)); - } else if (type == DataType.timeuuid()) { - boundStatement.setUUID(column, UUID.fromString(value)); - } else if (type == DataType.cfloat()) { - boundStatement.setFloat(column, Float.valueOf(value)); - } else if (type == DataType.timestamp()) { - boundStatement.setTimestamp(column, new Date(Long.valueOf(value))); + boundStatementBuilder.setToNull(column); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.DOUBLE) { + boundStatementBuilder.setDouble(column, Double.valueOf(value)); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.INT) { + boundStatementBuilder.setInt(column, Integer.valueOf(value)); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.BIGINT) { + boundStatementBuilder.setLong(column, Long.valueOf(value)); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.UUID) { + boundStatementBuilder.setUuid(column, UUID.fromString(value)); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.TIMEUUID) { + boundStatementBuilder.setUuid(column, UUID.fromString(value)); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.FLOAT) { + boundStatementBuilder.setFloat(column, Float.valueOf(value)); + } else if (type.getProtocolCode() == ProtocolConstants.DataType.TIMESTAMP) { + boundStatementBuilder.setInstant(column, Instant.ofEpochMilli(Long.valueOf(value))); } else { - boundStatement.setString(column, value); + boundStatementBuilder.setString(column, value); } } diff --git a/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlColumn.java b/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlColumn.java index 6bbb076fad..e58243b12b 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlColumn.java +++ b/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlColumn.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.service.install.migrate; -import com.datastax.driver.core.Row; +import com.datastax.oss.driver.api.core.cql.Row; import lombok.Data; import org.thingsboard.server.common.data.UUIDConverter; @@ -105,7 +105,7 @@ public class CassandraToSqlColumn { } else { switch (this.type) { case ID: - return UUIDConverter.fromTimeUUID(row.getUUID(index)); + return UUIDConverter.fromTimeUUID(row.getUuid(index)); case DOUBLE: return Double.toString(row.getDouble(index)); case INTEGER: @@ -115,7 +115,7 @@ public class CassandraToSqlColumn { case BIGINT: return Long.toString(row.getLong(index)); case BOOLEAN: - return Boolean.toString(row.getBool(index)); + return Boolean.toString(row.getBoolean(index)); case STRING: case JSON: case ENUM_TO_INT: diff --git a/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlEventTsColumn.java b/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlEventTsColumn.java index b488e812fe..1672dd7dcc 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlEventTsColumn.java +++ b/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlEventTsColumn.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.service.install.migrate; -import com.datastax.driver.core.Row; +import com.datastax.oss.driver.api.core.cql.Row; import java.util.UUID; @@ -29,7 +29,7 @@ public class CassandraToSqlEventTsColumn extends CassandraToSqlColumn { @Override public String getColumnValue(Row row) { - UUID id = row.getUUID(getIndex()); + UUID id = row.getUuid(getIndex()); long ts = getTs(id); return ts + ""; } @@ -37,4 +37,4 @@ public class CassandraToSqlEventTsColumn extends CassandraToSqlColumn { private long getTs(UUID uuid) { return (uuid.timestamp() - EPOCH_DIFF) / 10000; } -} \ No newline at end of file +} diff --git a/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlTable.java b/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlTable.java index 2f806f0832..dd67a6b055 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlTable.java +++ b/application/src/main/java/org/thingsboard/server/service/install/migrate/CassandraToSqlTable.java @@ -15,20 +15,17 @@ */ package org.thingsboard.server.service.install.migrate; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.Row; -import com.datastax.driver.core.Session; -import com.datastax.driver.core.SimpleStatement; -import com.datastax.driver.core.Statement; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.Row; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.core.cql.Statement; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import org.hibernate.exception.ConstraintViolationException; import org.hibernate.internal.util.JdbcExceptionHelper; import org.postgresql.util.PSQLException; import org.thingsboard.server.common.data.UUIDConverter; -import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; -import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; @@ -38,7 +35,6 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; @Data @Slf4j @@ -78,7 +74,7 @@ public class CassandraToSqlTable { } } - public void migrateToSql(Session session, Connection conn) throws SQLException { + public void migrateToSql(GuavaSession session, Connection conn) throws SQLException { log.info("[{}] Migrating data from cassandra '{}' Column Family to '{}' SQL table...", this.sqlTableName, this.cassandraCf, this.sqlTableName); DatabaseMetaData metadata = conn.getMetaData(); java.sql.ResultSet resultSet = metadata.getColumns(null, null, this.sqlTableName, null); @@ -92,7 +88,7 @@ public class CassandraToSqlTable { } this.sqlInsertStatement = createSqlInsertStatement(conn); Statement cassandraSelectStatement = createCassandraSelectStatement(); - cassandraSelectStatement.setFetchSize(100); + cassandraSelectStatement.setPageSize(100); ResultSet rs = session.execute(cassandraSelectStatement); Iterator iter = rs.iterator(); int rowCounter = 0; @@ -281,7 +277,7 @@ public class CassandraToSqlTable { } selectStatementBuilder.deleteCharAt(selectStatementBuilder.length() - 1); selectStatementBuilder.append(" FROM ").append(cassandraCf); - return new SimpleStatement(selectStatementBuilder.toString()); + return SimpleStatement.newInstance(selectStatementBuilder.toString()); } private PreparedStatement createSqlInsertStatement(Connection conn) throws SQLException { diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 7ce3be72d9..1a932160ad 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -178,7 +178,7 @@ cassandra: # Enable/disable JMX jmx: "${CASSANDRA_USE_JMX:true}" # Enable/disable metrics collection. - metrics: "${CASSANDRA_DISABLE_METRICS:true}" + metrics: "${CASSANDRA_USE_METRICS:true}" # NONE SNAPPY LZ4 compression: "${CASSANDRA_COMPRESSION:none}" # Specify cassandra cluster initialization timeout in milliseconds (if no hosts available during startup) diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseAssetControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseAssetControllerTest.java index c74c83dfe8..ecd9df5a90 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseAssetControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseAssetControllerTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.controller; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.core.type.TypeReference; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; @@ -206,7 +206,7 @@ public abstract class BaseAssetControllerTest extends AbstractControllerTest { asset.setType("default"); Asset savedAsset = doPost("/api/asset", asset, Asset.class); - doPost("/api/customer/" + UUIDs.timeBased().toString() + doPost("/api/customer/" + Uuids.timeBased().toString() + "/asset/" + savedAsset.getId().getId().toString()) .andExpect(status().isNotFound()); } diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseDashboardControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseDashboardControllerTest.java index 5b300df0bc..daee84dad0 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseDashboardControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseDashboardControllerTest.java @@ -24,7 +24,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.apache.commons.lang3.RandomStringUtils; import org.thingsboard.server.common.data.*; import org.thingsboard.server.common.data.id.CustomerId; @@ -158,7 +158,7 @@ public abstract class BaseDashboardControllerTest extends AbstractControllerTest dashboard.setTitle("My dashboard"); Dashboard savedDashboard = doPost("/api/dashboard", dashboard, Dashboard.class); - doPost("/api/customer/" + UUIDs.timeBased().toString() + doPost("/api/customer/" + Uuids.timeBased().toString() + "/dashboard/" + savedDashboard.getId().getId().toString()) .andExpect(status().isNotFound()); } diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseDeviceControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseDeviceControllerTest.java index e8941b9530..f971522458 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseDeviceControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseDeviceControllerTest.java @@ -23,7 +23,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.apache.commons.lang3.RandomStringUtils; import org.thingsboard.server.common.data.*; import org.thingsboard.server.common.data.id.CustomerId; @@ -215,7 +215,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest { device.setType("default"); Device savedDevice = doPost("/api/device", device, Device.class); - doPost("/api/customer/" + UUIDs.timeBased().toString() + doPost("/api/customer/" + Uuids.timeBased().toString() + "/device/" + savedDevice.getId().getId().toString()) .andExpect(status().isNotFound()); } @@ -333,7 +333,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest { Device savedDevice = doPost("/api/device", device, Device.class); DeviceCredentials deviceCredentials = doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class); - DeviceCredentials newDeviceCredentials = new DeviceCredentials(new DeviceCredentialsId(UUIDs.timeBased())); + DeviceCredentials newDeviceCredentials = new DeviceCredentials(new DeviceCredentialsId(Uuids.timeBased())); newDeviceCredentials.setCreatedTime(deviceCredentials.getCreatedTime()); newDeviceCredentials.setDeviceId(deviceCredentials.getDeviceId()); newDeviceCredentials.setCredentialsType(deviceCredentials.getCredentialsType()); @@ -351,7 +351,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest { Device savedDevice = doPost("/api/device", device, Device.class); DeviceCredentials deviceCredentials = doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class); - deviceCredentials.setDeviceId(new DeviceId(UUIDs.timeBased())); + deviceCredentials.setDeviceId(new DeviceId(Uuids.timeBased())); doPost("/api/device/credentials", deviceCredentials) .andExpect(status().isNotFound()); } diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java index 34c39bdccb..a24437fa46 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.controller; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.core.type.TypeReference; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; @@ -176,7 +176,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes @Test public void testAssignEntityViewToNonExistentCustomer() throws Exception { EntityView savedView = getNewSavedEntityView("Test entity view"); - doPost("/api/customer/" + UUIDs.timeBased().toString() + "/device/" + savedView.getId().getId().toString()) + doPost("/api/customer/" + Uuids.timeBased().toString() + "/device/" + savedView.getId().getId().toString()) .andExpect(status().isNotFound()); } diff --git a/application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java b/application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java index 9ddb2c81d9..d27b603aea 100644 --- a/application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.mqtt.rpc; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import io.netty.handler.codec.mqtt.MqttQoS; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -143,7 +143,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractC @Test public void testServerMqttOneWayRpcDeviceDoesNotExist() throws Exception { String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"25\",\"value\": 1}}"; - String nonExistentDeviceId = UUIDs.timeBased().toString(); + String nonExistentDeviceId = Uuids.timeBased().toString(); String result = doPostAsync("/api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class, status().isNotFound()); @@ -200,7 +200,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractC @Test public void testServerMqttTwoWayRpcDeviceDoesNotExist() throws Exception { String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"28\",\"value\": 1}}"; - String nonExistentDeviceId = UUIDs.timeBased().toString(); + String nonExistentDeviceId = Uuids.timeBased().toString(); String result = doPostAsync("/api/plugins/rpc/twoway/" + nonExistentDeviceId, setGpioRequest, String.class, status().isNotFound()); diff --git a/application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java b/application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java index a7ca4abce5..b23f90a8d6 100644 --- a/application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java @@ -16,7 +16,6 @@ package org.thingsboard.server.rules.flow; import akka.actor.ActorRef; -import com.datastax.driver.core.utils.UUIDs; import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Assert; diff --git a/application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java b/application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java index 088f9390ff..85219c3eef 100644 --- a/application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java @@ -16,7 +16,6 @@ package org.thingsboard.server.rules.lifecycle; import akka.actor.ActorRef; -import com.datastax.driver.core.utils.UUIDs; import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Assert; diff --git a/application/src/test/java/org/thingsboard/server/service/cluster/routing/HashPartitionServiceTest.java b/application/src/test/java/org/thingsboard/server/service/cluster/routing/HashPartitionServiceTest.java index dcf98c1443..977c41b23c 100644 --- a/application/src/test/java/org/thingsboard/server/service/cluster/routing/HashPartitionServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cluster/routing/HashPartitionServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.service.cluster.routing; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.Before; @@ -101,7 +101,7 @@ public class HashPartitionServiceTest { public void testDispersionOnMillionDevices() { List devices = new ArrayList<>(); for (int i = 0; i < ITERATIONS; i++) { - devices.add(new DeviceId(UUIDs.timeBased())); + devices.add(new DeviceId(Uuids.timeBased())); } testDevicesDispersion(devices); } diff --git a/application/src/test/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngineTest.java b/application/src/test/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngineTest.java index 62881bd5af..60495b119d 100644 --- a/application/src/test/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngineTest.java +++ b/application/src/test/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngineTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.service.script; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.google.common.collect.Sets; import org.junit.After; import org.junit.Before; @@ -41,7 +41,7 @@ public class RuleNodeJsScriptEngineTest { private ScriptEngine scriptEngine; private TestNashornJsInvokeService jsSandboxService; - private EntityId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + private EntityId ruleNodeId = new RuleNodeId(Uuids.timeBased()); @Before public void beforeTest() throws Exception { @@ -247,4 +247,4 @@ public class RuleNodeJsScriptEngineTest { } } -} \ No newline at end of file +} diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml index 34ad807554..413cceddb4 100644 --- a/common/dao-api/pom.xml +++ b/common/dao-api/pom.xml @@ -78,18 +78,13 @@ provided - com.datastax.cassandra - cassandra-driver-core + com.datastax.oss + java-driver-core provided - com.datastax.cassandra - cassandra-driver-mapping - provided - - - com.datastax.cassandra - cassandra-driver-extras + io.dropwizard.metrics + metrics-jmx provided diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/AbstractCassandraCluster.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/AbstractCassandraCluster.java index 90bd5a292f..b598d5e9b7 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/AbstractCassandraCluster.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/AbstractCassandraCluster.java @@ -16,117 +16,50 @@ 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.ProtocolOptions.Compression; -import com.datastax.driver.core.Session; -import com.datastax.driver.mapping.DefaultPropertyMapper; -import com.datastax.driver.mapping.Mapper; -import com.datastax.driver.mapping.MappingConfiguration; -import com.datastax.driver.mapping.MappingManager; -import com.datastax.driver.mapping.PropertyAccessStrategy; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.jmx.JmxReporter; +import com.datastax.oss.driver.api.core.ConsistencyLevel; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; +import org.thingsboard.server.dao.cassandra.guava.GuavaSessionBuilder; +import org.thingsboard.server.dao.cassandra.guava.GuavaSessionUtils; import javax.annotation.PreDestroy; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; @Slf4j public abstract class AbstractCassandraCluster { - private static final String COMMA = ","; - private static final String COLON = ":"; - - @Value("${cassandra.cluster_name}") - private String clusterName; - @Value("${cassandra.url}") - private String url; - @Value("${cassandra.compression}") - private String compression; - @Value("${cassandra.ssl}") - private Boolean ssl; @Value("${cassandra.jmx}") private Boolean jmx; @Value("${cassandra.metrics}") private Boolean metrics; - @Value("${cassandra.credentials}") - private Boolean credentials; - @Value("${cassandra.username}") - private String username; - @Value("${cassandra.password}") - private String password; - @Value("${cassandra.init_timeout_ms}") - private long initTimeout; - @Value("${cassandra.init_retry_interval_ms}") - private long initRetryInterval; - @Value("${cassandra.max_requests_per_connection_local:32768}") - private int max_requests_local; - @Value("${cassandra.max_requests_per_connection_remote:32768}") - private int max_requests_remote; @Autowired - private CassandraSocketOptions socketOpts; - - @Autowired - private CassandraQueryOptions queryOpts; + private CassandraDriverOptions driverOptions; @Autowired private Environment environment; - private Cluster cluster; - private Cluster.Builder clusterBuilder; + private GuavaSessionBuilder sessionBuilder; - private Session session; + private GuavaSession session; - private MappingManager mappingManager; - - public Mapper getMapper(Class clazz) { - return mappingManager.mapper(clazz); - } + private JmxReporter reporter; private String keyspaceName; protected void init(String keyspaceName) { this.keyspaceName = keyspaceName; - this.clusterBuilder = Cluster.builder() - .addContactPointsWithPorts(getContactPoints(url)) - .withClusterName(clusterName) - .withSocketOptions(socketOpts.getOpts()) - .withPoolingOptions(new PoolingOptions() - .setMaxRequestsPerConnection(HostDistance.LOCAL, max_requests_local) - .setMaxRequestsPerConnection(HostDistance.REMOTE, max_requests_remote)); - this.clusterBuilder.withQueryOptions(queryOpts.getOpts()); - this.clusterBuilder.withCompression(StringUtils.isEmpty(compression) ? Compression.NONE : Compression.valueOf(compression.toUpperCase())); - if (ssl) { - this.clusterBuilder.withSSL(); - } - if (!jmx) { - this.clusterBuilder.withoutJMXReporting(); - } - if (!metrics) { - this.clusterBuilder.withoutMetrics(); - } - if (credentials) { - this.clusterBuilder.withCredentials(username, password); - } + this.sessionBuilder = GuavaSessionUtils.builder().withConfigLoader(this.driverOptions.getLoader()); if (!isInstall()) { initSession(); } } - public Cluster getCluster() { - return cluster; - } - - public Session getSession() { + public GuavaSession getSession() { if (!isInstall()) { return session; } else { @@ -146,64 +79,40 @@ public abstract class AbstractCassandraCluster { } private void initSession() { - long endTime = System.currentTimeMillis() + initTimeout; - while (System.currentTimeMillis() < endTime) { - try { - cluster = clusterBuilder.build(); - cluster.init(); - if (this.keyspaceName != null) { - session = cluster.connect(keyspaceName); - } else { - session = cluster.connect(); - } -// For Cassandra Driver version 3.5.0 - DefaultPropertyMapper propertyMapper = new DefaultPropertyMapper(); - propertyMapper.setPropertyAccessStrategy(PropertyAccessStrategy.FIELDS); - MappingConfiguration configuration = MappingConfiguration.builder().withPropertyMapper(propertyMapper).build(); - mappingManager = new MappingManager(session, configuration); -// For Cassandra Driver version 3.0.0 -// mappingManager = new MappingManager(session); - break; - } catch (Exception e) { - log.warn("Failed to initialize cassandra cluster due to {}. Will retry in {} ms", e.getMessage(), initRetryInterval); - try { - Thread.sleep(initRetryInterval); - } catch (InterruptedException ie) { - log.warn("Failed to wait until retry", ie); - Thread.currentThread().interrupt(); - } - } + if (this.keyspaceName != null) { + this.sessionBuilder.withKeyspace(this.keyspaceName); + } + this.sessionBuilder.withLocalDatacenter("datacenter1"); + session = sessionBuilder.build(); + if (this.metrics && this.jmx) { + MetricRegistry registry = + session.getMetrics().orElseThrow( + () -> new IllegalStateException("Metrics are disabled")) + .getRegistry(); + this.reporter = + JmxReporter.forRegistry(registry) + .inDomain("com.datastax.oss.driver") + .build(); + this.reporter.start(); } } @PreDestroy public void close() { - if (cluster != null) { - cluster.close(); + if (reporter != null) { + reporter.stop(); } - } - - private List getContactPoints(String url) { - List result; - if (StringUtils.isBlank(url)) { - result = Collections.emptyList(); - } else { - result = new ArrayList<>(); - for (String hostPort : url.split(COMMA)) { - String host = hostPort.split(COLON)[0]; - Integer port = Integer.valueOf(hostPort.split(COLON)[1]); - result.add(new InetSocketAddress(host, port)); - } + if (session != null) { + session.close(); } - return result; } public ConsistencyLevel getDefaultReadConsistencyLevel() { - return queryOpts.getDefaultReadConsistencyLevel(); + return driverOptions.getDefaultReadConsistencyLevel(); } public ConsistencyLevel getDefaultWriteConsistencyLevel() { - return queryOpts.getDefaultWriteConsistencyLevel(); + return driverOptions.getDefaultWriteConsistencyLevel(); } } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraDriverOptions.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraDriverOptions.java new file mode 100644 index 0000000000..21b20f7427 --- /dev/null +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraDriverOptions.java @@ -0,0 +1,232 @@ +/** + * Copyright © 2016-2020 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.cassandra; + +import com.datastax.oss.driver.api.core.ConsistencyLevel; +import com.datastax.oss.driver.api.core.DefaultConsistencyLevel; +import com.datastax.oss.driver.api.core.config.DefaultDriverOption; +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; +import com.datastax.oss.driver.api.core.config.ProgrammaticDriverConfigLoaderBuilder; +import com.datastax.oss.driver.api.core.metrics.DefaultSessionMetric; +import com.datastax.oss.driver.api.core.metrics.DefaultNodeMetric; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import org.thingsboard.server.dao.util.NoSqlAnyDao; + +import javax.annotation.PostConstruct; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +@Component +@Configuration +@Data +@NoSqlAnyDao +public class CassandraDriverOptions { + + private static final String COMMA = ","; + + @Value("${cassandra.cluster_name}") + private String clusterName; + @Value("${cassandra.url}") + private String url; + + @Value("${cassandra.socket.connect_timeout}") + private int connectTimeoutMillis; + @Value("${cassandra.socket.read_timeout}") + private int readTimeoutMillis; + @Value("${cassandra.socket.keep_alive}") + private Boolean keepAlive; + @Value("${cassandra.socket.reuse_address}") + private Boolean reuseAddress; + @Value("${cassandra.socket.so_linger}") + private Integer soLinger; + @Value("${cassandra.socket.tcp_no_delay}") + private Boolean tcpNoDelay; + @Value("${cassandra.socket.receive_buffer_size}") + private Integer receiveBufferSize; + @Value("${cassandra.socket.send_buffer_size}") + private Integer sendBufferSize; + + @Value("${cassandra.max_requests_per_connection_local:32768}") + private int max_requests_local; + @Value("${cassandra.max_requests_per_connection_remote:32768}") + private int max_requests_remote; + + @Value("${cassandra.query.default_fetch_size}") + private Integer defaultFetchSize; + @Value("${cassandra.query.read_consistency_level}") + private String readConsistencyLevel; + @Value("${cassandra.query.write_consistency_level}") + private String writeConsistencyLevel; + + @Value("${cassandra.compression}") + private String compression; + @Value("${cassandra.ssl}") + private Boolean ssl; + @Value("${cassandra.metrics}") + private Boolean metrics; + + @Value("${cassandra.credentials}") + private Boolean credentials; + @Value("${cassandra.username}") + private String username; + @Value("${cassandra.password}") + private String password; + + @Value("${cassandra.init_timeout_ms}") + private long initTimeout; + @Value("${cassandra.init_retry_interval_ms}") + private long initRetryInterval; + + private DriverConfigLoader loader; + + private ConsistencyLevel defaultReadConsistencyLevel; + private ConsistencyLevel defaultWriteConsistencyLevel; + + @PostConstruct + public void initLoader() { + ProgrammaticDriverConfigLoaderBuilder driverConfigBuilder = + DriverConfigLoader.programmaticBuilder(); + + driverConfigBuilder + .withStringList(DefaultDriverOption.CONTACT_POINTS, getContactPoints(url)) + .withString(DefaultDriverOption.SESSION_NAME, clusterName); + + this.initSocketOptions(driverConfigBuilder); + this.initPoolingOptions(driverConfigBuilder); + this.initQueryOptions(driverConfigBuilder); + + driverConfigBuilder.withString(DefaultDriverOption.PROTOCOL_COMPRESSION, + StringUtils.isEmpty(this.compression) ? "none" : this.compression.toLowerCase()); + + if (this.ssl) { + driverConfigBuilder.withString(DefaultDriverOption.SSL_ENGINE_FACTORY_CLASS, + "DefaultSslEngineFactory"); + } + + if (this.metrics) { + driverConfigBuilder.withStringList(DefaultDriverOption.METRICS_SESSION_ENABLED, + Arrays.asList(DefaultSessionMetric.CONNECTED_NODES.getPath(), + DefaultSessionMetric.CQL_REQUESTS.getPath())); + driverConfigBuilder.withStringList(DefaultDriverOption.METRICS_NODE_ENABLED, + Arrays.asList(DefaultNodeMetric.OPEN_CONNECTIONS.getPath(), + DefaultNodeMetric.IN_FLIGHT.getPath())); + } + + if (this.credentials) { + driverConfigBuilder.withString(DefaultDriverOption.AUTH_PROVIDER_CLASS, + "PlainTextAuthProvider"); + driverConfigBuilder.withString(DefaultDriverOption.AUTH_PROVIDER_USER_NAME, + this.username); + driverConfigBuilder.withString(DefaultDriverOption.AUTH_PROVIDER_PASSWORD, + this.password); + } + + driverConfigBuilder.withBoolean(DefaultDriverOption.RECONNECT_ON_INIT, + true); + driverConfigBuilder.withString(DefaultDriverOption.RECONNECTION_POLICY_CLASS, + "ExponentialReconnectionPolicy"); + driverConfigBuilder.withDuration(DefaultDriverOption.RECONNECTION_BASE_DELAY, + Duration.ofMillis(this.initRetryInterval)); + driverConfigBuilder.withDuration(DefaultDriverOption.RECONNECTION_MAX_DELAY, + Duration.ofMillis(this.initTimeout)); + + this.loader = driverConfigBuilder.build(); + } + + protected ConsistencyLevel getDefaultReadConsistencyLevel() { + if (defaultReadConsistencyLevel == null) { + if (readConsistencyLevel != null) { + defaultReadConsistencyLevel = DefaultConsistencyLevel.valueOf(readConsistencyLevel.toUpperCase()); + } else { + defaultReadConsistencyLevel = DefaultConsistencyLevel.ONE; + } + } + return defaultReadConsistencyLevel; + } + + protected ConsistencyLevel getDefaultWriteConsistencyLevel() { + if (defaultWriteConsistencyLevel == null) { + if (writeConsistencyLevel != null) { + defaultWriteConsistencyLevel = DefaultConsistencyLevel.valueOf(writeConsistencyLevel.toUpperCase()); + } else { + defaultWriteConsistencyLevel = DefaultConsistencyLevel.ONE; + } + } + return defaultWriteConsistencyLevel; + } + + private void initSocketOptions(ProgrammaticDriverConfigLoaderBuilder driverConfigBuilder) { + driverConfigBuilder.withDuration(DefaultDriverOption.CONNECTION_CONNECT_TIMEOUT, + Duration.ofMillis(this.connectTimeoutMillis)); + driverConfigBuilder.withDuration(DefaultDriverOption.REQUEST_TIMEOUT, + Duration.ofMillis(this.readTimeoutMillis)); + if (this.keepAlive != null) { + driverConfigBuilder.withBoolean(DefaultDriverOption.SOCKET_KEEP_ALIVE, + this.keepAlive); + } + if (this.reuseAddress != null) { + driverConfigBuilder.withBoolean(DefaultDriverOption.SOCKET_REUSE_ADDRESS, + this.reuseAddress); + } + if (this.soLinger != null) { + driverConfigBuilder.withInt(DefaultDriverOption.SOCKET_LINGER_INTERVAL, + this.soLinger); + } + if (this.tcpNoDelay != null) { + driverConfigBuilder.withBoolean(DefaultDriverOption.SOCKET_TCP_NODELAY, + this.tcpNoDelay); + } + if (this.receiveBufferSize != null) { + driverConfigBuilder.withInt(DefaultDriverOption.SOCKET_RECEIVE_BUFFER_SIZE, + this.receiveBufferSize); + } + if (this.sendBufferSize != null) { + driverConfigBuilder.withInt(DefaultDriverOption.SOCKET_SEND_BUFFER_SIZE, + this.sendBufferSize); + } + } + + private void initPoolingOptions(ProgrammaticDriverConfigLoaderBuilder driverConfigBuilder) { + driverConfigBuilder.withInt(DefaultDriverOption.CONNECTION_MAX_REQUESTS, + this.max_requests_local); + } + + private void initQueryOptions(ProgrammaticDriverConfigLoaderBuilder driverConfigBuilder) { + driverConfigBuilder.withInt(DefaultDriverOption.REQUEST_PAGE_SIZE, + this.defaultFetchSize); + } + + private List getContactPoints(String url) { + List result; + if (StringUtils.isBlank(url)) { + result = Collections.emptyList(); + } else { + result = new ArrayList<>(); + for (String hostPort : url.split(COMMA)) { + result.add(hostPort); + } + } + return result; + } + +} diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraQueryOptions.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraQueryOptions.java deleted file mode 100644 index 41191629ca..0000000000 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraQueryOptions.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright © 2016-2020 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.cassandra; - -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.QueryOptions; -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.stereotype.Component; -import org.thingsboard.server.dao.util.NoSqlAnyDao; - -import javax.annotation.PostConstruct; - -@Component -@Configuration -@Data -@NoSqlAnyDao -public class CassandraQueryOptions { - - @Value("${cassandra.query.default_fetch_size}") - private Integer defaultFetchSize; - @Value("${cassandra.query.read_consistency_level}") - private String readConsistencyLevel; - @Value("${cassandra.query.write_consistency_level}") - private String writeConsistencyLevel; - - private QueryOptions opts; - - private ConsistencyLevel defaultReadConsistencyLevel; - private ConsistencyLevel defaultWriteConsistencyLevel; - - @PostConstruct - public void initOpts(){ - opts = new QueryOptions(); - opts.setFetchSize(defaultFetchSize); - } - - protected ConsistencyLevel getDefaultReadConsistencyLevel() { - if (defaultReadConsistencyLevel == null) { - if (readConsistencyLevel != null) { - defaultReadConsistencyLevel = ConsistencyLevel.valueOf(readConsistencyLevel.toUpperCase()); - } else { - defaultReadConsistencyLevel = ConsistencyLevel.ONE; - } - } - return defaultReadConsistencyLevel; - } - - protected ConsistencyLevel getDefaultWriteConsistencyLevel() { - if (defaultWriteConsistencyLevel == null) { - if (writeConsistencyLevel != null) { - defaultWriteConsistencyLevel = ConsistencyLevel.valueOf(writeConsistencyLevel.toUpperCase()); - } else { - defaultWriteConsistencyLevel = ConsistencyLevel.ONE; - } - } - return defaultWriteConsistencyLevel; - } -} diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraSocketOptions.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraSocketOptions.java deleted file mode 100644 index cae5f5da30..0000000000 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraSocketOptions.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright © 2016-2020 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.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 org.thingsboard.server.dao.util.NoSqlAnyDao; - -import javax.annotation.PostConstruct; - -@Component -@Configuration -@Data -@NoSqlAnyDao -public class CassandraSocketOptions { - - @Value("${cassandra.socket.connect_timeout}") - private int connectTimeoutMillis; - @Value("${cassandra.socket.read_timeout}") - private int readTimeoutMillis; - @Value("${cassandra.socket.keep_alive}") - private Boolean keepAlive; - @Value("${cassandra.socket.reuse_address}") - private Boolean reuseAddress; - @Value("${cassandra.socket.so_linger}") - private Integer soLinger; - @Value("${cassandra.socket.tcp_no_delay}") - private Boolean tcpNoDelay; - @Value("${cassandra.socket.receive_buffer_size}") - private Integer receiveBufferSize; - @Value("${cassandra.socket.send_buffer_size}") - private Integer sendBufferSize; - - private SocketOptions opts; - - @PostConstruct - public void initOpts() { - opts = new SocketOptions(); - opts.setConnectTimeoutMillis(connectTimeoutMillis); - opts.setReadTimeoutMillis(readTimeoutMillis); - if (keepAlive != null) { - opts.setKeepAlive(keepAlive); - } - if (reuseAddress != null) { - opts.setReuseAddress(reuseAddress); - } - if (soLinger != null) { - opts.setSoLinger(soLinger); - } - if (tcpNoDelay != null) { - opts.setTcpNoDelay(tcpNoDelay); - } - if (receiveBufferSize != null) { - opts.setReceiveBufferSize(receiveBufferSize); - } - if (sendBufferSize != null) { - opts.setSendBufferSize(sendBufferSize); - } - } -} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/type/EntityTypeCodec.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/DefaultGuavaSession.java similarity index 65% rename from dao/src/main/java/org/thingsboard/server/dao/model/type/EntityTypeCodec.java rename to common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/DefaultGuavaSession.java index 3ec7668c14..b8ec3fb8e1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/type/EntityTypeCodec.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/DefaultGuavaSession.java @@ -13,15 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.dao.model.type; +package org.thingsboard.server.dao.cassandra.guava; -import com.datastax.driver.extras.codecs.enums.EnumNameCodec; -import org.thingsboard.server.common.data.EntityType; +import com.datastax.oss.driver.api.core.session.Session; +import com.datastax.oss.driver.internal.core.session.SessionWrapper; -public class EntityTypeCodec extends EnumNameCodec { +public class DefaultGuavaSession extends SessionWrapper implements GuavaSession { - public EntityTypeCodec() { - super(EntityType.class); + public DefaultGuavaSession(Session delegate) { + super(delegate); } - } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaDriverContext.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaDriverContext.java new file mode 100644 index 0000000000..31962b0d09 --- /dev/null +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaDriverContext.java @@ -0,0 +1,84 @@ +/** + * Copyright © 2016-2020 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.cassandra.guava; + +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; +import com.datastax.oss.driver.api.core.cql.PrepareRequest; +import com.datastax.oss.driver.api.core.cql.Statement; +import com.datastax.oss.driver.api.core.metadata.Node; +import com.datastax.oss.driver.api.core.metadata.NodeStateListener; +import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; +import com.datastax.oss.driver.api.core.session.ProgrammaticArguments; +import com.datastax.oss.driver.api.core.tracker.RequestTracker; +import com.datastax.oss.driver.api.core.type.codec.TypeCodec; +import com.datastax.oss.driver.internal.core.context.DefaultDriverContext; +import com.datastax.oss.driver.internal.core.cql.CqlPrepareAsyncProcessor; +import com.datastax.oss.driver.internal.core.cql.CqlPrepareSyncProcessor; +import com.datastax.oss.driver.internal.core.cql.CqlRequestAsyncProcessor; +import com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor; +import com.datastax.oss.driver.internal.core.session.RequestProcessorRegistry; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; + +/** + * A Custom {@link DefaultDriverContext} that overrides {@link #getRequestProcessorRegistry()} to + * return a {@link RequestProcessorRegistry} that includes processors for returning guava futures. + */ +public class GuavaDriverContext extends DefaultDriverContext { + + public GuavaDriverContext( + DriverConfigLoader configLoader, + List> typeCodecs, + NodeStateListener nodeStateListener, + SchemaChangeListener schemaChangeListener, + RequestTracker requestTracker, + Map localDatacenters, + Map> nodeFilters, + ClassLoader classLoader) { + super( + configLoader, + ProgrammaticArguments.builder() + .addTypeCodecs(typeCodecs.toArray(new TypeCodec[0])) + .withNodeStateListener(nodeStateListener) + .withSchemaChangeListener(schemaChangeListener) + .withRequestTracker(requestTracker) + .withLocalDatacenters(localDatacenters) + .withNodeFilters(nodeFilters) + .withClassLoader(classLoader) + .build()); + } + + @Override + public RequestProcessorRegistry buildRequestProcessorRegistry() { + // Register the typical request processors, except instead of the normal async processors, + // use GuavaRequestAsyncProcessor to return ListenableFutures in async methods. + + CqlRequestAsyncProcessor cqlRequestAsyncProcessor = new CqlRequestAsyncProcessor(); + CqlPrepareAsyncProcessor cqlPrepareAsyncProcessor = new CqlPrepareAsyncProcessor(); + CqlRequestSyncProcessor cqlRequestSyncProcessor = + new CqlRequestSyncProcessor(cqlRequestAsyncProcessor); + + return new RequestProcessorRegistry( + getSessionName(), + cqlRequestSyncProcessor, + new CqlPrepareSyncProcessor(cqlPrepareAsyncProcessor), + new GuavaRequestAsyncProcessor<>( + cqlRequestAsyncProcessor, Statement.class, GuavaSession.ASYNC), + new GuavaRequestAsyncProcessor<>( + cqlPrepareAsyncProcessor, PrepareRequest.class, GuavaSession.ASYNC_PREPARED)); + } +} diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaRequestAsyncProcessor.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaRequestAsyncProcessor.java new file mode 100644 index 0000000000..7947296cdb --- /dev/null +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaRequestAsyncProcessor.java @@ -0,0 +1,79 @@ +/** + * Copyright © 2016-2020 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.cassandra.guava; + +import com.datastax.oss.driver.api.core.session.Request; +import com.datastax.oss.driver.api.core.type.reflect.GenericType; +import com.datastax.oss.driver.internal.core.context.InternalDriverContext; +import com.datastax.oss.driver.internal.core.session.DefaultSession; +import com.datastax.oss.driver.internal.core.session.RequestProcessor; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.SettableFuture; +import java.util.concurrent.CompletionStage; + +/** + * Wraps a {@link RequestProcessor} that returns {@link CompletionStage}s and converts them to a + * {@link ListenableFuture}s. + * + * @param The type of request + * @param The type of responses enclosed in the future response. + */ +public class GuavaRequestAsyncProcessor + implements RequestProcessor> { + + private final RequestProcessor> subProcessor; + + private final GenericType resultType; + + private final Class requestClass; + + GuavaRequestAsyncProcessor( + RequestProcessor> subProcessor, + Class requestClass, + GenericType resultType) { + this.subProcessor = subProcessor; + this.requestClass = requestClass; + this.resultType = resultType; + } + + @Override + public boolean canProcess(Request request, GenericType resultType) { + return requestClass.isInstance(request) && resultType.equals(this.resultType); + } + + @Override + public ListenableFuture process( + T request, DefaultSession session, InternalDriverContext context, String sessionLogPrefix) { + SettableFuture future = SettableFuture.create(); + subProcessor + .process(request, session, context, sessionLogPrefix) + .whenComplete( + (r, ex) -> { + if (ex != null) { + future.setException(ex); + } else { + future.set(r); + } + }); + return future; + } + + @Override + public ListenableFuture newFailure(RuntimeException error) { + return Futures.immediateFailedFuture(error); + } +} diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSession.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSession.java new file mode 100644 index 0000000000..97f300ee3c --- /dev/null +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSession.java @@ -0,0 +1,51 @@ +/** + * Copyright © 2016-2020 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.cassandra.guava; + +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.core.cql.Statement; +import com.datastax.oss.driver.api.core.cql.SyncCqlSession; +import com.datastax.oss.driver.api.core.session.Session; +import com.datastax.oss.driver.api.core.type.reflect.GenericType; +import com.datastax.oss.driver.internal.core.cql.DefaultPrepareRequest; +import com.google.common.util.concurrent.ListenableFuture; + +public interface GuavaSession extends Session, SyncCqlSession { + + GenericType> ASYNC = + new GenericType>() {}; + + GenericType> ASYNC_PREPARED = + new GenericType>() {}; + + default ListenableFuture executeAsync(Statement statement) { + return this.execute(statement, ASYNC); + } + + default ListenableFuture executeAsync(String statement) { + return this.executeAsync(SimpleStatement.newInstance(statement)); + } + + default ListenableFuture prepareAsync(SimpleStatement statement) { + return this.execute(new DefaultPrepareRequest(statement), ASYNC_PREPARED); + } + + default ListenableFuture prepareAsync(String statement) { + return this.prepareAsync(SimpleStatement.newInstance(statement)); + } +} diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionBuilder.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionBuilder.java new file mode 100644 index 0000000000..884a493f1f --- /dev/null +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionBuilder.java @@ -0,0 +1,59 @@ +/** + * Copyright © 2016-2020 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.cassandra.guava; + +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; +import com.datastax.oss.driver.api.core.context.DriverContext; +import com.datastax.oss.driver.api.core.metadata.Node; +import com.datastax.oss.driver.api.core.metadata.NodeStateListener; +import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; +import com.datastax.oss.driver.api.core.session.SessionBuilder; +import com.datastax.oss.driver.api.core.tracker.RequestTracker; +import com.datastax.oss.driver.api.core.type.codec.TypeCodec; +import edu.umd.cs.findbugs.annotations.NonNull; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; + +public class GuavaSessionBuilder extends SessionBuilder { + + @Override + protected DriverContext buildContext( + DriverConfigLoader configLoader, + List> typeCodecs, + NodeStateListener nodeStateListener, + SchemaChangeListener schemaChangeListener, + RequestTracker requestTracker, + Map localDatacenters, + Map> nodeFilters, + ClassLoader classLoader) { + return new GuavaDriverContext( + configLoader, + typeCodecs, + nodeStateListener, + schemaChangeListener, + requestTracker, + localDatacenters, + nodeFilters, + classLoader); + } + + @Override + protected GuavaSession wrap(@NonNull CqlSession defaultSession) { + return new DefaultGuavaSession(defaultSession); + } +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/type/JsonCodec.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionUtils.java similarity index 69% rename from dao/src/main/java/org/thingsboard/server/dao/model/type/JsonCodec.java rename to common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionUtils.java index fae62c73fe..acc8fb6ddf 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/type/JsonCodec.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionUtils.java @@ -13,15 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.dao.model.type; +package org.thingsboard.server.dao.cassandra.guava; -import com.datastax.driver.extras.codecs.json.JacksonJsonCodec; -import com.fasterxml.jackson.databind.JsonNode; - -public class JsonCodec extends JacksonJsonCodec { - - public JsonCodec() { - super(JsonNode.class); +public class GuavaSessionUtils { + public static GuavaSessionBuilder builder() { + return new GuavaSessionBuilder(); } - } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/nosql/CassandraStatementTask.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/nosql/CassandraStatementTask.java index a433692d5c..19bf415cfd 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/nosql/CassandraStatementTask.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/nosql/CassandraStatementTask.java @@ -15,10 +15,10 @@ */ package org.thingsboard.server.dao.nosql; -import com.datastax.driver.core.Session; -import com.datastax.driver.core.Statement; +import com.datastax.oss.driver.api.core.cql.Statement; import lombok.Data; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; import org.thingsboard.server.dao.util.AsyncTask; /** @@ -28,7 +28,7 @@ import org.thingsboard.server.dao.util.AsyncTask; public class CassandraStatementTask implements AsyncTask { private final TenantId tenantId; - private final Session session; + private final GuavaSession session; private final Statement statement; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/nosql/TbResultSetFuture.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/nosql/TbResultSetFuture.java similarity index 71% rename from dao/src/main/java/org/thingsboard/server/dao/nosql/TbResultSetFuture.java rename to common/dao-api/src/main/java/org/thingsboard/server/dao/nosql/TbResultSetFuture.java index d0d2f0dc7e..8a42b09b78 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/nosql/TbResultSetFuture.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/nosql/TbResultSetFuture.java @@ -15,8 +15,8 @@ */ package org.thingsboard.server.dao.nosql; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.ResultSetFuture; +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import java.util.concurrent.ExecutionException; @@ -27,21 +27,19 @@ import java.util.concurrent.TimeoutException; /** * Created by ashvayka on 24.10.18. */ -public class TbResultSetFuture implements ResultSetFuture { +public class TbResultSetFuture implements ListenableFuture { - private final SettableFuture mainFuture; + private final SettableFuture mainFuture; - public TbResultSetFuture(SettableFuture mainFuture) { + public TbResultSetFuture(SettableFuture mainFuture) { this.mainFuture = mainFuture; } - @Override - public ResultSet getUninterruptibly() { + public AsyncResultSet getUninterruptibly() { return getSafe(); } - @Override - public ResultSet getUninterruptibly(long timeout, TimeUnit unit) throws TimeoutException { + public AsyncResultSet getUninterruptibly(long timeout, TimeUnit unit) throws TimeoutException { return getSafe(timeout, unit); } @@ -61,12 +59,12 @@ public class TbResultSetFuture implements ResultSetFuture { } @Override - public ResultSet get() throws InterruptedException, ExecutionException { + public AsyncResultSet get() throws InterruptedException, ExecutionException { return mainFuture.get(); } @Override - public ResultSet get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + public AsyncResultSet get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return mainFuture.get(timeout, unit); } @@ -75,7 +73,7 @@ public class TbResultSetFuture implements ResultSetFuture { mainFuture.addListener(listener, executor); } - private ResultSet getSafe() { + private AsyncResultSet getSafe() { try { return mainFuture.get(); } catch (InterruptedException | ExecutionException e) { @@ -83,7 +81,7 @@ public class TbResultSetFuture implements ResultSetFuture { } } - private ResultSet getSafe(long timeout, TimeUnit unit) throws TimeoutException { + private AsyncResultSet getSafe(long timeout, TimeUnit unit) throws TimeoutException { try { return mainFuture.get(timeout, unit); } catch (InterruptedException | ExecutionException e) { diff --git a/common/data/pom.xml b/common/data/pom.xml index 61f5fbbb12..a4c4dd4d97 100644 --- a/common/data/pom.xml +++ b/common/data/pom.xml @@ -67,8 +67,8 @@ test - com.datastax.cassandra - cassandra-driver-core + com.datastax.oss + java-driver-core test diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/UUIDConverterTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/UUIDConverterTest.java index 193687c240..35666ddf1f 100644 --- a/common/data/src/test/java/org/thingsboard/server/common/data/UUIDConverterTest.java +++ b/common/data/src/test/java/org/thingsboard/server/common/data/UUIDConverterTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.common.data; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -61,8 +61,8 @@ public class UUIDConverterTest { before = tmp; } - String beforeStr = UUIDConverter.fromTimeUUID(UUIDs.startOf(before)); - String afterStr = UUIDConverter.fromTimeUUID(UUIDs.startOf(after)); + String beforeStr = UUIDConverter.fromTimeUUID(Uuids.startOf(before)); + String afterStr = UUIDConverter.fromTimeUUID(Uuids.startOf(after)); if (afterStr.compareTo(beforeStr) < 0) { System.out.println("Before: " + before + " | " + beforeStr); diff --git a/dao/pom.xml b/dao/pom.xml index aa31fed8ef..3519f238b0 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -120,18 +120,18 @@ org.springframework.security spring-security-oauth2-client - - com.datastax.cassandra - cassandra-driver-core - - - com.datastax.cassandra - cassandra-driver-mapping - - - com.datastax.cassandra - cassandra-driver-extras - + + com.datastax.oss + java-driver-core + + + com.datastax.oss + java-driver-query-builder + + + io.dropwizard.metrics + metrics-jmx + io.takari.junit takari-cpsuite @@ -149,6 +149,10 @@ org.slf4j slf4j-log4j12 + + org.hibernate + hibernate-validator + test diff --git a/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java b/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java index b20088a228..25abeb239a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java +++ b/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -49,7 +49,7 @@ public abstract class DaoUtil { public static String startTimeToId(Long startTime) { if (startTime != null) { - UUID startOf = UUIDs.startOf(startTime); + UUID startOf = Uuids.startOf(startTime); return UUIDConverter.fromTimeUUID(startOf); } else { return null; @@ -58,7 +58,7 @@ public abstract class DaoUtil { public static String endTimeToId(Long endTime) { if (endTime != null) { - UUID endOf = UUIDs.endOf(endTime); + UUID endOf = Uuids.endOf(endTime); return UUIDConverter.fromTimeUUID(endOf); } else { return null; diff --git a/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java index f4032d55ed..551af3df23 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.audit; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -296,7 +296,7 @@ public class AuditLogServiceImpl implements AuditLogService { ActionStatus actionStatus, String actionFailureDetails) { AuditLog result = new AuditLog(); - result.setId(new AuditLogId(UUIDs.timeBased())); + result.setId(new AuditLogId(Uuids.timeBased())); result.setTenantId(tenantId); result.setEntityId(entityId); result.setEntityName(entityName); diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/EntitySubtypeEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/EntitySubtypeEntity.java deleted file mode 100644 index b6c99042b3..0000000000 --- a/dao/src/main/java/org/thingsboard/server/dao/model/EntitySubtypeEntity.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Copyright © 2016-2020 The Thingsboard Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.thingsboard.server.dao.model; - -import com.datastax.driver.mapping.annotations.Column; -import com.datastax.driver.mapping.annotations.PartitionKey; -import com.datastax.driver.mapping.annotations.Table; -import org.thingsboard.server.common.data.EntitySubtype; -import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.model.type.EntityTypeCodec; - -import java.util.UUID; - -import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_SUBTYPE_COLUMN_FAMILY_NAME; -import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_SUBTYPE_ENTITY_TYPE_PROPERTY; -import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_SUBTYPE_TENANT_ID_PROPERTY; -import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_SUBTYPE_TYPE_PROPERTY; - -@Table(name = ENTITY_SUBTYPE_COLUMN_FAMILY_NAME) -public class EntitySubtypeEntity { - - @PartitionKey(value = 0) - @Column(name = ENTITY_SUBTYPE_TENANT_ID_PROPERTY) - private UUID tenantId; - - @PartitionKey(value = 1) - @Column(name = ENTITY_SUBTYPE_ENTITY_TYPE_PROPERTY, codec = EntityTypeCodec.class) - private EntityType entityType; - - @PartitionKey(value = 2) - @Column(name = ENTITY_SUBTYPE_TYPE_PROPERTY) - private String type; - - public EntitySubtypeEntity() { - super(); - } - - public EntitySubtypeEntity(EntitySubtype entitySubtype) { - this.tenantId = entitySubtype.getTenantId().getId(); - this.entityType = entitySubtype.getEntityType(); - this.type = entitySubtype.getType(); - } - - public UUID getTenantId() { - return tenantId; - } - - public void setTenantId(UUID tenantId) { - this.tenantId = tenantId; - } - - public EntityType getEntityType() { - return entityType; - } - - public void setEntityType(EntityType entityType) { - this.entityType = entityType; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - EntitySubtypeEntity that = (EntitySubtypeEntity) o; - - if (tenantId != null ? !tenantId.equals(that.tenantId) : that.tenantId != null) return false; - if (entityType != that.entityType) return false; - return type != null ? type.equals(that.type) : that.type == null; - - } - - @Override - public int hashCode() { - int result = tenantId != null ? tenantId.hashCode() : 0; - result = 31 * result + (entityType != null ? entityType.hashCode() : 0); - result = 31 * result + (type != null ? type.hashCode() : 0); - return result; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("EntitySubtypeEntity{"); - sb.append("tenantId=").append(tenantId); - sb.append(", entityType=").append(entityType); - sb.append(", type='").append(type).append('\''); - sb.append('}'); - return sb.toString(); - } - - public EntitySubtype toEntitySubtype() { - EntitySubtype entitySubtype = new EntitySubtype(); - entitySubtype.setTenantId(new TenantId(tenantId)); - entitySubtype.setEntityType(entityType); - entitySubtype.setType(type); - return entitySubtype; - } -} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index 9f72567838..f52e450d8b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.apache.commons.lang3.ArrayUtils; import org.thingsboard.server.common.data.UUIDConverter; import org.thingsboard.server.common.data.id.TenantId; @@ -28,7 +28,7 @@ public class ModelConstants { private ModelConstants() { } - public static final UUID NULL_UUID = UUIDs.startOf(0); + public static final UUID NULL_UUID = Uuids.startOf(0); public static final String NULL_UUID_STR = UUIDConverter.fromTimeUUID(NULL_UUID); public static final TenantId SYSTEM_TENANT = new TenantId(ModelConstants.NULL_UUID); diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAlarmEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAlarmEntity.java index 22d8b1c212..8ebaf17c9e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAlarmEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAlarmEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -154,7 +154,7 @@ public abstract class AbstractAlarmEntity extends BaseSqlEntity protected Alarm toAlarm() { Alarm alarm = new Alarm(new AlarmId(UUIDConverter.fromString(id))); - alarm.setCreatedTime(UUIDs.unixTimestamp(UUIDConverter.fromString(id))); + alarm.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); if (tenantId != null) { alarm.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAssetEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAssetEntity.java index fac8d68f62..367864db6b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAssetEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAssetEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -116,7 +116,7 @@ public abstract class AbstractAssetEntity extends BaseSqlEntity protected Asset toAsset() { Asset asset = new Asset(new AssetId(UUIDConverter.fromString(id))); - asset.setCreatedTime(UUIDs.unixTimestamp(UUIDConverter.fromString(id))); + asset.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); if (tenantId != null) { asset.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractDeviceEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractDeviceEntity.java index b707ce1b67..6b4d8d8ba5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractDeviceEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractDeviceEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -104,7 +104,7 @@ public abstract class AbstractDeviceEntity extends BaseSqlEnti protected Device toDevice() { Device device = new Device(new DeviceId(getUuid())); - device.setCreatedTime(UUIDs.unixTimestamp(getUuid())); + device.setCreatedTime(Uuids.unixTimestamp(getUuid())); if (tenantId != null) { device.setTenantId(new TenantId(toUUID(tenantId))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractEntityViewEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractEntityViewEntity.java index d8e78593fa..649078cd47 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractEntityViewEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractEntityViewEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; @@ -147,7 +147,7 @@ public abstract class AbstractEntityViewEntity extends Bas protected EntityView toEntityView() { EntityView entityView = new EntityView(new EntityViewId(getUuid())); - entityView.setCreatedTime(UUIDs.unixTimestamp(getUuid())); + entityView.setCreatedTime(Uuids.unixTimestamp(getUuid())); if (entityId != null) { entityView.setEntityId(EntityIdFactory.getByTypeAndId(entityType.name(), toUUID(entityId).toString())); diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java index 1b1a27a04f..909c959bf5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -65,10 +65,10 @@ public final class AdminSettingsEntity extends BaseSqlEntity impl @Override public AdminSettings toData() { AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(UUIDConverter.fromString(id))); - adminSettings.setCreatedTime(UUIDs.unixTimestamp(UUIDConverter.fromString(id))); + adminSettings.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); adminSettings.setKey(key); adminSettings.setJsonValue(jsonValue); return adminSettings; } -} \ No newline at end of file +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AuditLogEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AuditLogEntity.java index e2573ea0d1..520fd8b41d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AuditLogEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AuditLogEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -129,7 +129,7 @@ public class AuditLogEntity extends BaseSqlEntity implements BaseEntit @Override public AuditLog toData() { AuditLog auditLog = new AuditLog(new AuditLogId(this.getUuid())); - auditLog.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + auditLog.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); if (tenantId != null) { auditLog.setTenantId(new TenantId(toUUID(tenantId))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java index 0e5d00ac8c..3d8ed7614c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -112,7 +112,7 @@ public final class CustomerEntity extends BaseSqlEntity implements Sea @Override public Customer toData() { Customer customer = new Customer(new CustomerId(this.getUuid())); - customer.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + customer.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); customer.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); customer.setTitle(title); customer.setCountry(country); @@ -126,4 +126,4 @@ public final class CustomerEntity extends BaseSqlEntity implements Sea customer.setAdditionalInfo(additionalInfo); return customer; } -} \ No newline at end of file +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java index 07cec4d12f..622f03cbad 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; @@ -104,7 +104,7 @@ public final class DashboardEntity extends BaseSqlEntity implements S @Override public Dashboard toData() { Dashboard dashboard = new Dashboard(new DashboardId(this.getUuid())); - dashboard.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + dashboard.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); if (tenantId != null) { dashboard.setTenantId(new TenantId(toUUID(tenantId))); } @@ -119,4 +119,4 @@ public final class DashboardEntity extends BaseSqlEntity implements S dashboard.setConfiguration(configuration); return dashboard; } -} \ No newline at end of file +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java index f26cf21934..7e5aabd328 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; @@ -98,7 +98,7 @@ public class DashboardInfoEntity extends BaseSqlEntity implements @Override public DashboardInfo toData() { DashboardInfo dashboardInfo = new DashboardInfo(new DashboardId(this.getUuid())); - dashboardInfo.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + dashboardInfo.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); if (tenantId != null) { dashboardInfo.setTenantId(new TenantId(toUUID(tenantId))); } @@ -113,4 +113,4 @@ public class DashboardInfoEntity extends BaseSqlEntity implements return dashboardInfo; } -} \ No newline at end of file +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java index ba9d7ce637..c9fbce0f8b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import lombok.Data; import lombok.EqualsAndHashCode; import org.thingsboard.server.common.data.id.DeviceCredentialsId; @@ -70,7 +70,7 @@ public final class DeviceCredentialsEntity extends BaseSqlEntity implements BaseEntity implements SearchT @Override public RuleChain toData() { RuleChain ruleChain = new RuleChain(new RuleChainId(this.getUuid())); - ruleChain.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + ruleChain.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); ruleChain.setTenantId(new TenantId(toUUID(tenantId))); ruleChain.setName(name); if (firstRuleNodeId != null) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleNodeEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleNodeEntity.java index 1a7866418a..a12861f475 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleNodeEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleNodeEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -95,7 +95,7 @@ public class RuleNodeEntity extends BaseSqlEntity implements SearchTex @Override public RuleNode toData() { RuleNode ruleNode = new RuleNode(new RuleNodeId(this.getUuid())); - ruleNode.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + ruleNode.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); if (ruleChainId != null) { ruleNode.setRuleChainId(new RuleChainId(toUUID(ruleChainId))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java index 1da71224f0..51de38f68b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -122,7 +122,7 @@ public final class TenantEntity extends BaseSqlEntity implements SearchT @Override public Tenant toData() { Tenant tenant = new Tenant(new TenantId(this.getUuid())); - tenant.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + tenant.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); tenant.setTitle(title); tenant.setRegion(region); tenant.setCountry(country); @@ -140,4 +140,4 @@ public final class TenantEntity extends BaseSqlEntity implements SearchT } -} \ No newline at end of file +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java index 6957f87961..ed6cd3f8a7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import lombok.Data; import lombok.EqualsAndHashCode; import org.thingsboard.server.common.data.id.UserCredentialsId; @@ -70,7 +70,7 @@ public final class UserCredentialsEntity extends BaseSqlEntity @Override public UserCredentials toData() { UserCredentials userCredentials = new UserCredentials(new UserCredentialsId(this.getUuid())); - userCredentials.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + userCredentials.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); if (userId != null) { userCredentials.setUserId(new UserId(toUUID(userId))); } @@ -81,4 +81,4 @@ public final class UserCredentialsEntity extends BaseSqlEntity return userCredentials; } -} \ No newline at end of file +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java index 3af671583e..1637c334ba 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -109,7 +109,7 @@ public class UserEntity extends BaseSqlEntity implements SearchTextEntity< @Override public User toData() { User user = new User(new UserId(this.getUuid())); - user.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + user.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); user.setAuthority(authority); if (tenantId != null) { user.setTenantId(new TenantId(fromString(tenantId))); diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java index 0cb69b9d8b..01854a4e11 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -76,7 +76,7 @@ public final class WidgetTypeEntity extends BaseSqlEntity implement @Override public WidgetType toData() { WidgetType widgetType = new WidgetType(new WidgetTypeId(this.getUuid())); - widgetType.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); + widgetType.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); if (tenantId != null) { widgetType.setTenantId(new TenantId(toUUID(tenantId))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java index 75ea383090..4fee25d82f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java @@ -16,7 +16,7 @@ package org.thingsboard.server.dao.model.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import lombok.Data; import lombok.EqualsAndHashCode; import org.thingsboard.server.common.data.UUIDConverter; @@ -77,7 +77,7 @@ public final class WidgetsBundleEntity extends BaseSqlEntity impl @Override public WidgetsBundle toData() { WidgetsBundle widgetsBundle = new WidgetsBundle(new WidgetsBundleId(UUIDConverter.fromString(id))); - widgetsBundle.setCreatedTime(UUIDs.unixTimestamp(UUIDConverter.fromString(id))); + widgetsBundle.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); if (tenantId != null) { widgetsBundle.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/type/ComponentLifecycleStateCodec.java b/dao/src/main/java/org/thingsboard/server/dao/model/type/ComponentLifecycleStateCodec.java deleted file mode 100644 index 6d7f4bb8bf..0000000000 --- a/dao/src/main/java/org/thingsboard/server/dao/model/type/ComponentLifecycleStateCodec.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright © 2016-2020 The Thingsboard Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.thingsboard.server.dao.model.type; - -import com.datastax.driver.extras.codecs.enums.EnumNameCodec; -import org.thingsboard.server.common.data.plugin.ComponentLifecycleState; - -public class ComponentLifecycleStateCodec extends EnumNameCodec { - - public ComponentLifecycleStateCodec() { - super(ComponentLifecycleState.class); - } - -} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/wrapper/EntityResultSet.java b/dao/src/main/java/org/thingsboard/server/dao/model/wrapper/EntityResultSet.java deleted file mode 100644 index 41d11d7cb5..0000000000 --- a/dao/src/main/java/org/thingsboard/server/dao/model/wrapper/EntityResultSet.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright © 2016-2020 The Thingsboard Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.thingsboard.server.dao.model.wrapper; - - -import com.datastax.driver.core.ResultSet; - -public class EntityResultSet { - - private ResultSet resultSet; - private T entity; - - public EntityResultSet(ResultSet resultSet, T entity) { - this.resultSet = resultSet; - this.entity = entity; - } - - public T getEntity() { - return entity; - } - - public boolean wasApplied() { - return resultSet.wasApplied(); - } -} diff --git a/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractAsyncDao.java b/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractAsyncDao.java index 702df73614..b782ca0a5e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractAsyncDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractAsyncDao.java @@ -15,9 +15,11 @@ */ package org.thingsboard.server.dao.nosql; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.ResultSetFuture; +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.datastax.oss.driver.api.core.cql.Row; import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.common.util.ThingsBoardThreadFactory; @@ -25,8 +27,11 @@ import org.thingsboard.common.util.ThingsBoardThreadFactory; import javax.annotation.Nullable; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.stream.Collectors; /** * Created by ashvayka on 21.02.17. @@ -47,13 +52,32 @@ public abstract class CassandraAbstractAsyncDao extends CassandraAbstractDao { } } - protected ListenableFuture getFuture(ResultSetFuture future, java.util.function.Function transformer) { - return Futures.transform(future, new Function() { + protected ListenableFuture getFuture(TbResultSetFuture future, java.util.function.Function transformer) { + return Futures.transform(future, new Function() { @Nullable @Override - public T apply(@Nullable ResultSet input) { + public T apply(@Nullable AsyncResultSet input) { return transformer.apply(input); } }, readResultsProcessingExecutor); } + + protected ListenableFuture getFutureAsync(TbResultSetFuture future, com.google.common.util.concurrent.AsyncFunction transformer) { + return Futures.transformAsync(future, new AsyncFunction() { + @Nullable + @Override + public ListenableFuture apply(@Nullable AsyncResultSet input) { + try { + return transformer.apply(input); + } catch (Exception e) { + return Futures.immediateFailedFuture(e); + } + } + }, readResultsProcessingExecutor); + } + + protected ListenableFuture> allRows(AsyncResultSet resultSet) { + return ResultSetUtils.allRows(resultSet, readResultsProcessingExecutor); + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractDao.java b/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractDao.java index 62716af3e1..aa711146f8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractDao.java @@ -15,16 +15,17 @@ */ package org.thingsboard.server.dao.nosql; -import com.datastax.driver.core.*; -import com.datastax.driver.core.exceptions.CodecNotFoundException; +import com.datastax.oss.driver.api.core.ConsistencyLevel; +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.datastax.oss.driver.api.core.cql.BoundStatement; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; +import com.datastax.oss.driver.api.core.cql.Statement; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.cassandra.CassandraCluster; -import org.thingsboard.server.dao.model.type.ComponentLifecycleStateCodec; -import org.thingsboard.server.dao.model.type.EntityTypeCodec; -import org.thingsboard.server.dao.model.type.JsonCodec; +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -41,20 +42,16 @@ public abstract class CassandraAbstractDao { @Autowired private CassandraBufferedRateExecutor rateLimiter; - private Session session; + private GuavaSession session; private ConsistencyLevel defaultReadLevel; private ConsistencyLevel defaultWriteLevel; - private Session getSession() { + private GuavaSession getSession() { if (session == null) { session = cluster.getSession(); defaultReadLevel = cluster.getDefaultReadConsistencyLevel(); defaultWriteLevel = cluster.getDefaultWriteConsistencyLevel(); - CodecRegistry registry = session.getCluster().getConfiguration().getCodecRegistry(); - registerCodecIfNotFound(registry, new JsonCodec()); - registerCodecIfNotFound(registry, new ComponentLifecycleStateCodec()); - registerCodecIfNotFound(registry, new EntityTypeCodec()); } return session; } @@ -63,38 +60,30 @@ public abstract class CassandraAbstractDao { return preparedStatementMap.computeIfAbsent(query, i -> getSession().prepare(i)); } - private void registerCodecIfNotFound(CodecRegistry registry, TypeCodec codec) { - try { - registry.codecFor(codec.getCqlType(), codec.getJavaType()); - } catch (CodecNotFoundException e) { - registry.register(codec); - } - } - - protected ResultSet executeRead(TenantId tenantId, Statement statement) { + protected AsyncResultSet executeRead(TenantId tenantId, Statement statement) { return execute(tenantId, statement, defaultReadLevel); } - protected ResultSet executeWrite(TenantId tenantId, Statement statement) { + protected AsyncResultSet executeWrite(TenantId tenantId, Statement statement) { return execute(tenantId, statement, defaultWriteLevel); } - protected ResultSetFuture executeAsyncRead(TenantId tenantId, Statement statement) { + protected TbResultSetFuture executeAsyncRead(TenantId tenantId, Statement statement) { return executeAsync(tenantId, statement, defaultReadLevel); } - protected ResultSetFuture executeAsyncWrite(TenantId tenantId, Statement statement) { + protected TbResultSetFuture executeAsyncWrite(TenantId tenantId, Statement statement) { return executeAsync(tenantId, statement, defaultWriteLevel); } - private ResultSet execute(TenantId tenantId, Statement statement, ConsistencyLevel level) { + private AsyncResultSet execute(TenantId tenantId, Statement statement, ConsistencyLevel level) { if (log.isDebugEnabled()) { log.debug("Execute cassandra statement {}", statementToString(statement)); } return executeAsync(tenantId, statement, level).getUninterruptibly(); } - private ResultSetFuture executeAsync(TenantId tenantId, Statement statement, ConsistencyLevel level) { + private TbResultSetFuture executeAsync(TenantId tenantId, Statement statement, ConsistencyLevel level) { if (log.isDebugEnabled()) { log.debug("Execute cassandra async statement {}", statementToString(statement)); } @@ -106,9 +95,9 @@ public abstract class CassandraAbstractDao { private static String statementToString(Statement statement) { if (statement instanceof BoundStatement) { - return ((BoundStatement) statement).preparedStatement().getQueryString(); + return ((BoundStatement) statement).getPreparedStatement().getQuery(); } else { return statement.toString(); } } -} \ No newline at end of file +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraBufferedRateExecutor.java b/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraBufferedRateExecutor.java index 99e1b9ccc5..e6db2c092f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraBufferedRateExecutor.java +++ b/dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraBufferedRateExecutor.java @@ -15,8 +15,8 @@ */ package org.thingsboard.server.dao.nosql; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.ResultSetFuture; +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -39,7 +39,7 @@ import java.util.Map; @Component @Slf4j @NoSqlAnyDao -public class CassandraBufferedRateExecutor extends AbstractBufferedRateExecutor { +public class CassandraBufferedRateExecutor extends AbstractBufferedRateExecutor { @Autowired private EntityService entityService; @@ -107,17 +107,17 @@ public class CassandraBufferedRateExecutor extends AbstractBufferedRateExecutor< } @Override - protected SettableFuture create() { + protected SettableFuture create() { return SettableFuture.create(); } @Override - protected ResultSetFuture wrap(CassandraStatementTask task, SettableFuture future) { + protected TbResultSetFuture wrap(CassandraStatementTask task, SettableFuture future) { return new TbResultSetFuture(future); } @Override - protected ResultSetFuture execute(AsyncTaskContext taskCtx) { + protected ListenableFuture execute(AsyncTaskContext taskCtx) { CassandraStatementTask task = taskCtx.getTask(); return task.getSession().executeAsync(task.getStatement()); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFuture.java b/dao/src/main/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFuture.java deleted file mode 100644 index ebbe451b01..0000000000 --- a/dao/src/main/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFuture.java +++ /dev/null @@ -1,156 +0,0 @@ -/** - * Copyright © 2016-2020 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.nosql; - -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.ResultSetFuture; -import com.datastax.driver.core.Session; -import com.datastax.driver.core.Statement; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.MoreExecutors; -import com.google.common.util.concurrent.Uninterruptibles; -import org.thingsboard.server.dao.exception.BufferLimitException; -import org.thingsboard.server.dao.util.AsyncRateLimiter; - -import javax.annotation.Nullable; -import java.util.concurrent.CancellationException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -public class RateLimitedResultSetFuture implements ResultSetFuture { - - private final ListenableFuture originalFuture; - private final ListenableFuture rateLimitFuture; - - public RateLimitedResultSetFuture(Session session, AsyncRateLimiter rateLimiter, Statement statement) { - this.rateLimitFuture = Futures.catchingAsync(rateLimiter.acquireAsync(), Throwable.class, t -> { - if (!(t instanceof BufferLimitException)) { - rateLimiter.release(); - } - return Futures.immediateFailedFuture(t); - }, MoreExecutors.directExecutor()); - this.originalFuture = Futures.transform(rateLimitFuture, - i -> executeAsyncWithRelease(rateLimiter, session, statement), MoreExecutors.directExecutor()); - - } - - @Override - public ResultSet getUninterruptibly() { - return safeGet().getUninterruptibly(); - } - - @Override - public ResultSet getUninterruptibly(long timeout, TimeUnit unit) throws TimeoutException { - long rateLimitStart = System.nanoTime(); - ResultSetFuture resultSetFuture = null; - try { - resultSetFuture = originalFuture.get(timeout, unit); - } catch (InterruptedException | ExecutionException e) { - throw new IllegalStateException(e); - } - long rateLimitDurationNano = System.nanoTime() - rateLimitStart; - long innerTimeoutNano = unit.toNanos(timeout) - rateLimitDurationNano; - if (innerTimeoutNano > 0) { - return resultSetFuture.getUninterruptibly(innerTimeoutNano, TimeUnit.NANOSECONDS); - } - throw new TimeoutException("Timeout waiting for task."); - } - - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - if (originalFuture.isDone()) { - return safeGet().cancel(mayInterruptIfRunning); - } else { - return originalFuture.cancel(mayInterruptIfRunning); - } - } - - @Override - public boolean isCancelled() { - if (originalFuture.isDone()) { - return safeGet().isCancelled(); - } - - return originalFuture.isCancelled(); - } - - @Override - public boolean isDone() { - return originalFuture.isDone() && safeGet().isDone(); - } - - @Override - public ResultSet get() throws InterruptedException, ExecutionException { - return safeGet().get(); - } - - @Override - public ResultSet get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - long rateLimitStart = System.nanoTime(); - ResultSetFuture resultSetFuture = originalFuture.get(timeout, unit); - long rateLimitDurationNano = System.nanoTime() - rateLimitStart; - long innerTimeoutNano = unit.toNanos(timeout) - rateLimitDurationNano; - if (innerTimeoutNano > 0) { - return resultSetFuture.get(innerTimeoutNano, TimeUnit.NANOSECONDS); - } - throw new TimeoutException("Timeout waiting for task."); - } - - @Override - public void addListener(Runnable listener, Executor executor) { - originalFuture.addListener(() -> { - try { - ResultSetFuture resultSetFuture = Uninterruptibles.getUninterruptibly(originalFuture); - resultSetFuture.addListener(listener, executor); - } catch (CancellationException | ExecutionException e) { - Futures.immediateFailedFuture(e).addListener(listener, executor); - } - }, executor); - } - - private ResultSetFuture safeGet() { - try { - return originalFuture.get(); - } catch (InterruptedException | ExecutionException e) { - throw new IllegalStateException(e); - } - } - - private ResultSetFuture executeAsyncWithRelease(AsyncRateLimiter rateLimiter, Session session, Statement statement) { - try { - ResultSetFuture resultSetFuture = session.executeAsync(statement); - Futures.addCallback(resultSetFuture, new FutureCallback() { - @Override - public void onSuccess(@Nullable ResultSet result) { - rateLimiter.release(); - } - - @Override - public void onFailure(Throwable t) { - rateLimiter.release(); - } - }, MoreExecutors.directExecutor()); - return resultSetFuture; - } catch (RuntimeException re) { - rateLimiter.release(); - throw re; - } - } -} diff --git a/dao/src/main/java/org/thingsboard/server/dao/nosql/ResultSetUtils.java b/dao/src/main/java/org/thingsboard/server/dao/nosql/ResultSetUtils.java new file mode 100644 index 0000000000..bf7116132a --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/nosql/ResultSetUtils.java @@ -0,0 +1,65 @@ +/** + * Copyright © 2016-2020 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.nosql; + +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.datastax.oss.driver.api.core.cql.Row; +import com.google.common.collect.Lists; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.SettableFuture; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.Executor; +import java.util.stream.Collectors; + +public class ResultSetUtils { + + public static ListenableFuture> allRows(AsyncResultSet resultSet, Executor executor) { + List> futures = new ArrayList<>(); + futures.add(Futures.immediateFuture(resultSet)); + while (resultSet.hasMorePages()) { + futures.add(toListenable(resultSet.fetchNextPage())); + } + return Futures.transform( Futures.allAsList(futures), + resultSets -> resultSets.stream() + .map(rs -> loadRows(rs)) + .flatMap(rows -> rows.stream()) + .collect(Collectors.toList()), + executor + ); + } + + private static ListenableFuture toListenable(CompletionStage completable) { + SettableFuture future = SettableFuture.create(); + completable.whenComplete( + (r, ex) -> { + if (ex != null) { + future.setException(ex); + } else { + future.set(r); + } + } + ); + return future; + } + + private static List loadRows(AsyncResultSet resultSet) { + return Lists.newArrayList(resultSet.currentPage()); + } +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java index edc9c97a9a..aef060cd89 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.google.common.collect.Lists; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; @@ -59,7 +59,7 @@ public abstract class JpaAbstractDao, D> setSearchText(entity); log.debug("Saving entity {}", entity); if (entity.getUuid() == null) { - entity.setUuid(UUIDs.timeBased()); + entity.setUuid(Uuids.timeBased()); } entity = getCrudRepository().save(entity); return DaoUtil.getData(entity); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTimeDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTimeDao.java index ac5562898f..5aabc88f75 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTimeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTimeDao.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.springframework.data.jpa.domain.Specification; import org.thingsboard.server.common.data.UUIDConverter; import org.thingsboard.server.common.data.page.TimePageLink; @@ -40,12 +40,12 @@ public abstract class JpaAbstractSearchTimeDao, D> exten public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) { List predicates = new ArrayList<>(); if (pageLink.getStartTime() != null) { - UUID startOf = UUIDs.startOf(pageLink.getStartTime()); + UUID startOf = Uuids.startOf(pageLink.getStartTime()); Predicate lowerBound = criteriaBuilder.greaterThanOrEqualTo(root.get(idColumn), UUIDConverter.fromTimeUUID(startOf)); predicates.add(lowerBound); } if (pageLink.getEndTime() != null) { - UUID endOf = UUIDs.endOf(pageLink.getEndTime()); + UUID endOf = Uuids.endOf(pageLink.getEndTime()); Predicate upperBound = criteriaBuilder.lessThanOrEqualTo(root.get(idColumn), UUIDConverter.fromTimeUUID(endOf)); predicates.add(upperBound); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java index 93f9aead78..35c63ed816 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.component; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; @@ -64,7 +64,7 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao saveIfNotExist(TenantId tenantId, ComponentDescriptor component) { if (component.getId() == null) { - component.setId(new ComponentDescriptorId(UUIDs.timeBased())); + component.setId(new ComponentDescriptorId(Uuids.timeBased())); } if (!componentDescriptorRepository.existsById(UUIDConverter.fromTimeUUID(component.getId().getId()))) { ComponentDescriptorEntity componentDescriptorEntity = new ComponentDescriptorEntity(component); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java index 528229bb33..d2b4fdec8a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.event; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -75,7 +75,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao saveAsync(Event event) { log.debug("Save event [{}] ", event); if (event.getId() == null) { - event.setId(new EventId(UUIDs.timeBased())); + event.setId(new EventId(Uuids.timeBased())); } if (StringUtils.isEmpty(event.getUid())) { event.setUid(event.getId().toString()); @@ -152,7 +152,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao, Optional> { +public class AggregatePartitionsFunction implements com.google.common.util.concurrent.AsyncFunction, Optional> { private static final int LONG_CNT_POS = 0; private static final int DOUBLE_CNT_POS = 1; @@ -52,33 +57,39 @@ public class AggregatePartitionsFunction implements com.google.common.base.Funct private final Aggregation aggregation; private final String key; private final long ts; + private final Executor executor; - public AggregatePartitionsFunction(Aggregation aggregation, String key, long ts) { + public AggregatePartitionsFunction(Aggregation aggregation, String key, long ts, Executor executor) { this.aggregation = aggregation; this.key = key; this.ts = ts; + this.executor = executor; } @Override - public Optional apply(@Nullable List rsList) { - try { - log.trace("[{}][{}][{}] Going to aggregate data", key, ts, aggregation); - if (rsList == null || rsList.isEmpty()) { - return Optional.empty(); - } - - AggregationResult aggResult = new AggregationResult(); - - for (ResultSet rs : rsList) { - for (Row row : rs.all()) { - processResultSetRow(row, aggResult); + public ListenableFuture> apply(@Nullable List rsList) { + log.trace("[{}][{}][{}] Going to aggregate data", key, ts, aggregation); + if (rsList == null || rsList.isEmpty()) { + return Futures.immediateFuture(Optional.empty()); + } + return Futures.transform( + Futures.allAsList( + rsList.stream().map(rs -> ResultSetUtils.allRows(rs, this.executor)) + .collect(Collectors.toList())), + rowsList -> { + try { + AggregationResult aggResult = new AggregationResult(); + for (List rs : rowsList) { + for (Row row : rs) { + processResultSetRow(row, aggResult); + } } + return processAggregationResult(aggResult); + } catch (Exception e) { + log.error("[{}][{}][{}] Failed to aggregate data", key, ts, aggregation, e); + return Optional.empty(); } - return processAggregationResult(aggResult); - } catch (Exception e) { - log.error("[{}][{}][{}] Failed to aggregate data", key, ts, aggregation, e); - return Optional.empty(); - } + }, this.executor); } private void processResultSetRow(Row row, AggregationResult aggResult) { @@ -181,7 +192,7 @@ public class AggregatePartitionsFunction implements com.google.common.base.Funct private Boolean getBooleanValue(Row row) { if (aggregation == Aggregation.MIN || aggregation == Aggregation.MAX) { - return row.getBool(BOOL_POS); + return row.getBoolean(BOOL_POS); } else { return null; //NOSONAR, null is used for further comparison } diff --git a/dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java b/dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java index b96462e350..423e5e1593 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java @@ -15,14 +15,14 @@ */ package org.thingsboard.server.dao.timeseries; -import com.datastax.driver.core.BoundStatement; -import com.datastax.driver.core.PreparedStatement; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.ResultSetFuture; -import com.datastax.driver.core.Row; -import com.datastax.driver.core.Statement; -import com.datastax.driver.core.querybuilder.QueryBuilder; -import com.datastax.driver.core.querybuilder.Select; +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.datastax.oss.driver.api.core.cql.BoundStatement; +import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; +import com.datastax.oss.driver.api.core.cql.Row; +import com.datastax.oss.driver.api.core.cql.Statement; +import com.datastax.oss.driver.api.querybuilder.QueryBuilder; +import com.datastax.oss.driver.api.querybuilder.select.Select; import com.google.common.base.Function; import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.FutureCallback; @@ -52,6 +52,7 @@ import org.thingsboard.server.common.data.kv.StringDataEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.nosql.CassandraAbstractAsyncDao; +import org.thingsboard.server.dao.nosql.TbResultSetFuture; import org.thingsboard.server.dao.util.NoSqlTsDao; import javax.annotation.Nullable; @@ -69,7 +70,7 @@ import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; -import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; +import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.literal; /** * @author Andrew Shvayka @@ -189,8 +190,8 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem if (isFixedPartitioning()) { //no need to fetch partitions from DB return Futures.immediateFuture(FIXED_PARTITION); } - ResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); - return Futures.transform(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); + TbResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); + return Futures.transformAsync(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); } private ListenableFuture> findAllAsyncWithLimit(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { @@ -225,20 +226,41 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem resultFuture.set(cursor.getData()); } else { PreparedStatement proto = getFetchStmt(Aggregation.NONE, cursor.getOrderBy()); - BoundStatement stmt = proto.bind(); - stmt.setString(0, cursor.getEntityType()); - stmt.setUUID(1, cursor.getEntityId()); - stmt.setString(2, cursor.getKey()); - stmt.setLong(3, cursor.getNextPartition()); - stmt.setLong(4, cursor.getStartTs()); - stmt.setLong(5, cursor.getEndTs()); - stmt.setInt(6, cursor.getCurrentLimit()); - - Futures.addCallback(executeAsyncRead(tenantId, stmt), new FutureCallback() { + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(proto.bind()); + + stmtBuilder.setString(0, cursor.getEntityType()); + stmtBuilder.setUuid(1, cursor.getEntityId()); + stmtBuilder.setString(2, cursor.getKey()); + stmtBuilder.setLong(3, cursor.getNextPartition()); + stmtBuilder.setLong(4, cursor.getStartTs()); + stmtBuilder.setLong(5, cursor.getEndTs()); + stmtBuilder.setInt(6, cursor.getCurrentLimit()); + + BoundStatement stmt = stmtBuilder.build(); + + Futures.addCallback(executeAsyncRead(tenantId, stmt), new FutureCallback() { @Override - public void onSuccess(@Nullable ResultSet result) { - cursor.addData(convertResultToTsKvEntryList(result == null ? Collections.emptyList() : result.all())); - findAllAsyncSequentiallyWithLimit(tenantId, cursor, resultFuture); + public void onSuccess(@Nullable AsyncResultSet result) { + if (result == null) { + cursor.addData(convertResultToTsKvEntryList(Collections.emptyList())); + findAllAsyncSequentiallyWithLimit(tenantId, cursor, resultFuture); + } else { + Futures.addCallback(allRows(result), new FutureCallback>() { + + @Override + public void onSuccess(@Nullable List result) { + cursor.addData(convertResultToTsKvEntryList(result == null ? Collections.emptyList() : result)); + findAllAsyncSequentiallyWithLimit(tenantId, cursor, resultFuture); + } + + @Override + public void onFailure(Throwable t) { + log.error("[{}][{}] Failed to fetch data for query {}-{}", stmt, t); + } + }, readResultsProcessingExecutor); + + + } } @Override @@ -256,31 +278,35 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem final long endTs = query.getEndTs(); final long ts = startTs + (endTs - startTs) / 2; ListenableFuture> partitionsListFuture = getPartitionsFuture(tenantId, query, entityId, minPartition, maxPartition); - ListenableFuture> aggregationChunks = Futures.transformAsync(partitionsListFuture, + ListenableFuture> aggregationChunks = Futures.transformAsync(partitionsListFuture, getFetchChunksAsyncFunction(tenantId, entityId, key, aggregation, startTs, endTs), readResultsProcessingExecutor); - return Futures.transform(aggregationChunks, new AggregatePartitionsFunction(aggregation, key, ts), readResultsProcessingExecutor); + return Futures.transformAsync(aggregationChunks, new AggregatePartitionsFunction(aggregation, key, ts, readResultsProcessingExecutor), readResultsProcessingExecutor); } - private Function> getPartitionsArrayFunction() { - return rows -> rows.all().stream() - .map(row -> row.getLong(ModelConstants.PARTITION_COLUMN)).collect(Collectors.toList()); + private AsyncFunction> getPartitionsArrayFunction() { + return rs -> + Futures.transform(allRows(rs), rows -> + rows.stream() + .map(row -> row.getLong(ModelConstants.PARTITION_COLUMN)).collect(Collectors.toList()), + readResultsProcessingExecutor); } - private AsyncFunction, List> getFetchChunksAsyncFunction(TenantId tenantId, EntityId entityId, String key, Aggregation aggregation, long startTs, long endTs) { + private AsyncFunction, List> getFetchChunksAsyncFunction(TenantId tenantId, EntityId entityId, String key, Aggregation aggregation, long startTs, long endTs) { return partitions -> { try { PreparedStatement proto = getFetchStmt(aggregation, DESC_ORDER); - List futures = new ArrayList<>(partitions.size()); + List futures = new ArrayList<>(partitions.size()); for (Long partition : partitions) { log.trace("Fetching data for partition [{}] for entityType {} and entityId {}", partition, entityId.getEntityType(), entityId.getId()); - BoundStatement stmt = proto.bind(); - stmt.setString(0, entityId.getEntityType().name()); - stmt.setUUID(1, entityId.getId()); - stmt.setString(2, key); - stmt.setLong(3, partition); - stmt.setLong(4, startTs); - stmt.setLong(5, endTs); + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(proto.bind()); + stmtBuilder.setString(0, entityId.getEntityType().name()); + stmtBuilder.setUuid(1, entityId.getId()); + stmtBuilder.setString(2, key); + stmtBuilder.setLong(3, partition); + stmtBuilder.setLong(4, startTs); + stmtBuilder.setLong(5, endTs); + BoundStatement stmt = stmtBuilder.build(); log.debug(GENERATED_QUERY_FOR_ENTITY_TYPE_AND_ENTITY_ID, stmt, entityId.getEntityType(), entityId.getId()); futures.add(executeAsyncRead(tenantId, stmt)); } @@ -294,21 +320,23 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem @Override public ListenableFuture findLatest(TenantId tenantId, EntityId entityId, String key) { - BoundStatement stmt = getFindLatestStmt().bind(); - stmt.setString(0, entityId.getEntityType().name()); - stmt.setUUID(1, entityId.getId()); - stmt.setString(2, key); + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(getFindLatestStmt().bind()); + stmtBuilder.setString(0, entityId.getEntityType().name()); + stmtBuilder.setUuid(1, entityId.getId()); + stmtBuilder.setString(2, key); + BoundStatement stmt = stmtBuilder.build(); log.debug(GENERATED_QUERY_FOR_ENTITY_TYPE_AND_ENTITY_ID, stmt, entityId.getEntityType(), entityId.getId()); return getFuture(executeAsyncRead(tenantId, stmt), rs -> convertResultToTsKvEntry(key, rs.one())); } @Override public ListenableFuture> findAllLatest(TenantId tenantId, EntityId entityId) { - BoundStatement stmt = getFindAllLatestStmt().bind(); - stmt.setString(0, entityId.getEntityType().name()); - stmt.setUUID(1, entityId.getId()); + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(getFindAllLatestStmt().bind()); + stmtBuilder.setString(0, entityId.getEntityType().name()); + stmtBuilder.setUuid(1, entityId.getId()); + BoundStatement stmt = stmtBuilder.build(); log.debug(GENERATED_QUERY_FOR_ENTITY_TYPE_AND_ENTITY_ID, stmt, entityId.getEntityType(), entityId.getId()); - return getFuture(executeAsyncRead(tenantId, stmt), rs -> convertResultToTsKvEntryList(rs.all())); + return getFutureAsync(executeAsyncRead(tenantId, stmt), rs -> convertAsyncResultSetToTsKvEntryList(rs)); } @Override @@ -320,16 +348,17 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem if (setNullValuesEnabled) { processSetNullValues(tenantId, entityId, tsKvEntry, ttl, futures, partition, type); } - BoundStatement stmt = (ttl == 0 ? getSaveStmt(type) : getSaveTtlStmt(type)).bind(); - stmt.setString(0, entityId.getEntityType().name()) - .setUUID(1, entityId.getId()) + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder((ttl == 0 ? getSaveStmt(type) : getSaveTtlStmt(type)).bind()); + stmtBuilder.setString(0, entityId.getEntityType().name()) + .setUuid(1, entityId.getId()) .setString(2, tsKvEntry.getKey()) .setLong(3, partition) .setLong(4, tsKvEntry.getTs()); - addValue(tsKvEntry, stmt, 5); + addValue(tsKvEntry, stmtBuilder, 5); if (ttl > 0) { - stmt.setInt(6, (int) ttl); + stmtBuilder.setInt(6, (int) ttl); } + BoundStatement stmt = stmtBuilder.build(); futures.add(getFuture(executeAsyncWrite(tenantId, stmt), rs -> null)); return Futures.transform(Futures.allAsList(futures), result -> null, MoreExecutors.directExecutor()); } @@ -370,16 +399,17 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem } private ListenableFuture saveNull(TenantId tenantId, EntityId entityId, TsKvEntry tsKvEntry, long ttl, long partition, DataType type) { - BoundStatement stmt = (ttl == 0 ? getSaveStmt(type) : getSaveTtlStmt(type)).bind(); - stmt.setString(0, entityId.getEntityType().name()) - .setUUID(1, entityId.getId()) + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder((ttl == 0 ? getSaveStmt(type) : getSaveTtlStmt(type)).bind()); + stmtBuilder.setString(0, entityId.getEntityType().name()) + .setUuid(1, entityId.getId()) .setString(2, tsKvEntry.getKey()) .setLong(3, partition) .setLong(4, tsKvEntry.getTs()); - stmt.setToNull(getColumnName(type)); + stmtBuilder.setToNull(getColumnName(type)); if (ttl > 0) { - stmt.setInt(6, (int) ttl); + stmtBuilder.setInt(6, (int) ttl); } + BoundStatement stmt = stmtBuilder.build(); return getFuture(executeAsyncWrite(tenantId, stmt), rs -> null); } @@ -391,14 +421,15 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem ttl = computeTtl(ttl); long partition = toPartitionTs(tsKvEntryTs); log.debug("Saving partition {} for the entity [{}-{}] and key {}", partition, entityId.getEntityType(), entityId.getId(), key); - BoundStatement stmt = (ttl == 0 ? getPartitionInsertStmt() : getPartitionInsertTtlStmt()).bind(); - stmt = stmt.setString(0, entityId.getEntityType().name()) - .setUUID(1, entityId.getId()) + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder((ttl == 0 ? getPartitionInsertStmt() : getPartitionInsertTtlStmt()).bind()); + stmtBuilder.setString(0, entityId.getEntityType().name()) + .setUuid(1, entityId.getId()) .setLong(2, partition) .setString(3, key); if (ttl > 0) { - stmt.setInt(4, (int) ttl); + stmtBuilder.setInt(4, (int) ttl); } + BoundStatement stmt = stmtBuilder.build(); return getFuture(executeAsyncWrite(tenantId, stmt), rs -> null); } @@ -415,9 +446,9 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem @Override public ListenableFuture saveLatest(TenantId tenantId, EntityId entityId, TsKvEntry tsKvEntry) { - BoundStatement stmt = getLatestStmt().bind() - .setString(0, entityId.getEntityType().name()) - .setUUID(1, entityId.getId()) + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(getLatestStmt().bind()); + stmtBuilder.setString(0, entityId.getEntityType().name()) + .setUuid(1, entityId.getId()) .setString(2, tsKvEntry.getKey()) .setLong(3, tsKvEntry.getTs()) .set(4, tsKvEntry.getBooleanValue().orElse(null), Boolean.class) @@ -426,10 +457,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem .set(7, tsKvEntry.getDoubleValue().orElse(null), Double.class); Optional jsonV = tsKvEntry.getJsonValue(); if (jsonV.isPresent()) { - stmt.setString(8, tsKvEntry.getJsonValue().get()); + stmtBuilder.setString(8, tsKvEntry.getJsonValue().get()); } else { - stmt.setToNull(8); + stmtBuilder.setToNull(8); } + BoundStatement stmt = stmtBuilder.build(); return getFuture(executeAsyncWrite(tenantId, stmt), rs -> null); } @@ -439,10 +471,10 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem long minPartition = toPartitionTs(query.getStartTs()); long maxPartition = toPartitionTs(query.getEndTs()); - ResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); + TbResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); final SimpleListenableFuture resultFuture = new SimpleListenableFuture<>(); - final ListenableFuture> partitionsListFuture = Futures.transform(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); + final ListenableFuture> partitionsListFuture = Futures.transformAsync(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); Futures.addCallback(partitionsListFuture, new FutureCallback>() { @Override @@ -464,17 +496,19 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem resultFuture.set(null); } else { PreparedStatement proto = getDeleteStmt(); - BoundStatement stmt = proto.bind(); - stmt.setString(0, cursor.getEntityType()); - stmt.setUUID(1, cursor.getEntityId()); - stmt.setString(2, cursor.getKey()); - stmt.setLong(3, cursor.getNextPartition()); - stmt.setLong(4, cursor.getStartTs()); - stmt.setLong(5, cursor.getEndTs()); - - Futures.addCallback(executeAsyncWrite(tenantId, stmt), new FutureCallback() { + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(proto.bind()); + stmtBuilder.setString(0, cursor.getEntityType()); + stmtBuilder.setUuid(1, cursor.getEntityId()); + stmtBuilder.setString(2, cursor.getKey()); + stmtBuilder.setLong(3, cursor.getNextPartition()); + stmtBuilder.setLong(4, cursor.getStartTs()); + stmtBuilder.setLong(5, cursor.getEndTs()); + + BoundStatement stmt = stmtBuilder.build(); + + Futures.addCallback(executeAsyncWrite(tenantId, stmt), new FutureCallback() { @Override - public void onSuccess(@Nullable ResultSet result) { + public void onSuccess(@Nullable AsyncResultSet result) { deleteAsync(tenantId, cursor, resultFuture); } @@ -568,10 +602,10 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem } private ListenableFuture deleteLatest(TenantId tenantId, EntityId entityId, String key) { - Statement delete = QueryBuilder.delete().all().from(ModelConstants.TS_KV_LATEST_CF) - .where(eq(ModelConstants.ENTITY_TYPE_COLUMN, entityId.getEntityType())) - .and(eq(ModelConstants.ENTITY_ID_COLUMN, entityId.getId())) - .and(eq(ModelConstants.KEY_COLUMN, key)); + Statement delete = QueryBuilder.deleteFrom(ModelConstants.TS_KV_LATEST_CF) + .whereColumn(ModelConstants.ENTITY_TYPE_COLUMN).isEqualTo(literal(entityId.getEntityType().name())) + .whereColumn(ModelConstants.ENTITY_ID_COLUMN).isEqualTo(literal(entityId.getId())) + .whereColumn(ModelConstants.KEY_COLUMN).isEqualTo(literal(key)).build(); log.debug("Remove request: {}", delete.toString()); return getFuture(executeAsyncWrite(tenantId, delete), rs -> null); } @@ -583,10 +617,10 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem if (minPartition == maxPartition) { return Futures.immediateFuture(null); } else { - ResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); + TbResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); final SimpleListenableFuture resultFuture = new SimpleListenableFuture<>(); - final ListenableFuture> partitionsListFuture = Futures.transform(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); + final ListenableFuture> partitionsListFuture = Futures.transformAsync(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); Futures.addCallback(partitionsListFuture, new FutureCallback>() { @Override @@ -617,15 +651,17 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem resultFuture.set(null); } else { PreparedStatement proto = getDeletePartitionStmt(); - BoundStatement stmt = proto.bind(); - stmt.setString(0, cursor.getEntityType()); - stmt.setUUID(1, cursor.getEntityId()); - stmt.setLong(2, cursor.getNextPartition()); - stmt.setString(3, cursor.getKey()); + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(proto.bind()); + stmtBuilder.setString(0, cursor.getEntityType()); + stmtBuilder.setUuid(1, cursor.getEntityId()); + stmtBuilder.setLong(2, cursor.getNextPartition()); + stmtBuilder.setString(3, cursor.getKey()); - Futures.addCallback(executeAsyncWrite(tenantId, stmt), new FutureCallback() { + BoundStatement stmt = stmtBuilder.build(); + + Futures.addCallback(executeAsyncWrite(tenantId, stmt), new FutureCallback() { @Override - public void onSuccess(@Nullable ResultSet result) { + public void onSuccess(@Nullable AsyncResultSet result) { deletePartitionAsync(tenantId, cursor, resultFuture); } @@ -648,6 +684,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem return deletePartitionStmt; } + private ListenableFuture> convertAsyncResultSetToTsKvEntryList(AsyncResultSet rs) { + return Futures.transform(this.allRows(rs), + rows -> this.convertResultToTsKvEntryList(rows), readResultsProcessingExecutor); + } + private List convertResultToTsKvEntryList(List rows) { List entries = new ArrayList<>(rows.size()); if (!rows.isEmpty()) { @@ -706,12 +747,14 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem * Select existing partitions from the table * {@link ModelConstants#TS_KV_PARTITIONS_CF} for the given entity */ - private ResultSetFuture fetchPartitions(TenantId tenantId, EntityId entityId, String key, long minPartition, long maxPartition) { - Select.Where select = QueryBuilder.select(ModelConstants.PARTITION_COLUMN).from(ModelConstants.TS_KV_PARTITIONS_CF).where(eq(ModelConstants.ENTITY_TYPE_COLUMN, entityId.getEntityType().name())) - .and(eq(ModelConstants.ENTITY_ID_COLUMN, entityId.getId())).and(eq(ModelConstants.KEY_COLUMN, key)); - select.and(QueryBuilder.gte(ModelConstants.PARTITION_COLUMN, minPartition)); - select.and(QueryBuilder.lte(ModelConstants.PARTITION_COLUMN, maxPartition)); - return executeAsyncRead(tenantId, select); + private TbResultSetFuture fetchPartitions(TenantId tenantId, EntityId entityId, String key, long minPartition, long maxPartition) { + Select select = QueryBuilder.selectFrom(ModelConstants.TS_KV_PARTITIONS_CF).column(ModelConstants.PARTITION_COLUMN) + .whereColumn(ModelConstants.ENTITY_TYPE_COLUMN).isEqualTo(literal(entityId.getEntityType().name())) + .whereColumn(ModelConstants.ENTITY_ID_COLUMN).isEqualTo(literal(entityId.getId())) + .whereColumn(ModelConstants.KEY_COLUMN).isEqualTo(literal(key)) + .whereColumn(ModelConstants.PARTITION_COLUMN).isGreaterThanOrEqualTo(literal(minPartition)) + .whereColumn(ModelConstants.PARTITION_COLUMN).isLessThanOrEqualTo(literal(maxPartition)); + return executeAsyncRead(tenantId, select.build()); } private PreparedStatement getSaveStmt(DataType dataType) { @@ -882,11 +925,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem } } - private static void addValue(KvEntry kvEntry, BoundStatement stmt, int column) { + private static void addValue(KvEntry kvEntry, BoundStatementBuilder stmt, int column) { switch (kvEntry.getDataType()) { case BOOLEAN: Optional booleanValue = kvEntry.getBooleanValue(); - booleanValue.ifPresent(b -> stmt.setBool(column, b)); + booleanValue.ifPresent(b -> stmt.setBoolean(column, b)); break; case STRING: Optional stringValue = kvEntry.getStrValue(); diff --git a/dao/src/main/java/org/thingsboard/server/dao/util/AbstractBufferedRateExecutor.java b/dao/src/main/java/org/thingsboard/server/dao/util/AbstractBufferedRateExecutor.java index ea8d4b6fa1..77f38952bc 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/util/AbstractBufferedRateExecutor.java +++ b/dao/src/main/java/org/thingsboard/server/dao/util/AbstractBufferedRateExecutor.java @@ -15,7 +15,14 @@ */ package org.thingsboard.server.dao.util; -import com.datastax.driver.core.*; +import com.datastax.oss.driver.api.core.ProtocolVersion; +import com.datastax.oss.driver.api.core.cql.BoundStatement; +import com.datastax.oss.driver.api.core.cql.ColumnDefinition; +import com.datastax.oss.driver.api.core.cql.ColumnDefinitions; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; +import com.datastax.oss.driver.api.core.type.DataType; +import com.datastax.oss.driver.api.core.type.codec.TypeCodec; +import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -212,7 +219,7 @@ public abstract class AbstractBufferedRateExecutor codec = codecRegistry.codecFor(type); if (boundStatement.getBytesUnsafe(index) != null) { - Object value = codec.deserialize(boundStatement.getBytesUnsafe(index), protocolVersion); + Object value = codec.decode(boundStatement.getBytesUnsafe(index), protocolVersion); String replacement = Matcher.quoteReplacement(codec.format(value)); query = query.replaceFirst("\\?", replacement); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/CustomCassandraCQLUnit.java b/dao/src/test/java/org/thingsboard/server/dao/CustomCassandraCQLUnit.java index b3cdec4192..8b984bcd01 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/CustomCassandraCQLUnit.java +++ b/dao/src/test/java/org/thingsboard/server/dao/CustomCassandraCQLUnit.java @@ -15,8 +15,7 @@ */ package org.thingsboard.server.dao; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.Session; +import com.datastax.oss.driver.api.core.CqlSession; import org.cassandraunit.BaseCassandraUnit; import org.cassandraunit.CQLDataLoader; import org.cassandraunit.dataset.CQLDataSet; @@ -27,8 +26,7 @@ import java.util.List; public class CustomCassandraCQLUnit extends BaseCassandraUnit { protected List dataSets; - public Session session; - public Cluster cluster; + public CqlSession session; public CustomCassandraCQLUnit(List dataSets) { this.dataSets = dataSets; @@ -65,11 +63,7 @@ public class CustomCassandraCQLUnit extends BaseCassandraUnit { @Override protected void load() { - String hostIp = EmbeddedCassandraServerHelper.getHost(); - int port = EmbeddedCassandraServerHelper.getNativeTransportPort(); - cluster = new Cluster.Builder().addContactPoints(hostIp).withPort(port).withSocketOptions(getSocketOptions()) - .build(); - session = cluster.connect(); + session = EmbeddedCassandraServerHelper.getSession(); CQLDataLoader dataLoader = new CQLDataLoader(session); dataSets.forEach(dataLoader::load); session = dataLoader.getSession(); @@ -79,20 +73,16 @@ public class CustomCassandraCQLUnit extends BaseCassandraUnit { @Override protected void after() { super.after(); - try (Cluster c = cluster; Session s = session) { + try (CqlSession s = session) { session = null; - cluster = null; } System.setSecurityManager(null); } // Getters for those who do not like to directly access fields - public Session getSession() { + public CqlSession getSession() { return session; } - public Cluster getCluster() { - return cluster; - } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFutureTest.java b/dao/src/test/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFutureTest.java deleted file mode 100644 index bb4a08a8f1..0000000000 --- a/dao/src/test/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFutureTest.java +++ /dev/null @@ -1,195 +0,0 @@ -/** - * Copyright © 2016-2020 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.nosql; - -import com.datastax.driver.core.ProtocolVersion; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.ResultSetFuture; -import com.datastax.driver.core.Row; -import com.datastax.driver.core.Session; -import com.datastax.driver.core.Statement; -import com.datastax.driver.core.exceptions.UnsupportedFeatureException; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.MoreExecutors; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.runners.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; -import org.thingsboard.server.dao.exception.BufferLimitException; -import org.thingsboard.server.dao.util.AsyncRateLimiter; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeoutException; - -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class RateLimitedResultSetFutureTest { - - private RateLimitedResultSetFuture resultSetFuture; - - @Mock - private AsyncRateLimiter rateLimiter; - @Mock - private Session session; - @Mock - private Statement statement; - @Mock - private ResultSetFuture realFuture; - @Mock - private ResultSet rows; - @Mock - private Row row; - - @Test - public void doNotReleasePermissionIfRateLimitFutureFailed() throws InterruptedException { - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFailedFuture(new BufferLimitException())); - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - Thread.sleep(1000L); - verify(rateLimiter).acquireAsync(); - try { - assertTrue(resultSetFuture.isDone()); - fail(); - } catch (Exception e) { - assertTrue(e instanceof IllegalStateException); - Throwable actualCause = e.getCause(); - assertTrue(actualCause instanceof ExecutionException); - } - verifyNoMoreInteractions(session, rateLimiter, statement); - - } - - @Test - public void getUninterruptiblyDelegateToCassandra() throws InterruptedException, ExecutionException { - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFuture(null)); - when(session.executeAsync(statement)).thenReturn(realFuture); - Mockito.doAnswer((Answer) invocation -> { - Object[] args = invocation.getArguments(); - Runnable task = (Runnable) args[0]; - task.run(); - return null; - }).when(realFuture).addListener(Mockito.any(), Mockito.any()); - - when(realFuture.getUninterruptibly()).thenReturn(rows); - - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - ResultSet actual = resultSetFuture.getUninterruptibly(); - assertSame(rows, actual); - verify(rateLimiter, times(1)).acquireAsync(); - verify(rateLimiter, times(1)).release(); - } - - @Test - public void addListenerAllowsFutureTransformation() throws InterruptedException, ExecutionException { - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFuture(null)); - when(session.executeAsync(statement)).thenReturn(realFuture); - Mockito.doAnswer((Answer) invocation -> { - Object[] args = invocation.getArguments(); - Runnable task = (Runnable) args[0]; - task.run(); - return null; - }).when(realFuture).addListener(Mockito.any(), Mockito.any()); - - when(realFuture.get()).thenReturn(rows); - when(rows.one()).thenReturn(row); - - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - - ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); - Row actualRow = transform.get(); - - assertSame(row, actualRow); - verify(rateLimiter, times(1)).acquireAsync(); - verify(rateLimiter, times(1)).release(); - } - - @Test - public void immidiateCassandraExceptionReturnsPermit() throws InterruptedException, ExecutionException { - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFuture(null)); - when(session.executeAsync(statement)).thenThrow(new UnsupportedFeatureException(ProtocolVersion.V3, "hjg")); - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); - try { - transform.get(); - fail(); - } catch (Exception e) { - assertTrue(e instanceof ExecutionException); - } - verify(rateLimiter, times(1)).acquireAsync(); - verify(rateLimiter, times(1)).release(); - } - - @Test - public void queryTimeoutReturnsPermit() throws InterruptedException, ExecutionException { - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFuture(null)); - when(session.executeAsync(statement)).thenReturn(realFuture); - Mockito.doAnswer((Answer) invocation -> { - Object[] args = invocation.getArguments(); - Runnable task = (Runnable) args[0]; - task.run(); - return null; - }).when(realFuture).addListener(Mockito.any(), Mockito.any()); - - when(realFuture.get()).thenThrow(new ExecutionException("Fail", new TimeoutException("timeout"))); - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); - try { - transform.get(); - fail(); - } catch (Exception e) { - assertTrue(e instanceof ExecutionException); - } - verify(rateLimiter, times(1)).acquireAsync(); - verify(rateLimiter, times(1)).release(); - } - - @Test - public void expiredQueryReturnPermit() throws InterruptedException, ExecutionException { - CountDownLatch latch = new CountDownLatch(1); - ListenableFuture future = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(1)).submit(() -> { - latch.await(); - return null; - }); - when(rateLimiter.acquireAsync()).thenReturn(future); - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - - ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); -// TimeUnit.MILLISECONDS.sleep(200); - future.cancel(false); - latch.countDown(); - - try { - transform.get(); - fail(); - } catch (Exception e) { - assertTrue(e instanceof ExecutionException); - } - verify(rateLimiter, times(1)).acquireAsync(); - verify(rateLimiter, times(1)).release(); - } - -} \ No newline at end of file diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java index 343b2074fd..8094e144ec 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.runner.RunWith; @@ -134,7 +134,7 @@ public abstract class AbstractServiceTest { protected Event generateEvent(TenantId tenantId, EntityId entityId, String eventType, String eventUid) throws IOException { if (tenantId == null) { - tenantId = new TenantId(UUIDs.timeBased()); + tenantId = new TenantId(Uuids.timeBased()); } Event event = new Event(); event.setTenantId(tenantId); diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java index 6a994eda1a..5d494546c9 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -59,8 +59,8 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { @Test public void testSaveAndFetchAlarm() throws ExecutionException, InterruptedException { - AssetId parentId = new AssetId(UUIDs.timeBased()); - AssetId childId = new AssetId(UUIDs.timeBased()); + AssetId parentId = new AssetId(Uuids.timeBased()); + AssetId childId = new AssetId(Uuids.timeBased()); EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); @@ -96,8 +96,8 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { @Test public void testFindAlarm() throws ExecutionException, InterruptedException { - AssetId parentId = new AssetId(UUIDs.timeBased()); - AssetId childId = new AssetId(UUIDs.timeBased()); + AssetId parentId = new AssetId(Uuids.timeBased()); + AssetId childId = new AssetId(Uuids.timeBased()); EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); @@ -197,8 +197,8 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { @Test public void testDeleteAlarm() throws ExecutionException, InterruptedException { - AssetId parentId = new AssetId(UUIDs.timeBased()); - AssetId childId = new AssetId(UUIDs.timeBased()); + AssetId parentId = new AssetId(Uuids.timeBased()); + AssetId childId = new AssetId(Uuids.timeBased()); EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAssetServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAssetServiceTest.java index d3819e48d5..65cd2c1536 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAssetServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAssetServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.junit.Assert; @@ -104,7 +104,7 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest { Asset asset = new Asset(); asset.setName("My asset"); asset.setType("default"); - asset.setTenantId(new TenantId(UUIDs.timeBased())); + asset.setTenantId(new TenantId(Uuids.timeBased())); assetService.saveAsset(asset); } @@ -116,7 +116,7 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest { asset.setTenantId(tenantId); asset = assetService.saveAsset(asset); try { - assetService.assignAssetToCustomer(tenantId, asset.getId(), new CustomerId(UUIDs.timeBased())); + assetService.assignAssetToCustomer(tenantId, asset.getId(), new CustomerId(Uuids.timeBased())); } finally { assetService.deleteAsset(tenantId, asset.getId()); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseCustomerServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseCustomerServiceTest.java index a830920791..36e8aeb702 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseCustomerServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseCustomerServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.junit.Assert; @@ -105,7 +105,7 @@ public abstract class BaseCustomerServiceTest extends AbstractServiceTest { public void testSaveCustomerWithInvalidTenant() { Customer customer = new Customer(); customer.setTitle("My customer"); - customer.setTenantId(new TenantId(UUIDs.timeBased())); + customer.setTenantId(new TenantId(Uuids.timeBased())); customerService.saveCustomer(customer); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseDashboardServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseDashboardServiceTest.java index 33adbdf848..e6a7528c96 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseDashboardServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseDashboardServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.junit.Assert; @@ -98,7 +98,7 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest { public void testSaveDashboardWithInvalidTenant() { Dashboard dashboard = new Dashboard(); dashboard.setTitle("My dashboard"); - dashboard.setTenantId(new TenantId(UUIDs.timeBased())); + dashboard.setTenantId(new TenantId(Uuids.timeBased())); dashboardService.saveDashboard(dashboard); } @@ -109,7 +109,7 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest { dashboard.setTenantId(tenantId); dashboard = dashboardService.saveDashboard(dashboard); try { - dashboardService.assignDashboardToCustomer(tenantId, dashboard.getId(), new CustomerId(UUIDs.timeBased())); + dashboardService.assignDashboardToCustomer(tenantId, dashboard.getId(), new CustomerId(Uuids.timeBased())); } finally { dashboardService.deleteDashboard(tenantId, dashboard.getId()); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceCredentialsServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceCredentialsServiceTest.java index f014f80d29..aed6a509b7 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceCredentialsServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceCredentialsServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -109,7 +109,7 @@ public abstract class BaseDeviceCredentialsServiceTest extends AbstractServiceTe device.setTenantId(tenantId); device = deviceService.saveDevice(device); DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); - DeviceCredentials newDeviceCredentials = new DeviceCredentials(new DeviceCredentialsId(UUIDs.timeBased())); + DeviceCredentials newDeviceCredentials = new DeviceCredentials(new DeviceCredentialsId(Uuids.timeBased())); newDeviceCredentials.setCreatedTime(deviceCredentials.getCreatedTime()); newDeviceCredentials.setDeviceId(deviceCredentials.getDeviceId()); newDeviceCredentials.setCredentialsType(deviceCredentials.getCredentialsType()); @@ -129,7 +129,7 @@ public abstract class BaseDeviceCredentialsServiceTest extends AbstractServiceTe device.setTenantId(tenantId); device = deviceService.saveDevice(device); DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); - deviceCredentials.setDeviceId(new DeviceId(UUIDs.timeBased())); + deviceCredentials.setDeviceId(new DeviceId(Uuids.timeBased())); try { deviceCredentialsService.updateDeviceCredentials(tenantId, deviceCredentials); } finally { diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceServiceTest.java index e9b0db2b44..149e78a341 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.junit.Assert; @@ -110,7 +110,7 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest { Device device = new Device(); device.setName("My device"); device.setType("default"); - device.setTenantId(new TenantId(UUIDs.timeBased())); + device.setTenantId(new TenantId(Uuids.timeBased())); deviceService.saveDevice(device); } @@ -122,7 +122,7 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest { device.setTenantId(tenantId); device = deviceService.saveDevice(device); try { - deviceService.assignDeviceToCustomer(tenantId, device.getId(), new CustomerId(UUIDs.timeBased())); + deviceService.assignDeviceToCustomer(tenantId, device.getId(), new CustomerId(Uuids.timeBased())); } finally { deviceService.deleteDevice(tenantId, device.getId()); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java index 928bd40f77..5e05e6cf81 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -47,8 +47,8 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test public void testSaveRelation() throws ExecutionException, InterruptedException { - AssetId parentId = new AssetId(UUIDs.timeBased()); - AssetId childId = new AssetId(UUIDs.timeBased()); + AssetId parentId = new AssetId(Uuids.timeBased()); + AssetId childId = new AssetId(Uuids.timeBased()); EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); @@ -65,9 +65,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test public void testDeleteRelation() throws ExecutionException, InterruptedException { - AssetId parentId = new AssetId(UUIDs.timeBased()); - AssetId childId = new AssetId(UUIDs.timeBased()); - AssetId subChildId = new AssetId(UUIDs.timeBased()); + AssetId parentId = new AssetId(Uuids.timeBased()); + AssetId childId = new AssetId(Uuids.timeBased()); + AssetId subChildId = new AssetId(Uuids.timeBased()); EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); @@ -86,9 +86,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test public void testDeleteEntityRelations() throws ExecutionException, InterruptedException { - AssetId parentId = new AssetId(UUIDs.timeBased()); - AssetId childId = new AssetId(UUIDs.timeBased()); - AssetId subChildId = new AssetId(UUIDs.timeBased()); + AssetId parentId = new AssetId(Uuids.timeBased()); + AssetId childId = new AssetId(Uuids.timeBased()); + AssetId subChildId = new AssetId(Uuids.timeBased()); EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); @@ -105,10 +105,10 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test public void testFindFrom() throws ExecutionException, InterruptedException { - AssetId parentA = new AssetId(UUIDs.timeBased()); - AssetId parentB = new AssetId(UUIDs.timeBased()); - AssetId childA = new AssetId(UUIDs.timeBased()); - AssetId childB = new AssetId(UUIDs.timeBased()); + AssetId parentA = new AssetId(Uuids.timeBased()); + AssetId parentB = new AssetId(Uuids.timeBased()); + AssetId childA = new AssetId(Uuids.timeBased()); + AssetId childB = new AssetId(Uuids.timeBased()); EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); @@ -157,10 +157,10 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test public void testFindTo() throws ExecutionException, InterruptedException { - AssetId parentA = new AssetId(UUIDs.timeBased()); - AssetId parentB = new AssetId(UUIDs.timeBased()); - AssetId childA = new AssetId(UUIDs.timeBased()); - AssetId childB = new AssetId(UUIDs.timeBased()); + AssetId parentA = new AssetId(Uuids.timeBased()); + AssetId parentB = new AssetId(Uuids.timeBased()); + AssetId childA = new AssetId(Uuids.timeBased()); + AssetId childB = new AssetId(Uuids.timeBased()); EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); @@ -207,9 +207,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test public void testCyclicRecursiveRelation() throws ExecutionException, InterruptedException { // A -> B -> C -> A - AssetId assetA = new AssetId(UUIDs.timeBased()); - AssetId assetB = new AssetId(UUIDs.timeBased()); - AssetId assetC = new AssetId(UUIDs.timeBased()); + AssetId assetA = new AssetId(Uuids.timeBased()); + AssetId assetB = new AssetId(Uuids.timeBased()); + AssetId assetC = new AssetId(Uuids.timeBased()); EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); EntityRelation relationB = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); @@ -239,10 +239,10 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test public void testRecursiveRelation() throws ExecutionException, InterruptedException { // A -> B -> [C,D] - AssetId assetA = new AssetId(UUIDs.timeBased()); - AssetId assetB = new AssetId(UUIDs.timeBased()); - AssetId assetC = new AssetId(UUIDs.timeBased()); - DeviceId deviceD = new DeviceId(UUIDs.timeBased()); + AssetId assetA = new AssetId(Uuids.timeBased()); + AssetId assetB = new AssetId(Uuids.timeBased()); + AssetId assetC = new AssetId(Uuids.timeBased()); + DeviceId deviceD = new DeviceId(Uuids.timeBased()); EntityRelation relationAB = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); EntityRelation relationBC = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); @@ -272,7 +272,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test(expected = DataValidationException.class) public void testSaveRelationWithEmptyFrom() throws ExecutionException, InterruptedException { EntityRelation relation = new EntityRelation(); - relation.setTo(new AssetId(UUIDs.timeBased())); + relation.setTo(new AssetId(Uuids.timeBased())); relation.setType(EntityRelation.CONTAINS_TYPE); Assert.assertTrue(saveRelation(relation)); } @@ -280,7 +280,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test(expected = DataValidationException.class) public void testSaveRelationWithEmptyTo() throws ExecutionException, InterruptedException { EntityRelation relation = new EntityRelation(); - relation.setFrom(new AssetId(UUIDs.timeBased())); + relation.setFrom(new AssetId(Uuids.timeBased())); relation.setType(EntityRelation.CONTAINS_TYPE); Assert.assertTrue(saveRelation(relation)); } @@ -288,8 +288,8 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { @Test(expected = DataValidationException.class) public void testSaveRelationWithEmptyType() throws ExecutionException, InterruptedException { EntityRelation relation = new EntityRelation(); - relation.setFrom(new AssetId(UUIDs.timeBased())); - relation.setTo(new AssetId(UUIDs.timeBased())); + relation.setFrom(new AssetId(Uuids.timeBased())); + relation.setTo(new AssetId(Uuids.timeBased())); Assert.assertTrue(saveRelation(relation)); } } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java index 12d900783b..0593d72490 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; @@ -94,7 +94,7 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest { public void testSaveRuleChainWithInvalidTenant() { RuleChain ruleChain = new RuleChain(); ruleChain.setName("My RuleChain"); - ruleChain.setTenantId(new TenantId(UUIDs.timeBased())); + ruleChain.setTenantId(new TenantId(Uuids.timeBased())); ruleChainService.saveRuleChain(ruleChain); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetTypeServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetTypeServiceTest.java index 8254a3ebf3..227033cfe6 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetTypeServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetTypeServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.After; @@ -141,7 +141,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest { WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle); WidgetType widgetType = new WidgetType(); - widgetType.setTenantId(new TenantId(UUIDs.timeBased())); + widgetType.setTenantId(new TenantId(Uuids.timeBased())); widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setName("Widget Type"); widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetsBundleServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetsBundleServiceTest.java index 88f17fefbb..7860615a84 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetsBundleServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetsBundleServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -88,7 +88,7 @@ public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest { public void testSaveWidgetsBundleWithInvalidTenant() { WidgetsBundle widgetsBundle = new WidgetsBundle(); widgetsBundle.setTitle("My widgets bundle"); - widgetsBundle.setTenantId(new TenantId(UUIDs.timeBased())); + widgetsBundle.setTenantId(new TenantId(Uuids.timeBased())); widgetsBundleService.saveWidgetsBundle(widgetsBundle); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/attributes/BaseAttributesServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/attributes/BaseAttributesServiceTest.java index 2ddac24520..16535915fc 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/attributes/BaseAttributesServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/attributes/BaseAttributesServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service.attributes; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -47,7 +47,7 @@ public abstract class BaseAttributesServiceTest extends AbstractServiceTest { @Test public void saveAndFetch() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); KvEntry attrValue = new StringDataEntry("attribute1", "value1"); AttributeKvEntry attr = new BaseAttributeKvEntry(attrValue, 42L); attributesService.save(SYSTEM_TENANT_ID, deviceId, DataConstants.CLIENT_SCOPE, Collections.singletonList(attr)).get(); @@ -58,7 +58,7 @@ public abstract class BaseAttributesServiceTest extends AbstractServiceTest { @Test public void saveMultipleTypeAndFetch() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); KvEntry attrOldValue = new StringDataEntry("attribute1", "value1"); AttributeKvEntry attrOld = new BaseAttributeKvEntry(attrOldValue, 42L); @@ -78,7 +78,7 @@ public abstract class BaseAttributesServiceTest extends AbstractServiceTest { @Test public void findAll() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); KvEntry attrAOldValue = new StringDataEntry("A", "value1"); AttributeKvEntry attrAOld = new BaseAttributeKvEntry(attrAOldValue, 42L); diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/event/BaseEventServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/event/BaseEventServiceTest.java index f6c0420576..7231988daf 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/event/BaseEventServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/event/BaseEventServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service.event; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.Assert; import org.junit.Test; import org.thingsboard.server.common.data.DataConstants; @@ -40,8 +40,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { @Test public void saveEvent() throws Exception { - DeviceId devId = new DeviceId(UUIDs.timeBased()); - Event event = generateEvent(null, devId, "ALARM", UUIDs.timeBased().toString()); + DeviceId devId = new DeviceId(Uuids.timeBased()); + Event event = generateEvent(null, devId, "ALARM", Uuids.timeBased().toString()); Event saved = eventService.save(event); Optional loaded = eventService.findEvent(event.getTenantId(), event.getEntityId(), event.getType(), event.getUid()); Assert.assertTrue(loaded.isPresent()); @@ -51,8 +51,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { @Test public void saveEventIfNotExists() throws Exception { - DeviceId devId = new DeviceId(UUIDs.timeBased()); - Event event = generateEvent(null, devId, "ALARM", UUIDs.timeBased().toString()); + DeviceId devId = new DeviceId(Uuids.timeBased()); + Event event = generateEvent(null, devId, "ALARM", Uuids.timeBased().toString()); Optional saved = eventService.saveIfNotExists(event); Assert.assertTrue(saved.isPresent()); saved = eventService.saveIfNotExists(event); @@ -67,8 +67,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { long endTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 0).toEpochSecond(ZoneOffset.UTC); long timeAfterEndTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 30).toEpochSecond(ZoneOffset.UTC); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); - TenantId tenantId = new TenantId(UUIDs.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); + TenantId tenantId = new TenantId(Uuids.timeBased()); saveEventWithProvidedTime(timeBeforeStartTime, customerId, tenantId); Event savedEvent = saveEventWithProvidedTime(eventTime, customerId, tenantId); Event savedEvent2 = saveEventWithProvidedTime(eventTime+1, customerId, tenantId); @@ -102,8 +102,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { long endTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 0).toEpochSecond(ZoneOffset.UTC); long timeAfterEndTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 30).toEpochSecond(ZoneOffset.UTC); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); - TenantId tenantId = new TenantId(UUIDs.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); + TenantId tenantId = new TenantId(Uuids.timeBased()); saveEventWithProvidedTime(timeBeforeStartTime, customerId, tenantId); Event savedEvent = saveEventWithProvidedTime(eventTime, customerId, tenantId); Event savedEvent2 = saveEventWithProvidedTime(eventTime+1, customerId, tenantId); @@ -131,7 +131,7 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { private Event saveEventWithProvidedTime(long time, EntityId entityId, TenantId tenantId) throws IOException { Event event = generateEvent(tenantId, entityId, DataConstants.STATS, null); - event.setId(new EventId(UUIDs.startOf(time))); + event.setId(new EventId(Uuids.startOf(time))); return eventService.save(event); } -} \ No newline at end of file +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/timeseries/BaseTimeseriesServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/timeseries/BaseTimeseriesServiceTest.java index 2e35fb5345..c2fa56ab73 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/timeseries/BaseTimeseriesServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/timeseries/BaseTimeseriesServiceTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.service.timeseries; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import lombok.extern.slf4j.Slf4j; import org.junit.*; import org.thingsboard.server.common.data.EntityView; @@ -84,7 +84,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { @Test public void testFindAllLatest() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); saveEntries(deviceId, TS - 2); saveEntries(deviceId, TS - 1); @@ -132,7 +132,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { @Test public void testFindLatest() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); saveEntries(deviceId, TS - 2); saveEntries(deviceId, TS - 1); @@ -151,7 +151,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { @Test public void testFindByQueryAscOrder() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); saveEntries(deviceId, TS - 2); saveEntries(deviceId, TS - 1); @@ -177,7 +177,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { @Test public void testFindByQueryDescOrder() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); saveEntries(deviceId, TS - 2); saveEntries(deviceId, TS - 1); @@ -203,7 +203,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { @Test public void testDeleteDeviceTsDataWithOverwritingLatest() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); saveEntries(deviceId, 10000); saveEntries(deviceId, 20000); @@ -223,7 +223,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { @Test public void testFindDeviceTsData() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); List entries = new ArrayList<>(); entries.add(save(deviceId, 5000, 100)); @@ -374,7 +374,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { @Test public void testFindDeviceLongAndDoubleTsData() throws Exception { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); List entries = new ArrayList<>(); entries.add(save(deviceId, 5000, 100)); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java index f91bcefa68..99aafa08ef 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/asset/JpaAssetDaoTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.asset; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.google.common.util.concurrent.ListenableFuture; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -50,12 +50,12 @@ public class JpaAssetDaoTest extends AbstractJpaDaoTest { @Test public void testFindAssetsByTenantId() { - UUID tenantId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); - UUID customerId1 = UUIDs.timeBased(); - UUID customerId2 = UUIDs.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); + UUID customerId1 = Uuids.timeBased(); + UUID customerId2 = Uuids.timeBased(); for (int i = 0; i < 60; i++) { - UUID assetId = UUIDs.timeBased(); + UUID assetId = Uuids.timeBased(); UUID tenantId = i % 2 == 0 ? tenantId1 : tenantId2; UUID customerId = i % 2 == 0 ? customerId1 : customerId2; saveAsset(assetId, tenantId, customerId, "ASSET_" + i, "TYPE_1"); @@ -77,12 +77,12 @@ public class JpaAssetDaoTest extends AbstractJpaDaoTest { @Test public void testFindAssetsByTenantIdAndCustomerId() { - UUID tenantId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); - UUID customerId1 = UUIDs.timeBased(); - UUID customerId2 = UUIDs.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); + UUID customerId1 = Uuids.timeBased(); + UUID customerId2 = Uuids.timeBased(); for (int i = 0; i < 60; i++) { - UUID assetId = UUIDs.timeBased(); + UUID assetId = Uuids.timeBased(); UUID tenantId = i % 2 == 0 ? tenantId1 : tenantId2; UUID customerId = i % 2 == 0 ? customerId1 : customerId2; saveAsset(assetId, tenantId, customerId, "ASSET_" + i, "TYPE_1"); @@ -103,11 +103,11 @@ public class JpaAssetDaoTest extends AbstractJpaDaoTest { @Test public void testFindAssetsByTenantIdAndIdsAsync() throws ExecutionException, InterruptedException { - UUID tenantId = UUIDs.timeBased(); - UUID customerId = UUIDs.timeBased(); + UUID tenantId = Uuids.timeBased(); + UUID customerId = Uuids.timeBased(); List searchIds = new ArrayList<>(); for (int i = 0; i < 30; i++) { - UUID assetId = UUIDs.timeBased(); + UUID assetId = Uuids.timeBased(); saveAsset(assetId, tenantId, customerId, "ASSET_" + i, "TYPE_1"); if (i % 3 == 0) { searchIds.add(assetId); @@ -123,12 +123,12 @@ public class JpaAssetDaoTest extends AbstractJpaDaoTest { @Test public void testFindAssetsByTenantIdCustomerIdAndIdsAsync() throws ExecutionException, InterruptedException { - UUID tenantId = UUIDs.timeBased(); - UUID customerId1 = UUIDs.timeBased(); - UUID customerId2 = UUIDs.timeBased(); + UUID tenantId = Uuids.timeBased(); + UUID customerId1 = Uuids.timeBased(); + UUID customerId2 = Uuids.timeBased(); List searchIds = new ArrayList<>(); for (int i = 0; i < 30; i++) { - UUID assetId = UUIDs.timeBased(); + UUID assetId = Uuids.timeBased(); UUID customerId = i%2 == 0 ? customerId1 : customerId2; saveAsset(assetId, tenantId, customerId, "ASSET_" + i, "TYPE_1"); if (i % 3 == 0) { @@ -145,12 +145,12 @@ public class JpaAssetDaoTest extends AbstractJpaDaoTest { @Test public void testFindAssetsByTenantIdAndName() { - UUID assetId1 = UUIDs.timeBased(); - UUID assetId2 = UUIDs.timeBased(); - UUID tenantId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); - UUID customerId1 = UUIDs.timeBased(); - UUID customerId2 = UUIDs.timeBased(); + UUID assetId1 = Uuids.timeBased(); + UUID assetId2 = Uuids.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); + UUID customerId1 = Uuids.timeBased(); + UUID customerId2 = Uuids.timeBased(); String name = "TEST_ASSET"; saveAsset(assetId1, tenantId1, customerId1, name, "TYPE_1"); saveAsset(assetId2, tenantId2, customerId2, name, "TYPE_1"); @@ -175,22 +175,22 @@ public class JpaAssetDaoTest extends AbstractJpaDaoTest { @Test public void testFindTenantAssetTypesAsync() throws ExecutionException, InterruptedException { - UUID assetId1 = UUIDs.timeBased(); - UUID assetId2 = UUIDs.timeBased(); - UUID tenantId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); - UUID customerId1 = UUIDs.timeBased(); - UUID customerId2 = UUIDs.timeBased(); - saveAsset(UUIDs.timeBased(), tenantId1, customerId1, "TEST_ASSET_1", "TYPE_1"); - saveAsset(UUIDs.timeBased(), tenantId1, customerId1, "TEST_ASSET_2", "TYPE_1"); - saveAsset(UUIDs.timeBased(), tenantId1, customerId1, "TEST_ASSET_3", "TYPE_2"); - saveAsset(UUIDs.timeBased(), tenantId1, customerId1, "TEST_ASSET_4", "TYPE_3"); - saveAsset(UUIDs.timeBased(), tenantId1, customerId1, "TEST_ASSET_5", "TYPE_3"); - saveAsset(UUIDs.timeBased(), tenantId1, customerId1, "TEST_ASSET_6", "TYPE_3"); - - saveAsset(UUIDs.timeBased(), tenantId2, customerId2, "TEST_ASSET_7", "TYPE_4"); - saveAsset(UUIDs.timeBased(), tenantId2, customerId2, "TEST_ASSET_8", "TYPE_1"); - saveAsset(UUIDs.timeBased(), tenantId2, customerId2, "TEST_ASSET_9", "TYPE_1"); + UUID assetId1 = Uuids.timeBased(); + UUID assetId2 = Uuids.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); + UUID customerId1 = Uuids.timeBased(); + UUID customerId2 = Uuids.timeBased(); + saveAsset(Uuids.timeBased(), tenantId1, customerId1, "TEST_ASSET_1", "TYPE_1"); + saveAsset(Uuids.timeBased(), tenantId1, customerId1, "TEST_ASSET_2", "TYPE_1"); + saveAsset(Uuids.timeBased(), tenantId1, customerId1, "TEST_ASSET_3", "TYPE_2"); + saveAsset(Uuids.timeBased(), tenantId1, customerId1, "TEST_ASSET_4", "TYPE_3"); + saveAsset(Uuids.timeBased(), tenantId1, customerId1, "TEST_ASSET_5", "TYPE_3"); + saveAsset(Uuids.timeBased(), tenantId1, customerId1, "TEST_ASSET_6", "TYPE_3"); + + saveAsset(Uuids.timeBased(), tenantId2, customerId2, "TEST_ASSET_7", "TYPE_4"); + saveAsset(Uuids.timeBased(), tenantId2, customerId2, "TEST_ASSET_8", "TYPE_1"); + saveAsset(Uuids.timeBased(), tenantId2, customerId2, "TEST_ASSET_9", "TYPE_1"); List tenant1Types = assetDao.findTenantAssetTypesAsync(tenantId1).get(); assertNotNull(tenant1Types); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java index 3f439eb6f9..951ac89659 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.component; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.thingsboard.server.common.data.id.ComponentDescriptorId; @@ -77,7 +77,7 @@ public class JpaBaseComponentDescriptorDaoTest extends AbstractJpaDaoTest { private void createComponentDescriptor(ComponentType type, ComponentScope scope, int index) { ComponentDescriptor component = new ComponentDescriptor(); - component.setId(new ComponentDescriptorId(UUIDs.timeBased())); + component.setId(new ComponentDescriptorId(Uuids.timeBased())); component.setType(type); component.setScope(scope); component.setName("COMPONENT_" + index); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java index 8fad52a0ca..1772377e56 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.customer; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.thingsboard.server.common.data.Customer; @@ -43,8 +43,8 @@ public class JpaCustomerDaoTest extends AbstractJpaDaoTest { @Test public void testFindByTenantId() { - UUID tenantId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); for (int i = 0; i < 20; i++) { createCustomer(tenantId1, i); @@ -62,7 +62,7 @@ public class JpaCustomerDaoTest extends AbstractJpaDaoTest { @Test public void testFindCustomersByTenantIdAndTitle() { - UUID tenantId = UUIDs.timeBased(); + UUID tenantId = Uuids.timeBased(); for (int i = 0; i < 10; i++) { createCustomer(tenantId, i); @@ -75,7 +75,7 @@ public class JpaCustomerDaoTest extends AbstractJpaDaoTest { private void createCustomer(UUID tenantId, int index) { Customer customer = new Customer(); - customer.setId(new CustomerId(UUIDs.timeBased())); + customer.setId(new CustomerId(Uuids.timeBased())); customer.setTenantId(new TenantId(tenantId)); customer.setTitle("CUSTOMER_" + index); customerDao.save(new TenantId(tenantId), customer); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java index df166336e7..f93cde707d 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.dashboard; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -41,8 +41,8 @@ public class JpaDashboardInfoDaoTest extends AbstractJpaDaoTest { @Test public void testFindDashboardsByTenantId() { - UUID tenantId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); for (int i = 0; i < 20; i++) { createDashboard(tenantId1, i); @@ -59,7 +59,7 @@ public class JpaDashboardInfoDaoTest extends AbstractJpaDaoTest { private void createDashboard(UUID tenantId, int index) { DashboardInfo dashboardInfo = new DashboardInfo(); - dashboardInfo.setId(new DashboardId(UUIDs.timeBased())); + dashboardInfo.setId(new DashboardId(Uuids.timeBased())); dashboardInfo.setTenantId(new TenantId(tenantId)); dashboardInfo.setTitle("DASHBOARD_" + index); dashboardInfoDao.save(AbstractServiceTest.SYSTEM_TENANT_ID, dashboardInfo); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java index cd13d998ef..9e523299a7 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.device; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; @@ -49,10 +49,10 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { @Test public void testFindDevicesByTenantId() { - UUID tenantId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); - UUID customerId1 = UUIDs.timeBased(); - UUID customerId2 = UUIDs.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); + UUID customerId1 = Uuids.timeBased(); + UUID customerId2 = Uuids.timeBased(); createDevices(tenantId1, tenantId2, customerId1, customerId2, 40); PageLink pageLink = new PageLink(15, 0, "SEARCH_TEXT"); @@ -67,8 +67,8 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { @Test public void testFindAsync() throws ExecutionException, InterruptedException { - UUID tenantId = UUIDs.timeBased(); - UUID customerId = UUIDs.timeBased(); + UUID tenantId = Uuids.timeBased(); + UUID customerId = Uuids.timeBased(); Device device = getDevice(tenantId, customerId); deviceDao.save(new TenantId(tenantId), device); @@ -85,16 +85,16 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { @Test public void testFindDevicesByTenantIdAndIdsAsync() throws ExecutionException, InterruptedException { - UUID tenantId1 = UUIDs.timeBased(); - UUID customerId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); - UUID customerId2 = UUIDs.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID customerId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); + UUID customerId2 = Uuids.timeBased(); List deviceIds = new ArrayList<>(); for(int i = 0; i < 5; i++) { - UUID deviceId1 = UUIDs.timeBased(); - UUID deviceId2 = UUIDs.timeBased(); + UUID deviceId1 = Uuids.timeBased(); + UUID deviceId2 = Uuids.timeBased(); deviceDao.save(new TenantId(tenantId1), getDevice(tenantId1, customerId1, deviceId1)); deviceDao.save(new TenantId(tenantId2), getDevice(tenantId2, customerId2, deviceId2)); deviceIds.add(deviceId1); @@ -108,16 +108,16 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { @Test public void testFindDevicesByTenantIdAndCustomerIdAndIdsAsync() throws ExecutionException, InterruptedException { - UUID tenantId1 = UUIDs.timeBased(); - UUID customerId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); - UUID customerId2 = UUIDs.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID customerId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); + UUID customerId2 = Uuids.timeBased(); List deviceIds = new ArrayList<>(); for(int i = 0; i < 20; i++) { - UUID deviceId1 = UUIDs.timeBased(); - UUID deviceId2 = UUIDs.timeBased(); + UUID deviceId1 = Uuids.timeBased(); + UUID deviceId2 = Uuids.timeBased(); deviceDao.save(new TenantId(tenantId1), getDevice(tenantId1, customerId1, deviceId1)); deviceDao.save(new TenantId(tenantId2), getDevice(tenantId2, customerId2, deviceId2)); deviceIds.add(deviceId1); @@ -137,7 +137,7 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { } private Device getDevice(UUID tenantId, UUID customerID) { - return getDevice(tenantId, customerID, UUIDs.timeBased()); + return getDevice(tenantId, customerID, Uuids.timeBased()); } private Device getDevice(UUID tenantId, UUID customerID, UUID deviceId) { diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDaoTest.java index 5109fa59f5..87c5544470 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDaoTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.event; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.springtestdbunit.annotation.DatabaseSetup; @@ -57,9 +57,9 @@ public class JpaBaseEventDaoTest extends AbstractJpaDaoTest { @Test public void testSaveIfNotExists() { - UUID eventId = UUIDs.timeBased(); - UUID tenantId = UUIDs.timeBased(); - UUID entityId = UUIDs.timeBased(); + UUID eventId = Uuids.timeBased(); + UUID tenantId = Uuids.timeBased(); + UUID entityId = Uuids.timeBased(); Event event = getEvent(eventId, tenantId, entityId); Optional optEvent1 = eventDao.saveIfNotExists(event); assertTrue("Optional is expected to be non-empty", optEvent1.isPresent()); @@ -83,9 +83,9 @@ public class JpaBaseEventDaoTest extends AbstractJpaDaoTest { @Test public void findEventsByEntityIdAndPageLink() { - UUID tenantId = UUIDs.timeBased(); - UUID entityId1 = UUIDs.timeBased(); - UUID entityId2 = UUIDs.timeBased(); + UUID tenantId = Uuids.timeBased(); + UUID entityId1 = Uuids.timeBased(); + UUID entityId2 = Uuids.timeBased(); long startTime = System.currentTimeMillis(); long endTime = createEventsTwoEntities(tenantId, entityId1, entityId2, startTime, 20); @@ -117,9 +117,9 @@ public class JpaBaseEventDaoTest extends AbstractJpaDaoTest { @Test public void findEventsByEntityIdAndEventTypeAndPageLink() { - UUID tenantId = UUIDs.timeBased(); - UUID entityId1 = UUIDs.timeBased(); - UUID entityId2 = UUIDs.timeBased(); + UUID tenantId = Uuids.timeBased(); + UUID entityId1 = Uuids.timeBased(); + UUID entityId2 = Uuids.timeBased(); long startTime = System.currentTimeMillis(); long endTime = createEventsTwoEntitiesTwoTypes(tenantId, entityId1, entityId2, startTime, 20); @@ -147,10 +147,10 @@ public class JpaBaseEventDaoTest extends AbstractJpaDaoTest { private long createEventsTwoEntitiesTwoTypes(UUID tenantId, UUID entityId1, UUID entityId2, long startTime, int count) { for (int i = 0; i < count / 2; i++) { String type = i % 2 == 0 ? STATS : ALARM; - UUID eventId1 = UUIDs.timeBased(); + UUID eventId1 = Uuids.timeBased(); Event event1 = getEvent(eventId1, tenantId, entityId1, type); eventDao.save(new TenantId(tenantId), event1); - UUID eventId2 = UUIDs.timeBased(); + UUID eventId2 = Uuids.timeBased(); Event event2 = getEvent(eventId2, tenantId, entityId2, type); eventDao.save(new TenantId(tenantId), event2); } @@ -159,10 +159,10 @@ public class JpaBaseEventDaoTest extends AbstractJpaDaoTest { private long createEventsTwoEntities(UUID tenantId, UUID entityId1, UUID entityId2, long startTime, int count) { for (int i = 0; i < count / 2; i++) { - UUID eventId1 = UUIDs.timeBased(); + UUID eventId1 = Uuids.timeBased(); Event event1 = getEvent(eventId1, tenantId, entityId1); eventDao.save(new TenantId(tenantId), event1); - UUID eventId2 = UUIDs.timeBased(); + UUID eventId2 = Uuids.timeBased(); Event event2 = getEvent(eventId2, tenantId, entityId2); eventDao.save(new TenantId(tenantId), event2); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDaoTest.java index 057a1299e7..850b72d6fa 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDaoTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.tenant; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.github.springtestdbunit.annotation.DatabaseSetup; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -69,7 +69,7 @@ public class JpaTenantDaoTest extends AbstractJpaDaoTest { private void createTenant(String region, String title, int index) { Tenant tenant = new Tenant(); - tenant.setId(new TenantId(UUIDs.timeBased())); + tenant.setId(new TenantId(Uuids.timeBased())); tenant.setRegion(region); tenant.setTitle(title + "_" + index); tenantDao.save(AbstractServiceTest.SYSTEM_TENANT_ID, tenant); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java index 2056b48788..eb13bc1924 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.user; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.springtestdbunit.annotation.DatabaseSetup; @@ -71,8 +71,8 @@ public class JpaUserDaoTest extends AbstractJpaDaoTest { @Test @DatabaseSetup("classpath:dbunit/empty_dataset.xml") public void testFindTenantAdmins() { - UUID tenantId = UUIDs.timeBased(); - UUID customerId = UUIDs.timeBased(); + UUID tenantId = Uuids.timeBased(); + UUID customerId = Uuids.timeBased(); create30Adminsand60Users(tenantId, customerId); PageLink pageLink = new PageLink(20); PageData tenantAdmins1 = userDao.findTenantAdmins(tenantId, pageLink); @@ -90,8 +90,8 @@ public class JpaUserDaoTest extends AbstractJpaDaoTest { @Test @DatabaseSetup("classpath:dbunit/empty_dataset.xml") public void testFindCustomerUsers() { - UUID tenantId = UUIDs.timeBased(); - UUID customerId = UUIDs.timeBased(); + UUID tenantId = Uuids.timeBased(); + UUID customerId = Uuids.timeBased(); create30Adminsand60Users(tenantId, customerId); PageLink pageLink = new PageLink(40); PageData customerUsers1 = userDao.findCustomerUsers(tenantId, customerId, pageLink); @@ -138,7 +138,7 @@ public class JpaUserDaoTest extends AbstractJpaDaoTest { private void saveUser(UUID tenantId, UUID customerId) { User user = new User(); - UUID id = UUIDs.timeBased(); + UUID id = Uuids.timeBased(); user.setId(new UserId(id)); user.setTenantId(new TenantId(tenantId)); user.setCustomerId(new CustomerId(customerId)); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java index 5463f3d8aa..c6ce8854ac 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.server.dao.sql.widget; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.github.springtestdbunit.annotation.DatabaseOperation; import com.github.springtestdbunit.annotation.DatabaseSetup; import com.github.springtestdbunit.annotation.DatabaseTearDown; @@ -78,8 +78,8 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { @Test @DatabaseSetup(value = "classpath:dbunit/widgets_bundle.xml", type= DatabaseOperation.DELETE_ALL) public void testFindWidgetsBundlesByTenantId() { - UUID tenantId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); // Create a bunch of widgetBundles for (int i= 0; i < 10; i++) { createWidgetBundles(3, tenantId1, "WB1_"); @@ -104,8 +104,8 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { @Test @DatabaseSetup(value = "classpath:dbunit/widgets_bundle.xml", type= DatabaseOperation.DELETE_ALL) public void testFindAllWidgetsBundlesByTenantId() { - UUID tenantId1 = UUIDs.timeBased(); - UUID tenantId2 = UUIDs.timeBased(); + UUID tenantId1 = Uuids.timeBased(); + UUID tenantId2 = Uuids.timeBased(); // Create a bunch of widgetBundles for (int i= 0; i < 10; i++) { createWidgetBundles( 5, tenantId1,"WB1_"); @@ -134,7 +134,7 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { @DatabaseSetup("classpath:dbunit/empty_dataset.xml") @DatabaseTearDown(value = "classpath:dbunit/empty_dataset.xml", type= DatabaseOperation.DELETE_ALL) public void testSearchTextNotFound() { - UUID tenantId = UUIDs.timeBased(); + UUID tenantId = Uuids.timeBased(); createWidgetBundles(5, tenantId, "ABC_"); createSystemWidgetBundles(5, "SYS_"); @@ -148,7 +148,7 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { WidgetsBundle widgetsBundle = new WidgetsBundle(); widgetsBundle.setAlias(prefix + i); widgetsBundle.setTitle(prefix + i); - widgetsBundle.setId(new WidgetsBundleId(UUIDs.timeBased())); + widgetsBundle.setId(new WidgetsBundleId(Uuids.timeBased())); widgetsBundle.setTenantId(new TenantId(tenantId)); widgetsBundleDao.save(AbstractServiceTest.SYSTEM_TENANT_ID, widgetsBundle); } @@ -159,7 +159,7 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { widgetsBundle.setAlias(prefix + i); widgetsBundle.setTitle(prefix + i); widgetsBundle.setTenantId(new TenantId(NULL_UUID)); - widgetsBundle.setId(new WidgetsBundleId(UUIDs.timeBased())); + widgetsBundle.setId(new WidgetsBundleId(Uuids.timeBased())); widgetsBundleDao.save(AbstractServiceTest.SYSTEM_TENANT_ID, widgetsBundle); } } diff --git a/pom.xml b/pom.xml index 392e11b0ee..295d029957 100755 --- a/pom.xml +++ b/pom.xml @@ -43,8 +43,9 @@ 1.2.3 1.9.5 0.10 - 3.6.0 - 3.5.0.1 + 4.6.0 + 4.0.5 + 4.3.1.0 1.2.7 28.2-jre 2.6.1 @@ -657,19 +658,19 @@ ${netty.version} - com.datastax.cassandra - cassandra-driver-core + com.datastax.oss + java-driver-core ${cassandra.version} - com.datastax.cassandra - cassandra-driver-mapping + com.datastax.oss + java-driver-query-builder ${cassandra.version} - com.datastax.cassandra - cassandra-driver-extras - ${cassandra.version} + io.dropwizard.metrics + metrics-jmx + ${metrics.version} org.apache.commons diff --git a/rule-engine/rule-engine-api/pom.xml b/rule-engine/rule-engine-api/pom.xml index 58104ea07e..7ddc42fb23 100644 --- a/rule-engine/rule-engine-api/pom.xml +++ b/rule-engine/rule-engine-api/pom.xml @@ -74,18 +74,8 @@ provided - com.datastax.cassandra - cassandra-driver-core - provided - - - com.datastax.cassandra - cassandra-driver-mapping - provided - - - com.datastax.cassandra - cassandra-driver-extras + com.datastax.oss + java-driver-core provided diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java index 9b1edc5f5c..a7dac6b63c 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java +++ b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java @@ -15,7 +15,6 @@ */ package org.thingsboard.rule.engine.api; -import com.datastax.driver.core.ResultSetFuture; import io.netty.channel.EventLoopGroup; import org.springframework.data.redis.core.RedisTemplate; import org.thingsboard.common.util.ListeningExecutor; @@ -37,6 +36,7 @@ import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.entityview.EntityViewService; import org.thingsboard.server.dao.nosql.CassandraStatementTask; +import org.thingsboard.server.dao.nosql.TbResultSetFuture; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.tenant.TenantService; @@ -207,7 +207,7 @@ public interface TbContext { CassandraCluster getCassandraCluster(); - ResultSetFuture submitCassandraTask(CassandraStatementTask task); + TbResultSetFuture submitCassandraTask(CassandraStatementTask task); @Deprecated RedisTemplate getRedisTemplate(); diff --git a/rule-engine/rule-engine-components/pom.xml b/rule-engine/rule-engine-components/pom.xml index 299fdae084..07473fb2d3 100644 --- a/rule-engine/rule-engine-components/pom.xml +++ b/rule-engine/rule-engine-components/pom.xml @@ -134,6 +134,10 @@ org.slf4j slf4j-log4j12 + + org.hibernate + hibernate-validator + test diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java index 19d8515455..a8f05ae1c4 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java @@ -15,7 +15,6 @@ */ package org.thingsboard.rule.engine.action; -import com.datastax.driver.core.utils.UUIDs; import com.google.gson.Gson; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; @@ -99,4 +98,4 @@ public class TbMsgCountNode implements TbNode { @Override public void destroy() { } -} \ No newline at end of file +} diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbSaveToCustomCassandraTableNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbSaveToCustomCassandraTableNode.java index 926c3c25f3..03c95202b1 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbSaveToCustomCassandraTableNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbSaveToCustomCassandraTableNode.java @@ -15,8 +15,12 @@ */ package org.thingsboard.rule.engine.action; -import com.datastax.driver.core.*; -import com.datastax.driver.core.exceptions.CodecNotFoundException; +import com.datastax.oss.driver.api.core.ConsistencyLevel; +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.datastax.oss.driver.api.core.cql.BoundStatement; +import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; +import com.datastax.oss.driver.api.core.cql.Statement; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -30,22 +34,19 @@ import org.thingsboard.rule.engine.api.util.TbNodeUtils; import org.thingsboard.server.common.data.plugin.ComponentType; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.dao.cassandra.CassandraCluster; -import org.thingsboard.server.dao.model.type.ComponentLifecycleStateCodec; -import org.thingsboard.server.dao.model.type.EntityTypeCodec; -import org.thingsboard.server.dao.model.type.JsonCodec; +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; import org.thingsboard.server.dao.nosql.CassandraStatementTask; +import org.thingsboard.server.dao.nosql.TbResultSetFuture; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import static org.thingsboard.common.util.DonAsynchron.withCallback; -import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS; @Slf4j @RuleNode(type = ComponentType.ACTION, @@ -69,7 +70,7 @@ public class TbSaveToCustomCassandraTableNode implements TbNode { private static final String ENTITY_ID = "$entityId"; private TbSaveToCustomCassandraTableNodeConfiguration config; - private Session session; + private GuavaSession session; private CassandraCluster cassandraCluster; private ConsistencyLevel defaultWriteLevel; private PreparedStatement saveStmt; @@ -113,27 +114,14 @@ public class TbSaveToCustomCassandraTableNode implements TbNode { return getSession().prepare(query); } - private Session getSession() { + private GuavaSession getSession() { if (session == null) { session = cassandraCluster.getSession(); defaultWriteLevel = cassandraCluster.getDefaultWriteConsistencyLevel(); - CodecRegistry registry = session.getCluster().getConfiguration().getCodecRegistry(); - registerCodecIfNotFound(registry, new JsonCodec()); - registerCodecIfNotFound(registry, new ComponentLifecycleStateCodec()); - registerCodecIfNotFound(registry, new EntityTypeCodec()); } return session; } - private void registerCodecIfNotFound(CodecRegistry registry, TypeCodec codec) { - try { - registry.codecFor(codec.getCqlType(), codec.getJavaType()); - } catch (CodecNotFoundException e) { - registry.register(codec); - } - } - - private PreparedStatement getSaveStmt() { fieldsMap = config.getFieldsMapping(); if (fieldsMap.isEmpty()) { @@ -179,22 +167,22 @@ public class TbSaveToCustomCassandraTableNode implements TbNode { throw new IllegalStateException("Invalid message structure, it is not a JSON Object:" + data); } else { JsonObject dataAsObject = data.getAsJsonObject(); - BoundStatement stmt = saveStmt.bind(); + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(saveStmt.bind()); AtomicInteger i = new AtomicInteger(0); fieldsMap.forEach((key, value) -> { if (key.equals(ENTITY_ID)) { - stmt.setUUID(i.get(), msg.getOriginator().getId()); + stmtBuilder.setUuid(i.get(), msg.getOriginator().getId()); } else if (dataAsObject.has(key)) { if (dataAsObject.get(key).isJsonPrimitive()) { JsonPrimitive primitive = dataAsObject.get(key).getAsJsonPrimitive(); if (primitive.isNumber()) { - stmt.setLong(i.get(), dataAsObject.get(key).getAsLong()); + stmtBuilder.setLong(i.get(), dataAsObject.get(key).getAsLong()); } else if (primitive.isBoolean()) { - stmt.setBool(i.get(), dataAsObject.get(key).getAsBoolean()); + stmtBuilder.setBoolean(i.get(), dataAsObject.get(key).getAsBoolean()); } else if (primitive.isString()) { - stmt.setString(i.get(), dataAsObject.get(key).getAsString()); + stmtBuilder.setString(i.get(), dataAsObject.get(key).getAsString()); } else { - stmt.setToNull(i.get()); + stmtBuilder.setToNull(i.get()); } } else { throw new IllegalStateException("Message data key: '" + key + "' with value: '" + value + "' is not a JSON Primitive!"); @@ -204,15 +192,15 @@ public class TbSaveToCustomCassandraTableNode implements TbNode { } i.getAndIncrement(); }); - return getFuture(executeAsyncWrite(ctx, stmt), rs -> null); + return getFuture(executeAsyncWrite(ctx, stmtBuilder.build()), rs -> null); } } - private ResultSetFuture executeAsyncWrite(TbContext ctx, Statement statement) { + private TbResultSetFuture executeAsyncWrite(TbContext ctx, Statement statement) { return executeAsync(ctx, statement, defaultWriteLevel); } - private ResultSetFuture executeAsync(TbContext ctx, Statement statement, ConsistencyLevel level) { + private TbResultSetFuture executeAsync(TbContext ctx, Statement statement, ConsistencyLevel level) { if (log.isDebugEnabled()) { log.debug("Execute cassandra async statement {}", statementToString(statement)); } @@ -224,20 +212,20 @@ public class TbSaveToCustomCassandraTableNode implements TbNode { private static String statementToString(Statement statement) { if (statement instanceof BoundStatement) { - return ((BoundStatement) statement).preparedStatement().getQueryString(); + return ((BoundStatement) statement).getPreparedStatement().getQuery(); } else { return statement.toString(); } } - private ListenableFuture getFuture(ResultSetFuture future, java.util.function.Function transformer) { - return Futures.transform(future, new Function() { + private ListenableFuture getFuture(TbResultSetFuture future, java.util.function.Function transformer) { + return Futures.transform(future, new Function() { @Nullable @Override - public T apply(@Nullable ResultSet input) { + public T apply(@Nullable AsyncResultSet input) { return transformer.apply(input); } }, readResultsProcessingExecutor); } -} \ No newline at end of file +} diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java index ad1d399e76..eb441ff99e 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java @@ -15,7 +15,7 @@ */ package org.thingsboard.rule.engine.rpc; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -82,7 +82,7 @@ public class TbSendRPCRequestNode implements TbNode { boolean oneway = !StringUtils.isEmpty(tmp) && Boolean.parseBoolean(tmp); tmp = msg.getMetaData().getValue("requestUUID"); - UUID requestUUID = !StringUtils.isEmpty(tmp) ? UUID.fromString(tmp) : UUIDs.timeBased(); + UUID requestUUID = !StringUtils.isEmpty(tmp) ? UUID.fromString(tmp) : Uuids.timeBased(); tmp = msg.getMetaData().getValue("originServiceId"); String originServiceId = !StringUtils.isEmpty(tmp) ? tmp : null; diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java index 61b83d647d..064346c6fe 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.rule.engine.action; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.util.concurrent.Futures; @@ -89,13 +89,13 @@ public class TbAlarmNodeTest { @Captor private ArgumentCaptor> failureCaptor; - private RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - private RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + private RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + private RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); private ListeningExecutor dbExecutor; - private EntityId originator = new DeviceId(UUIDs.timeBased()); - private TenantId tenantId = new TenantId(UUIDs.timeBased()); + private EntityId originator = new DeviceId(Uuids.timeBased()); + private TenantId tenantId = new TenantId(Uuids.timeBased()); private TbMsgMetaData metaData = new TbMsgMetaData(); private String rawJson = "{\"name\": \"Vit\", \"passed\": 5}"; diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java index b0f64fb980..f835cfd506 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.rule.engine.filter; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -58,8 +58,8 @@ public class TbJsFilterNodeTest { @Mock private ScriptEngine scriptEngine; - private RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - private RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + private RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + private RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); @Test public void falseEvaluationDoNotSendMsg() throws TbNodeException, ScriptException { diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java index 9286a06da6..960b1ec0c4 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.rule.engine.filter; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Sets; import com.google.common.util.concurrent.Futures; @@ -60,8 +60,8 @@ public class TbJsSwitchNodeTest { @Mock private ScriptEngine scriptEngine; - private RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - private RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + private RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + private RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); @Test public void multipleRoutesAreAllowed() throws TbNodeException, ScriptException { diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java index 70f58c5989..137a2817c6 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.rule.engine.mail; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,12 +47,12 @@ public class TbMsgToEmailNodeTest { @Mock private TbContext ctx; - private EntityId originator = new DeviceId(UUIDs.timeBased()); + private EntityId originator = new DeviceId(Uuids.timeBased()); private TbMsgMetaData metaData = new TbMsgMetaData(); private String rawJson = "{\"name\": \"temp\", \"passed\": 5 , \"complex\": {\"val\":12, \"count\":100}}"; - private RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - private RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + private RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + private RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); @Test public void msgCanBeConverted() throws IOException { @@ -107,4 +107,4 @@ public class TbMsgToEmailNodeTest { } } -} \ No newline at end of file +} diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java index a0a61ae30f..ffd7c2439e 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.rule.engine.metadata; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; import com.google.common.util.concurrent.Futures; @@ -88,8 +88,8 @@ public class TbGetCustomerAttributeNodeTest { private TbMsg msg; - private RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - private RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + private RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + private RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); @Before public void init() throws TbNodeException { @@ -107,8 +107,8 @@ public class TbGetCustomerAttributeNodeTest { @Test public void errorThrownIfCannotLoadAttributes() { - UserId userId = new UserId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + UserId userId = new UserId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); User user = new User(); user.setCustomerId(customerId); @@ -132,8 +132,8 @@ public class TbGetCustomerAttributeNodeTest { @Test public void errorThrownIfCannotLoadAttributesAsync() { - UserId userId = new UserId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + UserId userId = new UserId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); User user = new User(); user.setCustomerId(customerId); @@ -157,8 +157,8 @@ public class TbGetCustomerAttributeNodeTest { @Test public void failedChainUsedIfCustomerCannotBeFound() { - UserId userId = new UserId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + UserId userId = new UserId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); User user = new User(); user.setCustomerId(customerId); @@ -175,15 +175,15 @@ public class TbGetCustomerAttributeNodeTest { @Test public void customerAttributeAddedInMetadata() { - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); msg = TbMsg.newMsg( "CUSTOMER", customerId, new TbMsgMetaData(), TbMsgDataType.JSON, "{}", ruleChainId, ruleNodeId); entityAttributeFetched(customerId); } @Test public void usersCustomerAttributesFetched() { - UserId userId = new UserId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + UserId userId = new UserId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); User user = new User(); user.setCustomerId(customerId); @@ -197,8 +197,8 @@ public class TbGetCustomerAttributeNodeTest { @Test public void assetsCustomerAttributesFetched() { - AssetId assetId = new AssetId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + AssetId assetId = new AssetId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); Asset asset = new Asset(); asset.setCustomerId(customerId); @@ -212,8 +212,8 @@ public class TbGetCustomerAttributeNodeTest { @Test public void deviceCustomerAttributesFetched() { - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); Device device = new Device(); device.setCustomerId(customerId); @@ -239,8 +239,8 @@ public class TbGetCustomerAttributeNodeTest { node.init(null, nodeConfiguration); - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); Device device = new Device(); device.setCustomerId(customerId); @@ -271,4 +271,4 @@ public class TbGetCustomerAttributeNodeTest { verify(ctx).tellSuccess(msg); assertEquals(msg.getMetaData().getValue("tempo"), "high"); } -} \ No newline at end of file +} diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java index fa845c4a18..a8226f2253 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.rule.engine.transform; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -84,13 +84,13 @@ public class TbChangeOriginatorNodeTest { @Test public void originatorCanBeChangedToCustomerId() throws TbNodeException { init(); - AssetId assetId = new AssetId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + AssetId assetId = new AssetId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); Asset asset = new Asset(); asset.setCustomerId(customerId); - RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); TbMsg msg = TbMsg.newMsg( "ASSET", assetId, new TbMsgMetaData(), TbMsgDataType.JSON, "{}", ruleChainId, ruleNodeId); @@ -112,13 +112,13 @@ public class TbChangeOriginatorNodeTest { @Test public void newChainCanBeStarted() throws TbNodeException { init(); - AssetId assetId = new AssetId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + AssetId assetId = new AssetId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); Asset asset = new Asset(); asset.setCustomerId(customerId); - RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); TbMsg msg = TbMsg.newMsg( "ASSET", assetId, new TbMsgMetaData(), TbMsgDataType.JSON,"{}", ruleChainId, ruleNodeId); @@ -139,13 +139,13 @@ public class TbChangeOriginatorNodeTest { @Test public void exceptionThrownIfCannotFindNewOriginator() throws TbNodeException { init(); - AssetId assetId = new AssetId(UUIDs.timeBased()); - CustomerId customerId = new CustomerId(UUIDs.timeBased()); + AssetId assetId = new AssetId(Uuids.timeBased()); + CustomerId customerId = new CustomerId(Uuids.timeBased()); Asset asset = new Asset(); asset.setCustomerId(customerId); - RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); TbMsg msg = TbMsg.newMsg( "ASSET", assetId, new TbMsgMetaData(), TbMsgDataType.JSON,"{}", ruleChainId, ruleNodeId); diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java index a00e97cf1c..bc56815468 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java @@ -15,7 +15,7 @@ */ package org.thingsboard.rule.engine.transform; -import com.datastax.driver.core.utils.UUIDs; +import com.datastax.oss.driver.api.core.uuid.Uuids; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -67,8 +67,8 @@ public class TbTransformMsgNodeTest { metaData.putValue("temp", "7"); String rawJson = "{\"passed\": 5}"; - RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); TbMsg msg = TbMsg.newMsg( "USER", null, metaData, TbMsgDataType.JSON,rawJson, ruleChainId, ruleNodeId); TbMsg transformedMsg = TbMsg.newMsg( "USER", null, metaData, TbMsgDataType.JSON, "{new}", ruleChainId, ruleNodeId); mockJsExecutor(); @@ -89,8 +89,8 @@ public class TbTransformMsgNodeTest { metaData.putValue("temp", "7"); String rawJson = "{\"passed\": 5"; - RuleChainId ruleChainId = new RuleChainId(UUIDs.timeBased()); - RuleNodeId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); + RuleChainId ruleChainId = new RuleChainId(Uuids.timeBased()); + RuleNodeId ruleNodeId = new RuleNodeId(Uuids.timeBased()); TbMsg msg = TbMsg.newMsg( "USER", null, metaData, TbMsgDataType.JSON, rawJson, ruleChainId, ruleNodeId); mockJsExecutor(); when(scriptEngine.executeUpdateAsync(msg)).thenReturn(Futures.immediateFailedFuture(new IllegalStateException("error"))); diff --git a/tools/pom.xml b/tools/pom.xml index a3018e40ce..25f26aeaa1 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -57,8 +57,8 @@ 3.11.6 - com.datastax.cassandra - cassandra-driver-core + com.datastax.oss + java-driver-core commons-io