From 0f133cf8a5dfddf30c2f5b7d11fac1340b1462f8 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Tue, 28 Jan 2014 14:29:02 +0400 Subject: [PATCH] Gradle: buildscript configuration respect inheritance --- .../ModelBuildScriptClasspathBuilderImpl.java | 26 ++++++++++++++----- .../build.gradle | 8 ++++++ .../settings.gradle | 4 ++- ...elBuildScriptClasspathBuilderImplTest.java | 16 +++++++++--- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/builder/ModelBuildScriptClasspathBuilderImpl.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/builder/ModelBuildScriptClasspathBuilderImpl.java index 875d9cc26bc6..5572290c996a 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/builder/ModelBuildScriptClasspathBuilderImpl.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/builder/ModelBuildScriptClasspathBuilderImpl.java @@ -22,14 +22,13 @@ import org.gradle.plugins.ide.idea.model.IdeaModel; import org.gradle.plugins.ide.internal.IdeDependenciesExtractor; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.model.BuildScriptClasspathModel; +import org.jetbrains.plugins.gradle.model.ClasspathEntryModel; import org.jetbrains.plugins.gradle.model.ModelBuilderService; import org.jetbrains.plugins.gradle.model.internal.BuildScriptClasspathModelImpl; import org.jetbrains.plugins.gradle.model.internal.ClasspathEntryModelImpl; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * @author Vladislav.Soroka @@ -37,6 +36,8 @@ import java.util.List; */ public class ModelBuildScriptClasspathBuilderImpl implements ModelBuilderService { + private final Map cache = new ConcurrentHashMap(); + @Override public boolean canBuild(String modelName) { return BuildScriptClasspathModel.class.getName().equals(modelName); @@ -45,6 +46,9 @@ public class ModelBuildScriptClasspathBuilderImpl implements ModelBuilderService @Nullable @Override public Object buildAll(final String modelName, final Project project) { + BuildScriptClasspathModelImpl buildScriptClasspath = cache.get(project.getPath()); + if (buildScriptClasspath != null) return buildScriptClasspath; + boolean offline = false; boolean downloadJavadoc = false; boolean downloadSources = true; @@ -60,13 +64,22 @@ public class ModelBuildScriptClasspathBuilderImpl implements ModelBuilderService } } + buildScriptClasspath = new BuildScriptClasspathModelImpl(); + Project parent = project.getParent(); + if (parent != null) { + BuildScriptClasspathModelImpl parentBuildScriptClasspath = (BuildScriptClasspathModelImpl)buildAll(modelName, parent); + if (parentBuildScriptClasspath != null) { + for (ClasspathEntryModel classpathEntryModel : parentBuildScriptClasspath.getClasspath()) { + buildScriptClasspath.add(classpathEntryModel); + } + } + } + final IdeDependenciesExtractor dependenciesExtractor = new IdeDependenciesExtractor(); final Configuration configuration = project.getBuildscript().getConfigurations().findByName("classpath"); Collection plusConfigurations = Collections.singletonList(configuration); - BuildScriptClasspathModelImpl buildScriptClasspath = new BuildScriptClasspathModelImpl(); - if (!offline) { // download sources and/or javadoc List repoFileDependencies = dependenciesExtractor.extractRepoFileDependencies( @@ -88,6 +101,7 @@ public class ModelBuildScriptClasspathBuilderImpl implements ModelBuilderService buildScriptClasspath.add(new ClasspathEntryModelImpl(dependency.getFile(), null, null)); } + cache.put(project.getPath(), buildScriptClasspath); return buildScriptClasspath; } } diff --git a/plugins/gradle/testData/testModelBuildScriptClasspathBuilder/build.gradle b/plugins/gradle/testData/testModelBuildScriptClasspathBuilder/build.gradle index 5b09fca15f4d..45214e367483 100644 --- a/plugins/gradle/testData/testModelBuildScriptClasspathBuilder/build.gradle +++ b/plugins/gradle/testData/testModelBuildScriptClasspathBuilder/build.gradle @@ -7,3 +7,11 @@ project("moduleWithAdditionalClasspath") { } } } + +project("baseModule") { + buildscript { + dependencies { + classpath files("lib/inheritedDep.jar") + } + } +} diff --git a/plugins/gradle/testData/testModelBuildScriptClasspathBuilder/settings.gradle b/plugins/gradle/testData/testModelBuildScriptClasspathBuilder/settings.gradle index 79db5b38f50c..20bd8ca0d9b8 100644 --- a/plugins/gradle/testData/testModelBuildScriptClasspathBuilder/settings.gradle +++ b/plugins/gradle/testData/testModelBuildScriptClasspathBuilder/settings.gradle @@ -1,4 +1,6 @@ //noinspection GrPackage include 'moduleWithoutAdditionalClasspath' -include 'moduleWithAdditionalClasspath' \ No newline at end of file +include 'moduleWithAdditionalClasspath' +include 'baseModule' +include 'baseModule:moduleWithInheritedClasspath' \ No newline at end of file diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/model/builder/ModelBuildScriptClasspathBuilderImplTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/model/builder/ModelBuildScriptClasspathBuilderImplTest.java index d812d8df6a68..d802d086e4df 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/model/builder/ModelBuildScriptClasspathBuilderImplTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/model/builder/ModelBuildScriptClasspathBuilderImplTest.java @@ -55,20 +55,28 @@ public class ModelBuildScriptClasspathBuilderImplTest extends AbstractModelBuild ClasspathEntryModel classpathEntry = classpathModel.getClasspath().getAt(0); assertEquals("someDep.jar", classpathEntry.getClassesFile().getName()); } + else if (module.getName().equals("baseModule") || + module.getName().equals("moduleWithInheritedClasspath")) { + assertNotNull("Null build classpath for module: " + module.getName(), classpathModel); + assertEquals("Wrong build classpath for module: " + module.getName(), 1, classpathModel.getClasspath().size()); + + ClasspathEntryModel classpathEntry = classpathModel.getClasspath().getAt(0); + assertEquals("Wrong build classpath for module: " + module.getName(), "inheritedDep.jar", classpathEntry.getClassesFile().getName()); + } else if (module.getName().equals("moduleWithoutAdditionalClasspath") || module.getName().equals("testModelBuildScriptClasspathBuilder")) { - assertNotNull(classpathModel); - assertTrue(classpathModel.getClasspath().isEmpty()); + assertNotNull("Wrong build classpath for module: " + module.getName(), classpathModel); + assertTrue("Wrong build classpath for module: " + module.getName(), classpathModel.getClasspath().isEmpty()); } else { - fail(); + fail("Unexpected module found: " + module.getName()); } return classpathModel; } }); - assertEquals(3, ideaModule.size()); + assertEquals(5, ideaModule.size()); } @Override