2 * Copyright 2011 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
12 * 2. Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials
15 * provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
30 * The views and conclusions contained in the software and
31 * documentation are those of the authors and should not be
32 * interpreted as representing official policies, either expressed
33 * or implied, of GRNET S.A.
36 package gr.grnet.aquarium.rest.akka.service
38 import org.slf4j.LoggerFactory
39 import cc.spray.can.HttpMethods.GET
41 import akka.actor.Actor
42 import gr.grnet.aquarium.util.Loggable
43 import net.liftweb.json.JsonAST.JValue
44 import net.liftweb.json.{JsonAST, Printer}
48 * @author Christos KK Loverdos <loverdos@gmail.com>.
50 class AquariumRESTService(_id: String = "spray-root-service", version: String) extends Actor with Loggable {
53 // private[this] def jsonResponseOK(body: JValue, pretty: Boolean = false): HttpResponse = {
56 // HttpHeader("Content-type", "application/json;charset=utf-8") :: Nil,
58 // Printer.pretty(JsonAST.render(body)).getB
64 protected def receive = {
65 case RequestContext(HttpRequest(GET, "/", _, _, _), _, responder) =>
66 responder.complete(index)
68 case RequestContext(HttpRequest(GET, "/ping", _, _, _), _, responder) =>
69 responder.complete(response("PONG!"))
71 case RequestContext(HttpRequest(GET, "/stats", _, _, _), _, responder) => {
72 (serverActor ? GetStats).mapTo[Stats].onComplete {
74 future.value.get match {
75 case Right(stats) => responder.complete {
77 "Uptime : " + (stats.uptime / 1000.0) + " sec\n" +
78 "Requests dispatched : " + stats.requestsDispatched + '\n' +
79 "Requests timed out : " + stats.requestsTimedOut + '\n' +
80 "Requests open : " + stats.requestsOpen + '\n' +
81 "Open connections : " + stats.connectionsOpen + '\n'
84 case Left(ex) => responder.complete(response("Couldn't get server stats due to " + ex, status = 500))
89 case RequestContext(HttpRequest(_, _, _, _, _), _, responder) =>
90 responder.complete(response("Unknown resource!", 404))
92 case Timeout(method, uri, _, _, _, complete) => complete {
93 HttpResponse(status = 500).withBody("The " + method + " request to '" + uri + "' has timed out...")
97 ////////////// helpers //////////////
99 val defaultHeaders = List(HttpHeader("Content-Type", "text/plain"))
101 lazy val serverActor = Actor.registry.actorsFor("spray-can-server").head
103 def response(msg: String, status: Int = 200) = HttpResponse(status, defaultHeaders, msg.getBytes("ISO-8859-1"))
105 lazy val index = HttpResponse(
106 headers = List(HttpHeader("Content-Type", "text/html")),
113 <p>Defined resources:</p>
116 <a href="/ping">/ping</a>
119 <a href="/stats">/stats</a>
123 </html>.toString.getBytes("UTF-8")