Skip to content

Commit

Permalink
extend functionality to use maven artifacts without extension or clas…
Browse files Browse the repository at this point in the history
…sifier, parallelize
  • Loading branch information
rladstaetter committed Apr 13, 2020
1 parent 3608680 commit b413e47
Showing 1 changed file with 45 additions and 16 deletions.
61 changes: 45 additions & 16 deletions src/main/scala/net/ladstatt/adash/ArtifactDashboard.scala
Expand Up @@ -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 {

Expand All @@ -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
Expand Down

0 comments on commit b413e47

Please sign in to comment.