From bad5119d9b2cf053d5e49cca5aac233c21d5adcd Mon Sep 17 00:00:00 2001 From: John Blum Date: Tue, 10 Apr 2018 23:02:34 -0700 Subject: [PATCH] DATACASS-302 - Polish. Resolve gh-127. --- .../convert/CassandraCustomConversions.java | 9 ++++-- .../convert/CassandraJodaTimeConverters.java | 5 +++- .../CassandraThreeTenBackPortConverters.java | 12 +++++--- .../core/mapping/CassandraMappingContext.java | 8 +++-- .../CassandraJodaTimeConvertersUnitTests.java | 9 +++--- .../CassandraJsr310ConvertersUnitTests.java | 13 ++++---- ...raThreeTenBackPortConvertersUnitTests.java | 15 ++++++---- .../CassandraTypeMappingIntegrationTests.java | 30 ++++++++++++++++++- .../core/convert/UpdateMapperUnitTests.java | 3 +- .../CassandraMappingContextUnitTests.java | 7 +++-- 10 files changed, 80 insertions(+), 31 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraCustomConversions.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraCustomConversions.java index 0d6edee5b..68a2329b7 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraCustomConversions.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraCustomConversions.java @@ -45,8 +45,6 @@ import com.datastax.driver.core.DataType.Name; */ public class CassandraCustomConversions extends org.springframework.data.convert.CustomConversions { - private static final StoreConversions STORE_CONVERSIONS; - private static final List STORE_CONVERTERS; /** @@ -55,6 +53,8 @@ public class CassandraCustomConversions extends org.springframework.data.convert */ private final static Set> NATIVE_TIME_TYPE_MARKERS; + private static final StoreConversions STORE_CONVERSIONS; + static { List converters = new ArrayList<>(); @@ -74,13 +74,16 @@ public class CassandraCustomConversions extends org.springframework.data.convert .filter(it -> { CassandraType annotation = AnnotatedElementUtils.getMergedAnnotation(it, CassandraType.class); + return annotation != null && annotation.type() == Name.TIME; }) // .map(it -> { ResolvableType classType = ResolvableType.forClass(it).as(Converter.class).getGeneric(0); + return classType.getRawClass(); - }).collect(Collectors.toList()); + }) + .collect(Collectors.toList()); NATIVE_TIME_TYPE_MARKERS = new HashSet<>(timeMarkers); } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraJodaTimeConverters.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraJodaTimeConverters.java index 0286a1922..f5727faa3 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraJodaTimeConverters.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraJodaTimeConverters.java @@ -46,7 +46,10 @@ public abstract class CassandraJodaTimeConverters { /** * Returns the converters to be registered. Will only return converters in case JodaTime is present on the class path. * - * @return + * @return a {@link Collection} of Joda Time {@link Converter Converters} to register. + * @see org.springframework.core.convert.converter.Converter + * @see java.util.Collection + * @see org.joda.time */ public static Collection> getConvertersToRegister() { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraThreeTenBackPortConverters.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraThreeTenBackPortConverters.java index d44ff1b43..8ea683860 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraThreeTenBackPortConverters.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraThreeTenBackPortConverters.java @@ -37,13 +37,14 @@ import com.datastax.driver.core.DataType.Name; * the classpath. * * @author Mark Paluch - * @see http://www.threeten.org/threetenbp + * @see Threeten Backport * @since 1.5 */ public abstract class CassandraThreeTenBackPortConverters { - private static final boolean THREE_TEN_BACK_PORT_IS_PRESENT = ClassUtils.isPresent("org.threeten.bp.LocalDateTime", - ThreeTenBackPortConverters.class.getClassLoader()); + private static final boolean THREE_TEN_BACK_PORT_IS_PRESENT = + ClassUtils.isPresent("org.threeten.bp.LocalDateTime", + ThreeTenBackPortConverters.class.getClassLoader()); private CassandraThreeTenBackPortConverters() {} @@ -51,7 +52,10 @@ public abstract class CassandraThreeTenBackPortConverters { * Returns the converters to be registered. Will only return converters in case ThreeTen Backport is on the class * path. * - * @return + * @return a {@link Collection} of ThreeTen Backport {@link Converter Converters} to register. + * @see org.springframework.core.convert.converter.Converter + * @see java.util.Collection + * @see org.joda.time */ public static Collection> getConvertersToRegister() { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContext.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContext.java index 808618d8a..d1ba791b5 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContext.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContext.java @@ -16,7 +16,6 @@ package org.springframework.data.cassandra.core.mapping; import static org.springframework.data.cassandra.core.cql.keyspace.CreateTableSpecification.createTable; -import static org.springframework.data.cassandra.core.mapping.CassandraSimpleTypeHolder.getDataTypeFor; import java.util.ArrayList; import java.util.Arrays; @@ -615,7 +614,9 @@ public class CassandraMappingContext DataType dataType = customWriteTarget .orElseGet(() -> { + Class propertyType = typeInformation.getRequiredActualType().getType(); + return this.customConversions.getCustomWriteTarget(propertyType).filter(it -> !typeInformation.isMap()) .map(it -> { @@ -648,12 +649,13 @@ public class CassandraMappingContext @Nullable private DataType doGetDataType(Class propertyType, Class converted) { - if (customConversions instanceof CassandraCustomConversions) { + if (this.customConversions instanceof CassandraCustomConversions) { - CassandraCustomConversions conversions = (CassandraCustomConversions) customConversions; + CassandraCustomConversions conversions = (CassandraCustomConversions) this.customConversions; if (conversions.isNativeTimeTypeMarker(converted) || (conversions.isNativeTimeTypeMarker(propertyType) && Long.class.equals(converted))) { + return DataType.time(); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJodaTimeConvertersUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJodaTimeConvertersUnitTests.java index 8f3da6419..f7780b8a4 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJodaTimeConvertersUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJodaTimeConvertersUnitTests.java @@ -15,10 +15,11 @@ */ package org.springframework.data.cassandra.core.convert; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; import org.joda.time.LocalTime; -import org.junit.Test; import org.springframework.data.cassandra.core.convert.CassandraJodaTimeConverters.LocalTimeToMillisOfDayConverter; import org.springframework.data.cassandra.core.convert.CassandraJodaTimeConverters.MillisOfDayToLocalTimeConverter; @@ -30,14 +31,14 @@ import org.springframework.data.cassandra.core.convert.CassandraJodaTimeConverte public class CassandraJodaTimeConvertersUnitTests { @Test // DATACASS-302 - public void shouldConvertLocalTimeToLong() { + public void shouldConvertLongToLocalTime() { assertThat(MillisOfDayToLocalTimeConverter.INSTANCE.convert(3723000L)) .isEqualTo(LocalTime.fromMillisOfDay(3723000L)); } @Test // DATACASS-302 - public void shouldConvertLongToLocalTime() { + public void shouldConvertLocalTimeToLong() { assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.MIDNIGHT)).isZero(); assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.fromMillisOfDay(3723000L))) diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJsr310ConvertersUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJsr310ConvertersUnitTests.java index 3a484c343..5150c3086 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJsr310ConvertersUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJsr310ConvertersUnitTests.java @@ -15,11 +15,12 @@ */ package org.springframework.data.cassandra.core.convert; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; import java.time.LocalTime; import org.junit.Test; + import org.springframework.data.cassandra.core.convert.CassandraJsr310Converters.LocalTimeToMillisOfDayConverter; import org.springframework.data.cassandra.core.convert.CassandraJsr310Converters.MillisOfDayToLocalTimeConverter; @@ -31,15 +32,17 @@ import org.springframework.data.cassandra.core.convert.CassandraJsr310Converters public class CassandraJsr310ConvertersUnitTests { @Test // DATACASS-302 - public void shouldConvertLocalTimeToLong() { + public void shouldConvertLongToLocalTime() { - assertThat(MillisOfDayToLocalTimeConverter.INSTANCE.convert(3723000L)).isEqualTo(LocalTime.of(1, 2, 3)); + assertThat(MillisOfDayToLocalTimeConverter.INSTANCE.convert(3723000L)) + .isEqualTo(LocalTime.of(1, 2, 3)); } @Test // DATACASS-302 - public void shouldConvertLongToLocalTime() { + public void shouldConvertLocalTimeToLong() { assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.MIDNIGHT)).isZero(); - assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.of(1, 2, 3))).isEqualTo(3723000L); + assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.of(1, 2, 3))) + .isEqualTo(3723000L); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraThreeTenBackPortConvertersUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraThreeTenBackPortConvertersUnitTests.java index 3e48c6718..fbc404a75 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraThreeTenBackPortConvertersUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraThreeTenBackPortConvertersUnitTests.java @@ -15,12 +15,13 @@ */ package org.springframework.data.cassandra.core.convert; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; import org.junit.Test; + +import org.threeten.bp.LocalTime; import org.springframework.data.cassandra.core.convert.CassandraThreeTenBackPortConverters.LocalTimeToMillisOfDayConverter; import org.springframework.data.cassandra.core.convert.CassandraThreeTenBackPortConverters.MillisOfDayToLocalTimeConverter; -import org.threeten.bp.LocalTime; /** * Unit tests for {@link CassandraThreeTenBackPortConverters}. @@ -30,15 +31,17 @@ import org.threeten.bp.LocalTime; public class CassandraThreeTenBackPortConvertersUnitTests { @Test // DATACASS-302 - public void shouldConvertLocalTimeToLong() { + public void shouldConvertLongToLocalTime() { - assertThat(MillisOfDayToLocalTimeConverter.INSTANCE.convert(3723000L)).isEqualTo(LocalTime.of(1, 2, 3)); + assertThat(MillisOfDayToLocalTimeConverter.INSTANCE.convert(3723000L)) + .isEqualTo(LocalTime.of(1, 2, 3)); } @Test // DATACASS-302 - public void shouldConvertLongToLocalTime() { + public void shouldConvertLocalTimeToLong() { assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.MIDNIGHT)).isZero(); - assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.of(1, 2, 3))).isEqualTo(3723000L); + assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.of(1, 2, 3))) + .isEqualTo(3723000L); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraTypeMappingIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraTypeMappingIntegrationTests.java index 5fe6cc765..21db0bb6e 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraTypeMappingIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraTypeMappingIntegrationTests.java @@ -35,10 +35,10 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; + import org.springframework.data.annotation.Id; import org.springframework.data.cassandra.core.CassandraOperations; import org.springframework.data.cassandra.core.CassandraTemplate; @@ -511,9 +511,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteLocalDate() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setLocalDate(java.time.LocalDate.of(2010, 7, 4)); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getLocalDate()).isEqualTo(entity.getLocalDate()); @@ -523,9 +525,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteLocalDateTime() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setLocalDateTime(java.time.LocalDateTime.of(2010, 7, 4, 1, 2, 3)); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getLocalDateTime()).isEqualTo(entity.getLocalDateTime()); @@ -535,9 +539,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteLocalTime() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setLocalTime(java.time.LocalTime.of(1, 2, 3)); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getLocalTime()).isEqualTo(entity.getLocalTime()); @@ -547,9 +553,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteJodaLocalTime() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setJodaLocalTime(org.joda.time.LocalTime.fromMillisOfDay(50000)); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getJodaLocalTime()).isEqualTo(entity.getJodaLocalTime()); @@ -559,9 +567,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteInstant() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setInstant(java.time.Instant.now()); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getInstant()).isEqualTo(entity.getInstant()); @@ -571,9 +581,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteZoneId() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setZoneId(java.time.ZoneId.of("Europe/Paris")); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getZoneId()).isEqualTo(entity.getZoneId()); @@ -583,9 +595,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteJodaLocalDate() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setJodaLocalDate(new org.joda.time.LocalDate(2010, 7, 4)); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getJodaLocalDate()).isEqualTo(entity.getJodaLocalDate()); @@ -595,9 +609,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteJodaDateTime() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setJodaDateTime(new org.joda.time.DateTime(2010, 7, 4, 1, 2, 3)); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getJodaDateTime()).isEqualTo(entity.getJodaDateTime()); @@ -607,9 +623,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteBpLocalDate() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setBpLocalDate(org.threeten.bp.LocalDate.of(2010, 7, 4)); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getBpLocalDate()).isEqualTo(entity.getBpLocalDate()); @@ -619,9 +637,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteBpLocalDateTime() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setBpLocalDateTime(org.threeten.bp.LocalDateTime.of(2010, 7, 4, 1, 2, 3)); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getBpLocalDateTime()).isEqualTo(entity.getBpLocalDateTime()); @@ -631,9 +651,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteBpLocalTime() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setBpLocalTime(org.threeten.bp.LocalTime.of(1, 2, 3)); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getBpLocalTime()).isEqualTo(entity.getBpLocalTime()); @@ -643,9 +665,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteBpInstant() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setBpInstant(org.threeten.bp.Instant.now()); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getBpZoneId()).isEqualTo(entity.getBpZoneId()); @@ -655,9 +679,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteBpZoneId() { AllPossibleTypes entity = new AllPossibleTypes("1"); + entity.setBpZoneId(org.threeten.bp.ZoneId.of("Europe/Paris")); operations.insert(entity); + AllPossibleTypes loaded = load(entity); assertThat(loaded.getBpZoneId()).isEqualTo(entity.getBpZoneId()); @@ -668,9 +694,11 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati public void shouldReadAndWriteCounter() { CounterEntity entity = new CounterEntity("1"); + entity.setCount(1); operations.update(entity); + CounterEntity loaded = operations.selectOneById(entity.getId(), CounterEntity.class); assertThat(loaded.getCount()).isEqualTo(entity.getCount()); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/UpdateMapperUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/UpdateMapperUnitTests.java index d4eb2bf63..ab485f391 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/UpdateMapperUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/UpdateMapperUnitTests.java @@ -242,7 +242,8 @@ public class UpdateMapperUnitTests { @Test // DATACASS-302 public void shouldMapTime() { - Update update = this.updateMapper.getMappedObject(Update.empty().set("localTime", LocalTime.of(1, 2, 3)), + Update update = this.updateMapper.getMappedObject(Update.empty() + .set("localTime", LocalTime.of(1, 2, 3)), this.persistentEntity); assertThat(update.getUpdateOperations()).hasSize(1); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java index c32be4bc2..be2e8e90e 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java @@ -456,8 +456,8 @@ public class CassandraMappingContextUnitTests { mappingContext.setCustomConversions( new CassandraCustomConversions(Collections.singletonList(HumanToStringConverter.INSTANCE))); - CassandraPersistentEntity persistentEntity = mappingContext - .getRequiredPersistentEntity(TypeWithListOfHumans.class); + CassandraPersistentEntity persistentEntity = + mappingContext.getRequiredPersistentEntity(TypeWithListOfHumans.class); assertThat(mappingContext.getDataType(persistentEntity.getRequiredPersistentProperty("humans"))) .isEqualTo(DataType.list(DataType.varchar())); @@ -466,7 +466,8 @@ public class CassandraMappingContextUnitTests { @Test // DATACASS-302 public void propertyTypeShouldMapToTime() { - CassandraPersistentEntity persistentEntity = mappingContext.getRequiredPersistentEntity(AllPossibleTypes.class); + CassandraPersistentEntity persistentEntity = + mappingContext.getRequiredPersistentEntity(AllPossibleTypes.class); assertThat(mappingContext.getDataType(persistentEntity.getRequiredPersistentProperty("localTime"))) .isEqualTo(DataType.time());