Statistics
| Branch: | Tag: | Revision:

root / src / main / scala / gr / grnet / aquarium / actor / service / user / UserActor.scala @ d818f53c

History | View | Annotate | Download (5.6 kB)

1 158cbc5b Christos KK Loverdos
/*
2 04b151ba Christos KK Loverdos
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
3 158cbc5b Christos KK Loverdos
 *
4 158cbc5b Christos KK Loverdos
 * Redistribution and use in source and binary forms, with or
5 158cbc5b Christos KK Loverdos
 * without modification, are permitted provided that the following
6 158cbc5b Christos KK Loverdos
 * conditions are met:
7 158cbc5b Christos KK Loverdos
 *
8 158cbc5b Christos KK Loverdos
 *   1. Redistributions of source code must retain the above
9 158cbc5b Christos KK Loverdos
 *      copyright notice, this list of conditions and the following
10 158cbc5b Christos KK Loverdos
 *      disclaimer.
11 158cbc5b Christos KK Loverdos
 *
12 158cbc5b Christos KK Loverdos
 *   2. Redistributions in binary form must reproduce the above
13 158cbc5b Christos KK Loverdos
 *      copyright notice, this list of conditions and the following
14 158cbc5b Christos KK Loverdos
 *      disclaimer in the documentation and/or other materials
15 158cbc5b Christos KK Loverdos
 *      provided with the distribution.
16 158cbc5b Christos KK Loverdos
 *
17 158cbc5b Christos KK Loverdos
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 158cbc5b Christos KK Loverdos
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 158cbc5b Christos KK Loverdos
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 158cbc5b Christos KK Loverdos
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 158cbc5b Christos KK Loverdos
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 158cbc5b Christos KK Loverdos
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 158cbc5b Christos KK Loverdos
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 158cbc5b Christos KK Loverdos
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 158cbc5b Christos KK Loverdos
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 158cbc5b Christos KK Loverdos
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 158cbc5b Christos KK Loverdos
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 158cbc5b Christos KK Loverdos
 * POSSIBILITY OF SUCH DAMAGE.
29 158cbc5b Christos KK Loverdos
 *
30 158cbc5b Christos KK Loverdos
 * The views and conclusions contained in the software and
31 158cbc5b Christos KK Loverdos
 * documentation are those of the authors and should not be
32 158cbc5b Christos KK Loverdos
 * interpreted as representing official policies, either expressed
33 158cbc5b Christos KK Loverdos
 * or implied, of GRNET S.A.
34 158cbc5b Christos KK Loverdos
 */
35 158cbc5b Christos KK Loverdos
36 7363ac76 Christos KK Loverdos
package gr.grnet.aquarium.actor
37 7363ac76 Christos KK Loverdos
package service
38 7363ac76 Christos KK Loverdos
package user
39 158cbc5b Christos KK Loverdos
40 7889024b Christos KK Loverdos
import gr.grnet.aquarium.actor._
41 d8473d3c Christos KK Loverdos
import gr.grnet.aquarium.user._
42 ba69480b Christos KK Loverdos
43 1224a161 Christos KK Loverdos
import gr.grnet.aquarium.util.shortClassNameOf
44 ba69480b Christos KK Loverdos
import message.config.{ActorProviderConfigured, AquariumPropertiesLoaded}
45 aac593d6 Christos KK Loverdos
import gr.grnet.aquarium.event.im.IMEventModel
46 0367eb03 Christos KK Loverdos
import akka.config.Supervision.Temporary
47 d818f53c Christos KK Loverdos
import gr.grnet.aquarium.Configurator
48 d818f53c Christos KK Loverdos
import gr.grnet.aquarium.util.date.{TimeHelpers, MutableDateCalc}
49 d818f53c Christos KK Loverdos
import gr.grnet.aquarium.actor.message.event.{ProcessResourceEvent, ProcessIMEvent}
50 d818f53c Christos KK Loverdos
import gr.grnet.aquarium.actor.message.{GetUserStateResponse, GetUserBalanceResponse, GetUserStateRequest, GetUserBalanceRequest}
51 158cbc5b Christos KK Loverdos
52 158cbc5b Christos KK Loverdos
/**
53 3aa0499b Christos KK Loverdos
 *
54 158cbc5b Christos KK Loverdos
 * @author Christos KK Loverdos <loverdos@gmail.com>
55 158cbc5b Christos KK Loverdos
 */
