ClassInitUtil.java 3.9 KB
Newer Older
苗卫卫 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
package com.boco.nbd.wios.flow.util;

import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.ApiModelProperty;

import javax.persistence.Column;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author:cao hai
 * @date:2022/6/27 14:01
 * @version:V1.0
 * @description:TODO ClassInitUtil
 * @modify:
 */
public class ClassInitUtil {

    private static final String SPLIT_CHAR = "\\n";

    private static final String SPLIT_FIELD = "\\s+";

    private static final String LINE_CHAR = "_";

    private static final String COMMENT = "COMMENT";

    private static final String VARCHAR_CHAR = "varchar";

    private static final String INT_CHAR = "int";

    private static final String TINYINT_CHAR = "tinyint";

    private static final String LONG_CHAR = "int(11)";

    private static final String DATETIME_CHAR = "datetime";

    /**
     * 下划线正则
     */
    public final static Pattern LINE_PATTERN = Pattern.compile("_(\\w)");

    /**
     * 生成class 内容
     *
     * @param str
     * @return
     */
    public static String createClass(String str) {
        String[] items = str.split(SPLIT_CHAR);
        StringBuffer buffer = new StringBuffer();
        for (String item : items) {
            String fieldDescribe = "";
            String fieldName = "";
            String fieldType = "";
            String[] info = item.trim().split(COMMENT);
            if (info.length >= 2) {
                fieldDescribe = info[info.length - 1].trim().replace("'", "");
                fieldDescribe = fieldDescribe.substring(0, fieldDescribe.length() - 1);
            }
            String[] fieldInfo = info[0].trim().split(SPLIT_FIELD);
            if (fieldInfo.length < 3) {
                continue;
            }
            fieldName = fieldInfo[0].trim().replace("`", "");
            fieldType = fieldInfo[1].trim();
            buffer.append("@Column(name =\"" + fieldName + "\")" + System.lineSeparator());
            buffer.append("@ApiModelProperty(value = \"" + fieldDescribe + "\")" + System.lineSeparator());
            buffer.append("private ");
            buffer.append(getType(fieldType) + " ");
            buffer.append(lineToHump(fieldName) + " ");
            buffer.append(";" + System.lineSeparator());
            buffer.append(System.lineSeparator());
        }

        return buffer.toString();
    }

    /**
     * 获取类型
     *
     * @param type
     * @return
     */
    private static String getType(String type) {
        if (type.startsWith(VARCHAR_CHAR)) {
            return String.class.getSimpleName();
        }
        if (type.startsWith(INT_CHAR) || type.startsWith(TINYINT_CHAR)) {
            return Integer.class.getSimpleName();
        }
        if (type.startsWith(LONG_CHAR)) {
            return Long.class.getSimpleName();
        }
        if (type.startsWith(DATETIME_CHAR)) {
            return Date.class.getSimpleName();
        }
        return "";
    }

    /**
     * 下划线转驼峰
     *
     * @param str
     * @return
     */
    public static String lineToHump(String str) {
        if (StrUtil.isEmpty(str)) {
            return "";
        }
        String regex = "^[A-Z0-9]+$";
        //处理已经是大写格式的时候,正则处理存在问题,只有大写字母、数字组成的不处理
        if (Pattern.matches(regex, str)) {
            return str.toLowerCase(Locale.ROOT);
        }

        //已经是驼峰不处理
        if (str.contains(LINE_CHAR)) {
            str = str.toLowerCase(Locale.ROOT);
            StringBuffer buffer = new StringBuffer();
            Matcher matcher = LINE_PATTERN.matcher(str);
            while (matcher.find()) {
                matcher.appendReplacement(buffer, matcher.group(1).toUpperCase(Locale.ROOT));
            }
            matcher.appendTail(buffer);
            return buffer.toString();
        }

        return str;

    }
}