DATAMONGO-580 - Improved BeanDefinitionParser for MappingMongoConverter.
This commit is contained in:
@@ -27,5 +27,5 @@ public abstract class BeanNames {
|
|||||||
static final String DB_FACTORY = "mongoDbFactory";
|
static final String DB_FACTORY = "mongoDbFactory";
|
||||||
static final String VALIDATING_EVENT_LISTENER = "validatingMongoEventListener";
|
static final String VALIDATING_EVENT_LISTENER = "validatingMongoEventListener";
|
||||||
static final String IS_NEW_STRATEGY_FACTORY = "isNewStrategyFactory";
|
static final String IS_NEW_STRATEGY_FACTORY = "isNewStrategyFactory";
|
||||||
|
static final String DEFAULT_CONVERTER_BEAN_NAME = "mappingConverter";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,12 +24,12 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.beans.BeanMetadataElement;
|
import org.springframework.beans.BeanMetadataElement;
|
||||||
import org.springframework.beans.factory.BeanDefinitionStoreException;
|
|
||||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
||||||
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
||||||
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
|
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.AbstractBeanDefinition;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
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.ManagedSet;
|
||||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||||
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
|
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
|
||||||
|
import org.springframework.beans.factory.xml.BeanDefinitionParser;
|
||||||
import org.springframework.beans.factory.xml.ParserContext;
|
import org.springframework.beans.factory.xml.ParserContext;
|
||||||
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
|
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
|
||||||
import org.springframework.core.convert.converter.Converter;
|
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.core.type.filter.TypeFilter;
|
||||||
import org.springframework.data.annotation.Persistent;
|
import org.springframework.data.annotation.Persistent;
|
||||||
import org.springframework.data.config.BeanComponentDefinitionBuilder;
|
import org.springframework.data.config.BeanComponentDefinitionBuilder;
|
||||||
import org.springframework.data.config.ParsingUtils;
|
|
||||||
import org.springframework.data.mapping.model.MappingContextIsNewStrategyFactory;
|
import org.springframework.data.mapping.model.MappingContextIsNewStrategyFactory;
|
||||||
import org.springframework.data.mongodb.core.convert.CustomConversions;
|
import org.springframework.data.mongodb.core.convert.CustomConversions;
|
||||||
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
||||||
@@ -70,25 +70,26 @@ import org.w3c.dom.Element;
|
|||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Maciej Walkowiak
|
* @author Maciej Walkowiak
|
||||||
*/
|
*/
|
||||||
public class MappingMongoConverterParser extends AbstractBeanDefinitionParser {
|
public class MappingMongoConverterParser implements BeanDefinitionParser {
|
||||||
|
|
||||||
private static final String BASE_PACKAGE = "base-package";
|
private static final String BASE_PACKAGE = "base-package";
|
||||||
private static final boolean jsr303Present = ClassUtils.isPresent("javax.validation.Validator",
|
private static final boolean jsr303Present = ClassUtils.isPresent("javax.validation.Validator",
|
||||||
MappingMongoConverterParser.class.getClassLoader());
|
MappingMongoConverterParser.class.getClassLoader());
|
||||||
|
|
||||||
@Override
|
/* (non-Javadoc)
|
||||||
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext)
|
* @see org.springframework.beans.factory.xml.BeanDefinitionParser#parse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
|
||||||
throws BeanDefinitionStoreException {
|
*/
|
||||||
String id = super.resolveId(element, definition, parserContext);
|
public BeanDefinition parse(Element element, ParserContext parserContext) {
|
||||||
return StringUtils.hasText(id) ? id : "mappingConverter";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
|
|
||||||
BeanDefinitionRegistry registry = parserContext.getRegistry();
|
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);
|
BeanDefinition conversionsDefinition = getCustomConversions(element, parserContext);
|
||||||
String ctxRef = potentiallyCreateMappingContext(element, parserContext, conversionsDefinition);
|
String ctxRef = potentiallyCreateMappingContext(element, parserContext, conversionsDefinition, id);
|
||||||
|
|
||||||
createIsNewStrategyFactoryBeanDefinition(ctxRef, parserContext, element);
|
createIsNewStrategyFactoryBeanDefinition(ctxRef, parserContext, element);
|
||||||
|
|
||||||
@@ -115,18 +116,23 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser {
|
|||||||
}
|
}
|
||||||
BeanDefinitionBuilder indexHelperBuilder = BeanDefinitionBuilder
|
BeanDefinitionBuilder indexHelperBuilder = BeanDefinitionBuilder
|
||||||
.genericBeanDefinition(MongoPersistentEntityIndexCreator.class);
|
.genericBeanDefinition(MongoPersistentEntityIndexCreator.class);
|
||||||
indexHelperBuilder.addConstructorArgValue(new RuntimeBeanReference(ctxRef));
|
indexHelperBuilder.addConstructorArgReference(ctxRef);
|
||||||
indexHelperBuilder.addConstructorArgValue(new RuntimeBeanReference(dbFactoryRef));
|
indexHelperBuilder.addConstructorArgReference(dbFactoryRef);
|
||||||
registry.registerBeanDefinition(INDEX_HELPER, indexHelperBuilder.getBeanDefinition());
|
|
||||||
|
parserContext.registerBeanComponent(new BeanComponentDefinition(indexHelperBuilder.getBeanDefinition(),
|
||||||
|
INDEX_HELPER));
|
||||||
}
|
}
|
||||||
|
|
||||||
BeanDefinition validatingMongoEventListener = potentiallyCreateValidatingMongoEventListener(element, parserContext);
|
BeanDefinition validatingMongoEventListener = potentiallyCreateValidatingMongoEventListener(element, parserContext);
|
||||||
|
|
||||||
if (validatingMongoEventListener != null) {
|
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) {
|
private BeanDefinition potentiallyCreateValidatingMongoEventListener(Element element, ParserContext parserContext) {
|
||||||
@@ -140,7 +146,6 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser {
|
|||||||
RuntimeBeanReference validator = getValidator(builder, parserContext);
|
RuntimeBeanReference validator = getValidator(builder, parserContext);
|
||||||
|
|
||||||
if (validator != null) {
|
if (validator != null) {
|
||||||
|
|
||||||
builder.getRawBeanDefinition().setBeanClass(ValidatingMongoEventListener.class);
|
builder.getRawBeanDefinition().setBeanClass(ValidatingMongoEventListener.class);
|
||||||
builder.addConstructorArgValue(validator);
|
builder.addConstructorArgValue(validator);
|
||||||
|
|
||||||
@@ -162,13 +167,13 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser {
|
|||||||
validatorDef.setSource(source);
|
validatorDef.setSource(source);
|
||||||
validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||||
String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef);
|
String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef);
|
||||||
parserContext.registerComponent(new BeanComponentDefinition(validatorDef, validatorName));
|
parserContext.registerBeanComponent(new BeanComponentDefinition(validatorDef, validatorName));
|
||||||
|
|
||||||
return new RuntimeBeanReference(validatorName);
|
return new RuntimeBeanReference(validatorName);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String potentiallyCreateMappingContext(Element element, ParserContext parserContext,
|
static String potentiallyCreateMappingContext(Element element, ParserContext parserContext,
|
||||||
BeanDefinition conversionsDefinition) {
|
BeanDefinition conversionsDefinition, String converterId) {
|
||||||
|
|
||||||
String ctxRef = element.getAttribute("mapping-context-ref");
|
String ctxRef = element.getAttribute("mapping-context-ref");
|
||||||
|
|
||||||
@@ -195,11 +200,9 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser {
|
|||||||
mappingContextBuilder.addPropertyValue("simpleTypeHolder", simpleTypesDefinition);
|
mappingContextBuilder.addPropertyValue("simpleTypeHolder", simpleTypesDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
parserContext.getRegistry().registerBeanDefinition(MAPPING_CONTEXT, mappingContextBuilder.getBeanDefinition());
|
ctxRef = converterId + "." + MAPPING_CONTEXT;
|
||||||
ctxRef = MAPPING_CONTEXT;
|
|
||||||
|
|
||||||
parserContext.registerBeanComponent(componentDefinitionBuilder.getComponent(mappingContextBuilder, ctxRef));
|
parserContext.registerBeanComponent(componentDefinitionBuilder.getComponent(mappingContextBuilder, ctxRef));
|
||||||
|
|
||||||
return ctxRef;
|
return ctxRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,7 +240,7 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser {
|
|||||||
AbstractBeanDefinition conversionsBean = conversionsBuilder.getBeanDefinition();
|
AbstractBeanDefinition conversionsBean = conversionsBuilder.getBeanDefinition();
|
||||||
conversionsBean.setSource(parserContext.extractSource(element));
|
conversionsBean.setSource(parserContext.extractSource(element));
|
||||||
|
|
||||||
parserContext.getRegistry().registerBeanDefinition("customConversions", conversionsBean);
|
parserContext.registerBeanComponent(new BeanComponentDefinition(conversionsBean, "customConversions"));
|
||||||
|
|
||||||
return conversionsBean;
|
return conversionsBean;
|
||||||
}
|
}
|
||||||
@@ -291,8 +294,8 @@ public class MappingMongoConverterParser extends AbstractBeanDefinitionParser {
|
|||||||
.rootBeanDefinition(MappingContextIsNewStrategyFactory.class);
|
.rootBeanDefinition(MappingContextIsNewStrategyFactory.class);
|
||||||
mappingContextStrategyFactoryBuilder.addConstructorArgReference(mappingContextRef);
|
mappingContextStrategyFactoryBuilder.addConstructorArgReference(mappingContextRef);
|
||||||
|
|
||||||
context.getRegistry().registerBeanDefinition(IS_NEW_STRATEGY_FACTORY,
|
BeanComponentDefinitionBuilder builder = new BeanComponentDefinitionBuilder(element, context);
|
||||||
ParsingUtils.getSourceBeanDefinition(mappingContextStrategyFactoryBuilder, context, element));
|
context.registerBeanComponent(builder.getComponent(mappingContextStrategyFactoryBuilder, IS_NEW_STRATEGY_FACTORY));
|
||||||
|
|
||||||
return IS_NEW_STRATEGY_FACTORY;
|
return IS_NEW_STRATEGY_FACTORY;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,8 @@ public class MongoAuditingBeanDefinitionParser extends AbstractSingleBeanDefinit
|
|||||||
String mappingContextName = BeanNames.MAPPING_CONTEXT;
|
String mappingContextName = BeanNames.MAPPING_CONTEXT;
|
||||||
|
|
||||||
if (!registry.containsBeanDefinition(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);
|
MappingMongoConverterParser.createIsNewStrategyFactoryBeanDefinition(mappingContextName, parserContext, element);
|
||||||
|
|||||||
Reference in New Issue
Block a user