From e1869abf3f5ccee2a1a44c276f980f6e87d3330f Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 29 Oct 2015 11:14:19 +0100 Subject: [PATCH] DATAMONGO-1293 - Polishing. Move configuration parsing error into method actually responsible for reading uri/client-uri attributes. Original Pull Request: #328 --- .../mongodb/config/MongoDbFactoryParser.java | 36 ++++++++++++------- .../MongoDbFactoryParserIntegrationTests.java | 2 ++ 2 files changed, 25 insertions(+), 13 deletions(-) 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 1ea9915d0..8e1245984 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 @@ -51,9 +51,11 @@ import com.mongodb.MongoURI; * @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"); @@ -84,20 +86,10 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser { BeanDefinitionBuilder dbFactoryBuilder = BeanDefinitionBuilder.genericBeanDefinition(SimpleMongoDbFactory.class); setPropertyValue(dbFactoryBuilder, element, "write-concern", "writeConcern"); - BeanDefinition mongoUri = getMongoUri(element); + BeanDefinition mongoUri = getMongoUri(element, parserContext); if (mongoUri != null) { - 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)); - } dbFactoryBuilder.addConstructorArgValue(mongoUri); return getSourceBeanDefinition(dbFactoryBuilder, parserContext, element); } @@ -170,12 +162,15 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser { /** * Creates a {@link BeanDefinition} for a {@link MongoURI} or {@link MongoClientURI} depending on configured - * attributes. + * attributes.
+ * Errors when configured element contains {@literal uri} or {@literal client-uri} along with other attributes except + * {@literal write-concern} and/or {@literal id}. * * @param element must not be {@literal null}. + * @param parserContext * @return {@literal null} in case no client-/uri defined. */ - private BeanDefinition getMongoUri(Element element) { + private BeanDefinition getMongoUri(Element element, ParserContext parserContext) { boolean hasClientUri = element.hasAttribute("client-uri"); @@ -183,6 +178,21 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser { return null; } + 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 " + (hasClientUri ? "Mongo Client URI" : "Mongo URI") + " or details individually!", + parserContext.extractSource(element)); + } + Class type = hasClientUri ? MongoClientURI.class : MongoURI.class; String uri = hasClientUri ? element.getAttribute("client-uri") : element.getAttribute("uri"); 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 87bdd6ede..a98a2c06d 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 @@ -204,6 +204,7 @@ public class MongoDbFactoryParserIntegrationTests { */ @Test public void setsUpClientUriWithId() { + reader.loadBeanDefinitions(new ClassPathResource("namespace/mongo-client-uri-and-id.xml")); BeanDefinition definition = factory.getBeanDefinition("testMongo"); ConstructorArgumentValues constructorArguments = definition.getConstructorArgumentValues(); @@ -218,6 +219,7 @@ public class MongoDbFactoryParserIntegrationTests { */ @Test public void setsUpUriWithId() { + reader.loadBeanDefinitions(new ClassPathResource("namespace/mongo-uri-and-id.xml")); BeanDefinition definition = factory.getBeanDefinition("testMongo"); ConstructorArgumentValues constructorArguments = definition.getConstructorArgumentValues();