From c568b7cbc2adcfe5306a4443b65ffeea220022c2 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 6 Sep 2012 16:23:41 +0200 Subject: [PATCH] DATAMONGO-580 - Improved BeanDefinitionParser for MappingMongoConverter. --- .../data/mongodb/config/BeanNames.java | 2 +- .../config/MappingMongoConverterParser.java | 55 ++++++++++--------- .../MongoAuditingBeanDefinitionParser.java | 3 +- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/BeanNames.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/BeanNames.java index f7d3f8243..c23121d23 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/BeanNames.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/BeanNames.java @@ -27,5 +27,5 @@ public abstract class BeanNames { static final String DB_FACTORY = "mongoDbFactory"; static final String VALIDATING_EVENT_LISTENER = "validatingMongoEventListener"; static final String IS_NEW_STRATEGY_FACTORY = "isNewStrategyFactory"; - + static final String DEFAULT_CONVERTER_BEAN_NAME = "mappingConverter"; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java index f3cc3597c..2f8ddf294 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java @@ -24,12 +24,12 @@ import java.util.List; import java.util.Set; import org.springframework.beans.BeanMetadataElement; -import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.parsing.BeanComponentDefinition; +import org.springframework.beans.factory.parsing.CompositeComponentDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; @@ -38,6 +38,7 @@ import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.support.ManagedSet; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; +import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.core.convert.converter.Converter; @@ -49,7 +50,6 @@ import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.core.type.filter.TypeFilter; import org.springframework.data.annotation.Persistent; import org.springframework.data.config.BeanComponentDefinitionBuilder; -import org.springframework.data.config.ParsingUtils; import org.springframework.data.mapping.model.MappingContextIsNewStrategyFactory; import org.springframework.data.mongodb.core.convert.CustomConversions; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; @@ -70,25 +70,26 @@ import org.w3c.dom.Element; * @author Oliver Gierke * @author Maciej Walkowiak */ -public class MappingMongoConverterParser extends AbstractBeanDefinitionParser { +public class MappingMongoConverterParser implements BeanDefinitionParser { private static final String BASE_PACKAGE = "base-package"; private static final boolean jsr303Present = ClassUtils.isPresent("javax.validation.Validator", MappingMongoConverterParser.class.getClassLoader()); - @Override - protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) - throws BeanDefinitionStoreException { - String id = super.resolveId(element, definition, parserContext); - return StringUtils.hasText(id) ? id : "mappingConverter"; - } + /* (non-Javadoc) + * @see org.springframework.beans.factory.xml.BeanDefinitionParser#parse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext) + */ + public BeanDefinition parse(Element element, ParserContext parserContext) { - @Override - protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { BeanDefinitionRegistry registry = parserContext.getRegistry(); + String id = element.getAttribute(AbstractBeanDefinitionParser.ID_ATTRIBUTE); + id = StringUtils.hasText(id) ? id : "mappingConverter"; + + parserContext.pushContainingComponent(new CompositeComponentDefinition("Mapping Mongo Converter", element)); + BeanDefinition conversionsDefinition = getCustomConversions(element, parserContext); - String ctxRef = potentiallyCreateMappingContext(element, parserContext, conversionsDefinition); + String ctxRef = potentiallyCreateMappingContext(element, parserContext, conversionsDefinition, id); createIsNewStrategyFactoryBeanDefinition(ctxRef, parserContext, element); @@ -115,18 +116,23 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser { } BeanDefinitionBuilder indexHelperBuilder = BeanDefinitionBuilder .genericBeanDefinition(MongoPersistentEntityIndexCreator.class); - indexHelperBuilder.addConstructorArgValue(new RuntimeBeanReference(ctxRef)); - indexHelperBuilder.addConstructorArgValue(new RuntimeBeanReference(dbFactoryRef)); - registry.registerBeanDefinition(INDEX_HELPER, indexHelperBuilder.getBeanDefinition()); + indexHelperBuilder.addConstructorArgReference(ctxRef); + indexHelperBuilder.addConstructorArgReference(dbFactoryRef); + + parserContext.registerBeanComponent(new BeanComponentDefinition(indexHelperBuilder.getBeanDefinition(), + INDEX_HELPER)); } BeanDefinition validatingMongoEventListener = potentiallyCreateValidatingMongoEventListener(element, parserContext); if (validatingMongoEventListener != null) { - registry.registerBeanDefinition(VALIDATING_EVENT_LISTENER, validatingMongoEventListener); + parserContext.registerBeanComponent(new BeanComponentDefinition(validatingMongoEventListener, + VALIDATING_EVENT_LISTENER)); } - return converterBuilder.getBeanDefinition(); + parserContext.registerBeanComponent(new BeanComponentDefinition(converterBuilder.getBeanDefinition(), id)); + parserContext.popAndRegisterContainingComponent(); + return null; } private BeanDefinition potentiallyCreateValidatingMongoEventListener(Element element, ParserContext parserContext) { @@ -140,7 +146,6 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser { RuntimeBeanReference validator = getValidator(builder, parserContext); if (validator != null) { - builder.getRawBeanDefinition().setBeanClass(ValidatingMongoEventListener.class); builder.addConstructorArgValue(validator); @@ -162,13 +167,13 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser { validatorDef.setSource(source); validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef); - parserContext.registerComponent(new BeanComponentDefinition(validatorDef, validatorName)); + parserContext.registerBeanComponent(new BeanComponentDefinition(validatorDef, validatorName)); return new RuntimeBeanReference(validatorName); } static String potentiallyCreateMappingContext(Element element, ParserContext parserContext, - BeanDefinition conversionsDefinition) { + BeanDefinition conversionsDefinition, String converterId) { String ctxRef = element.getAttribute("mapping-context-ref"); @@ -195,11 +200,9 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser { mappingContextBuilder.addPropertyValue("simpleTypeHolder", simpleTypesDefinition); } - parserContext.getRegistry().registerBeanDefinition(MAPPING_CONTEXT, mappingContextBuilder.getBeanDefinition()); - ctxRef = MAPPING_CONTEXT; + ctxRef = converterId + "." + MAPPING_CONTEXT; parserContext.registerBeanComponent(componentDefinitionBuilder.getComponent(mappingContextBuilder, ctxRef)); - return ctxRef; } @@ -237,7 +240,7 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser { AbstractBeanDefinition conversionsBean = conversionsBuilder.getBeanDefinition(); conversionsBean.setSource(parserContext.extractSource(element)); - parserContext.getRegistry().registerBeanDefinition("customConversions", conversionsBean); + parserContext.registerBeanComponent(new BeanComponentDefinition(conversionsBean, "customConversions")); return conversionsBean; } @@ -291,8 +294,8 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser { .rootBeanDefinition(MappingContextIsNewStrategyFactory.class); mappingContextStrategyFactoryBuilder.addConstructorArgReference(mappingContextRef); - context.getRegistry().registerBeanDefinition(IS_NEW_STRATEGY_FACTORY, - ParsingUtils.getSourceBeanDefinition(mappingContextStrategyFactoryBuilder, context, element)); + BeanComponentDefinitionBuilder builder = new BeanComponentDefinitionBuilder(element, context); + context.registerBeanComponent(builder.getComponent(mappingContextStrategyFactoryBuilder, IS_NEW_STRATEGY_FACTORY)); return IS_NEW_STRATEGY_FACTORY; } 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 a2fe8db76..bed915ce5 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 @@ -65,7 +65,8 @@ public class MongoAuditingBeanDefinitionParser extends AbstractSingleBeanDefinit String mappingContextName = BeanNames.MAPPING_CONTEXT; if (!registry.containsBeanDefinition(BeanNames.MAPPING_CONTEXT)) { - mappingContextName = MappingMongoConverterParser.potentiallyCreateMappingContext(element, parserContext, null); + mappingContextName = MappingMongoConverterParser.potentiallyCreateMappingContext(element, parserContext, null, + BeanNames.DEFAULT_CONVERTER_BEAN_NAME); } MappingMongoConverterParser.createIsNewStrategyFactoryBeanDefinition(mappingContextName, parserContext, element);