|
|
|
@ -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; |
|
|
|
} |
|
|
|
} |
|
|
|
|