Reorg initialization seq
[aquarium] / src / main / scala / gr / grnet / aquarium / message / avro / MessageFactory.scala
index 5e186dc..7e5fa92 100644 (file)
 
 package gr.grnet.aquarium.message.avro
 
-import gr.grnet.aquarium.charging.state.UserStateBootstrap
 import gr.grnet.aquarium.computation.BillingMonthInfo
-import gr.grnet.aquarium.event.{CreditsModel, DetailsModel}
+import gr.grnet.aquarium.event.DetailsModel
 import gr.grnet.aquarium.message.avro.gen._
-import java.{util ⇒ ju}
-import org.apache.avro.generic.GenericData
 import scala.collection.JavaConverters.mapAsJavaMapConverter
 import scala.collection.JavaConverters.seqAsJavaListConverter
-
+import scala.Predef.Map
+import gr.grnet.aquarium.policy.ResourceType
+import gr.grnet.aquarium.util.date.TimeHelpers
+import gr.grnet.aquarium.Real
+import gr.grnet.aquarium.util.JavaFactory.{newJList, newJMap}
 /**
  * Provides helper methods that construct avro messages.
  *
@@ -52,7 +53,7 @@ import scala.collection.JavaConverters.seqAsJavaListConverter
 object MessageFactory {
   def anyValueMsgOfBoolean(x: Boolean) = {
     val av = new AnyValueMsg
-    av.setAnyValue(x: java.lang.Boolean)
+    av.setAnyValue(java.lang.Boolean.valueOf(x))
     av
   }
 
@@ -62,13 +63,29 @@ object MessageFactory {
     av
   }
 
-  def newEffectiveUnitPriceMsg(unitPrice: Double, whenOpt: Option[CronSpecTupleMsg] = None) = {
+  def anyValueMsgOfList(l: java.util.List[AnyValueMsg]) = {
+    val av = new AnyValueMsg
+    av.setAnyValue(l)
+    av
+  }
+
+  def newEffectiveUnitPriceMsg(
+      unitPrice: String,
+      whenOpt: Option[CronSpecTupleMsg]
+  ): EffectiveUnitPriceMsg = {
     EffectiveUnitPriceMsg.newBuilder().
       setUnitPrice(unitPrice).
       setWhen(whenOpt.getOrElse(null)).
     build()
   }
 
+  def newEffectiveUnitPriceMsg(
+      unitPrice: Double,
+      whenOpt: Option[CronSpecTupleMsg]
+  ): EffectiveUnitPriceMsg = {
+    newEffectiveUnitPriceMsg(unitPrice.toString, whenOpt)
+  }
+
   def newEffectivePriceTableMsg(priceOverrides: EffectiveUnitPriceMsg*) = {
     EffectivePriceTableMsg.newBuilder().
       setPriceOverrides(priceOverrides.asJava).
@@ -117,10 +134,22 @@ object MessageFactory {
     build()
   }
 
+  def newResourceTypeMsg(model: ResourceType): ResourceTypeMsg = {
+    newResourceTypeMsg(model.name, model.unit, model.chargingBehavior)
+  }
+
   def newResourceTypeMsgs(rts: ResourceTypeMsg*) = {
     rts.asJava
   }
 
+//  def newResourceTypeMsgsMap(rts: ResourceTypeMsg*): java.util.Map[String, ResourceTypeMsg] = {
+//    rts.map(rt ⇒ (rt.getName, rt)).toMap.asJava
+//  }
+
+  def newResourceTypeMsgsMap(resourceTypes: Map[String, ResourceType]): java.util.Map[String, ResourceTypeMsg] = {
+    resourceTypes.map(rtt ⇒ (rtt._1, newResourceTypeMsg(rtt._2))).asJava
+  }
+
   def newChargingBehaviorMsgs(cbs: String*) = {
     cbs.asJava
   }
@@ -175,7 +204,8 @@ object MessageFactory {
       role: String,
       eventVersion: String,
       eventType: String,
-      details: DetailsModel.Type = newDetails()
+      details: DetailsModel.Type = newDetails(),
+      inStoreID: String = null
   ) = {
     IMEventMsg.newBuilder().
       setOriginalID(originalID).
@@ -189,30 +219,31 @@ object MessageFactory {
       setEventVersion(eventVersion).
       setEventType(eventType).
       setDetails(details).
+      setInStoreID(inStoreID).
     build()
   }
 
   def newWalletEntryMsg(
       userID: String,
-      sumOfCreditsToSubtract: CreditsModel.Type,
-      oldTotalCredits: CreditsModel.Type,
-      newTotalCredits: CreditsModel.Type,
+      sumOfCreditsToSubtract: String,
+      oldTotalCredits: String,
+      newTotalCredits: String,
       whenComputedMillis: Long,
       referenceStartMillis: Long,
       referenceStopMillis: Long,
       billingYear: Int,
       billingMonth: Int,
       billingMonthDay: Int,
-      chargeslots: ju.List[ChargeslotMsg],
-      resourceEvents: ju.List[ResourceEventMsg],
+      chargeslots: java.util.List[ChargeslotMsg],
+      resourceEvents: java.util.List[ResourceEventMsg],
       resourceType: ResourceTypeMsg,
       isSynthetic: Boolean
   ): WalletEntryMsg = {
     WalletEntryMsg.newBuilder().
       setUserID(userID).
-      setSumOfCreditsToSubtract(CreditsModel.toTypeInMessage(sumOfCreditsToSubtract)).
-      setOldTotalCredits(CreditsModel.toTypeInMessage(oldTotalCredits)).
-      setNewTotalCredits(CreditsModel.toTypeInMessage(newTotalCredits)).
+      setSumOfCreditsToSubtract(sumOfCreditsToSubtract).
+      setOldTotalCredits(oldTotalCredits).
+      setNewTotalCredits(newTotalCredits).
       setWhenComputedMillis(whenComputedMillis).
       setReferenceStartMillis(referenceStartMillis).
       setReferenceStopMillis(referenceStopMillis).
@@ -228,12 +259,15 @@ object MessageFactory {
 
   def newResourceInstanceChargingStateMsg(
       details: DetailsModel.Type,
-      previousEvents: ju.List[ResourceEventMsg],
-      implicitlyIssuedStartEvents: ju.List[ResourceEventMsg],
-      oldAccumulatingAmount: Double,
-      accumulatingAmount: Double,
-      previousValue: Double,
-      currentValue: Double
+      previousEvents: java.util.List[ResourceEventMsg],
+      implicitlyIssuedStartEvents: java.util.List[ResourceEventMsg],
+      oldAccumulatingAmount: String,
+      accumulatingAmount: String,
+      previousValue: String,
+      currentValue: String,
+      clientID: String,
+      resource: String,
+      instanceID: String
   ): ResourceInstanceChargingStateMsg = {
 
     val msg = new ResourceInstanceChargingStateMsg
@@ -244,41 +278,71 @@ object MessageFactory {
     msg.setAccumulatingAmount(accumulatingAmount)
     msg.setPreviousValue(previousValue)
     msg.setCurrentValue(currentValue)
+    msg.setClientID(clientID)
+    msg.setResource(resource)
+    msg.setInstanceID(instanceID)
     msg
   }
 
-  def newEmptyUserAgreementHistoryMsg() = {
-    val msg = new UserAgreementHistoryMsg
-    msg.setAgreements(new ju.ArrayList[UserAgreementMsg]())
+  def newResourcesChargingStateMsg(
+    resourceName: String,
+    initialChargingDetails: DetailsModel.Type
+  ): ResourcesChargingStateMsg = {
+    val msg = new ResourcesChargingStateMsg
+    msg.setResource(resourceName)
+    msg.setDetails(initialChargingDetails)
+    msg.setStateOfResourceInstance(newJMap)
     msg
   }
 
-  def newInitialUserAgreementHistoryMsg(initialAgreement: UserAgreementMsg) = {
+  def newEmptyUserAgreementHistoryMsg() = {
     val msg = new UserAgreementHistoryMsg
-    val list = new GenericData.Array[UserAgreementMsg](1, initialAgreement.getSchema)
-    list.add(initialAgreement)
-    msg.setAgreements(list)
+    msg.setAgreements(newJList[UserAgreementMsg])
     msg
   }
 
+  def newInitialUserAgreementHistoryMsg(
+      initialAgreement: UserAgreementMsg,
+      originalID: String = MessageHelpers.UserAgreementHistoryMsgIDGenerator.nextUID()
+  ) = {
+    val historyMsg = new UserAgreementHistoryMsg
+    historyMsg.setOriginalID(originalID)
+    MessageHelpers.insertUserAgreement(historyMsg, initialAgreement)
+    historyMsg
+  }
+
   def newUserAgreementFromIMEventMsg(
       imEvent: IMEventMsg,
-      id: String = MessageHelpers.UserAgreementMsgIDGenerator.nextUID()
+      agreementOriginalID: String = MessageHelpers.UserAgreementMsgIDGenerator.nextUID()
   ) = {
 
     val msg = new UserAgreementMsg
 
-    msg.setId(id)
+    msg.setId(agreementOriginalID)
+    msg.setUserID(imEvent.getUserID)
     msg.setRelatedIMEventOriginalID(imEvent.getOriginalID)
     msg.setRole(imEvent.getRole)
     msg.setValidFromMillis(imEvent.getOccurredMillis)
-    msg.setValidToMillis(Long.MaxValue)
+    msg.setValidToMillis(java.lang.Long.valueOf(java.lang.Long.MAX_VALUE))
     msg.setFullPriceTableRef(null) // get from current (= @imEvent.getOccurredMillis) policy
+    msg.setOccurredMillis(java.lang.Long.valueOf(TimeHelpers.nowMillis()))
+    msg.setRelatedIMEventMsg(imEvent)
+
+    msg
+  }
 
+  def newUserAgreementHistoryMsg(
+      userID: String,
+      originalID: String = MessageHelpers.UserAgreementHistoryMsgIDGenerator.nextUID()
+  ): UserAgreementHistoryMsg = {
+    val msg = new UserAgreementHistoryMsg
+    msg.setOriginalID(originalID)
+    msg.setUserID(userID)
+    msg.setAgreements(newJList)
     msg
   }
 
-  def newWalletEntriesMsg(entries: ju.List[WalletEntryMsg] = new ju.ArrayList[WalletEntryMsg]()) = {
+  def newWalletEntriesMsg(entries: java.util.List[WalletEntryMsg] = newJList[WalletEntryMsg]) = {
     val msg = new WalletEntriesMsg
     msg.setEntries(entries)
     msg
@@ -291,32 +355,44 @@ object MessageFactory {
       setParentID(null).
       setValidFromMillis(millis).
       setValidToMillis(Long.MaxValue).
-      setChargingBehaviors(new ju.ArrayList[String]()).
-      setResourceTypes(new ju.ArrayList[ResourceTypeMsg]()).
-      setRoleMapping(new ju.HashMap[String, FullPriceTableMsg]()).
+      setChargingBehaviors(newJList).
+      setResourceMapping(newJMap).
+      setRoleMapping(newJMap).
       build()
   }
 
-  def createInitialUserStateMsg(
-      usb: UserStateBootstrap,
-      occurredMillis: Long
+  /**
+   * Creates the initial (from the UserActor's perspective) user state.
+   * This may not be the very first user state ever, so we do not set `isFirst`.
+   * @param userID
+   * @param initialCredits
+   * @param occurredMillis
+   * @param originalID
+   * @return
+   */
+  def newInitialUserStateMsg(
+      userID: String,
+      initialCredits: Real,
+      occurredMillis: Long,
+      originalID: String = MessageHelpers.UserStateMsgIDGenerator.nextUID()
   ): UserStateMsg = {
 
     val bmi = BillingMonthInfo.fromMillis(occurredMillis)
     val msg = new UserStateMsg
 
-    msg.setUserID(usb.userID)
-    msg.setOccurredMillis(occurredMillis)
-    msg.setBillingYear(bmi.year)
-    msg.setBillingMonth(bmi.month)
-    msg.setBillingMonthDay(bmi.day)
-    msg.setTotalCredits(CreditsModel.toTypeInMessage(usb.initialCredits))
-    msg.setAgreementHistory(newInitialUserAgreementHistoryMsg(usb.initialAgreement.msg))
-    msg.setLatestUpdateMillis(occurredMillis)
+    msg.setUserID(userID)
+    msg.setOccurredMillis(java.lang.Long.valueOf(occurredMillis))
+    msg.setBillingYear(java.lang.Integer.valueOf(bmi.year))
+    msg.setBillingMonth(java.lang.Integer.valueOf(bmi.month))
+    msg.setBillingMonthDay(java.lang.Integer.valueOf(bmi.day))
+    msg.setTotalCredits(Real.toMsgField(initialCredits))
+    msg.setLatestUpdateMillis(java.lang.Long.valueOf(occurredMillis))
     msg.setInStoreID(null)
-    msg.setOriginalID("") // FIXME get a counter here
-
+    msg.setOriginalID(originalID)
+    msg.setStateOfResources(newJMap)
+    msg.setWalletEntries(newJList)
+    msg.setUserAgreementHistory(newUserAgreementHistoryMsg(userID))
+    msg.setStateOfResources(newJMap)
     msg
   }
-
 }