56 158cbc5b Christos KK Loverdos
57 62fcf8c9 Christos KK Loverdos
class UserActor extends ReflectiveRoleableActor {
58 b6ea3721 Christos KK Loverdos
  private[this] var _imState: IMStateSnapshot = _
59 158cbc5b Christos KK Loverdos
  private[this] var _userState: UserState = _
60 158cbc5b Christos KK Loverdos
61 0367eb03 Christos KK Loverdos
  self.lifeCycle = Temporary
62 0367eb03 Christos KK Loverdos
63 b6ea3721 Christos KK Loverdos
  private[this] def _userID = this._userState.userID
64 a4d9ee8d Christos KK Loverdos
  private[this] def _shutmedown(): Unit = {
65 b6ea3721 Christos KK Loverdos
    if(_haveUserState) {
66 b6ea3721 Christos KK Loverdos
      UserActorCache.invalidate(_userID)
67 a4d9ee8d Christos KK Loverdos
    }
68 0367eb03 Christos KK Loverdos
69 21bffa79 Christos KK Loverdos
    self.stop()
70 0367eb03 Christos KK Loverdos
  }
71 0367eb03 Christos KK Loverdos
72 a4d9ee8d Christos KK Loverdos
  override protected def onThrowable(t: Throwable, message: AnyRef) = {
73 ed6cccb2 Christos KK Loverdos
    logChainOfCauses(t)
74 a4d9ee8d Christos KK Loverdos
    ERROR(t, "Terminating due to: %s(%s)", shortClassNameOf(t), t.getMessage)
75 a4d9ee8d Christos KK Loverdos
76 a4d9ee8d Christos KK Loverdos
    _shutmedown()
77 a4d9ee8d Christos KK Loverdos
  }
78 a4d9ee8d Christos KK Loverdos
79 158cbc5b Christos KK Loverdos
  def role = UserActorRole
80 158cbc5b Christos KK Loverdos
81 3aa0499b Christos KK Loverdos
  private[this] def _configurator: Configurator = Configurator.MasterConfigurator
82 3aa0499b Christos KK Loverdos
83 b3da621b Christos KK Loverdos
  private[this] def _timestampTheshold =
84 b3da621b Christos KK Loverdos
    _configurator.props.getLong(Configurator.Keys.user_state_timestamp_threshold).getOr(10000)
85 1420b0dc Georgios Gousios
86 7889024b Christos KK Loverdos
87 b6ea3721 Christos KK Loverdos
  private[this] def _haveUserState = {
88 b6ea3721 Christos KK Loverdos
    this._userState ne null
89 a4d9ee8d Christos KK Loverdos
  }
90 a4d9ee8d Christos KK Loverdos
91 b6ea3721 Christos KK Loverdos
  private[this] def _haveIMState = {
92 b6ea3721 Christos KK Loverdos
    this._imState ne null
93 ed6cccb2 Christos KK Loverdos
  }
94 ed6cccb2 Christos KK Loverdos
95 3a162845 Christos KK Loverdos
  def onAquariumPropertiesLoaded(event: AquariumPropertiesLoaded): Unit = {
96 3a162845 Christos KK Loverdos
  }
97 3a162845 Christos KK Loverdos
98 b3da621b Christos KK Loverdos
  def onActorProviderConfigured(event: ActorProviderConfigured): Unit = {
99 3a162845 Christos KK Loverdos
  }
100 3a162845 Christos KK Loverdos
101 ed6cccb2 Christos KK Loverdos
  private[this] def _getAgreementNameForNewUser(imEvent: IMEventModel): String = {
102 1224a161 Christos KK Loverdos
    // FIXME: Implement based on the role
103 1224a161 Christos KK Loverdos
    "default"
104 1224a161 Christos KK Loverdos
  }
105 1224a161 Christos KK Loverdos
106 9147e5f8 Christos KK Loverdos
  def onProcessIMEvent(event: ProcessIMEvent): Unit = {
107 ed6cccb2 Christos KK Loverdos
    val now = TimeHelpers.nowMillis()
108 ed6cccb2 Christos KK Loverdos
109 b3da621b Christos KK Loverdos
    val imEvent = event.imEvent
110 b6ea3721 Christos KK Loverdos
    val isUpdate = if(_haveIMState) {
111 b6ea3721 Christos KK Loverdos
      val newOccurredMillis = imEvent.occurredMillis
112 b6ea3721 Christos KK Loverdos
      val currentOccurredMillis = this._imState.imEvent.occurredMillis
113 ed6cccb2 Christos KK Loverdos
114 b6ea3721 Christos KK Loverdos
      if(newOccurredMillis < currentOccurredMillis) {
115 b6ea3721 Christos KK Loverdos
        INFO(
116 b6ea3721 Christos KK Loverdos
          "Ignoring older IMEvent: [%s] < [%s]",
117 b6ea3721 Christos KK Loverdos
          new MutableDateCalc(newOccurredMillis).toYYYYMMDDHHMMSSSSS,
118 b6ea3721 Christos KK Loverdos
          new MutableDateCalc(currentOccurredMillis).toYYYYMMDDHHMMSSSSS)
119 ed6cccb2 Christos KK Loverdos
120 b6ea3721 Christos KK Loverdos
        return
121 b6ea3721 Christos KK Loverdos
      }
122 ed6cccb2 Christos KK Loverdos
123 b6ea3721 Christos KK Loverdos
      true
124 0367eb03 Christos KK Loverdos
    } else {
125 b6ea3721 Christos KK Loverdos
      false
126 3a162845 Christos KK Loverdos
    }
127 b6ea3721 Christos KK Loverdos
128 b6ea3721 Christos KK Loverdos
    this._imState = IMStateSnapshot(imEvent, now)
129 b6ea3721 Christos KK Loverdos
    DEBUG("%s %s", if(isUpdate) "Update" else "Set", shortClassNameOf(this._imState))
130 3a162845 Christos KK Loverdos
  }
131 3a162845 Christos KK Loverdos
132 d818f53c Christos KK Loverdos
  def onGetUserBalanceRequest(event: GetUserBalanceRequest): Unit = {
133 c8b15236 Christos KK Loverdos
    val userId = event.userID
134 d818f53c Christos KK Loverdos
    // FIXME: Implement
135 d818f53c Christos KK Loverdos
    self reply GetUserBalanceResponse(userId, Right(_userState.creditsSnapshot.creditAmount))
136 3a162845 Christos KK Loverdos
  }
137 3a162845 Christos KK Loverdos
138 d818f53c Christos KK Loverdos
  def onGetUserStateRequest(event: GetUserStateRequest): Unit = {
139 c8b15236 Christos KK Loverdos
    val userId = event.userID
140 d818f53c Christos KK Loverdos
   // FIXME: Implement
141 d818f53c Christos KK Loverdos
    self reply GetUserStateResponse(userId, Right(this._userState))
142 158cbc5b Christos KK Loverdos
  }
143 79a8cc88 Georgios Gousios
144 b3da621b Christos KK Loverdos
  def onProcessResourceEvent(event: ProcessResourceEvent): Unit = {
145 e8acfda7 Christos KK Loverdos
  }
146 e8acfda7 Christos KK Loverdos
147 bc179ea5 Georgios Gousios
148 b3da621b Christos KK Loverdos
  private[this] def D_userID = {
149 b6ea3721 Christos KK Loverdos
    if(this._userState eq null)
150 b6ea3721 Christos KK Loverdos
      if(this._imState eq null)
151 b6ea3721 Christos KK Loverdos
        "<NOT INITIALIZED>"
152 a4d9ee8d Christos KK Loverdos
      else
153 b6ea3721 Christos KK Loverdos
        this._imState.imEvent.userID
154 b6ea3721 Christos KK Loverdos
    else
155 b6ea3721 Christos KK Loverdos
      this._userState.userID
156 b3da621b Christos KK Loverdos
  }
157 a4d9ee8d Christos KK Loverdos
158 c874bd65 Christos KK Loverdos
  private[this] def DEBUG(fmt: String, args: Any*) =
159 b3da621b Christos KK Loverdos
    logger.debug("UserActor[%s]: %s".format(D_userID, fmt.format(args: _*)))
160 79a8cc88 Georgios Gousios
161 c874bd65 Christos KK Loverdos
  private[this] def INFO(fmt: String, args: Any*) =
162 b3da621b Christos KK Loverdos
    logger.info("UserActor[%s]: %s".format(D_userID, fmt.format(args: _*)))
163 c874bd65 Christos KK Loverdos
164 c874bd65 Christos KK Loverdos
  private[this] def WARN(fmt: String, args: Any*) =
165 b3da621b Christos KK Loverdos
    logger.warn("UserActor[%s]: %s".format(D_userID, fmt.format(args: _*)))
166 79a8cc88 Georgios Gousios
167 c874bd65 Christos KK Loverdos
  private[this] def ERROR(fmt: String, args: Any*) =
168 b3da621b Christos KK Loverdos
    logger.error("UserActor[%s]: %s".format(D_userID, fmt.format(args: _*)))
169 9147e5f8 Christos KK Loverdos
170 9147e5f8 Christos KK Loverdos
  private[this] def ERROR(t: Throwable, fmt: String, args: Any*) =
171 b6ea3721 Christos KK Loverdos
    logger.error("UserActor[%s]: %s".format(D_userID, fmt.format(args: _*)), t)
172 3a162845 Christos KK Loverdos
}