DATADOC-69 - Repository namespace now allows referenceing a MappingContext and picks up the default one if available.

This commit is contained in:
Oliver Gierke
2011-03-23 09:12:07 +01:00
parent bfd79377ca
commit 7d7cf60e23
7 changed files with 101 additions and 17 deletions

View File

@@ -39,14 +39,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

View File

@@ -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<SimpleMongoRepositoryConfiguration, MongoRepositoryConfiguration> {
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;
}
}
}

View File

@@ -36,6 +36,8 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
private static final String MONGO_TEMPLATE_REF = "mongo-template-ref";
private static final String DEFAULT_MONGO_TEMPLATE_REF = "mongoTemplate";
private static final String MAPPING_CONTEXT_REF = "mongo-mapping-context-ref";
/**
@@ -61,6 +63,12 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
return StringUtils.hasText(templateRef) ? templateRef
: DEFAULT_MONGO_TEMPLATE_REF;
}
public String getMappingContextRef() {
String attribute = getSource().getAttribute(MAPPING_CONTEXT_REF);
return StringUtils.hasText(attribute) ? attribute : null;
}
/*
@@ -113,6 +121,8 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
SingleRepositoryConfigInformation<SimpleMongoRepositoryConfiguration> {
String getMongoTemplateRef();
String getMappingContextRef();
}
/**
@@ -150,6 +160,13 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
return getAttribute(MONGO_TEMPLATE_REF);
}
/* (non-Javadoc)
* @see org.springframework.data.document.mongodb.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration#getMappingContextRef()
*/
public String getMappingContextRef() {
return getAttribute(MAPPING_CONTEXT_REF);
}
}
/**
@@ -188,5 +205,12 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
return getParent().getMongoTemplateRef();
}
/* (non-Javadoc)
* @see org.springframework.data.document.mongodb.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration#getMappingContextRef()
*/
public String getMappingContextRef() {
return getParent().getMappingContextRef();
}
}
}

View File

@@ -74,6 +74,13 @@ The host to connect to a MongoDB server. Default is localhost
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="mongo-mapping-context-ref" type="mappingContextRef" default="mappingContext">
<xsd:annotation>
<xsd:documentation>
The reference to a MappingContext. Will pick up a bean named 'mappingContext' by default if available.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attributeGroup ref="repository:repository-attributes"/>
</xsd:extension>
</xsd:complexContent>

View File

@@ -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()));
}
}

View File

@@ -16,6 +16,4 @@
<constructor-arg ref="mappingConverter"/>
</bean>
<bean class="org.springframework.data.document.mongodb.MongoExceptionTranslator"/>
</beans>

View File

@@ -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">
<import resource="classpath:infrastructure.xml"/>
<mongo:mongo id="mongo" />
<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
<constructor-arg ref="mongo" />
<constructor-arg value="database" />
<constructor-arg value="collection" />
<constructor-arg>
<mongo:mapping-converter />
</constructor-arg>
</bean>
<mongo:repositories base-package="org.springframework.data.**.repository">
<repository:exclude-filter type="regex" expression=".*MongoRepository"/>