package org.gradle.testkit.functional.internal.classpath; import org.gradle.api.Transformer; import org.gradle.internal.UncheckedException; import org.gradle.internal.classloader.ClasspathUtil; import org.gradle.testkit.functional.internal.GradleHandle; import org.gradle.testkit.functional.internal.GradleHandleFactory; import org.gradle.util.CollectionUtils; import org.gradle.util.GFileUtils; import java.io.File; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.List; public class ClasspathInjectingGradleHandleFactory implements GradleHandleFactory { private final ClassLoader classLoader; private final GradleHandleFactory delegateFactory; public ClasspathInjectingGradleHandleFactory(ClassLoader classLoader, GradleHandleFactory delegateFactory) { this.classLoader = classLoader; this.delegateFactory = delegateFactory; } public GradleHandle start(File directory, List<String> arguments) { File testKitDir = new File(directory, ".gradle-test-kit"); if (!testKitDir.exists()) { GFileUtils.mkdirs(testKitDir); } File initScript = new File(testKitDir, "init.gradle"); new ClasspathAddingInitScriptBuilder().build(initScript, getClasspathAsFiles()); List<String> ammendedArguments = new ArrayList<String>(arguments.size() + 2); ammendedArguments.add("-I"); ammendedArguments.add(initScript.getAbsolutePath()); ammendedArguments.addAll(arguments); return delegateFactory.start(directory, ammendedArguments); } private List<File> getClasspathAsFiles() { List<URL> classpathUrls = ClasspathUtil.getClasspath(classLoader); return CollectionUtils.collect(classpathUrls, new ArrayList<File>(classpathUrls.size()), new Transformer<File, URL>() { public File transform(URL url) { try { return new File(url.toURI()); } catch (URISyntaxException e) { throw UncheckedException.throwAsUncheckedException(e); } } }); } }