From d3bbdbd7feccbcbc0d793413d0944e76cea0ec8a Mon Sep 17 00:00:00 2001 From: haljik Date: Tue, 24 Mar 2026 11:33:26 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix:=20jig-gradle-plugin=E3=82=92Gradle=209?= =?UTF-8?q?.4=E3=81=AEconfiguration=20cache=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JigReportsTaskの@TaskAction内でgetProject()を呼び出していたため、 configuration cache有効時にタスク実行時にProject参照できずエラーになっていた。 - JigReportsTaskをabstract化しGradle managed propertyを導入 - すべてのProject参照をJigGradlePlugin.apply()のconfiguration phaseに集約 - JigConfigからProject依存メソッドを除去 - GradleProjectに依存プロジェクト含む全パス取得メソッドを追加 - configuration cache対応のFunctionalTestを追加 Co-Authored-By: Claude Opus 4.6 (1M context) AGENT: Claude --- .../org/dddjava/jig/gradle/GradleProject.java | 27 +++- .../org/dddjava/jig/gradle/JigConfig.java | 39 +----- .../dddjava/jig/gradle/JigGradlePlugin.java | 37 +++++- .../dddjava/jig/gradle/JigReportsTask.java | 115 ++++++++++++++++-- .../java/jig/JigPluginFunctionalTest.java | 66 +++++++++- 5 files changed, 233 insertions(+), 51 deletions(-) diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/GradleProject.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/GradleProject.java index 3598798ad..5213789ab 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/GradleProject.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/GradleProject.java @@ -22,12 +22,13 @@ public class GradleProject { final Project project; public GradleProject(Project project) { - if (isNonJavaProject(project)) { - throw new IllegalStateException("Java プラグインが適用されていません。"); - } this.project = project; } + public static boolean isJavaProject(Project project) { + return findJavaPluginExtension(project).isPresent(); + } + public Set classPaths() { return sourceSets() .map(SourceSet::getOutput) @@ -72,6 +73,26 @@ public SourceBasePaths rawSourceLocations() { .orElseThrow(() -> new IllegalStateException("対象プロジェクトが見つかりません。")); } + /** + * 依存プロジェクトを含むすべてのクラスパスを返す + */ + public Set allClassPaths() { + return allDependencyProjectsFrom(project) + .map(GradleProject::new) + .flatMap(gp -> gp.classPaths().stream()) + .collect(toSet()); + } + + /** + * 依存プロジェクトを含むすべてのソースパスを返す + */ + public Set allSourcePaths() { + return allDependencyProjectsFrom(project) + .map(GradleProject::new) + .flatMap(gp -> gp.sourcePaths().stream()) + .collect(toSet()); + } + private Stream allDependencyProjectsFrom(Project currentProject) { if (isNonJavaProject(currentProject)) { return Stream.empty(); diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java index 12e9382d5..cb4a76b55 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java @@ -2,13 +2,8 @@ import org.dddjava.jig.domain.model.documents.documentformat.JigDiagramFormat; import org.dddjava.jig.domain.model.documents.documentformat.JigDocument; -import org.dddjava.jig.infrastructure.configuration.JigProperties; -import org.gradle.api.Project; -import java.nio.file.Path; import java.nio.file.Paths; -import java.time.Duration; -import java.util.Optional; import java.util.ArrayList; import java.util.List; import java.util.StringJoiner; @@ -50,38 +45,12 @@ List documentTypesToInclude() { .toList(); } - public JigProperties toJigProperties(Project project) { - return new JigProperties( - documentTypes(), - Optional.ofNullable(modelPattern).filter(s -> !s.isEmpty()), resolveOutputDirectory(project), - diagramFormat, - diagramTransitiveReduction, - parseDotTimeout() - ); + public List getDocumentTypesExclude() { + return documentTypesExclude; } - private Duration parseDotTimeout() { - if (dotTimeout.endsWith("ms")) { - return Duration.ofMillis(Long.parseLong(dotTimeout.substring(0, dotTimeout.length() - 2))); - } - if (dotTimeout.endsWith("s")) { - return Duration.ofSeconds(Long.parseLong(dotTimeout.substring(0, dotTimeout.length() - 1))); - } - throw new IllegalArgumentException("dotTimeout must be end with ms or s. " + dotTimeout + " is invalid."); - } - - private Path resolveOutputDirectory(Project project) { - if (this.outputDirectory.isEmpty()) { - return defaultOutputDirectory(project); - } - return Paths.get(this.outputDirectory); - } - - private Path defaultOutputDirectory(Project project) { - Path path = Paths.get(getOutputDirectory()); - if (path.isAbsolute()) return path; - var buildDirectory = project.getLayout().getBuildDirectory(); - return buildDirectory.getAsFile().get().toPath().resolve("jig"); + public void setDocumentTypesExclude(List documentTypesExclude) { + this.documentTypesExclude = documentTypesExclude; } public String getModelPattern() { diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java index 00febd8f3..716c5f923 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java @@ -5,17 +5,52 @@ import org.gradle.api.plugins.ExtensionContainer; import org.gradle.api.tasks.TaskContainer; +import java.nio.file.Path; +import java.util.List; + public class JigGradlePlugin implements Plugin { @Override public void apply(Project project) { ExtensionContainer extensions = project.getExtensions(); - extensions.create("jig", JigConfig.class); + JigConfig config = extensions.create("jig", JigConfig.class); TaskContainer tasks = project.getTasks(); tasks.register("jigReports", JigReportsTask.class).configure(task -> { task.setGroup("JIG"); task.setDescription("Generates JIG documentation for the main source code."); + + // JigConfig のプロパティをタスクプロパティにワイヤリング + task.getModelPattern().convention(project.provider(config::getModelPattern)); + task.getDocumentTypes().convention(project.provider(config::getDocumentTypes)); + task.getDocumentTypesExclude().convention(project.provider(config::getDocumentTypesExclude)); + task.getDiagramFormat().convention(project.provider(() -> config.getDiagramFormat().name())); + task.getDiagramTransitiveReduction().convention(project.provider(config::isDiagramTransitiveReduction)); + task.getDotTimeout().convention(project.provider(config::getDotTimeout)); + + // 出力ディレクトリ + task.getOutputDirectory().convention(project.provider(() -> { + String outputDir = config.getOutputDirectory(); + if (outputDir.isEmpty()) { + return project.getLayout().getBuildDirectory().dir("jig").get(); + } + return project.getLayout().getProjectDirectory().dir(outputDir); + })); + + // Java プラグインの適用状態 + task.getJavaPluginApplied().convention(project.provider(() -> GradleProject.isJavaProject(project))); + + // ソース/クラスパス(Provider で遅延解決、configuration phase 内で評価される) + task.getClassFiles().from(project.provider(() -> { + if (!GradleProject.isJavaProject(project)) return List.of(); + GradleProject gp = new GradleProject(project); + return gp.allClassPaths().stream().map(Path::toFile).toList(); + })); + task.getSourceFiles().from(project.provider(() -> { + if (!GradleProject.isJavaProject(project)) return List.of(); + GradleProject gp = new GradleProject(project); + return gp.allSourcePaths().stream().map(Path::toFile).toList(); + })); }); } } diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigReportsTask.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigReportsTask.java index 81270f217..0545a2a9f 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigReportsTask.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigReportsTask.java @@ -3,35 +3,106 @@ import org.dddjava.jig.HandleResult; import org.dddjava.jig.JigExecutor; import org.dddjava.jig.JigResult; +import org.dddjava.jig.domain.model.documents.documentformat.JigDiagramFormat; +import org.dddjava.jig.domain.model.documents.documentformat.JigDocument; +import org.dddjava.jig.domain.model.sources.filesystem.SourceBasePath; import org.dddjava.jig.domain.model.sources.filesystem.SourceBasePaths; import org.dddjava.jig.infrastructure.configuration.Configuration; +import org.dddjava.jig.infrastructure.configuration.JigProperties; import org.gradle.api.DefaultTask; -import org.gradle.api.Project; +import org.gradle.api.file.ConfigurableFileCollection; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.provider.ListProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; import org.gradle.work.DisableCachingByDefault; +import java.io.File; +import java.nio.file.Path; +import java.time.Duration; import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; import static java.util.stream.Collectors.joining; @DisableCachingByDefault(because = "JigReportsTask depends on JigExecutor and cannot define output") -public class JigReportsTask extends DefaultTask { +public abstract class JigReportsTask extends DefaultTask { + + @Input + public abstract Property getModelPattern(); + + @Input + public abstract ListProperty getDocumentTypes(); + + @Input + public abstract ListProperty getDocumentTypesExclude(); + + @Input + public abstract Property getDiagramFormat(); + + @Input + public abstract Property getDiagramTransitiveReduction(); + + @Input + public abstract Property getDotTimeout(); + + @InputFiles + @PathSensitive(PathSensitivity.RELATIVE) + public abstract ConfigurableFileCollection getClassFiles(); + + @InputFiles + @PathSensitive(PathSensitivity.RELATIVE) + public abstract ConfigurableFileCollection getSourceFiles(); + + @Internal + public abstract Property getJavaPluginApplied(); + + @OutputDirectory + public abstract DirectoryProperty getOutputDirectory(); @TaskAction void outputReports() { - Project project = getProject(); - JigConfig config = project.getExtensions().findByType(JigConfig.class); - if (config == null) { - getLogger().warn("jig-gradle-pluginの設定が取得できません。通常は起こらないはずで、疑われるのはプラグイン側の実装ミスです。続行できないため終了します。"); - return; + if (!getJavaPluginApplied().getOrElse(false)) { + throw new IllegalStateException("Java プラグインが適用されていません。"); } - Configuration configuration = Configuration.from(config.toJigProperties(getProject())); + List documentTypes = resolveDocumentTypes(); + Path outputDirectory = getOutputDirectory().getAsFile().get().toPath(); - getLogger().info("-- configuration -------------------------------------------\n{}\n------------------------------------------------------------", config.propertiesText()); + JigProperties jigProperties = new JigProperties( + documentTypes, + Optional.ofNullable(getModelPattern().getOrNull()).filter(s -> !s.isEmpty()), + outputDirectory, + JigDiagramFormat.valueOf(getDiagramFormat().get()), + getDiagramTransitiveReduction().get(), + parseDotTimeout(getDotTimeout().get()) + ); + + Configuration configuration = Configuration.from(jigProperties); + + getLogger().info("-- configuration -------------------------------------------\n{}\n------------------------------------------------------------", + jigProperties); long startTime = System.currentTimeMillis(); - SourceBasePaths sourceBasePaths = new GradleProject(project).rawSourceLocations(); + + Set classPaths = getClassFiles().getFiles().stream() + .map(File::toPath) + .collect(Collectors.toSet()); + Set sourcePaths = getSourceFiles().getFiles().stream() + .map(File::toPath) + .collect(Collectors.toSet()); + SourceBasePaths sourceBasePaths = new SourceBasePaths( + new SourceBasePath(classPaths), + new SourceBasePath(sourcePaths) + ); JigResult jigResult = JigExecutor.standard(configuration, sourceBasePaths); List handleResultList = jigResult.listResult(); @@ -48,4 +119,28 @@ void outputReports() { System.currentTimeMillis() - startTime, resultLog); } + private List resolveDocumentTypes() { + List toExclude = getDocumentTypesExclude().get().stream() + .map(JigDocument::valueOf) + .toList(); + + List includeTypes = getDocumentTypes().get(); + List toInclude = includeTypes.isEmpty() + ? JigDocument.canonical() + : includeTypes.stream().map(JigDocument::valueOf).toList(); + + return toInclude.stream() + .filter(each -> !toExclude.contains(each)) + .toList(); + } + + private Duration parseDotTimeout(String dotTimeout) { + if (dotTimeout.endsWith("ms")) { + return Duration.ofMillis(Long.parseLong(dotTimeout.substring(0, dotTimeout.length() - 2))); + } + if (dotTimeout.endsWith("s")) { + return Duration.ofSeconds(Long.parseLong(dotTimeout.substring(0, dotTimeout.length() - 1))); + } + throw new IllegalArgumentException("dotTimeout must be end with ms or s. " + dotTimeout + " is invalid."); + } } diff --git a/jig-gradle-plugin/src/test/java/jig/JigPluginFunctionalTest.java b/jig-gradle-plugin/src/test/java/jig/JigPluginFunctionalTest.java index 880897071..9c0999ee1 100644 --- a/jig-gradle-plugin/src/test/java/jig/JigPluginFunctionalTest.java +++ b/jig-gradle-plugin/src/test/java/jig/JigPluginFunctionalTest.java @@ -12,6 +12,8 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.stream.Stream; @@ -235,12 +237,72 @@ private void buildGradle(String buildScript) throws IOException { Files.writeString(testProjectDir.resolve("build.gradle"), buildScript); } - private GradleRunner runner(String version) throws IOException { + @ParameterizedTest + @MethodSource("supportGradleVersion") + void コンフィグレーションキャッシュが有効でも実行できる(String version) throws IOException { + settingsGradle(""" + rootProject.name = 'my-test' + """); + buildGradle(""" + plugins { + id 'java' + id 'org.dddjava.jig-gradle-plugin' + } + """); + + // 1回目: キャッシュ保存 + var result1 = runner(version, "--configuration-cache").build(); + var taskResult1 = Objects.requireNonNull(result1.task(":jigReports")); + assertEquals(TaskOutcome.SUCCESS, taskResult1.getOutcome()); + assertTrue(result1.getOutput().contains("[JIG] all JIG documents completed: "), result1.getOutput()); + + // 2回目: キャッシュ再利用(タスクはUP_TO_DATEになりうる) + var result2 = runner(version, "--configuration-cache").build(); + assertNotNull(result2.task(":jigReports")); + assertTrue(result2.getOutput().contains("Reusing configuration cache"), result2.getOutput()); + } + + @ParameterizedTest + @MethodSource("supportGradleVersion") + void コンフィグレーションキャッシュが有効でもマルチプロジェクトで実行できる(String version) throws IOException { + settingsGradle(""" + rootProject.name = 'my-test' + include 'a', 'b' + """); + buildGradle("a", """ + plugins { + id 'java' + id 'org.dddjava.jig-gradle-plugin' + } + dependencies { + implementation project(':b'); + } + """); + buildGradle("b", """ + plugins { + id 'java' + } + """); + + // 1回目: キャッシュ保存 + var result1 = runner(version, "--configuration-cache").build(); + var taskResult1 = Objects.requireNonNull(result1.task(":a:jigReports")); + assertEquals(TaskOutcome.SUCCESS, taskResult1.getOutcome()); + + // 2回目: キャッシュ再利用(タスクはUP_TO_DATEになりうる) + var result2 = runner(version, "--configuration-cache").build(); + assertNotNull(result2.task(":a:jigReports")); + assertTrue(result2.getOutput().contains("Reusing configuration cache"), result2.getOutput()); + } + + private GradleRunner runner(String version, String... additionalArgs) throws IOException { + List args = new ArrayList<>(List.of("jig", "--info")); + args.addAll(List.of(additionalArgs)); return GradleRunner.create() .withGradleVersion(version) .withProjectDir(testProjectDir.toFile()) - .withArguments("jig", "--info") + .withArguments(args) .withPluginClasspath(); } } From abb758e57dc435be90087267808cd385fe40991e Mon Sep 17 00:00:00 2001 From: haljik Date: Tue, 24 Mar 2026 11:42:23 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20GradleProject=E3=81=8B=E3=82=89?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E3=81=AErawSourceLocations=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) AGENT: Claude --- .../java/org/dddjava/jig/gradle/GradleProject.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/GradleProject.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/GradleProject.java index 5213789ab..9ba00eea5 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/GradleProject.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/GradleProject.java @@ -1,7 +1,5 @@ package org.dddjava.jig.gradle; -import org.dddjava.jig.domain.model.sources.filesystem.SourceBasePath; -import org.dddjava.jig.domain.model.sources.filesystem.SourceBasePaths; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.DependencySet; @@ -61,18 +59,6 @@ private Stream sourceSets() { .filter(sourceSet -> !sourceSet.getName().equals(SourceSet.TEST_SOURCE_SET_NAME))); } - public SourceBasePaths rawSourceLocations() { - return allDependencyProjectsFrom(project) - .map(GradleProject::new) - .map(gradleProject -> - new SourceBasePaths( - new SourceBasePath(gradleProject.classPaths()), - new SourceBasePath(gradleProject.sourcePaths()) - )) - .reduce(SourceBasePaths::merge) - .orElseThrow(() -> new IllegalStateException("対象プロジェクトが見つかりません。")); - } - /** * 依存プロジェクトを含むすべてのクラスパスを返す */ From 60fe04fefd2fc5b545c5a4158b40e468fd2e481e Mon Sep 17 00:00:00 2001 From: haljik Date: Tue, 24 Mar 2026 12:04:47 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20Gradle=208=E3=81=AEconfiguration=20c?= =?UTF-8?q?ache=E3=81=A7=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=B3?= =?UTF-8?q?=E3=83=AC=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE=E3=82=B7?= =?UTF-8?q?=E3=83=AA=E3=82=A2=E3=83=A9=E3=82=A4=E3=82=BA=E3=81=8C=E5=A4=B1?= =?UTF-8?q?=E6=95=97=E3=81=99=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ConfigurableFileCollection.from(Provider)のProviderがProjectをキャプチャしていたため、 Gradle 8.14.3のconfiguration cacheでデシリアライズ時にnull arrayエラーが発生していた。 Providerを使わずconfiguration phaseで直接ファイルパスを解決するように変更。 AGENT: Claude --- .../org/dddjava/jig/gradle/JigGradlePlugin.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java index 716c5f923..5db634a95 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java @@ -6,7 +6,6 @@ import org.gradle.api.tasks.TaskContainer; import java.nio.file.Path; -import java.util.List; public class JigGradlePlugin implements Plugin { @@ -40,17 +39,13 @@ public void apply(Project project) { // Java プラグインの適用状態 task.getJavaPluginApplied().convention(project.provider(() -> GradleProject.isJavaProject(project))); - // ソース/クラスパス(Provider で遅延解決、configuration phase 内で評価される) - task.getClassFiles().from(project.provider(() -> { - if (!GradleProject.isJavaProject(project)) return List.of(); + // ソース/クラスパス(configuration phase で解決し直接設定。 + // Provider でラップすると project をキャプチャしてしまい、Gradle 8 の configuration cache でシリアライズできないため。) + if (GradleProject.isJavaProject(project)) { GradleProject gp = new GradleProject(project); - return gp.allClassPaths().stream().map(Path::toFile).toList(); - })); - task.getSourceFiles().from(project.provider(() -> { - if (!GradleProject.isJavaProject(project)) return List.of(); - GradleProject gp = new GradleProject(project); - return gp.allSourcePaths().stream().map(Path::toFile).toList(); - })); + task.getClassFiles().from(gp.allClassPaths().stream().map(Path::toFile).toList()); + task.getSourceFiles().from(gp.allSourcePaths().stream().map(Path::toFile).toList()); + } }); } } From 19560327793d3b0c192f80018694ab0aac17c46c Mon Sep 17 00:00:00 2001 From: haljik Date: Tue, 24 Mar 2026 12:13:23 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20JigConfig=E3=81=AE=E3=83=87?= =?UTF-8?q?=E3=83=83=E3=83=89=E3=82=B3=E3=83=BC=E3=83=89=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E3=81=A8Provider=E3=81=8B=E3=82=89=E3=81=AEproject=E3=82=AD?= =?UTF-8?q?=E3=83=A3=E3=83=97=E3=83=81=E3=83=A3=E3=82=92=E9=99=A4=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JigConfigからロジック移動後に残っていたdocumentTypes(), documentTypesToExclude(), documentTypesToInclude(), propertiesText()を削除 - outputDirectoryとjavaPluginAppliedのProviderがprojectをキャプチャしていたのを configuration phaseで直接解決するように変更し、configuration cache安全性を向上 AGENT: Claude --- .../org/dddjava/jig/gradle/JigConfig.java | 34 ------------------- .../dddjava/jig/gradle/JigGradlePlugin.java | 21 ++++++------ 2 files changed, 10 insertions(+), 45 deletions(-) diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java index cb4a76b55..5d4eedaa3 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java @@ -1,12 +1,10 @@ package org.dddjava.jig.gradle; import org.dddjava.jig.domain.model.documents.documentformat.JigDiagramFormat; -import org.dddjava.jig.domain.model.documents.documentformat.JigDocument; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import java.util.StringJoiner; public class JigConfig { @@ -24,27 +22,6 @@ public class JigConfig { boolean diagramTransitiveReduction = true; - List documentTypes() { - List toExclude = documentTypesToExclude(); - return documentTypesToInclude().stream() - .filter(each -> !toExclude.contains(each)) - .toList(); - } - - List documentTypesToExclude() { - if (documentTypesExclude.isEmpty()) return List.of(); - return documentTypesExclude.stream() - .map(JigDocument::valueOf) - .toList(); - } - - List documentTypesToInclude() { - if (documentTypes.isEmpty()) return JigDocument.canonical(); - return documentTypes.stream() - .map(JigDocument::valueOf) - .toList(); - } - public List getDocumentTypesExclude() { return documentTypesExclude; } @@ -112,15 +89,4 @@ public void setOutputOmitPrefix(String outputOmitPrefix) { this.outputOmitPrefix = outputOmitPrefix; } - public String propertiesText() { - return new StringJoiner("\n\t", "jig {\n\t", "\n}") - .add("documentTypes = '" + documentTypes + '\'') - .add("modelPattern = '" + modelPattern + '\'') - .add("outputDirectory = '" + outputDirectory + '\'') - .add("diagramFormat= '" + diagramFormat + '\'') - .add("dotTimeout= '" + dotTimeout + '\'') - .add("diagramTransitiveReduction= '" + diagramTransitiveReduction + '\'') - .add("outputOmitPrefix = '" + outputOmitPrefix + '\'') - .toString(); - } } diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java index 5db634a95..db6099c03 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigGradlePlugin.java @@ -27,17 +27,16 @@ public void apply(Project project) { task.getDiagramTransitiveReduction().convention(project.provider(config::isDiagramTransitiveReduction)); task.getDotTimeout().convention(project.provider(config::getDotTimeout)); - // 出力ディレクトリ - task.getOutputDirectory().convention(project.provider(() -> { - String outputDir = config.getOutputDirectory(); - if (outputDir.isEmpty()) { - return project.getLayout().getBuildDirectory().dir("jig").get(); - } - return project.getLayout().getProjectDirectory().dir(outputDir); - })); - - // Java プラグインの適用状態 - task.getJavaPluginApplied().convention(project.provider(() -> GradleProject.isJavaProject(project))); + // 出力ディレクトリ(project をキャプチャしないよう configuration phase で解決) + String outputDir = config.getOutputDirectory(); + if (outputDir.isEmpty()) { + task.getOutputDirectory().convention(project.getLayout().getBuildDirectory().dir("jig")); + } else { + task.getOutputDirectory().set(project.getLayout().getProjectDirectory().dir(outputDir)); + } + + // Java プラグインの適用状態(configuration phase で解決) + task.getJavaPluginApplied().convention(GradleProject.isJavaProject(project)); // ソース/クラスパス(configuration phase で解決し直接設定。 // Provider でラップすると project をキャプチャしてしまい、Gradle 8 の configuration cache でシリアライズできないため。) From 44778bb7b8e967085fb038ea75c52c8ed98bb34d Mon Sep 17 00:00:00 2001 From: haljik Date: Tue, 24 Mar 2026 12:36:11 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C=EF=BC=88=E3=83=87?= =?UTF-8?q?=E3=83=83=E3=83=89=E3=82=B3=E3=83=BC=E3=83=89=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E3=83=BB=E3=82=A2=E3=83=8E=E3=83=86=E3=83=BC=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E7=90=86=E7=94=B1=E6=96=87=E4=BF=AE=E6=AD=A3=E3=83=BB?= =?UTF-8?q?import=E6=95=B4=E7=90=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JigConfigから未使用のoutputOmitPrefixフィールドとアクセサを削除 - @DisableCachingByDefaultの理由文を@OutputDirectoryの存在と矛盾しない表現に修正 - Collectors.toSet()をstatic importに統一 AGENT: Claude --- .../main/java/org/dddjava/jig/gradle/JigConfig.java | 10 ---------- .../java/org/dddjava/jig/gradle/JigReportsTask.java | 8 ++++---- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java index 5d4eedaa3..a010be03c 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigConfig.java @@ -15,8 +15,6 @@ public class JigConfig { String outputDirectory = ""; - String outputOmitPrefix = ".+\\.(service|domain\\.(model|type))\\."; - JigDiagramFormat diagramFormat = JigDiagramFormat.SVG; String dotTimeout = "10s"; @@ -81,12 +79,4 @@ public void setDiagramTransitiveReduction(boolean diagramTransitiveReduction) { this.diagramTransitiveReduction = diagramTransitiveReduction; } - public String getOutputOmitPrefix() { - return outputOmitPrefix; - } - - public void setOutputOmitPrefix(String outputOmitPrefix) { - this.outputOmitPrefix = outputOmitPrefix; - } - } diff --git a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigReportsTask.java b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigReportsTask.java index 0545a2a9f..a8944c851 100644 --- a/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigReportsTask.java +++ b/jig-gradle-plugin/src/main/java/org/dddjava/jig/gradle/JigReportsTask.java @@ -29,11 +29,11 @@ import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.toSet; -@DisableCachingByDefault(because = "JigReportsTask depends on JigExecutor and cannot define output") +@DisableCachingByDefault(because = "JigReportsTask generates files via JigExecutor whose outputs are not fully declarable") public abstract class JigReportsTask extends DefaultTask { @Input @@ -95,10 +95,10 @@ void outputReports() { Set classPaths = getClassFiles().getFiles().stream() .map(File::toPath) - .collect(Collectors.toSet()); + .collect(toSet()); Set sourcePaths = getSourceFiles().getFiles().stream() .map(File::toPath) - .collect(Collectors.toSet()); + .collect(toSet()); SourceBasePaths sourceBasePaths = new SourceBasePaths( new SourceBasePath(classPaths), new SourceBasePath(sourcePaths)