From 1db32834e125cc6e989acd5899b1a7827248d42a Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 13 Jul 2017 09:58:03 +0200 Subject: [PATCH] DATACASS-468 - Polishing. Increase CassandraRepositoryConfigurationExtension visibility as this class is required by configuration infrastructure that configures Cassandra repository support such as Spring Boot. Initialize MappingCassandraConverter with generic custom conversions and resolve package cycle between mapping and convert by initializing MappingCassandraConverter with generic custom conversions. Cassandra-specific custom conversions require external wiring via configuration. Move IdInterfaceValidator to mapping package to resolve the final cycle between mapping and repository.support. --- .../convert/MappingCassandraConverter.java | 18 +++++++++++++----- .../core/mapping/CassandraMappingContext.java | 11 +++++++---- .../mapping}/IdInterfaceException.java | 2 +- .../mapping}/IdInterfaceExceptions.java | 6 +++--- .../mapping}/IdInterfaceValidator.java | 7 +++---- .../cassandra/core/mapping/MapIdFactory.java | 1 - ...sandraRepositoryConfigurationExtension.java | 2 +- .../core/mapping/MapIdFactoryUnitTests.java | 3 +-- src/main/asciidoc/new-features.adoc | 1 + 9 files changed, 30 insertions(+), 21 deletions(-) rename spring-data-cassandra/src/main/java/org/springframework/data/cassandra/{repository/support => core/mapping}/IdInterfaceException.java (95%) rename spring-data-cassandra/src/main/java/org/springframework/data/cassandra/{repository/support => core/mapping}/IdInterfaceExceptions.java (94%) rename spring-data-cassandra/src/main/java/org/springframework/data/cassandra/{repository/support => core/mapping}/IdInterfaceValidator.java (95%) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java index 11b910f0e..65e739aa5 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java @@ -15,7 +15,6 @@ */ package org.springframework.data.cassandra.core.convert; - import lombok.AllArgsConstructor; import java.util.ArrayList; @@ -24,7 +23,6 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Map.Entry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,7 +94,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter * Create a new {@link MappingCassandraConverter} with a {@link CassandraMappingContext}. */ public MappingCassandraConverter() { - this(new CassandraMappingContext()); + this(createMappingContext()); } /** @@ -114,6 +112,14 @@ public class MappingCassandraConverter extends AbstractCassandraConverter this.spELContext = new SpELContext(RowReaderPropertyAccessor.INSTANCE); } + private static CassandraMappingContext createMappingContext() { + + CassandraMappingContext mappingContext = new CassandraMappingContext(); + mappingContext.setCustomConversions(new CassandraCustomConversions(Collections.emptyList())); + + return mappingContext; + } + /* (non-Javadoc) * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) */ @@ -494,7 +500,8 @@ public class MappingCassandraConverter extends AbstractCassandraConverter // FIXME: Generics CassandraPersistentEntity whereEntity = compositeIdProperty != null - ? mappingContext.getRequiredPersistentEntity(compositeIdProperty) : entity; + ? mappingContext.getRequiredPersistentEntity(compositeIdProperty) + : entity; return getWhereClauses((MapId) id, whereEntity); } @@ -630,7 +637,8 @@ public class MappingCassandraConverter extends AbstractCassandraConverter private ConvertingPropertyAccessor getConvertingAccessor(Object source, CassandraPersistentEntity entity) { PersistentPropertyAccessor propertyAccessor = (source instanceof PersistentPropertyAccessor - ? (PersistentPropertyAccessor) source : entity.getPropertyAccessor(source)); + ? (PersistentPropertyAccessor) source + : entity.getPropertyAccessor(source)); return new ConvertingPropertyAccessor(propertyAccessor, getConversionService()); } 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 3e2163b42..2cfef5976 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 @@ -35,12 +35,12 @@ import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.annotation.AnnotatedElementUtils; -import org.springframework.data.cassandra.core.convert.CassandraCustomConversions; import org.springframework.data.cassandra.core.cql.CqlIdentifier; import org.springframework.data.cassandra.core.cql.keyspace.CreateTableSpecification; import org.springframework.data.cassandra.core.cql.keyspace.CreateUserTypeSpecification; import org.springframework.data.cassandra.core.mapping.UserTypeUtil.FrozenLiteralDataType; import org.springframework.data.convert.CustomConversions; +import org.springframework.data.convert.CustomConversions.StoreConversions; import org.springframework.data.mapping.MappingException; import org.springframework.data.mapping.PropertyHandler; import org.springframework.data.mapping.context.AbstractMappingContext; @@ -71,7 +71,8 @@ public class CassandraMappingContext private CassandraPersistentEntityMetadataVerifier verifier = new CompositeCassandraPersistentEntityMetadataVerifier(); - private CustomConversions customConversions; + private CustomConversions customConversions = new CustomConversions( + StoreConversions.of(CassandraSimpleTypeHolder.HOLDER), Collections.emptyList()); private Mapping mapping = new Mapping(); @@ -91,7 +92,8 @@ public class CassandraMappingContext */ public CassandraMappingContext() { - setCustomConversions(new CassandraCustomConversions(Collections.EMPTY_LIST)); + setCustomConversions( + new CustomConversions(StoreConversions.of(CassandraSimpleTypeHolder.HOLDER), Collections.EMPTY_LIST)); setSimpleTypeHolder(CassandraSimpleTypeHolder.HOLDER); } @@ -244,7 +246,8 @@ public class CassandraMappingContext // Prevent conversion types created as CassandraPersistentEntity Optional> optional = shouldCreatePersistentEntityFor(typeInformation) - ? super.addPersistentEntity(typeInformation) : Optional.empty(); + ? super.addPersistentEntity(typeInformation) + : Optional.empty(); optional.ifPresent(entity -> { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/IdInterfaceException.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/IdInterfaceException.java similarity index 95% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/IdInterfaceException.java rename to spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/IdInterfaceException.java index d5b5555ab..381e0a0cd 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/IdInterfaceException.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/IdInterfaceException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.repository.support; +package org.springframework.data.cassandra.core.mapping; import java.lang.reflect.Method; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/IdInterfaceExceptions.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/IdInterfaceExceptions.java similarity index 94% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/IdInterfaceExceptions.java rename to spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/IdInterfaceExceptions.java index 1c1b5b3eb..e998d918e 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/IdInterfaceExceptions.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/IdInterfaceExceptions.java @@ -1,11 +1,11 @@ /* - * Copyright 2013-2017 the original author or authors + * Copyright 2017 the original author or 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 + * 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, @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.repository.support; +package org.springframework.data.cassandra.core.mapping; import java.util.Collection; import java.util.Collections; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/IdInterfaceValidator.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/IdInterfaceValidator.java similarity index 95% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/IdInterfaceValidator.java rename to spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/IdInterfaceValidator.java index 46afb6174..baf1e9354 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/IdInterfaceValidator.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/IdInterfaceValidator.java @@ -13,20 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.repository.support; +package org.springframework.data.cassandra.core.mapping; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; -import org.springframework.data.cassandra.core.mapping.MapId; import org.springframework.data.mapping.MappingException; /** * @author Matthew T. Adams * @author Mark Paluch */ -public class IdInterfaceValidator { +class IdInterfaceValidator { /** * Validates the form of the given id interface candidate type. If the interface violates the following restrictions, @@ -62,7 +61,7 @@ public class IdInterfaceValidator { * @see IdInterfaceExceptions#getExceptions() * @see {@link IdInterfaceException} */ - public static void validate(Class id) { + static void validate(Class id) { List exceptions = new ArrayList<>(); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/MapIdFactory.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/MapIdFactory.java index c6fba1d4c..022a58d6a 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/MapIdFactory.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/MapIdFactory.java @@ -20,7 +20,6 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import org.springframework.data.cassandra.repository.support.IdInterfaceValidator; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoryConfigurationExtension.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoryConfigurationExtension.java index aefadd923..258a1828f 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoryConfigurationExtension.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoryConfigurationExtension.java @@ -41,7 +41,7 @@ import org.w3c.dom.Element; * @author Christoph Strobl * @author Mateusz Szymczak */ -class CassandraRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport { +public class CassandraRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport { private static final String CASSANDRA_TEMPLATE_REF = "cassandra-template-ref"; diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/MapIdFactoryUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/MapIdFactoryUnitTests.java index 408e25e23..7ed9bdb68 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/MapIdFactoryUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/MapIdFactoryUnitTests.java @@ -17,14 +17,13 @@ package org.springframework.data.cassandra.core.mapping; import static org.assertj.core.api.Assertions.*; +import static org.springframework.data.cassandra.core.mapping.IdInterfaceValidator.*; import static org.springframework.data.cassandra.core.mapping.MapIdFactory.*; -import static org.springframework.data.cassandra.repository.support.IdInterfaceValidator.*; import java.io.Serializable; import java.util.Random; import org.junit.Test; -import org.springframework.data.cassandra.repository.support.IdInterfaceExceptions; /** * Unit tests for {@link MapIdFactory}. diff --git a/src/main/asciidoc/new-features.adoc b/src/main/asciidoc/new-features.adoc index cd61c94fa..c29458324 100644 --- a/src/main/asciidoc/new-features.adoc +++ b/src/main/asciidoc/new-features.adoc @@ -6,6 +6,7 @@ * `Update` and `Query` objects. * CRUD repository interface renaming: `CassandraRepository` using `MapId` is now renamed to `MapIdCassandraRepository`. `TypedIdCassandraRepository` is renamed to `CassandraRepository`. * Lightweight transactions via `InsertOptions` and `UpdateOptions` using the Template API. +* Merge of Spring CQL into Spring Data Cassandra. [[new-features.1-5-0]] == What's new in Spring Data for Apache Cassandra 1.5