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