From 888922953c6dbe9d9e4f2966db2a8d8d5268759d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=B6=E8=AE=AD?= Date: Mon, 3 Aug 2026 15:02:20 +0800 Subject: [PATCH] Use platform-neutral path composition --- .../workutils/biz/apidoc/ApiDocWindow.java | 8 ++--- .../biz/apidoc/parser/JavaSourceParser.java | 2 +- .../application/OutputLayoutPolicy.java | 6 ++-- .../system/support/FileOperationHelper.java | 3 +- .../application/OutputLayoutPolicyTest.java | 6 ++-- .../support/FileOperationHelperPathTest.java | 31 +++++++++++++++++++ 6 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 src/test/java/com/example/workutils/system/support/FileOperationHelperPathTest.java diff --git a/src/main/java/com/example/workutils/biz/apidoc/ApiDocWindow.java b/src/main/java/com/example/workutils/biz/apidoc/ApiDocWindow.java index 23955c7..15b087e 100644 --- a/src/main/java/com/example/workutils/biz/apidoc/ApiDocWindow.java +++ b/src/main/java/com/example/workutils/biz/apidoc/ApiDocWindow.java @@ -515,7 +515,7 @@ public class ApiDocWindow { Path projDir = Paths.get(projPath); if (!Files.isDirectory(projDir)) continue; List srcBases = new ArrayList<>(); - Path selfSrc = projDir.resolve("src/main/java"); + Path selfSrc = projDir.resolve(Path.of("src", "main", "java")); if (Files.isDirectory(selfSrc)) srcBases.add(selfSrc); try (Stream children = Files.list(projDir)) { children.filter(Files::isDirectory) @@ -579,7 +579,7 @@ public class ApiDocWindow { for (String projPath : selectedPaths) { Path projDir = Paths.get(projPath); if (!Files.isDirectory(projDir)) continue; - Path selfSrc = projDir.resolve("src/main/java"); + Path selfSrc = projDir.resolve(Path.of("src", "main", "java")); String key = selfSrc.toString().replace('\\', '/'); if (Files.isDirectory(selfSrc) && seenSrcBases.add(key)) { modules.add(new ModuleInfo(projDir.getFileName().toString(), projPath, selfSrc)); @@ -905,7 +905,7 @@ public class ApiDocWindow { private void collectSrcBases(Path dir, List srcBases) { if (!Files.isDirectory(dir)) return; - Path sb = dir.resolve("src/main/java"); + Path sb = dir.resolve(Path.of("src", "main", "java")); if (Files.isDirectory(sb)) srcBases.add(sb); try (Stream children = Files.list(dir)) { children.filter(Files::isDirectory).filter(d -> !d.getFileName().toString().startsWith(".")) @@ -932,7 +932,7 @@ public class ApiDocWindow { private void collectModules(Path dir, List modules, Set seen) { if (!Files.isDirectory(dir)) return; - Path sb = dir.resolve("src/main/java"); + Path sb = dir.resolve(Path.of("src", "main", "java")); String key = sb.toString().replace('\\', '/'); if (Files.isDirectory(sb) && seen.add(key)) { modules.add(new ModuleInfo(dir.getFileName().toString(), diff --git a/src/main/java/com/example/workutils/biz/apidoc/parser/JavaSourceParser.java b/src/main/java/com/example/workutils/biz/apidoc/parser/JavaSourceParser.java index 18e7b16..40c1979 100644 --- a/src/main/java/com/example/workutils/biz/apidoc/parser/JavaSourceParser.java +++ b/src/main/java/com/example/workutils/biz/apidoc/parser/JavaSourceParser.java @@ -81,7 +81,7 @@ public class JavaSourceParser { * 扫描项目目录下所有 .java 文件(自动追加 src/main/java) */ public List findJavaFiles(Path projectPath) { - Path javaSrc = projectPath.resolve("src/main/java"); + Path javaSrc = projectPath.resolve(Path.of("src", "main", "java")); if (!Files.isDirectory(javaSrc)) { log.debug("项目 {} 没有 src/main/java 目录", projectPath); return new ArrayList<>(); diff --git a/src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicy.java b/src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicy.java index 405298c..7e0f577 100644 --- a/src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicy.java +++ b/src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicy.java @@ -10,9 +10,9 @@ public final class OutputLayoutPolicy { Path root = requireProjectRoot(projectRoot); return new OutputLayout( root, - root.resolve("src/main/java"), - root.resolve("src/main/resources"), - root.resolve("src/main/java")); + root.resolve(Path.of("src", "main", "java")), + root.resolve(Path.of("src", "main", "resources")), + root.resolve(Path.of("src", "main", "java"))); } public OutputLayout custom( diff --git a/src/main/java/com/example/workutils/system/support/FileOperationHelper.java b/src/main/java/com/example/workutils/system/support/FileOperationHelper.java index 9757167..d07f487 100644 --- a/src/main/java/com/example/workutils/system/support/FileOperationHelper.java +++ b/src/main/java/com/example/workutils/system/support/FileOperationHelper.java @@ -71,7 +71,8 @@ public class FileOperationHelper { public String generateFileName(String baseDirectory, String prefix, String extension) { String timestamp = java.time.LocalDateTime.now() .format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")); - return String.format("%s/%s_%s.%s", baseDirectory, prefix, timestamp, extension); + String fileName = String.format("%s_%s.%s", prefix, timestamp, extension); + return Paths.get(baseDirectory).resolve(fileName).toString(); } public String generateFileName(String prefix, String extension) { diff --git a/src/test/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicyTest.java b/src/test/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicyTest.java index 6a5833f..83550ad 100644 --- a/src/test/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicyTest.java +++ b/src/test/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicyTest.java @@ -21,9 +21,9 @@ class OutputLayoutPolicyTest { Path root = tempDir.toAbsolutePath().normalize(); assertEquals(root, layout.projectRoot()); - assertEquals(root.resolve("src/main/java"), layout.modelDirectory()); - assertEquals(root.resolve("src/main/resources"), layout.xmlDirectory()); - assertEquals(root.resolve("src/main/java"), layout.mapperDirectory()); + assertEquals(root.resolve(Path.of("src", "main", "java")), layout.modelDirectory()); + assertEquals(root.resolve(Path.of("src", "main", "resources")), layout.xmlDirectory()); + assertEquals(root.resolve(Path.of("src", "main", "java")), layout.mapperDirectory()); } @Test diff --git a/src/test/java/com/example/workutils/system/support/FileOperationHelperPathTest.java b/src/test/java/com/example/workutils/system/support/FileOperationHelperPathTest.java new file mode 100644 index 0000000..0e9e2d1 --- /dev/null +++ b/src/test/java/com/example/workutils/system/support/FileOperationHelperPathTest.java @@ -0,0 +1,31 @@ +package com.example.workutils.system.support; + +import org.junit.jupiter.api.Test; + +import java.nio.file.Path; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class FileOperationHelperPathTest { + + @Test + void emptyBaseDirectoryProducesRelativeFileName() { + String generated = new FileOperationHelper().generateFileName("", "报告", "html"); + Path path = Path.of(generated); + + assertFalse(path.isAbsolute()); + assertNull(path.getRoot()); + assertTrue(path.getFileName().toString().matches("报告_\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2}\\.html")); + } + + @Test + void baseDirectoryWithSpacesAndChineseIsPreserved() { + Path base = Path.of("build", "输出 空间"); + Path generated = Path.of(new FileOperationHelper() + .generateFileName(base.toString(), "报告", "html")); + + assertTrue(generated.startsWith(base)); + } +}