package org.springframework.cloud.config.xml;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.cloud.service.relational.CloudDataSourceFactory;
import org.springframework.cloud.service.relational.DataSourceConfig;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
import java.util.List;
import java.util.Map;
/**
* Parser for the {@code <cloud:data-source>} namespace element
*
* @author Ramnivas Laddad
* @author Thomas Risberg
* @author Scott Frederick
*/
public class CloudDataSourceFactoryParser extends AbstractPoolingCloudServiceFactoryParser {
private static final String ELEMENT_CONNECTION = "connection";
private static final String ELEMENT_POOL = "pool";
private static final String ELEMENT_DATASOURCE_NAMES = "pool-data-sources";
private static final String ELEMENT_CONNECTION_PROPERTIES = "connection-properties";
public CloudDataSourceFactoryParser() {
super(CloudDataSourceFactory.class);
}
@Override
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
super.doParse(element, parserContext, builder);
BeanDefinitionBuilder dataSourceConfigBeanBuilder =
BeanDefinitionBuilder.genericBeanDefinition(DataSourceConfig.class.getName());
BeanDefinition cloudConnectionConfiguration = null;
Element connectionElement = DomUtils.getChildElementByTagName(element, ELEMENT_CONNECTION);
if (connectionElement != null) {
cloudConnectionConfiguration = parseConnectionElement(connectionElement);
}
BeanDefinition cloudPoolConfiguration = null;
Element poolElement = DomUtils.getChildElementByTagName(element, ELEMENT_POOL);
if (poolElement != null) {
cloudPoolConfiguration = parsePoolElement(poolElement, parserContext);
}
List<?> dataSourceNames = null;
Element dataSourceNamesElement = DomUtils.getChildElementByTagName(element, ELEMENT_DATASOURCE_NAMES);
if (dataSourceNamesElement != null) {
dataSourceNames = parserContext.getDelegate().
parseListElement(dataSourceNamesElement, dataSourceConfigBeanBuilder.getRawBeanDefinition());
}
Map<?, ?> properties = null;
Element propertiesElement = DomUtils.getChildElementByTagName(element, ELEMENT_CONNECTION_PROPERTIES);
if (propertiesElement != null) {
properties = parserContext.getDelegate().parseMapElement(propertiesElement, builder.getRawBeanDefinition());
}
dataSourceConfigBeanBuilder.addConstructorArgValue(cloudPoolConfiguration);
dataSourceConfigBeanBuilder.addConstructorArgValue(cloudConnectionConfiguration);
dataSourceConfigBeanBuilder.addConstructorArgValue(dataSourceNames);
dataSourceConfigBeanBuilder.addConstructorArgValue(properties);
builder.addConstructorArgValue(dataSourceConfigBeanBuilder.getBeanDefinition());
}
private BeanDefinition parseConnectionElement(Element element) {
BeanDefinitionBuilder cloudConnectionConfigurationBeanBuilder =
BeanDefinitionBuilder.genericBeanDefinition(DataSourceConfig.ConnectionConfig.class.getName());
String connectionProperties = element.getAttribute("properties");
if (StringUtils.hasText(connectionProperties)) {
cloudConnectionConfigurationBeanBuilder.addConstructorArgValue(connectionProperties);
}
return cloudConnectionConfigurationBeanBuilder.getBeanDefinition();
}
}