From 7e36547b3861bf9e59bd10fe4e87e19d2b95a9b8 Mon Sep 17 00:00:00 2001 From: Nikita Skvortsov Date: Wed, 29 May 2013 19:47:42 +0400 Subject: [PATCH] Added wrapper module for gradle plugin --- libraries/pom.xml | 1 + .../org/gradle/api/annotations.xml | 18 +++ .../org/gradle/api/file/annotations.xml | 5 + .../api/initialization/dsl/annotations.xml | 7 ++ .../org/gradle/api/internal/annotations.xml | 15 +++ .../api/internal/project/annotations.xml | 5 + .../org/gradle/api/logging/annotations.xml | 5 + .../org/gradle/api/plugins/annotations.xml | 22 ++++ .../org/gradle/api/tasks/annotations.xml | 7 ++ .../gradle/api/tasks/compile/annotations.xml | 5 + libraries/tools/kotlin-gradle-plugin/pom.xml | 107 ++++++++++++++++++ .../ParentLastURLClassLoader.java | 74 ++++++++++++ .../gradle/plugin/KotlinPluginWrapper.kt | 13 +++ .../META-INF/gradle-plugins/kotlin.properties | 2 +- 14 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/annotations.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/file/annotations.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/initialization/dsl/annotations.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/annotations.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/project/annotations.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/logging/annotations.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/plugins/annotations.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/tasks/annotations.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/tasks/compile/annotations.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/pom.xml create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/java/org/jetbrains/kotlin/gradle/classloaders/ParentLastURLClassLoader.java create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt rename libraries/tools/{kotlin-gradle-plugin-core => kotlin-gradle-plugin}/src/main/resources/META-INF/gradle-plugins/kotlin.properties (85%) diff --git a/libraries/pom.xml b/libraries/pom.xml index 560c1a1e5e6..48652d81263 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -56,6 +56,7 @@ tools/kotlin-compiler tools/kotlin-jdk-annotations tools/runtime + tools/kotlin-gradle-plugin tools/kotlin-gradle-plugin-core tools/kotlin-maven-plugin tools/kotlin-js-library diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/annotations.xml new file mode 100644 index 00000000000..dc5cd1bbcbe --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/annotations.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/file/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/file/annotations.xml new file mode 100644 index 00000000000..dea5cec6774 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/file/annotations.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/initialization/dsl/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/initialization/dsl/annotations.xml new file mode 100644 index 00000000000..a33a584b9ed --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/initialization/dsl/annotations.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/annotations.xml new file mode 100644 index 00000000000..c14ebed20ae --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/annotations.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/project/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/project/annotations.xml new file mode 100644 index 00000000000..6595499a4a1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/project/annotations.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/logging/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/logging/annotations.xml new file mode 100644 index 00000000000..87c8bc5da18 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/logging/annotations.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/plugins/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/plugins/annotations.xml new file mode 100644 index 00000000000..5859b33807e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/plugins/annotations.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/tasks/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/tasks/annotations.xml new file mode 100644 index 00000000000..67bc433ea20 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/tasks/annotations.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/tasks/compile/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/tasks/compile/annotations.xml new file mode 100644 index 00000000000..812dfa500fa --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/tasks/compile/annotations.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/pom.xml b/libraries/tools/kotlin-gradle-plugin/pom.xml new file mode 100644 index 00000000000..543601c16bb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/pom.xml @@ -0,0 +1,107 @@ + + + + + 4.0.0 + + 3.0.4 + + + + org.jetbrains.kotlin + kotlin-project + 0.1-SNAPSHOT + ../../pom.xml + + + kotlin-gradle-plugin-core + jar + + + + org.jetbrains.kotlin + gradle-api + 1.4 + provided + + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + + ${project.basedir}/src/main/resources + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${project.version} + + + ${basedir}/kotlinAnnotation + + + + + + compile + compile + compile + + + + test-compile + test-compile + test-compile + + + + + + maven-invoker-plugin + 1.8 + + ${project.build.directory}/it + local-repo + verify + + + + create_local + pre-integration-test + + install + + + + + + maven-failsafe-plugin + 2.6 + + + + integration-test + verify + + + + + + + + + + jetbrains-utils + http://repository.jetbrains.com/utils + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/java/org/jetbrains/kotlin/gradle/classloaders/ParentLastURLClassLoader.java b/libraries/tools/kotlin-gradle-plugin/src/main/java/org/jetbrains/kotlin/gradle/classloaders/ParentLastURLClassLoader.java new file mode 100644 index 00000000000..d71acde71e3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/java/org/jetbrains/kotlin/gradle/classloaders/ParentLastURLClassLoader.java @@ -0,0 +1,74 @@ +package org.jetbrains.kotlin.gradle.classloaders; + + +import java.net.URL; +import java.net.URLClassLoader; +import java.util.List; + +/** + * A parent-last classloader that will try the child classloader first and then the parent. + * This takes a fair bit of doing because java really prefers parent-first. + *

