Skip to content

Commit 892f9d9

Browse files
authored
Do not create multiple instances of the same Action type (#138)
1 parent 563e916 commit 892f9d9

File tree

3 files changed

+41
-25
lines changed

3 files changed

+41
-25
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## Version 1.8
44
* [#127](https://github.com/gradlex-org/java-module-dependencies/issues/127) Less configuration cache misses when modifying `module-info.java` (Thanks [TheGoesen](https://github.com/TheGoesen))
55
* [#128](https://github.com/gradlex-org/java-module-dependencies/issues/128) Less configuration cache misses when using Settings plugin (Thanks [TheGoesen](https://github.com/TheGoesen))
6+
* [#135](https://github.com/gradlex-org/java-module-dependencies/issues/135) Improve performance of ApplyPluginsAction
67

78
## Version 1.7.1
89
* Update module name mappings

src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,17 @@
3636
import org.gradlex.javamodule.dependencies.internal.utils.ModuleInfoCache;
3737
import org.gradlex.javamodule.dependencies.internal.utils.ValueModuleDirectoryListing;
3838

39-
import javax.annotation.Nullable;
4039
import javax.inject.Inject;
4140
import java.io.File;
4241
import java.nio.file.Paths;
42+
import java.util.ArrayList;
4343
import java.util.List;
4444

4545
public abstract class JavaModulesExtension {
4646

4747
private final Settings settings;
4848
private final ModuleInfoCache moduleInfoCache;
49+
private final List<ModuleProject> moduleProjects = new ArrayList<>();
4950

5051
@Inject
5152
public abstract ObjectFactory getObjects();
@@ -57,6 +58,7 @@ public abstract class JavaModulesExtension {
5758
public JavaModulesExtension(Settings settings) {
5859
this.settings = settings;
5960
this.moduleInfoCache = getObjects().newInstance(ModuleInfoCache.class, true);
61+
settings.getGradle().getLifecycle().beforeProject(new ApplyPluginsAction(moduleProjects, moduleInfoCache));
6062
}
6163

6264
/**
@@ -137,43 +139,53 @@ private void includeModule(Module module, File projectDir) {
137139

138140
String group = module.getGroup().getOrNull();
139141
List<String> plugins = module.getPlugins().get();
140-
settings.getGradle().getLifecycle().beforeProject(new ApplyPluginsAction(artifact, group, plugins, mainModuleName, moduleInfoCache));
142+
moduleProjects.add(new ModuleProject(artifact, group, plugins, mainModuleName));
141143
}
142144

143-
@NonNullApi
144-
private static class ApplyPluginsAction implements IsolatedAction<Project>, Action<Project> {
145-
145+
private static class ModuleProject {
146146
private final String artifact;
147147
private final String group;
148148
private final List<String> plugins;
149149
private final String mainModuleName;
150-
private final ModuleInfoCache moduleInfoCache;
151150

152-
public ApplyPluginsAction(String artifact, @Nullable String group, List<String> plugins, @Nullable String mainModuleName, ModuleInfoCache moduleInfoCache) {
151+
public ModuleProject(String artifact, String group, List<String> plugins, String mainModuleName) {
153152
this.artifact = artifact;
154153
this.group = group;
155154
this.plugins = plugins;
156155
this.mainModuleName = mainModuleName;
156+
}
157+
}
158+
159+
@NonNullApi
160+
private static class ApplyPluginsAction implements IsolatedAction<Project> {
161+
162+
private final List<ModuleProject> moduleProjects;
163+
private final ModuleInfoCache moduleInfoCache;
164+
165+
public ApplyPluginsAction(List<ModuleProject> moduleProjects, ModuleInfoCache moduleInfoCache) {
166+
this.moduleProjects = moduleProjects;
157167
this.moduleInfoCache = moduleInfoCache;
158168
}
159169

160170
@Override
161171
public void execute(Project project) {
162-
if (project.getName().equals(artifact)) {
163-
if (group != null) project.setGroup(group);
164-
project.getPlugins().apply(JavaModuleDependenciesPlugin.class);
165-
project.getExtensions().getByType(JavaModuleDependenciesExtension.class).getModuleInfoCache().set(moduleInfoCache);
166-
plugins.forEach(id -> project.getPlugins().apply(id));
167-
if (mainModuleName != null) {
168-
project.getPlugins().withType(ApplicationPlugin.class, p ->
169-
project.getExtensions().getByType(JavaApplication.class).getMainModule().set(mainModuleName));
172+
for (ModuleProject m : moduleProjects) {
173+
if (project.getName().equals(m.artifact)) {
174+
if (m.group != null) project.setGroup(m.group);
175+
project.getPlugins().apply(JavaModuleDependenciesPlugin.class);
176+
project.getExtensions().getByType(JavaModuleDependenciesExtension.class).getModuleInfoCache().set(moduleInfoCache);
177+
m.plugins.forEach(id -> project.getPlugins().apply(id));
178+
if (m.mainModuleName != null) {
179+
project.getPlugins().withType(ApplicationPlugin.class, p ->
180+
project.getExtensions().getByType(JavaApplication.class).getMainModule().set(m.mainModuleName));
181+
}
170182
}
171183
}
172184
}
173185
}
174186

175187
@NonNullApi
176-
private static class ApplyJavaModuleVersionsPluginAction implements IsolatedAction<Project>, Action<Project> {
188+
private static class ApplyJavaModuleVersionsPluginAction implements IsolatedAction<Project> {
177189

178190
private final String projectName;
179191

src/main/java/org/gradlex/javamodule/dependencies/initialization/RootPluginsExtension.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,43 @@
1616

1717
package org.gradlex.javamodule.dependencies.initialization;
1818

19-
import org.gradle.api.Action;
2019
import org.gradle.api.IsolatedAction;
2120
import org.gradle.api.NonNullApi;
2221
import org.gradle.api.Project;
2322
import org.gradle.api.initialization.Settings;
2423

2524
import javax.inject.Inject;
25+
import java.util.ArrayList;
26+
import java.util.List;
2627

2728
public abstract class RootPluginsExtension {
2829

29-
private final Settings settings;
30+
private final List<String> ids = new ArrayList<>();
3031

3132
@Inject
3233
public RootPluginsExtension(Settings settings) {
33-
this.settings = settings;
34+
settings.getGradle().getLifecycle().beforeProject(new ApplyPluginAction(ids));
3435
}
3536

3637
public void id(String id) {
37-
settings.getGradle().getLifecycle().beforeProject(new ApplyPluginAction(id));
38+
ids.add(id);
3839
}
3940

4041
@NonNullApi
41-
private static class ApplyPluginAction implements IsolatedAction<Project>, Action<Project> {
42+
private static class ApplyPluginAction implements IsolatedAction<Project> {
4243

43-
private final String id;
44+
private final List<String> ids;
4445

45-
public ApplyPluginAction(String id) {
46-
this.id = id;
46+
public ApplyPluginAction(List<String> ids) {
47+
this.ids = ids;
4748
}
4849

4950
@Override
5051
public void execute(Project project) {
5152
if (isRoot(project)) {
52-
project.getPlugins().apply(id);
53+
for (String id : ids) {
54+
project.getPlugins().apply(id);
55+
}
5356
}
5457
}
5558

0 commit comments

Comments
 (0)