Browse Source

DATAMONGO-925, DATAMONGO-928 - Polishing.

Only reject attribute setup if abbreviation is activated and a custom strategy is configured. Additional test cases for the rejection case and a custom, over-configuration (explicitly setting abbreviation to false, which is the default anyway).

Related pull request: #177.
pull/182/merge
Oliver Gierke 12 years ago
parent
commit
0f821eb52d
  1. 12
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java
  2. 34
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java
  3. 3
      spring-data-mongodb/src/test/resources/namespace/converter-custom-fieldnamingstrategy.xml

12
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java

@ -228,11 +228,13 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
String abbreviateFieldNames = element.getAttribute("abbreviate-field-names"); String abbreviateFieldNames = element.getAttribute("abbreviate-field-names");
String fieldNamingStrategy = element.getAttribute("field-naming-strategy-ref"); String fieldNamingStrategy = element.getAttribute("field-naming-strategy-ref");
if (StringUtils.hasText(fieldNamingStrategy) && StringUtils.hasText(abbreviateFieldNames)) { boolean fieldNamingStrategyReferenced = StringUtils.hasText(fieldNamingStrategy);
boolean abbreviationActivated = StringUtils.hasText(abbreviateFieldNames)
&& Boolean.parseBoolean(abbreviateFieldNames);
context if (fieldNamingStrategyReferenced && abbreviationActivated) {
.error("Only one of the attributes abbreviate-field-names and field-naming-strategy-ref can be configured!", context.error("Field name abbreviation cannot be activated if a field-naming-strategy-ref is configured!",
element); element);
return; return;
} }
@ -240,7 +242,7 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
if ("true".equals(abbreviateFieldNames)) { if ("true".equals(abbreviateFieldNames)) {
value = new RootBeanDefinition(CamelCaseAbbreviatingFieldNamingStrategy.class); value = new RootBeanDefinition(CamelCaseAbbreviatingFieldNamingStrategy.class);
} else if (StringUtils.hasText(fieldNamingStrategy)) { } else if (fieldNamingStrategyReferenced) {
value = new RuntimeBeanReference(fieldNamingStrategy); value = new RuntimeBeanReference(fieldNamingStrategy);
} }

34
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java

@ -116,7 +116,7 @@ public class MappingMongoConverterParserIntegrationTests {
public void rejectsInvalidFieldNamingStrategyConfiguration() { public void rejectsInvalidFieldNamingStrategyConfiguration() {
exception.expect(BeanDefinitionParsingException.class); exception.expect(BeanDefinitionParsingException.class);
exception.expectMessage("abbreviate-field-names"); exception.expectMessage("abbreviation");
exception.expectMessage("field-naming-strategy-ref"); exception.expectMessage("field-naming-strategy-ref");
BeanDefinitionRegistry factory = new DefaultListableBeanFactory(); BeanDefinitionRegistry factory = new DefaultListableBeanFactory();
@ -141,18 +141,15 @@ public class MappingMongoConverterParserIntegrationTests {
*/ */
@Test @Test
public void shouldSupportCustomFieldNamingStrategy() { public void shouldSupportCustomFieldNamingStrategy() {
assertStrategyReferenceSetFor("mappingConverterWithCustomFieldNamingStrategy");
}
BeanDefinitionRegistry factory = new DefaultListableBeanFactory(); /**
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); * @see DATAMONGO-925, DATAMONGO-928
reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-custom-fieldnamingstrategy.xml")); */
@Test
BeanDefinition definition = reader.getRegistry().getBeanDefinition( public void shouldNotFailLoadingConfigIfAbbreviationIsDisabledAndStrategySet() {
"mappingConverterWithCustomFieldNamingStrategy.mongoMappingContext"); assertStrategyReferenceSetFor("mappingConverterWithCustomFieldNamingStrategyAndAbbreviationDisabled");
BeanReference value = (BeanReference) definition.getPropertyValues().getPropertyValue("fieldNamingStrategy")
.getValue();
assertThat(value.getBeanName(), is("customFieldNamingStrategy"));
} }
private void loadValidConfiguration() { private void loadValidConfiguration() {
@ -169,6 +166,19 @@ public class MappingMongoConverterParserIntegrationTests {
reader.loadBeanDefinitions(new ClassPathResource(configLocation)); reader.loadBeanDefinitions(new ClassPathResource(configLocation));
} }
private static void assertStrategyReferenceSetFor(String beanId) {
BeanDefinitionRegistry factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-custom-fieldnamingstrategy.xml"));
BeanDefinition definition = reader.getRegistry().getBeanDefinition(beanId.concat(".mongoMappingContext"));
BeanReference value = (BeanReference) definition.getPropertyValues().getPropertyValue("fieldNamingStrategy")
.getValue();
assertThat(value.getBeanName(), is("customFieldNamingStrategy"));
}
@Component @Component
public static class SampleConverter implements Converter<Person, DBObject> { public static class SampleConverter implements Converter<Person, DBObject> {
public DBObject convert(Person source) { public DBObject convert(Person source) {

3
spring-data-mongodb/src/test/resources/namespace/converter-custom-fieldnamingstrategy.xml

@ -7,6 +7,9 @@
<mongo:mapping-converter id="mappingConverterWithCustomFieldNamingStrategy" field-naming-strategy-ref="customFieldNamingStrategy" /> <mongo:mapping-converter id="mappingConverterWithCustomFieldNamingStrategy" field-naming-strategy-ref="customFieldNamingStrategy" />
<!-- Should work as well as long ass abbreviation is explicitly disabled -->
<mongo:mapping-converter id="mappingConverterWithCustomFieldNamingStrategyAndAbbreviationDisabled" field-naming-strategy-ref="customFieldNamingStrategy" abbreviate-field-names="false" />
<bean id="customFieldNamingStrategy" class="org.mockito.Mockito" factory-method="mock"> <bean id="customFieldNamingStrategy" class="org.mockito.Mockito" factory-method="mock">
<property name="type" value="org.springframework.data.mongodb.core.mapping.FieldNamingStrategy" /> <property name="type" value="org.springframework.data.mongodb.core.mapping.FieldNamingStrategy" />
</bean> </bean>

Loading…
Cancel
Save