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.
* @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).
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
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).
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
}
}