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 | } |