优化了一段代码,将 Tables 文件的 if 块抽离;删除了不必要的类型强转;现在即便不配置 genPath ,也能够以特定的字符集生成文件,且为文件增添了依赖文件以用于增量编译。

This commit is contained in:
CloudPlayer 2024-01-24 14:45:06 +08:00
parent 92a9c8a307
commit 46fb406e1e

View File

@ -39,10 +39,7 @@ import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements; import javax.lang.model.util.Elements;
import javax.lang.model.util.Types; import javax.lang.model.util.Types;
import javax.tools.JavaFileObject; import javax.tools.JavaFileObject;
import java.io.File; import java.io.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
import java.sql.Time; import java.sql.Time;
@ -50,12 +47,11 @@ import java.sql.Timestamp;
import java.time.*; import java.time.*;
import java.time.chrono.JapaneseDate; import java.time.chrono.JapaneseDate;
import java.util.*; import java.util.*;
import java.util.function.BiConsumer;
/** /**
* MyBatis Flex Processor. * MyBatis Flex Processor.
* *
* @author 王帅 * @author 王帅, CloudPlayer
* @since 2023-06-22 * @since 2023-06-22
*/ */
public class MybatisFlexProcessor extends AbstractProcessor { public class MybatisFlexProcessor extends AbstractProcessor {
@ -140,13 +136,8 @@ public class MybatisFlexProcessor extends AbstractProcessor {
// 获取需要生成的类开始构建文件 // 获取需要生成的类开始构建文件
Set<? extends Element> elementsAnnotatedWith = roundEnv.getElementsAnnotatedWith(Table.class); Set<? extends Element> elementsAnnotatedWith = roundEnv.getElementsAnnotatedWith(Table.class);
int size = elementsAnnotatedWith.size();
int index = 0;
for (Element entityClassElement : elementsAnnotatedWith) { for (Element entityClassElement : elementsAnnotatedWith) {
index++;
// 获取 Table 注解 // 获取 Table 注解
Table table = entityClassElement.getAnnotation(Table.class); Table table = entityClassElement.getAnnotation(Table.class);
@ -189,7 +180,8 @@ public class MybatisFlexProcessor extends AbstractProcessor {
String tableDefClassName = entityClassName.concat(tableDefClassSuffix); String tableDefClassName = entityClassName.concat(tableDefClassSuffix);
String tableDefContent = ContentBuilder.buildTableDef(tableInfo, allInTablesEnable, tableDefPackage, tableDefClassName String tableDefContent = ContentBuilder.buildTableDef(tableInfo, allInTablesEnable, tableDefPackage, tableDefClassName
, tableDefPropertiesNameStyle, tableDefInstanceSuffix, columnInfos, defaultColumns); , tableDefPropertiesNameStyle, tableDefInstanceSuffix, columnInfos, defaultColumns);
processGenClass(genPath, tableDefPackage, tableDefClassName, tableDefContent); // 将文件所依赖的 Element 传入 Filer 表示此 TableDef 依赖这个类以保证增量编译时不丢失内容
processGenClass(genPath, tableDefPackage, tableDefClassName, tableDefContent, entityClassElement);
if (allInTablesEnable) { if (allInTablesEnable) {
// 标记 entity 如果没有配置 Tables 生成位置 entity 位置为准 // 标记 entity 如果没有配置 Tables 生成位置 entity 位置为准
@ -204,17 +196,17 @@ public class MybatisFlexProcessor extends AbstractProcessor {
String mapperClassName = entityClassName.concat("Mapper"); String mapperClassName = entityClassName.concat("Mapper");
boolean mapperAnnotationEnable = "true".equalsIgnoreCase(mapperAnnotation); boolean mapperAnnotationEnable = "true".equalsIgnoreCase(mapperAnnotation);
String mapperClassContent = ContentBuilder.buildMapper(tableInfo, realMapperPackage, mapperClassName, mapperBaseClass, mapperAnnotationEnable); String mapperClassContent = ContentBuilder.buildMapper(tableInfo, realMapperPackage, mapperClassName, mapperBaseClass, mapperAnnotationEnable);
processGenClass(genPath, realMapperPackage, mapperClassName, mapperClassContent); // 生成的 Mapper 依赖于此 Element
processGenClass(genPath, realMapperPackage, mapperClassName, mapperClassContent, entityClassElement);
} }
}
// handle NPE, ensure TableDef already generate. // 确定了要生成 Tables 且拥有至少一个被 Table 注解的类时再生成 Tables
if (index == size && allInTablesEnable) { if (allInTablesEnable && entityClassReference != null) {
// 生成 Tables 文件 // 生成 Tables 文件
String realTablesPackage = StrUtil.isBlank(allInTablesPackage) ? StrUtil.buildTableDefPackage(entityClassReference) : allInTablesPackage; String realTablesPackage = StrUtil.isBlank(allInTablesPackage) ? StrUtil.buildTableDefPackage(entityClassReference) : allInTablesPackage;
String realTablesClassName = StrUtil.isBlank(allInTablesClassName) ? "Tables" : allInTablesClassName; String realTablesClassName = StrUtil.isBlank(allInTablesClassName) ? "Tables" : allInTablesClassName;
String tablesContent = ContentBuilder.buildTables(importBuilder, fieldBuilder, realTablesPackage, allInTablesClassName); String tablesContent = ContentBuilder.buildTables(importBuilder, fieldBuilder, realTablesPackage, allInTablesClassName);
processGenClass(genPath, realTablesPackage, realTablesClassName, tablesContent); processGenClass(genPath, realTablesPackage, realTablesClassName, tablesContent, elementsAnnotatedWith.toArray(new Element[0]));
}
} }
} }
return false; return false;
@ -259,7 +251,7 @@ public class MybatisFlexProcessor extends AbstractProcessor {
final String[] typeHandlerClass = {""}; final String[] typeHandlerClass = {""};
List<? extends AnnotationMirror> annotationMirrors = fieldElement.getAnnotationMirrors(); List<? extends AnnotationMirror> annotationMirrors = fieldElement.getAnnotationMirrors();
for (AnnotationMirror annotationMirror : annotationMirrors) { for (AnnotationMirror annotationMirror : annotationMirrors) {
annotationMirror.getElementValues().forEach((BiConsumer<ExecutableElement, AnnotationValue>) (executableElement, annotationValue) -> { annotationMirror.getElementValues().forEach((executableElement, annotationValue) -> {
if ("typeHandler".contentEquals(executableElement.getSimpleName())) { if ("typeHandler".contentEquals(executableElement.getSimpleName())) {
typeHandlerClass[0] = annotationValue.toString(); typeHandlerClass[0] = annotationValue.toString();
} }
@ -346,12 +338,12 @@ public class MybatisFlexProcessor extends AbstractProcessor {
} }
private void processGenClass(String genBasePath, String genPackageName, String className, String genContent) { private void processGenClass(String genBasePath, String genPackageName, String className, String genContent, Element... elements) {
Writer writer = null; Writer writer = null;
try { try {
JavaFileObject sourceFile = filer.createSourceFile(genPackageName + "." + className); JavaFileObject sourceFile = filer.createSourceFile(genPackageName + "." + className, elements);
if (genBasePath == null || genBasePath.trim().length() == 0) { if (genBasePath == null || genBasePath.trim().length() == 0) {
writer = sourceFile.openWriter(); writer = new OutputStreamWriter(sourceFile.openOutputStream(), configuration.get(ConfigurationKey.CHARSET));
writer.write(genContent); writer.write(genContent);
writer.flush(); writer.flush();
return; return;