package message.mvc.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.CollectionUtils;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* mvc配置解析.
*
* @author sunhao(sunhao.java@gmail.com)
* @version V1.0
* @createTime 2015-1-24 19:32
*/
public class MVCConfigParser implements BeanDefinitionParser {
private static final String MVC_TEMPLATE_LOCATION = "META-INF/template/mvc.xml";
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
//bean对象注册机
BeanDefinitionRegistry registry = parserContext.getRegistry();
dynamicLoadConfigBean(element, registry);
return null;
}
private void dynamicLoadConfigBean(Element element, BeanDefinitionRegistry registry) {
Map<String, Object> context = new HashMap<String, Object>();
List<Element> argumentResolvers = DomUtils.getChildElementsByTagName(element, "argument-resolvers");
List<Element> interceptors = DomUtils.getChildElementsByTagName(element, "interceptors");
List<Element> converters = DomUtils.getChildElementsByTagName(element, "converters");
List<String> argumentResolverList = new ArrayList<String>();
List<String> interceptorList = new ArrayList<String>();
List<String> convertersList = new ArrayList<String>();
List<Map<String, Object>> interceptorMappingList = new ArrayList<Map<String, Object>>();
if (!CollectionUtils.isEmpty(argumentResolvers)) {
List<Element> argumentResolverBeans = DomUtils.getChildElementsByTagName(argumentResolvers.get(0), "bean");
for (Element ele : argumentResolverBeans) {
argumentResolverList.add(ele.getAttribute("class"));
}
}
if (!CollectionUtils.isEmpty(interceptors)) {
List<Element> interceptorBeans = DomUtils.getChildElementsByTagName(interceptors.get(0), "bean");
for (Element ele : interceptorBeans) {
interceptorList.add(ele.getAttribute("class"));
}
List<Element> interceptorMappings = DomUtils.getChildElementsByTagName(interceptors.get(0), "interceptor");
if (!CollectionUtils.isEmpty(interceptorMappings)) {
Map<String, Object> interceptor = new HashMap<String, Object>();
for (Element ele : interceptorMappings) {
//1.mapping
List<Element> mappings = DomUtils.getChildElementsByTagName(ele, "mapping");
List<String> mappingList = new ArrayList<String>();
for (Element el : mappings) {
mappingList.add(el.getAttribute("path"));
}
interceptor.put("mappings", mappingList);
//2.exclude-mapping
List<Element> excludeMappings = DomUtils.getChildElementsByTagName(ele, "exclude-mapping");
List<String> excludeMappingList = new ArrayList<String>();
for (Element el : excludeMappings) {
excludeMappingList.add(el.getAttribute("path"));
}
interceptor.put("excludeMappings", excludeMappingList);
//3.bean class
Element bean = DomUtils.getChildElementByTagName(ele, "bean");
interceptor.put("bean", bean.getAttribute("class"));
interceptorMappingList.add(interceptor);
}
}
}
if (!CollectionUtils.isEmpty(argumentResolvers)) {
List<Element> converterBeans = DomUtils.getChildElementsByTagName(converters.get(0), "bean");
for (Element ele : converterBeans) {
convertersList.add(ele.getAttribute("class"));
}
}
context.put("argumentResolvers", argumentResolverList);
context.put("interceptors", interceptorList);
context.put("converters", convertersList);
context.put("interceptorMappings", interceptorMappingList);
context.put("swaggerEnable", element.getAttribute("swaggerEnable"));
BeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(registry);
Resource resource = new ThymeleafTemplateResource(MVC_TEMPLATE_LOCATION, context, "xml");
beanDefinitionReader.loadBeanDefinitions(resource);
}
}