001/*
002 *  Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
003 *  <p>
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *  <p>
008 *  http://www.apache.org/licenses/LICENSE-2.0
009 *  <p>
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016
017package com.mybatisflex.processor.builder;
018
019import com.mybatisflex.processor.entity.ColumnInfo;
020import com.mybatisflex.processor.entity.TableInfo;
021import com.mybatisflex.processor.util.StrUtil;
022
023import java.util.Collection;
024import java.util.List;
025import java.util.StringJoiner;
026
027/**
028 * 文件内容构建。
029 *
030 * @author 王帅
031 * @since 2023-06-23
032 */
033@SuppressWarnings({"squid:S107", "squid:S1192"})
034public class ContentBuilder {
035
036    private ContentBuilder() {
037    }
038
039    /**
040     * 构建 Mapper 文件内容。
041     */
042    public static String buildMapper(TableInfo tableInfo, String mappersPackage, String mapperClassName,
043                                     String baseMapperClass, boolean mapperAnnotationEnable) {
044        String entityClass = tableInfo.getEntityName();
045        StringBuilder content = new StringBuilder("package ");
046        content.append(mappersPackage).append(";\n\n");
047        content.append("import ").append(baseMapperClass).append(";\n");
048        content.append("import ").append(entityClass).append(";\n\n");
049        if (mapperAnnotationEnable) {
050            content.append("import org.apache.ibatis.annotations.Mapper;\n\n");
051            content.append("@Mapper\n");
052        }
053        String realEntityClassName = StrUtil.getClassName(entityClass);
054        String baseMapperClassName = StrUtil.getClassName(baseMapperClass);
055        content.append("public interface ").append(mapperClassName).append(" extends ").append(baseMapperClassName).append("<").append(realEntityClassName).append("> {\n}");
056        return content.toString();
057    }
058
059    /**
060     * 构建 TableDef 文件内容。
061     */
062    public static String buildTableDef(TableInfo tableInfo, boolean allInTablesEnable,
063                                       String tableDefPackage, String tableDefClassName,
064                                       String tableDefPropertiesNameStyle, String tableDefInstanceSuffix,
065                                       Collection<ColumnInfo> columnInfos, List<String> defaultColumns) {
066        StringBuilder content = new StringBuilder("package ");
067        content.append(tableDefPackage).append(";\n\n");
068        content.append("import com.mybatisflex.core.query.QueryColumn;\n");
069        content.append("import com.mybatisflex.core.table.TableDef;\n\n");
070        content.append("// Auto generate by mybatis-flex, do not modify it.\n");
071        content.append("public class ").append(tableDefClassName).append(" extends TableDef {\n\n");
072
073        //TableDef 类的属性名称
074        String tableDefPropertyName = null;
075        if (!allInTablesEnable) {
076            String entityComment = tableInfo.getEntityComment();
077            if (!StrUtil.isBlank(entityComment)) {
078                content.append("    /**\n")
079                    .append("     * ").append(entityComment.trim()).append("\n")
080                    .append("     */\n");
081            }
082            tableDefPropertyName = StrUtil.buildFieldName(tableInfo.getEntitySimpleName().concat(tableDefInstanceSuffix != null ? tableDefInstanceSuffix.trim() : ""), tableDefPropertiesNameStyle);
083            content.append("    public static final ").append(tableDefClassName).append(' ').append(tableDefPropertyName)
084                .append(" = new ").append(tableDefClassName).append("();\n\n");
085        }
086
087
088        String finalTableDefPropertyName = tableDefPropertyName;
089        columnInfos.forEach(columnInfo -> {
090            String comment = columnInfo.getComment();
091            if (!StrUtil.isBlank(comment)) {
092                content.append("    /**\n")
093                    .append("     * ").append(comment.trim()).append("\n")
094                    .append("     */\n");
095            }
096
097            // QueryColumn 属性定义的名称
098            String columnPropertyName = StrUtil.buildFieldName(columnInfo.getProperty(), tableDefPropertiesNameStyle);
099
100            //当字段名称和表名一样时,自动为字段添加一个小尾巴 "_",例如 account_
101            if (columnPropertyName.equals(finalTableDefPropertyName)) {
102                columnPropertyName = columnPropertyName + "_";
103            }
104            content.append("    public final QueryColumn ")
105                .append(columnPropertyName)
106                .append(" = new QueryColumn(this, \"")
107                .append(columnInfo.getColumn()).append("\"");
108            if (columnInfo.getAlias() != null && columnInfo.getAlias().length > 0) {
109                content.append(", \"").append(columnInfo.getAlias()[0]).append("\"");
110            }
111            content.append(");\n\n");
112        });
113        content.append("    /**\n")
114            .append("     * 所有字段。\n")
115            .append("     */\n");
116        content.append("    public final QueryColumn ").append(StrUtil.buildFieldName("allColumns", tableDefPropertiesNameStyle)).append(" = new QueryColumn(this, \"*\");\n");
117        StringJoiner defaultColumnJoiner = new StringJoiner(", ");
118        columnInfos.forEach(columnInfo -> {
119            if (defaultColumns.contains(columnInfo.getColumn())) {
120                String columnPropertyName = StrUtil.buildFieldName(columnInfo.getProperty(), tableDefPropertiesNameStyle);
121                if (columnPropertyName.equals(finalTableDefPropertyName)) {
122                    columnPropertyName = columnPropertyName + "_";
123                }
124                defaultColumnJoiner.add(columnPropertyName);
125            }
126        });
127        content.append("\n    /**\n")
128            .append("     * 默认字段,不包含逻辑删除或者 large 等字段。\n")
129            .append("     */\n");
130        content.append("    public final QueryColumn[] ").append(StrUtil.buildFieldName("defaultColumns", tableDefPropertiesNameStyle)).append(" = new QueryColumn[]{").append(defaultColumnJoiner).append("};\n\n");
131        String schema = !StrUtil.isBlank(tableInfo.getSchema())
132            ? tableInfo.getSchema()
133            : "";
134        String tableName = !StrUtil.isBlank(tableInfo.getTableName())
135            ? tableInfo.getTableName()
136            : StrUtil.firstCharToLowerCase(tableInfo.getEntitySimpleName());
137        content.append("    public ").append(tableDefClassName).append("() {\n")
138            .append("        super").append("(\"").append(schema).append("\", \"").append(tableName).append("\");\n")
139            .append("    }\n\n}\n");
140        return content.toString();
141    }
142
143    /**
144     * 构建 Tables 文件内容。
145     */
146    public static String buildTables(StringBuilder importBuilder, StringBuilder fieldBuilder,
147                                     String tablesPackage, String tablesClassName) {
148        return "package " + tablesPackage + ";\n\n" +
149            importBuilder.toString() +
150            "\n// Auto generate by mybatis-flex, do not modify it.\n" +
151            "public class " + tablesClassName + " {\n\n" +
152            "    private " + tablesClassName + "() {\n" +
153            "    }\n\n" +
154            fieldBuilder.toString() +
155            "\n}\n";
156    }
157
158    /**
159     * 构建 Tables 文件常量属性。
160     */
161    public static void buildTablesField(StringBuilder importBuilder, StringBuilder fieldBuilder, TableInfo tableInfo,
162                                        String tableDefClassSuffix, String tableDefPropertiesNameStyle, String tableDefInstanceSuffix) {
163        String tableDefPackage = StrUtil.buildTableDefPackage(tableInfo.getEntityName());
164        String tableDefClassName = tableInfo.getEntitySimpleName().concat(tableDefClassSuffix);
165        importBuilder.append("import ").append(tableDefPackage).append('.').append(tableDefClassName).append(";\n");
166        String entityComment = tableInfo.getEntityComment();
167        if (!StrUtil.isBlank(entityComment)) {
168            fieldBuilder.append("    /**\n")
169                .append("    * ").append(entityComment).append("\n")
170                .append("    */\n");
171        }
172        fieldBuilder.append("    public static final ").append(tableDefClassName).append(' ')
173            .append(StrUtil.buildFieldName(tableInfo.getEntitySimpleName().concat(tableDefInstanceSuffix != null ? tableDefInstanceSuffix.trim() : ""), tableDefPropertiesNameStyle))
174            .append(" = new ").append(tableDefClassName).append("();\n");
175    }
176
177}