diff --git a/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/builder/ContentBuilder.java b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/builder/ContentBuilder.java new file mode 100644 index 00000000..dd97cab7 --- /dev/null +++ b/mybatis-flex-processor/src/main/java/com/mybatisflex/processor/builder/ContentBuilder.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mybatisflex.processor.builder; + +import com.mybatisflex.annotation.Table; +import com.mybatisflex.processor.util.StrUtil; + +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; + +/** + * 文件内容构建。 + * + * @author 王帅 + * @since 2023-06-23 + */ +@SuppressWarnings("all") +public class ContentBuilder { + + private ContentBuilder() { + } + + /** + * 构建 Mapper 文件内容。 + */ + public static String buildMapper(String entityClass, String entityClassName, + String mappersPackage, String mapperClassName, String baseMapperClass) { + StringBuilder content = new StringBuilder("package "); + content.append(mappersPackage).append(";\n\n"); + content.append("import ").append(baseMapperClass).append(";\n"); + content.append("import ").append(entityClass).append(";\n\n"); + String realEntityClassName = StrUtil.getClassName(entityClass); + String baseMapperClassName = StrUtil.getClassName(baseMapperClass); + content.append("public interface ").append(mapperClassName).append(" extends ").append(baseMapperClassName).append("<").append(realEntityClassName).append("> {\n}"); + return content.toString(); + } + + /** + * 构建 TableDef 文件内容。 + */ + public static String buildTableDef(Table table, String entityClass, String entityClassName, boolean allInTables, + String tableDefPackage, String tableDefClassName, + String tablesNameStyle, String tablesDefSuffix, + Map propertyAndColumns, List defaultColumns) { + StringBuilder content = new StringBuilder("package "); + content.append(tableDefPackage).append(";\n\n"); + content.append("import com.mybatisflex.core.query.QueryColumn;\n"); + content.append("import com.mybatisflex.core.table.TableDef;\n\n"); + content.append("// Auto generate by mybatis-flex, do not modify it.\n"); + content.append("public class ").append(tableDefClassName).append(" extends TableDef {\n\n"); + if (!allInTables) { + String schema = !StrUtil.isBlank(table.schema()) + ? table.schema() + : ""; + String tableName = !StrUtil.isBlank(table.value()) + ? table.value() + : StrUtil.firstCharToLowerCase(entityClassName); + content.append(" public static final ").append(tableDefClassName).append(' ').append(StrUtil.buildFieldName(entityClassName.concat(tablesDefSuffix != null ? tablesDefSuffix.trim() : ""), tablesNameStyle)) + .append(" = new ").append(tableDefClassName).append("(\"").append(schema).append("\", \"").append(tableName).append("\");\n\n"); + } + propertyAndColumns.forEach((property, column) -> content.append(" public QueryColumn ") + .append(StrUtil.buildFieldName(property, tablesNameStyle)) + .append(" = new QueryColumn(this, \"") + .append(column).append("\");\n")); + content.append(" public QueryColumn ").append(StrUtil.buildFieldName("allColumns", tablesNameStyle)).append(" = new QueryColumn(this, \"*\");\n"); + StringJoiner defaultColumnJoiner = new StringJoiner(", "); + propertyAndColumns.forEach((property, column) -> { + if (defaultColumns.contains(column)) { + defaultColumnJoiner.add(StrUtil.buildFieldName(property, tablesNameStyle)); + } + }); + content.append(" public QueryColumn[] ").append(StrUtil.buildFieldName("defaultColumns", tablesNameStyle)).append(" = new QueryColumn[]{").append(defaultColumnJoiner).append("};\n\n"); + content.append(" public ").append(tableDefClassName).append("(String schema, String tableName) {\n") + .append(" super(schema, tableName);\n") + .append(" }\n\n}\n"); + return content.toString(); + } + + /** + * 构建 Tables 文件内容。 + */ + public static String buildTables(StringBuilder importBuilder, StringBuilder fieldBuilder, + String tablesPackage, String tablesClassName) { + return "package " + tablesPackage + ";\n\n" + + importBuilder.toString() + + "\n// Auto generate by mybatis-flex, do not modify it.\n" + + "public class " + tablesClassName + " {\n\n" + + " private " + tablesClassName + "() {\n" + + " }\n\n" + + fieldBuilder.toString() + + "\n}\n"; + } + + /** + * 构建 Tables 文件常量属性。 + */ + public static void buildTablesField(StringBuilder importBuilder, StringBuilder fieldBuilder, Table table, + String entityClass, String entityClassName, String tablesNameStyle, String tablesDefSuffix) { + String tableDefPackage = StrUtil.buildTableDefPackage(entityClass); + String tableDefClassName = entityClassName.concat("TableDef"); + importBuilder.append("import ").append(tableDefPackage).append('.').append(tableDefClassName).append(";\n"); + String schema = !StrUtil.isBlank(table.schema()) + ? table.schema() + : ""; + String tableName = !StrUtil.isBlank(table.value()) + ? table.value() + : StrUtil.firstCharToLowerCase(entityClassName); + fieldBuilder.append(" public static final ").append(tableDefClassName).append(' ') + .append(StrUtil.buildFieldName(entityClassName.concat(tablesDefSuffix != null ? tablesDefSuffix.trim() : ""), tablesNameStyle)) + .append(" = new ").append(tableDefClassName).append("(\"").append(schema).append("\", \"").append(tableName).append("\");\n"); + } + +} \ No newline at end of file