Skip to content

Commit 4014f02

Browse files
tlinkowskipaulbakker
authored andcommitted
#89: introduced TaskOption class for easier configuration of all task arguments (including JavadocTask)
1 parent 8d84487 commit 4014f02

File tree

12 files changed

+219
-123
lines changed

12 files changed

+219
-123
lines changed

src/main/java/org/javamodularity/moduleplugin/internal/PatchModuleResolver.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.gradle.api.logging.Logging;
55
import org.javamodularity.moduleplugin.tasks.PatchModuleExtension;
66

7+
import java.util.List;
78
import java.util.Objects;
89
import java.util.function.UnaryOperator;
910
import java.util.stream.Stream;
@@ -23,15 +24,16 @@ public PatchModuleResolver(PatchModuleExtension patchModuleExtension, UnaryOpera
2324
this.jarNameResolver = jarNameResolver;
2425
}
2526

26-
public Stream<String> toArgumentStream() {
27-
return toValueStream().flatMap(value -> Stream.of("--patch-module", value));
27+
public void mutateArgs(List<String> args) {
28+
buildOptionStream().forEach(option -> option.mutateArgs(args));
2829
}
2930

30-
public Stream<String> toValueStream() {
31+
public Stream<TaskOption> buildOptionStream() {
3132
return patchModuleExtension.getConfig().stream()
3233
.map(patch -> patch.split("="))
3334
.map(this::resolvePatchModuleValue)
34-
.filter(Objects::nonNull);
35+
.filter(Objects::nonNull)
36+
.map(value -> new TaskOption("--patch-module", value));
3537
}
3638

3739
private String resolvePatchModuleValue(String[] parts) {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.javamodularity.moduleplugin.internal;
2+
3+
import java.util.Arrays;
4+
import java.util.stream.Stream;
5+
6+
public final class StreamHelper {
7+
8+
@SafeVarargs
9+
public static <T> Stream<T> concat(Stream<T>... streams) {
10+
return Arrays.stream(streams).reduce(Stream::concat).orElseThrow(IllegalArgumentException::new);
11+
}
12+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package org.javamodularity.moduleplugin.internal;
2+
3+
import org.gradle.external.javadoc.CoreJavadocOptions;
4+
5+
import java.util.List;
6+
7+
/**
8+
* Stores a flag and its value that can be used as: compiler args, JVM args, and Javadoc options.
9+
*/
10+
public final class TaskOption {
11+
12+
/**
13+
* E.g. {@code --add-modules}.
14+
*/
15+
private final String flag;
16+
/**
17+
* E.g. {@code java.sql,my.module}.
18+
*/
19+
private final String value;
20+
21+
public TaskOption(String flag, String value) {
22+
this.flag = flag;
23+
this.value = value;
24+
this.validate();
25+
}
26+
27+
private void validate() {
28+
if (!flag.startsWith("--")) {
29+
throw new IllegalArgumentException("Invalid flag: " + flag);
30+
}
31+
if (value.isBlank() || value.contains(" ")) {
32+
throw new IllegalArgumentException("Invalid value: " + value);
33+
}
34+
}
35+
36+
public String getFlag() {
37+
return flag;
38+
}
39+
40+
public String getValue() {
41+
return value;
42+
}
43+
44+
/**
45+
* Javadoc takes options without the initial hyphen.
46+
*
47+
* @return the Javadoc flag
48+
* @see org.gradle.external.javadoc.internal.JavadocOptionFileWriterContext#writeOptionHeader(String)
49+
*/
50+
public String getJavadocFlag() {
51+
return flag.substring(1);
52+
}
53+
54+
//region MUTATE
55+
public void mutateArgs(List<String> args) {
56+
args.add(flag);
57+
args.add(value);
58+
}
59+
60+
public void mutateOptions(CoreJavadocOptions options) {
61+
options.addStringOption(getJavadocFlag(), value);
62+
}
63+
//endregion
64+
}

src/main/java/org/javamodularity/moduleplugin/tasks/CompileJavaTaskMutator.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import java.util.ArrayList;
1111
import java.util.List;
12-
import java.util.stream.Stream;
1312

1413
class CompileJavaTaskMutator {
1514

@@ -50,16 +49,13 @@ void modularizeJavaCompileTask(JavaCompile javaCompile) {
5049
private List<String> buildCompilerArgs(JavaCompile javaCompile) {
5150
var compilerArgs = new ArrayList<>(javaCompile.getOptions().getCompilerArgs());
5251

53-
String moduleName = helper().moduleName();
5452
var patchModuleExtension = helper().extension(PatchModuleExtension.class);
5553

56-
Stream.of("--module-path", patchModuleExtension.getUnpatchedClasspathAsPath(compileJavaClasspath))
57-
.forEach(compilerArgs::add);
54+
patchModuleExtension.buildModulePathOption(compileJavaClasspath)
55+
.ifPresent(option -> option.mutateArgs(compilerArgs));
56+
patchModuleExtension.resolvePatched(compileJavaClasspath).mutateArgs(compilerArgs);
5857

59-
moduleOptions.mutateArgs(moduleName, compilerArgs);
60-
61-
patchModuleExtension.resolve(compileJavaClasspath).toArgumentStream()
62-
.forEach(compilerArgs::add);
58+
moduleOptions.mutateArgs(compilerArgs);
6359

6460
return compilerArgs;
6561
}

src/main/java/org/javamodularity/moduleplugin/tasks/CompileTestTask.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
import org.gradle.api.Action;
44
import org.gradle.api.Project;
55
import org.gradle.api.Task;
6+
import org.gradle.api.file.FileCollection;
67
import org.gradle.api.plugins.JavaPlugin;
78
import org.gradle.api.tasks.compile.JavaCompile;
89
import org.javamodularity.moduleplugin.TestEngine;
10+
import org.javamodularity.moduleplugin.internal.TaskOption;
911

1012
import java.util.ArrayList;
1113
import java.util.List;
12-
import java.util.stream.Stream;
1314

1415
public class CompileTestTask extends AbstractModulePluginTask {
1516

@@ -41,23 +42,23 @@ private List<String> buildCompilerArgs(JavaCompile compileTestJava, ModuleOption
4142

4243
String moduleName = helper().moduleName();
4344
var patchModuleExtension = helper().extension(PatchModuleExtension.class);
45+
FileCollection classpath = compileTestJava.getClasspath();
4446

45-
Stream.of(
46-
"--module-path",
47-
patchModuleExtension.getUnpatchedClasspathAsPath(compileTestJava.getClasspath()),
47+
patchModuleExtension.buildModulePathOption(classpath).ifPresent(option -> option.mutateArgs(compilerArgs));
48+
49+
new TaskOption(
4850
"--patch-module",
4951
moduleName + "=" + helper().testSourceSet().getJava().getSourceDirectories().getAsPath()
50-
).forEach(compilerArgs::add);
52+
).mutateArgs(compilerArgs);
5153

52-
TestEngine.select(project).ifPresent(testEngine -> Stream.of(
53-
"--add-modules", testEngine.moduleName,
54-
"--add-reads", moduleName + "=" + testEngine.moduleName
55-
).forEach(compilerArgs::add));
54+
TestEngine.select(project).ifPresent(testEngine -> {
55+
new TaskOption("--add-modules", testEngine.moduleName).mutateArgs(compilerArgs);
56+
new TaskOption("--add-reads", moduleName + "=" + testEngine.moduleName).mutateArgs(compilerArgs);
57+
});
5658

57-
moduleOptions.mutateArgs(moduleName, compilerArgs);
59+
moduleOptions.mutateArgs(compilerArgs);
5860

59-
patchModuleExtension.resolve(compileTestJava.getClasspath()).toArgumentStream()
60-
.forEach(compilerArgs::add);
61+
patchModuleExtension.resolvePatched(classpath).mutateArgs(compilerArgs);
6162

6263
ModuleInfoTestHelper.mutateArgs(project, compilerArgs::add);
6364

src/main/java/org/javamodularity/moduleplugin/tasks/JavadocTask.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import org.gradle.api.Action;
44
import org.gradle.api.Project;
55
import org.gradle.api.Task;
6+
import org.gradle.api.file.FileCollection;
67
import org.gradle.api.plugins.JavaPlugin;
78
import org.gradle.api.tasks.javadoc.Javadoc;
89
import org.gradle.external.javadoc.CoreJavadocOptions;
10+
import org.javamodularity.moduleplugin.internal.StreamHelper;
911

1012
public class JavadocTask extends AbstractModulePluginTask {
1113

@@ -34,16 +36,13 @@ public void execute(Task task) {
3436
private void addJavadocOptions(Javadoc javadoc, ModuleOptions moduleOptions) {
3537
var options = (CoreJavadocOptions) javadoc.getOptions();
3638
var patchModuleExtension = helper().extension(PatchModuleExtension.class);
39+
FileCollection classpath = javadoc.getClasspath();
3740

38-
String modulePath = patchModuleExtension.getUnpatchedClasspathAsPath(javadoc.getClasspath());
39-
options.addStringOption("-module-path", modulePath);
40-
41-
if (!moduleOptions.getAddModules().isEmpty()) {
42-
String addModules = String.join(",", moduleOptions.getAddModules());
43-
options.addStringOption("-add-modules", addModules);
44-
}
45-
46-
patchModuleExtension.resolve(javadoc.getClasspath()).toValueStream()
47-
.forEach(value -> options.addStringOption("-patch-module", value));
41+
StreamHelper.concat(
42+
patchModuleExtension.buildModulePathOption(classpath).stream(),
43+
patchModuleExtension.resolvePatched(classpath).buildOptionStream(),
44+
moduleOptions.buildFullOptionStream()
45+
).forEach(option -> option.mutateOptions(options));
4846
}
47+
4948
}

src/main/java/org/javamodularity/moduleplugin/tasks/ModuleOptions.java

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,25 @@
33
import org.gradle.api.Project;
44
import org.gradle.api.logging.Logger;
55
import org.gradle.api.logging.Logging;
6+
import org.javamodularity.moduleplugin.JavaProjectHelper;
7+
import org.javamodularity.moduleplugin.internal.TaskOption;
8+
import org.javamodularity.moduleplugin.internal.StreamHelper;
69

7-
import java.util.ArrayList;
8-
import java.util.LinkedHashMap;
9-
import java.util.List;
10-
import java.util.Map;
10+
import java.util.*;
11+
import java.util.stream.Stream;
1112

1213
public class ModuleOptions {
1314
private static final Logger LOGGER = Logging.getLogger(ModuleOptions.class);
1415

16+
private final Project project;
17+
1518
private List<String> addModules = new ArrayList<>();
1619
private Map<String, String> addReads = new LinkedHashMap<>();
1720
private Map<String, String> addExports = new LinkedHashMap<>();
1821
private Map<String, String> addOpens = new LinkedHashMap<>();
1922

2023
public ModuleOptions(Project project) {
24+
this.project = project;
2125
}
2226

2327
public List<String> getAddModules() {
@@ -52,30 +56,52 @@ public void setAddOpens(Map<String, String> addOpens) {
5256
this.addOpens = addOpens;
5357
}
5458

55-
protected void mutateArgs(String moduleName, List<String> args) {
56-
if (!getAddModules().isEmpty()) {
57-
String addModules = String.join(",", getAddModules());
58-
args.add("--add-modules");
59-
args.add(addModules);
60-
LOGGER.debug("Adding modules '{}' to patch module {}...", addModules, moduleName);
59+
//region MODULE TASK OPTION
60+
public void mutateArgs(List<String> args) {
61+
buildFullOptionStream().forEach(o -> o.mutateArgs(args));
62+
}
63+
64+
public Stream<TaskOption> buildFullOptionStream() {
65+
LOGGER.debug("Updating module '{}' with...", helper().moduleName());
66+
return StreamHelper.concat(
67+
addModulesOption().stream(),
68+
addReadsOptionStream(),
69+
addExportsOptionStream(),
70+
addOpensOptionStream()
71+
).peek(option -> LOGGER.debug(" {} {}", option.getFlag(), option.getValue()));
72+
}
73+
74+
private Optional<TaskOption> addModulesOption() {
75+
if (addModules.isEmpty()) {
76+
return Optional.empty();
6177
}
78+
return Optional.of(new TaskOption("--add-modules", String.join(",", addModules)));
79+
}
80+
81+
private Stream<TaskOption> addReadsOptionStream() {
82+
return buildOptionStream("--add-reads", addReads);
83+
}
6284

63-
mutateArgs(moduleName, args, getAddReads(), "--add-reads");
64-
mutateArgs(moduleName, args, getAddExports(), "--add-exports");
65-
mutateArgs(moduleName, args, getAddOpens(), "--add-opens");
66-
}
67-
68-
private void mutateArgs(String moduleName, List<String> args, Map<String, String> src, String flag) {
69-
if (!src.isEmpty()) {
70-
LOGGER.debug("Updating module '{}' with...", moduleName);
71-
src.entrySet().stream()
72-
.map(e -> e.getKey() + "=" + e.getValue())
73-
.forEach(e -> {
74-
LOGGER.debug(" {}", flag);
75-
LOGGER.debug(" {}", e);
76-
args.add(flag);
77-
args.add(e);
78-
});
85+
private Stream<TaskOption> addExportsOptionStream() {
86+
return buildOptionStream("--add-exports", addExports);
87+
}
88+
89+
private Stream<TaskOption> addOpensOptionStream() {
90+
return buildOptionStream("--add-opens", addOpens);
91+
}
92+
93+
private Stream<TaskOption> buildOptionStream(String flag, Map<String, String> map) {
94+
if (map.isEmpty()) {
95+
return Stream.empty();
7996
}
97+
98+
return map.entrySet().stream()
99+
.map(entry -> entry.getKey() + "=" + entry.getValue())
100+
.map(value -> new TaskOption(flag, value));
101+
}
102+
//endregion
103+
104+
private JavaProjectHelper helper() {
105+
return new JavaProjectHelper(project);
80106
}
81107
}

src/main/java/org/javamodularity/moduleplugin/tasks/PatchModuleExtension.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.javamodularity.moduleplugin.tasks;
22

33
import org.gradle.api.file.FileCollection;
4+
import org.javamodularity.moduleplugin.internal.TaskOption;
45
import org.javamodularity.moduleplugin.internal.PatchModuleResolver;
56

67
import java.io.File;
@@ -21,11 +22,11 @@ public void setConfig(List<String> config) {
2122
indexByJar = config.stream().map(s -> s.split("=")).collect(Collectors.toMap(c -> c[1], c -> c[0]));
2223
}
2324

24-
public PatchModuleResolver resolve(FileCollection classpath) {
25-
return resolve(jarName -> classpath.filter(jar -> jar.getName().endsWith(jarName)).getAsPath());
25+
public PatchModuleResolver resolvePatched(FileCollection classpath) {
26+
return resolvePatched(jarName -> classpath.filter(jar -> jar.getName().endsWith(jarName)).getAsPath());
2627
}
2728

28-
public PatchModuleResolver resolve(UnaryOperator<String> jarNameResolver) {
29+
public PatchModuleResolver resolvePatched(UnaryOperator<String> jarNameResolver) {
2930
return new PatchModuleResolver(this, jarNameResolver);
3031
}
3132

@@ -37,8 +38,12 @@ public boolean isUnpatched(File jar) {
3738
return !indexByJar.containsKey(jar.getName());
3839
}
3940

40-
public String getUnpatchedClasspathAsPath(FileCollection classpath) {
41-
return classpath.filter(this::isUnpatched).getAsPath();
41+
public Optional<TaskOption> buildModulePathOption(FileCollection classpath) {
42+
String modulePath = classpath.filter(this::isUnpatched).getAsPath();
43+
if (modulePath.isEmpty()) {
44+
return Optional.empty();
45+
}
46+
return Optional.of(new TaskOption("--module-path", modulePath));
4247
}
4348

4449
@Override

0 commit comments

Comments
 (0)