From 1db85d72d636de33bb8ba3e6c9660f5173e66904 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Wed, 16 Oct 2024 15:49:36 +0200 Subject: [PATCH 1/3] Do not create multiple instances of one Action type --- .../initialization/JavaModulesExtension.java | 42 ++++++++++++------- .../initialization/RootPluginsExtension.java | 18 ++++---- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java b/src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java index 576d0379..47aa63ec 100644 --- a/src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java +++ b/src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java @@ -36,16 +36,17 @@ import org.gradlex.javamodule.dependencies.internal.utils.ModuleInfoCache; import org.gradlex.javamodule.dependencies.internal.utils.ValueModuleDirectoryListing; -import javax.annotation.Nullable; import javax.inject.Inject; import java.io.File; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.List; public abstract class JavaModulesExtension { private final Settings settings; private final ModuleInfoCache moduleInfoCache; + private final List moduleProjects = new ArrayList<>(); @Inject public abstract ObjectFactory getObjects(); @@ -57,6 +58,7 @@ public abstract class JavaModulesExtension { public JavaModulesExtension(Settings settings) { this.settings = settings; this.moduleInfoCache = getObjects().newInstance(ModuleInfoCache.class, true); + settings.getGradle().getLifecycle().beforeProject(new ApplyPluginsAction(moduleProjects, moduleInfoCache)); } /** @@ -137,36 +139,46 @@ private void includeModule(Module module, File projectDir) { String group = module.getGroup().getOrNull(); List plugins = module.getPlugins().get(); - settings.getGradle().getLifecycle().beforeProject(new ApplyPluginsAction(artifact, group, plugins, mainModuleName, moduleInfoCache)); + moduleProjects.add(new ModuleProject(artifact, group, plugins, mainModuleName)); } - @NonNullApi - private static class ApplyPluginsAction implements IsolatedAction, Action { - + private static class ModuleProject { private final String artifact; private final String group; private final List plugins; private final String mainModuleName; - private final ModuleInfoCache moduleInfoCache; - public ApplyPluginsAction(String artifact, @Nullable String group, List plugins, @Nullable String mainModuleName, ModuleInfoCache moduleInfoCache) { + public ModuleProject(String artifact, String group, List plugins, String mainModuleName) { this.artifact = artifact; this.group = group; this.plugins = plugins; this.mainModuleName = mainModuleName; + } + } + + @NonNullApi + private static class ApplyPluginsAction implements IsolatedAction, Action { + + private final List moduleProjects; + private final ModuleInfoCache moduleInfoCache; + + public ApplyPluginsAction(List moduleProjects, ModuleInfoCache moduleInfoCache) { + this.moduleProjects = moduleProjects; this.moduleInfoCache = moduleInfoCache; } @Override public void execute(Project project) { - if (project.getName().equals(artifact)) { - if (group != null) project.setGroup(group); - project.getPlugins().apply(JavaModuleDependenciesPlugin.class); - project.getExtensions().getByType(JavaModuleDependenciesExtension.class).getModuleInfoCache().set(moduleInfoCache); - plugins.forEach(id -> project.getPlugins().apply(id)); - if (mainModuleName != null) { - project.getPlugins().withType(ApplicationPlugin.class, p -> - project.getExtensions().getByType(JavaApplication.class).getMainModule().set(mainModuleName)); + for (ModuleProject m : moduleProjects) { + if (project.getName().equals(m.artifact)) { + if (m.group != null) project.setGroup(m.group); + project.getPlugins().apply(JavaModuleDependenciesPlugin.class); + project.getExtensions().getByType(JavaModuleDependenciesExtension.class).getModuleInfoCache().set(moduleInfoCache); + m.plugins.forEach(id -> project.getPlugins().apply(id)); + if (m.mainModuleName != null) { + project.getPlugins().withType(ApplicationPlugin.class, p -> + project.getExtensions().getByType(JavaApplication.class).getMainModule().set(m.mainModuleName)); + } } } } diff --git a/src/main/java/org/gradlex/javamodule/dependencies/initialization/RootPluginsExtension.java b/src/main/java/org/gradlex/javamodule/dependencies/initialization/RootPluginsExtension.java index 5e2a60d7..0565991b 100644 --- a/src/main/java/org/gradlex/javamodule/dependencies/initialization/RootPluginsExtension.java +++ b/src/main/java/org/gradlex/javamodule/dependencies/initialization/RootPluginsExtension.java @@ -23,33 +23,37 @@ import org.gradle.api.initialization.Settings; import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; public abstract class RootPluginsExtension { - private final Settings settings; + private final List ids = new ArrayList<>(); @Inject public RootPluginsExtension(Settings settings) { - this.settings = settings; + settings.getGradle().getLifecycle().beforeProject(new ApplyPluginAction(ids)); } public void id(String id) { - settings.getGradle().getLifecycle().beforeProject(new ApplyPluginAction(id)); + ids.add(id); } @NonNullApi private static class ApplyPluginAction implements IsolatedAction, Action { - private final String id; + private final List ids; - public ApplyPluginAction(String id) { - this.id = id; + public ApplyPluginAction(List ids) { + this.ids = ids; } @Override public void execute(Project project) { if (isRoot(project)) { - project.getPlugins().apply(id); + for (String id : ids) { + project.getPlugins().apply(id); + } } } From 65c3574c4394fd7197abbe82d2cf2a5865107095 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Wed, 16 Oct 2024 16:17:39 +0200 Subject: [PATCH 2/3] Remove unnecessary 'implements Action' --- .../dependencies/initialization/JavaModulesExtension.java | 4 ++-- .../dependencies/initialization/RootPluginsExtension.java | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java b/src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java index 47aa63ec..8ce49e50 100644 --- a/src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java +++ b/src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java @@ -157,7 +157,7 @@ public ModuleProject(String artifact, String group, List plugins, String } @NonNullApi - private static class ApplyPluginsAction implements IsolatedAction, Action { + private static class ApplyPluginsAction implements IsolatedAction { private final List moduleProjects; private final ModuleInfoCache moduleInfoCache; @@ -185,7 +185,7 @@ public void execute(Project project) { } @NonNullApi - private static class ApplyJavaModuleVersionsPluginAction implements IsolatedAction, Action { + private static class ApplyJavaModuleVersionsPluginAction implements IsolatedAction { private final String projectName; diff --git a/src/main/java/org/gradlex/javamodule/dependencies/initialization/RootPluginsExtension.java b/src/main/java/org/gradlex/javamodule/dependencies/initialization/RootPluginsExtension.java index 0565991b..a760ecc6 100644 --- a/src/main/java/org/gradlex/javamodule/dependencies/initialization/RootPluginsExtension.java +++ b/src/main/java/org/gradlex/javamodule/dependencies/initialization/RootPluginsExtension.java @@ -16,7 +16,6 @@ package org.gradlex.javamodule.dependencies.initialization; -import org.gradle.api.Action; import org.gradle.api.IsolatedAction; import org.gradle.api.NonNullApi; import org.gradle.api.Project; @@ -40,7 +39,7 @@ public void id(String id) { } @NonNullApi - private static class ApplyPluginAction implements IsolatedAction, Action { + private static class ApplyPluginAction implements IsolatedAction { private final List ids; From 70c1ebc806dd13fa9a18dad64dc7ec83f3c01a94 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Wed, 16 Oct 2024 16:30:51 +0200 Subject: [PATCH 3/3] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cd2ef10..e0bfda6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Version 1.8 * [#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)) * [#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)) +* [#135](https://github.com/gradlex-org/java-module-dependencies/issues/135) Improve performance of ApplyPluginsAction ## Version 1.7.1 * Update module name mappings