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 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..8ce49e50 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,43 +139,53 @@ 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 { + + 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)); + } } } } } @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 5e2a60d7..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,40 +16,43 @@ 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; 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 static class ApplyPluginAction implements IsolatedAction { - 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); + } } }