From 1183789bb3f377ebe4bbbf6583cdc2fcca9ccba7 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 23 Mar 2011 09:12:07 +0100 Subject: [PATCH] DATADOC-69 - Repository namespace now allows referenceing a MappingContext and picks up the default one if available. --- .../config/MongoMappingConverterParser.java | 5 +- ...MongoRepositoryConfigDefinitionParser.java | 51 +++++++++++++++---- .../SimpleMongoRepositoryConfiguration.java | 24 +++++++++ .../mongodb/config/spring-mongo-1.0.xsd | 7 +++ .../MongoNamespaceIntegrationTests.java | 16 ++++++ .../src/test/resources/mapping.xml | 2 - ...MongoNamespaceIntegrationTests-context.xml | 13 ++++- 7 files changed, 101 insertions(+), 17 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java index 281e490ca..7c7c82068 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java @@ -44,14 +44,15 @@ import org.w3c.dom.Element; */ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser { - private static final String MAPPING_CONTEXT = "mappingContext"; + static final String MAPPING_CONTEXT = "mappingContext"; private static final String MAPPING_CONFIGURATION_HELPER = "mappingConfigurationHelper"; private static final String TEMPLATE = "mongoTemplate"; private static final String BASE_PACKAGE = "base-package"; @Override protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException { - return "mappingConverter"; + String id = super.resolveId(element, definition, parserContext); + return StringUtils.hasText(id) ? id : "mappingConverter"; } @Override diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryConfigDefinitionParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryConfigDefinitionParser.java index a66f006c3..c4f39da30 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryConfigDefinitionParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryConfigDefinitionParser.java @@ -15,8 +15,11 @@ */ package org.springframework.data.document.mongodb.config; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.data.document.mongodb.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration; +import org.springframework.data.mapping.model.MappingContext; import org.springframework.data.repository.config.AbstractRepositoryConfigDefinitionParser; import org.w3c.dom.Element; @@ -30,7 +33,9 @@ import org.w3c.dom.Element; public class MongoRepositoryConfigDefinitionParser extends AbstractRepositoryConfigDefinitionParser { - + + private static final String MAPPING_CONTEXT_DEFAULT = MongoMappingConverterParser.MAPPING_CONTEXT; + /* * (non-Javadoc) * @@ -47,20 +52,44 @@ public class MongoRepositoryConfigDefinitionParser /* - * (non-Javadoc) - * - * @see org.springframework.data.repository.config. - * AbstractRepositoryConfigDefinitionParser - * #postProcessBeanDefinition(org.springframework - * .data.repository.config.SingleRepositoryConfigInformation, - * org.springframework.beans.factory.support.BeanDefinitionBuilder, - * java.lang.Object) - */ + * (non-Javadoc) + * @see org.springframework.data.repository.config.AbstractRepositoryConfigDefinitionParser#postProcessBeanDefinition(org.springframework.data.repository.config.SingleRepositoryConfigInformation, org.springframework.beans.factory.support.BeanDefinitionBuilder, org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object) + */ @Override protected void postProcessBeanDefinition( MongoRepositoryConfiguration context, - BeanDefinitionBuilder builder, Object beanSource) { + BeanDefinitionBuilder builder, BeanDefinitionRegistry registry, Object beanSource) { builder.addPropertyReference("template", context.getMongoTemplateRef()); + + String mappingContextRef = getMappingContextReference(context, registry); + if (mappingContextRef != null) { + builder.addPropertyReference("mappingContext", mappingContextRef); + } + } + + /** + * Returns the bean name of a {@link MappingContext} to be wired. Will inspect the namespace attribute first and if no + * config is found in that place it will try to lookup the default one. Will return {@literal null} if neither one is + * available. + * + * @param config + * @param registry + * @return + */ + private String getMappingContextReference(MongoRepositoryConfiguration config, BeanDefinitionRegistry registry) { + + String contextRef = config.getMappingContextRef(); + + if (contextRef != null) { + return contextRef; + } + + try { + registry.getBeanDefinition(MAPPING_CONTEXT_DEFAULT); + return MAPPING_CONTEXT_DEFAULT; + } catch(NoSuchBeanDefinitionException e) { + return null; + } } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/SimpleMongoRepositoryConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/SimpleMongoRepositoryConfiguration.java index 3e8d21620..68468c753 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/SimpleMongoRepositoryConfiguration.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/SimpleMongoRepositoryConfiguration.java @@ -36,6 +36,8 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig { String getMongoTemplateRef(); + + String getMappingContextRef(); } /** @@ -150,6 +160,13 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig + + + + The reference to a MappingContext. Will pick up a bean named 'mappingContext' by default if available. + + + diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests.java index 9dd7cebc2..5bfbb8d7c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests.java @@ -1,5 +1,12 @@ package org.springframework.data.document.mongodb.repository.config; +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import org.junit.Test; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.xml.XmlBeanFactory; +import org.springframework.core.io.ClassPathResource; import org.springframework.data.document.mongodb.repository.AbstractPersonRepositoryIntegrationTests; import org.springframework.test.context.ContextConfiguration; @@ -14,4 +21,13 @@ import org.springframework.test.context.ContextConfiguration; public class MongoNamespaceIntegrationTests extends AbstractPersonRepositoryIntegrationTests { + + @Test + public void assertDefaultMappingContextIsWired() { + + XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("MongoNamespaceIntegrationTests-context.xml", getClass())); + BeanDefinition definition = factory.getBeanDefinition("personRepository"); + assertThat(definition, is(notNullValue())); + assertThat(definition.getPropertyValues().getPropertyValue("mappingContext"), is(notNullValue())); + } } diff --git a/spring-data-mongodb/src/test/resources/mapping.xml b/spring-data-mongodb/src/test/resources/mapping.xml index 17e054e62..309cac73d 100644 --- a/spring-data-mongodb/src/test/resources/mapping.xml +++ b/spring-data-mongodb/src/test/resources/mapping.xml @@ -16,6 +16,4 @@ - - diff --git a/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml b/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml index fc0d95432..3b2cf0b2f 100644 --- a/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml +++ b/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml @@ -6,8 +6,17 @@ xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository-1.0.xsd"> - - + + + + + + + + + + +