Skip to content

Commit 8d84487

Browse files
tlinkowskipaulbakker
authored andcommitted
#79: extracted StartScriptsMutator from RunTaskMutator
1 parent d0e2a6d commit 8d84487

File tree

5 files changed

+181
-145
lines changed

5 files changed

+181
-145
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.javamodularity.moduleplugin.tasks;
2+
3+
import org.gradle.api.Project;
4+
import org.gradle.api.logging.Logger;
5+
import org.gradle.api.logging.Logging;
6+
import org.gradle.api.tasks.JavaExec;
7+
import org.javamodularity.moduleplugin.JavaProjectHelper;
8+
9+
import java.util.Objects;
10+
11+
abstract class AbstractExecutionMutator {
12+
13+
private static final Logger LOGGER = Logging.getLogger(AbstractExecutionMutator.class);
14+
15+
protected final JavaExec execTask;
16+
protected final Project project;
17+
18+
AbstractExecutionMutator(JavaExec execTask, Project project) {
19+
this.execTask = execTask;
20+
this.project = project;
21+
}
22+
23+
protected final String getMainClassName() {
24+
String mainClassName = Objects.requireNonNull(execTask.getMain());
25+
if (!mainClassName.contains("/")) {
26+
LOGGER.warn("No module was provided for main class, assuming the current module. Prefer providing 'mainClassName' in the following format: '$moduleName/a.b.Main'");
27+
return helper().moduleName() + "/" + mainClassName;
28+
}
29+
return mainClassName;
30+
}
31+
32+
protected final JavaProjectHelper helper() {
33+
return new JavaProjectHelper(project);
34+
}
35+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ private static void configure(ModularCreateStartScripts startScriptsTask, Projec
5555
startScriptsTask.setDefaultJvmOpts(defaultJvmOpts);
5656
}
5757

58-
var mutator = new RunTaskMutator(runTask, project);
58+
var mutator = new StartScriptsMutator(runTask, project);
5959
mutator.updateStartScriptsTask(startScriptsTask);
6060
mutator.movePatchedLibs();
6161
}

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,18 @@ public void configureRun() {
1515
}
1616

1717
private void doConfigureRun() {
18-
JavaExec runTask = helper().task(ApplicationPlugin.TASK_RUN_NAME, JavaExec.class);
19-
var mutator = new RunTaskMutator(runTask, project);
18+
var mutator = new RunTaskMutator(getRunTask(), project);
2019
mutator.configureRun();
20+
project.afterEvaluate(p -> configureStartScripts());
21+
}
22+
23+
private void configureStartScripts() {
24+
var mutator = new StartScriptsMutator(getRunTask(), project);
25+
mutator.updateStartScriptsTask(ApplicationPlugin.TASK_START_SCRIPTS_NAME);
26+
mutator.movePatchedLibs();
27+
}
2128

22-
project.afterEvaluate(p -> {
23-
mutator.updateStartScriptsTask(ApplicationPlugin.TASK_START_SCRIPTS_NAME);
24-
mutator.movePatchedLibs();
25-
});
29+
private JavaExec getRunTask() {
30+
return helper().task(ApplicationPlugin.TASK_RUN_NAME, JavaExec.class);
2631
}
2732
}
Lines changed: 2 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,135 +1,25 @@
11
package org.javamodularity.moduleplugin.tasks;
22

33
import org.gradle.api.Action;
4-
import org.gradle.api.GradleException;
54
import org.gradle.api.Project;
65
import org.gradle.api.Task;
7-
import org.gradle.api.distribution.Distribution;
8-
import org.gradle.api.distribution.DistributionContainer;
9-
import org.gradle.api.file.FileCopyDetails;
10-
import org.gradle.api.file.RelativePath;
11-
import org.gradle.api.logging.Logger;
12-
import org.gradle.api.logging.Logging;
136
import org.gradle.api.tasks.JavaExec;
14-
import org.gradle.api.tasks.application.CreateStartScripts;
15-
import org.javamodularity.moduleplugin.JavaProjectHelper;
167

17-
import java.io.IOException;
18-
import java.nio.file.Files;
19-
import java.nio.file.Path;
208
import java.util.ArrayList;
219
import java.util.List;
22-
import java.util.Objects;
2310
import java.util.stream.Stream;
2411

