Realtime calc for continuous charging behavior
authorChristos KK Loverdos <loverdos@gmail.com>
Fri, 24 Aug 2012 14:51:17 +0000 (17:51 +0300)
committerChristos KK Loverdos <loverdos@gmail.com>
Fri, 24 Aug 2012 14:51:17 +0000 (17:51 +0300)
Highly unoptimized and memory-unfriendly, proof of concept for the
moment.

src/main/scala/gr/grnet/aquarium/actor/service/user/UserActor.scala
src/main/scala/gr/grnet/aquarium/charging/ChargingService.scala

index b8f5156..4ef44f6 100644 (file)
@@ -450,6 +450,13 @@ class UserActor extends ReflectiveRoleableActor {
     (haveUserCreationIMEvent, haveWorkingUserState) match {
       case (true, true) ⇒
         // (User CREATEd, with balance state)
+        val realtimeMillis = TimeHelpers.nowMillis()
+        chargingService.calculateRealtimeWorkingUserState(
+          this._workingUserState,
+          BillingMonthInfo.fromMillis(realtimeMillis),
+          realtimeMillis
+        )
+
         sender ! GetUserBalanceResponse(Right(GetUserBalanceResponseData(this._userID, this._workingUserState.totalCredits)))
 
       case (true, false) ⇒
@@ -477,6 +484,13 @@ class UserActor extends ReflectiveRoleableActor {
   def onGetUserStateRequest(event: GetUserStateRequest): Unit = {
     haveWorkingUserState match {
       case true ⇒
+        val realtimeMillis = TimeHelpers.nowMillis()
+        chargingService.calculateRealtimeWorkingUserState(
+          this._workingUserState,
+          BillingMonthInfo.fromMillis(realtimeMillis),
+          realtimeMillis
+        )
+
         sender ! GetUserStateResponse(Right(this._workingUserState))
 
       case false ⇒
@@ -488,6 +502,13 @@ class UserActor extends ReflectiveRoleableActor {
     haveWorkingUserState match {
       case true ⇒
         DEBUG("haveWorkingUserState: %s", event)
+        val realtimeMillis = TimeHelpers.nowMillis()
+        chargingService.calculateRealtimeWorkingUserState(
+          this._workingUserState,
+          BillingMonthInfo.fromMillis(realtimeMillis),
+          realtimeMillis
+        )
+
         sender ! GetUserWalletResponse(
           Right(
             GetUserWalletResponseData(
index ff318c6..7a2db51 100644 (file)
@@ -42,6 +42,7 @@ import gr.grnet.aquarium.charging.state.{WorkingResourcesChargingState, UserStat
 import gr.grnet.aquarium.policy.ResourceType
 import gr.grnet.aquarium.util.{Lifecycle, Loggable}
 import gr.grnet.aquarium.util.LogHelpers.Debug
+import gr.grnet.aquarium.util.LogHelpers.DebugSeq
 import gr.grnet.aquarium.util.LogHelpers.Warn
 import gr.grnet.aquarium.util.date.{MutableDateCalc, TimeHelpers}
 import gr.grnet.aquarium.{AquariumInternalError, AquariumAwareSkeleton}
@@ -83,6 +84,7 @@ final class ChargingService extends AquariumAwareSkeleton with Lifecycle with Lo
           val chargingBehavior = aquarium.chargingBehaviorOf(resourceType)
 
           for((resourceInstanceID, workingResourceInstanceState) ← workingResourcesState.stateOfResourceInstance) {
+            Debug(logger, "Realtime calculation for %s, %s", resourceTypeName, resourceInstanceID)
             val virtualEvents = chargingBehavior.createVirtualEventsForRealtimeComputation(
               workingUserState.userID,
               resourceTypeName,
@@ -90,6 +92,7 @@ final class ChargingService extends AquariumAwareSkeleton with Lifecycle with Lo
               realtimeMillis,
               workingResourceInstanceState
             )
+            DebugSeq(logger, "virtualEvents", virtualEvents, 1)
 
             processResourceEvents(
               virtualEvents,