Skip to content

Commit 83f15bf

Browse files
tlinkowskipaulbakker
authored andcommitted
#72: initial refactorings/improvements
necessary for further commits MAIN: 1) renamed TestModuleOptions.isRunOnClasspath() to getRunOnClasspath() (otherwise won't work with Kotlin DSL) + added a Kotlin DSL example for "runOnClasspath = true" to README.md 2) introduced JavaProjectHelper and applied it to CompileTask 3) added comments for all anonymous classes that should not be removed 4) minor improvements in ModuleSystemPlugin 5) minor fixes in test-project-kotlin/README.md TEST: 1) bumped smoke-test Gradle version to 5.0 (for improved Kotlin DSL) 2) introduced a no-op "moduleOptions" access in greeter.api (for testing DSL) 3) introduced SmokeTestHelper for ModulePluginSmokeTest 4) disabled stackTraceFilters in all tests 5) updated Kotlin to 1.3.20
1 parent ca86e2d commit 83f15bf

21 files changed

+298
-175
lines changed

README.md

+21-2
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,10 @@ See `src/test/java/module-info.test` and `src/test/java/greeter/ScriptingTest.ja
265265
Fall-back to classpath mode
266266
----
267267

268-
If for whatever reason this is unwanted or introduces problems, you can enable classpath mode, which essentially turns of the plugin while running tests.
268+
If for whatever reason this is unwanted or introduces problems, you can enable classpath mode, which essentially turns off the plugin while running tests.
269+
270+
<details open>
271+
<summary>Groovy DSL</summary>
269272

270273
```groovy
271274
test {
@@ -275,6 +278,22 @@ test {
275278
}
276279
```
277280

281+
</details>
282+
<details>
283+
<summary>Kotlin DSL</summary>
284+
285+
```kotlin
286+
tasks {
287+
test {
288+
extensions.configure(TestModuleOptions::class) {
289+
runOnClasspath = true
290+
}
291+
}
292+
}
293+
```
294+
295+
</details>
296+
278297
Blackbox testing
279298
===
280299

@@ -286,7 +305,7 @@ This module `requires` and/or `uses` the module under test, and tests it's exter
286305
In the following example we test a module `greeter.provider`, which provides a service implementation of type `Greeter`.
287306
The `Greeter` type is provided by yet another module `greeter.api`.
288307

289-
The test module would typically be named something similar to the the module it's testing, e.g. `greeter.provider.test`.
308+
The test module would typically be named something similar to the module it's testing, e.g. `greeter.provider.test`.
290309
In `src/main/java` it has some code that looks like code that you would normally write to use the module that's being tested.
291310
For example, we do a service lookup.
292311

build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ test {
5858

5959
testLogging {
6060
events 'PASSED', 'FAILED', 'SKIPPED'
61+
stackTraceFilters = []
6162
}
6263
}
6364

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.javamodularity.moduleplugin;
2+
3+
import org.gradle.api.Project;
4+
import org.gradle.api.Task;
5+
import org.gradle.api.plugins.JavaPlugin;
6+
import org.gradle.api.tasks.SourceSet;
7+
import org.gradle.api.tasks.SourceSetContainer;
8+
import org.gradle.api.tasks.compile.JavaCompile;
9+
10+
import java.util.Optional;
11+
12+
/**
13+
* Generic helper for Gradle {@link Project} API that has {@link JavaPlugin} applied.
14+
*/
15+
public final class JavaProjectHelper {
16+
17+
private final Project project;
18+
19+
public JavaProjectHelper(Project project) {
20+
this.project = project;
21+
}
22+
23+
public Project project() {
24+
return project;
25+
}
26+
27+
//region SOURCE SETS
28+
public SourceSetContainer sourceSets() {
29+
return project.getExtensions().getByType(SourceSetContainer.class);
30+
}
31+
32+
public SourceSet sourceSet(String sourceSetName) {
33+
return sourceSets().getByName(sourceSetName);
34+
}
35+
36+
public SourceSet mainSourceSet() {
37+
return sourceSet(SourceSet.MAIN_SOURCE_SET_NAME);
38+
}
39+
40+
public SourceSet testSourceSet(String sourceSetName) {
41+
return sourceSet(SourceSet.TEST_SOURCE_SET_NAME);
42+
}
43+
//endregion
44+
45+
//region TASKS
46+
public Task task(String taskName) {
47+
return project.getTasks().getByName(taskName);
48+
}
49+
50+
public JavaCompile compileJavaTask(String taskName) {
51+
return (JavaCompile) task(taskName);
52+
}
53+
54+
public Optional<Task> findTask(String taskName) {
55+
return Optional.ofNullable(project.getTasks().findByName(taskName));
56+
}
57+
58+
public Optional<JavaCompile> findCompileJavaTask(String taskName) {
59+
return findTask(taskName).map(JavaCompile.class::cast);
60+
}
61+
//endregion
62+
63+
}

src/main/java/org/javamodularity/moduleplugin/ModuleSystemPlugin.java

+15-14
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,29 @@
22

33
import org.gradle.api.Plugin;
44
import org.gradle.api.Project;
5+
import org.gradle.api.plugins.ExtensionContainer;
56
import org.gradle.api.plugins.JavaPlugin;
67
import org.javamodularity.moduleplugin.tasks.*;
78

8-
import java.util.Optional;
9-
109
public class ModuleSystemPlugin implements Plugin<Project> {
1110

1211
@Override
1312
public void apply(Project project) {
1413
project.getPlugins().apply(JavaPlugin.class);
15-
Optional<String> foundModuleName = new ModuleName().findModuleName(project);
16-
foundModuleName.ifPresent(moduleName -> {
17-
project.getExtensions().add("moduleName", moduleName);
18-
project.getExtensions().create("patchModules", PatchModuleExtension.class);
14+
new ModuleName().findModuleName(project).ifPresent(moduleName -> configureModularity(project, moduleName));
15+
}
16+
17+
private void configureModularity(Project project, String moduleName) {
18+
ExtensionContainer extensions = project.getExtensions();
19+
extensions.add("moduleName", moduleName);
20+
extensions.create("patchModules", PatchModuleExtension.class);
1921

20-
new CompileTask().configureCompileJava(project);
21-
new CompileTestTask().configureCompileTestJava(project, moduleName);
22-
new TestTask().configureTestJava(project, moduleName);
23-
new RunTask().configureRun(project, moduleName);
24-
new JavadocTask().configureJavaDoc(project);
25-
ModularJavaExec.configure(project, moduleName);
26-
ModularCreateStartScripts.configure(project, moduleName);
27-
});
22+
new CompileTask(project).configureCompileJava();
23+
new CompileTestTask().configureCompileTestJava(project, moduleName);
24+
new TestTask().configureTestJava(project, moduleName);
25+
new RunTask().configureRun(project, moduleName);
26+
new JavadocTask().configureJavaDoc(project);
27+
ModularJavaExec.configure(project, moduleName);
28+
ModularCreateStartScripts.configure(project, moduleName);
2829
}
2930
}

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
class CompileJavaTaskMutator {
1111

12+
private static final String COMPILE_KOTLIN_TASK_NAME = "compileKotlin";
13+
1214
static void mutateJavaCompileTask(Project project, JavaCompile compileJava) {
1315
ModuleOptions moduleOptions = compileJava.getExtensions().getByType(ModuleOptions.class);
1416
PatchModuleExtension patchModuleExtension = project.getExtensions().getByType(PatchModuleExtension.class);
@@ -26,7 +28,8 @@ static void mutateJavaCompileTask(Project project, JavaCompile compileJava) {
2628
compileJava.getOptions().setCompilerArgs(compilerArgs);
2729
compileJava.setClasspath(project.files());
2830

29-
AbstractCompile compileKotlin = (AbstractCompile) project.getTasks().findByName("compileKotlin");
31+
// https://github.com/java9-modularity/gradle-modules-plugin/issues/45
32+
AbstractCompile compileKotlin = (AbstractCompile) project.getTasks().findByName(COMPILE_KOTLIN_TASK_NAME);
3033
if (compileKotlin != null) {
3134
compileJava.setDestinationDir(compileKotlin.getDestinationDir());
3235
}

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

+22-14
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,34 @@
55
import org.gradle.api.Task;
66
import org.gradle.api.plugins.JavaPlugin;
77
import org.gradle.api.tasks.compile.JavaCompile;
8+
import org.javamodularity.moduleplugin.JavaProjectHelper;
89

910
public class CompileTask {
1011

11-
public void configureCompileJava(Project project) {
12-
JavaCompile compileJava = (JavaCompile) project.getTasks().findByName(JavaPlugin.COMPILE_JAVA_TASK_NAME);
13-
if (compileJava != null) {
14-
compileJava.getExtensions().create("moduleOptions", ModuleOptions.class, project);
12+
private final Project project;
1513

16-
compileJava.doFirst(new Action<Task>() {
14+
public CompileTask(Project project) {
15+
this.project = project;
16+
}
17+
18+
public void configureCompileJava() {
19+
helper().findCompileJavaTask(JavaPlugin.COMPILE_JAVA_TASK_NAME)
20+
.ifPresent(this::configureCompileJava);
21+
}
1722

18-
/* (non-Javadoc)
19-
* @see org.gradle.api.Action#execute(java.lang.Object)
20-
*/
21-
@Override
22-
public void execute(Task task) {
23-
CompileJavaTaskMutator.mutateJavaCompileTask(project, compileJava);
24-
}
23+
private void configureCompileJava(JavaCompile compileJava) {
24+
compileJava.getExtensions().create("moduleOptions", ModuleOptions.class, project);
2525

26-
});
27-
}
26+
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
27+
compileJava.doFirst(new Action<Task>() {
28+
@Override
29+
public void execute(Task task) {
30+
CompileJavaTaskMutator.mutateJavaCompileTask(project, compileJava);
31+
}
32+
});
2833
}
2934

35+
private JavaProjectHelper helper() {
36+
return new JavaProjectHelper(project);
37+
}
3038
}

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

+8-21
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package org.javamodularity.moduleplugin.tasks;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
5-
import java.util.function.Consumer;
6-
73
import org.gradle.api.Action;
84
import org.gradle.api.Project;
95
import org.gradle.api.Task;
@@ -13,6 +9,9 @@
139
import org.gradle.api.tasks.compile.JavaCompile;
1410
import org.javamodularity.moduleplugin.TestEngine;
1511

12+
import java.util.ArrayList;
13+
import java.util.List;
14+
1615
public class CompileTestTask {
1716

1817
public void configureCompileTestJava(Project project, String moduleName) {
@@ -23,11 +22,8 @@ public void configureCompileTestJava(Project project, String moduleName) {
2322
compileTestJava.getExtensions().create("moduleOptions", ModuleOptions.class, project);
2423
SourceSet testSourceSet = javaConvention.getSourceSets().getByName(SourceSet.TEST_SOURCE_SET_NAME);
2524

25+
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
2626
compileTestJava.doFirst(new Action<Task>() {
27-
28-
/* (non-Javadoc)
29-
* @see org.gradle.api.Action#execute(java.lang.Object)
30-
*/
3127
@Override
3228
public void execute(Task task) {
3329
var args = new ArrayList<>(compileTestJava.getOptions().getCompilerArgs());
@@ -38,19 +34,10 @@ public void execute(Task task) {
3834
"--patch-module", moduleName + "=" + testSourceSet.getJava().getSourceDirectories().getAsPath()
3935
));
4036

41-
TestEngine.select(project).ifPresent(new Consumer<TestEngine>() {
42-
43-
/* (non-Javadoc)
44-
* @see java.util.function.Consumer#accept(java.lang.Object)
45-
*/
46-
@Override
47-
public void accept(TestEngine testEngine) {
48-
args.addAll(List.of(
49-
"--add-modules", testEngine.moduleName,
50-
"--add-reads", moduleName + "=" + testEngine.moduleName));
51-
}
52-
53-
});
37+
TestEngine.select(project).ifPresent(testEngine -> args.addAll(List.of(
38+
"--add-modules", testEngine.moduleName,
39+
"--add-reads", moduleName + "=" + testEngine.moduleName
40+
)));
5441

5542
ModuleOptions moduleOptions = compileTestJava.getExtensions().getByType(ModuleOptions.class);
5643
moduleOptions.mutateArgs(moduleName, args);

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

+1-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.gradle.api.Project;
55
import org.gradle.api.Task;
66
import org.gradle.api.plugins.JavaPlugin;
7-
import org.gradle.api.tasks.compile.JavaCompile;
87
import org.gradle.api.tasks.javadoc.Javadoc;
98
import org.gradle.external.javadoc.CoreJavadocOptions;
109

@@ -16,11 +15,8 @@ public void configureJavaDoc(Project project) {
1615
javadoc.getExtensions().create("moduleOptions", ModuleOptions.class, project);
1716
PatchModuleExtension patchModuleExtension = project.getExtensions().getByType(PatchModuleExtension.class);
1817

18+
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
1919
javadoc.doFirst(new Action<Task>() {
20-
21-
/* (non-Javadoc)
22-
* @see org.gradle.api.Action#execute(java.lang.Object)
23-
*/
2420
@Override
2521
public void execute(Task task) {
2622
ModuleOptions moduleOptions = javadoc.getExtensions().getByType(ModuleOptions.class);

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

+10-12
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
import org.gradle.api.Task;
77
import org.gradle.api.distribution.Distribution;
88
import org.gradle.api.distribution.DistributionContainer;
9-
import org.gradle.api.file.CopySpec;
10-
import org.gradle.api.file.FileCollection;
9+
import org.gradle.api.file.RelativePath;
1110
import org.gradle.api.logging.Logger;
1211
import org.gradle.api.logging.Logging;
1312
import org.gradle.api.plugins.JavaPluginConvention;
@@ -21,7 +20,6 @@
2120
import java.nio.file.Files;
2221
import java.nio.file.Path;
2322
import java.util.ArrayList;
24-
import java.util.Collections;
2523
import java.util.List;
2624

2725
public class RunTaskMutator {
@@ -54,6 +52,7 @@ public void updateStartScriptsTask(String taskStartScriptsName) {
5452
public void updateStartScriptsTask(CreateStartScripts startScriptsTask) {
5553
PatchModuleExtension patchModuleExtension = project.getExtensions().getByType(PatchModuleExtension.class);
5654

55+
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
5756
startScriptsTask.doFirst(new Action<Task>() {
5857
@Override
5958
public void execute(final Task task) {
@@ -86,6 +85,7 @@ public void execute(final Task task) {
8685
}
8786
});
8887

88+
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
8989
startScriptsTask.doLast(new Action<Task>() {
9090
@Override
9191
public void execute(final Task task) {
@@ -100,20 +100,18 @@ public void execute(final Task task) {
100100
public void movePatchedLibs() {
101101
PatchModuleExtension patchModuleExtension = project.getExtensions().getByType(PatchModuleExtension.class);
102102

103-
if(!patchModuleExtension.getConfig().isEmpty()) {
103+
if (!patchModuleExtension.getConfig().isEmpty()) {
104104
Distribution distribution = ((DistributionContainer) project.getExtensions().getByName("distributions")).getByName("main");
105-
distribution.contents(new Action<CopySpec>() {
106-
@Override
107-
public void execute(CopySpec copySpec) {
108-
copySpec.filesMatching(patchModuleExtension.getJars(), (action) -> {
109-
action.setRelativePath(action.getRelativePath().getParent().getParent().append(true, "patchlibs", action.getName()));
110-
});
111-
}
112-
});
105+
distribution.contents(copySpec -> copySpec.filesMatching(patchModuleExtension.getJars(), action -> {
106+
RelativePath relativePath = action.getRelativePath().getParent().getParent()
107+
.append(true, "patchlibs", action.getName());
108+
action.setRelativePath(relativePath);
109+
}));
113110
}
114111
}
115112

116113
private void updateJavaExecTask() {
114+
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
117115
execTask.doFirst(new Action<Task>() {
118116
@Override
119117
public void execute(final Task task) {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public TestModuleOptions(Project project) {
1010
super(project);
1111
}
1212

13-
public boolean isRunOnClasspath() {
13+
public boolean getRunOnClasspath() {
1414
return runOnClasspath;
1515
}
1616

0 commit comments

Comments
 (0)