package message.cache.configs;
import message.cache.configs.parser.AbstractCacheConfigParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;
import java.util.HashMap;
import java.util.Map;
/**
* 注册缓存配置文件解析器.
*
* @author sunhao(sunhao.java@gmail.com)
* @version V1.0, 14-8-29 下午7:59
*/
public class CacheNamespaceHandler extends NamespaceHandlerSupport {
private static final Logger logger = LoggerFactory.getLogger(CacheNamespaceHandler.class);
@Override
public void init() {
logger.debug("register bean xml parser begin...");
Map<String, Object> parsers = getAllParserUnderCurrentPackage();
for (Map.Entry<String, Object> entry : parsers.entrySet()) {
registerBeanDefinitionParser(entry.getKey(), (BeanDefinitionParser) entry.getValue());
}
logger.debug("register bean xml parser end...");
}
private Map<String, Object> getAllParserUnderCurrentPackage() {
try {
Map<String, Object> parsers = new HashMap<String, Object>();
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resourcePatternResolver);
String basePackage = this.getClass().getPackage().getName();
String pattern = "classpath*:" + ClassUtils.convertClassNameToResourcePath(basePackage) + "/parser/*.class";
Resource[] resources = resourcePatternResolver.getResources(pattern);
for (Resource r : resources) {
if (r.isReadable()) {
MetadataReader reader = readerFactory.getMetadataReader(r);
String classNameWithPackage = reader.getClassMetadata().getClassName();
Class clazz = ClassUtils.forName(classNameWithPackage, Thread.currentThread().getContextClassLoader());
Class<?> superClass = clazz.getSuperclass();
if (AbstractCacheConfigParser.class == superClass && clazz.isAnnotationPresent(CacheType.class)) {
parsers.put(((CacheType) clazz.getAnnotation(CacheType.class)).value(), BeanUtils.instantiate(clazz));
}
}
}
return parsers;
} catch (Exception e) {
throw new CacheException(10009, e, "解析配置错误!");
}
}
}