diff --git a/pom.xml b/pom.xml index 67665a4998..63beb5ca94 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,4 @@ - + 4.0.0 @@ -15,7 +15,7 @@ org.springframework.data.build spring-data-parent - 1.8.0.BUILD-SNAPSHOT + 1.7.0.RELEASE @@ -28,7 +28,7 @@ multi spring-data-mongodb - 1.12.0.BUILD-SNAPSHOT + 1.11.0.RELEASE 2.13.0 2.13.0 @@ -156,8 +156,8 @@ - spring-libs-snapshot - https://repo.spring.io/libs-snapshot + spring-libs-release + https://repo.spring.io/libs-release diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/cdi/MongoRepositoryBean.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/cdi/MongoRepositoryBean.java index 0a43c72b2a..586c1c1652 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/cdi/MongoRepositoryBean.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/cdi/MongoRepositoryBean.java @@ -17,11 +17,10 @@ import java.lang.annotation.Annotation; import java.util.Set; - import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; - +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory; import org.springframework.data.repository.cdi.CdiRepositoryBean; @@ -33,10 +32,12 @@ * * @author Oliver Gierke * @author Mark Paluch + * @author Jordi Llach */ public class MongoRepositoryBean extends CdiRepositoryBean { private final Bean operations; + private final ApplicationEventPublisher eventPublisher; /** * Creates a new {@link MongoRepositoryBean}. @@ -47,14 +48,18 @@ public class MongoRepositoryBean extends CdiRepositoryBean { * @param beanManager must not be {@literal null}. * @param detector detector for the custom {@link org.springframework.data.repository.Repository} implementations * {@link CustomRepositoryImplementationDetector}, can be {@literal null}. + * @param eventPublisher must not be {@literal null}. */ public MongoRepositoryBean(Bean operations, Set qualifiers, Class repositoryType, - BeanManager beanManager, CustomRepositoryImplementationDetector detector) { + BeanManager beanManager, CustomRepositoryImplementationDetector detector, + ApplicationEventPublisher eventPublisher) { super(qualifiers, repositoryType, beanManager, detector); Assert.notNull(operations); + Assert.notNull(eventPublisher); this.operations = operations; + this.eventPublisher = eventPublisher; } /* @@ -65,7 +70,7 @@ public MongoRepositoryBean(Bean operations, Set qua protected T create(CreationalContext creationalContext, Class repositoryType, Object customImplementation) { MongoOperations mongoOperations = getDependencyInstance(operations, MongoOperations.class); - MongoRepositoryFactory factory = new MongoRepositoryFactory(mongoOperations); + MongoRepositoryFactory factory = new MongoRepositoryFactory(mongoOperations, eventPublisher); return factory.getRepository(repositoryType, customImplementation); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/cdi/MongoRepositoryExtension.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/cdi/MongoRepositoryExtension.java index 6902326045..87ae35e1f9 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/cdi/MongoRepositoryExtension.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/cdi/MongoRepositoryExtension.java @@ -22,16 +22,16 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; - import javax.enterprise.event.Observes; import javax.enterprise.inject.UnsatisfiedResolutionException; import javax.enterprise.inject.spi.AfterBeanDiscovery; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.ProcessBean; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.repository.cdi.CdiRepositoryBean; import org.springframework.data.repository.cdi.CdiRepositoryExtensionSupport; @@ -41,6 +41,7 @@ * * @author Oliver Gierke * @author Mark Paluch + * @author Jordi Llach */ public class MongoRepositoryExtension extends CdiRepositoryExtensionSupport { @@ -112,6 +113,20 @@ private CdiRepositoryBean createRepositoryBean(Class repositoryType, S // Construct and return the repository bean. return new MongoRepositoryBean(mongoOperations, qualifiers, repositoryType, beanManager, - getCustomImplementationDetector()); + getCustomImplementationDetector(), + new NullCdiApplicationEvenPublisher()); } -} + + + private final class NullCdiApplicationEvenPublisher + implements ApplicationEventPublisher { + + @Override + public void publishEvent(ApplicationEvent event) { + // NOTHING TO DO HERE ... as stated in ApplicationEventPublisher you need an ApplicationContext + // to enable the publishing of all persistence events such as {@link AfterLoadEvent}, {@link AfterSaveEvent}, etc. + // BUT it could be a good idea to check CDI Events + } + + } +} \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java index eb35a6e835..772db95227 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java @@ -15,11 +15,9 @@ */ package org.springframework.data.mongodb.repository.support; -import static org.springframework.data.querydsl.QueryDslUtils.*; - import java.io.Serializable; import java.lang.reflect.Method; - +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.model.MappingException; import org.springframework.data.mongodb.core.MongoOperations; @@ -31,6 +29,7 @@ import org.springframework.data.mongodb.repository.query.PartTreeMongoQuery; import org.springframework.data.mongodb.repository.query.StringBasedMongoQuery; import org.springframework.data.querydsl.QueryDslPredicateExecutor; +import static org.springframework.data.querydsl.QueryDslUtils.QUERY_DSL_PRESENT; import org.springframework.data.repository.core.NamedQueries; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.core.RepositoryMetadata; @@ -47,6 +46,7 @@ * * @author Oliver Gierke * @author Thomas Darimont + * @author Jordi Llach */ public class MongoRepositoryFactory extends RepositoryFactorySupport { @@ -54,18 +54,21 @@ public class MongoRepositoryFactory extends RepositoryFactorySupport { private final MongoOperations mongoOperations; private final MappingContext, MongoPersistentProperty> mappingContext; + private final ApplicationEventPublisher eventPublisher; /** * Creates a new {@link MongoRepositoryFactory} with the given {@link MongoOperations}. * * @param mongoOperations must not be {@literal null}. + * @param eventPublisher must not be {@literal null}. */ - public MongoRepositoryFactory(MongoOperations mongoOperations) { - + public MongoRepositoryFactory(MongoOperations mongoOperations, ApplicationEventPublisher eventPublisher) { Assert.notNull(mongoOperations); + Assert.notNull(eventPublisher); this.mongoOperations = mongoOperations; this.mappingContext = mongoOperations.getConverter().getMappingContext(); + this.eventPublisher = eventPublisher; } /* @@ -89,7 +92,7 @@ protected Class getRepositoryBaseClass(RepositoryMetadata metadata) { protected Object getTargetRepository(RepositoryInformation information) { MongoEntityInformation entityInformation = getEntityInformation(information.getDomainType()); - return getTargetRepositoryViaReflection(information, entityInformation, mongoOperations); + return getTargetRepositoryViaReflection(information, entityInformation, mongoOperations, eventPublisher); } /* diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBean.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBean.java index abaee0270a..518288d88f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBean.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBean.java @@ -16,7 +16,10 @@ package org.springframework.data.mongodb.repository.support; import java.io.Serializable; - +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.repository.MongoRepository; @@ -29,13 +32,16 @@ * {@link org.springframework.beans.factory.FactoryBean} to create {@link MongoRepository} instances. * * @author Oliver Gierke + * @author Jordi Llach */ -public class MongoRepositoryFactoryBean, S, ID extends Serializable> extends - RepositoryFactoryBeanSupport { +public class MongoRepositoryFactoryBean, S, ID extends Serializable> +extends RepositoryFactoryBeanSupport +implements ApplicationContextAware { private MongoOperations operations; private boolean createIndexesForQueryMethods = false; private boolean mappingContextConfigured = false; + private ApplicationEventPublisher eventPublisher; /** * Configures the {@link MongoOperations} to be used. @@ -65,6 +71,15 @@ protected void setMappingContext(MappingContext mappingContext) { super.setMappingContext(mappingContext); this.mappingContextConfigured = true; } + + /* + * (non-Javadoc) + * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.eventPublisher = applicationContext; + } /* * (non-Javadoc) @@ -92,7 +107,7 @@ protected final RepositoryFactorySupport createRepositoryFactory() { * @return */ protected RepositoryFactorySupport getFactoryInstance(MongoOperations operations) { - return new MongoRepositoryFactory(operations); + return new MongoRepositoryFactory(operations, eventPublisher); } /* @@ -106,10 +121,11 @@ protected RepositoryFactorySupport getFactoryInstance(MongoOperations operations public void afterPropertiesSet() { super.afterPropertiesSet(); - Assert.notNull(operations, "MongoTemplate must not be null!"); + Assert.notNull(operations, "MongoTemplate must not be null!"); + Assert.notNull(eventPublisher, "ApplicationContext must not be null"); if (!mappingContextConfigured) { setMappingContext(operations.getConverter().getMappingContext()); } } -} +} \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java index 306db7c450..d5de4178a4 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java @@ -15,9 +15,15 @@ */ package org.springframework.data.mongodb.repository.support; +import com.mysema.query.mongodb.MongodbQuery; +import com.mysema.query.types.EntityPath; +import com.mysema.query.types.Expression; +import com.mysema.query.types.OrderSpecifier; +import com.mysema.query.types.Predicate; +import com.mysema.query.types.path.PathBuilder; import java.io.Serializable; import java.util.List; - +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -34,21 +40,16 @@ import org.springframework.data.repository.core.EntityMetadata; import org.springframework.util.Assert; -import com.mysema.query.mongodb.MongodbQuery; -import com.mysema.query.types.EntityPath; -import com.mysema.query.types.Expression; -import com.mysema.query.types.OrderSpecifier; -import com.mysema.query.types.Predicate; -import com.mysema.query.types.path.PathBuilder; - /** * Special QueryDsl based repository implementation that allows execution {@link Predicate}s in various forms. * * @author Oliver Gierke * @author Thomas Darimont + * @author Jordi Llach */ -public class QueryDslMongoRepository extends SimpleMongoRepository implements - QueryDslPredicateExecutor { +public class QueryDslMongoRepository +extends SimpleMongoRepository +implements QueryDslPredicateExecutor { private final PathBuilder builder; private final EntityInformation entityInformation; @@ -60,9 +61,11 @@ public class QueryDslMongoRepository extends SimpleM * * @param entityInformation must not be {@literal null}. * @param mongoOperations must not be {@literal null}. + * @param eventPublisher must not be {@literal null}. */ - public QueryDslMongoRepository(MongoEntityInformation entityInformation, MongoOperations mongoOperations) { - this(entityInformation, mongoOperations, SimpleEntityPathResolver.INSTANCE); + public QueryDslMongoRepository(MongoEntityInformation entityInformation, MongoOperations mongoOperations, + ApplicationEventPublisher eventPublisher) { + this(entityInformation, mongoOperations, SimpleEntityPathResolver.INSTANCE, eventPublisher); } /** @@ -72,11 +75,12 @@ public QueryDslMongoRepository(MongoEntityInformation entityInformation, * @param entityInformation must not be {@literal null}. * @param mongoOperations must not be {@literal null}. * @param resolver must not be {@literal null}. + * @param eventPublisher must not be {@literal null}. */ public QueryDslMongoRepository(MongoEntityInformation entityInformation, MongoOperations mongoOperations, - EntityPathResolver resolver) { + EntityPathResolver resolver, ApplicationEventPublisher eventPublisher) { - super(entityInformation, mongoOperations); + super(entityInformation, mongoOperations, eventPublisher); Assert.notNull(resolver); EntityPath path = resolver.createPath(entityInformation.getJavaType()); @@ -200,7 +204,7 @@ private MongodbQuery createQueryFor(Predicate predicate) { * @return */ private MongodbQuery createQuery() { - return new SpringDataMongodbQuery(mongoOperations, entityInformation.getJavaType()); + return new SpringDataMongodbQuery(mongoOperations, entityInformation.getJavaType(), eventPublisher); } /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java index 4141921d87..dd03ecb182 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java @@ -15,35 +15,51 @@ */ package org.springframework.data.mongodb.repository.support; +import com.mysema.query.mongodb.MongodbQuery; +import com.mysema.query.types.EntityPath; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.util.Assert; -import com.mysema.query.mongodb.MongodbQuery; -import com.mysema.query.types.EntityPath; - /** * Base class to create repository implementations based on Querydsl. * * @author Oliver Gierke + * @author Jordi Llach */ public abstract class QuerydslRepositorySupport { private final MongoOperations template; private final MappingContext, ?> context; + private final ApplicationEventPublisher eventPublisher; + + // does not have support for DATAMONGO-1185 + @Deprecated + public QuerydslRepositorySupport(MongoOperations operations){ + Assert.notNull(operations); + this.template = operations; + this.context = operations.getConverter().getMappingContext(); + this.eventPublisher = null; + } + /** - * Creates a new {@link QuerydslRepositorySupport} for the given {@link MongoOperations}. + * Creates a new {@link QuerydslRepositorySupport} for the given {@link MongoOperations} and + * {@link ApplicationEventPublisher} * * @param operations must not be {@literal null} + * @param eventPublisher must not be {@literal null} */ - public QuerydslRepositorySupport(MongoOperations operations) { + public QuerydslRepositorySupport(MongoOperations operations, ApplicationEventPublisher eventPublisher) { Assert.notNull(operations); + Assert.notNull(eventPublisher); this.template = operations; this.context = operations.getConverter().getMappingContext(); + this.eventPublisher = eventPublisher; } /** @@ -71,6 +87,6 @@ protected MongodbQuery from(final EntityPath path, String collection) Assert.notNull(path); Assert.hasText(collection); - return new SpringDataMongodbQuery(template, path.getType(), collection); + return new SpringDataMongodbQuery(template, path.getType(), collection, eventPublisher); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java index 0b768343d8..8a37e25b85 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java @@ -15,8 +15,6 @@ */ package org.springframework.data.mongodb.repository.support; -import static org.springframework.data.mongodb.core.query.Criteria.*; - import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; @@ -24,7 +22,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; - +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -32,6 +30,7 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; +import static org.springframework.data.mongodb.core.query.Criteria.where; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.query.MongoEntityInformation; @@ -43,25 +42,30 @@ * @author Oliver Gierke * @author Christoph Strobl * @author Thomas Darimont + * @author Jordi Llach */ public class SimpleMongoRepository implements MongoRepository { private final MongoOperations mongoOperations; private final MongoEntityInformation entityInformation; + final ApplicationEventPublisher eventPublisher; /** * Creates a new {@link SimpleMongoRepository} for the given {@link MongoEntityInformation} and {@link MongoTemplate}. * * @param metadata must not be {@literal null}. - * @param template must not be {@literal null}. + * @param mongoOperations must not be {@literal null}. + * @param eventPublisher must not be {@literal null}. */ - public SimpleMongoRepository(MongoEntityInformation metadata, MongoOperations mongoOperations) { - + public SimpleMongoRepository(MongoEntityInformation metadata, MongoOperations mongoOperations, + ApplicationEventPublisher eventPublisher) { Assert.notNull(mongoOperations); Assert.notNull(metadata); + Assert.notNull(eventPublisher); this.entityInformation = metadata; this.mongoOperations = mongoOperations; + this.eventPublisher = eventPublisher; } /* diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbQuery.java index 67c48466d7..0d521b4619 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbQuery.java @@ -15,17 +15,20 @@ */ package org.springframework.data.mongodb.repository.support; -import org.springframework.data.mongodb.core.MongoOperations; - import com.google.common.base.Function; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mysema.query.mongodb.MongodbQuery; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.data.mongodb.core.mapping.event.AfterConvertEvent; +import org.springframework.data.mongodb.core.mapping.event.AfterLoadEvent; /** * Spring Data specfic {@link MongodbQuery} implementation. * * @author Oliver Gierke + * @author Jordi Llach */ class SpringDataMongodbQuery extends MongodbQuery { @@ -36,9 +39,11 @@ class SpringDataMongodbQuery extends MongodbQuery { * * @param operations must not be {@literal null}. * @param type must not be {@literal null}. + * @param eventPublisher. */ - public SpringDataMongodbQuery(final MongoOperations operations, final Class type) { - this(operations, type, operations.getCollectionName(type)); + public SpringDataMongodbQuery(final MongoOperations operations, final Class type, + final ApplicationEventPublisher eventPublisher) { + this(operations, type, operations.getCollectionName(type), eventPublisher); } /** @@ -47,12 +52,17 @@ public SpringDataMongodbQuery(final MongoOperations operations, final Class type, String collectionName) { + public SpringDataMongodbQuery(final MongoOperations operations, final Class type, final String collectionName, + final ApplicationEventPublisher eventPublisher) { super(operations.getCollection(collectionName), new Function() { public T apply(DBObject input) { - return operations.getConverter().read(type, input); + if (eventPublisher != null) eventPublisher.publishEvent(new AfterLoadEvent(input, (Class)type, collectionName)); + T read = operations.getConverter().read(type, input); + if (eventPublisher != null) eventPublisher.publishEvent(new AfterConvertEvent(input, read, collectionName)); + return read; } }, new SpringDataMongodbSerializer(operations.getConverter())); @@ -67,4 +77,4 @@ public T apply(DBObject input) { protected DBCollection getCollection(Class type) { return operations.getCollection(operations.getCollectionName(type)); } -} +} \ No newline at end of file diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryTextSearchIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryTextSearchIntegrationTests.java index 05305d9a90..826b8b3f25 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryTextSearchIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryTextSearchIntegrationTests.java @@ -15,21 +15,22 @@ */ package org.springframework.data.mongodb.repository; -import static org.hamcrest.collection.IsCollectionWithSize.*; -import static org.hamcrest.core.Is.*; -import static org.hamcrest.core.IsCollectionContaining.*; -import static org.hamcrest.core.IsEqual.*; -import static org.junit.Assert.*; - +import com.mongodb.Mongo; +import com.mongodb.MongoClient; import java.util.Arrays; import java.util.List; - +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsCollectionContaining.hasItems; +import static org.hamcrest.core.IsEqual.equalTo; import org.junit.After; +import static org.junit.Assert.assertThat; import org.junit.Before; import org.junit.ClassRule; 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.annotation.Id; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -50,14 +51,12 @@ import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; -import com.mongodb.Mongo; -import com.mongodb.MongoClient; - /** * Integration tests for text searches on repository. * * @author Christoph Strobl * @author Oliver Gierke + * @author Jordi Llach */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @@ -73,6 +72,7 @@ public class MongoRepositoryTextSearchIntegrationTests { "Drop Zone is an action film featuring Wesley Snipes and Gary Busey."); @Autowired MongoTemplate template; + @Autowired ApplicationContext eventPubliher; FullTextRepository repo; @Before @@ -80,7 +80,7 @@ public void setUp() { template.indexOps(FullTextDocument.class).ensureIndex( new TextIndexDefinitionBuilder().onField("title").onField("content").build()); - this.repo = new MongoRepositoryFactory(this.template).getRepository(FullTextRepository.class); + this.repo = new MongoRepositoryFactory(this.template, this.eventPubliher).getRepository(FullTextRepository.class); } @After diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Person.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Person.java index 4c165f7392..368755433e 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Person.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Person.java @@ -19,7 +19,6 @@ import java.util.Date; import java.util.List; import java.util.Set; - import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.index.GeoSpatialIndexType; import org.springframework.data.mongodb.core.index.GeoSpatialIndexed; @@ -34,6 +33,7 @@ * @author Oliver Gierke * @author Thomas Darimont * @author Christoph Strobl + * @author Jordi Llach */ @Document public class Person extends Contact { @@ -275,6 +275,10 @@ public Person withAddress(Address address) { public void setCreator(User creator) { this.creator = creator; } + + public User getCreator() { + return this.creator; + } public void setSkills(List skills) { this.skills = skills; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBeanUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBeanUnitTests.java index 0d0365e557..57e8598d20 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBeanUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBeanUnitTests.java @@ -15,16 +15,17 @@ */ package org.springframework.data.mongodb.repository.support; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - import java.util.List; - +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import static org.mockito.Mockito.when; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.context.ApplicationContext; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.convert.MongoConverter; @@ -36,11 +37,13 @@ * Unit tests for {@link MongoRepositoryFactoryBean}. * * @author Oliver Gierke + * @author Jordi LLach */ @RunWith(MockitoJUnitRunner.class) public class MongoRepositoryFactoryBeanUnitTests { @Mock MongoOperations operations; + @Mock ApplicationContext eventPublisher; @Mock MongoConverter converter; @Mock @SuppressWarnings("rawtypes") MappingContext context; @@ -72,6 +75,7 @@ private List getListenersFromFactory(MongoRepositoryFactoryBean factoryB factoryBean.setLazyInit(true); factoryBean.setMongoOperations(operations); + factoryBean.setApplicationContext(eventPublisher); factoryBean.setRepositoryInterface(ContactRepository.class); factoryBean.afterPropertiesSet(); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryUnitTests.java index be030e07ad..0dc87cbed1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryUnitTests.java @@ -15,17 +15,18 @@ */ package org.springframework.data.mongodb.repository.support; -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - import java.io.Serializable; - +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import static org.mockito.Mockito.when; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.convert.MongoConverter; @@ -38,13 +39,15 @@ * Unit test for {@link MongoRepositoryFactory}. * * @author Oliver Gierke + * @author Jordi Llach */ @RunWith(MockitoJUnitRunner.class) public class MongoRepositoryFactoryUnitTests { @Mock MongoTemplate template; - + @Mock + ApplicationEventPublisher eventPublisher; @Mock MongoConverter converter; @@ -70,7 +73,7 @@ public void usesMappingMongoEntityInformationIfMappingContextSet() { when(mappingContext.getPersistentEntity(Person.class)).thenReturn(entity); when(entity.getType()).thenReturn(Person.class); - MongoRepositoryFactory factory = new MongoRepositoryFactory(template); + MongoRepositoryFactory factory = new MongoRepositoryFactory(template, eventPublisher); MongoEntityInformation entityInformation = factory.getEntityInformation(Person.class); assertTrue(entityInformation instanceof MappingMongoEntityInformation); } @@ -85,7 +88,7 @@ public void createsRepositoryWithIdTypeLong() { when(mappingContext.getPersistentEntity(Person.class)).thenReturn(entity); when(entity.getType()).thenReturn(Person.class); - MongoRepositoryFactory factory = new MongoRepositoryFactory(template); + MongoRepositoryFactory factory = new MongoRepositoryFactory(template, eventPublisher); MyPersonRepository repository = factory.getRepository(MyPersonRepository.class); assertThat(repository, is(notNullValue())); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepositoryIntegrationTests.java index 29a7cfe5b2..10bba6b02c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepositoryIntegrationTests.java @@ -15,58 +15,78 @@ */ package org.springframework.data.mongodb.repository.support; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - +import com.mysema.query.types.Predicate; import java.util.Arrays; import java.util.List; - +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; import org.junit.Before; 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.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.data.mongodb.core.mapping.event.SimpleMappingEventListener; import org.springframework.data.mongodb.repository.Person; import org.springframework.data.mongodb.repository.QPerson; +import org.springframework.data.mongodb.repository.User; import org.springframework.data.mongodb.repository.query.MongoEntityInformation; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import com.mysema.query.types.Predicate; - /** * Integration test for {@link QueryDslMongoRepository}. * * @author Thomas Darimont + * @author Jordi Llach */ @ContextConfiguration( locations = "/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml") @RunWith(SpringJUnit4ClassRunner.class) public class QueryDslMongoRepositoryIntegrationTests { + + private static final String PERSON_COLLECTION_NAME = "person"; + private static final String USER_COLLECTION_NAME = "user"; @Autowired MongoOperations operations; + @Autowired ApplicationContext appContext; QueryDslMongoRepository repository; + QueryDslMongoRepository repositoryUser; Person dave, oliver, carter; + User creator, coworker; QPerson person; @Before public void setup() { - MongoRepositoryFactory factory = new MongoRepositoryFactory(operations); - MongoEntityInformation entityInformation = factory.getEntityInformation(Person.class); - repository = new QueryDslMongoRepository(entityInformation, operations); + MongoRepositoryFactory factory = new MongoRepositoryFactory(operations, appContext); + MongoEntityInformation entityInformation = factory.getEntityInformation(Person.class); + MongoEntityInformation entityUserInformation = factory.getEntityInformation(User.class); + repository = new QueryDslMongoRepository(entityInformation, operations, appContext); + repositoryUser = new QueryDslMongoRepository(entityUserInformation, operations, appContext); operations.dropCollection(Person.class); + operations.dropCollection(User.class); dave = new Person("Dave", "Matthews", 42); oliver = new Person("Oliver August", "Matthews", 4); carter = new Person("Carter", "Beauford", 49); + creator = new User(); + creator.setId("creator"); + coworker = new User(); + coworker.setId("coworker"); + person = new QPerson("person"); + repositoryUser.save(Arrays.asList(creator, coworker)); + dave.setCoworker(coworker); + dave.setCreator(creator); repository.save(Arrays.asList(oliver, dave, carter)); } @@ -94,4 +114,36 @@ public void shouldSupportFindAllWithPredicateAndSort() { assertThat(users.get(2).getFirstname(), is(oliver.getFirstname())); assertThat(users, hasItems(carter, dave, oliver)); } + + /** + * @see DATAMONGO-1185 + * when merged with DATAMONGO-1271 this test will change + */ + @Test + public void testValidateQueryDslCallBacks() { + SimpleMappingEventListener eventListener = (SimpleMappingEventListener)appContext.getBean("eventListener"); + eventListener.onAfterLoadEvents.clear(); + eventListener.onAfterConvertEvents.clear(); + assertThat(eventListener.onAfterLoadEvents.size(), is(0)); + assertThat(eventListener.onAfterConvertEvents.size(), is(0)); + Person findOne = repository.findOne(person.firstname.eq("Dave").and(person.lastname.eq("Matthews"))); + // remove two lines below post DATAMONGO-1271 merge + assertThat(eventListener.onAfterLoadEvents.size(), is(1)); + assertThat(eventListener.onAfterConvertEvents.size(), is(1)); + // uncomment the following lines post DATAMONGO-1271 merge +// assertThat(findOne.getCreator().getId(), is(creator.getId())); +// assertThat(eventListener.onAfterLoadEvents.size(), is(2)); +// assertThat(eventListener.onAfterConvertEvents.size(), is(2)); +// +// assertEquals(PERSON_COLLECTION_NAME, eventListener.onAfterLoadEvents.get(0).getCollectionName()); +// assertEquals(PERSON_COLLECTION_NAME, eventListener.onAfterConvertEvents.get(0).getCollectionName()); +// assertEquals(USER_COLLECTION_NAME, eventListener.onAfterLoadEvents.get(1).getCollectionName()); +// assertEquals(USER_COLLECTION_NAME, eventListener.onAfterConvertEvents.get(1).getCollectionName()); +// // is lazy so it triggers new events +// assertThat(findOne.getCoworker().getId(), is("coworker")); +// assertThat(eventListener.onAfterLoadEvents.size(), is(3)); +// assertThat(eventListener.onAfterConvertEvents.size(), is(3)); +// assertEquals(USER_COLLECTION_NAME, eventListener.onAfterLoadEvents.get(2).getCollectionName()); +// assertEquals(USER_COLLECTION_NAME, eventListener.onAfterLoadEvents.get(2).getCollectionName()); + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepositoryTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepositoryTests.java index 5e9177ae39..6a0d4347fa 100755 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepositoryTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepositoryTests.java @@ -15,9 +15,6 @@ */ package org.springframework.data.mongodb.repository.support; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -26,11 +23,17 @@ import java.util.Map; import java.util.Set; import java.util.UUID; - +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; import org.junit.Before; 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.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.repository.Person; import org.springframework.data.mongodb.repository.Person.Sex; @@ -41,12 +44,14 @@ /** * @author A. B. M. Kowser * @author Thomas Darimont + * @author Jordi Llach */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:infrastructure.xml") public class SimpleMongoRepositoryTests { @Autowired private MongoTemplate template; + @Autowired private ApplicationContext eventPubliher; private Person oliver, dave, carter, boyd, stefan, leroi, alicia; private List all; @@ -56,7 +61,7 @@ public class SimpleMongoRepositoryTests { @Before public void setUp() { - repository = new SimpleMongoRepository(personEntityInformation, template); + repository = new SimpleMongoRepository(personEntityInformation, template, eventPubliher); repository.deleteAll(); oliver = new Person("Oliver August", "Matthews", 4); diff --git a/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml b/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml index 7e7271d855..44a8a55740 100644 --- a/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml +++ b/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml @@ -34,5 +34,7 @@ + +