diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2013-05-19 01:14:42 +0200 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2013-05-19 10:21:38 +0200 |
commit | c569a4c58cf29778df28392b48e20ffebdbc518e (patch) | |
tree | 5148d1bd03b8efbb281fb4c4dc66d63cc38cf1c9 /src/main/scala/io/trygvis/cj/Explorer.scala | |
download | collection-json-explorer-scala-c569a4c58cf29778df28392b48e20ffebdbc518e.tar.gz collection-json-explorer-scala-c569a4c58cf29778df28392b48e20ffebdbc518e.tar.bz2 collection-json-explorer-scala-c569a4c58cf29778df28392b48e20ffebdbc518e.tar.xz collection-json-explorer-scala-c569a4c58cf29778df28392b48e20ffebdbc518e.zip |
o Initial import of the Scala version of the Collection+JSON explorer.
Diffstat (limited to 'src/main/scala/io/trygvis/cj/Explorer.scala')
-rw-r--r-- | src/main/scala/io/trygvis/cj/Explorer.scala | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/main/scala/io/trygvis/cj/Explorer.scala b/src/main/scala/io/trygvis/cj/Explorer.scala new file mode 100644 index 0000000..9f8fd44 --- /dev/null +++ b/src/main/scala/io/trygvis/cj/Explorer.scala @@ -0,0 +1,73 @@ +package io.trygvis.cj + +import scala.collection.JavaConversions._ +import scala.io.Source +import java.net.{HttpURLConnection, URI} +import java.io.{Writer, StringWriter, PrintWriter, InputStreamReader} +import javax.servlet.http.HttpServletRequest +import net.hamnaberg.json.collection.{NativeJsonCollectionParser, JsonCollection} +import unfiltered.request._ +import unfiltered.response._ +import unfiltered.filter._ +import unfiltered.jetty._ + +case class CjResponse(code: Int, status: String, headers: java.util.Map[String, java.util.List[String]]) + +class Browser extends Plan { + import unfiltered.directives._, Directives._ + + def viewsX(req: HttpServletRequest) = { + + val (proto, port) = if (req.isSecure) + ("https", if (req.getServerPort == 443) "" else ":" + req.getServerPort) + else + ("http", if (req.getServerPort == 80) "" else ":" + req.getServerPort) + + val uri = proto + "://" + req.getServerName + port + "/" + new Views(uri) + } + + def queryParam(name: String) = Directive[Any, Any, String]({ request: HttpRequest[Any] => + request.parameterValues(name).headOption match { + case Some(value) => + Result.Success(value) + case None => + Result.Failure(BadRequest ~> ResponseString("Missing query parameter " + name + "\n")) + } + }) + + def intent = { + Path.Intent { + case "/" => + for { + _ <- GET + req <- underlying[HttpServletRequest] + views = viewsX(req) + } yield Ok ~> Html5(views.index) + case "/render" => + for { + _ <- GET + r <- underlying[HttpServletRequest] + url <- queryParam("url") + params <- QueryParams + views = viewsX(r) + } yield { + println("url=" + url) + val uri = URI.create(url) + val con = uri.toURL.openConnection().asInstanceOf[HttpURLConnection] + con.setRequestProperty("accept", "application/vnd.collection+json") + val content = Source.fromInputStream(con.getInputStream, "utf-8").mkString("") + val headers = con.getHeaderFields.toMap filter {case (key, _) => key != null} + val result = NativeJsonCollectionParser.parseCollection(content) + Ok ~> Html5(views.data(uri, params, result, CjResponse(con.getResponseCode, con.getResponseMessage, headers))) + } + } + } +} + +object Explorer extends App { + Http(8080). + plan(new Browser). + resources(getClass.getResource("/public/")). + run() +} |