From c9bb49fad4daa0d8bd18570c5a9df1c80f812c21 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 23 Mar 2017 11:23:11 +0100 Subject: [PATCH] DATACASS-389 - Adapt to API changes in Spring Data Commons. --- .../convert/MappingCassandraConverter.java | 7 ++-- .../cassandra/core/CassandraTemplate.java | 38 +++++++++---------- .../mapping/BasicCassandraMappingContext.java | 7 +++- .../cdi/CassandraRepositoryBean.java | 15 ++++---- .../cdi/CassandraRepositoryExtension.java | 10 ++--- .../query/AbstractCassandraQuery.java | 1 - .../query/AbstractReactiveCassandraQuery.java | 1 - ...leCassandraRepositoryIntegrationTests.java | 6 +-- 8 files changed, 41 insertions(+), 44 deletions(-) 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 00f18cac8..6876bb7d9 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 @@ -254,8 +254,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter PropertyValueProvider propertyProvider) { return instantiators.getInstantiatorFor(entity).createInstance(entity, - new PersistentEntityParameterValueProvider<>(entity, propertyProvider, - Optional.empty())); + new PersistentEntityParameterValueProvider<>(entity, propertyProvider, Optional.empty())); } /* (non-Javadoc) @@ -837,8 +836,8 @@ public class MappingCassandraConverter extends AbstractCassandraConverter .getPersistentEntity(property.getActualType()).filter(CassandraPersistentEntity::isUserDefinedType); if (persistentEntity.isPresent() && obj.filter(it -> it instanceof UDTValue).isPresent()) { - persistentEntity - .map(cassandraPersistentEntity -> obj.map(it -> readEntityFromUdt(cassandraPersistentEntity, (UDTValue) it))); + return persistentEntity.flatMap( + cassandraPersistentEntity -> obj.map(it -> (T) readEntityFromUdt(cassandraPersistentEntity, (UDTValue) it))); } return obj.flatMap(it -> Optional.of((T) getPotentiallyConvertedSimpleRead(it, property.getType()))); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java index d7696bd04..3c4e24e36 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java @@ -32,7 +32,6 @@ import org.springframework.cassandra.core.WriteOptions; import org.springframework.cassandra.core.cql.CqlIdentifier; import org.springframework.cassandra.core.session.DefaultSessionFactory; import org.springframework.cassandra.core.session.SessionFactory; -import org.springframework.cassandra.core.util.CollectionUtils; import org.springframework.dao.DataAccessException; import org.springframework.data.cassandra.convert.CassandraConverter; import org.springframework.data.cassandra.convert.MappingCassandraConverter; @@ -79,8 +78,8 @@ public class CassandraTemplate implements CassandraOperations { private final CqlOperations cqlOperations; /** - * Creates an instance of {@link CassandraTemplate} initialized with the given {@link Session} - * and a default {@link MappingCassandraConverter}. + * Creates an instance of {@link CassandraTemplate} initialized with the given {@link Session} and a default + * {@link MappingCassandraConverter}. * * @param session {@link Session} used to interact with Cassandra; must not be {@literal null}. * @see CassandraConverter @@ -91,12 +90,12 @@ public class CassandraTemplate implements CassandraOperations { } /** - * Creates an instance of {@link CassandraTemplate} initialized with the given {@link Session} - * and {@link CassandraConverter}. + * Creates an instance of {@link CassandraTemplate} initialized with the given {@link Session} and + * {@link CassandraConverter}. * * @param session {@link Session} used to interact with Cassandra; must not be {@literal null}. - * @param converter {@link CassandraConverter} used to convert between Java and Cassandra types; - * must not be {@literal null}. + * @param converter {@link CassandraConverter} used to convert between Java and Cassandra types; must not be + * {@literal null}. * @see CassandraConverter * @see Session */ @@ -105,12 +104,12 @@ public class CassandraTemplate implements CassandraOperations { } /** - * Creates an instance of {@link CassandraTemplate} initialized with the given {@link SessionFactory} - * and {@link CassandraConverter}. + * Creates an instance of {@link CassandraTemplate} initialized with the given {@link SessionFactory} and + * {@link CassandraConverter}. * * @param sessionFactory {@link SessionFactory} used to interact with Cassandra; must not be {@literal null}. - * @param converter {@link CassandraConverter} used to convert between Java and Cassandra types; - * must not be {@literal null}. + * @param converter {@link CassandraConverter} used to convert between Java and Cassandra types; must not be + * {@literal null}. * @see CassandraConverter * @see SessionFactory */ @@ -119,12 +118,12 @@ public class CassandraTemplate implements CassandraOperations { } /** - * Creates an instance of {@link CassandraTemplate} initialized with the given {@link CqlOperations} - * and {@link CassandraConverter}. + * Creates an instance of {@link CassandraTemplate} initialized with the given {@link CqlOperations} and + * {@link CassandraConverter}. * * @param cqlOperations {@link CqlOperations} used to interact with Cassandra; must not be {@literal null}. - * @param converter {@link CassandraConverter} used to convert between Java and Cassandra types; - * must not be {@literal null}. + * @param converter {@link CassandraConverter} used to convert between Java and Cassandra types; must not be + * {@literal null}. * @see CassandraConverter * @see Session */ @@ -330,8 +329,7 @@ public class CassandraTemplate implements CassandraOperations { Assert.notNull(entity, "Entity must not be null"); - Insert insert = QueryUtils.createInsertQuery(getTableName(entity.getClass()).toCql(), - entity, options, converter); + Insert insert = QueryUtils.createInsertQuery(getTableName(entity.getClass()).toCql(), entity, options, converter); return cqlOperations.execute(new StatementCallback<>(insert, entity)); } @@ -354,8 +352,7 @@ public class CassandraTemplate implements CassandraOperations { Assert.notNull(entity, "Entity must not be null"); - Update update = QueryUtils.createUpdateQuery(getTableName(entity.getClass()).toCql(), - entity, options, converter); + Update update = QueryUtils.createUpdateQuery(getTableName(entity.getClass()).toCql(), entity, options, converter); return cqlOperations.execute(new StatementCallback<>(update, entity)); } @@ -378,8 +375,7 @@ public class CassandraTemplate implements CassandraOperations { Assert.notNull(entity, "Entity must not be null"); - Delete delete = QueryUtils.createDeleteQuery(getTableName(entity.getClass()).toCql(), - entity, options, converter); + Delete delete = QueryUtils.createDeleteQuery(getTableName(entity.getClass()).toCql(), entity, options, converter); return cqlOperations.execute(new StatementCallback<>(delete, entity)); } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContext.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContext.java index c1cedad8b..3f7d2bcab 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContext.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContext.java @@ -459,7 +459,12 @@ public class BasicCassandraMappingContext Optional> persistentEntity = getPersistentEntity(property.getActualType()); if (persistentEntity.filter(CassandraPersistentEntity::isUserDefinedType).isPresent()) { - return persistentEntity.get().getUserType(); + + Optional dataType = persistentEntity.map(it -> getUserDataType(property, dataTypeProvider, it)); + + if (dataType.isPresent()) { + return dataType.get(); + } } if (customConversions.hasCustomWriteTarget(property.getType())) { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/cdi/CassandraRepositoryBean.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/cdi/CassandraRepositoryBean.java index 0f0ff4dd2..ba184393f 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/cdi/CassandraRepositoryBean.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/cdi/CassandraRepositoryBean.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.springframework.data.cassandra.repository.cdi; import java.lang.annotation.Annotation; @@ -50,8 +49,8 @@ public class CassandraRepositoryBean extends CdiRepositoryBean { * implementations {@link CustomRepositoryImplementationDetector}, can be {@literal null}. */ public CassandraRepositoryBean(Bean operations, Set qualifiers, - Class repositoryType, BeanManager beanManager, Optional detector) { - super(qualifiers, repositoryType, beanManager, detector); + Class repositoryType, BeanManager beanManager, CustomRepositoryImplementationDetector detector) { + super(qualifiers, repositoryType, beanManager, Optional.of(detector)); Assert.notNull(operations, "Cannot create repository with 'null' for CassandraOperations."); this.cassandraOperationsBean = operations; @@ -64,14 +63,14 @@ public class CassandraRepositoryBean extends CdiRepositoryBean { @Override protected T create(CreationalContext creationalContext, Class repositoryType, Optional customImplementation) { + CassandraOperations cassandraOperations = getDependencyInstance(cassandraOperationsBean, CassandraOperations.class); - if (customImplementation.isPresent()) { - return new CassandraRepositoryFactory(cassandraOperations).getRepository(repositoryType, - customImplementation.get()); - } + CassandraRepositoryFactory factory = new CassandraRepositoryFactory(cassandraOperations); - return new CassandraRepositoryFactory(cassandraOperations).getRepository(repositoryType); + return customImplementation // + .map(o -> factory.getRepository(repositoryType, o)) // + .orElseGet(() -> factory.getRepository(repositoryType)); } @Override diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/cdi/CassandraRepositoryExtension.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/cdi/CassandraRepositoryExtension.java index b0f637445..703ac0d57 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/cdi/CassandraRepositoryExtension.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/cdi/CassandraRepositoryExtension.java @@ -16,7 +16,6 @@ package org.springframework.data.cassandra.repository.cdi; import java.lang.annotation.Annotation; -import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -51,6 +50,7 @@ public class CassandraRepositoryExtension extends CdiRepositoryExtensionSupport */ @SuppressWarnings("unchecked") void processBean(@Observes ProcessBean processBean) { + Bean bean = processBean.getBean(); bean.getTypes().stream() // .filter(type -> type instanceof Class && CassandraOperations.class.isAssignableFrom((Class) type)) // @@ -88,12 +88,12 @@ public class CassandraRepositoryExtension extends CdiRepositoryExtensionSupport private CdiRepositoryBean createRepositoryBean(Class repositoryType, Set qualifiers, BeanManager beanManager) { - - Bean cassandraOperationsBean = Optional.ofNullable(this.cassandraOperationsMap.get(qualifiers)).orElseThrow(() -> new UnsatisfiedResolutionException(String.format("Unable to resolve a bean for '%s' with qualifiers %s.", - CassandraOperations.class.getName(), qualifiers))); + Bean cassandraOperationsBean = Optional.ofNullable(this.cassandraOperationsMap.get(qualifiers)) + .orElseThrow(() -> new UnsatisfiedResolutionException(String.format( + "Unable to resolve a bean for '%s' with qualifiers %s.", CassandraOperations.class.getName(), qualifiers))); return new CassandraRepositoryBean<>(cassandraOperationsBean, qualifiers, repositoryType, beanManager, - Optional.of(getCustomImplementationDetector())); + getCustomImplementationDetector()); } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/AbstractCassandraQuery.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/AbstractCassandraQuery.java index fc38e2903..0cbf29322 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/AbstractCassandraQuery.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/AbstractCassandraQuery.java @@ -100,7 +100,6 @@ public abstract class AbstractCassandraQuery implements RepositoryQuery { CassandraParameterAccessor parameterAccessor = new ConvertingParameterAccessor(template.getConverter(), new CassandraParametersParameterAccessor(queryMethod, parameters)); - // FIXME: Use ResultProcessor#withDynamicProjection(ParameterAccessor) when available ResultProcessor resultProcessor = queryMethod.getResultProcessor().withDynamicProjection(parameterAccessor); String query = createQuery(parameterAccessor); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/AbstractReactiveCassandraQuery.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/AbstractReactiveCassandraQuery.java index e93b15c3b..3d9d0fb07 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/AbstractReactiveCassandraQuery.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/query/AbstractReactiveCassandraQuery.java @@ -99,7 +99,6 @@ public abstract class AbstractReactiveCassandraQuery implements RepositoryQuery String query = createQuery(convertingParameterAccessor); - // FIXME: Use ResultProcessor#withDynamicProjection(ParameterAccessor) when available ResultProcessor resultProcessor = method.getResultProcessor().withDynamicProjection(convertingParameterAccessor); ReactiveCassandraQueryExecution queryExecution = getExecution( diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepositoryIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepositoryIntegrationTests.java index 4c1344b7c..0779404bc 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepositoryIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepositoryIntegrationTests.java @@ -266,7 +266,7 @@ public class SimpleCassandraRepositoryIntegrationTests extends AbstractKeyspaceC Optional loaded = repository.findOne(dave.getId()); - assertThat(loaded).isPresent(); + assertThat(loaded).isEmpty(); } @Test // DATACASS-396 @@ -276,7 +276,7 @@ public class SimpleCassandraRepositoryIntegrationTests extends AbstractKeyspaceC Optional loaded = repository.findOne(dave.getId()); - assertThat(loaded).isPresent(); + assertThat(loaded).isEmpty(); } @Test // DATACASS-396 @@ -286,7 +286,7 @@ public class SimpleCassandraRepositoryIntegrationTests extends AbstractKeyspaceC Optional loaded = repository.findOne(boyd.getId()); - assertThat(loaded).isPresent(); + assertThat(loaded).isEmpty(); } interface PersonRepostitory extends TypedIdCassandraRepository {}