first class loader wrapper implementation

This commit is contained in:
Nikita Skvortsov
2013-05-29 20:15:32 +04:00
committed by Nikita Skvortsov
parent 7e36547b38
commit 308c12f45c
4 changed files with 35 additions and 4 deletions
@@ -0,0 +1,5 @@
<root>
<item name='org.gradle.api.Project org.gradle.api.artifacts.dsl.DependencyHandler getDependencies()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>
@@ -20,6 +20,11 @@
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>gradle-api</artifactId>
@@ -3,11 +3,32 @@ package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.artifacts.ConfigurationContainer
import org.gradle.api.artifacts.Dependency
import org.gradle.api.specs.Spec
import java.io.File
import java.net.URL
open class KotlinPluginWrapper: Plugin<Project> {
public override fun apply(project: Project) {
val dependencyHandler : DependencyHandler = project.getDependencies()
dependencyHandler.create("org.jetbrains.kotlin:kotlin-gradle-plugin-core:0.1-SNAPSHOT")
val dependencyHandler : DependencyHandler = project.getDependencies()!!
val configurationsContainer : ConfigurationContainer = project.getConfigurations()!!
val dependency = dependencyHandler.create("org.jetbrains.kotlin:kotlin-gradle-plugin-core:0.1-SNAPSHOT")
val configuration = configurationsContainer.detachedConfiguration(dependency)!!
val kotlinPluginDependencies : List<URL> = configuration.getResolvedConfiguration()!!.getFiles(KSpec({ dep -> true }))!!.map({(f: File):URL -> f.toURI().toURL() })
val kotlinPluginClassloader = ParentLastURLClassLoader(kotlinPluginDependencies, getClass().getClassLoader())
val cls = Class.forName("org.jetbrains.kotlin.gradle.plugin.KotlinPlugin", true, kotlinPluginClassloader)
val pluginInstance = cls.newInstance()
val applyMethod = cls.getMethod("apply", javaClass<Project>())
applyMethod.invoke(pluginInstance, project);
}
}
}
open class KSpec<T: Any?>(val predicate: (T) -> Boolean): Spec<T> {
public override fun isSatisfiedBy(p0: T?): Boolean {
return p0 != null && predicate(p0)
}
}