利用JavaDoc读取实体类注释和名字生成yapi格式文件

116 阅读1分钟

项目中导入 jdk\lib\tools.jar 包

package io.bm.utils;

import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSONObject;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.RootDoc;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class DocReader {

    public DocReader() {
    }

    private static RootDoc root;

    public static String getJsonStr(){
        ClassDoc[] classes = root.classes();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("type","object");
        JSONObject properties = new JSONObject();
        for (int i = 0; i < classes.length; i++) {
            System.out.println(classes[i]);
            System.out.println(classes[i].commentText());
            for (FieldDoc field : classes[i].fields(false)) {
                JSONObject fj = new JSONObject();
                fj.put("description",field.commentText());
                fj.put("type",getTypeName(field.type().simpleTypeName()));
                properties.put(field.name(),fj);
            }
        }
        jsonObject.put("properties",properties);
        return jsonObject.toJSONString();
    }

    private static  String getTypeName(String type){
        String result;
        if("String".equalsIgnoreCase(type)||"Date".equalsIgnoreCase(type)){
            result="string";
        }else if("Double".equalsIgnoreCase(type)||"Integer".equalsIgnoreCase(type)
                ||"Float".equalsIgnoreCase(type)||"Long".equalsIgnoreCase(type)||"BigDecimal".equalsIgnoreCase(type)){
            result="number";
        }else if(!Objects.isNull(type)&& "List".equals(type)){
            result="array";
        }else{
            result="object";
        }
        return result;
    }

    public static RootDoc getRoot(){
        return root;
    }


    private static void exec(String filePath) {
        com.sun.tools.javadoc.Main.execute(
                new String[]{
                             "-doclet",
                             DocLet.class.getName(),
                             "-encoding","utf-8",
                             "-classpath",
                            "D:\\wrok\\git_space\\ngs_bid\\target\\classes;" +
                                    "C:\\Users\\Administrator\\.m2\\repository\\io\\swagger\\swagger-annotations\\1.5.20\\swagger-annotations-1.5.20.jar;" +
                                    "C:\\Users\\Administrator\\.m2\\repository\\org\\projectlombok\\lombok\\1.18.16\\lombok-1.18.16.jar;" +
                                    "C:\\Users\\Administrator\\.m2\\repository\\com\\baomidou\\mybatis-plus-extension\\3.4.0\\mybatis-plus-extension-3.4.0.jar;"+
                                    "C:\\Users\\Administrator\\.m2\\repository\\com\\baomidou\\mybatis-plus-annotation\\3.4.0\\mybatis-plus-annotation-3.4.0.jar;" +
                                    "C:\\Users\\Administrator\\.m2\\repository\\com\\alibaba\\fastjson\\1.2.75\\fastjson-1.2.75.jar;" +
                                    "C:\\Users\\Administrator\\.m2\\repository\\bmdata\\com\\spring-boot-starter-framework\\1.2.69-31\\spring-boot-starter-framework-1.2.69-31.jar",
                                    filePath
                                            });
    }


    public static class DocLet{
        public DocLet() {
        }
        public static boolean start(RootDoc root){
            DocReader.root=root;
            return true;
        }
    }

    public static void main(String[] args) {
        List<File> list = new ArrayList<>();
        getDirectory("D:\\wrok\\git_space\\ngs_bid\\src\\main\\java\\io\\bm",list);
        list.forEach(v->{
            System.out.println(v.getAbsolutePath());
        });
        File file = new File("D:\\fileRoot\\json.txt");
        List<String> allList=new ArrayList<>();
        for (File d : list) {
            if(d.isDirectory()){
                //entity文件下 下面的实体类解析
                for (File listFile : Objects.requireNonNull(d.listFiles())) {
                    String name ="-----" +listFile.getAbsolutePath()+"-------";
                    String json = getJson(listFile.getAbsolutePath());
                    allList.add(name);
                    allList.add(json);
                }
            }
        }
        //写入文件
        FileUtil.writeUtf8Lines(allList,file);

    }

    //获取entity所有的文件夹
    private static List<File> getDirectory(String path,List<File> pathList){
        File file = new File(path);
        File[] files = file.listFiles();

        List<File> collect = Arrays.stream(files).filter(v -> "entity".equalsIgnoreCase(v.getName())).collect(Collectors.toList());
        if(!collect.isEmpty()){
            pathList.addAll(collect);
        }
        for (File f : files) {
            if(f.isDirectory()){
                getDirectory(f.getAbsolutePath(),pathList);
            }
        }
        return pathList;
    }


    public static  String getJson(String path){
        exec(path);
        return  getJsonStr();
    }



}