import java.io.{File, IOException}
import java.net.MalformedURLException
import scala.io.Source
import scala.util.{Failure, Success, Try}
import scalaj.http.Http
object Main {
private val maven_host = "search.maven.org"
private val cbt_home = System.getenv("CBT_HOME")
implicit class StringExtensionMethods(str: String) {
def /(s: String): String = str + File.separator + s
}
val uiPort = 9080
def main(args: Array[String]) = launchUi(new File(args(0)), args(1))
def launchUi(projectDirectory: File, scalaMajorVersion: String): Unit = {
val staticBase = new File(cbt_home / "tools" / "gui" / "resources" / "web").toURI.toURL.toExternalForm
val server = new JettyServer(uiPort, staticBase) {
override def route(method: String, path: String, param: String => String) = (method, path) match {
case ("GET", "/cwd") =>
Success(s"""["$projectDirectory"]""")
case ("POST", "/project") =>
val name = param("name")
val defaultPackage = param("pack")
val dependencies = param("dependencies")
val flags = param("flags")
handleIoException {
new ProjectBuilder(name, defaultPackage, dependencies, flags, projectDirectory, scalaMajorVersion).build()
Success("[]")
}
case ("GET", "/dependency") =>
val query = param("query")
handleIoException(handleMavenBadResponse(searchDependency(query)))
case ("GET", "/dependency/version") =>
val group = param("group")
val artifact = param("artifact")
handleIoException(handleMavenBadResponse(searchDependencyVersion(group, artifact)))
case _ =>
Failure(new MalformedURLException(s"Incorrect path: $path"))
}
}
server.start()
java.awt.Desktop.getDesktop.browse(new java.net.URI(s"http://localhost:$uiPort/"))
println("Press Enter to stop UI server.")
while (Source.stdin.getLines().next().nonEmpty) {}
server.stop()
}
private def searchDependency(query: String) = {
Http(s"http://$maven_host/solrsearch/select")
.param("q", query)
.param("rows", "30")
.param("wt", "json")
.asString.body
}
private def searchDependencyVersion(group: String, artifact: String) = {
val query = s"""q=g:"$group"+AND+a:"$artifact""""
Http(s"http://$maven_host/solrsearch/select?" + query)
.param("rows", "30")
.param("wt", "json")
.param("core", "gav")
.asString.body
}
private def handleIoException(f: => Try[String]) = try f catch {
case e: IOException =>
e.printStackTrace()
Failure(e)
}
private def handleMavenBadResponse(result: String) = {
if (result.startsWith("{"))
Success(result)
else
Failure(new Exception(s"Bad response from $maven_host: $result"))
}
}