// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/model/FieldInfo.java
// @Data
// public class FieldInfo {
// 
//     private String name;
// 
//     private Class<?> type;
// 
//     private String simpleTypeName;
// 
//     private String comment;
// 
//     /**
//      * 是否必填,默认false
//      */
//     private boolean require;
// 
//     private List<FieldInfo> fieldInfos;
// 
// }
// 
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/resolver/JavaSourceFileManager.java
// public class JavaSourceFileManager {
// 
//     private static final JavaSourceFileManager instance = new JavaSourceFileManager();
// 
//     private static Map<String, String> classPath = new HashMap<>();
// 
//     public static JavaSourceFileManager getInstance() {
//         return instance;
//     }
// 
// 
//     /**
//      * 递归获取指定目录下面所有的Java文件,包括子目录中的
//      *
//      * @param file 文件目录
//      * @return 所有java文件
//      */
//     public List<String> getAllJavaFiles(File file) {
//         if (!file.exists()) {
//             return new ArrayList(0);
//         }
// 
//         if (file.isFile()) {
//             if (file.getName().lastIndexOf(".java") > 0) {
//                 List list = new ArrayList(1);
//                 list.add(file.getAbsolutePath());
//                 return list;
//             } else {
//                 return new ArrayList(0);
//             }
//         }
// 
//         List<String> list = new ArrayList();
//         if (file.isDirectory()) {
//             File[] files = file.listFiles();
//             if (files != null) {
//                 for (File f : files) {
//                     list.addAll(getAllJavaFiles(f));
//                 }
//             }
//         }
//         return list;
//     }
// 
//     /**
//      * 将指定类名与对应的类源码文件路径存放进来
//      *
//      * @param name 类名称
//      * @param path 类源码文件路径
//      */
//     public void put(String name, String path) {
//         classPath.put(name, path);
//     }
// 
//     /**
//      * 获取指定类名所对应的类源码文件路径
//      *
//      * @param name 类名
//      * @return 源码文件路径, 如果不存在则返回null
//      */
//     public String getPath(String name) {
//         return classPath.get(name);
//     }
// }


import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.treeleafj.xdoc.model.FieldInfo;
import org.treeleafj.xdoc.resolver.JavaSourceFileManager;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileInputStream;
import java.util.*;

        return commentMap;
    }

    public static List<FieldInfo> analysisFields(Class classz, Map<String, String> commentMap) {
        PropertyDescriptor[] propertyDescriptors = PropertyUtils.getPropertyDescriptors(classz);


        List<FieldInfo> fields = new ArrayList<>();

        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            //排除掉class属性
            if ("class".equals(propertyDescriptor.getName())) {
                continue;
            }

            FieldInfo field = new FieldInfo();
            field.setType(propertyDescriptor.getPropertyType());
            field.setSimpleTypeName(propertyDescriptor.getPropertyType().getSimpleName());
            field.setName(propertyDescriptor.getName());
            String comment = commentMap.get(propertyDescriptor.getName());
            if (StringUtils.isBlank(comment)) {
                field.setComment("");
                field.setRequire(false);
                fields.add(field);
            } else {
                boolean require = false;
                if (comment.contains("|")) {
                    int endIndex = comment.lastIndexOf("|" + Constant.YES_ZH);
                    if (endIndex < 0) {
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/model/FieldInfo.java
// @Data
// public class FieldInfo {
// 
//     private String name;
// 
//     private Class<?> type;
// 
//     private String simpleTypeName;
// 
//     private String comment;
// 
//     /**
//      * 是否必填,默认false
//      */
//     private boolean require;
// 
//     private List<FieldInfo> fieldInfos;
// 
// }
// 
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/resolver/JavaSourceFileManager.java
// public class JavaSourceFileManager {
// 
//     private static final JavaSourceFileManager instance = new JavaSourceFileManager();
// 
//     private static Map<String, String> classPath = new HashMap<>();
// 
//     public static JavaSourceFileManager getInstance() {
//         return instance;
//     }
// 
// 
//     /**
//      * 递归获取指定目录下面所有的Java文件,包括子目录中的
//      *
//      * @param file 文件目录
//      * @return 所有java文件
//      */
//     public List<String> getAllJavaFiles(File file) {
//         if (!file.exists()) {
//             return new ArrayList(0);
//         }
// 
//         if (file.isFile()) {
//             if (file.getName().lastIndexOf(".java") > 0) {
//                 List list = new ArrayList(1);
//                 list.add(file.getAbsolutePath());
//                 return list;
//             } else {
//                 return new ArrayList(0);
//             }
//         }
// 
//         List<String> list = new ArrayList();
//         if (file.isDirectory()) {
//             File[] files = file.listFiles();
//             if (files != null) {
//                 for (File f : files) {
//                     list.addAll(getAllJavaFiles(f));
//                 }
//             }
//         }
//         return list;
//     }
// 
//     /**
//      * 将指定类名与对应的类源码文件路径存放进来
//      *
//      * @param name 类名称
//      * @param path 类源码文件路径
//      */
//     public void put(String name, String path) {
//         classPath.put(name, path);
//     }
// 
//     /**
//      * 获取指定类名所对应的类源码文件路径
//      *
//      * @param name 类名
//      * @return 源码文件路径, 如果不存在则返回null
//      */
//     public String getPath(String name) {
//         return classPath.get(name);
//     }
// }


// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/utils/JavaFileUtils.java
import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.treeleafj.xdoc.model.FieldInfo;
import org.treeleafj.xdoc.resolver.JavaSourceFileManager;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileInputStream;
import java.util.*;


        return commentMap;
    }

    public static List<FieldInfo> analysisFields(Class classz, Map<String, String> commentMap) {
        PropertyDescriptor[] propertyDescriptors = PropertyUtils.getPropertyDescriptors(classz);


        List<FieldInfo> fields = new ArrayList<>();

        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            //排除掉class属性
            if ("class".equals(propertyDescriptor.getName())) {
                continue;
            }

            FieldInfo field = new FieldInfo();
            field.setType(propertyDescriptor.getPropertyType());
            field.setSimpleTypeName(propertyDescriptor.getPropertyType().getSimpleName());
            field.setName(propertyDescriptor.getName());
            String comment = commentMap.get(propertyDescriptor.getName());
            if (StringUtils.isBlank(comment)) {
                field.setComment("");
                field.setRequire(false);
                fields.add(field);
            } else {
                boolean require = false;
                if (comment.contains("|")) {
                    int endIndex = comment.lastIndexOf("|" + Constant.YES_ZH);
                    if (endIndex < 0) {
                        endIndex = comment.lastIndexOf("|" + Constant.YES_EN);