summaryrefslogtreecommitdiff
path: root/src/main/scala/io/trygvis/cj/Explorer.scala
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2013-05-19 01:14:42 +0200
committerTrygve Laugstøl <trygvis@inamo.no>2013-05-19 10:21:38 +0200
commitc569a4c58cf29778df28392b48e20ffebdbc518e (patch)
tree5148d1bd03b8efbb281fb4c4dc66d63cc38cf1c9 /src/main/scala/io/trygvis/cj/Explorer.scala
downloadcollection-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.scala73
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()
+}