Index: src/main/groovy/org/gradle/DefaultGradleFactory.java
===================================================================
--- src/main/groovy/org/gradle/DefaultGradleFactory.java (revision 1247)
+++ src/main/groovy/org/gradle/DefaultGradleFactory.java (working copy)
@@ -57,6 +57,13 @@
new ParentDirSettingsFinderStrategy()))
);
DependencyManagerFactory dependencyManagerFactory = new DefaultDependencyManagerFactory(settingsFinder, startParameter.getCacheUsage());
+ BuildSourceBuilder buildSourceBuilder = new BuildSourceBuilder(new DefaultGradleFactory(
+ new LoggingConfigurer() {
+ public void configure(LogLevel logLevel) {
+ // do nothing
+ }
+ }
+ ), new DefaultCacheInvalidationStrategy());
Gradle gradle = new Gradle(
startParameter,
settingsFinder,
@@ -70,13 +77,7 @@
new SettingsFactory(
new DefaultProjectDescriptorRegistry(),
dependencyManagerFactory,
- new BuildSourceBuilder(new DefaultGradleFactory(
- new LoggingConfigurer() {
- public void configure(LogLevel logLevel) {
- // do nothing
- }
- }
- ), new DefaultCacheInvalidationStrategy())))
+ buildSourceBuilder))
)),
new BuildLoader(
new ProjectFactory(
@@ -92,7 +93,8 @@
startParameter.getBuildScriptSource(),
new DefaultAntBuilderFactory(new AntLoggingAdapter()))
),
- new BuildConfigurer(new ProjectDependencies2TaskResolver()));
+ new BuildConfigurer(new ProjectDependencies2TaskResolver()),
+ buildSourceBuilder);
return gradle;
}
Index: src/main/groovy/org/gradle/Gradle.java
===================================================================
--- src/main/groovy/org/gradle/Gradle.java (revision 1247)
+++ src/main/groovy/org/gradle/Gradle.java (working copy)
@@ -20,13 +20,22 @@
import org.gradle.api.internal.SettingsInternal;
import org.gradle.api.execution.TaskExecutionGraphListener;
import org.gradle.api.execution.TaskExecutionGraph;
+import org.gradle.api.plugins.JavaPlugin;
+import org.gradle.api.artifacts.ConfigurationResolvers;
+import org.gradle.api.artifacts.Dependency;
import org.gradle.configuration.BuildConfigurer;
import org.gradle.execution.BuildExecuter;
import org.gradle.initialization.*;
import org.gradle.util.ListenerBroadcast;
+import org.gradle.util.WrapUtil;
+import org.gradle.util.ClasspathUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.File;
+import java.util.List;
+import java.net.URLClassLoader;
+
/**
*
{@code Gradle} is the main entry point for embedding Gradle. You use this class to manage a Gradle build, as
* follows:
@@ -62,19 +71,21 @@
private SettingsProcessor settingsProcessor;
private BuildLoader buildLoader;
private BuildConfigurer buildConfigurer;
+ private BuildSourceBuilder buildSourceBuilder;
private final ListenerBroadcast buildListeners = new ListenerBroadcast(
BuildListener.class);
public Gradle(StartParameter startParameter, ISettingsFinder settingsFinder,
IGradlePropertiesLoader gradlePropertiesLoader, SettingsProcessor settingsProcessor,
- BuildLoader buildLoader, BuildConfigurer buildConfigurer) {
+ BuildLoader buildLoader, BuildConfigurer buildConfigurer, BuildSourceBuilder buildSourceBuilder) {
this.startParameter = startParameter;
this.settingsFinder = settingsFinder;
this.gradlePropertiesLoader = gradlePropertiesLoader;
this.settingsProcessor = settingsProcessor;
this.buildLoader = buildLoader;
this.buildConfigurer = buildConfigurer;
+ this.buildSourceBuilder = buildSourceBuilder;
}
/**
@@ -86,6 +97,16 @@
public BuildResult run() {
fireBuildStarted(startParameter);
+ settingsFinder.find(startParameter);
+ File settingsDir = settingsFinder.getSettingsDir();
+
+ List classpathAdditions = buildSourceBuilder.createBuildSourceClasspath(getBuildSrcStartParameter(startParameter, settingsDir));
+ if (!ClasspathUtil.isToolsJarInClasspath())
+ {
+ classpathAdditions.add(ClasspathUtil.getToolsJar());
+ }
+ ClasspathUtil.addUrl((URLClassLoader) Thread.currentThread().getContextClassLoader(), classpathAdditions);
+
SettingsInternal settings = null;
Throwable failure = null;
try {
@@ -101,11 +122,22 @@
return buildResult;
}
+ private StartParameter getBuildSrcStartParameter(StartParameter startParameter, File rootDir) {
+ StartParameter buildSrcStartParameter = startParameter.newBuild();
+ buildSrcStartParameter.setTaskNames(WrapUtil.toList(JavaPlugin.CLEAN,
+ ConfigurationResolvers.uploadInternalTaskName(Dependency.MASTER_CONFIGURATION)));
+ buildSrcStartParameter.setSearchUpwards(true);
+ buildSrcStartParameter.setCurrentDir(new File(rootDir, BaseSettings.DEFAULT_BUILD_SRC_DIR));
+ return buildSrcStartParameter;
+ }
+
+
private void runInternal(SettingsInternal settings, StartParameter startParameter) {
ClassLoader classLoader = settings.createClassLoader();
// Load build
- BuildInternal build = buildLoader.load(settings.getRootProject(), classLoader, startParameter,
+ BuildInternal build = buildLoader.load(settings.getRootProject(),
+ classLoader, startParameter,
gradlePropertiesLoader.getGradleProperties());
fireProjectsLoaded(build);
@@ -212,6 +244,10 @@
this.buildConfigurer = buildConfigurer;
}
+ public BuildSourceBuilder getBuildSourceBuilder() {
+ return buildSourceBuilder;
+ }
+
/**
* Adds a {@link BuildListener} to this Gradle instance. The listener is notified of events which occur during a
* build.
Index: src/main/groovy/org/gradle/initialization/BaseSettings.java
===================================================================
--- src/main/groovy/org/gradle/initialization/BaseSettings.java (revision 1247)
+++ src/main/groovy/org/gradle/initialization/BaseSettings.java (working copy)
@@ -41,7 +41,7 @@
import java.io.File;
import java.net.URLClassLoader;
-import java.util.List;
+import java.util.Set;
import java.util.Map;
/**
@@ -63,8 +63,6 @@
private File settingsDir;
- private StartParameter buildSrcStartParameter;
-
private DefaultProjectDescriptor rootProjectDescriptor;
private DynamicObjectHelper dynamicObjectHelper;
@@ -86,18 +84,10 @@
startParameter.getGradleUserHomeDir());
this.buildSourceBuilder = buildSourceBuilder;
dependencyManager.addConfiguration(BUILD_CONFIGURATION);
- assignBuildSrcStartParameter(startParameter);
rootProjectDescriptor = createProjectDescriptor(null, settingsDir.getName(), settingsDir);
dynamicObjectHelper = new DynamicObjectHelper(this);
}
- private void assignBuildSrcStartParameter(StartParameter startParameter) {
- buildSrcStartParameter = startParameter.newBuild();
- buildSrcStartParameter.setTaskNames(WrapUtil.toList(JavaPlugin.CLEAN,
- ConfigurationResolvers.uploadInternalTaskName(Dependency.MASTER_CONFIGURATION)));
- buildSrcStartParameter.setSearchUpwards(true);
- }
-
@Override
public String toString() {
return String.format("settings '%s'", rootProjectDescriptor.getName());
@@ -194,14 +184,7 @@
// adds simply the build script jars to the context classloader we can remove the return argument and simplify our design.
public URLClassLoader createClassLoader() {
URLClassLoader classLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
- StartParameter startParameter = buildSrcStartParameter.newInstance();
- startParameter.setCurrentDir(new File(getRootDir(), DEFAULT_BUILD_SRC_DIR));
- List additionalClasspath = buildSourceBuilder.createBuildSourceClasspath(startParameter);
- additionalClasspath.addAll(dependencyManager.configuration(BUILD_CONFIGURATION).getFiles());
- File toolsJar = ClasspathUtil.getToolsJar();
- if (toolsJar != null) {
- additionalClasspath.add(toolsJar);
- }
+ Set additionalClasspath = dependencyManager.configuration(BUILD_CONFIGURATION).getFiles();
logger.debug("Adding to classpath: {}", additionalClasspath);
ClasspathUtil.addUrl(classLoader, additionalClasspath);
return classLoader;
@@ -267,14 +250,6 @@
this.settingsScript = settingsScript;
}
- public StartParameter getBuildSrcStartParameter() {
- return buildSrcStartParameter;
- }
-
- public void setBuildSrcStartParameter(StartParameter buildSrcStartParameter) {
- this.buildSrcStartParameter = buildSrcStartParameter;
- }
-
public IProjectDescriptorRegistry getProjectDescriptorRegistry() {
return projectDescriptorRegistry;
}
Index: src/main/groovy/org/gradle/util/ClasspathUtil.java
===================================================================
--- src/main/groovy/org/gradle/util/ClasspathUtil.java (revision 1247)
+++ src/main/groovy/org/gradle/util/ClasspathUtil.java (working copy)
@@ -46,7 +46,7 @@
}
public static boolean isToolsJarInClasspath() {
- ClassLoader classLoader = ClassLoader.getSystemClassLoader();
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// first check if the tools jar is already in the classpath
boolean toolsJarAvailable = false;
try {
Index: src/samples/javaproject/settings.gradle
===================================================================
--- src/samples/javaproject/settings.gradle (revision 1247)
+++ src/samples/javaproject/settings.gradle (working copy)
@@ -3,4 +3,6 @@
include "shared", "api", "services:webapp1"
+// just to test that buildSrc classes are available in settings.gradle
+org.gradle.buildsrc.BuildSrcClass testClass = new org.gradle.buildsrc.BuildSrcClass()
Index: src/test/groovy/org/gradle/GradleTest.java
===================================================================
--- src/test/groovy/org/gradle/GradleTest.java (revision 1247)
+++ src/test/groovy/org/gradle/GradleTest.java (working copy)
@@ -31,6 +31,7 @@
import org.gradle.initialization.IGradlePropertiesLoader;
import org.gradle.initialization.ISettingsFinder;
import org.gradle.initialization.BuildLoader;
+import org.gradle.initialization.BuildSourceBuilder;
import org.gradle.initialization.SettingsProcessor;
import org.gradle.util.HelperUtil;
import org.gradle.util.WrapUtil;
@@ -48,7 +49,6 @@
import org.junit.runner.RunWith;
import java.io.File;
-import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
@@ -75,6 +75,7 @@
private StartParameter expectedStartParams;
private BuildListener buildListenerMock;
private BuildInternal buildMock;
+ private BuildSourceBuilder buildSourceBuilderMock;
private Map testGradleProperties = new HashMap();
@@ -83,7 +84,7 @@
private TaskExecuter taskExecuterMock;
private ProjectDescriptor expectedRootProjectDescriptor;
-
+
private JUnit4Mockery context = new JUnit4Mockery();
@Before
@@ -97,11 +98,12 @@
settingsProcessorMock = context.mock(SettingsProcessor.class);
buildLoaderMock = context.mock(BuildLoader.class);
buildConfigurerMock = context.mock(BuildConfigurer.class);
+ buildSourceBuilderMock = context.mock(BuildSourceBuilder.class);
buildListenerMock = context.mock(BuildListener.class);
buildMock = context.mock(BuildInternal.class);
testGradleProperties = WrapUtil.toMap("prop1", "value1");
boolean expectedSearchUpwards = false;
- expectedClassLoader = new URLClassLoader(new URL[0]);
+ expectedClassLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
expectedRootDir = new File("rootDir");
File expectedCurrentDir = new File(expectedRootDir, "currentDir");
@@ -120,8 +122,9 @@
gradle = new Gradle(expectedStartParams, settingsFinderMock, gradlePropertiesLoaderMock, settingsProcessorMock,
buildLoaderMock,
- buildConfigurerMock);
-
+ buildConfigurerMock,
+ buildSourceBuilderMock);
+
context.checking(new Expectations() {
{
allowing(settingsFinderMock).find(with(any(StartParameter.class)));
@@ -161,16 +164,19 @@
public void testInit() {
gradle = new Gradle(expectedStartParams, settingsFinderMock, gradlePropertiesLoaderMock, settingsProcessorMock,
buildLoaderMock,
- buildConfigurerMock);
+ buildConfigurerMock,
+ buildSourceBuilderMock);
assertSame(settingsFinderMock, gradle.getSettingsFinder());
assertSame(gradlePropertiesLoaderMock, gradle.getGradlePropertiesLoader());
assertSame(settingsProcessorMock, gradle.getSettingsProcessor());
assertSame(buildLoaderMock, gradle.getBuildLoader());
assertSame(buildConfigurerMock, gradle.getBuildConfigurer());
+ assertSame(buildSourceBuilderMock, gradle.getBuildSourceBuilder());
}
@Test
public void testRun() {
+ expectBuildSourceClasspath();
expectSettingsBuilt();
expectTasksRunWithDagRebuild();
BuildResult buildResult = gradle.run();
@@ -180,6 +186,7 @@
@Test
public void testNotifiesListenerOfBuildStages() {
+ expectBuildSourceClasspath();
expectSettingsBuilt();
expectTasksRunWithDagRebuild();
context.checking(new Expectations() {{
@@ -198,6 +205,7 @@
@Test
public void testNotifiesListenerOnSettingsInitWithFailure() {
final RuntimeException failure = new RuntimeException();
+ expectBuildSourceClasspath();
context.checking(new Expectations() {{
one(buildListenerMock).buildStarted(expectedStartParams);
one(settingsProcessorMock).process(settingsFinderMock, expectedStartParams, gradlePropertiesLoaderMock);
@@ -214,6 +222,7 @@
@Test
public void testNotifiesListenerOnBuildCompleteWithFailure() {
final RuntimeException failure = new RuntimeException();
+ expectBuildSourceClasspath();
expectSettingsBuilt();
expectTasksRunWithFailure(failure);
context.checking(new Expectations() {{
@@ -230,6 +239,15 @@
assertThat(buildResult.getFailure(), sameInstance((Throwable) failure));
}
+ private void expectBuildSourceClasspath() {
+ context.checking(new Expectations() {
+ {
+ one(buildSourceBuilderMock).createBuildSourceClasspath(with(any(StartParameter.class)));
+ will(returnValue(new ArrayList()));
+ }
+ });
+ }
+
private void expectSettingsBuilt() {
context.checking(new Expectations() {
{
@@ -272,6 +290,7 @@
@Test
public void testRunWithUnknownTask() {
+ expectBuildSourceClasspath();
expectedStartParams.setTaskNames(WrapUtil.toList("unknown"));
context.checking(new Expectations() {
{
Index: src/test/groovy/org/gradle/initialization/DefaultSettingsTest.groovy
===================================================================
--- src/test/groovy/org/gradle/initialization/DefaultSettingsTest.groovy (revision 1247)
+++ src/test/groovy/org/gradle/initialization/DefaultSettingsTest.groovy (working copy)
@@ -82,10 +82,6 @@
assert settings.dependencyManager.is(dependencyManagerMock)
assert settings.buildSourceBuilder.is(buildSourceBuilderMock)
- assertNull(settings.buildSrcStartParameter.buildFile)
- assertEquals([JavaPlugin.CLEAN, ConfigurationResolvers.uploadInternalTaskName(Dependency.MASTER_CONFIGURATION)],
- settings.buildSrcStartParameter.taskNames)
- assertTrue(settings.buildSrcStartParameter.searchUpwards)
assertNull(settings.getRootProject().getParent())
assertEquals(settingsDir, settings.getRootProject().getProjectDir())
assertEquals(settings.getRootProject().getProjectDir().getName(), settings.getRootProject().getName())
@@ -235,39 +231,26 @@
assert settings.resolvers.is(expectedResolverContainer)
}
- @Test public void testCreateClassLoaderWithNonExistingBuildSource() {
- checkCreateClassLoader([])
- }
-
- @Test public void testCreateClassLoaderWithExistingBuildSource() {
- List testBuildSourceDependencies = ['dep1' as File]
- checkCreateClassLoader(testBuildSourceDependencies)
- }
-
- private checkCreateClassLoader(List expectedTestDependencies) {
+ @Test public void testCreateClassLoader() {
+ URLClassLoader createdClassLoader = null;
Set testFiles = [new File('/root/f1'), new File('/root/f2')] as Set
- File expectedBuildResolverDir = 'expectedBuildResolverDir' as File
- StartParameter expectedStartParameter = settings.buildSrcStartParameter.newInstance();
- expectedStartParameter.setCurrentDir(new File(settingsDir, DefaultSettings.DEFAULT_BUILD_SRC_DIR))
- ConfigurationResolver configuration = context.mock(ConfigurationResolver.class)
- context.checking {
- allowing(dependencyManagerMock).getBuildResolverDir(); will(returnValue(expectedBuildResolverDir))
- allowing(dependencyManagerMock).configuration(DefaultSettings.BUILD_CONFIGURATION)
- will(returnValue(configuration))
- allowing(configuration).getFiles()
- will(returnValue(testFiles))
- }
- URLClassLoader createdClassLoader = null
+ ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader()
+ try {
+ ConfigurationResolver configuration = context.mock(ConfigurationResolver.class)
+ context.checking {
+ allowing(dependencyManagerMock).configuration(DefaultSettings.BUILD_CONFIGURATION)
+ will(returnValue(configuration))
+ allowing(configuration).getFiles()
+ will(returnValue(testFiles))
+ }
- context.checking {
- one(buildSourceBuilderMock).createBuildSourceClasspath(expectedStartParameter)
- will(returnValue(expectedTestDependencies))
+ createdClassLoader = settings.createClassLoader()
+ } finally {
+ Thread.currentThread().setContextClassLoader(originalClassLoader)
}
- createdClassLoader = settings.createClassLoader()
-
Set urls = createdClassLoader.URLs as HashSet
- (testFiles + expectedTestDependencies).collect() {File file -> file.toURI().toURL()}.each {
+ testFiles.collect() {File file -> file.toURI().toURL()}.each {
assert urls.contains(it)
}
}