From 5eb92ed10b5bf942db8adc5b99174bdd273e1a21 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Wed, 22 Jun 2016 01:29:11 -0800 Subject: [PATCH] Track dependencies downloaded on the server's websocket. --- .../beust/kobalt/internal/eventbus/Events.kt | 5 ++++ .../com/beust/kobalt/maven/aether/Aether.kt | 8 +++--- .../com/beust/kobalt/maven/aether/Booter.kt | 6 +++-- .../maven/aether/ConsoleRepositoryListener.kt | 11 +++++--- .../kotlin/com/beust/kobalt/app/MainModule.kt | 6 ++++- .../beust/kobalt/app/remote/SparkServer.kt | 26 ++++++++++++++++--- 6 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/eventbus/Events.kt diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/eventbus/Events.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/eventbus/Events.kt new file mode 100644 index 00000000..a57be9a2 --- /dev/null +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/eventbus/Events.kt @@ -0,0 +1,5 @@ +package com.beust.kobalt.internal.eventbus + +import org.eclipse.aether.repository.ArtifactRepository + +class ArtifactDownloadedEvent(val artifactId: String, val repository: ArtifactRepository) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Aether.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Aether.kt index f6259c44..dcb0ec48 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Aether.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Aether.kt @@ -13,6 +13,7 @@ import com.beust.kobalt.misc.KobaltLogger import com.beust.kobalt.misc.Versions import com.beust.kobalt.misc.log import com.beust.kobalt.misc.warn +import com.google.common.eventbus.EventBus import com.google.inject.Inject import com.google.inject.Singleton import org.eclipse.aether.artifact.Artifact @@ -73,9 +74,9 @@ class ExcludeOptionalDependencyFilter: DependencyFilter { } @Singleton -class Aether(val localRepo: File, val settings: KobaltSettings) { +class Aether(val localRepo: File, val settings: KobaltSettings, val eventBus: EventBus) { private val system = Booter.newRepositorySystem() - private val session = Booter.newRepositorySystemSession(system, localRepo, settings) + private val session = Booter.newRepositorySystemSession(system, localRepo, settings, eventBus) private val classpathFilter = AndDependencyFilter( ExcludeOptionalDependencyFilter(), DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE)) @@ -245,7 +246,8 @@ class AetherDependency(val artifact: Artifact): IClasspathDependency, Comparable fun main(argv: Array) { KobaltLogger.LOG_LEVEL = 1 val id = "org.testng:testng:6.9.11" - val aether = KobaltAether(KobaltSettings(KobaltSettingsXml()), Aether(File(homeDir(".aether")),KobaltSettings(KobaltSettingsXml()))) + val aether = KobaltAether(KobaltSettings(KobaltSettingsXml()), Aether(File(homeDir(".aether")), + KobaltSettings(KobaltSettingsXml()), EventBus())) val r = aether.resolve(id) val r2 = aether.resolve(id) val d = org.eclipse.aether.artifact.DefaultArtifact("org.testng:testng:6.9") diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Booter.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Booter.kt index 884c3977..0190eee6 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Booter.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Booter.kt @@ -1,6 +1,7 @@ package com.beust.kobalt.maven.aether import com.beust.kobalt.internal.KobaltSettings +import com.google.common.eventbus.EventBus import org.eclipse.aether.DefaultRepositorySystemSession import org.eclipse.aether.RepositorySystem import org.eclipse.aether.repository.LocalRepository @@ -15,14 +16,15 @@ object Booter { // return org.eclipse.aether.examples.plexus.PlexusRepositorySystemFactory.newRepositorySystem(); } - fun newRepositorySystemSession(system: RepositorySystem, repo: File, settings: KobaltSettings): DefaultRepositorySystemSession { + fun newRepositorySystemSession(system: RepositorySystem, repo: File, settings: KobaltSettings, + eventBus: EventBus): DefaultRepositorySystemSession { val session = MavenRepositorySystemUtils.newSession(settings) val localRepo = LocalRepository(repo.absolutePath) session.localRepositoryManager = system.newLocalRepositoryManager(session, localRepo) session.transferListener = ConsoleTransferListener() - session.repositoryListener = ConsoleRepositoryListener() + session.repositoryListener = ConsoleRepositoryListener(eventBus = eventBus) // uncomment to generate dirty trees // session.setDependencyGraphTransformer( null ); diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/ConsoleRepositoryListener.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/ConsoleRepositoryListener.kt index dc55b290..0fa2b981 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/ConsoleRepositoryListener.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/ConsoleRepositoryListener.kt @@ -1,6 +1,8 @@ package com.beust.kobalt.maven.aether +import com.beust.kobalt.internal.eventbus.ArtifactDownloadedEvent import com.beust.kobalt.misc.log +import com.google.common.eventbus.EventBus import org.eclipse.aether.AbstractRepositoryListener import org.eclipse.aether.RepositoryEvent import java.io.PrintStream @@ -8,7 +10,8 @@ import java.io.PrintStream /** * A simplistic repository listener that logs events to the console. */ -class ConsoleRepositoryListener @JvmOverloads constructor(out: PrintStream? = null) : AbstractRepositoryListener() { +class ConsoleRepositoryListener @JvmOverloads constructor(out: PrintStream? = null, val eventBus: EventBus) + : AbstractRepositoryListener() { companion object { val LOG_LEVEL = 4 } @@ -53,8 +56,10 @@ class ConsoleRepositoryListener @JvmOverloads constructor(out: PrintStream? = nu } override fun artifactDownloaded(event: RepositoryEvent?) { - if (event?.file != null) { - log(1, "Downloaded artifact " + event!!.artifact + " from " + event.repository) + if (event?.file != null && event?.artifact != null) { + val artifact = event!!.artifact + log(1, "Downloaded artifact " + artifact + " from " + event.repository) + eventBus.post(ArtifactDownloadedEvent(artifact.toString(), event.repository)) } } diff --git a/src/main/kotlin/com/beust/kobalt/app/MainModule.kt b/src/main/kotlin/com/beust/kobalt/app/MainModule.kt index 6453c331..83690225 100644 --- a/src/main/kotlin/com/beust/kobalt/app/MainModule.kt +++ b/src/main/kotlin/com/beust/kobalt/app/MainModule.kt @@ -12,6 +12,7 @@ import com.beust.kobalt.maven.aether.Aether import com.beust.kobalt.misc.DependencyExecutor import com.beust.kobalt.misc.KobaltExecutors import com.beust.kobalt.plugin.publish.BintrayApi +import com.google.common.eventbus.EventBus import com.google.inject.AbstractModule import com.google.inject.Provider import com.google.inject.Singleton @@ -49,13 +50,16 @@ public open class MainModule(val args: Args, val settings: KobaltSettings) : Abs bind(Args::class.java).toProvider(Provider { args }) + EventBus().let { eventBus -> + bind(EventBus::class.java).toInstance(eventBus) + bind(Aether::class.java).toInstance(Aether(settings.localRepo, settings, eventBus)) + } bind(PluginInfo::class.java).toProvider(Provider { PluginInfo.readKobaltPluginXml() }).`in`(Singleton::class.java) bind(KobaltSettings::class.java).toProvider(Provider { settings }).`in`(Singleton::class.java) - bind(Aether::class.java).toInstance(Aether(settings.localRepo,settings)) // bindListener(Matchers.any(), object: TypeListener { // override fun hear(typeLiteral: TypeLiteral?, typeEncounter: TypeEncounter?) { diff --git a/src/main/kotlin/com/beust/kobalt/app/remote/SparkServer.kt b/src/main/kotlin/com/beust/kobalt/app/remote/SparkServer.kt index 2396f963..5a9242bb 100644 --- a/src/main/kotlin/com/beust/kobalt/app/remote/SparkServer.kt +++ b/src/main/kotlin/com/beust/kobalt/app/remote/SparkServer.kt @@ -6,7 +6,10 @@ import com.beust.kobalt.api.Kobalt import com.beust.kobalt.api.Project import com.beust.kobalt.app.Templates import com.beust.kobalt.internal.PluginInfo +import com.beust.kobalt.internal.eventbus.ArtifactDownloadedEvent import com.google.common.collect.ListMultimap +import com.google.common.eventbus.EventBus +import com.google.common.eventbus.Subscribe import com.google.gson.Gson import org.eclipse.jetty.websocket.api.RemoteEndpoint import org.eclipse.jetty.websocket.api.Session @@ -105,10 +108,26 @@ class GetDependenciesChatHandler : WebSocketListener { if (buildFileParams != null) { val buildFile = buildFileParams[0] + fun getInstance(cls: Class) : T = Kobalt.INJECTOR.getInstance(cls) + val result = if (buildFile != null) { + // Track all the downloads that this dependency call might trigger and + // send them as a progress message to the web socket + val eventBus = getInstance(EventBus::class.java) + val busListener = object { + @Subscribe + fun onArtifactDownloaded(event: ArtifactDownloadedEvent) { + sendWebsocketCommand(s.remote, ProgressCommand.NAME, + ProgressCommand(null, "Downloaded " + event.artifactId)) + } + } + eventBus.register(busListener) + + // Get the dependencies for the requested build file and send progress to the web + // socket for each project try { - val dependencyData = Kobalt.INJECTOR.getInstance(DependencyData::class.java) - val args = Kobalt.INJECTOR.getInstance(Args::class.java) + val dependencyData = getInstance(DependencyData::class.java) + val args = getInstance(Args::class.java) dependencyData.dependenciesDataFor(buildFile, args, object : IProgressListener { override fun onProgress(progress: Int?, message: String?) { @@ -116,15 +135,16 @@ class GetDependenciesChatHandler : WebSocketListener { } }) } catch(ex: Exception) { + ex.printStackTrace() DependencyData.GetDependenciesData(errorMessage = ex.message) } finally { SparkServer.cleanUpCallback() + eventBus.unregister(busListener) } } else { DependencyData.GetDependenciesData( errorMessage = "buildFile wasn't passed in the query parameter") } - println("GOT DEPENDENCY DATA: $result") sendWebsocketCommand(s.remote, DependencyData.GetDependenciesData.NAME, result) s.close() }