diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index b6a58554..65d29bc0 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -117,6 +117,7 @@ val kobaltPluginApi = project { "org.testng:testng:${Versions.testng}" ) exclude(*aether("impl", "spi", "util", "api")) + compile("org.jetbrains.kotlin:kotlin-stdlib:1.1.1") } @@ -180,6 +181,7 @@ val kobaltApp = project(kobaltPluginApi, wrapper) { // "org.glassfish.jersey.media:jersey-media-moxy:${Versions.jersey}", // "org.wasabi:wasabi:0.1.182" ) + compile("org.jetbrains.kotlin:kotlin-stdlib:1.1.1") } @@ -188,6 +190,7 @@ val kobaltApp = project(kobaltPluginApi, wrapper) { "org.assertj:assertj-core:3.4.1", *mavenResolver("util") ) + compile("org.jetbrains.kotlin:kotlin-test:1.1.1") } assemble { diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/AetherDependency.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/AetherDependency.kt index 8fc960dc..cc9631da 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/AetherDependency.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/AetherDependency.kt @@ -1,5 +1,6 @@ package com.beust.kobalt.maven.aether +import com.beust.kobalt.Args import com.beust.kobalt.api.Dependencies import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.Kobalt @@ -7,10 +8,12 @@ import com.beust.kobalt.maven.CompletedFuture import com.beust.kobalt.misc.StringVersion import com.beust.kobalt.misc.warn import org.eclipse.aether.artifact.Artifact +import org.eclipse.aether.artifact.DefaultArtifact +import org.eclipse.aether.resolution.DependencyResolutionException import java.io.File import java.util.concurrent.Future -class AetherDependency(val artifact: Artifact, override val optional: Boolean = false) +class AetherDependency(val artifact: Artifact, override val optional: Boolean = false, val args: Args? = null) : IClasspathDependency, Comparable { val aether: KobaltMavenResolver get() = Kobalt.INJECTOR.getInstance(KobaltMavenResolver::class.java) @@ -25,12 +28,37 @@ class AetherDependency(val artifact: Artifact, override val optional: Boolean = override val jarFile: Future get() = if (artifact.file != null) { + resolveSourcesIfNeeded() CompletedFuture(artifact.file) } else { - val td = aether.resolve(artifact, null) + resolveSourcesIfNeeded() + val td = aether.resolve(artifact) CompletedFuture(td.root.artifact.file) } + private fun resolveSourcesIfNeeded() { + if (args?.downloadSources ?: false) { + artifact.toSourcesArtifact().let { sourcesArtifact -> + if (sourcesArtifact.file == null) { + try { + aether.resolve(sourcesArtifact) + } catch(e: DependencyResolutionException) { + //do nothing + } + } + } + artifact.toJavaDocArtifact().let { javadocArtifact -> + if (javadocArtifact.file == null) { + try { + aether.resolve(javadocArtifact) + } catch(e: DependencyResolutionException) { + //do nothing + } + } + } + } + } + override fun toMavenDependencies(scope: String?) : org.apache.maven.model.Dependency { val passedScope = scope val op = this.optional @@ -69,4 +97,7 @@ class AetherDependency(val artifact: Artifact, override val optional: Boolean = override fun equals(other: Any?) = if (other is AetherDependency) other.id == id else false override fun toString() = id + + fun Artifact.toSourcesArtifact() = DefaultArtifact(groupId, artifactId, "sources", extension, version) + fun Artifact.toJavaDocArtifact() = DefaultArtifact(groupId, artifactId, "javadoc", extension, version) } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/KobaltMavenResolver.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/KobaltMavenResolver.kt index 12ace363..46c43272 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/KobaltMavenResolver.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/KobaltMavenResolver.kt @@ -41,7 +41,6 @@ class KobaltMavenResolver @Inject constructor(val settings: KobaltSettings, repos: List = emptyList()): DependencyResult { val dependencyRequest = DependencyRequest(createCollectRequest(id, scope, repos), filter) val result = system.resolveDependencies(session, dependencyRequest) - // GraphUtil.displayGraph(listOf(result.root), { it -> it.children }, // { it: DependencyNode, indent: String -> println(indent + it.toString()) }) return result @@ -88,7 +87,7 @@ class KobaltMavenResolver @Inject constructor(val settings: KobaltSettings, /** * Create an IClasspathDependency from a Kobalt id. */ - fun create(id: String, optional: Boolean) = AetherDependency(DefaultArtifact(id), optional) + fun create(id: String, optional: Boolean) = AetherDependency(DefaultArtifact(id), optional, args) private val system = Booter.newRepositorySystem() private val session = Booter.newRepositorySystemSession(system, localRepo.localRepo, settings, eventBus) @@ -109,14 +108,8 @@ class KobaltMavenResolver @Inject constructor(val settings: KobaltSettings, private fun createCollectRequest(id: String, scope: Scope? = null, repos: List = emptyList()) = CollectRequest().apply { val allIds = arrayListOf(MavenId.toMavenId(id)) - if (args.downloadSources) { - listOf("sources", "javadoc").forEach { - val artifact = DefaultArtifact(id) - val sourceArtifact = DefaultArtifact(artifact.groupId, artifact.artifactId, it, artifact.extension, - artifact.version) - allIds.add(sourceArtifact.toString()) - } - } + + dependencies = allIds.map { Dependency(DefaultArtifact(it), scope?.scope) } root = Dependency(DefaultArtifact(MavenId.toMavenId(id)), scope?.scope) repositories = kobaltRepositories + repos.map { createRepo(HostConfig(it)) } diff --git a/src/main/kotlin/com/beust/kobalt/app/remote/GetDependencyGraphHandler.kt b/src/main/kotlin/com/beust/kobalt/app/remote/GetDependencyGraphHandler.kt index 1a2ac3b7..3ac7c256 100644 --- a/src/main/kotlin/com/beust/kobalt/app/remote/GetDependencyGraphHandler.kt +++ b/src/main/kotlin/com/beust/kobalt/app/remote/GetDependencyGraphHandler.kt @@ -26,6 +26,7 @@ class GetDependencyGraphHandler : WebSocketListener { val PARAMETER_PROJECT_ROOT = "projectRoot" val PARAMETER_BUILD_FILE = "buildFile" // Deprecated val PARAMETER_PROFILES = "profiles" + val PARAMETER_DOWNLOAD_SOURCES = "downloadSources" var session: Session? = null @@ -46,6 +47,7 @@ class GetDependencyGraphHandler : WebSocketListener { } private fun findProfiles(map: Map>) = map[PARAMETER_PROFILES]?.getOrNull(0) + private fun findDownloadSources(map: Map>) = map[PARAMETER_DOWNLOAD_SOURCES]?.getOrNull(0)?.toBoolean() ?: false private fun findBuildFile(map: Map>) : BuildSources? { val projectRoot = map[PARAMETER_PROJECT_ROOT] @@ -66,6 +68,7 @@ class GetDependencyGraphHandler : WebSocketListener { val parameterMap = s.upgradeRequest.parameterMap val buildSources = findBuildFile(parameterMap) val profiles = findProfiles(parameterMap) + val downloadSources = findDownloadSources(s.upgradeRequest.parameterMap) fun getInstance(cls: Class) : T = Kobalt.INJECTOR.getInstance(cls) @@ -91,6 +94,7 @@ class GetDependencyGraphHandler : WebSocketListener { val args = getInstance(Args::class.java) args.buildFile = buildSources.root.absolutePath args.profiles = profiles + args.downloadSources = downloadSources val projectResults = projectFinder.initForBuildFile(buildSources, args)