From b24e34c3602480a63dcae784bebbfc1b2bf3c9ee Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 18 Mar 2014 20:10:43 +0100 Subject: [PATCH] DATAMONGO-883 - Adapted to changes in auditing config in Spring Data MongoDB. --- .../MongoAuditingBeanDefinitionParser.java | 21 ++++++++-------- .../config/MongoAuditingRegistrar.java | 24 +++---------------- .../config/AuditingIntegrationTests.java | 12 ++++++++-- ...uditingViaJavaConfigRepositoriesTests.java | 8 +++---- .../data/mongodb/core/AuditablePerson.java | 12 ++++++++-- 5 files changed, 38 insertions(+), 39 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoAuditingBeanDefinitionParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoAuditingBeanDefinitionParser.java index 7d227f1aa..e4d6aedd7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoAuditingBeanDefinitionParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoAuditingBeanDefinitionParser.java @@ -17,15 +17,17 @@ package org.springframework.data.mongodb.config; import static org.springframework.data.config.ParsingUtils.*; import static org.springframework.data.mongodb.config.BeanNames.*; -import static org.springframework.data.mongodb.config.MappingMongoConverterParser.*; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.data.config.IsNewAwareAuditingHandlerBeanDefinitionParser; +import org.springframework.data.auditing.config.IsNewAwareAuditingHandlerBeanDefinitionParser; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.event.AuditingEventListener; +import org.springframework.util.StringUtils; import org.w3c.dom.Element; /** @@ -61,22 +63,21 @@ public class MongoAuditingBeanDefinitionParser extends AbstractSingleBeanDefinit @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - BeanDefinitionRegistry registry = parserContext.getRegistry(); + String mappingContextRef = element.getAttribute("mapping-context-ref"); - String isNewStrategyFactoryName = IS_NEW_STRATEGY_FACTORY_BEAN_NAME; - String mappingContextName = MAPPING_CONTEXT_BEAN_NAME; + if (!StringUtils.hasText(mappingContextRef)) { - if (!registry.containsBeanDefinition(isNewStrategyFactoryName)) { + BeanDefinitionRegistry registry = parserContext.getRegistry(); - if (!registry.containsBeanDefinition(mappingContextName)) { - mappingContextName = potentiallyCreateMappingContext(element, parserContext, null, null); + if (!registry.containsBeanDefinition(MAPPING_CONTEXT_BEAN_NAME)) { + registry.registerBeanDefinition(MAPPING_CONTEXT_BEAN_NAME, new RootBeanDefinition(MongoMappingContext.class)); } - isNewStrategyFactoryName = createIsNewStrategyFactoryBeanDefinition(mappingContextName, parserContext, element); + mappingContextRef = MAPPING_CONTEXT_BEAN_NAME; } IsNewAwareAuditingHandlerBeanDefinitionParser parser = new IsNewAwareAuditingHandlerBeanDefinitionParser( - isNewStrategyFactoryName); + mappingContextRef); parser.parse(element, parserContext); builder.addConstructorArgValue(getObjectFactoryBeanDefinition(parser.getResolvedBeanName(), diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoAuditingRegistrar.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoAuditingRegistrar.java index 7588f09fc..5e6497283 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoAuditingRegistrar.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoAuditingRegistrar.java @@ -21,8 +21,6 @@ import static org.springframework.data.mongodb.config.BeanNames.*; import java.lang.annotation.Annotation; import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean; -import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; @@ -32,7 +30,6 @@ import org.springframework.data.auditing.IsNewAwareAuditingHandler; import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport; import org.springframework.data.auditing.config.AuditingConfiguration; import org.springframework.data.config.ParsingUtils; -import org.springframework.data.mapping.context.MappingContextIsNewStrategyFactory; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.event.AuditingEventListener; import org.springframework.data.support.IsNewStrategyFactory; @@ -88,7 +85,7 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport { Assert.notNull(configuration, "AuditingConfiguration must not be null!"); BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class); - builder.addConstructorArgReference(BeanNames.IS_NEW_STRATEGY_FACTORY_BEAN_NAME); + builder.addConstructorArgReference(MAPPING_CONTEXT_BEAN_NAME); return configureDefaultAuditHandlerAttributes(configuration, builder); } @@ -103,13 +100,10 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport { Assert.notNull(auditingHandlerDefinition, "BeanDefinition must not be null!"); Assert.notNull(registry, "BeanDefinitionRegistry must not be null!"); - BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(ObjectFactoryCreatingFactoryBean.class); - builder.addPropertyValue("targetBeanName", getAuditingHandlerBeanName()); - builder.setRole(ROLE_INFRASTRUCTURE); - BeanDefinitionBuilder listenerBeanDefinitionBuilder = BeanDefinitionBuilder .rootBeanDefinition(AuditingEventListener.class); - listenerBeanDefinitionBuilder.addConstructorArgValue(builder.getBeanDefinition()); + listenerBeanDefinitionBuilder.addConstructorArgValue(ParsingUtils.getObjectFactoryBeanDefinition( + getAuditingHandlerBeanName(), registry)); registerInfrastructureBeanWithId(listenerBeanDefinitionBuilder.getBeanDefinition(), AuditingEventListener.class.getName(), registry); @@ -132,17 +126,5 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport { registry.registerBeanDefinition(MAPPING_CONTEXT_BEAN_NAME, definition); } - - if (!registry.containsBeanDefinition(BeanNames.IS_NEW_STRATEGY_FACTORY_BEAN_NAME)) { - - BeanDefinitionBuilder builder = BeanDefinitionBuilder - .rootBeanDefinition(MappingContextIsNewStrategyFactory.class); - builder.addConstructorArgReference(MAPPING_CONTEXT_BEAN_NAME); - - AbstractBeanDefinition definition = ParsingUtils.getSourceBeanDefinition(builder, source); - definition.setRole(ROLE_INFRASTRUCTURE); - - registry.registerBeanDefinition(IS_NEW_STRATEGY_FACTORY_BEAN_NAME, definition); - } } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AuditingIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AuditingIntegrationTests.java index eb3b50361..ed98c1a8b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AuditingIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AuditingIntegrationTests.java @@ -34,6 +34,9 @@ import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent; */ public class AuditingIntegrationTests { + /** + * @see DATAMONGO-577, DATAMONGO-800, DATAMONGO-883 + */ @Test public void enablesAuditingAndSetsPropertiesAccordingly() throws Exception { @@ -58,8 +61,13 @@ public class AuditingIntegrationTests { class Entity { - @CreatedDate DateTime created; - @LastModifiedDate DateTime modified; @Id Long id; + @CreatedDate DateTime created; + DateTime modified; + + @LastModifiedDate + public DateTime getModified() { + return modified; + } } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AuditingViaJavaConfigRepositoriesTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AuditingViaJavaConfigRepositoriesTests.java index 32331830e..b6ce44ccb 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AuditingViaJavaConfigRepositoriesTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AuditingViaJavaConfigRepositoriesTests.java @@ -84,20 +84,20 @@ public class AuditingViaJavaConfigRepositoriesTests { } /** - * @DATAMONGO-792 + * @see DATAMONGO-792, DATAMONGO-883 */ @Test public void basicAuditing() { doReturn(this.auditor).when(this.auditorAware).getCurrentAuditor(); - AuditablePerson user = new AuditablePerson("user"); - - AuditablePerson savedUser = auditablePersonRepository.save(user); + AuditablePerson savedUser = auditablePersonRepository.save(new AuditablePerson("user")); AuditablePerson createdBy = savedUser.getCreatedBy(); + assertThat(createdBy, is(notNullValue())); assertThat(createdBy.getFirstname(), is(this.auditor.getFirstname())); + assertThat(savedUser.getCreatedAt(), is(notNullValue())); } /** diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/AuditablePerson.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/AuditablePerson.java index 622138130..eb07953c3 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/AuditablePerson.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/AuditablePerson.java @@ -15,7 +15,10 @@ */ package org.springframework.data.mongodb.core; +import java.util.Date; + import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.DBRef; @@ -26,9 +29,10 @@ import org.springframework.data.mongodb.core.mapping.DBRef; */ public class AuditablePerson { - @Id private String id; + private @Id String id; private String firstname; - @DBRef @CreatedBy private AuditablePerson createdBy; + private @DBRef @CreatedBy AuditablePerson createdBy; + private @CreatedDate Date createdAt; public AuditablePerson() {} @@ -59,4 +63,8 @@ public class AuditablePerson { public void setCreatedBy(AuditablePerson createdBy) { this.createdBy = createdBy; } + + public Date getCreatedAt() { + return createdAt; + } }