25-
public class RunTaskMutator {
26-
private static final String LIBS_PLACEHOLDER = "APP_HOME_LIBS_PLACEHOLDER";
27-
private static final String PATCH_LIBS_PLACEHOLDER = "APP_HOME_PATCH_LIBS_PLACEHOLDER";
28-
private static final Logger LOGGER = Logging.getLogger(RunTaskMutator.class);
29-
30-
private final JavaExec execTask;
31-
private final Project project;
12+
public class RunTaskMutator extends AbstractExecutionMutator {
3213

3314
public RunTaskMutator(JavaExec execTask, Project project) {
34-
this.execTask = execTask;
35-
this.project = project;
15+
super(execTask, project);
3616
}
3717

3818
public void configureRun() {
3919
execTask.getExtensions().create("moduleOptions", ModuleOptions.class, project);
4020
updateJavaExecTask();
4121
}
4222

43-
public void updateStartScriptsTask(String taskStartScriptsName) {
44-
CreateStartScripts startScriptsTask = helper().task(taskStartScriptsName, CreateStartScripts.class);
45-
updateStartScriptsTask(startScriptsTask);
46-
}
47-
48-
public void updateStartScriptsTask(CreateStartScripts startScriptsTask) {
49-
50-
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
51-
startScriptsTask.doFirst(new Action<Task>() {
52-
@Override
53-
public void execute(Task task) {
54-
configureStartScriptsDoFirst(startScriptsTask);
55-
}
56-
});
57-
58-
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
59-
startScriptsTask.doLast(new Action<Task>() {
60-
@Override
61-
public void execute(Task task) {
62-
configureStartScriptsDoLast(startScriptsTask);
63-
}
64-
});
65-
}
66-
67-
private void configureStartScriptsDoFirst(CreateStartScripts startScriptsTask) {
68-
List<String> jvmArgs = buildStartScriptsJvmArgs(startScriptsTask);
69-
startScriptsTask.setDefaultJvmOpts(jvmArgs);
70-
startScriptsTask.setClasspath(project.files());
71-
72-
if (ModularCreateStartScripts.UNDEFINED_MAIN_CLASS_NAME.equals(startScriptsTask.getMainClassName())) {
73-
startScriptsTask.setMainClassName(/* helper().moduleName() + "/" + */ execTask.getMain());
74-
}
75-
}
76-
77-
private List<String> buildStartScriptsJvmArgs(CreateStartScripts startScriptsTask) {
78-
var jvmArgs = new ArrayList<String>();
79-
80-
String moduleName = helper().moduleName();
81-
var patchModuleExtension = helper().extension(PatchModuleExtension.class);
82-
83-
var moduleJvmArgs = List.of(
84-
"--module-path", LIBS_PLACEHOLDER,
85-
"--module", getMainClassName()
86-
);
87-
88-
ModuleOptions moduleOptions = execTask.getExtensions().getByType(ModuleOptions.class);
89-
moduleOptions.mutateArgs(moduleName, jvmArgs);
90-
91-
buildPatchModuleArgStream(patchModuleExtension).forEach(jvmArgs::add);
92-
93-
startScriptsTask.getDefaultJvmOpts().forEach(jvmArgs::add);
94-
95-
jvmArgs.addAll(moduleJvmArgs);
96-
97-
return jvmArgs;
98-
}
99-
100-
private Stream<String> buildPatchModuleArgStream(PatchModuleExtension patchModuleExtension) {
101-
return patchModuleExtension.resolve(jarName -> PATCH_LIBS_PLACEHOLDER + "/" + jarName).toArgumentStream();
102-
}
103-
104-
private void configureStartScriptsDoLast(CreateStartScripts startScriptsTask) {
105-
Path outputDir = startScriptsTask.getOutputDir().toPath();
106-
107-
Path bashScript = outputDir.resolve(startScriptsTask.getApplicationName());
108-
replaceLibsPlaceHolder(bashScript, "\\$APP_HOME/lib", "\\$APP_HOME/patchlibs");
109-
110-
Path batFile = outputDir.resolve(startScriptsTask.getApplicationName() + ".bat");
111-
replaceLibsPlaceHolder(batFile, "%APP_HOME%\\\\lib", "%APP_HOME%\\\\patchlibs");
112-
}
113-
114-
public void movePatchedLibs() {
115-
var patchModuleExtension = helper().extension(PatchModuleExtension.class);
116-
if (patchModuleExtension.getConfig().isEmpty()) {
117-
return;
118-
}
119-
120-
Distribution mainDistribution = helper().extension("distributions", DistributionContainer.class)
121-
.getByName("main");
122-
mainDistribution.contents(
123-
copySpec -> copySpec.filesMatching(patchModuleExtension.getJars(), this::updateRelativePath)
124-
);
125-
}
126-
127-
private void updateRelativePath(FileCopyDetails fileCopyDetails) {
128-
RelativePath updatedRelativePath = fileCopyDetails.getRelativePath().getParent().getParent()
129-
.append(true, "patchlibs", fileCopyDetails.getName());
130-
fileCopyDetails.setRelativePath(updatedRelativePath);
131-
}
132-
13323
private void updateJavaExecTask() {
13424
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
13525
execTask.doFirst(new Action<Task>() {
@@ -169,30 +59,4 @@ private List<String> buildJavaExecJvmArgs() {
16959
jvmArgs.addAll(moduleJvmArgs);
17060
return jvmArgs;
17161
}
172-
173-
private String getMainClassName() {
174-
String mainClassName = Objects.requireNonNull(execTask.getMain());
175-
if (!mainClassName.contains("/")) {
176-
LOGGER.warn("No module was provided for main class, assuming the current module. Prefer providing 'mainClassName' in the following format: '$moduleName/a.b.Main'");
177-
return helper().moduleName() + "/" + mainClassName;
178-
}
179-
return mainClassName;
180-
}
181-
182-
private static void replaceLibsPlaceHolder(Path path, String libText, String patchLibText) {
183-
try {
184-
String bashScript = Files.readString(path);
185-
String updatedBashScript = bashScript
186-
.replaceAll(LIBS_PLACEHOLDER, libText)
187-
.replaceAll(PATCH_LIBS_PLACEHOLDER, patchLibText);
188-
189-
Files.writeString(path, updatedBashScript);
190-
} catch (IOException e) {
191-
throw new GradleException("Couldn't replace placeholder in " + path);
192-
}
193-
}
194-
195-
private JavaProjectHelper helper() {
196-
return new JavaProjectHelper(project);
197-
}
19862
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package org.javamodularity.moduleplugin.tasks;
2+
3+
import org.gradle.api.Action;
4+
import org.gradle.api.GradleException;
5+
import org.gradle.api.Project;
6+
import org.gradle.api.Task;
7+
import org.gradle.api.distribution.Distribution;
8+
import org.gradle.api.distribution.DistributionContainer;
9+
import org.gradle.api.file.FileCopyDetails;
10+
import org.gradle.api.file.RelativePath;
11+
import org.gradle.api.tasks.JavaExec;
12+
import org.gradle.api.tasks.application.CreateStartScripts;
13+
14+
import java.io.IOException;
15+
import java.nio.file.Files;
16+
import java.nio.file.Path;
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
import java.util.stream.Stream;
20+
21+
public class StartScriptsMutator extends AbstractExecutionMutator {
22+
23+
private static final String LIBS_PLACEHOLDER = "APP_HOME_LIBS_PLACEHOLDER";
24+
private static final String PATCH_LIBS_PLACEHOLDER = "APP_HOME_PATCH_LIBS_PLACEHOLDER";
25+
26+
public StartScriptsMutator(JavaExec execTask, Project project) {
27+
super(execTask, project);
28+
}
29+
30+
public void updateStartScriptsTask(String taskStartScriptsName) {
31+
CreateStartScripts startScriptsTask = helper().task(taskStartScriptsName, CreateStartScripts.class);
32+
updateStartScriptsTask(startScriptsTask);
33+
}
34+
35+
public void updateStartScriptsTask(CreateStartScripts startScriptsTask) {
36+
37+
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
38+
startScriptsTask.doFirst(new Action<Task>() {
39+
@Override
40+
public void execute(Task task) {
41+
configureStartScriptsDoFirst(startScriptsTask);
42+
}
43+
});
44+
45+
// don't convert to lambda: https://github.com/java9-modularity/gradle-modules-plugin/issues/54
46+
startScriptsTask.doLast(new Action<Task>() {
47+
@Override
48+
public void execute(Task task) {
49+
configureStartScriptsDoLast(startScriptsTask);
50+
}
51+
});
52+
}
53+
54+
private void configureStartScriptsDoFirst(CreateStartScripts startScriptsTask) {
55+
List<String> jvmArgs = buildStartScriptsJvmArgs(startScriptsTask);
56+
startScriptsTask.setDefaultJvmOpts(jvmArgs);
57+
startScriptsTask.setClasspath(project.files());
58+
59+
if (ModularCreateStartScripts.UNDEFINED_MAIN_CLASS_NAME.equals(startScriptsTask.getMainClassName())) {
60+
startScriptsTask.setMainClassName(/* helper().moduleName() + "/" + */ execTask.getMain());
61+
}
62+
}
63+
64+
private List<String> buildStartScriptsJvmArgs(CreateStartScripts startScriptsTask) {
65+
var jvmArgs = new ArrayList<String>();
66+
67+
String moduleName = helper().moduleName();
68+
var patchModuleExtension = helper().extension(PatchModuleExtension.class);
69+
70+
var moduleJvmArgs = List.of(
71+
"--module-path", LIBS_PLACEHOLDER,
72+
"--module", getMainClassName()
73+
);
74+
75+
ModuleOptions moduleOptions = execTask.getExtensions().getByType(ModuleOptions.class);
76+
moduleOptions.mutateArgs(moduleName, jvmArgs);
77+
78+
buildPatchModuleArgStream(patchModuleExtension).forEach(jvmArgs::add);
79+
80+
startScriptsTask.getDefaultJvmOpts().forEach(jvmArgs::add);
81+
82+
jvmArgs.addAll(moduleJvmArgs);
83+
84+
return jvmArgs;
85+
}
86+
87+
private Stream<String> buildPatchModuleArgStream(PatchModuleExtension patchModuleExtension) {
88+
return patchModuleExtension.resolve(jarName -> PATCH_LIBS_PLACEHOLDER + "/" + jarName).toArgumentStream();
89+
}
90+
91+
private void configureStartScriptsDoLast(CreateStartScripts startScriptsTask) {
92+
Path outputDir = startScriptsTask.getOutputDir().toPath();
93+
94+
Path bashScript = outputDir.resolve(startScriptsTask.getApplicationName());
95+
replaceLibsPlaceHolder(bashScript, "\\$APP_HOME/lib", "\\$APP_HOME/patchlibs");
96+
97+
Path batFile = outputDir.resolve(startScriptsTask.getApplicationName() + ".bat");
98+
replaceLibsPlaceHolder(batFile, "%APP_HOME%\\\\lib", "%APP_HOME%\\\\patchlibs");
99+
}
100+
101+
public void movePatchedLibs() {
102+
var patchModuleExtension = helper().extension(PatchModuleExtension.class);
103+
if (patchModuleExtension.getConfig().isEmpty()) {
104+
return;
105+
}
106+
107+
Distribution mainDistribution = helper().extension("distributions", DistributionContainer.class)
108+
.getByName("main");
109+
mainDistribution.contents(
110+
copySpec -> copySpec.filesMatching(patchModuleExtension.getJars(), this::updateRelativePath)
111+
);
112+
}
113+
114+
private void updateRelativePath(FileCopyDetails fileCopyDetails) {
115+
RelativePath updatedRelativePath = fileCopyDetails.getRelativePath().getParent().getParent()
116+
.append(true, "patchlibs", fileCopyDetails.getName());
117+
fileCopyDetails.setRelativePath(updatedRelativePath);
118+
}
119+
120+
private static void replaceLibsPlaceHolder(Path path, String libText, String patchLibText) {
121+
try {
122+
String bashScript = Files.readString(path);
123+
String updatedBashScript = bashScript
124+
.replaceAll(LIBS_PLACEHOLDER, libText)
125+
.replaceAll(PATCH_LIBS_PLACEHOLDER, patchLibText);
126+
127+
Files.writeString(path, updatedBashScript);
128+
} catch (IOException e) {
129+
throw new GradleException("Couldn't replace placeholder in " + path);
130+
}
131+
}
132+
}

0 commit comments

Comments
 (0)