WIP event handling: Initialization fixes
authorChristos KK Loverdos <loverdos@gmail.com>
Fri, 1 Jun 2012 09:21:46 +0000 (12:21 +0300)
committerChristos KK Loverdos <loverdos@gmail.com>
Fri, 1 Jun 2012 09:21:46 +0000 (12:21 +0300)
src/main/scala/gr/grnet/aquarium/actor/service/rest/RESTActor.scala
src/main/scala/gr/grnet/aquarium/actor/service/router/RouterActor.scala
src/main/scala/gr/grnet/aquarium/actor/service/user/UserActor.scala

index 69cfdf6..174aa5f 100644 (file)
@@ -144,7 +144,6 @@ class RESTActor private(_id: String) extends RoleableActor with Loggable {
     }
   }
 
-
   private[this]
   def callRouter(message: RouterRequestMessage, responder: RequestResponder): Unit = {
     val aquarium = Aquarium.Instance
@@ -158,19 +157,28 @@ class RESTActor private(_id: String) extends RoleableActor with Loggable {
           case None ⇒
             // TODO: Will this ever happen??
             logger.warn("Future did not complete for %s".format(message))
-            responder.complete(stringResponse(500, "Internal Server Error", "text/plain"))
+            val statusCode = 500
+            responder.complete(stringResponse(statusCode, "Internal Server Error", "text/plain"))
 
           case Some(Left(error)) ⇒
-            logger.error("Error serving %s: %s".format(message, error))
-            responder.complete(stringResponse(500, "Internal Server Error", "text/plain"))
+            val statusCode = 500
+            logger.error("Error %s serving %s: %s".format(statusCode, message, error))
+            responder.complete(stringResponse(statusCode, "Internal Server Error", "text/plain"))
 
           case Some(Right(actualResponse)) ⇒
             actualResponse match {
               case routerResponse: RouterResponseMessage[_] ⇒
                 routerResponse.response match {
                   case Left(errorMessage) ⇒
-                    logger.error("Error '%s' serving %s. Response is: %s".format(errorMessage, message, actualResponse))
-                    responder.complete(stringResponse(routerResponse.suggestedHTTPStatus, errorMessage, "text/plain"))
+                    val statusCode = routerResponse.suggestedHTTPStatus
+
+                    logger.error("Error %s '%s' serving %s. Internal response: %s".format(
+                      statusCode,
+                      errorMessage,
+                      message,
+                      actualResponse))
+
+                    responder.complete(stringResponse(statusCode, errorMessage, "text/plain"))
 
                   case Right(response) ⇒
                     responder.complete(
@@ -181,8 +189,9 @@ class RESTActor private(_id: String) extends RoleableActor with Loggable {
                 }
 
               case _ ⇒
-                logger.error("Error serving %s: Response is: %s".format(message, actualResponse))
-                responder.complete(stringResponse(500, "Internal Server Error", "text/plain"))
+                val statusCode = 500
+                logger.error("Error %s serving %s: Response is: %s".format(statusCode, message, actualResponse))
+                responder.complete(stringResponse(statusCode, "Internal Server Error", "text/plain"))
             }
         }
     }
index 6d10bab..c06c4a8 100644 (file)
@@ -37,7 +37,6 @@ package gr.grnet.aquarium.actor
 package service
 package router
 
-import gr.grnet.aquarium.util.shortClassNameOf
 import gr.grnet.aquarium.service.RoleableActorProviderService
 import akka.actor.ActorRef
 import user.{UserActorCache}
@@ -46,6 +45,7 @@ import gr.grnet.aquarium.actor.message.admin.PingAllRequest
 import gr.grnet.aquarium.actor.message.{UserActorRequestMessage, GetUserStateRequest, GetUserBalanceRequest}
 import gr.grnet.aquarium.{AquariumException, AquariumInternalError}
 import gr.grnet.aquarium.actor.message.config.{InitializeUserState, AquariumPropertiesLoaded, ActorProviderConfigured}
+import gr.grnet.aquarium.util.{LogHelpers, shortClassNameOf}
 
 /**
  * Business logic router. Incoming messages are routed to appropriate destinations. Replies are routed back
@@ -94,7 +94,7 @@ class RouterActor extends ReflectiveRoleableActor {
    * is an NPE.
    */
   override protected def onThrowable(t: Throwable, servicingMessage: AnyRef) = {
-    logChainOfCauses(t)
+    LogHelpers.logChainOfCauses(logger, t)
 
     def logIgnore(e: Throwable) = {
       logger.error("Ignoring %s".format(shortClassNameOf(e)), e)
index a79a64f..825589d 100644 (file)
@@ -40,7 +40,6 @@ package user
 import gr.grnet.aquarium.actor._
 
 import akka.config.Supervision.Temporary
-import gr.grnet.aquarium.util.{shortClassNameOf, shortNameOfClass, shortNameOfType}
 import gr.grnet.aquarium.actor.message.event.{ProcessResourceEvent, ProcessIMEvent}
 import gr.grnet.aquarium.computation.data.IMStateSnapshot
 import gr.grnet.aquarium.actor.message.config.{InitializeUserState, ActorProviderConfigured, AquariumPropertiesLoaded}
@@ -50,6 +49,7 @@ import gr.grnet.aquarium.event.model.im.IMEventModel
 import gr.grnet.aquarium.{AquariumException, Aquarium}
 import gr.grnet.aquarium.actor.message.{GetUserStateResponse, GetUserBalanceResponseData, GetUserBalanceResponse, GetUserStateRequest, GetUserBalanceRequest}
 import gr.grnet.aquarium.computation.reason.{InitialUserActorSetup, UserStateChangeReason, IMEventArrival, InitialUserStateSetup}
+import gr.grnet.aquarium.util.{LogHelpers, shortClassNameOf, shortNameOfClass, shortNameOfType}
 
 /**
  *
@@ -72,7 +72,7 @@ class UserActor extends ReflectiveRoleableActor {
   }
 
   override protected def onThrowable(t: Throwable, message: AnyRef) = {
-    logChainOfCauses(t)
+    LogHelpers.logChainOfCauses(logger, t)
     ERROR(t, "Terminating due to: %s(%s)", shortClassNameOf(t), t.getMessage)
 
     _shutmedown()
@@ -124,7 +124,7 @@ class UserActor extends ReflectiveRoleableActor {
   /**
    * Creates the IMStateSnapshot and returns the number of updates it made to it.
    */
-  private[this] def createIMState(event: InitializeUserState): Int = {
+  private[this] def createInitialIMState(event: InitializeUserState): Int = {
     val userID = event.userID
     val store = aquarium.imEventStore
 
@@ -157,19 +157,7 @@ class UserActor extends ReflectiveRoleableActor {
     haveIMState && this._imState.hasBeenActivated
   }
 
-  private[this] def createUserState(event: InitializeUserState): Unit = {
-    if(!haveIMState) {
-      // Should have been created from `createIMState()`
-      DEBUG("Cannot create user state from %s, since %s = %s", event, shortNameOfClass(classOf[IMStateSnapshot]), this._imState)
-      return
-    }
-
-    if(!this._imState.hasBeenActivated) {
-      // Cannot set the initial state!
-      DEBUG("Cannot create %s from %s, since user is inactive", shortNameOfType[UserState], event)
-      return
-    }
-
+  private[this] def loadUserStateAndUpdateRoleHistory(): Unit = {
     val userActivationMillis = this._imState.userActivationMillis.get
     val initialRole = this._imState.roleHistory.firstRole.get.name
 
@@ -193,11 +181,28 @@ class UserActor extends ReflectiveRoleableActor {
 
     // Final touch: Update role history
     if(haveIMState && haveUserState) {
-      // FIXME: Not satisfied with this redundant info
       if(this._userState.roleHistory != this._imState.roleHistory) {
         this._userState = newUserStateWithUpdatedRoleHistory(InitialUserActorSetup)
       }
     }
+  }
+
+  private[this] def createInitialUserState(event: InitializeUserState): Unit = {
+    if(!haveIMState) {
+      // Should have been created from `createIMState()`
+      DEBUG("Cannot create user state from %s, since %s = %s", event, shortNameOfClass(classOf[IMStateSnapshot]), this._imState)
+      return
+    }
+
+    if(!this._imState.hasBeenActivated) {
+      // Cannot set the initial state!
+      DEBUG("Cannot create %s from %s, since user is inactive", shortNameOfType[UserState], event)
+      return
+    }
+
+    // We will also need this functionality when receiving IMEvents,
+    // so we place it in a method
+    loadUserStateAndUpdateRoleHistory()
 
     if(haveUserState) {
       DEBUG("%s = %s", shortNameOfType[UserState], this._userState)
@@ -209,8 +214,8 @@ class UserActor extends ReflectiveRoleableActor {
     this._userID = userID
     DEBUG("Got %s", event)
 
-    createIMState(event)
-    createUserState(event)
+    createInitialIMState(event)
+    createInitialUserState(event)
   }
 
   /**
@@ -256,13 +261,13 @@ class UserActor extends ReflectiveRoleableActor {
 
       // Must also update user state
       if(shouldProcessResourceEvents) {
-        if(haveUserState) {
-          DEBUG("Also updating %s with new %s",
-            shortClassNameOf(this._userState),
-            shortClassNameOf(this._imState.roleHistory)
-          )
-
+        if(!haveUserState) {
+          loadUserStateAndUpdateRoleHistory()
+          INFO("Loaded %s due to %s", shortNameOfType[UserState], imEvent)
+        } else {
+          // Just update role history
           this._userState = newUserStateWithUpdatedRoleHistory(IMEventArrival(imEvent))
+          INFO("Updated %s due to %s", shortNameOfType[UserState], imEvent)
         }
       }
     } else {
@@ -283,7 +288,6 @@ class UserActor extends ReflectiveRoleableActor {
     }
   }
 
-
   def onGetUserBalanceRequest(event: GetUserBalanceRequest): Unit = {
     val userID = event.userID