diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoDbFactoryParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoDbFactoryParser.java index 629423a6b..1ea9915d0 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoDbFactoryParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoDbFactoryParser.java @@ -18,6 +18,10 @@ package org.springframework.data.mongodb.config; import static org.springframework.data.config.ParsingUtils.*; import static org.springframework.data.mongodb.config.MongoParsingUtils.*; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.parsing.BeanComponentDefinition; @@ -44,8 +48,18 @@ import com.mongodb.MongoURI; * @author Oliver Gierke * @author Thomas Darimont * @author Christoph Strobl + * @author Viktor Khoroshko */ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser { + private static final Set MONGO_URI_ALLOWED_ADDITIONAL_ATTRIBUTES; + + static { + Set mongoUriAllowedAdditionalAttributes = new HashSet(); + mongoUriAllowedAdditionalAttributes.add("id"); + mongoUriAllowedAdditionalAttributes.add("write-concern"); + + MONGO_URI_ALLOWED_ADDITIONAL_ATTRIBUTES = Collections.unmodifiableSet(mongoUriAllowedAdditionalAttributes); + } /* * (non-Javadoc) @@ -73,7 +87,14 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser { BeanDefinition mongoUri = getMongoUri(element); if (mongoUri != null) { - if (element.getAttributes().getLength() >= 2 && !element.hasAttribute("write-concern")) { + int allowedAttributesCount = 1; + for (String attribute : MONGO_URI_ALLOWED_ADDITIONAL_ATTRIBUTES) { + if (element.hasAttribute(attribute)) { + allowedAttributesCount++; + } + } + + if (element.getAttributes().getLength() > allowedAttributesCount) { parserContext.getReaderContext().error("Configure either Mongo URI or details individually!", parserContext.extractSource(element)); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryParserIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryParserIntegrationTests.java index 5cab74f13..87bdd6ede 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryParserIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryParserIntegrationTests.java @@ -50,6 +50,7 @@ import com.mongodb.WriteConcern; * * @author Oliver Gierke * @author Christoph Strobl + * @author Viktor Khoroshko */ public class MongoDbFactoryParserIntegrationTests { @@ -198,6 +199,50 @@ public class MongoDbFactoryParserIntegrationTests { reader.loadBeanDefinitions(new ClassPathResource("namespace/mongo-client-uri-and-details.xml")); } + /** + * @see DATAMONGO-1293 + */ + @Test + public void setsUpClientUriWithId() { + reader.loadBeanDefinitions(new ClassPathResource("namespace/mongo-client-uri-and-id.xml")); + BeanDefinition definition = factory.getBeanDefinition("testMongo"); + ConstructorArgumentValues constructorArguments = definition.getConstructorArgumentValues(); + + assertThat(constructorArguments.getArgumentCount(), is(1)); + ValueHolder argument = constructorArguments.getArgumentValue(0, MongoClientURI.class); + assertThat(argument, is(notNullValue())); + } + + /** + * @see DATAMONGO-1293 + */ + @Test + public void setsUpUriWithId() { + reader.loadBeanDefinitions(new ClassPathResource("namespace/mongo-uri-and-id.xml")); + BeanDefinition definition = factory.getBeanDefinition("testMongo"); + ConstructorArgumentValues constructorArguments = definition.getConstructorArgumentValues(); + + assertThat(constructorArguments.getArgumentCount(), is(1)); + ValueHolder argument = constructorArguments.getArgumentValue(0, MongoClientURI.class); + assertThat(argument, is(notNullValue())); + } + + /** + * @see DATAMONGO-1293 + */ + @Test(expected = BeanDefinitionParsingException.class) + public void rejectsClientUriPlusDetailedConfigurationAndWriteConcern() { + reader.loadBeanDefinitions(new ClassPathResource("namespace/mongo-client-uri-write-concern-and-details.xml")); + } + + /** + * @see DATAMONGO-1293 + */ + @Test(expected = BeanDefinitionParsingException.class) + public void rejectsUriPlusDetailedConfigurationAndWriteConcern() { + reader.loadBeanDefinitions(new ClassPathResource("namespace/mongo-client-uri-write-concern-and-details.xml")); + } + private static void assertWriteConcern(ClassPathXmlApplicationContext ctx, WriteConcern expectedWriteConcern) { SimpleMongoDbFactory dbFactory = ctx.getBean("first", SimpleMongoDbFactory.class); diff --git a/spring-data-mongodb/src/test/resources/namespace/mongo-client-uri-and-id.xml b/spring-data-mongodb/src/test/resources/namespace/mongo-client-uri-and-id.xml new file mode 100644 index 000000000..567585f1c --- /dev/null +++ b/spring-data-mongodb/src/test/resources/namespace/mongo-client-uri-and-id.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/spring-data-mongodb/src/test/resources/namespace/mongo-client-uri-write-concern-and-details.xml b/spring-data-mongodb/src/test/resources/namespace/mongo-client-uri-write-concern-and-details.xml new file mode 100644 index 000000000..9f1709b4b --- /dev/null +++ b/spring-data-mongodb/src/test/resources/namespace/mongo-client-uri-write-concern-and-details.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/spring-data-mongodb/src/test/resources/namespace/mongo-uri-and-id.xml b/spring-data-mongodb/src/test/resources/namespace/mongo-uri-and-id.xml new file mode 100644 index 000000000..529b93ab0 --- /dev/null +++ b/spring-data-mongodb/src/test/resources/namespace/mongo-uri-and-id.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/spring-data-mongodb/src/test/resources/namespace/mongo-uri-write-concern-and-details.xml b/spring-data-mongodb/src/test/resources/namespace/mongo-uri-write-concern-and-details.xml new file mode 100644 index 000000000..86e1dc28f --- /dev/null +++ b/spring-data-mongodb/src/test/resources/namespace/mongo-uri-write-concern-and-details.xml @@ -0,0 +1,10 @@ + + + + + +