Use JavaFactory
[aquarium] / src / main / scala / gr / grnet / aquarium / message / avro / MessageFactory.scala
index 482dcc0..d84e25d 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 java.util.{ArrayList ⇒ JArrayList}
-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.
  *
@@ -65,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).
@@ -211,25 +225,25 @@ object MessageFactory {
 
   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).
@@ -245,12 +259,12 @@ 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
@@ -260,49 +274,75 @@ object MessageFactory {
     msg.setDetails(details)
     msg.setPreviousEvents(previousEvents)
     msg.setImplicitlyIssuedStartEvents(implicitlyIssuedStartEvents)
-    msg.setOldAccumulatingAmount(java.lang.Double.valueOf(oldAccumulatingAmount))
-    msg.setAccumulatingAmount(java.lang.Double.valueOf(accumulatingAmount))
-    msg.setPreviousValue(java.lang.Double.valueOf(previousValue))
-    msg.setCurrentValue(java.lang.Double.valueOf(currentValue))
+    msg.setOldAccumulatingAmount(oldAccumulatingAmount)
+    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 JArrayList[UserAgreementMsg]()
-    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(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
@@ -315,35 +355,43 @@ 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,
-      defaultResourceTypesMap:Map[String, ResourceType],
-      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.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(java.lang.Double.valueOf(CreditsModel.toTypeInMessage(usb.initialCredits)))
-    msg.setAgreementHistory(newInitialUserAgreementHistoryMsg(usb.initialAgreement.msg))
+    msg.setTotalCredits(Real.toMsgField(initialCredits))
     msg.setLatestUpdateMillis(java.lang.Long.valueOf(occurredMillis))
     msg.setInStoreID(null)
-    msg.setOriginalID("") // FIXME get a counter here
-    msg.setResourceTypesMap(newResourceTypeMsgsMap(defaultResourceTypesMap))
-    msg.setStateOfResources(new java.util.HashMap())
-    msg.setWalletEntries(new java.util.ArrayList[WalletEntryMsg]())
+    msg.setOriginalID(originalID)
+    msg.setStateOfResources(newJMap)
+    msg.setWalletEntries(newJList)
+    msg.setUserAgreementHistory(newUserAgreementHistoryMsg(userID))
     msg
   }
-
 }