diff --git a/src/main/kotlin/com/beust/kobalt/Main.kt b/src/main/kotlin/com/beust/kobalt/Main.kt index a04617c5..2578d34d 100644 --- a/src/main/kotlin/com/beust/kobalt/Main.kt +++ b/src/main/kotlin/com/beust/kobalt/Main.kt @@ -64,6 +64,13 @@ private class Main @Inject constructor( public fun run(jc: JCommander, args: Args) : Int { + // + // Add all the plugins read in plugin.xml to the Plugins singleton, so that code + // in the build file that calls Plugins.findPlugin() can find them (code in the + // build file do not have access to the KobaltContext). + // + pluginInfo.plugins.forEach { Plugins.addPluginInstance(it) } + if (args.client) { client.run() return 0 diff --git a/src/main/kotlin/com/beust/kobalt/Plugins.kt b/src/main/kotlin/com/beust/kobalt/Plugins.kt index e0d0821e..58f486e4 100644 --- a/src/main/kotlin/com/beust/kobalt/Plugins.kt +++ b/src/main/kotlin/com/beust/kobalt/Plugins.kt @@ -11,13 +11,7 @@ import com.beust.kobalt.maven.LocalRepo import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KobaltExecutors import com.beust.kobalt.misc.log -import com.beust.kobalt.plugin.DefaultPlugin -import com.beust.kobalt.plugin.android.AndroidPlugin -import com.beust.kobalt.plugin.application.ApplicationPlugin -import com.beust.kobalt.plugin.java.JavaPlugin -import com.beust.kobalt.plugin.kotlin.KotlinPlugin -import com.beust.kobalt.plugin.packaging.PackagingPlugin -import com.beust.kobalt.plugin.publish.PublishPlugin +import com.beust.kobalt.plugin.KobaltDefaultPlugin import com.google.inject.Provider import java.io.FileInputStream import java.lang.reflect.Method @@ -44,25 +38,10 @@ public class Plugins @Inject constructor (val taskManagerProvider : Provider>( - DefaultPlugin::class.java, - JavaPlugin::class.java, - KotlinPlugin::class.java, - PackagingPlugin::class.java, - PublishPlugin::class.java, - AndroidPlugin::class.java, - ApplicationPlugin::class.java -// AptPlugin::class.java - ).map { - addPluginInstance(Kobalt.INJECTOR.getInstance(it)) - } - } - val plugins : List get() = ArrayList(pluginMap.values) @@ -71,7 +50,7 @@ public class Plugins @Inject constructor (val taskManagerProvider : Provider = arrayListOf() - val defaultPlugin : Plugin get() = findPlugin(DefaultPlugin.NAME)!! + val defaultPlugin : Plugin get() = findPlugin(KobaltDefaultPlugin.NAME)!! fun findPlugin(name: String) : Plugin? = pluginMap[name] } diff --git a/src/main/kotlin/com/beust/kobalt/api/KobaltPluginXml.kt b/src/main/kotlin/com/beust/kobalt/api/KobaltPluginXml.kt index 3c13f21f..273fb8dc 100644 --- a/src/main/kotlin/com/beust/kobalt/api/KobaltPluginXml.kt +++ b/src/main/kotlin/com/beust/kobalt/api/KobaltPluginXml.kt @@ -1,5 +1,6 @@ package com.beust.kobalt.api +import com.beust.kobalt.Plugins import com.beust.kobalt.maven.IClasspathDependency import java.io.File import java.io.InputStream @@ -74,17 +75,20 @@ class KobaltPluginXml { @XmlElement @JvmField var name: String? = null + @XmlElement(name = "plugins") @JvmField + var plugins : ClassNameXml? = null + @XmlElement(name = "factory-class-name") @JvmField var factoryClassName: String? = null @XmlElement(name = "classpath-contributors") @JvmField - var classpathContributors : ContributorsXml? = null + var classpathClassName: ClassNameXml? = null @XmlElement(name = "project-contributors") @JvmField - var projectContributors : ContributorsXml? = null + var projectClassName: ClassNameXml? = null @XmlElement(name = "init-contributors") @JvmField - var initContributors : ContributorsXml? = null + var initClassName: ClassNameXml? = null } class ContributorXml { @@ -92,7 +96,7 @@ class ContributorXml { val name: String? = null } -class ContributorsXml { +class ClassNameXml { @XmlElement(name = "class-name") @JvmField var className: List = arrayListOf() } @@ -103,6 +107,7 @@ class ContributorsXml { * needs to access plug-in info can then just inject a PluginInfo object. */ class PluginInfo(val xml: KobaltPluginXml) { + val plugins = arrayListOf() val projectContributors = arrayListOf() val classpathContributors = arrayListOf() val initContributors = arrayListOf() @@ -141,13 +146,16 @@ class PluginInfo(val xml: KobaltPluginXml) { init { val factory = Class.forName(xml.factoryClassName).newInstance() as IFactory - xml.classpathContributors?.className?.forEach { + xml.plugins?.className?.forEach { + plugins.add(factory.instanceOf(Class.forName(it)) as Plugin) + } + xml.classpathClassName?.className?.forEach { classpathContributors.add(factory.instanceOf(Class.forName(it)) as IClasspathContributor) } - xml.projectContributors?.className?.forEach { + xml.projectClassName?.className?.forEach { projectContributors.add(factory.instanceOf(Class.forName(it)) as IProjectContributor) } - xml.initContributors?.className?.forEach { + xml.initClassName?.className?.forEach { initContributors.add(factory.instanceOf(Class.forName(it)) as IInitContributor) } } diff --git a/src/main/kotlin/com/beust/kobalt/misc/MainModule.kt b/src/main/kotlin/com/beust/kobalt/misc/MainModule.kt index 1e4f7f03..9ee9220b 100644 --- a/src/main/kotlin/com/beust/kobalt/misc/MainModule.kt +++ b/src/main/kotlin/com/beust/kobalt/misc/MainModule.kt @@ -5,10 +5,7 @@ import com.beust.kobalt.api.PluginInfo import com.beust.kobalt.kotlin.BuildFileCompiler import com.beust.kobalt.maven.* import com.beust.kobalt.plugin.publish.JCenterApi -import com.google.inject.AbstractModule -import com.google.inject.BindingAnnotation -import com.google.inject.Provider -import com.google.inject.TypeLiteral +import com.google.inject.* import com.google.inject.assistedinject.FactoryModuleBuilder import java.util.concurrent.ExecutorService @@ -54,7 +51,7 @@ public open class MainModule(val args: Args) : AbstractModule() { }) bind(PluginInfo::class.java).toProvider(object: Provider { override fun get(): PluginInfo? = PluginInfo.readKobaltPluginXml() - }) + }).`in`(Singleton::class.java) // bindListener(Matchers.any(), object: TypeListener { diff --git a/src/main/kotlin/com/beust/kobalt/plugin/DefaultPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/KobaltDefaultPlugin.kt similarity index 77% rename from src/main/kotlin/com/beust/kobalt/plugin/DefaultPlugin.kt rename to src/main/kotlin/com/beust/kobalt/plugin/KobaltDefaultPlugin.kt index 2c856f1e..17ea3c87 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/DefaultPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/KobaltDefaultPlugin.kt @@ -7,9 +7,9 @@ import javax.inject.Singleton * This plugin is used to gather tasks defined in build files, since these tasks don't really belong to any plugin. */ @Singleton -public class DefaultPlugin : BasePlugin() { +public class KobaltDefaultPlugin : BasePlugin() { companion object { - public val NAME = "Default" + public val NAME = "Kobalt default" } override val name: String get() = NAME diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 9c79eadd..953ef677 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -1,6 +1,15 @@ kobalt com.beust.kobalt.api.ContributorFactory + + com.beust.kobalt.plugin.android.AndroidPlugin + com.beust.kobalt.plugin.application.ApplicationPlugin + com.beust.kobalt.plugin.KobaltDefaultPlugin + com.beust.kobalt.plugin.java.JavaPlugin + com.beust.kobalt.plugin.kotlin.KotlinPlugin + com.beust.kobalt.plugin.packaging.PackagingPlugin + com.beust.kobalt.plugin.publish.PublishPlugin + com.beust.kobalt.plugin.android.AndroidPlugin com.beust.kobalt.plugin.kotlin.KotlinPlugin