From 9fe27e590da90ca3b2f777c94045bc2434122239 Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Wed, 6 Apr 2011 18:21:51 -0400 Subject: [PATCH] DATADOC-62 - Create abstract @Configuration class for Mongo Configuration --- .../config/AbstractMongoConfiguration.java | 96 +++++++++++++++++++ .../mapping/event/MappingEventListener.java} | 5 +- .../document/mongodb/GeoSpatialAppConfig.java | 43 +++++++++ .../document/mongodb/GeoSpatialTests.java | 3 +- .../src/test/resources/geospatial.xml | 4 +- .../src/test/resources/mapping.xml | 2 +- 6 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/AbstractMongoConfiguration.java rename spring-data-mongodb/src/{test/java/org/springframework/data/document/mongodb/mapping/MappingEventsListener.java => main/java/org/springframework/data/document/mongodb/mapping/event/MappingEventListener.java} (85%) create mode 100644 spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/GeoSpatialAppConfig.java diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/AbstractMongoConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/AbstractMongoConfiguration.java new file mode 100644 index 000000000..4c4f743b0 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/AbstractMongoConfiguration.java @@ -0,0 +1,96 @@ +/* + * Copyright 2010-2011 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 java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.data.annotation.Persistent; +import org.springframework.data.document.mongodb.MongoTemplate; +import org.springframework.data.document.mongodb.convert.MappingMongoConverter; +import org.springframework.data.document.mongodb.mapping.Document; +import org.springframework.data.document.mongodb.mapping.MongoMappingContext; +import org.springframework.data.document.mongodb.mapping.MongoPersistentEntityIndexCreator; +import org.springframework.data.document.mongodb.mapping.event.MappingEventListener; +import org.springframework.data.document.mongodb.mapping.event.MongoMappingEvent; +import org.springframework.data.mapping.context.MappingContextAwareBeanPostProcessor; +import org.springframework.util.ClassUtils; +import org.springframework.util.StringUtils; + +import com.mongodb.Mongo; + +@Configuration +public abstract class AbstractMongoConfiguration { + + + @Bean + public abstract Mongo mongo() throws Exception; + + @Bean + public abstract MongoTemplate mongoTemplate() throws Exception; + + public String getMappingBasePackage() { + return ""; + } + + @Bean + public MappingEventListener mappingEventsListener() { + return new MappingEventListener(); + } + + @Bean + public MongoMappingContext mongoMappingContext() throws ClassNotFoundException, LinkageError { + MongoMappingContext mappingContext = new MongoMappingContext(); + String basePackage = getMappingBasePackage(); + if (StringUtils.hasText(basePackage)) { + ClassPathScanningCandidateComponentProvider componentProvider = new ClassPathScanningCandidateComponentProvider(false); + componentProvider.addIncludeFilter(new AnnotationTypeFilter(Document.class)); + componentProvider.addIncludeFilter(new AnnotationTypeFilter(Persistent.class)); + + Set> initialEntitySet = new HashSet>(); + for (BeanDefinition candidate : componentProvider.findCandidateComponents(basePackage)) { + initialEntitySet.add(ClassUtils.forName(candidate.getBeanClassName(), mappingContext.getClass().getClassLoader())); + } + mappingContext.setInitialEntitySet(initialEntitySet); + } + return mappingContext; + } + + @Bean + public MappingMongoConverter mappingMongoConverter() throws Exception { + MappingMongoConverter converter = new MappingMongoConverter(); + converter.setMappingContext(mongoMappingContext()); + converter.setMongo(mongo()); + return converter; + } + + @Bean + public MappingContextAwareBeanPostProcessor mappingContextAwareBeanPostProcessor() { + MappingContextAwareBeanPostProcessor bpp = new MappingContextAwareBeanPostProcessor(); + bpp.setMappingContextBeanName("mongoMappingContext"); + return bpp; + } + + @Bean MongoPersistentEntityIndexCreator mongoPersistentEntityIndexCreator() throws Exception { + MongoPersistentEntityIndexCreator indexCreator = new MongoPersistentEntityIndexCreator(mongoMappingContext(), mongoTemplate() ); + return indexCreator; + } +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingEventsListener.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/event/MappingEventListener.java similarity index 85% rename from spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingEventsListener.java rename to spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/event/MappingEventListener.java index 6e9346cb2..7114561b7 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingEventsListener.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/event/MappingEventListener.java @@ -14,17 +14,16 @@ * limitations under the License. */ -package org.springframework.data.document.mongodb.mapping; +package org.springframework.data.document.mongodb.mapping.event; import com.mongodb.DBObject; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.data.document.mongodb.mapping.event.AbstractMappingEventListener; /** * @author Jon Brisbin */ -public class MappingEventsListener extends AbstractMappingEventListener { +public class MappingEventListener extends AbstractMappingEventListener { private Log log = LogFactory.getLog(getClass()); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/GeoSpatialAppConfig.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/GeoSpatialAppConfig.java new file mode 100644 index 000000000..1af00e463 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/GeoSpatialAppConfig.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2011 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; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.document.mongodb.config.AbstractMongoConfiguration; + +import com.mongodb.Mongo; + +@Configuration +public class GeoSpatialAppConfig extends AbstractMongoConfiguration { + + @Bean + public Mongo mongo() throws Exception { + return new Mongo("localhost"); + } + + @Bean + public MongoTemplate mongoTemplate() throws Exception { + return new MongoTemplate(mongo(), "geospatial", "newyork", mappingMongoConverter()); + } + + + public String getMappingBasePackage() { + return "org.springframework.data.document.mongodb"; + } + + +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/GeoSpatialTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/GeoSpatialTests.java index 33bd2d29b..2403ae65b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/GeoSpatialTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/GeoSpatialTests.java @@ -29,6 +29,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.dao.DataAccessException; import org.springframework.data.document.mongodb.geo.Box; @@ -69,7 +70,7 @@ public class GeoSpatialTests { for (String coll : collectionsToDrop) { db.getCollection(coll).drop(); } - applicationContext = new ClassPathXmlApplicationContext("/geospatial.xml"); + applicationContext = new AnnotationConfigApplicationContext(GeoSpatialAppConfig.class); template = applicationContext.getBean(MongoTemplate.class); template.setWriteConcern(WriteConcern.FSYNC_SAFE); template.ensureIndex(new GeospatialIndex("location")); diff --git a/spring-data-mongodb/src/test/resources/geospatial.xml b/spring-data-mongodb/src/test/resources/geospatial.xml index 527eaa3c2..ed4946287 100644 --- a/spring-data-mongodb/src/test/resources/geospatial.xml +++ b/spring-data-mongodb/src/test/resources/geospatial.xml @@ -7,7 +7,7 @@ - + @@ -16,6 +16,6 @@ - + diff --git a/spring-data-mongodb/src/test/resources/mapping.xml b/spring-data-mongodb/src/test/resources/mapping.xml index 57b8c9848..8873a1ef8 100644 --- a/spring-data-mongodb/src/test/resources/mapping.xml +++ b/spring-data-mongodb/src/test/resources/mapping.xml @@ -15,6 +15,6 @@ - +