From 99838c02fde10c61e840451c76f0934989ad2e52 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 14 Nov 2016 12:13:33 +0100 Subject: [PATCH] DATAMONGO-1444 - Adapt to new changes in reactive repository configuration. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now use the newly introduced ….useRepositoryConfiguration(…) in the module specific RepositoryConfigurationExtension implementations to distinguish between reactive and non-reactive repositories. Removed RepositoryType class as it was only used by the previous repository typ detection. --- ...MongoRepositoryConfigurationExtension.java | 28 ++----- ...MongoRepositoryConfigurationExtension.java | 76 ++----------------- .../repository/config/RepositoryType.java | 68 ----------------- 3 files changed, 13 insertions(+), 159 deletions(-) delete mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/RepositoryType.java diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigurationExtension.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigurationExtension.java index 6aa5fd713..fbdf70c37 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigurationExtension.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigurationExtension.java @@ -18,14 +18,12 @@ package org.springframework.data.mongodb.repository.config; import java.lang.annotation.Annotation; import java.util.Collection; import java.util.Collections; -import java.util.stream.Collectors; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.annotation.AnnotationAttributes; -import org.springframework.core.io.ResourceLoader; import org.springframework.data.config.ParsingUtils; import org.springframework.data.mongodb.config.BeanNames; import org.springframework.data.mongodb.core.mapping.Document; @@ -33,12 +31,11 @@ import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean; import org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource; -import org.springframework.data.repository.config.RepositoryConfiguration; import org.springframework.data.repository.config.RepositoryConfigurationExtension; import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport; import org.springframework.data.repository.config.RepositoryConfigurationSource; import org.springframework.data.repository.config.XmlRepositoryConfigurationSource; -import org.springframework.data.repository.util.ReactiveWrappers; +import org.springframework.data.repository.core.RepositoryMetadata; import org.w3c.dom.Element; /** @@ -141,23 +138,12 @@ public class MongoRepositoryConfigurationExtension extends RepositoryConfigurati } } + /* + * (non-Javadoc) + * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#useRepositoryConfiguration(org.springframework.data.repository.core.RepositoryMetadata) + */ @Override - public Collection> getRepositoryConfigurations( - T configSource, ResourceLoader loader, boolean strictMatchesOnly) { - - Collection> repositoryConfigurations = super.getRepositoryConfigurations(configSource, - loader, strictMatchesOnly); - - if (ReactiveWrappers.isAvailable()) { - - return repositoryConfigurations.stream().filter(configuration -> { - - Class repositoryInterface = loadRepositoryInterface(configuration, loader); - return !RepositoryType.isReactiveRepository(repositoryInterface); - - }).collect(Collectors.toList()); - } - - return repositoryConfigurations; + protected boolean useRepositoryConfiguration(RepositoryMetadata metadata) { + return !metadata.isReactiveRepository(); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/ReactiveMongoRepositoryConfigurationExtension.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/ReactiveMongoRepositoryConfigurationExtension.java index 04678d3d8..bca196efc 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/ReactiveMongoRepositoryConfigurationExtension.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/ReactiveMongoRepositoryConfigurationExtension.java @@ -16,29 +16,18 @@ package org.springframework.data.mongodb.repository.config; -import java.lang.annotation.Annotation; import java.util.Collection; import java.util.Collections; -import java.util.stream.Collectors; -import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.annotation.AnnotationAttributes; -import org.springframework.core.io.ResourceLoader; import org.springframework.data.config.ParsingUtils; -import org.springframework.data.mongodb.config.BeanNames; -import org.springframework.data.mongodb.core.mapping.Document; -import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import org.springframework.data.mongodb.repository.support.ReactiveMongoRepositoryFactoryBean; import org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource; -import org.springframework.data.repository.config.RepositoryConfiguration; import org.springframework.data.repository.config.RepositoryConfigurationExtension; -import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport; -import org.springframework.data.repository.config.RepositoryConfigurationSource; import org.springframework.data.repository.config.XmlRepositoryConfigurationSource; +import org.springframework.data.repository.core.RepositoryMetadata; import org.w3c.dom.Element; /** @@ -46,15 +35,14 @@ import org.w3c.dom.Element; * * @author Mark Paluch * @author Christoph Strobl + * @author Oliver Gierke * @since 2.0 */ -public class ReactiveMongoRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport { +class ReactiveMongoRepositoryConfigurationExtension extends MongoRepositoryConfigurationExtension { private static final String MONGO_TEMPLATE_REF = "reactive-mongo-template-ref"; private static final String CREATE_QUERY_INDEXES = "create-query-indexes"; - private boolean fallbackMappingContextCreated = false; - /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getModuleName() @@ -64,15 +52,6 @@ public class ReactiveMongoRepositoryConfigurationExtension extends RepositoryCon return "Reactive MongoDB"; } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getModulePrefix() - */ - @Override - protected String getModulePrefix() { - return "mongo"; - } - /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfigurationExtension#getRepositoryFactoryClassName() @@ -81,15 +60,6 @@ public class ReactiveMongoRepositoryConfigurationExtension extends RepositoryCon return ReactiveMongoRepositoryFactoryBean.class.getName(); } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getIdentifyingAnnotations() - */ - @Override - protected Collection> getIdentifyingAnnotations() { - return Collections.singleton(Document.class); - } - /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getIdentifyingTypes() @@ -99,18 +69,6 @@ public class ReactiveMongoRepositoryConfigurationExtension extends RepositoryCon return Collections.singleton(ReactiveMongoRepository.class); } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#postProcess(org.springframework.beans.factory.support.BeanDefinitionBuilder, org.springframework.data.repository.config.RepositoryConfigurationSource) - */ - @Override - public void postProcess(BeanDefinitionBuilder builder, RepositoryConfigurationSource source) { - - if (fallbackMappingContextCreated) { - builder.addPropertyReference("mappingContext", BeanNames.MAPPING_CONTEXT_BEAN_NAME); - } - } - /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#postProcess(org.springframework.beans.factory.support.BeanDefinitionBuilder, org.springframework.data.repository.config.XmlRepositoryConfigurationSource) @@ -139,32 +97,10 @@ public class ReactiveMongoRepositoryConfigurationExtension extends RepositoryCon /* * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#registerBeansForRoot(org.springframework.beans.factory.support.BeanDefinitionRegistry, org.springframework.data.repository.config.RepositoryConfigurationSource) + * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#useRepositoryConfiguration(org.springframework.data.repository.core.RepositoryMetadata) */ @Override - public void registerBeansForRoot(BeanDefinitionRegistry registry, RepositoryConfigurationSource configurationSource) { - - super.registerBeansForRoot(registry, configurationSource); - - if (!registry.containsBeanDefinition(BeanNames.MAPPING_CONTEXT_BEAN_NAME)) { - - RootBeanDefinition definition = new RootBeanDefinition(MongoMappingContext.class); - definition.setRole(AbstractBeanDefinition.ROLE_INFRASTRUCTURE); - definition.setSource(configurationSource.getSource()); - - registry.registerBeanDefinition(BeanNames.MAPPING_CONTEXT_BEAN_NAME, definition); - } - } - - @Override - public Collection> getRepositoryConfigurations( - T configSource, ResourceLoader loader, boolean strictMatchesOnly) { - - Collection> repositoryConfigurations = super.getRepositoryConfigurations(configSource, - loader, strictMatchesOnly); - - return repositoryConfigurations.stream() - .filter(configuration -> RepositoryType.isReactiveRepository(loadRepositoryInterface(configuration, loader))) - .collect(Collectors.toList()); + protected boolean useRepositoryConfiguration(RepositoryMetadata metadata) { + return metadata.isReactiveRepository(); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/RepositoryType.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/RepositoryType.java deleted file mode 100644 index 55f51df5d..000000000 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/RepositoryType.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2016 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 - * - * 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.springframework.data.mongodb.repository.config; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - -import org.springframework.data.repository.util.ReactiveWrappers; -import org.springframework.util.ReflectionUtils; - -import lombok.experimental.UtilityClass; - -/** - * Utility class to discover whether a repository interface uses reactive wrapper types. - * - * @author Mark Paluch - * @author Christoph Strobl - * @since 2.0 - */ -@UtilityClass -class RepositoryType { - - /** - * @param repositoryInterface - * @return {@literal true} if the {@code repositoryInterface} uses reactive wrapper types. - * @see ReactiveWrappers - * @see ReactiveWrappers#isAvailable() - */ - public static boolean isReactiveRepository(Class repositoryInterface) { - - if (!ReactiveWrappers.isAvailable()) { - return false; - } - - List reactiveMethods = new ArrayList<>(); - ReflectionUtils.doWithMethods(repositoryInterface, reactiveMethods::add, RepositoryType::usesReactiveWrappers); - return !reactiveMethods.isEmpty(); - } - - private static boolean usesReactiveWrappers(Method method) { - - if (ReactiveWrappers.supports(method.getReturnType())) { - return true; - } - - for (Class parameterType : method.getParameterTypes()) { - if (ReactiveWrappers.supports(parameterType)) { - return true; - } - } - - return false; - } -}