From e164fcbf03821adb6c7f98e2cb84a88c5e70f677 Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Fri, 24 Nov 2023 17:35:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90,=20=E6=B7=BB=E5=8A=A0=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +- src/main/java/cn/lihongjie/coal/Codegen.java | 69 +++++++++++++++++--- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 782e434c..c983e28b 100644 --- a/pom.xml +++ b/pom.xml @@ -317,7 +317,11 @@ - + + com.google.googlejavaformat + google-java-format + 1.18.1 + org.postgresql diff --git a/src/main/java/cn/lihongjie/coal/Codegen.java b/src/main/java/cn/lihongjie/coal/Codegen.java index e6d2edaf..43854886 100644 --- a/src/main/java/cn/lihongjie/coal/Codegen.java +++ b/src/main/java/cn/lihongjie/coal/Codegen.java @@ -14,6 +14,8 @@ import cn.lihongjie.coal.base.mapper.CommonMapper; import cn.lihongjie.coal.base.service.BaseService; import com.google.common.base.CaseFormat; +import com.google.googlejavaformat.java.Formatter; +import com.google.googlejavaformat.java.JavaFormatterOptions; import com.squareup.javapoet.*; import jakarta.persistence.Entity; @@ -38,12 +40,30 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; import java.util.Scanner; import javax.lang.model.element.Modifier; +/** + * google-java-format uses internal javac APIs for parsing Java source. The following JVM flags are + * required when running on JDK 16 and newer, due to JEP 396: Strongly Encapsulate JDK Internals by + * Default: + * + *

--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + * --add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + * --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + * --add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + * --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + * --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + */ public class Codegen { public static final Path DIRECTORY = Path.of("src/main/java/"); @@ -80,7 +100,7 @@ public class Codegen { .addAnnotation(Entity.class) .build(); - JavaFile.builder(entityPackage, entity).build().writeTo(DIRECTORY); + saveFile(entityPackage, entity); // 生成dto TypeSpec dto = @@ -90,7 +110,7 @@ public class Codegen { .addAnnotation(Data.class) .build(); - JavaFile.builder(dtoPackage, dto).build().writeTo(DIRECTORY); + saveFile(dtoPackage, dto); // 生成createDto TypeSpec createDto = @@ -100,7 +120,7 @@ public class Codegen { .addAnnotation(Data.class) .build(); - JavaFile.builder(dtoPackage, createDto).build().writeTo(DIRECTORY); + saveFile(dtoPackage, createDto); // 生成updateDto TypeSpec updateDto = @@ -110,7 +130,7 @@ public class Codegen { .addAnnotation(Data.class) .build(); - JavaFile.builder(dtoPackage, updateDto).build().writeTo(DIRECTORY); + saveFile(dtoPackage, updateDto); // 生成repository TypeSpec repository = @@ -123,7 +143,7 @@ public class Codegen { ClassName.get(entityPackage, entity.name))) .build(); - JavaFile.builder(repoPackage, repository).build().writeTo(DIRECTORY); + saveFile(repoPackage, repository); // 生成mapper TypeSpec mapper = @@ -147,7 +167,7 @@ public class Codegen { ClassName.get(dtoPackage, updateDto.name))) .build(); - JavaFile.builder(mapperPackage, mapper).build().writeTo(DIRECTORY); + saveFile(mapperPackage, mapper); // 生成service TypeSpec service = @@ -263,7 +283,7 @@ public class Codegen { .build()) .build(); - JavaFile.builder(servicePackage, service).build().writeTo(DIRECTORY); + saveFile(servicePackage, service); // 生成controller TypeSpec.Builder controllerBuilder = @@ -395,6 +415,39 @@ public class Codegen { ClassName.get(Sort.class)) .build()); - JavaFile.builder(controllerPackage, controllerBuilder.build()).build().writeTo(DIRECTORY); + saveFile(controllerPackage, controllerBuilder.build()); + } + + @SneakyThrows + private static void saveFile(String pkg, TypeSpec entity) throws IOException { + + JavaFile javaFile = JavaFile.builder(pkg, entity).build(); + + Path outputDirectory = DIRECTORY; + if (!javaFile.packageName.isEmpty()) { + for (String packageComponent : javaFile.packageName.split("\\.")) { + outputDirectory = outputDirectory.resolve(packageComponent); + } + Files.createDirectories(outputDirectory); + } + + Path outputPath = outputDirectory.resolve(javaFile.typeSpec.name + ".java"); + try (Writer writer = + new OutputStreamWriter(Files.newOutputStream(outputPath), StandardCharsets.UTF_8)) { + + StringWriter out = new StringWriter(); + javaFile.writeTo(out); + + String formattedSource = + new Formatter( + JavaFormatterOptions.builder() + .style(JavaFormatterOptions.Style.AOSP) + .formatJavadoc(true) + .reorderModifiers(true) + .build()) + .formatSource(out.toString()); + + writer.write(formattedSource); + } } }