diff --git a/src/main/scala/net/ladstatt/adash/ArtifactDashboard.scala b/src/main/scala/net/ladstatt/adash/ArtifactDashboard.scala index be6a620..e587fd0 100644 --- a/src/main/scala/net/ladstatt/adash/ArtifactDashboard.scala +++ b/src/main/scala/net/ladstatt/adash/ArtifactDashboard.scala @@ -38,11 +38,25 @@ trait AssetsResult[T] extends js.Object { def continuationToken: String } -case class MavenCoords(groupId: String +object MavenCoords { + + // convenience constructor + def apply(repo: String, groupId: String, artifactId: String, baseVersion: String): MavenCoords = { + MavenCoords(repo, groupId, artifactId, baseVersion, None, None) + } + +} + +case class MavenCoords(repo: String + , groupId: String , artifactId: String , baseVersion: String - , extension: String - , classifier: String) + , extension: Option[String] + , classifier: Option[String]) { + val asString = s"$groupId:$artifactId:$baseVersion:${extension.getOrElse("")}:${classifier.getOrElse("")}" +} + +case class NexusAsset(mavenCoords: MavenCoords, downloadUrl: String) object ArtifactDashboard { @@ -55,44 +69,59 @@ object ArtifactDashboard { // rest url which we'll use to retrieve information about assets val assetsSearchUri: String = "service/rest/v1/search/assets?" - private val artifact: MavenCoords = MavenCoords("net.ladstatt", "fx-animations", "1.0-SNAPSHOT", "jar", "jar-with-dependencies") + private val artifact: MavenCoords = MavenCoords("testrepo-snapshot", "net.ladstatt", "fx-animations", "1.0-SNAPSHOT", Option("jar"), Option("jar-with-dependencies")) + // some random artifact just to show the principle + private val artifact2: MavenCoords = MavenCoords("maven-public", "net.java.dev.jna", "jna", "4.1.0") + + val artifacts = Seq(artifact, artifact2) def main(args: Array[String]): Unit = { - queryNexus(artifact) onComplete { + Future.sequence(artifacts.map(queryNexus)) onComplete { case Failure(e) => org.scalajs.dom.window.alert(e.getMessage) - case Success(either) => either match { - case Left(e) => org.scalajs.dom.window.alert(e.getMessage) - case Right(downloadUrl) => - document.body.appendChild(a(artifact.artifactId, downloadUrl)) - } + case Success(assetsOrFailure) => + var errors = "" + assetsOrFailure foreach { + case Left(e) => errors = errors + e.getMessage + "\n" + case Right(nexusAsset) => + document.body.appendChild(a(nexusAsset.mavenCoords.asString, nexusAsset.downloadUrl)) + document.body.appendChild(br) + } + if (errors.nonEmpty) { + org.scalajs.dom.window.alert("Error(s): \n\n" + errors) + } + } } - def queryNexus(mvnCoords: MavenCoords): Future[Either[Throwable, String]] = { + def queryNexus(mvnCoords: MavenCoords): Future[Either[Throwable, NexusAsset]] = { val requestString = nexusBaseUrl + assetsSearchUri + - Map("repository" -> "testrepo-snapshot" + (Map("repository" -> mvnCoords.repo , "sort" -> "version" , "direction" -> "desc" , "maven.groupId" -> mvnCoords.groupId , "maven.artifactId" -> mvnCoords.artifactId - , "maven.baseVersion" -> mvnCoords.baseVersion - , "maven.extension" -> mvnCoords.extension - , "maven.classifier" -> mvnCoords.classifier).map { + , "maven.baseVersion" -> mvnCoords.baseVersion) ++ + (if (mvnCoords.extension.isDefined) Map("maven.extension" -> mvnCoords.extension.getOrElse("")) else Map()) ++ + (if (mvnCoords.classifier.isDefined) Map("maven.classifier" -> mvnCoords.classifier.getOrElse("")) else Map()) + ).map { case (k, v) => s"$k=$v" }.mkString("&") + // org.scalajs.dom.window.alert(requestString) Ajax.get(requestString).map { xml => val assetsResult = JSON.parse(xml.responseText).asInstanceOf[AssetsResult[Asset]] assetsResult.items.headOption match { case None => Left(new RuntimeException("No artifact with given coordinates found: " + mvnCoords)) - case Some(x) => Right(x.downloadUrl) + case Some(x) => Right(NexusAsset(mvnCoords, x.downloadUrl)) } } } + def br: Element = document.createElement("br") + def a(text: String, href: String): Element = { val a = document.createElement("a") a.textContent = text