Browse Source

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

pull/1/head
Oliver Gierke 15 years ago
parent
commit
1183789bb3
  1. 5
      spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java
  2. 51
      spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryConfigDefinitionParser.java
  3. 24
      spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/SimpleMongoRepositoryConfiguration.java
  4. 7
      spring-data-mongodb/src/main/resources/org/springframework/data/document/mongodb/config/spring-mongo-1.0.xsd
  5. 16
      spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests.java
  6. 2
      spring-data-mongodb/src/test/resources/mapping.xml
  7. 13
      spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml

5
spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java

@ -44,14 +44,15 @@ import org.w3c.dom.Element; @@ -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

51
spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryConfigDefinitionParser.java

@ -15,8 +15,11 @@ @@ -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; @@ -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 @@ -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;
}
}
}

24
spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/SimpleMongoRepositoryConfiguration.java

@ -36,6 +36,8 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM @@ -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 @@ -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 @@ -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 @@ -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 @@ -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();
}
}
}

7
spring-data-mongodb/src/main/resources/org/springframework/data/document/mongodb/config/spring-mongo-1.0.xsd

@ -74,6 +74,13 @@ The host to connect to a MongoDB server. Default is localhost @@ -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>

16
spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests.java

@ -1,5 +1,12 @@ @@ -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; @@ -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()));
}
}

2
spring-data-mongodb/src/test/resources/mapping.xml

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

13
spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml

@ -6,8 +6,17 @@ @@ -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"/>

Loading…
Cancel
Save