package com.zt.core.dictionary;
|
|
import com.zt.common.annotation.Dictionary;
|
import com.zt.common.constant.Constant;
|
import com.zt.common.constant.IDictionary;
|
import com.zt.core.sys.dto.DictDto;
|
import com.zt.core.sys.dto.DictLeafDto;
|
import com.zt.modules.sys.dto.DictEnumItemDto;
|
import com.zt.core.sys.dto.DictItemDto;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.ResourceLoader;
|
import org.springframework.core.io.support.ResourcePatternResolver;
|
import org.springframework.core.io.support.ResourcePatternUtils;
|
import org.springframework.core.type.AnnotationMetadata;
|
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
|
import org.springframework.core.type.classreading.MetadataReader;
|
import org.springframework.core.type.classreading.MetadataReaderFactory;
|
import org.springframework.stereotype.Component;
|
|
import java.io.IOException;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
|
@Component("dictionaryParser")
|
public class DictionaryParser {
|
|
@Autowired
|
private ResourceLoader resourceLoader;
|
|
/**
|
* 获取指定包下所有添加了执行注解的方法信息
|
*
|
* @return
|
* @throws Exception
|
*/
|
@Cacheable(value = Constant.Cache.SYS, key = "'dict:code'")
|
public List<DictDto> getConstantDicts() {
|
List<DictDto> dicts = new ArrayList<>();
|
try {
|
ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
|
MetadataReaderFactory metaReader = new CachingMetadataReaderFactory(resourceLoader);
|
Resource[] resources = resolver.getResources("classpath*:com/zt/**/*.class");
|
|
for (Resource r : resources) {
|
MetadataReader reader = metaReader.getMetadataReader(r);
|
dicts.addAll(resolveClass(reader));
|
}
|
} catch (IOException e) {
|
}
|
|
return dicts;
|
}
|
|
private List<DictDto> resolveClass(MetadataReader reader) {
|
List<DictDto> dicts = new ArrayList<>();
|
// 获取注解元数据
|
AnnotationMetadata metadata = reader.getAnnotationMetadata();
|
// 获取类中Dictionary注解的value属性
|
Map<String, Object> attributes = metadata.getAnnotationAttributes(Dictionary.class.getCanonicalName());
|
if (attributes == null) {
|
return dicts;
|
}
|
String dictType = (String) attributes.get("type"), dictName = (String) attributes.get("name");
|
if (StringUtils.isBlank(dictType) || StringUtils.isBlank(dictName)) {
|
return dicts;
|
}
|
DictLeafDto dictDto = new DictLeafDto(dictType, dictName);
|
|
String className = reader.getClassMetadata().getClassName();
|
try {
|
List<DictItemDto> dataList = new ArrayList<>();
|
|
Enum[] enums = (Enum[]) Class.forName(className).getEnumConstants();
|
for (Enum anEnum : enums) {
|
if (anEnum instanceof IDictionary) {
|
IDictionary dictionary = (IDictionary) anEnum;
|
dataList.add(new DictEnumItemDto(((Enum) dictionary).name(), dictionary.getName(), dictionary
|
.getValue()));
|
}
|
}
|
dictDto.setDataList(dataList);
|
} catch (ClassNotFoundException e) {
|
e.printStackTrace();
|
}
|
dicts.add(dictDto);
|
return dicts;
|
}
|
|
}
|