From fcfa0653a2edcc64d9d33db51febb33eb78c7348 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Mon, 30 Nov 2015 17:21:58 -0800 Subject: [PATCH] Fold IInitContributor into IAffinity. --- .../com/beust/kobalt/ProjectGenerator.kt | 25 ++----------------- .../kotlin/com/beust/kobalt/api/IAffinity.kt | 10 +++----- .../beust/kobalt/api/ICompilerContributor.kt | 2 +- .../com/beust/kobalt/api/IDocContributor.kt | 2 +- .../com/beust/kobalt/api/IInitContributor.kt | 9 +------ .../com/beust/kobalt/api/IProjectAffinity.kt | 12 +++++++++ .../beust/kobalt/api/IRunnerContributor.kt | 2 +- .../com/beust/kobalt/api/ISimpleAffinity.kt | 12 +++++++++ .../kobalt/api/ITestRunnerContributor.kt | 2 +- .../com/beust/kobalt/internal/ActorUtils.kt | 11 ++++++-- .../beust/kobalt/internal/BuildGenerator.kt | 4 +-- .../com/beust/kobalt/internal/JUnitRunner.kt | 2 +- .../beust/kobalt/internal/KobaltPluginXml.kt | 5 ++-- .../com/beust/kobalt/internal/TestNgRunner.kt | 2 +- .../kobalt/plugin/android/AndroidPlugin.kt | 1 - 15 files changed, 51 insertions(+), 50 deletions(-) create mode 100644 src/main/kotlin/com/beust/kobalt/api/IProjectAffinity.kt create mode 100644 src/main/kotlin/com/beust/kobalt/api/ISimpleAffinity.kt diff --git a/src/main/kotlin/com/beust/kobalt/ProjectGenerator.kt b/src/main/kotlin/com/beust/kobalt/ProjectGenerator.kt index f6528681..1b97f97f 100644 --- a/src/main/kotlin/com/beust/kobalt/ProjectGenerator.kt +++ b/src/main/kotlin/com/beust/kobalt/ProjectGenerator.kt @@ -1,12 +1,11 @@ package com.beust.kobalt -import com.beust.kobalt.api.IInitContributor +import com.beust.kobalt.internal.ActorUtils import com.beust.kobalt.internal.PluginInfo import com.beust.kobalt.misc.log import com.google.inject.Inject import java.io.File import java.io.FileOutputStream -import java.util.* /** * Invoked with --init. Generate a new project. @@ -25,7 +24,7 @@ public class ProjectGenerator @Inject constructor(val pluginInfo: PluginInfo){ } fun run(args: Args) { - val contributor = findBestInitContributor(File(".")) + val contributor = ActorUtils.selectAffinityActor(pluginInfo.initContributors, File(".")) if (contributor != null) { contributor.generateBuildFile(FileOutputStream(File(args.buildFile))) log(1, "Created ${args.buildFile}") @@ -33,25 +32,5 @@ public class ProjectGenerator @Inject constructor(val pluginInfo: PluginInfo){ log(1, "Couldn't identify project, not generating any build file") } } - - /** - * Run through all the IInitContributors and return the best one. - */ - private fun findBestInitContributor(dir: File) : IInitContributor? { - val result = arrayListOf>() - pluginInfo.initContributors.forEach { - it.filesManaged(dir).let { count -> - if (count > 0) { - result.add(Pair(it, count)) - } - } - } - if (result.size > 0) { - Collections.sort(result, { p1, p2 -> p2.second.compareTo(p1.second) }) - return result[0].first - } else { - return null - } - } } diff --git a/src/main/kotlin/com/beust/kobalt/api/IAffinity.kt b/src/main/kotlin/com/beust/kobalt/api/IAffinity.kt index abc9b5a5..e02d54bb 100644 --- a/src/main/kotlin/com/beust/kobalt/api/IAffinity.kt +++ b/src/main/kotlin/com/beust/kobalt/api/IAffinity.kt @@ -1,5 +1,8 @@ package com.beust.kobalt.api +/** + * Base interface for affinity interfaces. + */ interface IAffinity { companion object { /** @@ -8,10 +11,5 @@ interface IAffinity { */ const val DEFAULT_POSITIVE_AFFINITY = 100 } - - /** - * @return an integer indicating the affinity of your actor for the given project. The actor that returns - * the highest affinity gets selected. - */ - fun affinity(project: Project, context: KobaltContext) : Int } + diff --git a/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt b/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt index e9b0982f..1de85643 100644 --- a/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt +++ b/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt @@ -4,6 +4,6 @@ import com.beust.kobalt.TaskResult import com.beust.kobalt.api.IClasspathDependency import java.io.File -interface ICompilerContributor : IAffinity { +interface ICompilerContributor : IProjectAffinity { fun compile(project: Project, context: KobaltContext, info: CompilerActionInfo) : TaskResult } diff --git a/src/main/kotlin/com/beust/kobalt/api/IDocContributor.kt b/src/main/kotlin/com/beust/kobalt/api/IDocContributor.kt index df28f9c5..8979783f 100644 --- a/src/main/kotlin/com/beust/kobalt/api/IDocContributor.kt +++ b/src/main/kotlin/com/beust/kobalt/api/IDocContributor.kt @@ -2,7 +2,7 @@ package com.beust.kobalt.api import com.beust.kobalt.TaskResult -interface IDocContributor : IAffinity { +interface IDocContributor : IProjectAffinity { fun generateDoc(project: Project, context: KobaltContext, info: CompilerActionInfo) : TaskResult } diff --git a/src/main/kotlin/com/beust/kobalt/api/IInitContributor.kt b/src/main/kotlin/com/beust/kobalt/api/IInitContributor.kt index cc03702d..4d537107 100644 --- a/src/main/kotlin/com/beust/kobalt/api/IInitContributor.kt +++ b/src/main/kotlin/com/beust/kobalt/api/IInitContributor.kt @@ -1,19 +1,12 @@ package com.beust.kobalt.api -import java.io.File import java.io.OutputStream /** * Plugins that want to participate in the --init process (they can generate files to initialize * a new project). */ -interface IInitContributor : IContributor { - /** - * How many files your plug-in understands in the given directory. The contributor with the - * highest number will be asked to generate the build file. - */ - fun filesManaged(dir: File): Int - +interface IInitContributor : ISimpleAffinity { /** * Generate the Build.kt file into the given OutputStream. */ diff --git a/src/main/kotlin/com/beust/kobalt/api/IProjectAffinity.kt b/src/main/kotlin/com/beust/kobalt/api/IProjectAffinity.kt new file mode 100644 index 00000000..4e667b6e --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/api/IProjectAffinity.kt @@ -0,0 +1,12 @@ +package com.beust.kobalt.api + +/** + * An affinity interface that uses a project and a context to calculate its affinity. + */ +interface IProjectAffinity : IAffinity { + /** + * @return an integer indicating the affinity of your actor for the given project. The actor that returns + * the highest affinity gets selected. + */ + fun affinity(project: Project, context: KobaltContext) : Int +} diff --git a/src/main/kotlin/com/beust/kobalt/api/IRunnerContributor.kt b/src/main/kotlin/com/beust/kobalt/api/IRunnerContributor.kt index 5f094758..5ab88cb0 100644 --- a/src/main/kotlin/com/beust/kobalt/api/IRunnerContributor.kt +++ b/src/main/kotlin/com/beust/kobalt/api/IRunnerContributor.kt @@ -6,7 +6,7 @@ import com.beust.kobalt.api.IClasspathDependency /** * Plugins that can run a project (task "run" or "test") should implement this interface. */ -interface IRunnerContributor : IContributor, IAffinity { +interface IRunnerContributor : IContributor, IProjectAffinity { /** * Run the project. */ diff --git a/src/main/kotlin/com/beust/kobalt/api/ISimpleAffinity.kt b/src/main/kotlin/com/beust/kobalt/api/ISimpleAffinity.kt new file mode 100644 index 00000000..2711248b --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/api/ISimpleAffinity.kt @@ -0,0 +1,12 @@ +package com.beust.kobalt.api + +/** + * An affinity interface that gets run without a project nor a context. + */ +interface ISimpleAffinity : IAffinity { + /** + * @return an integer indicating the affinity of your actor. The actor that returns + * the highest affinity gets selected. + */ + fun affinity(arg: T) : Int +} \ No newline at end of file diff --git a/src/main/kotlin/com/beust/kobalt/api/ITestRunnerContributor.kt b/src/main/kotlin/com/beust/kobalt/api/ITestRunnerContributor.kt index fe018238..52bc9551 100644 --- a/src/main/kotlin/com/beust/kobalt/api/ITestRunnerContributor.kt +++ b/src/main/kotlin/com/beust/kobalt/api/ITestRunnerContributor.kt @@ -5,7 +5,7 @@ import com.beust.kobalt.TaskResult /** * Plugins that can run a project (task "run" or "test") should implement this interface. */ -interface ITestRunnerContributor : IContributor, IAffinity { +interface ITestRunnerContributor : IContributor, IProjectAffinity { /** * Run the project. */ diff --git a/src/main/kotlin/com/beust/kobalt/internal/ActorUtils.kt b/src/main/kotlin/com/beust/kobalt/internal/ActorUtils.kt index 396ae3d4..6216ecfb 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/ActorUtils.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/ActorUtils.kt @@ -1,6 +1,7 @@ package com.beust.kobalt.internal -import com.beust.kobalt.api.IAffinity +import com.beust.kobalt.api.IProjectAffinity +import com.beust.kobalt.api.ISimpleAffinity import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project @@ -9,7 +10,13 @@ class ActorUtils { /** * Return the plug-in actor with the highest affinity. */ - fun selectAffinityActor(project: Project, context: KobaltContext, actors: List) : T? + fun selectAffinityActor(project: Project, context: KobaltContext, actors: List) = actors.maxBy { it.affinity(project, context) } + + /** + * Return the plug-in actor with the highest affinity. + */ + fun , A> selectAffinityActor(actors: List, arg: A) = actors.maxBy { it.affinity(arg) } } + } diff --git a/src/main/kotlin/com/beust/kobalt/internal/BuildGenerator.kt b/src/main/kotlin/com/beust/kobalt/internal/BuildGenerator.kt index df47c36d..6f28d461 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/BuildGenerator.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/BuildGenerator.kt @@ -11,7 +11,7 @@ import java.util.* /** * Abstract base class for the build generators that use build-template.mustache. */ -abstract class BuildGenerator : IInitContributor { +abstract class BuildGenerator : IInitContributor { abstract val defaultSourceDirectories : HashSet abstract val defaultTestDirectories : HashSet abstract val directive : String @@ -24,7 +24,7 @@ abstract class BuildGenerator : IInitContributor { } } - override fun filesManaged(dir: File) = KFiles.findRecursively(dir, fileMatch).size + override fun affinity(dir: File) = KFiles.findRecursively(dir, fileMatch).size private fun importPom(pomFile: File, mainDeps: ArrayList, testDeps: ArrayList, map: HashMap) { diff --git a/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt b/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt index 71abffbe..b4c28c7f 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt @@ -1,9 +1,9 @@ package com.beust.kobalt.internal import com.beust.kobalt.api.IAffinity +import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project -import com.beust.kobalt.api.IClasspathDependency public class JUnitRunner() : GenericTestRunner() { diff --git a/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt b/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt index 6f1f5316..7218836f 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt @@ -3,6 +3,7 @@ package com.beust.kobalt.internal import com.beust.kobalt.api.* import com.beust.kobalt.misc.log import java.io.ByteArrayInputStream +import java.io.File import java.io.InputStream import javax.xml.bind.JAXBContext import javax.xml.bind.annotation.XmlElement @@ -58,7 +59,7 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { val plugins = arrayListOf() val projectContributors = arrayListOf() val classpathContributors = arrayListOf() - val initContributors = arrayListOf() + val initContributors = arrayListOf>() val repoContributors = arrayListOf() val compilerFlagContributors = arrayListOf() val compilerInterceptors = arrayListOf() @@ -123,7 +124,7 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { if (this is IPlugin) plugins.add(this) if (this is IClasspathContributor) classpathContributors.add(this) if (this is IProjectContributor) projectContributors.add(this) - if (this is IInitContributor) initContributors.add(this) + if (this is IInitContributor<*>) initContributors.add(this as IInitContributor) if (this is IRepoContributor) repoContributors.add(this) if (this is ICompilerContributor) compilerContributors.add(this) if (this is ICompilerInterceptor) compilerInterceptors.add(this) diff --git a/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt b/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt index 7b8bf9ec..ea89a59a 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt @@ -1,9 +1,9 @@ package com.beust.kobalt.internal import com.beust.kobalt.api.IAffinity +import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project -import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.misc.KFiles import java.io.File diff --git a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt index e38c0f49..ab066f1f 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt @@ -6,7 +6,6 @@ import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Task import com.beust.kobalt.maven.MavenId import com.beust.kobalt.maven.dependency.FileDependency -import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.maven.dependency.MavenDependency import com.beust.kobalt.misc.* import com.beust.kobalt.plugin.java.JavaCompiler