Checkin to fix compilation
[aquarium] / logic / src / main / scala / gr / grnet / aquarium / rest / akka / service / AquariumRESTService.scala
1 /*
2  * Copyright 2011 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *
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.
16  *
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.
29  *
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.
34  */
35
36 package gr.grnet.aquarium.rest.akka.service
37
38 import org.slf4j.LoggerFactory
39 import cc.spray.can.HttpMethods.GET
40 import cc.spray.can._
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}
45
46 /**
47  *
48  * @author Christos KK Loverdos <loverdos@gmail.com>.
49  */
50 class AquariumRESTService(_id: String = "spray-root-service", version: String) extends Actor with Loggable {
51   self.id = _id
52
53 //  private[this] def jsonResponseOK(body: JValue, pretty: Boolean = false): HttpResponse = {
54 //    HttpResponse(
55 //      200,
56 //      HttpHeader("Content-type", "application/json;charset=utf-8") :: Nil,
57 //      if(pretty) {
58 //        Printer.pretty(JsonAST.render(body)).getB
59 //      } else {
60 //        bo
61 //      }
62 //      )
63 //  }
64   protected def receive = {
65     case RequestContext(HttpRequest(GET, "/", _, _, _), _, responder) =>
66       responder.complete(index)
67
68     case RequestContext(HttpRequest(GET, "/ping", _, _, _), _, responder) =>
69       responder.complete(response("PONG!"))
70
71     case RequestContext(HttpRequest(GET, "/stats", _, _, _), _, responder) => {
72       (serverActor ? GetStats).mapTo[Stats].onComplete {
73         future =>
74           future.value.get match {
75             case Right(stats) => responder.complete {
76               response {
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'
82               }
83             }
84             case Left(ex) => responder.complete(response("Couldn't get server stats due to " + ex, status = 500))
85           }
86       }
87     }
88
89     case RequestContext(HttpRequest(_, _, _, _, _), _, responder) =>
90       responder.complete(response("Unknown resource!", 404))
91
92     case Timeout(method, uri, _, _, _, complete) => complete {
93       HttpResponse(status = 500).withBody("The " + method + " request to '" + uri + "' has timed out...")
94     }
95   }
96
97   ////////////// helpers //////////////
98
99   val defaultHeaders = List(HttpHeader("Content-Type", "text/plain"))
100
101   lazy val serverActor = Actor.registry.actorsFor("spray-can-server").head
102
103   def response(msg: String, status: Int = 200) = HttpResponse(status, defaultHeaders, msg.getBytes("ISO-8859-1"))
104
105   lazy val index = HttpResponse(
106     headers = List(HttpHeader("Content-Type", "text/html")),
107     body =
108       <html>
109         <body>
110           <h1>Say hello to
111             <i>spray-can</i>
112             !</h1>
113           <p>Defined resources:</p>
114           <ul>
115             <li>
116               <a href="/ping">/ping</a>
117             </li>
118             <li>
119               <a href="/stats">/stats</a>
120             </li>
121           </ul>
122         </body>
123       </html>.toString.getBytes("UTF-8")
124   )
125 }