}
}
-
private[this]
def callRouter(message: RouterRequestMessage, responder: RequestResponder): Unit = {
val aquarium = Aquarium.Instance
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(
}
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"))
}
}
}
package service
package router
-import gr.grnet.aquarium.util.shortClassNameOf
import gr.grnet.aquarium.service.RoleableActorProviderService
import akka.actor.ActorRef
import user.{UserActorCache}
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
* 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)
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}
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}
/**
*
}
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()
/**
* 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
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
// 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)
this._userID = userID
DEBUG("Got %s", event)
- createIMState(event)
- createUserState(event)
+ createInitialIMState(event)
+ createInitialUserState(event)
}
/**
// 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 {
}
}
-
def onGetUserBalanceRequest(event: GetUserBalanceRequest): Unit = {
val userID = event.userID