package com.zt.modules.oss.annotation; 
 | 
  
 | 
import java.lang.reflect.Field; 
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
import java.util.Map; 
 | 
  
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
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 com.zt.common.annotation.OssField; 
 | 
import com.zt.modules.oss.model.OssFieldDefine; 
 | 
  
 | 
import io.swagger.annotations.ApiModel; 
 | 
  
 | 
@Component("dataFieldParser") 
 | 
public class DataFieldParser { 
 | 
  
 | 
    @Autowired 
 | 
    private ResourceLoader resourceLoader; 
 | 
  
 | 
    private static final String VALUE = "value"; 
 | 
  
 | 
    /** 
 | 
     * 获取指定包下所有添加了执行注解的方法信息 
 | 
     * 
 | 
     * @return 
 | 
     * @throws Exception 
 | 
     */ 
 | 
    public List<OssFieldDefine> getOssFields() throws Exception { 
 | 
        List<OssFieldDefine> defines = new ArrayList<>(); 
 | 
  
 | 
        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); 
 | 
            defines.addAll(resolveClass(reader)); 
 | 
        } 
 | 
  
 | 
        return defines; 
 | 
    } 
 | 
  
 | 
    private List<OssFieldDefine> resolveClass(MetadataReader reader) { 
 | 
        List<OssFieldDefine> defines = new ArrayList<>(); 
 | 
        // 获取注解元数据 
 | 
        AnnotationMetadata metadata = reader.getAnnotationMetadata(); 
 | 
        // 获取类中RequestMapping注解的value属性 
 | 
        if (!metadata.hasAnnotation(ApiModel.class.getCanonicalName())) { 
 | 
            return defines; 
 | 
        } 
 | 
        String apiName = getAttr(metadata.getAnnotationAttributes(ApiModel.class.getCanonicalName()), VALUE); 
 | 
        try { 
 | 
            Class clazz = Class.forName(metadata.getClassName()); 
 | 
            OssFieldDefine define = new OssFieldDefine(clazz.getSimpleName(), apiName); 
 | 
  
 | 
            Field[] fields = clazz.getDeclaredFields(); 
 | 
            for (Field field : fields) { 
 | 
                boolean isOssField = field.isAnnotationPresent(OssField.class); 
 | 
                if (isOssField) { 
 | 
                    OssField annotation = field.getAnnotation(OssField.class); 
 | 
                    define.addField(field.getName(), annotation.value()); 
 | 
                } 
 | 
            } 
 | 
            if (define.getFields().size() > 0) { 
 | 
                defines.add(define); 
 | 
            } 
 | 
        } catch (ClassNotFoundException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
  
 | 
        return defines; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取注解的属性 
 | 
     * 
 | 
     * @param attributes 
 | 
     * @param key 
 | 
     * @return 
 | 
     */ 
 | 
    private String getAttr(Map<String, Object> attributes, String key) { 
 | 
        // 若类无注解 
 | 
        if (attributes == null || attributes.get(key) == null) { 
 | 
            return null; 
 | 
        } 
 | 
        // 获取注解的属性值 
 | 
        Object value = attributes.get(key); 
 | 
        if (value instanceof String) { 
 | 
            return (String) value; 
 | 
        } else if (value instanceof String[]) { 
 | 
            String[] values = (String[]) attributes.get(key); 
 | 
            if (0 == values.length) { 
 | 
                return null; 
 | 
            } 
 | 
            return values[0]; 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
} 
 |