package message.jdbc.configs.parser;
import message.template.resource.ThymeleafTemplateResource;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionReader;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.Resource;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 关系型数据库数据源的处理.
*
* @author sunhao(sunhao.java@gmail.com)
* @version V1.0, 14-8-10 上午1:39
*/
public class JdbcConfigParser implements BeanDefinitionParser {
private static final String RDBMS_TEMPLATE_LOCATION = "META-INF/template/jdbc.xml";
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
//bean对象注册机
BeanDefinitionRegistry registry = parserContext.getRegistry();
//动态注册jdbc的相关配置
dynamicLoadConfigBean(element, registry);
return null;
}
private String getDataSourceName(Element element) {
return element.getAttribute("dataSource");
}
private void dynamicLoadConfigBean(Element element, BeanDefinitionRegistry registry) {
Map<String, Object> context = new HashMap<String, Object>();
context.put("dataSource", getDataSourceName(element));
context.put("basePackage", element.getAttribute("basePackage"));
context.put("useFlyway", element.getAttribute("useFlyway"));
context.put("migration", element.getAttribute("migration"));
context.put("dbType", element.getAttribute("dbType"));
List<Element> childElements = DomUtils.getChildElementsByTagName(element, "convert");
Map<String, String> converts = new HashMap<String, String>();
for (Element ele : childElements) {
converts.put(ele.getAttribute("key"), ele.getAttribute("value"));
}
context.put("converts", converts);
BeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(registry);
Resource resource = new ThymeleafTemplateResource(RDBMS_TEMPLATE_LOCATION, context, "xml");
beanDefinitionReader.loadBeanDefinitions(resource);
}
}