Converted BillEntry --> BillEntryMsg. BillTest can now parse and run multiple scenarios
[aquarium] / src / main / scala / gr / grnet / aquarium / message / avro / MessageFactory.scala
index 09e8459..90f196e 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.message.avro.gen._
+import java.{util ⇒ ju}
+import java.util.{ArrayList ⇒ JArrayList}
+import java.util.{List ⇒ JList}
+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.charging.bill._
+import gr.grnet.aquarium.charging.bill.ChargeEntry
+import gr.grnet.aquarium.policy.ResourceType
+import gr.grnet.aquarium.charging.state.UserStateBootstrap
+import gr.grnet.aquarium.charging.bill.ResourceEntry
+import gr.grnet.aquarium.charging.bill.ServiceEntry
 
 /**
  * Provides helper methods that construct avro messages.
@@ -45,6 +60,24 @@ import scala.collection.JavaConverters.seqAsJavaListConverter
  * @author Christos KK Loverdos <loverdos@gmail.com>
  */
 object MessageFactory {
+  def anyValueMsgOfBoolean(x: Boolean) = {
+    val av = new AnyValueMsg
+    av.setAnyValue(java.lang.Boolean.valueOf(x))
+    av
+  }
+
+  def anyValueMsgOfString(x: String) = {
+    val av = new AnyValueMsg
+    av.setAnyValue(x)
+    av
+  }
+
+  def anyValueMsgOfList(l: JArrayList[AnyValueMsg]) = {
+    val av = new AnyValueMsg
+    av.setAnyValue(l)
+    av
+  }
+
   def newEffectiveUnitPriceMsg(unitPrice: Double, whenOpt: Option[CronSpecTupleMsg] = None) = {
     EffectiveUnitPriceMsg.newBuilder().
       setUnitPrice(unitPrice).
@@ -64,19 +97,19 @@ object MessageFactory {
     build()
   }
 
-  def newSelectorValueMsg(map: Map[CharSequence, SelectorValueMsg]): SelectorValueMsg = {
+  def newSelectorValueMsg(map: Map[String, SelectorValueMsg]): SelectorValueMsg = {
     SelectorValueMsg.newBuilder().
       setSelectorValue(map.asJava).
     build()
   }
 
-  def newSelectorValueMsg(pairs: (CharSequence, SelectorValueMsg)*): SelectorValueMsg = {
+  def newSelectorValueMsg(pairs: (String, SelectorValueMsg)*): SelectorValueMsg = {
     SelectorValueMsg.newBuilder().
       setSelectorValue(Map(pairs:_*).asJava).
     build()
   }
 
-  def newFullPriceTableMsg(perResource: (CharSequence, Map[CharSequence, SelectorValueMsg])*) = {
+  def newFullPriceTableMsg(perResource: (String, Map[String, SelectorValueMsg])*) = {
     FullPriceTableMsg.newBuilder().
       setPerResource(
         Map((for((k, v) ← perResource) yield (k, v.asJava)):_*).asJava
@@ -84,15 +117,15 @@ object MessageFactory {
     build()
   }
 
-  def newRoleMappingMsg(map: Map[CharSequence, FullPriceTableMsg]): java.util.Map[CharSequence, FullPriceTableMsg] = {
+  def newRoleMappingMsg(map: Map[String, FullPriceTableMsg]): java.util.Map[String, FullPriceTableMsg] = {
     map.asJava
   }
 
-  def newRoleMappingMsg(pairs: (CharSequence, FullPriceTableMsg)*): java.util.Map[CharSequence, FullPriceTableMsg] = {
+  def newRoleMappingMsg(pairs: (String, FullPriceTableMsg)*): java.util.Map[String, FullPriceTableMsg] = {
     Map(pairs:_*).asJava
   }
 
-  def newResourceTypeMsg(name: CharSequence, unit: CharSequence, chargingBehavior: CharSequence) = {
+  def newResourceTypeMsg(name: String, unit: String, chargingBehavior: String) = {
     ResourceTypeMsg.newBuilder().
       setName(name).
       setUnit(unit).
@@ -100,20 +133,289 @@ object MessageFactory {
     build()
   }
 
+  def newResourceTypeMsg(model: ResourceType): ResourceTypeMsg = {
+    newResourceTypeMsg(model.name, model.unit, model.chargingBehavior)
+  }
+
   def newResourceTypeMsgs(rts: ResourceTypeMsg*) = {
     rts.asJava
   }
 
-  def newChargingBehaviorMsgs(cbs: CharSequence*) = {
-    val ret = cbs.asJava
-    println(cbs.toList)
-    println("========")
-    var i = 0
-    while(i < ret.size()) {
-      println(ret.get(i))
-      i += 1
-    }
+//  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
+  }
+
+  def newBooleanDetail(name: String, value: Boolean) = {
+    (name, anyValueMsgOfBoolean(value))
+  }
+
+  def newStringDetail(name: String, value: String) = {
+    (name, anyValueMsgOfString(value))
+  }
+
+  def newDetails(details: (String, AnyValueMsg)*): DetailsModel.Type = {
+    DetailsModel.fromScalaTuples(details:_*)
+  }
+
+  def newResourceEventMsg(
+      originalID: String,
+      occurredMillis: Long,
+      receivedMillis: Long,
+      userID: String,
+      clientID: String,
+      resource: String,
+      instanceID: String,
+      value: String,
+      eventVersion: String,
+      details: DetailsModel.Type = newDetails(),
+      inStoreID: String = null
+  ) = {
+    ResourceEventMsg.newBuilder().
+      setOriginalID(originalID).
+      setOccurredMillis(occurredMillis).
+      setReceivedMillis(receivedMillis).
+      setUserID(userID).
+      setClientID(clientID).
+      setResource(resource).
+      setInstanceID(instanceID).
+      setValue(value).
+      setEventVersion(eventVersion).
+      setDetails(details).
+      setInStoreID(inStoreID).
+    build()
+  }
+
+  def newIMEventMsg(
+      originalID: String,
+      occurredMillis: Long,
+      receivedMillis: Long,
+      userID: String,
+      clientID: String,
+      isActive: Boolean,
+      role: String,
+      eventVersion: String,
+      eventType: String,
+      details: DetailsModel.Type = newDetails(),
+      inStoreID: String = null
+  ) = {
+    IMEventMsg.newBuilder().
+      setOriginalID(originalID).
+      setInStoreID(null).
+      setOccurredMillis(occurredMillis).
+      setReceivedMillis(receivedMillis).
+      setUserID(userID).
+      setClientID(clientID).
+      setIsActive(isActive).
+      setRole(role).
+      setEventVersion(eventVersion).
+      setEventType(eventType).
+      setDetails(details).
+      setInStoreID(inStoreID).
+    build()
+  }
+
+  def newWalletEntryMsg(
+      userID: String,
+      sumOfCreditsToSubtract: CreditsModel.Type,
+      oldTotalCredits: CreditsModel.Type,
+      newTotalCredits: CreditsModel.Type,
+      whenComputedMillis: Long,
+      referenceStartMillis: Long,
+      referenceStopMillis: Long,
+      billingYear: Int,
+      billingMonth: Int,
+      billingMonthDay: Int,
+      chargeslots: ju.List[ChargeslotMsg],
+      resourceEvents: ju.List[ResourceEventMsg],
+      resourceType: ResourceTypeMsg,
+      isSynthetic: Boolean
+  ): WalletEntryMsg = {
+    WalletEntryMsg.newBuilder().
+      setUserID(userID).
+      setSumOfCreditsToSubtract(CreditsModel.toTypeInMessage(sumOfCreditsToSubtract)).
+      setOldTotalCredits(CreditsModel.toTypeInMessage(oldTotalCredits)).
+      setNewTotalCredits(CreditsModel.toTypeInMessage(newTotalCredits)).
+      setWhenComputedMillis(whenComputedMillis).
+      setReferenceStartMillis(referenceStartMillis).
+      setReferenceStopMillis(referenceStopMillis).
+      setBillingYear(billingYear).
+      setBillingMonth(billingMonth).
+      setBillingMonthDay(billingMonthDay).
+      setChargeslots(chargeslots).
+      setResourceEvents(resourceEvents).
+      setResourceType(resourceType).
+      setIsSynthetic(isSynthetic).
+    build()
+  }
+
+  def newResourceInstanceChargingStateMsg(
+      details: DetailsModel.Type,
+      previousEvents: ju.List[ResourceEventMsg],
+      implicitlyIssuedStartEvents: ju.List[ResourceEventMsg],
+      oldAccumulatingAmount: Double,
+      accumulatingAmount: Double,
+      previousValue: Double,
+      currentValue: Double,
+      clientID: String,
+      resource: String,
+      instanceID: String
+  ): ResourceInstanceChargingStateMsg = {
 
-    ret
+    val msg = new ResourceInstanceChargingStateMsg
+    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.setClientID(clientID)
+    msg.setResource(resource)
+    msg.setInstanceID(instanceID)
+    msg
+  }
+
+  def newEmptyUserAgreementHistoryMsg() = {
+    val msg = new UserAgreementHistoryMsg
+    msg.setAgreements(new ju.ArrayList[UserAgreementMsg]())
+    msg
+  }
+
+  def newInitialUserAgreementHistoryMsg(initialAgreement: UserAgreementMsg) = {
+    val msg = new UserAgreementHistoryMsg
+    val list = new JArrayList[UserAgreementMsg]()
+    list.add(initialAgreement)
+    msg.setAgreements(list)
+    msg
+  }
+
+  def newUserAgreementFromIMEventMsg(
+      imEvent: IMEventMsg,
+      id: String = MessageHelpers.UserAgreementMsgIDGenerator.nextUID()
+  ) = {
+
+    val msg = new UserAgreementMsg
+
+    msg.setId(id)
+    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
+  }
+
+  def newWalletEntriesMsg(entries: ju.List[WalletEntryMsg] = new ju.ArrayList[WalletEntryMsg]()) = {
+    val msg = new WalletEntriesMsg
+    msg.setEntries(entries)
+    msg
+  }
+
+  def newDummyPolicyMsgAt(millis: Long) : PolicyMsg = {
+    PolicyMsg.newBuilder().
+      setOriginalID("").
+      setInStoreID(null).
+      setParentID(null).
+      setValidFromMillis(millis).
+      setValidToMillis(Long.MaxValue).
+      setChargingBehaviors(new ju.ArrayList[String]()).
+      setResourceTypes(new ju.ArrayList[ResourceTypeMsg]()).
+      setRoleMapping(new ju.HashMap[String, FullPriceTableMsg]()).
+      build()
+  }
+
+  def createInitialUserStateMsg(
+      usb: UserStateBootstrap,
+      defaultResourceTypesMap:Map[String, ResourceType],
+      occurredMillis: Long
+  ): UserStateMsg = {
+
+    val bmi = BillingMonthInfo.fromMillis(occurredMillis)
+    val msg = new UserStateMsg
+
+    msg.setUserID(usb.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.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
+  }
+
+  def toJavaList[A](l:List[A]) : java.util.List[A] = {
+    val al = new java.util.ArrayList[A]()
+    l.foreach(al.add(_))
+    al
+  }
+
+  def chargeEntryMsg(chargeEntry:ChargeEntry) : ChargeEntryMsg = {
+    val msg = new ChargeEntryMsg
+    msg.setId(chargeEntry.id)
+    msg.setUnitPrice(chargeEntry.unitPrice)
+    msg.setStartTime(chargeEntry.startTime)
+    msg.setEndTime(chargeEntry.endTime)
+    msg.setElapsedTime(chargeEntry.elapsedTime)
+    msg.setUnits(chargeEntry.units)
+    msg.setCredits(chargeEntry.credits)
+    msg
+  }
+
+  def eventEntryMsg(eventEntry:EventEntry) : EventEntryMsg = {
+    val msg = new EventEntryMsg
+    msg.setEventType(eventEntry.eventType)
+    msg.setDetails(toJavaList(eventEntry.details.map(chargeEntryMsg(_))))
+    msg
+  }
+
+  def resourceEntryMsg(resourceEntry:ResourceEntry) : ResourceEntryMsg = {
+    val msg = new ResourceEntryMsg
+    msg.setResourceName(resourceEntry.resourceName)
+    msg.setResourceType(resourceEntry.resourceType)
+    msg.setUnitName(resourceEntry.unitName)
+    msg.setTotalCredits(resourceEntry.totalCredits)
+    msg.setTotalElapsedTime(resourceEntry.totalElapsedTime)
+    msg.setTotalUnits(resourceEntry.totalUnits)
+    msg.setDetails(toJavaList(resourceEntry.details.map(eventEntryMsg(_))))
+    msg
+  }
+
+  def createServiceEntryMsg(serviceEntry:ServiceEntry) : ServiceEntryMsg = {
+    val msg = new ServiceEntryMsg
+    msg.setServiceName(serviceEntry.serviceName)
+    msg.setTotalCredits(serviceEntry.totalCredits)
+    msg.setTotalElapsedTime(serviceEntry.totalElapsedTime)
+    msg.setTotalUnits(serviceEntry.totalUnits)
+    msg.setUnitName(serviceEntry.unitName)
+    msg.setDetails(toJavaList(serviceEntry.details.map(resourceEntryMsg(_))))
+    msg
+  }
+  def createBillEntryMsg(billEntry:BillEntry) : BillEntryMsg = {
+    val msg = new BillEntryMsg
+    msg.setId(billEntry.id)
+    msg.setUserID(billEntry.userID)
+    msg.setStatus(billEntry.status)
+    msg.setRemainingCredits(billEntry.remainingCredits)
+    msg.setDeductedCredits(billEntry.deductedCredits)
+    msg.setStartTime(billEntry.startTime)
+    msg.setEndTime(billEntry.endTime)
+    msg.setBill(toJavaList(billEntry.bill.map(createServiceEntryMsg(_))))
+    msg
   }
 }