diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntity.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntity.java index 0e65f9ba3..443babed0 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntity.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntity.java @@ -18,10 +18,19 @@ package org.springframework.data.mongodb.core.mapping; import java.util.Comparator; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.expression.BeanFactoryAccessor; +import org.springframework.context.expression.BeanFactoryResolver; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.model.BasicPersistentEntity; import org.springframework.data.mongodb.MongoCollectionUtils; import org.springframework.data.util.TypeInformation; +import org.springframework.expression.Expression; +import org.springframework.expression.ParserContext; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.util.StringUtils; /** @@ -32,9 +41,11 @@ import org.springframework.util.StringUtils; * @author Oliver Gierke */ public class BasicMongoPersistentEntity extends BasicPersistentEntity implements - MongoPersistentEntity { + MongoPersistentEntity, ApplicationContextAware { private final String collection; + private final SpelExpressionParser parser; + private final StandardEvaluationContext context; /** * Creates a new {@link BasicMongoPersistentEntity} with the given {@link TypeInformation}. Will default the @@ -46,6 +57,9 @@ public class BasicMongoPersistentEntity extends BasicPersistentEntity rawType = typeInformation.getType(); String fallback = MongoCollectionUtils.getPreferredCollectionName(rawType); @@ -57,13 +71,25 @@ public class BasicMongoPersistentEntity extends BasicPersistentEntity * @author Oliver Gierke ogierke@vmware.com */ -public class MongoMappingContext extends AbstractMappingContext, MongoPersistentProperty> { +public class MongoMappingContext extends AbstractMappingContext, MongoPersistentProperty> implements ApplicationContextAware { + + private ApplicationContext context; /** * Creates a new {@link MongoMappingContext}. @@ -46,11 +51,27 @@ public class MongoMappingContext extends AbstractMappingContext BasicMongoPersistentEntity createPersistentEntity(TypeInformation typeInformation) { - return new BasicMongoPersistentEntity(typeInformation); + + BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity(typeInformation); + + if (context != null) { + entity.setApplicationContext(context); + } + + return entity; + } + + /* + * (non-Javadoc) + * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) + */ + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.context = applicationContext; } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 3912b32ba..fbe2419fd 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -28,10 +28,7 @@ import java.util.HashSet; import java.util.List; import org.bson.types.ObjectId; -import org.hamcrest.Matchers; import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormatter; -import org.joda.time.format.ISODateTimeFormat; import org.junit.After; import org.junit.Assert; import org.junit.Before; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntityUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntityUnitTests.java index 8986b598a..c8f605bee 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntityUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntityUnitTests.java @@ -15,12 +15,15 @@ */ package org.springframework.data.mongodb.core.mapping; +import static org.mockito.Mockito.*; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.Test; -import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity; -import org.springframework.data.mongodb.core.mapping.Document; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.context.ApplicationContext; import org.springframework.data.util.ClassTypeInformation; /** @@ -28,8 +31,12 @@ import org.springframework.data.util.ClassTypeInformation; * * @author Oliver Gierke */ +@RunWith(MockitoJUnitRunner.class) public class BasicMongoPersistentEntityUnitTests { + @Mock + ApplicationContext context; + @Test public void subclassInheritsAtDocumentAnnotation() { @@ -38,6 +45,28 @@ public class BasicMongoPersistentEntityUnitTests { assertThat(entity.getCollection(), is("contacts")); } + @Test + public void evaluatesSpELExpression() { + + MongoPersistentEntity entity = new BasicMongoPersistentEntity(ClassTypeInformation.from(Company.class)); + assertThat(entity.getCollection(), is("35")); + } + + @Test + public void collectionAllowsReferencingSpringBean() { + + CollectionProvider provider = new CollectionProvider(); + provider.collectionName = "reference"; + + when(context.getBean("myBean")).thenReturn(provider); + when(context.containsBean("myBean")).thenReturn(true); + + BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity(ClassTypeInformation.from(DynamicallyMapped.class)); + entity.setApplicationContext(context); + + assertThat(entity.getCollection(), is("reference")); + } + @Document(collection = "contacts") class Contact { @@ -46,4 +75,22 @@ public class BasicMongoPersistentEntityUnitTests { class Person extends Contact { } + + @Document(collection = "#{35}") + class Company { + + } + + @Document(collection = "#{myBean.collectionName}") + class DynamicallyMapped { + + } + + class CollectionProvider { + String collectionName; + + public String getCollectionName() { + return collectionName; + } + } }