diff --git a/pom.xml b/pom.xml index 3125c1474..9fb81e5b5 100644 --- a/pom.xml +++ b/pom.xml @@ -29,12 +29,12 @@ multi spring-data-cassandra 1.13.0.BUILD-SNAPSHOT - 2.1.9.2 + 3.0.0.1 1.0 2.16 0.3.1 - 2.1.11 - 2.1.7.1 + 3.0.0 + 3.0.0-rc1 @@ -126,7 +126,7 @@ org.xerial.snappy snappy-java - 1.1.0.1 + 1.1.2.1 test @@ -158,8 +158,8 @@ cassandra-driver-core - slf4j-log4j12 - org.slf4j + logback-core + ch.qos.logback test diff --git a/spring-cql/pom.xml b/spring-cql/pom.xml index a50919052..7420157b3 100644 --- a/spring-cql/pom.xml +++ b/spring-cql/pom.xml @@ -82,8 +82,8 @@ test - slf4j-log4j12 - org.slf4j + logback-core + ch.qos.logback guava diff --git a/spring-cql/src/main/java/org/springframework/cassandra/core/CqlTemplate.java b/spring-cql/src/main/java/org/springframework/cassandra/core/CqlTemplate.java index 4d64f0112..ea9441b7e 100644 --- a/spring-cql/src/main/java/org/springframework/cassandra/core/CqlTemplate.java +++ b/spring-cql/src/main/java/org/springframework/cassandra/core/CqlTemplate.java @@ -55,6 +55,7 @@ import org.springframework.util.Assert; import com.datastax.driver.core.BoundStatement; +import com.datastax.driver.core.CodecRegistry; import com.datastax.driver.core.ColumnDefinitions; import com.datastax.driver.core.ColumnDefinitions.Definition; import com.datastax.driver.core.Host; @@ -571,7 +572,7 @@ protected Object firstColumnToObject(Row row) { if (cols.size() == 0) { return null; } - return cols.getType(0).deserialize(row.getBytesUnsafe(0), ProtocolVersion.NEWEST_SUPPORTED); + return CodecRegistry.DEFAULT_INSTANCE.codecFor(cols.getType(0)).deserialize(row.getBytesUnsafe(0), ProtocolVersion.NEWEST_SUPPORTED); } /** @@ -588,7 +589,7 @@ protected Map toMap(Row row) { for (Definition def : cols.asList()) { String name = def.getName(); - map.put(name, def.getType().deserialize(row.getBytesUnsafe(name), ProtocolVersion.NEWEST_SUPPORTED)); + map.put(name, CodecRegistry.DEFAULT_INSTANCE.codecFor(def.getType()).deserialize(row.getBytesUnsafe(name), ProtocolVersion.NEWEST_SUPPORTED)); } return map; diff --git a/spring-cql/src/main/java/org/springframework/cassandra/core/converter/RowToListConverter.java b/spring-cql/src/main/java/org/springframework/cassandra/core/converter/RowToListConverter.java index 2a06d0a5b..cbf587786 100644 --- a/spring-cql/src/main/java/org/springframework/cassandra/core/converter/RowToListConverter.java +++ b/spring-cql/src/main/java/org/springframework/cassandra/core/converter/RowToListConverter.java @@ -5,6 +5,7 @@ import org.springframework.core.convert.converter.Converter; +import com.datastax.driver.core.CodecRegistry; import com.datastax.driver.core.ColumnDefinitions; import com.datastax.driver.core.ProtocolVersion; import com.datastax.driver.core.Row; @@ -24,7 +25,7 @@ public List convert(Row row) { for (Definition def : cols.asList()) { String name = def.getName(); - list.add(row.isNull(name) ? null : def.getType().deserialize( + list.add(row.isNull(name) ? null : CodecRegistry.DEFAULT_INSTANCE.codecFor(def.getType()).deserialize( row.getBytesUnsafe(name), ProtocolVersion.NEWEST_SUPPORTED)); } diff --git a/spring-cql/src/main/java/org/springframework/cassandra/core/converter/RowToMapConverter.java b/spring-cql/src/main/java/org/springframework/cassandra/core/converter/RowToMapConverter.java index b588099f3..33dd0e81a 100644 --- a/spring-cql/src/main/java/org/springframework/cassandra/core/converter/RowToMapConverter.java +++ b/spring-cql/src/main/java/org/springframework/cassandra/core/converter/RowToMapConverter.java @@ -5,6 +5,7 @@ import org.springframework.core.convert.converter.Converter; +import com.datastax.driver.core.CodecRegistry; import com.datastax.driver.core.ColumnDefinitions; import com.datastax.driver.core.ColumnDefinitions.Definition; import com.datastax.driver.core.ProtocolVersion; @@ -27,8 +28,8 @@ public Map convert(Row row) { String name = def.getName(); map.put( name, - row.isNull(name) ? null : def.getType().deserialize(row.getBytesUnsafe(name), - ProtocolVersion.NEWEST_SUPPORTED)); + row.isNull(name) ? null : CodecRegistry.DEFAULT_INSTANCE.codecFor(def.getType()) + .deserialize(row.getBytesUnsafe(name), ProtocolVersion.NEWEST_SUPPORTED)); } return map; diff --git a/spring-cql/src/test/java/org/springframework/cassandra/test/integration/config/xml/TestHostStateListener.java b/spring-cql/src/test/java/org/springframework/cassandra/test/integration/config/xml/TestHostStateListener.java index 1085c9271..a756a5fa9 100644 --- a/spring-cql/src/test/java/org/springframework/cassandra/test/integration/config/xml/TestHostStateListener.java +++ b/spring-cql/src/test/java/org/springframework/cassandra/test/integration/config/xml/TestHostStateListener.java @@ -18,6 +18,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.datastax.driver.core.Cluster; import com.datastax.driver.core.Host; import com.datastax.driver.core.Host.StateListener; @@ -49,8 +50,13 @@ public void onRemove(Host host) { } @Override - public void onSuspected(Host host) { - log.info("Host Suspected: " + host.getAddress()); + public void onRegister(Cluster cluster) { + log.info("Cluster registered: " + cluster.getClusterName()); + } + + @Override + public void onUnregister(Cluster cluster) { + log.info("Cluster unregistered: " + cluster.getClusterName()); } } diff --git a/spring-cql/src/test/java/org/springframework/cassandra/test/integration/config/xml/TestLatencyTracker.java b/spring-cql/src/test/java/org/springframework/cassandra/test/integration/config/xml/TestLatencyTracker.java index 4efbc5586..656cac26f 100644 --- a/spring-cql/src/test/java/org/springframework/cassandra/test/integration/config/xml/TestLatencyTracker.java +++ b/spring-cql/src/test/java/org/springframework/cassandra/test/integration/config/xml/TestLatencyTracker.java @@ -18,6 +18,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.datastax.driver.core.Cluster; import com.datastax.driver.core.Host; import com.datastax.driver.core.LatencyTracker; import com.datastax.driver.core.Statement; @@ -34,5 +35,13 @@ public class TestLatencyTracker implements LatencyTracker { public void update(Host host, Statement statement, Exception exception, long newLatencyNanos) { LOG.info("Latency Tracker: " + host.getAddress() + ", " + newLatencyNanos + " nanoseconds."); } + + @Override + public void onRegister(Cluster cluster) { + } + + @Override + public void onUnregister(Cluster cluster) { + } } diff --git a/spring-cql/src/test/java/org/springframework/cassandra/test/integration/core/cql/generator/CqlIndexSpecificationAssertions.java b/spring-cql/src/test/java/org/springframework/cassandra/test/integration/core/cql/generator/CqlIndexSpecificationAssertions.java index 86f784edb..3014cc731 100644 --- a/spring-cql/src/test/java/org/springframework/cassandra/test/integration/core/cql/generator/CqlIndexSpecificationAssertions.java +++ b/spring-cql/src/test/java/org/springframework/cassandra/test/integration/core/cql/generator/CqlIndexSpecificationAssertions.java @@ -20,23 +20,28 @@ import org.springframework.cassandra.core.keyspace.IndexDescriptor; -import com.datastax.driver.core.ColumnMetadata.IndexMetadata; +import com.datastax.driver.core.IndexMetadata; import com.datastax.driver.core.Session; +import com.datastax.driver.core.TableMetadata; public class CqlIndexSpecificationAssertions { public static double DELTA = 1e-6; // delta for comparisons of doubles public static void assertIndex(IndexDescriptor expected, String keyspace, Session session) { - IndexMetadata imd = session.getCluster().getMetadata().getKeyspace(keyspace.toLowerCase()) - .getTable(expected.getTableName().toCql()).getColumn(expected.getColumnName().toCql()).getIndex(); + TableMetadata tableMetadata = session.getCluster().getMetadata().getKeyspace(keyspace.toLowerCase()) + .getTable(expected.getTableName().toCql()); + + IndexMetadata imd = tableMetadata.getIndex(expected.getName().toCql()); - assertEquals(expected.getName(), imd.getName()); + assertEquals(expected.getName(), imd == null ? null : imd.getName()); } public static void assertNoIndex(IndexDescriptor expected, String keyspace, Session session) { - IndexMetadata imd = session.getCluster().getMetadata().getKeyspace(keyspace.toLowerCase()) - .getTable(expected.getTableName().toCql()).getColumn(expected.getColumnName().toCql()).getIndex(); + TableMetadata tableMetadata = session.getCluster().getMetadata().getKeyspace(keyspace.toLowerCase()) + .getTable(expected.getTableName().toCql()); + + IndexMetadata imd = tableMetadata.getIndex(expected.getName().toCql()); assertNull(imd); } diff --git a/spring-cql/src/test/java/org/springframework/cassandra/test/integration/core/cql/generator/CqlTableSpecificationAssertions.java b/spring-cql/src/test/java/org/springframework/cassandra/test/integration/core/cql/generator/CqlTableSpecificationAssertions.java index f544fde52..c61680562 100644 --- a/spring-cql/src/test/java/org/springframework/cassandra/test/integration/core/cql/generator/CqlTableSpecificationAssertions.java +++ b/spring-cql/src/test/java/org/springframework/cassandra/test/integration/core/cql/generator/CqlTableSpecificationAssertions.java @@ -32,7 +32,7 @@ import com.datastax.driver.core.ColumnMetadata; import com.datastax.driver.core.Session; import com.datastax.driver.core.TableMetadata; -import com.datastax.driver.core.TableMetadata.Options; +import com.datastax.driver.core.TableOptionsMetadata; public class CqlTableSpecificationAssertions { @@ -66,7 +66,7 @@ public static void assertPrimaryKeyColumns(TableDescriptor expected, TableMetada assertColumns(expected.getPrimaryKeyColumns(), actual.getPrimaryKey()); } - public static void assertOptions(Map expected, Options actual) { + public static void assertOptions(Map expected, TableOptionsMetadata actual) { for (String key : expected.keySet()) { @@ -139,7 +139,7 @@ public static TableOption getTableOptionFor(String key) { } @SuppressWarnings("unchecked") - public static T getOptionFor(TableOption option, Class type, Options options) { + public static T getOptionFor(TableOption option, Class type, TableOptionsMetadata options) { switch (option) { case BLOOM_FILTER_FP_CHANCE: return (T) (Double) options.getBloomFilterFalsePositiveChance(); diff --git a/spring-cql/src/test/java/org/springframework/cassandra/test/unit/config/CassandraCqlClusterFactoryBeanTests.java b/spring-cql/src/test/java/org/springframework/cassandra/test/unit/config/CassandraCqlClusterFactoryBeanTests.java index e4ac97a7e..ced71705f 100644 --- a/spring-cql/src/test/java/org/springframework/cassandra/test/unit/config/CassandraCqlClusterFactoryBeanTests.java +++ b/spring-cql/src/test/java/org/springframework/cassandra/test/unit/config/CassandraCqlClusterFactoryBeanTests.java @@ -47,11 +47,11 @@ public void tearDown() throws Exception { @Test public void configuredProtocolVersionShouldBeSet() throws Exception { - cassandraCqlClusterFactoryBean.setProtocolVersion(ProtocolVersion.V2); + cassandraCqlClusterFactoryBean.setProtocolVersion(ProtocolVersion.V4); cassandraCqlClusterFactoryBean.setPort(CASSANDRA_NATIVE_PORT); cassandraCqlClusterFactoryBean.afterPropertiesSet(); - assertEquals(ProtocolVersion.V2, getProtocolVersionEnum(cassandraCqlClusterFactoryBean)); + assertEquals(ProtocolVersion.V4, getProtocolVersionEnum(cassandraCqlClusterFactoryBean)); } @Test @@ -68,6 +68,6 @@ private ProtocolVersion getProtocolVersionEnum(CassandraCqlClusterFactoryBean ca // initialize connection factory cassandraCqlClusterFactoryBean.getObject().init(); - return cassandraCqlClusterFactoryBean.getObject().getConfiguration().getProtocolOptions().getProtocolVersionEnum(); + return cassandraCqlClusterFactoryBean.getObject().getConfiguration().getProtocolOptions().getProtocolVersion(); } } diff --git a/spring-cql/src/test/resources/spring-cassandra.yaml b/spring-cql/src/test/resources/spring-cassandra.yaml index a96a878ce..8490167b0 100644 --- a/spring-cql/src/test/resources/spring-cassandra.yaml +++ b/spring-cql/src/test/resources/spring-cassandra.yaml @@ -108,6 +108,9 @@ partitioner: org.apache.cassandra.dht.Murmur3Partitioner data_file_directories: - target/embeddedCassandra/data +hints_directory: + - target/embeddedCassandra/hints + # commit log commitlog_directory: target/embeddedCassandra/commitlog diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/ColumnReader.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/ColumnReader.java index 512eba128..c724e563a 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/ColumnReader.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/ColumnReader.java @@ -4,6 +4,7 @@ import org.springframework.cassandra.core.cql.CqlIdentifier; +import com.datastax.driver.core.CodecRegistry; import com.datastax.driver.core.ColumnDefinitions; import com.datastax.driver.core.DataType; import com.datastax.driver.core.Row; @@ -50,15 +51,15 @@ public Object get(int i) { List collectionTypes = type.getTypeArguments(); if (collectionTypes.size() == 2) { - return row.getMap(i, collectionTypes.get(0).asJavaClass(), collectionTypes.get(1).asJavaClass()); + return row.getMap(i, CodecRegistry.DEFAULT_INSTANCE.codecFor(collectionTypes.get(0)).getJavaType().getRawType(), CodecRegistry.DEFAULT_INSTANCE.codecFor(collectionTypes.get(1)).getJavaType().getRawType()); } if (type.equals(DataType.list(collectionTypes.get(0)))) { - return row.getList(i, collectionTypes.get(0).asJavaClass()); + return row.getList(i, CodecRegistry.DEFAULT_INSTANCE.codecFor(collectionTypes.get(0)).getJavaType().getRawType()); } if (type.equals(DataType.set(collectionTypes.get(0)))) { - return row.getSet(i, collectionTypes.get(0).asJavaClass()); + return row.getSet(i, CodecRegistry.DEFAULT_INSTANCE.codecFor(collectionTypes.get(0)).getJavaType().getRawType()); } throw new IllegalStateException("Unknown Collection type encountered. Valid collections are Set, List and Map."); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/MappingCassandraConverter.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/MappingCassandraConverter.java index cb35b8c22..bf41e3634 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/MappingCassandraConverter.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/MappingCassandraConverter.java @@ -46,6 +46,7 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; +import com.datastax.driver.core.CodecRegistry; import com.datastax.driver.core.Row; import com.datastax.driver.core.querybuilder.Delete.Where; import com.datastax.driver.core.querybuilder.Insert; @@ -240,7 +241,7 @@ protected void writeInsertFromWrapper(final ConvertingPropertyAccessor accessor, public void doWithPersistentProperty(CassandraPersistentProperty prop) { Object value = accessor.getProperty(prop, - prop.isCompositePrimaryKey() ? prop.getType() : prop.getDataType().asJavaClass()); + prop.isCompositePrimaryKey() ? prop.getType() : CodecRegistry.DEFAULT_INSTANCE.codecFor(prop.getDataType()).getJavaType().getRawType()); if (log.isDebugEnabled()) { log.debug("doWithProperties Property.type {}, Property.value {}", prop.getType().getName(), value); @@ -279,7 +280,7 @@ protected void writeUpdateFromWrapper(final ConvertingPropertyAccessor accessor, public void doWithPersistentProperty(CassandraPersistentProperty prop) { Object value = accessor.getProperty(prop, - prop.isCompositePrimaryKey() ? prop.getType() : prop.getDataType().asJavaClass()); + prop.isCompositePrimaryKey() ? prop.getType() : CodecRegistry.DEFAULT_INSTANCE.codecFor(prop.getDataType()).getJavaType().getRawType()); if (prop.isCompositePrimaryKey()) { CassandraPersistentEntity keyEntity = prop.getCompositePrimaryKeyEntity(); @@ -312,7 +313,7 @@ protected void writeDeleteWhereFromWrapper(final ConvertingPropertyAccessor acce @Override public void doWithPersistentProperty(CassandraPersistentProperty prop) { - Object value = accessor.getProperty(prop, prop.getDataType().asJavaClass()); + Object value = accessor.getProperty(prop, CodecRegistry.DEFAULT_INSTANCE.codecFor(prop.getDataType()).getJavaType().getRawType()); where.and(QueryBuilder.eq(prop.getColumnName().toCql(), value)); } }); @@ -374,7 +375,7 @@ public Object getId(Object object, CassandraPersistentEntity entity) { CassandraPersistentProperty idProperty = entity.getIdProperty(); if (idProperty != null) { return wrapper.getProperty(entity.getIdProperty(), - idProperty.isCompositePrimaryKey() ? idProperty.getType() : idProperty.getDataType().asJavaClass()); + idProperty.isCompositePrimaryKey() ? idProperty.getType() : CodecRegistry.DEFAULT_INSTANCE.codecFor(idProperty.getDataType()).getJavaType().getRawType()); } // if the class doesn't have an id property, then it's using MapId diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/RowReaderPropertyAccessor.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/RowReaderPropertyAccessor.java index 48b7c8ef8..544c34722 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/RowReaderPropertyAccessor.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/RowReaderPropertyAccessor.java @@ -21,6 +21,7 @@ import org.springframework.expression.PropertyAccessor; import org.springframework.expression.TypedValue; +import com.datastax.driver.core.CodecRegistry; import com.datastax.driver.core.DataType; import com.datastax.driver.core.ProtocolVersion; import com.datastax.driver.core.Row; @@ -52,7 +53,7 @@ public TypedValue read(EvaluationContext context, Object target, String name) { } DataType columnType = row.getColumnDefinitions().getType(name); ByteBuffer bytes = row.getBytes(name); - Object object = columnType.deserialize(bytes, ProtocolVersion.NEWEST_SUPPORTED); + Object object = CodecRegistry.DEFAULT_INSTANCE.codecFor(columnType).deserialize(bytes, ProtocolVersion.NEWEST_SUPPORTED); return new TypedValue(object); } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java index 928e6c379..1c2f29db5 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java @@ -188,30 +188,22 @@ public DataType getDataType() { private DataType getDataTypeFor(CassandraType annotation) { DataType.Name type = annotation.type(); + switch (type) { - if (type.isCollection()) { - switch (type) { + case MAP: + ensureTypeArguments(annotation.typeArguments().length, 2); + return DataType.map(getDataTypeFor(annotation.typeArguments()[0]), + getDataTypeFor(annotation.typeArguments()[1])); - case MAP: - ensureTypeArguments(annotation.typeArguments().length, 2); - return DataType.map(getDataTypeFor(annotation.typeArguments()[0]), - getDataTypeFor(annotation.typeArguments()[1])); + case LIST: + ensureTypeArguments(annotation.typeArguments().length, 1); + return DataType.list(getDataTypeFor(annotation.typeArguments()[0])); - case LIST: - ensureTypeArguments(annotation.typeArguments().length, 1); - return DataType.list(getDataTypeFor(annotation.typeArguments()[0])); - - case SET: - ensureTypeArguments(annotation.typeArguments().length, 1); - return DataType.set(getDataTypeFor(annotation.typeArguments()[0])); - - default: - throw new InvalidDataAccessApiUsageException(String.format( - "unknown multivalued DataType [%s] for property [%s] in entity [%s]", type, getType(), getOwner() - .getName())); - } - } else { + case SET: + ensureTypeArguments(annotation.typeArguments().length, 1); + return DataType.set(getDataTypeFor(annotation.typeArguments()[0])); + default: return CassandraSimpleTypeHolder.getDataTypeFor(type); } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/CassandraSimpleTypeHolder.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/CassandraSimpleTypeHolder.java index 22bd2efd0..779332b45 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/CassandraSimpleTypeHolder.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/CassandraSimpleTypeHolder.java @@ -26,6 +26,7 @@ import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.util.TypeInformation; +import com.datastax.driver.core.CodecRegistry; import com.datastax.driver.core.DataType; /** @@ -60,7 +61,7 @@ public class CassandraSimpleTypeHolder extends SimpleTypeHolder { for (DataType dataType : DataType.allPrimitiveTypes()) { - Class javaClass = dataType.asJavaClass(); + Class javaClass = CodecRegistry.DEFAULT_INSTANCE.codecFor(dataType).getJavaType().getRawType(); simpleTypes.add(javaClass); dataTypesByJavaClass.put(javaClass, dataType);