+ * For those not familiar with class loading trickery, be wary + */ +public class ParentLastURLClassLoader extends ClassLoader { + private ChildURLClassLoader childClassLoader; + + public ParentLastURLClassLoader(List classpath, ClassLoader parent) { + super(Thread.currentThread().getContextClassLoader()); + + URL[] urls = classpath.toArray(new URL[classpath.size()]); + + childClassLoader = new ChildURLClassLoader(urls, new FindClassClassLoader(parent)); + } + + @Override + protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + try { + // first we try to find a class inside the child classloader + return childClassLoader.findClass(name); + } catch (ClassNotFoundException e) { + // didn't find it, try the parent + return super.loadClass(name, resolve); + } + } + + /** + * This class allows me to call findClass on a classloader + */ + private static class FindClassClassLoader extends ClassLoader { + public FindClassClassLoader(ClassLoader parent) { + super(parent); + } + + @Override + public Class findClass(String name) throws ClassNotFoundException { + return super.findClass(name); + } + } + + /** + * This class delegates (child then parent) for the findClass method for a URLClassLoader. + * We need this because findClass is protected in URLClassLoader + */ + private static class ChildURLClassLoader extends URLClassLoader { + private FindClassClassLoader realParent; + + public ChildURLClassLoader(URL[] urls, FindClassClassLoader realParent) { + super(urls, null); + + this.realParent = realParent; + } + + @Override + public Class findClass(String name) throws ClassNotFoundException { + try { + // first try to use the URLClassLoader findClass + return super.findClass(name); + } catch (ClassNotFoundException e) { + // if that fails, we ask our real parent classloader to load the class (we give up) + return realParent.loadClass(name); + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt new file mode 100644 index 00000000000..611f34ad2aa --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -0,0 +1,13 @@ +package org.jetbrains.kotlin.gradle.plugin + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.dsl.DependencyHandler + +open class KotlinPluginWrapper: Plugin { + public override fun apply(project: Project) { + val dependencyHandler : DependencyHandler = project.getDependencies() + dependencyHandler.create("org.jetbrains.kotlin:kotlin-gradle-plugin-core:0.1-SNAPSHOT") + + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-core/src/main/resources/META-INF/gradle-plugins/kotlin.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin.properties similarity index 85% rename from libraries/tools/kotlin-gradle-plugin-core/src/main/resources/META-INF/gradle-plugins/kotlin.properties rename to libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin.properties index 4f8cd030af6..3a22596804f 100644 --- a/libraries/tools/kotlin-gradle-plugin-core/src/main/resources/META-INF/gradle-plugins/kotlin.properties +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin.properties @@ -1 +1 @@ -implementation-class=org.jetbrains.kotlin.gradle.plugin.KotlinPlugin \ No newline at end of file +implementation-class=org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper \ No newline at end of file