From d86175fcd37599b7632e4a5da1c167ccbbad213c Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Fri, 7 Jan 2011 17:13:21 -0500 Subject: [PATCH] DATADOC-21 - Create namespace to configure Mongo root object --- .../document/mongodb/config/MongoParser.java | 64 +++++++++++++++ ...MongoRepositoryConfigDefinitionParser.java | 4 +- .../MongoRepositoryNamespaceHandler.java | 4 +- .../SimpleMongoRepositoryConfiguration.java | 2 +- .../document/mongodb/config/package-info.java | 4 + .../repository/config/package-info.java | 4 - .../main/resources/META-INF/spring.handlers | 2 +- .../main/resources/META-INF/spring.schemas | 4 +- .../config/spring-mongo-1.0.xsd | 35 ++++++++ .../mongodb/config/MongoNamespaceTests.java | 79 +++++++++++++++++++ .../config/MongoNamespaceTests-context.xml | 16 ++++ 11 files changed, 207 insertions(+), 11 deletions(-) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoParser.java rename spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/{repository => }/config/MongoRepositoryConfigDefinitionParser.java (88%) rename spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/{repository => }/config/MongoRepositoryNamespaceHandler.java (80%) rename spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/{repository => }/config/SimpleMongoRepositoryConfiguration.java (98%) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/package-info.java delete mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/package-info.java rename spring-data-mongodb/src/main/resources/org/springframework/data/document/mongodb/{repository => }/config/spring-mongo-1.0.xsd (64%) create mode 100644 spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/config/MongoNamespaceTests.java create mode 100644 spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/config/MongoNamespaceTests-context.xml diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoParser.java new file mode 100644 index 000000000..a2f81e793 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoParser.java @@ -0,0 +1,64 @@ +/* + * Copyright 2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.document.mongodb.config; + +import org.springframework.beans.factory.BeanDefinitionStoreException; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.document.mongodb.MongoFactoryBean; +import org.springframework.util.StringUtils; +import org.w3c.dom.Element; + +/** + * Parser for <mongo;gt; definitions. + * + * @author Mark Pollack + */ +public class MongoParser extends AbstractSingleBeanDefinitionParser { + + protected Class getBeanClass(Element element) { + return MongoFactoryBean.class; + } + + @Override + protected void doParse(Element element, BeanDefinitionBuilder builder) { + super.doParse(element, builder); + + setPropertyValue(element, builder, "port", "port"); + setPropertyValue(element, builder, "host", "host"); + + } + + @Override + protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) + throws BeanDefinitionStoreException { + String name = super.resolveId(element, definition, parserContext); + if (!StringUtils.hasText(name)) { + name = "mongo"; + } + return name; + } + + private void setPropertyValue(Element element, BeanDefinitionBuilder builder, String attrName, String propertyName) { + String attr = element.getAttribute(attrName); + if (StringUtils.hasText(attr)) { + builder.addPropertyValue(propertyName, attr); + } + } +} \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/MongoRepositoryConfigDefinitionParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryConfigDefinitionParser.java similarity index 88% rename from spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/MongoRepositoryConfigDefinitionParser.java rename to spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryConfigDefinitionParser.java index 38611907e..b7475c526 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/MongoRepositoryConfigDefinitionParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryConfigDefinitionParser.java @@ -1,7 +1,7 @@ -package org.springframework.data.document.mongodb.repository.config; +package org.springframework.data.document.mongodb.config; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.data.document.mongodb.repository.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration; +import org.springframework.data.document.mongodb.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration; import org.springframework.data.repository.config.AbstractRepositoryConfigDefinitionParser; import org.w3c.dom.Element; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/MongoRepositoryNamespaceHandler.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryNamespaceHandler.java similarity index 80% rename from spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/MongoRepositoryNamespaceHandler.java rename to spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryNamespaceHandler.java index 62067bd60..08dc7014b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/MongoRepositoryNamespaceHandler.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoRepositoryNamespaceHandler.java @@ -1,4 +1,4 @@ -package org.springframework.data.document.mongodb.repository.config; +package org.springframework.data.document.mongodb.config; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; @@ -20,5 +20,7 @@ public class MongoRepositoryNamespaceHandler extends NamespaceHandlerSupport { registerBeanDefinitionParser("repositories", new MongoRepositoryConfigDefinitionParser()); + + registerBeanDefinitionParser("mongo", new MongoParser()); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/SimpleMongoRepositoryConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/SimpleMongoRepositoryConfiguration.java similarity index 98% rename from spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/SimpleMongoRepositoryConfiguration.java rename to spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/SimpleMongoRepositoryConfiguration.java index b5f69f804..de9ba52d8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/SimpleMongoRepositoryConfiguration.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/SimpleMongoRepositoryConfiguration.java @@ -1,4 +1,4 @@ -package org.springframework.data.document.mongodb.repository.config; +package org.springframework.data.document.mongodb.config; import org.springframework.data.document.mongodb.repository.MongoRepository; import org.springframework.data.document.mongodb.repository.MongoRepositoryFactoryBean; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/package-info.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/package-info.java new file mode 100644 index 000000000..9b2e656d4 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring XML namespace configuration for Mongo DB specific repositories. + */ +package org.springframework.data.document.mongodb.config; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/package-info.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/package-info.java deleted file mode 100644 index f187b9d22..000000000 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/config/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Namespace configuration for Mongo DB specific repositories. - */ -package org.springframework.data.document.mongodb.repository.config; diff --git a/spring-data-mongodb/src/main/resources/META-INF/spring.handlers b/spring-data-mongodb/src/main/resources/META-INF/spring.handlers index d13e19090..52e52a10e 100644 --- a/spring-data-mongodb/src/main/resources/META-INF/spring.handlers +++ b/spring-data-mongodb/src/main/resources/META-INF/spring.handlers @@ -1 +1 @@ -http\://www.springframework.org/schema/data/mongo=org.springframework.data.document.mongodb.repository.config.MongoRepositoryNamespaceHandler +http\://www.springframework.org/schema/data/mongo=org.springframework.data.document.mongodb.config.MongoRepositoryNamespaceHandler diff --git a/spring-data-mongodb/src/main/resources/META-INF/spring.schemas b/spring-data-mongodb/src/main/resources/META-INF/spring.schemas index 4eac173e7..012892537 100644 --- a/spring-data-mongodb/src/main/resources/META-INF/spring.schemas +++ b/spring-data-mongodb/src/main/resources/META-INF/spring.schemas @@ -1,2 +1,2 @@ -http\://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd=org/springframework/data/document/mongodb/repository/config/spring-mongo-1.0.xsd -http\://www.springframework.org/schema/data/mongo/spring-mongo.xsd=org/springframework/data/document/mongodb/repository/config/spring-mongo-1.0.xsd +http\://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd=org/springframework/data/document/mongodb/config/spring-mongo-1.0.xsd +http\://www.springframework.org/schema/data/mongo/spring-mongo.xsd=org/springframework/data/document/mongodb/config/spring-mongo-1.0.xsd diff --git a/spring-data-mongodb/src/main/resources/org/springframework/data/document/mongodb/repository/config/spring-mongo-1.0.xsd b/spring-data-mongodb/src/main/resources/org/springframework/data/document/mongodb/config/spring-mongo-1.0.xsd similarity index 64% rename from spring-data-mongodb/src/main/resources/org/springframework/data/document/mongodb/repository/config/spring-mongo-1.0.xsd rename to spring-data-mongodb/src/main/resources/org/springframework/data/document/mongodb/config/spring-mongo-1.0.xsd index 5781a02bc..977bfade6 100644 --- a/spring-data-mongodb/src/main/resources/org/springframework/data/document/mongodb/repository/config/spring-mongo-1.0.xsd +++ b/spring-data-mongodb/src/main/resources/org/springframework/data/document/mongodb/config/spring-mongo-1.0.xsd @@ -13,6 +13,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/config/MongoNamespaceTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/config/MongoNamespaceTests.java new file mode 100644 index 000000000..d734d3391 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/config/MongoNamespaceTests.java @@ -0,0 +1,79 @@ +/* + * Copyright 2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.document.mongodb.config; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.lang.reflect.Field; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.data.document.mongodb.MongoFactoryBean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class MongoNamespaceTests { + + @Autowired + private ApplicationContext ctx; + + + + public void testMongoSingleton() throws Exception { + assertTrue(ctx.containsBean("mongo")); + MongoFactoryBean mfb = (MongoFactoryBean) ctx.getBean("&mongo"); + assertNull(readField("host", mfb)); + assertNull(readField("port", mfb)); + } + + @Test + public void testMongoSingletonWithAttributes() throws Exception { + assertTrue(ctx.containsBean("defaultMongo")); + MongoFactoryBean mfb = (MongoFactoryBean) ctx.getBean("&defaultMongo"); + String host = readField("host", mfb); + Integer port = readField("port", mfb); + assertEquals("localhost", host); + assertEquals(new Integer(27017), port); + } + + + + public static T readField(String name, Object target) throws Exception { + Field field = null; + Class clazz = target.getClass(); + do { + try { + field = clazz.getDeclaredField(name); + } catch (Exception ex) { + } + + clazz = clazz.getSuperclass(); + } while (field == null && !clazz.equals(Object.class)); + + if (field == null) + throw new IllegalArgumentException("Cannot find field '" + name + "' in the class hierarchy of " + + target.getClass()); + field.setAccessible(true); + return (T) field.get(target); + } +} diff --git a/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/config/MongoNamespaceTests-context.xml b/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/config/MongoNamespaceTests-context.xml new file mode 100644 index 000000000..ab52de0f2 --- /dev/null +++ b/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/config/MongoNamespaceTests-context.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + +